@quartic/bokehjs
Version:
Interactive, novel data visualization
288 lines (287 loc) • 10.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var _create_view, _get_session, _handle_notebook_comms, _init_comms, _render_document_to_element, _sessions, _update_comms_callback, add_document_from_session, add_model_from_session, add_model_static, fill_render_item_from_script_tag;
var base = require("./base");
var client_1 = require("./client");
var logging_1 = require("./core/logging");
var document_1 = require("./document");
var dom_1 = require("./core/dom");
var callback_1 = require("./core/util/callback");
exports.BOKEH_ROOT = "bk-root";
_handle_notebook_comms = function (msg) {
var data;
logging_1.logger.debug("handling notebook comms");
data = JSON.parse(msg.content.data);
if ('events' in data && 'references' in data) {
return this.apply_json_patch(data);
}
else if ('doc' in data) {
return this.replace_with_json(data['doc']);
}
else {
throw new Error("handling notebook comms message: ", msg);
}
};
_update_comms_callback = function (target, doc, comm) {
if (target === comm.target_name) {
return comm.on_msg(_handle_notebook_comms.bind(doc));
}
};
_init_comms = function (target, doc) {
var comm_manager, e, id, promise, ref, update_comms;
if ((typeof Jupyter !== "undefined" && Jupyter !== null) && (Jupyter.notebook.kernel != null)) {
logging_1.logger.info("Registering Jupyter comms for target " + target);
comm_manager = Jupyter.notebook.kernel.comm_manager;
update_comms = function (comm) {
return _update_comms_callback(target, doc, comm);
};
ref = comm_manager.comms;
for (id in ref) {
promise = ref[id];
promise.then(update_comms);
}
try {
return comm_manager.register_target(target, function (comm, msg) {
logging_1.logger.info("Registering Jupyter comms for target " + target);
return comm.on_msg(_handle_notebook_comms.bind(doc));
});
}
catch (error1) {
e = error1;
return logging_1.logger.warn("Jupyter comms failed to register. push_notebook() will not function. (exception reported: " + e + ")");
}
}
else {
return console.warn('Jupyter notebooks comms not available. push_notebook() will not function');
}
};
_create_view = function (model) {
var view;
view = new model.default_view({
model: model
});
base.index[model.id] = view;
return view;
};
_render_document_to_element = function (element, document, use_for_title) {
var i, len, model, ref, render_model, unrender_model, views;
views = {};
render_model = function (model) {
var view;
view = _create_view(model);
views[model.id] = view;
return element.appendChild(view.el);
};
unrender_model = function (model) {
var view;
if (model.id in views) {
view = views[model.id];
element.removeChild(view.el);
delete views[model.id];
return delete base.index[model.id];
}
};
ref = document.roots();
for (i = 0, len = ref.length; i < len; i++) {
model = ref[i];
render_model(model);
}
if (use_for_title) {
window.document.title = document.title();
}
document.on_change(function (event) {
if (event instanceof document_1.RootAddedEvent) {
return render_model(event.model);
}
else if (event instanceof document_1.RootRemovedEvent) {
return unrender_model(event.model);
}
else if (use_for_title && event instanceof document_1.TitleChangedEvent) {
return window.document.title = event.title;
}
});
return views;
};
add_model_static = function (element, model_id, doc) {
var model, view;
model = doc.get_model_by_id(model_id);
if (model == null) {
throw new Error("Model " + model_id + " was not in document " + doc);
}
view = _create_view(model);
return callback_1.delay(function () {
return dom_1.replaceWith(element, view.el);
});
};
exports.add_document_static = function (element, doc, use_for_title) {
return callback_1.delay(function () {
return _render_document_to_element(element, doc, use_for_title);
});
};
exports.add_document_standalone = function (document, element, use_for_title) {
if (use_for_title == null) {
use_for_title = false;
}
return _render_document_to_element(element, document, use_for_title);
};
_sessions = {};
_get_session = function (websocket_url, session_id, args_string) {
var subsessions;
if ((websocket_url == null) || websocket_url === null) {
throw new Error("Missing websocket_url");
}
if (!(websocket_url in _sessions)) {
_sessions[websocket_url] = {};
}
subsessions = _sessions[websocket_url];
if (!(session_id in subsessions)) {
subsessions[session_id] = client_1.pull_session(websocket_url, session_id, args_string);
}
return subsessions[session_id];
};
add_document_from_session = function (element, websocket_url, session_id, use_for_title) {
var args_string, promise;
args_string = window.location.search.substr(1);
promise = _get_session(websocket_url, session_id, args_string);
return promise.then(function (session) {
return _render_document_to_element(element, session.document, use_for_title);
}, function (error) {
logging_1.logger.error("Failed to load Bokeh session " + session_id + ": " + error);
throw error;
});
};
add_model_from_session = function (element, websocket_url, model_id, session_id) {
var args_string, promise;
args_string = window.location.search.substr(1);
promise = _get_session(websocket_url, session_id, args_string);
return promise.then(function (session) {
var model, view;
model = session.document.get_model_by_id(model_id);
if (model == null) {
throw new Error("Did not find model " + model_id + " in session");
}
view = _create_view(model);
return dom_1.replaceWith(element, view.el);
}, function (error) {
logging_1.logger.error("Failed to load Bokeh session " + session_id + ": " + error);
throw error;
});
};
exports.inject_css = function (url) {
var element;
element = dom_1.link({
href: url,
rel: "stylesheet",
type: "text/css"
});
return document.body.appendChild(element);
};
exports.inject_raw_css = function (css) {
var element;
element = dom_1.style({}, css);
return document.body.appendChild(element);
};
fill_render_item_from_script_tag = function (script, item) {
var info;
info = script.dataset;
if ((info.bokehLogLevel != null) && info.bokehLogLevel.length > 0) {
logging_1.set_log_level(info.bokehLogLevel);
}
if ((info.bokehDocId != null) && info.bokehDocId.length > 0) {
item['docid'] = info.bokehDocId;
}
if ((info.bokehModelId != null) && info.bokehModelId.length > 0) {
item['modelid'] = info.bokehModelId;
}
if ((info.bokehSessionId != null) && info.bokehSessionId.length > 0) {
item['sessionid'] = info.bokehSessionId;
}
return logging_1.logger.info("Will inject Bokeh script tag with params " + (JSON.stringify(item)));
};
exports.embed_items = function (docs_json, render_items, app_path, absolute_url) {
var child, container, docid, docs, elem, element_id, i, item, len, loc, promise, protocol, results, use_for_title, websocket_url;
protocol = 'ws:';
if (window.location.protocol === 'https:') {
protocol = 'wss:';
}
if (absolute_url != null) {
loc = new URL(absolute_url);
}
else {
loc = window.location;
}
if (app_path != null) {
if (app_path === "/") {
app_path = "";
}
}
else {
app_path = loc.pathname.replace(/\/+$/, '');
}
websocket_url = protocol + '//' + loc.host + app_path + '/ws';
logging_1.logger.debug("embed: computed ws url: " + websocket_url);
docs = {};
for (docid in docs_json) {
docs[docid] = document_1.Document.from_json(docs_json[docid]);
}
results = [];
for (i = 0, len = render_items.length; i < len; i++) {
item = render_items[i];
if (item.notebook_comms_target != null) {
_init_comms(item.notebook_comms_target, docs[docid]);
}
element_id = item['elementid'];
elem = document.getElementById(element_id);
if (elem == null) {
throw new Error("Error rendering Bokeh model: could not find tag with id: " + element_id);
}
if (!document.body.contains(elem)) {
throw new Error("Error rendering Bokeh model: element with id '" + element_id + "' must be under <body>");
}
if (elem.tagName === "SCRIPT") {
fill_render_item_from_script_tag(elem, item);
container = dom_1.div({
"class": exports.BOKEH_ROOT
});
dom_1.replaceWith(elem, container);
child = dom_1.div();
container.appendChild(child);
elem = child;
}
use_for_title = (item.use_for_title != null) && item.use_for_title;
promise = null;
if (item.modelid != null) {
if (item.docid != null) {
add_model_static(elem, item.modelid, docs[item.docid]);
}
else if (item.sessionid != null) {
promise = add_model_from_session(elem, websocket_url, item.modelid, item.sessionid);
}
else {
throw new Error("Error rendering Bokeh model " + item['modelid'] + " to element " + element_id + ": no document ID or session ID specified");
}
}
else {
if (item.docid != null) {
exports.add_document_static(elem, docs[item.docid], use_for_title);
}
else if (item.sessionid != null) {
promise = add_document_from_session(elem, websocket_url, item.sessionid, use_for_title);
}
else {
throw new Error("Error rendering Bokeh document to element " + element_id + ": no document ID or session ID specified");
}
}
if (promise !== null) {
results.push(promise.then(function (value) {
return console.log("Bokeh items were rendered successfully");
}, function (error) {
return console.log("Error rendering Bokeh items ", error);
}));
}
else {
results.push(void 0);
}
}
return results;
};