Commit
·
19c6661
1
Parent(s):
d0a54a3
Upload 2 files
Browse files- index.html +372 -0
- index.js +272 -0
index.html
ADDED
@@ -0,0 +1,372 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en" >
|
3 |
+
<head>
|
4 |
+
<meta charset="utf-8">
|
5 |
+
<title>The easiest way to create a dashboard</title>
|
6 |
+
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.holoviz.org/panel/1.3.6/dist/images/apple-touch-icon.png">
|
7 |
+
<link rel="icon" href="https://cdn.holoviz.org/panel/1.3.6/dist/images/favicon.ico" type=""><meta name="name" content="The easiest way to create a dashboard"> <style>
|
8 |
+
html, body {
|
9 |
+
display: flow-root;
|
10 |
+
box-sizing: border-box;
|
11 |
+
height: 100%;
|
12 |
+
margin: 0;
|
13 |
+
padding: 0;
|
14 |
+
}
|
15 |
+
</style>
|
16 |
+
<link rel="stylesheet" href="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/datatabulator/[email protected]/dist/css/tabulator_fast.min.css" type="text/css" />
|
17 |
+
|
18 |
+
<style type="text/css">
|
19 |
+
:host(.pn-loading),
|
20 |
+
.pn-loading {
|
21 |
+
overflow: hidden;
|
22 |
+
}
|
23 |
+
|
24 |
+
:host(.pn-loading):before,
|
25 |
+
.pn-loading:before {
|
26 |
+
position: absolute;
|
27 |
+
height: 100%;
|
28 |
+
width: 100%;
|
29 |
+
content: '';
|
30 |
+
z-index: 1000;
|
31 |
+
background-color: rgb(255, 255, 255, 0.5);
|
32 |
+
border-color: lightgray;
|
33 |
+
background-repeat: no-repeat;
|
34 |
+
background-position: center;
|
35 |
+
background-size: auto 50%;
|
36 |
+
border-width: 1px;
|
37 |
+
cursor: progress;
|
38 |
+
}
|
39 |
+
|
40 |
+
:host(.pn-loading) .pn-loading-msg,
|
41 |
+
.pn-loading .pn-loading-msg {
|
42 |
+
position: absolute;
|
43 |
+
top: 72%;
|
44 |
+
font-size: 2em;
|
45 |
+
color: black;
|
46 |
+
width: 100%;
|
47 |
+
text-align: center;
|
48 |
+
}
|
49 |
+
|
50 |
+
|
51 |
+
:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {
|
52 |
+
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=");
|
53 |
+
background-size: auto calc(min(50%, 400px));
|
54 |
+
}
|
55 |
+
</style><script type="text/javascript" src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/datatabulator/[email protected]/dist/js/tabulator.min.js"></script>
|
56 |
+
<script type="text/javascript" src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/datatabulator/luxon/build/global/luxon.min.js"></script>
|
57 |
+
<script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-3.3.2.min.js"></script>
|
58 |
+
<script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.2.min.js"></script>
|
59 |
+
<script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.2.min.js"></script>
|
60 |
+
<script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.2.min.js"></script>
|
61 |
+
<script type="text/javascript" src="https://cdn.holoviz.org/panel/1.3.6/dist/panel.min.js"></script>
|
62 |
+
|
63 |
+
<script type="text/javascript">
|
64 |
+
Bokeh.set_log_level("info");
|
65 |
+
</script><!-- Template CSS -->
|
66 |
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans">
|
67 |
+
<link rel="stylesheet" href="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/theme/default.css">
|
68 |
+
<link rel="stylesheet" href="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/fastbasetemplate/fast.css">
|
69 |
+
<link rel="stylesheet" href="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/fastlisttemplate/fast_list_template.css">
|
70 |
+
<style type="text/css">
|
71 |
+
|
72 |
+
:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {
|
73 |
+
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=");
|
74 |
+
background-size: auto calc(min(50%, 400px));
|
75 |
+
}
|
76 |
+
</style>
|
77 |
+
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Open+Sans" />
|
78 |
+
|
79 |
+
<style>
|
80 |
+
:root {
|
81 |
+
--background-color: #ffffff;
|
82 |
+
--body-font: Open Sans, sans-serif;
|
83 |
+
--corner-radius: 3;
|
84 |
+
--header-background: #88d8b0;
|
85 |
+
--header-color: #ffffff;
|
86 |
+
--sidebar-width: 330px;
|
87 |
+
}
|
88 |
+
body {
|
89 |
+
color: #2B2B2B;
|
90 |
+
background-color: var(--background-color);
|
91 |
+
font-family: var(--body-font);
|
92 |
+
}
|
93 |
+
#header a {
|
94 |
+
color: currentColor;
|
95 |
+
}
|
96 |
+
#header-design-provider {
|
97 |
+
--neutral-fill-hover: var(--header-background);
|
98 |
+
--neutral-fill-rest: var(--header-background);
|
99 |
+
--neutral-foreground-rest: var(--header-color);
|
100 |
+
background: var(--header-background);
|
101 |
+
color: var(--header-color);
|
102 |
+
}
|
103 |
+
#sidebar {
|
104 |
+
min-width: var(--sidebar-width);
|
105 |
+
max-width: var(--sidebar-width);
|
106 |
+
}
|
107 |
+
</style>
|
108 |
+
|
109 |
+
<!-- Template JS -->
|
110 |
+
<script src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/fastbasetemplate/fast_template.js"></script>
|
111 |
+
<script src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/@microsoft/[email protected]/dist/fast-components.js" type="module"></script>
|
112 |
+
<script src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/fast/js/fast_design.js" type="module"></script>
|
113 |
+
|
114 |
+
<!-- Fast Script -->
|
115 |
+
<script type="text/javascript">
|
116 |
+
document.addEventListener('DOMContentLoaded', (event) => {
|
117 |
+
const header_design = new window.fastDesignProvider("#header-design-provider");
|
118 |
+
const body_design = window.bodyDesign = new window.fastDesignProvider("#body-design-provider");
|
119 |
+
body_design.setLuminance(1.0);
|
120 |
+
body_design.setAccentColor("#88d8b0")
|
121 |
+
body_design.setNeutralColor("#000000");
|
122 |
+
header_design.setLuminance(1.0);
|
123 |
+
header_design.setAccentColor("#ffffff");
|
124 |
+
header_design.setNeutralColor("#ffffff");
|
125 |
+
});
|
126 |
+
</script>
|
127 |
+
</head>
|
128 |
+
<body class="pn-loading pn-arc">
|
129 |
+
<fast-design-system-provider id="body-design-provider" use-defaults>
|
130 |
+
<div id="container">
|
131 |
+
<fast-design-system-provider id="header-design-provider">
|
132 |
+
<nav id="header" class="shadow" >
|
133 |
+
<span onclick="closeNav()" id="sidebar-button">
|
134 |
+
<div class="pn-bar"></div>
|
135 |
+
<div class="pn-bar"></div>
|
136 |
+
<div class="pn-bar"></div>
|
137 |
+
</span>
|
138 |
+
<fast-tooltip anchor="sidebar-button" position="right">
|
139 |
+
Toggle the Sidebar
|
140 |
+
</fast-tooltip>
|
141 |
+
<div class="app-header">
|
142 |
+
<a class="title" href="" >The easiest way to create a dashboard</a>
|
143 |
+
</div>
|
144 |
+
<div id="header-items">
|
145 |
+
</div>
|
146 |
+
<div class="pn-toggle-theme">
|
147 |
+
<fast-switch id="theme-switch" style="float: right;" onChange="toggleLightDarkTheme('default')" checked>
|
148 |
+
<span slot="checked-message">
|
149 |
+
<svg class="theme-toggle-icon" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25"><path d="M0 0h24v24H0z" fill="none"/><path d="M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zM4 10.5H1v2h3v-2zm9-9.95h-2V3.5h2V.55zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zM20 10.5v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2V19.5h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z"/></svg>
|
150 |
+
</span>
|
151 |
+
<span slot="unchecked-message">
|
152 |
+
<svg class="theme-toggle-icon" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25"><path d="M0 0h24v24H0z" fill="none"/><path d="M10 2c-1.82 0-3.53.5-5 1.35C7.99 5.08 10 8.3 10 12s-2.01 6.92-5 8.65C6.47 21.5 8.18 22 10 22c5.52 0 10-4.48 10-10S15.52 2 10 2z"/></svg>
|
153 |
+
</span>
|
154 |
+
</fast-switch>
|
155 |
+
<fast-tooltip anchor="theme-switch" position="bottom">
|
156 |
+
Toggle the Theme
|
157 |
+
</fast-tooltip>
|
158 |
+
</div>
|
159 |
+
<div class="pn-busy-container" id="busy-container">
|
160 |
+
<div id="c782d72a-6832-412c-a60a-46aab1ba2d66" data-root-id="p1016" style="display: contents;"></div>
|
161 |
+
</div>
|
162 |
+
<fast-tooltip anchor="busy-container" position="left">
|
163 |
+
Busy Indicator
|
164 |
+
</fast-tooltip>
|
165 |
+
</nav>
|
166 |
+
</fast-design-system-provider>
|
167 |
+
|
168 |
+
<div class="row" id="content">
|
169 |
+
<div class="sidenav " id="sidebar">
|
170 |
+
<ul class="nav flex-column">
|
171 |
+
<div id="e33e4285-845f-4da7-ae9c-95060ffe746f" data-root-id="p1136" style="display: contents;"></div>
|
172 |
+
<div id="df32b787-9286-4976-abd2-43562e85a7f0" data-root-id="p1139" style="display: contents;"></div>
|
173 |
+
<div id="f41bb664-73df-4a71-9695-af32d1374a97" data-root-id="p1142" style="display: contents;"></div>
|
174 |
+
<div id="ce806b22-555a-4ac5-b7a3-577bdf7908ed" data-root-id="p1145" style="display: contents;"></div>
|
175 |
+
<div id="e247a985-568d-4956-8ed1-12c79cf78c54" data-root-id="p1148" style="display: contents;"></div>
|
176 |
+
</ul>
|
177 |
+
</div>
|
178 |
+
|
179 |
+
<div class="main" id="main">
|
180 |
+
<div class="card-margin stretch_width">
|
181 |
+
<fast-card class="pn-wrapper">
|
182 |
+
<span class="fullscreen-button" onclick="toggleFullScreen(this)">
|
183 |
+
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 18 18">
|
184 |
+
<path d="M4.5 11H3v4h4v-1.5H4.5V11zM3 7h1.5V4.5H7V3H3v4zm10.5 6.5H11V15h4v-4h-1.5v2.5zM11 3v1.5h2.5V7H15V3h-4z"/>
|
185 |
+
</svg>
|
186 |
+
</span>
|
187 |
+
<div id="f4222dbd-b9d5-4c01-9558-2834903307a1" data-root-id="p1017" style="display: contents;"></div>
|
188 |
+
</fast-card>
|
189 |
+
</div>
|
190 |
+
<div class="card-margin stretch_width">
|
191 |
+
<fast-card class="pn-wrapper">
|
192 |
+
<span class="fullscreen-button" onclick="toggleFullScreen(this)">
|
193 |
+
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 18 18">
|
194 |
+
<path d="M4.5 11H3v4h4v-1.5H4.5V11zM3 7h1.5V4.5H7V3H3v4zm10.5 6.5H11V15h4v-4h-1.5v2.5zM11 3v1.5h2.5V7H15V3h-4z"/>
|
195 |
+
</svg>
|
196 |
+
</span>
|
197 |
+
<div id="b7fdfc1c-8c8f-4a65-a2b9-a00b8d605ef2" data-root-id="p1134" style="display: contents;"></div>
|
198 |
+
</fast-card>
|
199 |
+
</div>
|
200 |
+
</div>
|
201 |
+
<fast-dialog id="pn-Modal" hidden>
|
202 |
+
<fast-button class="pn-modal-close" id="pn-closeModal">×</fast-button>
|
203 |
+
<div>
|
204 |
+
</div>
|
205 |
+
</fast-dialog>
|
206 |
+
</div>
|
207 |
+
</div>
|
208 |
+
</fast-design-system-provider>
|
209 |
+
|
210 |
+
<script type="text/javascript">
|
211 |
+
|
212 |
+
</script>
|
213 |
+
|
214 |
+
<script type="text/javascript">
|
215 |
+
function openNav() {
|
216 |
+
document.getElementById("sidebar").classList.remove("hidden");
|
217 |
+
document.getElementById("sidebar-button").onclick = closeNav;
|
218 |
+
}
|
219 |
+
|
220 |
+
function closeNav() {
|
221 |
+
document.getElementById("sidebar").classList.add("hidden");
|
222 |
+
document.getElementById("sidebar-button").onclick = openNav;
|
223 |
+
}
|
224 |
+
|
225 |
+
var modal = document.getElementById("pn-Modal");
|
226 |
+
var span = document.getElementById("pn-closeModal");
|
227 |
+
|
228 |
+
span.onclick = function() {
|
229 |
+
modal.style.display = "none";
|
230 |
+
}
|
231 |
+
|
232 |
+
window.onclick = function(event) {
|
233 |
+
if (event.target == modal) {
|
234 |
+
modal.style.display = "none";
|
235 |
+
}
|
236 |
+
}
|
237 |
+
</script>
|
238 |
+
|
239 |
+
<div id="a7e13da5-922b-4ac6-ab81-47fea6f75d1a" data-root-id="p1009" style="display: contents;"></div>
|
240 |
+
<div id="fb035690-9903-4447-8224-f83afc4152ad" data-root-id="p1012" style="display: contents;"></div>
|
241 |
+
<div id="e3b90b45-857a-40ad-93b5-1462446e862c" data-root-id="p1002" style="display: contents;"></div>
|
242 |
+
<div id="c6b8852c-6dcc-4ac5-8534-fe6a348e6fe4" data-root-id="p1013" style="display: contents;"></div>
|
243 |
+
|
244 |
+
|
245 |
+
<script type="text/javascript">
|
246 |
+
const pyodideWorker = new Worker("./index.js");
|
247 |
+
pyodideWorker.busy = false
|
248 |
+
pyodideWorker.queue = []
|
249 |
+
|
250 |
+
function send_change(jsdoc, event) {
|
251 |
+
if (event.setter_id != null && event.setter_id == 'py') {
|
252 |
+
return
|
253 |
+
} else if (pyodideWorker.busy && event.model && event.attr) {
|
254 |
+
let events = []
|
255 |
+
for (const old_event of pyodideWorker.queue) {
|
256 |
+
if (!(old_event.model === event.model && old_event.attr === event.attr)) {
|
257 |
+
events.push(old_event)
|
258 |
+
}
|
259 |
+
}
|
260 |
+
events.push(event)
|
261 |
+
pyodideWorker.queue = events
|
262 |
+
return
|
263 |
+
}
|
264 |
+
const patch = jsdoc.create_json_patch([event])
|
265 |
+
pyodideWorker.busy = true
|
266 |
+
pyodideWorker.postMessage({type: 'patch', patch: patch})
|
267 |
+
}
|
268 |
+
|
269 |
+
pyodideWorker.onmessage = async (event) => {
|
270 |
+
const msg = event.data
|
271 |
+
|
272 |
+
const body = document.getElementsByTagName('body')[0]
|
273 |
+
const loading_msgs = document.getElementsByClassName('pn-loading-msg')
|
274 |
+
if (msg.type === 'idle') {
|
275 |
+
if (pyodideWorker.queue.length) {
|
276 |
+
const patch = pyodideWorker.jsdoc.create_json_patch(pyodideWorker.queue)
|
277 |
+
pyodideWorker.busy = true
|
278 |
+
pyodideWorker.queue = []
|
279 |
+
pyodideWorker.postMessage({type: 'patch', patch: patch})
|
280 |
+
} else {
|
281 |
+
pyodideWorker.busy = false
|
282 |
+
}
|
283 |
+
} else if (msg.type === 'status') {
|
284 |
+
let loading_msg
|
285 |
+
if (loading_msgs.length) {
|
286 |
+
loading_msg = loading_msgs[0]
|
287 |
+
} else if (body.classList.contains('pn-loading')) {
|
288 |
+
loading_msg = document.createElement('div')
|
289 |
+
loading_msg.classList.add('pn-loading-msg')
|
290 |
+
body.appendChild(loading_msg)
|
291 |
+
}
|
292 |
+
if (loading_msg != null) {
|
293 |
+
loading_msg.innerHTML = msg.msg
|
294 |
+
}
|
295 |
+
} else if (msg.type === 'render') {
|
296 |
+
const docs_json = JSON.parse(msg.docs_json)
|
297 |
+
const render_items = JSON.parse(msg.render_items)
|
298 |
+
const root_ids = JSON.parse(msg.root_ids)
|
299 |
+
|
300 |
+
// Remap roots in message to element IDs
|
301 |
+
const root_els = document.querySelectorAll('[data-root-id]')
|
302 |
+
const data_roots = []
|
303 |
+
for (const el of root_els) {
|
304 |
+
el.innerHTML = ''
|
305 |
+
data_roots.push([el.getAttribute('data-root-id'), el.id])
|
306 |
+
}
|
307 |
+
data_roots.sort((a, b) => a[0]<b[0] ? -1: 1)
|
308 |
+
const roots = {}
|
309 |
+
for (let i=0; i<data_roots.length; i++) {
|
310 |
+
roots[root_ids[i]] = data_roots[i][1]
|
311 |
+
}
|
312 |
+
render_items[0]['roots'] = roots
|
313 |
+
render_items[0]['root_ids'] = root_ids
|
314 |
+
|
315 |
+
// Embed content
|
316 |
+
const [views] = await Bokeh.embed.embed_items(docs_json, render_items)
|
317 |
+
|
318 |
+
// Remove loading spinner and message
|
319 |
+
body.classList.remove("pn-loading", "arc")
|
320 |
+
for (const loading_msg of loading_msgs) {
|
321 |
+
loading_msg.remove()
|
322 |
+
}
|
323 |
+
|
324 |
+
// Setup bi-directional syncing
|
325 |
+
pyodideWorker.jsdoc = jsdoc = [...views.roots.values()][0].model.document
|
326 |
+
jsdoc.on_change(send_change.bind(null, jsdoc), false)
|
327 |
+
pyodideWorker.postMessage({'type': 'rendered'})
|
328 |
+
pyodideWorker.postMessage({'type': 'location', location: JSON.stringify(window.location)})
|
329 |
+
} else if (msg.type === 'patch') {
|
330 |
+
pyodideWorker.jsdoc.apply_json_patch(msg.patch, msg.buffers, setter_id='py')
|
331 |
+
}
|
332 |
+
};
|
333 |
+
</script>
|
334 |
+
<script type="application/json" id="p1190">
|
335 |
+
{"17f176aa-cfcb-40ad-8a03-07569517267c":{"version":"3.3.2","title":"The easiest way to create a dashboard","roots":[{"type":"object","name":"panel.models.location.Location","id":"p1002","attributes":{"name":"location","reload":false}},{"type":"object","name":"panel.models.markup.HTML","id":"p1009","attributes":{"name":"js_area","stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1154","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1151","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/theme/fast.css"}}],"width":0,"height":0,"margin":0,"sizing_mode":"fixed","align":"start","disable_math":true}},{"type":"object","name":"panel.models.reactive_html.ReactiveHTML","id":"p1012","attributes":{"name":"actions","subscribed_events":{"type":"set","entries":["dom_event"]},"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1155","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"id":"p1151"}],"margin":0,"align":"start","data":{"type":"object","name":"TemplateActions1","id":"p1010","attributes":{"name":"TemplateActions01011"}},"scripts":{"type":"map","entries":[["open_modal",["document.getElementById(&#x27;pn-Modal&#x27;).style.display = &#x27;block&#x27;"]],["close_modal",["document.getElementById(&#x27;pn-Modal&#x27;).style.display = &#x27;none&#x27;"]]]}}},{"type":"object","name":"panel.models.browser.BrowserInfo","id":"p1013","attributes":{"name":"browser_info"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1016","attributes":{"name":"busy_indicator","css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 20px; }","\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1156","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1157","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loadingspinner.css"}},{"id":"p1151"}],"min_width":20,"min_height":20,"margin":[5,10],"align":"start"}},{"type":"object","name":"Row","id":"p1017","attributes":{"name":"main-139890291797520","tags":["main"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1006","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1007","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/listpanel.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1004","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/theme/default.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1005","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/theme/native.css"}}],"margin":0,"sizing_mode":"stretch_width","align":"start","children":[{"type":"object","name":"Figure","id":"p1031","attributes":{"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1158","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"id":"p1151"}],"width":null,"height":400,"margin":[5,10],"sizing_mode":"stretch_width","align":"start","x_range":{"type":"object","name":"Range1d","id":"p1018","attributes":{"tags":[[["mpg","mpg",null]],[]],"start":19.0,"end":44.6,"reset_start":19.0,"reset_end":44.6}},"y_range":{"type":"object","name":"Range1d","id":"p1019","attributes":{"tags":[[["hp","hp",null]],{"type":"map","entries":[["invert_yaxis",false],["autorange",false]]}],"start":48.625,"end":100.375,"reset_start":48.625,"reset_end":100.375}},"x_scale":{"type":"object","name":"LinearScale","id":"p1041"},"y_scale":{"type":"object","name":"LinearScale","id":"p1042"},"title":{"type":"object","name":"Title","id":"p1034","attributes":{"text_color":"#2B2B2B","text_font":"Open Sans, sans-serif","text_font_size":"1.15em"}},"outline_line_color":"#888888","outline_line_alpha":0.5,"outline_line_width":1,"renderers":[{"type":"object","name":"GlyphRenderer","id":"p1071","attributes":{"name":"Asia","data_source":{"type":"object","name":"ColumnDataSource","id":"p1062","attributes":{"selected":{"type":"object","name":"Selection","id":"p1063","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1064"},"data":{"type":"map","entries":[["mpg",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAANECamZmZmRk1QAAAAAAAADdAAAAAAAAAOEAAAAAAAAA5QAAAAAAAADpAAAAAAAAAO0AAAAAAAIA7QAAAAAAAADxAAAAAAAAAPUAAAAAAAIA9QM3MzMzMzD1AAAAAAAAAP0AAAAAAAIA/QAAAAAAAAEBAmpmZmZkZQEAzMzMzMzNAQAAAAAAAgEBAmpmZmZnZQEAAAAAAAABBQM3MzMzMjEFAAAAAAAAAQkDNzMzMzAxCQJqZmZmZ2UJAAAAAAAAAQ0DNzMzMzAxDQM3MzMzMjENAzczMzMxMRkA="},"shape":[28],"dtype":"float64","order":"little"}],["hp",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAAVkAAAAAAAMBXQAAAAAAAQFhAAAAAAADwV0AAAAAAAMBXQAAAAAAAwFJAAAAAAAAAVkAAAAAAAMBXQAAAAAAAwFJAAAAAAADAUkAAAAAAAABRQAAAAAAAgFZAAAAAAABATUAAAAAAAABRQAAAAAAAAFNAAAAAAADAUkAAAAAAAGBSQAAAAAAAgEpAAAAAAADAUkAAAAAAAIBRQAAAAAAAAE5AAAAAAADAUkAAAAAAAABOQAAAAAAAAE9AAAAAAADAUEAAAAAAAABOQAAAAAAAAE1AAAAAAADAUEA="},"shape":[28],"dtype":"float64","order":"little"}],["origin",["Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia"]]]}}},"view":{"type":"object","name":"CDSView","id":"p1072","attributes":{"filter":{"type":"object","name":"AllIndices","id":"p1073"}}},"glyph":{"type":"object","name":"Line","id":"p1068","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ff6f69","line_width":6}},"selection_glyph":{"type":"object","name":"Line","id":"p1076","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ff6f69","line_width":6}},"nonselection_glyph":{"type":"object","name":"Line","id":"p1069","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ff6f69","line_alpha":0.1,"line_width":6}},"muted_glyph":{"type":"object","name":"Line","id":"p1070","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ff6f69","line_alpha":0.2,"line_width":6}}}},{"type":"object","name":"GlyphRenderer","id":"p1086","attributes":{"name":"Europe","data_source":{"type":"object","name":"ColumnDataSource","id":"p1077","attributes":{"selected":{"type":"object","name":"Selection","id":"p1078","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1079"},"data":{"type":"map","entries":[["mpg",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAANEAAAAAAAAA3QAAAAAAAADhAAAAAAAAAPUBmZmZmZiZBQA=="},"shape":[5],"dtype":"float64","order":"little"}],["hp",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAADAVkAAAAAAAMBXQAAAAAAAgFZAAAAAAADAVEAAAAAAAIBTQA=="},"shape":[5],"dtype":"float64","order":"little"}],["origin",["Europe","Europe","Europe","Europe","Europe"]]]}}},"view":{"type":"object","name":"CDSView","id":"p1087","attributes":{"filter":{"type":"object","name":"AllIndices","id":"p1088"}}},"glyph":{"type":"object","name":"Line","id":"p1083","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ffcc5c","line_width":6}},"selection_glyph":{"type":"object","name":"Line","id":"p1090","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ffcc5c","line_width":6}},"nonselection_glyph":{"type":"object","name":"Line","id":"p1084","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ffcc5c","line_alpha":0.1,"line_width":6}},"muted_glyph":{"type":"object","name":"Line","id":"p1085","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ffcc5c","line_alpha":0.2,"line_width":6}}}},{"type":"object","name":"GlyphRenderer","id":"p1100","attributes":{"name":"North America","data_source":{"type":"object","name":"ColumnDataSource","id":"p1091","attributes":{"selected":{"type":"object","name":"Selection","id":"p1092","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1093"},"data":{"type":"map","entries":[["mpg",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAAM0AAAAAAAAA0QAAAAAAAADVAAAAAAAAANkDNzMzMzEw2QAAAAAAAADdAAAAAAAAAOEAAAAAAAIA4QAAAAAAAADlAmpmZmZkZOUAAAAAAAIA5QAAAAAAAADpAZmZmZmZmOkAAAAAAAIA6QAAAAAAAADtAAAAAAAAAPEAAAAAAAAA9QGZmZmZm5j1AAAAAAAAAPkAAAAAAAIA+QAAAAAAAAD9AzczMzMwMQEAAAAAAAABBQDMzMzMzM0FAzczMzMwMQkA="},"shape":[25],"dtype":"float64","order":"little"}],["hp",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAABAVUAAAAAAAIBWQAAAAAAAwFNAAAAAAADAU0AAAAAAAABWQAAAAAAAwFRAAAAAAAAAV0AAAAAAAABOQAAAAAAAwFJAAAAAAAAAVkAAAAAAAEBWQAAAAAAAAFRAAAAAAAAAVkAAAAAAAABSQAAAAAAAAFZAAAAAAACwVUAAAAAAAABKQAAAAAAAQFBAAAAAAAAAUUAAAAAAAIBPQAAAAAAAgFRAAAAAAACAUUAAAAAAAABWQAAAAAAAQFBAAAAAAACAUEA="},"shape":[25],"dtype":"float64","order":"little"}],["origin",["North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America"]]]}}},"view":{"type":"object","name":"CDSView","id":"p1101","attributes":{"filter":{"type":"object","name":"AllIndices","id":"p1102"}}},"glyph":{"type":"object","name":"Line","id":"p1097","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#88d8b0","line_width":6}},"selection_glyph":{"type":"object","name":"Line","id":"p1104","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#88d8b0","line_width":6}},"nonselection_glyph":{"type":"object","name":"Line","id":"p1098","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#88d8b0","line_alpha":0.1,"line_width":6}},"muted_glyph":{"type":"object","name":"Line","id":"p1099","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#88d8b0","line_alpha":0.2,"line_width":6}}}}],"toolbar":{"type":"object","name":"Toolbar","id":"p1040","attributes":{"tools":[{"type":"object","name":"WheelZoomTool","id":"p1023","attributes":{"tags":["hv_created"],"renderers":"auto","zoom_together":"none"}},{"type":"object","name":"HoverTool","id":"p1024","attributes":{"tags":["hv_created"],"renderers":[{"id":"p1071"},{"id":"p1086"},{"id":"p1100"}],"tooltips":[["origin","@{origin}"],["mpg","@{mpg}"],["hp","@{hp}"]]}},{"type":"object","name":"SaveTool","id":"p1053"},{"type":"object","name":"PanTool","id":"p1054"},{"type":"object","name":"BoxZoomTool","id":"p1055","attributes":{"overlay":{"type":"object","name":"BoxAnnotation","id":"p1056","attributes":{"syncable":false,"level":"overlay","visible":false,"left":{"type":"number","value":"nan"},"right":{"type":"number","value":"nan"},"top":{"type":"number","value":"nan"},"bottom":{"type":"number","value":"nan"},"left_units":"canvas","right_units":"canvas","top_units":"canvas","bottom_units":"canvas","line_color":"black","line_alpha":1.0,"line_width":2,"line_dash":[4,4],"fill_color":"lightgrey","fill_alpha":0.5}}}},{"type":"object","name":"ResetTool","id":"p1061"}],"active_drag":{"id":"p1054"},"active_scroll":{"id":"p1023"}}},"left":[{"type":"object","name":"LinearAxis","id":"p1048","attributes":{"ticker":{"type":"object","name":"BasicTicker","id":"p1049","attributes":{"mantissas":[1,2,5]}},"formatter":{"type":"object","name":"BasicTickFormatter","id":"p1050"},"axis_label":"hp","axis_label_standoff":10,"axis_label_text_color":"#2B2B2B","axis_label_text_font":"Open Sans, sans-serif","axis_label_text_font_size":"1.25em","axis_label_text_font_style":"normal","major_label_policy":{"type":"object","name":"AllLabels","id":"p1051"},"major_label_text_color":"#2B2B2B","major_label_text_font":"Open Sans, sans-serif","major_label_text_font_size":"1.025em","axis_line_color":"#2B2B2B","axis_line_alpha":0.1,"major_tick_line_color":"#2B2B2B","major_tick_line_alpha":0.5,"minor_tick_line_color":"#2B2B2B","minor_tick_line_alpha":0.25}}],"right":[{"type":"object","name":"Legend","id":"p1074","attributes":{"location":[0,0],"title":"origin","border_line_color":"#888888","border_line_alpha":0.5,"background_fill_color":"#F7F7F7","background_fill_alpha":0.25,"click_policy":"mute","label_text_color":"#2B2B2B","label_text_font":"Open Sans, sans-serif","label_text_font_size":"1.025em","label_standoff":8,"glyph_width":15,"spacing":8,"items":[{"type":"object","name":"LegendItem","id":"p1075","attributes":{"label":{"type":"value","value":"Asia"},"renderers":[{"id":"p1071"}]}},{"type":"object","name":"LegendItem","id":"p1089","attributes":{"label":{"type":"value","value":"Europe"},"renderers":[{"id":"p1086"}]}},{"type":"object","name":"LegendItem","id":"p1103","attributes":{"label":{"type":"value","value":"North America"},"renderers":[{"id":"p1100"}]}}]}}],"below":[{"type":"object","name":"LinearAxis","id":"p1043","attributes":{"ticker":{"type":"object","name":"BasicTicker","id":"p1044","attributes":{"mantissas":[1,2,5]}},"formatter":{"type":"object","name":"BasicTickFormatter","id":"p1045"},"axis_label":"mpg","axis_label_standoff":10,"axis_label_text_color":"#2B2B2B","axis_label_text_font":"Open Sans, sans-serif","axis_label_text_font_size":"1.25em","axis_label_text_font_style":"normal","major_label_policy":{"type":"object","name":"AllLabels","id":"p1046"},"major_label_text_color":"#2B2B2B","major_label_text_font":"Open Sans, sans-serif","major_label_text_font_size":"1.025em","axis_line_color":"#2B2B2B","axis_line_alpha":0.1,"major_tick_line_color":"#2B2B2B","major_tick_line_alpha":0.5,"minor_tick_line_color":"#2B2B2B","minor_tick_line_alpha":0.25}}],"center":[{"type":"object","name":"Grid","id":"p1047","attributes":{"axis":{"id":"p1043"},"grid_line_color":null,"grid_line_alpha":0.25}},{"type":"object","name":"Grid","id":"p1052","attributes":{"dimension":1,"axis":{"id":"p1048"},"grid_line_color":null,"grid_line_alpha":0.25}}],"background_fill_color":"#ffffff","border_fill_color":"#F7F7F7","border_fill_alpha":0,"min_border_top":10,"min_border_bottom":10,"min_border_left":10,"min_border_right":10,"output_backend":"webgl"}}]}},{"type":"object","name":"panel.models.tabulator.DataTabulator","id":"p1134","attributes":{"name":"main-139890291538768","tags":["main"],"subscribed_events":{"type":"set","entries":["cell-click","selection-change","table-edit"]},"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1160","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1161","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/font-awesome/css/all.min.css"}},{"id":"p1151"},{"type":"object","name":"ImportedStyleSheet","id":"p1159","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/datatabulator/[email protected]/dist/css/tabulator_fast.min.css"}}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","configuration":{"type":"map","entries":[["selectable",true],["columns",[{"type":"map","entries":[["field","index"],["sorter","number"]]},{"type":"map","entries":[["field","origin"]]},{"type":"map","entries":[["field","mpg"],["sorter","number"]]},{"type":"map","entries":[["field","hp"],["sorter","number"]]}]],["dataTree",false]]},"columns":[{"type":"object","name":"TableColumn","id":"p1113","attributes":{"field":"index","title":"index","width":0,"formatter":{"type":"object","name":"NumberFormatter","id":"p1112","attributes":{"text_align":"left"}},"editor":{"type":"object","name":"CellEditor","id":"p1111"}}},{"type":"object","name":"TableColumn","id":"p1118","attributes":{"field":"origin","title":"origin","width":0,"formatter":{"type":"object","name":"StringFormatter","id":"p1117"},"editor":{"type":"object","name":"StringEditor","id":"p1116"}}},{"type":"object","name":"TableColumn","id":"p1123","attributes":{"field":"mpg","title":"mpg","width":0,"formatter":{"type":"object","name":"NumberFormatter","id":"p1122","attributes":{"text_align":"right","format":"0,0.0[00000]"}},"editor":{"type":"object","name":"NumberEditor","id":"p1121"}}},{"type":"object","name":"TableColumn","id":"p1128","attributes":{"field":"hp","title":"hp","width":0,"formatter":{"type":"object","name":"NumberFormatter","id":"p1127","attributes":{"text_align":"right","format":"0,0.0[00000]"}},"editor":{"type":"object","name":"NumberEditor","id":"p1126"}}}],"indexes":["index"],"layout":"fit_data_table","source":{"type":"object","name":"ColumnDataSource","id":"p1131","attributes":{"selected":{"type":"object","name":"Selection","id":"p1132","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1133"},"data":{"type":"map","entries":[["index",{"type":"ndarray","array":{"type":"bytes","data":"IQAAAAAAAAAiAAAAHAAAACMAAAABAAAAJAAAACUAAAAdAAAAAgAAAA=="},"shape":[10],"dtype":"int32","order":"little"}],["origin",{"type":"ndarray","array":["North America","Asia","North America","Europe","North America","Asia","North America","North America","Europe","Asia"],"shape":[10],"dtype":"object","order":"little"}],["mpg",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAAM0AAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA1QJqZmZmZGTVAAAAAAAAANkDNzMzMzEw2QAAAAAAAADdAAAAAAAAAN0A="},"shape":[10],"dtype":"float64","order":"little"}],["hp",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAABAVUAAAAAAAABWQAAAAAAAgFZAAAAAAADAVkAAAAAAAMBTQAAAAAAAwFdAAAAAAADAU0AAAAAAAABWQAAAAAAAwFdAAAAAAABAWEA="},"shape":[10],"dtype":"float64","order":"little"}]]}}},"cell_styles":{"type":"map","entries":[["id","a80f3355f63745bdb70d58ff04c43e65"],["data",{"type":"map"}]]},"pagination":"remote","page":1,"page_size":10,"max_page":6,"select_mode":true,"selectable_rows":null}},{"type":"object","name":"Slider","id":"p1136","attributes":{"name":"nav-139890338564752","tags":["nav"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1162","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","title":"Cylinders","start":4,"end":8,"value":4,"step":2}},{"type":"object","name":"panel.models.markup.HTML","id":"p1139","attributes":{"name":"nav-139890292094736","tags":["nav"],"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1163","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1164","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/markdown.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","text":"&lt;p&gt;Manufacturers&lt;/p&gt;\n"}},{"type":"object","name":"panel.models.widgets.CheckboxButtonGroup","id":"p1142","attributes":{"button_type":"primary","name":"nav-139890351409936","tags":["nav"],"css_classes":["outline"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1165","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1166","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/button.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","labels":["ford","chevrolet","honda","toyota","audi"],"active":[0,1,2,3,4]}},{"type":"object","name":"panel.models.markup.HTML","id":"p1145","attributes":{"name":"nav-139890291898384","tags":["nav"],"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1167","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1168","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/markdown.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","text":"&lt;p&gt;Y axis&lt;/p&gt;\n"}},{"type":"object","name":"panel.models.widgets.RadioButtonGroup","id":"p1148","attributes":{"button_type":"primary","name":"nav-139890293454416","tags":["nav"],"css_classes":["outline"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1169","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1170","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/button.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","labels":["hp","weight"],"active":0}}],"defs":[{"type":"model","name":"ReactiveHTML1"},{"type":"model","name":"FlexBox1","properties":[{"name":"align_content","kind":"Any","default":"flex-start"},{"name":"align_items","kind":"Any","default":"flex-start"},{"name":"flex_direction","kind":"Any","default":"row"},{"name":"flex_wrap","kind":"Any","default":"wrap"},{"name":"justify_content","kind":"Any","default":"flex-start"}]},{"type":"model","name":"FloatPanel1","properties":[{"name":"config","kind":"Any","default":{"type":"map"}},{"name":"contained","kind":"Any","default":true},{"name":"position","kind":"Any","default":"right-top"},{"name":"offsetx","kind":"Any","default":null},{"name":"offsety","kind":"Any","default":null},{"name":"theme","kind":"Any","default":"primary"},{"name":"status","kind":"Any","default":"normalized"}]},{"type":"model","name":"GridStack1","properties":[{"name":"mode","kind":"Any","default":"warn"},{"name":"ncols","kind":"Any","default":null},{"name":"nrows","kind":"Any","default":null},{"name":"allow_resize","kind":"Any","default":true},{"name":"allow_drag","kind":"Any","default":true},{"name":"state","kind":"Any","default":[]}]},{"type":"model","name":"drag1","properties":[{"name":"slider_width","kind":"Any","default":5},{"name":"slider_color","kind":"Any","default":"black"},{"name":"value","kind":"Any","default":50}]},{"type":"model","name":"click1","properties":[{"name":"terminal_output","kind":"Any","default":""},{"name":"debug_name","kind":"Any","default":""},{"name":"clears","kind":"Any","default":0}]},{"type":"model","name":"copy_to_clipboard1","properties":[{"name":"fill","kind":"Any","default":"none"},{"name":"value","kind":"Any","default":null}]},{"type":"model","name":"FastWrapper1","properties":[{"name":"object","kind":"Any","default":null},{"name":"style","kind":"Any","default":null}]},{"type":"model","name":"NotificationAreaBase1","properties":[{"name":"js_events","kind":"Any","default":{"type":"map"}},{"name":"position","kind":"Any","default":"bottom-right"},{"name":"_clear","kind":"Any","default":0}]},{"type":"model","name":"NotificationArea1","properties":[{"name":"js_events","kind":"Any","default":{"type":"map"}},{"name":"notifications","kind":"Any","default":[]},{"name":"position","kind":"Any","default":"bottom-right"},{"name":"_clear","kind":"Any","default":0},{"name":"types","kind":"Any","default":[{"type":"map","entries":[["type","warning"],["background","#ffc107"],["icon",{"type":"map","entries":[["className","fas fa-exclamation-triangle"],["tagName","i"],["color","white"]]}]]},{"type":"map","entries":[["type","info"],["background","#007bff"],["icon",{"type":"map","entries":[["className","fas fa-info-circle"],["tagName","i"],["color","white"]]}]]}]}]},{"type":"model","name":"Notification","properties":[{"name":"background","kind":"Any","default":null},{"name":"duration","kind":"Any","default":3000},{"name":"icon","kind":"Any","default":null},{"name":"message","kind":"Any","default":""},{"name":"notification_type","kind":"Any","default":null},{"name":"_destroyed","kind":"Any","default":false}]},{"type":"model","name":"TemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"BootstrapTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"MaterialTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]}]}}
|
336 |
+
</script>
|
337 |
+
<script type="text/javascript">
|
338 |
+
(function() {
|
339 |
+
const fn = function() {
|
340 |
+
Bokeh.safely(function() {
|
341 |
+
(function(root) {
|
342 |
+
function embed_document(root) {
|
343 |
+
const docs_json = document.getElementById('p1190').textContent;
|
344 |
+
const render_items = [{"docid":"17f176aa-cfcb-40ad-8a03-07569517267c","roots":{"p1002":"e3b90b45-857a-40ad-93b5-1462446e862c","p1009":"a7e13da5-922b-4ac6-ab81-47fea6f75d1a","p1012":"fb035690-9903-4447-8224-f83afc4152ad","p1013":"c6b8852c-6dcc-4ac5-8534-fe6a348e6fe4","p1016":"c782d72a-6832-412c-a60a-46aab1ba2d66","p1017":"f4222dbd-b9d5-4c01-9558-2834903307a1","p1134":"b7fdfc1c-8c8f-4a65-a2b9-a00b8d605ef2","p1136":"e33e4285-845f-4da7-ae9c-95060ffe746f","p1139":"df32b787-9286-4976-abd2-43562e85a7f0","p1142":"f41bb664-73df-4a71-9695-af32d1374a97","p1145":"ce806b22-555a-4ac5-b7a3-577bdf7908ed","p1148":"e247a985-568d-4956-8ed1-12c79cf78c54"},"root_ids":["p1002","p1009","p1012","p1013","p1016","p1017","p1134","p1136","p1139","p1142","p1145","p1148"]}];
|
345 |
+
root.Bokeh.embed.embed_items(docs_json, render_items);
|
346 |
+
}
|
347 |
+
if (root.Bokeh !== undefined) {
|
348 |
+
embed_document(root);
|
349 |
+
} else {
|
350 |
+
let attempts = 0;
|
351 |
+
const timer = setInterval(function(root) {
|
352 |
+
if (root.Bokeh !== undefined) {
|
353 |
+
clearInterval(timer);
|
354 |
+
embed_document(root);
|
355 |
+
} else {
|
356 |
+
attempts++;
|
357 |
+
if (attempts > 100) {
|
358 |
+
clearInterval(timer);
|
359 |
+
console.log("Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing");
|
360 |
+
}
|
361 |
+
}
|
362 |
+
}, 10, root)
|
363 |
+
}
|
364 |
+
})(window);
|
365 |
+
});
|
366 |
+
};
|
367 |
+
if (document.readyState != "loading") fn();
|
368 |
+
else document.addEventListener("DOMContentLoaded", fn);
|
369 |
+
})();
|
370 |
+
</script>
|
371 |
+
</body>
|
372 |
+
</html>
|
index.js
ADDED
@@ -0,0 +1,272 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
importScripts("https://cdn.jsdelivr.net/pyodide/v0.24.1/full/pyodide.js");
|
2 |
+
|
3 |
+
function sendPatch(patch, buffers, msg_id) {
|
4 |
+
self.postMessage({
|
5 |
+
type: 'patch',
|
6 |
+
patch: patch,
|
7 |
+
buffers: buffers
|
8 |
+
})
|
9 |
+
}
|
10 |
+
|
11 |
+
async function startApplication() {
|
12 |
+
console.log("Loading pyodide!");
|
13 |
+
self.postMessage({type: 'status', msg: 'Loading pyodide'})
|
14 |
+
self.pyodide = await loadPyodide();
|
15 |
+
self.pyodide.globals.set("sendPatch", sendPatch);
|
16 |
+
console.log("Loaded!");
|
17 |
+
await self.pyodide.loadPackage("micropip");
|
18 |
+
const env_spec = ['https://cdn.holoviz.org/panel/wheels/bokeh-3.3.2-py3-none-any.whl', 'https://cdn.holoviz.org/panel/1.3.6/dist/wheels/panel-1.3.6-py3-none-any.whl', 'pyodide-http==0.2.1', 'holoviews', 'hvplot', 'param', 'pandas']
|
19 |
+
for (const pkg of env_spec) {
|
20 |
+
let pkg_name;
|
21 |
+
if (pkg.endsWith('.whl')) {
|
22 |
+
pkg_name = pkg.split('/').slice(-1)[0].split('-')[0]
|
23 |
+
} else {
|
24 |
+
pkg_name = pkg
|
25 |
+
}
|
26 |
+
self.postMessage({type: 'status', msg: `Installing ${pkg_name}`})
|
27 |
+
try {
|
28 |
+
await self.pyodide.runPythonAsync(`
|
29 |
+
import micropip
|
30 |
+
await micropip.install('${pkg}');
|
31 |
+
`);
|
32 |
+
} catch(e) {
|
33 |
+
console.log(e)
|
34 |
+
self.postMessage({
|
35 |
+
type: 'status',
|
36 |
+
msg: `Error while installing ${pkg_name}`
|
37 |
+
});
|
38 |
+
}
|
39 |
+
}
|
40 |
+
console.log("Packages loaded!");
|
41 |
+
self.postMessage({type: 'status', msg: 'Executing code'})
|
42 |
+
const code = `
|
43 |
+
|
44 |
+
import asyncio
|
45 |
+
|
46 |
+
from panel.io.pyodide import init_doc, write_doc
|
47 |
+
|
48 |
+
init_doc()
|
49 |
+
|
50 |
+
#!/usr/bin/env python
|
51 |
+
# coding: utf-8
|
52 |
+
|
53 |
+
# # The Easiest Way to Create an Interactive Dashboard in Python
|
54 |
+
#
|
55 |
+
# This notebook is an updated version of the original notebook supporting the blog post
|
56 |
+
#
|
57 |
+
# **[The Easiest Way to Create an Interactive Dashboard in Python](https://towardsdatascience.com/the-easiest-way-to-create-an-interactive-dashboard-in-python-77440f2511d1)**. Turn Pandas pipelines into a
|
58 |
+
# dashboard using [\`param.rx\`](https://param.holoviz.org/user_guide/Reactive_Expressions.html) and [panel.ReactiveExpr](https://panel.holoviz.org/reference/panes/ReactiveExpr.html).
|
59 |
+
#
|
60 |
+
# by *Sophia Yang* and *Marc Skov Madsen*.
|
61 |
+
#
|
62 |
+
# 
|
63 |
+
|
64 |
+
# ## Import and configure packages
|
65 |
+
#
|
66 |
+
# Please note that in **Colab** you will need to \`!pip install panel hvplot\`. In VS Code notebooks you will need to install \`!pip install panel hvplot jupyter_bokeh\`.
|
67 |
+
|
68 |
+
# In[ ]:
|
69 |
+
|
70 |
+
|
71 |
+
# !pip install panel==1.3.6 hvplot==0.9.1 # colab
|
72 |
+
# !pip install panel==1.3.6 hvplot==0.9.1 jupyter_bokeh==3.0.7 # vscode
|
73 |
+
|
74 |
+
|
75 |
+
# In[ ]:
|
76 |
+
|
77 |
+
|
78 |
+
import param
|
79 |
+
import panel as pn
|
80 |
+
|
81 |
+
pn.extension('tabulator', sizing_mode="stretch_width")
|
82 |
+
|
83 |
+
|
84 |
+
# In[ ]:
|
85 |
+
|
86 |
+
|
87 |
+
import hvplot.pandas
|
88 |
+
import holoviews as hv
|
89 |
+
|
90 |
+
hv.extension('bokeh')
|
91 |
+
|
92 |
+
|
93 |
+
# ## Define Color Palette
|
94 |
+
|
95 |
+
# In[ ]:
|
96 |
+
|
97 |
+
|
98 |
+
PALETTE = ["#ff6f69", "#ffcc5c", "#88d8b0", ]
|
99 |
+
pn.Row(
|
100 |
+
pn.layout.HSpacer(height=50, styles={"background": PALETTE[0]}),
|
101 |
+
pn.layout.HSpacer(height=50, styles={"background": PALETTE[1]}),
|
102 |
+
pn.layout.HSpacer(height=50, styles={"background": PALETTE[2]}),
|
103 |
+
)
|
104 |
+
|
105 |
+
|
106 |
+
# ## Load Data
|
107 |
+
|
108 |
+
# In[ ]:
|
109 |
+
|
110 |
+
|
111 |
+
from bokeh.sampledata.autompg import autompg_clean as df
|
112 |
+
df.head(3)
|
113 |
+
|
114 |
+
|
115 |
+
# ## Define DataFrame Pipeline
|
116 |
+
|
117 |
+
# In[ ]:
|
118 |
+
|
119 |
+
|
120 |
+
def get_data(df, cylinders=4, mfr=['ford','chevrolet'], yaxis="hp"):
|
121 |
+
return (
|
122 |
+
df[
|
123 |
+
(df.cyl == cylinders) &
|
124 |
+
(df.mfr.isin(mfr))
|
125 |
+
]
|
126 |
+
.groupby(['origin', 'mpg'])[yaxis].mean()
|
127 |
+
.to_frame()
|
128 |
+
.reset_index()
|
129 |
+
.sort_values(by='mpg')
|
130 |
+
)
|
131 |
+
|
132 |
+
get_data(df).head(3)
|
133 |
+
|
134 |
+
|
135 |
+
# ## Make DataFrame Pipeline Interactive
|
136 |
+
|
137 |
+
# Define [Panel widgets](https://panel.holoviz.org/reference/index.html#widgets)
|
138 |
+
|
139 |
+
# In[ ]:
|
140 |
+
|
141 |
+
|
142 |
+
cylinders = pn.widgets.IntSlider(name='Cylinders', start=4, end=8, step=2)
|
143 |
+
mfr = pn.widgets.ToggleGroup(
|
144 |
+
name='MFR',
|
145 |
+
options=['ford', 'chevrolet', 'honda', 'toyota', 'audi'],
|
146 |
+
value=['ford', 'chevrolet', 'honda', 'toyota', 'audi'],
|
147 |
+
button_type='primary', button_style="outline")
|
148 |
+
yaxis = pn.widgets.RadioButtonGroup(
|
149 |
+
name='Y axis',
|
150 |
+
options=['hp', 'weight'],
|
151 |
+
button_type='primary', button_style="outline"
|
152 |
+
)
|
153 |
+
|
154 |
+
|
155 |
+
# Combine pipeline and widgets
|
156 |
+
|
157 |
+
# In[ ]:
|
158 |
+
|
159 |
+
|
160 |
+
ipipeline=param.rx(get_data)(df, cylinders, mfr, yaxis)
|
161 |
+
|
162 |
+
ipipeline.head()
|
163 |
+
|
164 |
+
|
165 |
+
# ## Pipe to Tabulator
|
166 |
+
|
167 |
+
# In[ ]:
|
168 |
+
|
169 |
+
|
170 |
+
itable = pn.widgets.Tabulator(ipipeline, pagination='remote', page_size=10)
|
171 |
+
itable
|
172 |
+
|
173 |
+
|
174 |
+
# Check out the [Tabulator Reference Guide](https://panel.holoviz.org/reference/widgets/Tabulator.html) for more inspiration.
|
175 |
+
|
176 |
+
# ## Pipe to hvPlot and HoloViews
|
177 |
+
|
178 |
+
# First we will create the interactive plot with [hvPlot](https://hvplot.holoviz.org/).
|
179 |
+
|
180 |
+
# In[ ]:
|
181 |
+
|
182 |
+
|
183 |
+
ihvplot = ipipeline.hvplot(x='mpg', y=yaxis, by='origin', color=PALETTE, line_width=6, height=400, responsive=True)
|
184 |
+
ihvplot
|
185 |
+
|
186 |
+
|
187 |
+
# The we will put it in a HoloViews pane
|
188 |
+
|
189 |
+
# In[ ]:
|
190 |
+
|
191 |
+
|
192 |
+
iplot = pn.pane.HoloViews(ihvplot)
|
193 |
+
iplot
|
194 |
+
|
195 |
+
|
196 |
+
# Check out the [HoloViews Reference Guide](https://panel.holoviz.org/reference/panes/HoloViews.html) for more inspiration
|
197 |
+
|
198 |
+
# ## Layout using Template
|
199 |
+
#
|
200 |
+
# Here we use the [FastListTemplate](https://panel.holoviz.org/reference/templates/FastListTemplate.html#templates-gallery-fastlisttemplate).
|
201 |
+
|
202 |
+
# In[ ]:
|
203 |
+
|
204 |
+
|
205 |
+
template = pn.template.FastListTemplate(
|
206 |
+
title='The easiest way to create a dashboard',
|
207 |
+
sidebar=[cylinders, 'Manufacturers', mfr, 'Y axis' , yaxis],
|
208 |
+
main=[iplot, itable],
|
209 |
+
accent_base_color="#88d8b0",
|
210 |
+
header_background="#88d8b0",
|
211 |
+
# main_layout=None, # Use this if you want a gray sidebar and white main area
|
212 |
+
)
|
213 |
+
template.servable(); # Add semicolon because templates don't render well in a notebook
|
214 |
+
|
215 |
+
|
216 |
+
# To *serve the notebook* run \`panel serve the_easiest_way_to_create_dashboard.ipynb\`.
|
217 |
+
|
218 |
+
|
219 |
+
await write_doc()
|
220 |
+
`
|
221 |
+
|
222 |
+
try {
|
223 |
+
const [docs_json, render_items, root_ids] = await self.pyodide.runPythonAsync(code)
|
224 |
+
self.postMessage({
|
225 |
+
type: 'render',
|
226 |
+
docs_json: docs_json,
|
227 |
+
render_items: render_items,
|
228 |
+
root_ids: root_ids
|
229 |
+
})
|
230 |
+
} catch(e) {
|
231 |
+
const traceback = `${e}`
|
232 |
+
const tblines = traceback.split('\n')
|
233 |
+
self.postMessage({
|
234 |
+
type: 'status',
|
235 |
+
msg: tblines[tblines.length-2]
|
236 |
+
});
|
237 |
+
throw e
|
238 |
+
}
|
239 |
+
}
|
240 |
+
|
241 |
+
self.onmessage = async (event) => {
|
242 |
+
const msg = event.data
|
243 |
+
if (msg.type === 'rendered') {
|
244 |
+
self.pyodide.runPythonAsync(`
|
245 |
+
from panel.io.state import state
|
246 |
+
from panel.io.pyodide import _link_docs_worker
|
247 |
+
|
248 |
+
_link_docs_worker(state.curdoc, sendPatch, setter='js')
|
249 |
+
`)
|
250 |
+
} else if (msg.type === 'patch') {
|
251 |
+
self.pyodide.globals.set('patch', msg.patch)
|
252 |
+
self.pyodide.runPythonAsync(`
|
253 |
+
state.curdoc.apply_json_patch(patch.to_py(), setter='js')
|
254 |
+
`)
|
255 |
+
self.postMessage({type: 'idle'})
|
256 |
+
} else if (msg.type === 'location') {
|
257 |
+
self.pyodide.globals.set('location', msg.location)
|
258 |
+
self.pyodide.runPythonAsync(`
|
259 |
+
import json
|
260 |
+
from panel.io.state import state
|
261 |
+
from panel.util import edit_readonly
|
262 |
+
if state.location:
|
263 |
+
loc_data = json.loads(location)
|
264 |
+
with edit_readonly(state.location):
|
265 |
+
state.location.param.update({
|
266 |
+
k: v for k, v in loc_data.items() if k in state.location.param
|
267 |
+
})
|
268 |
+
`)
|
269 |
+
}
|
270 |
+
}
|
271 |
+
|
272 |
+
startApplication()
|