solara 1.30.0__py2.py3-none-any.whl → 1.31.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. {solara-1.30.0.dist-info → solara-1.31.0.dist-info}/METADATA +7 -42
  2. solara-1.31.0.dist-info/RECORD +5 -0
  3. {solara-1.30.0.dist-info → solara-1.31.0.dist-info}/WHEEL +1 -1
  4. {solara/template/portal → solara-1.31.0.dist-info/licenses}/LICENSE +1 -1
  5. solara/__init__.py +0 -123
  6. solara/__main__.py +0 -734
  7. solara/alias.py +0 -6
  8. solara/autorouting.py +0 -554
  9. solara/cache.py +0 -294
  10. solara/checks.html +0 -71
  11. solara/checks.py +0 -224
  12. solara/comm.py +0 -28
  13. solara/components/__init__.py +0 -59
  14. solara/components/alert.py +0 -155
  15. solara/components/applayout.py +0 -393
  16. solara/components/button.py +0 -85
  17. solara/components/card.py +0 -87
  18. solara/components/checkbox.py +0 -50
  19. solara/components/code_highlight_css.py +0 -11
  20. solara/components/code_highlight_css.vue +0 -63
  21. solara/components/columns.py +0 -159
  22. solara/components/component_vue.py +0 -109
  23. solara/components/cross_filter.py +0 -335
  24. solara/components/dataframe.py +0 -546
  25. solara/components/datatable.py +0 -221
  26. solara/components/datatable.vue +0 -175
  27. solara/components/details.py +0 -21
  28. solara/components/download.vue +0 -35
  29. solara/components/echarts.py +0 -75
  30. solara/components/echarts.vue +0 -128
  31. solara/components/figure_altair.py +0 -39
  32. solara/components/file_browser.py +0 -182
  33. solara/components/file_download.py +0 -199
  34. solara/components/file_drop.py +0 -139
  35. solara/components/file_drop.vue +0 -83
  36. solara/components/file_list_widget.vue +0 -78
  37. solara/components/head.py +0 -27
  38. solara/components/head_tag.py +0 -49
  39. solara/components/head_tag.vue +0 -60
  40. solara/components/image.py +0 -173
  41. solara/components/input.py +0 -440
  42. solara/components/link.py +0 -55
  43. solara/components/markdown.py +0 -371
  44. solara/components/markdown_editor.py +0 -25
  45. solara/components/markdown_editor.vue +0 -362
  46. solara/components/matplotlib.py +0 -74
  47. solara/components/meta.py +0 -47
  48. solara/components/misc.py +0 -333
  49. solara/components/pivot_table.py +0 -258
  50. solara/components/pivot_table.vue +0 -158
  51. solara/components/progress.py +0 -47
  52. solara/components/select.py +0 -186
  53. solara/components/select.vue +0 -27
  54. solara/components/slider.py +0 -442
  55. solara/components/slider_date.vue +0 -56
  56. solara/components/spinner-solara.vue +0 -105
  57. solara/components/spinner.py +0 -30
  58. solara/components/sql_code.py +0 -33
  59. solara/components/sql_code.vue +0 -128
  60. solara/components/style.py +0 -105
  61. solara/components/switch.py +0 -68
  62. solara/components/tab_navigation.py +0 -37
  63. solara/components/title.py +0 -90
  64. solara/components/title.vue +0 -38
  65. solara/components/togglebuttons.py +0 -202
  66. solara/components/tooltip.py +0 -61
  67. solara/datatypes.py +0 -143
  68. solara/express.py +0 -241
  69. solara/hooks/__init__.py +0 -4
  70. solara/hooks/dataframe.py +0 -99
  71. solara/hooks/misc.py +0 -263
  72. solara/hooks/use_reactive.py +0 -129
  73. solara/hooks/use_thread.py +0 -129
  74. solara/kitchensink.py +0 -8
  75. solara/lab/__init__.py +0 -34
  76. solara/lab/components/__init__.py +0 -6
  77. solara/lab/components/chat.py +0 -203
  78. solara/lab/components/confirmation_dialog.py +0 -165
  79. solara/lab/components/cross_filter.py +0 -7
  80. solara/lab/components/input_date.py +0 -298
  81. solara/lab/components/menu.py +0 -181
  82. solara/lab/components/menu.vue +0 -38
  83. solara/lab/components/tabs.py +0 -274
  84. solara/lab/components/theming.py +0 -98
  85. solara/lab/components/theming.vue +0 -72
  86. solara/lab/hooks/__init__.py +0 -0
  87. solara/lab/hooks/dataframe.py +0 -12
  88. solara/lab/toestand.py +0 -3
  89. solara/lab/utils/__init__.py +0 -2
  90. solara/lab/utils/cookies.py +0 -5
  91. solara/lab/utils/dataframe.py +0 -115
  92. solara/lab/utils/headers.py +0 -5
  93. solara/layout.py +0 -44
  94. solara/minisettings.py +0 -133
  95. solara/py.typed +0 -0
  96. solara/reactive.py +0 -93
  97. solara/routing.py +0 -268
  98. solara/scope/__init__.py +0 -87
  99. solara/scope/types.py +0 -55
  100. solara/server/__init__.py +0 -0
  101. solara/server/app.py +0 -490
  102. solara/server/assets/custom.css +0 -1
  103. solara/server/assets/custom.js +0 -1
  104. solara/server/assets/favicon.png +0 -0
  105. solara/server/assets/favicon.svg +0 -5
  106. solara/server/assets/style.css +0 -1665
  107. solara/server/assets/theme-dark.css +0 -437
  108. solara/server/assets/theme-light.css +0 -420
  109. solara/server/assets/theme.js +0 -3
  110. solara/server/cdn_helper.py +0 -77
  111. solara/server/esm.py +0 -69
  112. solara/server/fastapi.py +0 -5
  113. solara/server/flask.py +0 -286
  114. solara/server/jupyter/__init__.py +0 -2
  115. solara/server/jupyter/cdn_handler.py +0 -28
  116. solara/server/jupyter/server_extension.py +0 -29
  117. solara/server/jupytertools.py +0 -46
  118. solara/server/kernel.py +0 -319
  119. solara/server/kernel_context.py +0 -393
  120. solara/server/patch.py +0 -552
  121. solara/server/reload.py +0 -242
  122. solara/server/server.py +0 -437
  123. solara/server/settings.py +0 -212
  124. solara/server/shell.py +0 -240
  125. solara/server/starlette.py +0 -597
  126. solara/server/static/ansi.js +0 -270
  127. solara/server/static/highlight-dark.css +0 -82
  128. solara/server/static/highlight.css +0 -43
  129. solara/server/static/main-vuetify.js +0 -260
  130. solara/server/static/main.js +0 -163
  131. solara/server/static/solara_bootstrap.py +0 -129
  132. solara/server/static/sun.svg +0 -23
  133. solara/server/static/webworker.js +0 -42
  134. solara/server/telemetry.py +0 -212
  135. solara/server/templates/index.html.j2 +0 -1
  136. solara/server/templates/loader-plain.css +0 -11
  137. solara/server/templates/loader-plain.html +0 -20
  138. solara/server/templates/loader-solara.css +0 -111
  139. solara/server/templates/loader-solara.html +0 -40
  140. solara/server/templates/plain.html +0 -82
  141. solara/server/templates/solara.html.j2 +0 -446
  142. solara/server/threaded.py +0 -75
  143. solara/server/utils.py +0 -30
  144. solara/server/websocket.py +0 -44
  145. solara/settings.py +0 -56
  146. solara/tasks.py +0 -847
  147. solara/template/button.py +0 -16
  148. solara/template/markdown.py +0 -42
  149. solara/template/portal/.flake8 +0 -6
  150. solara/template/portal/.pre-commit-config.yaml +0 -28
  151. solara/template/portal/Procfile +0 -7
  152. solara/template/portal/mypy.ini +0 -3
  153. solara/template/portal/pyproject.toml +0 -26
  154. solara/template/portal/solara_portal/__init__.py +0 -3
  155. solara/template/portal/solara_portal/components/__init__.py +0 -2
  156. solara/template/portal/solara_portal/components/article.py +0 -28
  157. solara/template/portal/solara_portal/components/data.py +0 -28
  158. solara/template/portal/solara_portal/components/header.py +0 -6
  159. solara/template/portal/solara_portal/components/layout.py +0 -6
  160. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -85
  161. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -70
  162. solara/template/portal/solara_portal/data.py +0 -60
  163. solara/template/portal/solara_portal/pages/__init__.py +0 -67
  164. solara/template/portal/solara_portal/pages/article/__init__.py +0 -26
  165. solara/template/portal/solara_portal/pages/tabular.py +0 -29
  166. solara/template/portal/solara_portal/pages/viz/__init__.py +0 -69
  167. solara/template/portal/solara_portal/pages/viz/overview.py +0 -14
  168. solara/test/__init__.py +0 -0
  169. solara/test/pytest_plugin.py +0 -698
  170. solara/toestand.py +0 -772
  171. solara/util.py +0 -308
  172. solara/website/__init__.py +0 -0
  173. solara/website/assets/custom.css +0 -462
  174. solara/website/assets/images/logo-small.png +0 -0
  175. solara/website/assets/images/logo.svg +0 -17
  176. solara/website/assets/images/logo_white.svg +0 -50
  177. solara/website/assets/theme.js +0 -8
  178. solara/website/components/__init__.py +0 -5
  179. solara/website/components/algolia.vue +0 -24
  180. solara/website/components/algolia_api.vue +0 -157
  181. solara/website/components/docs.py +0 -118
  182. solara/website/components/header.py +0 -72
  183. solara/website/components/hero.py +0 -15
  184. solara/website/components/mailchimp.py +0 -12
  185. solara/website/components/mailchimp.vue +0 -47
  186. solara/website/components/notebook.py +0 -172
  187. solara/website/pages/__init__.py +0 -564
  188. solara/website/pages/apps/__init__.py +0 -16
  189. solara/website/pages/apps/authorization/__init__.py +0 -118
  190. solara/website/pages/apps/authorization/admin.py +0 -12
  191. solara/website/pages/apps/authorization/users.py +0 -12
  192. solara/website/pages/apps/jupyter-dashboard-1.py +0 -116
  193. solara/website/pages/apps/layout-demo.py +0 -40
  194. solara/website/pages/apps/multipage/__init__.py +0 -38
  195. solara/website/pages/apps/multipage/page1.py +0 -26
  196. solara/website/pages/apps/multipage/page2.py +0 -34
  197. solara/website/pages/apps/scatter.py +0 -136
  198. solara/website/pages/apps/scrolling.py +0 -63
  199. solara/website/pages/apps/tutorial-streamlit.py +0 -18
  200. solara/website/pages/changelog/__init__.py +0 -8
  201. solara/website/pages/changelog/changelog.md +0 -180
  202. solara/website/pages/contact/__init__.py +0 -8
  203. solara/website/pages/contact/contact.md +0 -17
  204. solara/website/pages/doc_use_download.py +0 -85
  205. solara/website/pages/documentation/__init__.py +0 -184
  206. solara/website/pages/documentation/advanced/__init__.py +0 -36
  207. solara/website/pages/documentation/advanced/content/00-overview.md +0 -1
  208. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -1
  209. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -191
  210. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -120
  211. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -149
  212. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -66
  213. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -43
  214. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -120
  215. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -4
  216. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -30
  217. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -38
  218. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -24
  219. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -104
  220. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -19
  221. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -3
  222. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -160
  223. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -13
  224. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -236
  225. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -81
  226. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -7
  227. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -1
  228. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -167
  229. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  230. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -41
  231. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -72
  232. solara/website/pages/documentation/advanced/content/__init__.py +0 -0
  233. solara/website/pages/documentation/api/__init__.py +0 -19
  234. solara/website/pages/documentation/api/cross_filter/__init__.py +0 -9
  235. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -23
  236. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -22
  237. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -22
  238. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -22
  239. solara/website/pages/documentation/api/hooks/__init__.py +0 -9
  240. solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -25
  241. solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -13
  242. solara/website/pages/documentation/api/hooks/use_effect.md +0 -43
  243. solara/website/pages/documentation/api/hooks/use_effect.py +0 -9
  244. solara/website/pages/documentation/api/hooks/use_exception.py +0 -33
  245. solara/website/pages/documentation/api/hooks/use_memo.md +0 -16
  246. solara/website/pages/documentation/api/hooks/use_memo.py +0 -9
  247. solara/website/pages/documentation/api/hooks/use_previous.py +0 -32
  248. solara/website/pages/documentation/api/hooks/use_reactive.py +0 -15
  249. solara/website/pages/documentation/api/hooks/use_state.py +0 -11
  250. solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -68
  251. solara/website/pages/documentation/api/hooks/use_thread.md +0 -58
  252. solara/website/pages/documentation/api/hooks/use_thread.py +0 -44
  253. solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -13
  254. solara/website/pages/documentation/api/routing/__init__.py +0 -9
  255. solara/website/pages/documentation/api/routing/generate_routes.py +0 -11
  256. solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -11
  257. solara/website/pages/documentation/api/routing/resolve_path.py +0 -36
  258. solara/website/pages/documentation/api/routing/route.py +0 -32
  259. solara/website/pages/documentation/api/routing/use_route.py +0 -80
  260. solara/website/pages/documentation/api/routing/use_router.py +0 -15
  261. solara/website/pages/documentation/api/utilities/__init__.py +0 -9
  262. solara/website/pages/documentation/api/utilities/component_vue.py +0 -11
  263. solara/website/pages/documentation/api/utilities/computed.py +0 -16
  264. solara/website/pages/documentation/api/utilities/display.py +0 -15
  265. solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -16
  266. solara/website/pages/documentation/api/utilities/get_session_id.py +0 -16
  267. solara/website/pages/documentation/api/utilities/memoize.py +0 -36
  268. solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -27
  269. solara/website/pages/documentation/api/utilities/reactive.py +0 -15
  270. solara/website/pages/documentation/api/utilities/widget.py +0 -104
  271. solara/website/pages/documentation/components/__init__.py +0 -12
  272. solara/website/pages/documentation/components/advanced/__init__.py +0 -9
  273. solara/website/pages/documentation/components/advanced/link.py +0 -28
  274. solara/website/pages/documentation/components/advanced/meta.py +0 -21
  275. solara/website/pages/documentation/components/advanced/style.py +0 -44
  276. solara/website/pages/documentation/components/common.py +0 -9
  277. solara/website/pages/documentation/components/data/__init__.py +0 -9
  278. solara/website/pages/documentation/components/data/dataframe.py +0 -44
  279. solara/website/pages/documentation/components/data/pivot_table.py +0 -81
  280. solara/website/pages/documentation/components/enterprise/__init__.py +0 -9
  281. solara/website/pages/documentation/components/enterprise/avatar.py +0 -19
  282. solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -20
  283. solara/website/pages/documentation/components/input/__init__.py +0 -9
  284. solara/website/pages/documentation/components/input/button.py +0 -22
  285. solara/website/pages/documentation/components/input/checkbox.py +0 -12
  286. solara/website/pages/documentation/components/input/file_browser.py +0 -33
  287. solara/website/pages/documentation/components/input/file_drop.py +0 -75
  288. solara/website/pages/documentation/components/input/input.py +0 -18
  289. solara/website/pages/documentation/components/input/select.py +0 -21
  290. solara/website/pages/documentation/components/input/slider.py +0 -28
  291. solara/website/pages/documentation/components/input/switch.py +0 -12
  292. solara/website/pages/documentation/components/input/togglebuttons.py +0 -20
  293. solara/website/pages/documentation/components/lab/__init__.py +0 -9
  294. solara/website/pages/documentation/components/lab/chat.py +0 -108
  295. solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -55
  296. solara/website/pages/documentation/components/lab/cookies_headers.py +0 -48
  297. solara/website/pages/documentation/components/lab/input_date.py +0 -19
  298. solara/website/pages/documentation/components/lab/menu.py +0 -21
  299. solara/website/pages/documentation/components/lab/tab.py +0 -24
  300. solara/website/pages/documentation/components/lab/tabs.py +0 -44
  301. solara/website/pages/documentation/components/lab/task.py +0 -12
  302. solara/website/pages/documentation/components/lab/theming.py +0 -72
  303. solara/website/pages/documentation/components/lab/use_task.py +0 -12
  304. solara/website/pages/documentation/components/layout/__init__.py +0 -9
  305. solara/website/pages/documentation/components/layout/app_bar.py +0 -15
  306. solara/website/pages/documentation/components/layout/app_bar_title.py +0 -15
  307. solara/website/pages/documentation/components/layout/app_layout.py +0 -23
  308. solara/website/pages/documentation/components/layout/card.py +0 -14
  309. solara/website/pages/documentation/components/layout/card_actions.py +0 -15
  310. solara/website/pages/documentation/components/layout/column.py +0 -29
  311. solara/website/pages/documentation/components/layout/columns.py +0 -26
  312. solara/website/pages/documentation/components/layout/columns_responsive.py +0 -67
  313. solara/website/pages/documentation/components/layout/griddraggable.py +0 -61
  314. solara/website/pages/documentation/components/layout/gridfixed.py +0 -21
  315. solara/website/pages/documentation/components/layout/hbox.py +0 -17
  316. solara/website/pages/documentation/components/layout/row.py +0 -29
  317. solara/website/pages/documentation/components/layout/sidebar.py +0 -23
  318. solara/website/pages/documentation/components/layout/vbox.py +0 -19
  319. solara/website/pages/documentation/components/output/__init__.py +0 -9
  320. solara/website/pages/documentation/components/output/file_download.py +0 -12
  321. solara/website/pages/documentation/components/output/html.py +0 -22
  322. solara/website/pages/documentation/components/output/image.py +0 -12
  323. solara/website/pages/documentation/components/output/markdown.py +0 -59
  324. solara/website/pages/documentation/components/output/markdown_editor.py +0 -53
  325. solara/website/pages/documentation/components/output/sql_code.py +0 -84
  326. solara/website/pages/documentation/components/output/tooltip.py +0 -12
  327. solara/website/pages/documentation/components/page/__init__.py +0 -9
  328. solara/website/pages/documentation/components/page/head.py +0 -19
  329. solara/website/pages/documentation/components/page/title.py +0 -28
  330. solara/website/pages/documentation/components/status/__init__.py +0 -9
  331. solara/website/pages/documentation/components/status/error.py +0 -40
  332. solara/website/pages/documentation/components/status/info.py +0 -40
  333. solara/website/pages/documentation/components/status/progress.py +0 -10
  334. solara/website/pages/documentation/components/status/spinner.py +0 -10
  335. solara/website/pages/documentation/components/status/success.py +0 -40
  336. solara/website/pages/documentation/components/status/warning.py +0 -47
  337. solara/website/pages/documentation/components/viz/__init__.py +0 -9
  338. solara/website/pages/documentation/components/viz/altair.py +0 -44
  339. solara/website/pages/documentation/components/viz/echarts.py +0 -78
  340. solara/website/pages/documentation/components/viz/matplotlib.py +0 -32
  341. solara/website/pages/documentation/components/viz/plotly.py +0 -63
  342. solara/website/pages/documentation/components/viz/plotly_express.py +0 -41
  343. solara/website/pages/documentation/examples/__init__.py +0 -52
  344. solara/website/pages/documentation/examples/ai/__init__.py +0 -10
  345. solara/website/pages/documentation/examples/ai/chatbot.py +0 -96
  346. solara/website/pages/documentation/examples/ai/tokenizer.py +0 -106
  347. solara/website/pages/documentation/examples/basics/__init__.py +0 -2
  348. solara/website/pages/documentation/examples/basics/sine.py +0 -28
  349. solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -9
  350. solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -3
  351. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -3
  352. solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -3
  353. solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -3
  354. solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -3
  355. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -3
  356. solara/website/pages/documentation/examples/general/__init__.py +0 -9
  357. solara/website/pages/documentation/examples/general/custom_storage.py +0 -69
  358. solara/website/pages/documentation/examples/general/deploy_model.py +0 -114
  359. solara/website/pages/documentation/examples/general/live_update.py +0 -38
  360. solara/website/pages/documentation/examples/general/login_oauth.py +0 -76
  361. solara/website/pages/documentation/examples/general/mycard.vue +0 -58
  362. solara/website/pages/documentation/examples/general/pokemon_search.py +0 -51
  363. solara/website/pages/documentation/examples/general/vue_component.py +0 -50
  364. solara/website/pages/documentation/examples/ipycanvas.py +0 -49
  365. solara/website/pages/documentation/examples/libraries/__init__.py +0 -9
  366. solara/website/pages/documentation/examples/libraries/altair.py +0 -63
  367. solara/website/pages/documentation/examples/libraries/bqplot.py +0 -39
  368. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -32
  369. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -65
  370. solara/website/pages/documentation/examples/utilities/__init__.py +0 -9
  371. solara/website/pages/documentation/examples/utilities/calculator.py +0 -157
  372. solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -64
  373. solara/website/pages/documentation/examples/utilities/todo.py +0 -195
  374. solara/website/pages/documentation/examples/visualization/__init__.py +0 -6
  375. solara/website/pages/documentation/examples/visualization/annotator.py +0 -68
  376. solara/website/pages/documentation/examples/visualization/linked_views.py +0 -84
  377. solara/website/pages/documentation/examples/visualization/plotly.py +0 -43
  378. solara/website/pages/documentation/faq/__init__.py +0 -11
  379. solara/website/pages/documentation/faq/content/99-faq.md +0 -73
  380. solara/website/pages/documentation/getting_started/__init__.py +0 -15
  381. solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -84
  382. solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -121
  383. solara/website/pages/documentation/getting_started/content/02-installing.md +0 -81
  384. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -9
  385. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -13
  386. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -84
  387. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -120
  388. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -141
  389. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -140
  390. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -64
  391. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  392. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -445
  393. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -1000
  394. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -7
  395. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -218
  396. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -83
  397. solara/website/pages/documentation/getting_started/content/06-reference/00-overview.md +0 -3
  398. solara/website/pages/documentation/getting_started/content/06-reference/40-static_files.md +0 -27
  399. solara/website/pages/documentation/getting_started/content/06-reference/41-asset-files.md +0 -32
  400. solara/website/pages/documentation/getting_started/content/06-reference/60-static-site-generation.md +0 -55
  401. solara/website/pages/documentation/getting_started/content/06-reference/70-search.md +0 -30
  402. solara/website/pages/documentation/getting_started/content/06-reference/80-reloading.md +0 -30
  403. solara/website/pages/documentation/getting_started/content/06-reference/90-notebook-support.md +0 -4
  404. solara/website/pages/documentation/getting_started/content/06-reference/95-caching.md +0 -143
  405. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -3
  406. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -269
  407. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -76
  408. solara/website/pages/documentation/getting_started/content/08-lab/00-what-is-lab.md +0 -3
  409. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -22
  410. solara/website/pages/documentation/getting_started/content/__init__.py +0 -0
  411. solara/website/pages/docutils.py +0 -38
  412. solara/website/pages/showcase/__init__.py +0 -105
  413. solara/website/pages/showcase/domino_code_assist.py +0 -60
  414. solara/website/pages/showcase/planeto_tessa.py +0 -19
  415. solara/website/pages/showcase/solara_dev.py +0 -54
  416. solara/website/pages/showcase/solarathon_2023_team_2.py +0 -22
  417. solara/website/pages/showcase/solarathon_2023_team_4.py +0 -22
  418. solara/website/pages/showcase/solarathon_2023_team_5.py +0 -23
  419. solara/website/pages/showcase/solarathon_2023_team_6.py +0 -34
  420. solara/website/pages/showcase/wanderlust.py +0 -27
  421. solara/website/public/beach.jpeg +0 -0
  422. solara/website/public/logo.svg +0 -6
  423. solara/website/public/social/discord.svg +0 -1
  424. solara/website/public/social/github.svg +0 -1
  425. solara/website/public/social/twitter.svg +0 -3
  426. solara/website/public/success.html +0 -25
  427. solara/website/templates/index.html.j2 +0 -117
  428. solara/website/utils.py +0 -51
  429. solara/widgets/__init__.py +0 -1
  430. solara/widgets/vue/gridlayout.vue +0 -110
  431. solara/widgets/vue/html.vue +0 -4
  432. solara/widgets/vue/navigator.vue +0 -104
  433. solara/widgets/vue/vegalite.vue +0 -115
  434. solara/widgets/widgets.py +0 -65
  435. solara-1.30.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -7
  436. solara-1.30.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -7
  437. solara-1.30.0.dist-info/RECORD +0 -438
  438. solara-1.30.0.dist-info/entry_points.txt +0 -5
  439. /solara-1.30.0.dist-info/licenses/LICENSE → /LICENSE +0 -0
@@ -1,182 +0,0 @@
1
- import os
2
- from os.path import isfile, join
3
- from pathlib import Path
4
- from typing import Callable, List, Optional, Union, cast
5
-
6
- import humanize
7
- import ipyvuetify as vy
8
- import traitlets
9
-
10
- import solara
11
- from solara.components import Div
12
-
13
-
14
- def list_dir(path, filter: Callable[[Path], bool] = lambda x: True, directory_first: bool = False) -> List[dict]:
15
- def mk_item(n):
16
- full_path = join(path, n)
17
- is_file = isfile(full_path)
18
- return {"name": n, "is_file": is_file, "size": humanize.naturalsize(os.stat(full_path).st_size) if is_file else None}
19
-
20
- files = [mk_item(k) for k in os.listdir(path) if not k.startswith(".") if filter(Path(path) / k)]
21
- sorted_files = sorted(files, key=lambda item: (item["is_file"] == directory_first, item["name"].lower()))
22
-
23
- return sorted_files
24
-
25
-
26
- class FileListWidget(vy.VuetifyTemplate):
27
- template_file = (__file__, "file_list_widget.vue")
28
-
29
- files = traitlets.List().tag(sync=True)
30
- clicked = traitlets.Dict(allow_none=True, default_value=None).tag(sync=True)
31
- double_clicked = traitlets.Dict(allow_none=True, default_value=None).tag(sync=True)
32
- scroll_pos = traitlets.Int(allow_none=True).tag(sync=True)
33
-
34
- def test_click(self, path: Union[Path, str], double_click=False):
35
- """Simulate a click or double click at the Python side"""
36
- matches = [k for k in self.files if k["name"] == str(path)]
37
- if len(matches) == 0:
38
- names = [k["name"] for k in self.files]
39
- raise NameError(f"Could not find {path}, possible filenames: {names}")
40
- item = matches[0]
41
- if double_click:
42
- self.double_clicked = item
43
- else:
44
- self.clicked = item
45
-
46
- def __contains__(self, name):
47
- """Test if filename/directory name is in the current directory."""
48
- return name in [k["name"] for k in self.files]
49
-
50
-
51
- @solara.component
52
- def FileBrowser(
53
- directory: Union[None, str, Path, solara.Reactive[Path]] = None,
54
- on_directory_change: Callable[[Path], None] = None,
55
- on_path_select: Callable[[Optional[Path]], None] = None,
56
- on_file_open: Callable[[Path], None] = None,
57
- filter: Callable[[Path], bool] = lambda x: True,
58
- directory_first: bool = False,
59
- on_file_name: Callable[[str], None] = None,
60
- start_directory=None,
61
- can_select=False,
62
- ):
63
- """File/directory browser at the server side.
64
-
65
- There are two modes possible
66
-
67
- * `can_select=False`
68
- * `on_file_open`: Triggered when **single** clicking a file or directory.
69
- * `on_path_select`: Never triggered
70
- * `on_directory_change`: Triggered when clicking a directory
71
- * `can_select=True`
72
- * `on_file_open`: Triggered when **double** clicking a file or directory.
73
- * `on_path_select`: Triggered when clicking a file or directory
74
- * `on_directory_change`: Triggered when double clicking a directory
75
-
76
- ## Arguments
77
-
78
- * `directory`: The directory to start in. If `None` the current working directory is used.
79
- * `on_directory_change`: Depends on mode, see above.
80
- * `on_path_select`: Depends on mode, see above.
81
- * `on_file_open`: Depends on mode, see above.
82
- * `filter`: A function that takes a `Path` and returns `True` if the file/directory should be shown.
83
- * `directory_first`: If `True` directories are shown before files. Default: `False`.
84
- * `on_file_name`: (deprecated) Use on_file_open instead.
85
- * `start_directory`: (deprecated) Use directory instead.
86
- """
87
- if start_directory is not None:
88
- directory = start_directory # pragma: no cover
89
- if directory is None:
90
- directory = os.getcwd() # pragma: no cover
91
- if isinstance(directory, str):
92
- directory = Path(directory)
93
- current_dir = solara.use_reactive(directory)
94
- selected, set_selected = solara.use_state(None)
95
- double_clicked, set_double_clicked = solara.use_state(None)
96
- warning, set_warning = solara.use_state(cast(Optional[str], None))
97
- scroll_pos_stack, set_scroll_pos_stack = solara.use_state(cast(List[int], []))
98
- scroll_pos, set_scroll_pos = solara.use_state(0)
99
- selected, set_selected = solara.use_state(None)
100
-
101
- def change_dir(new_dir: str):
102
- if os.access(new_dir, os.R_OK):
103
- current_dir.value = Path(new_dir)
104
- if on_directory_change:
105
- on_directory_change(Path(new_dir))
106
- set_warning(None)
107
- return True
108
- else:
109
- set_warning(f"[no read access to {new_dir}]")
110
-
111
- def on_item(item, double_click):
112
- if item is None:
113
- if can_select and on_path_select:
114
- on_path_select(None)
115
- return
116
- if item["name"] == "..":
117
- current_dir_str = str(current_dir.value)
118
- new_dir = current_dir_str[: current_dir_str.rfind(os.path.sep)]
119
- action_change_directory = (can_select and double_click) or (not can_select and not double_click)
120
- if action_change_directory and change_dir(new_dir):
121
- if scroll_pos_stack:
122
- last_pos = scroll_pos_stack[-1]
123
- set_scroll_pos_stack(scroll_pos_stack[:-1])
124
- set_scroll_pos(last_pos)
125
- set_selected(None)
126
- set_double_clicked(None)
127
- if on_path_select and can_select:
128
- on_path_select(None)
129
- if can_select and not double_click:
130
- if on_path_select:
131
- on_path_select(Path(new_dir))
132
- return
133
-
134
- path = os.path.join(current_dir.value, item["name"])
135
- is_file = item["is_file"]
136
- if (can_select and double_click) or (not can_select and not double_click):
137
- if is_file:
138
- if on_file_open:
139
- on_file_open(Path(path))
140
- if on_file_name is not None:
141
- on_file_name(path)
142
- else:
143
- if change_dir(path):
144
- set_scroll_pos_stack(scroll_pos_stack + [scroll_pos])
145
- set_scroll_pos(0)
146
- set_selected(None)
147
- set_double_clicked(None)
148
- if on_path_select and can_select:
149
- on_path_select(None)
150
- elif can_select and not double_click:
151
- if on_path_select:
152
- on_path_select(Path(path))
153
- else: # not can_select and double_click is ignored
154
- raise RuntimeError("Combination should not happen") # pragma: no cover
155
-
156
- def on_click(item):
157
- set_selected(item)
158
- on_item(item, False)
159
-
160
- def on_double_click(item):
161
- set_double_clicked(item)
162
- if can_select:
163
- on_item(item, True)
164
- # otherwise we can ignore it, single click will handle it
165
-
166
- files = [{"name": "..", "is_file": False}] + list_dir(current_dir.value, filter=filter, directory_first=directory_first)
167
- with Div(class_="solara-file-browser") as main:
168
- Div(children=[str(current_dir.value)])
169
- FileListWidget.element(
170
- files=files,
171
- selected=selected,
172
- clicked=selected,
173
- on_clicked=on_click,
174
- double_clicked=double_clicked,
175
- on_double_clicked=on_double_click,
176
- scroll_pos=scroll_pos,
177
- on_scroll_pos=set_scroll_pos,
178
- ).key("FileList")
179
- if warning:
180
- Div(style_="font-weight: bold; color: red", children=[warning])
181
-
182
- return main
@@ -1,199 +0,0 @@
1
- from pathlib import Path
2
- from typing import BinaryIO, Callable, Optional, Union, cast
3
-
4
- import ipyvuetify as vy
5
- import ipywidgets as widgets
6
- import traitlets
7
-
8
- import solara
9
-
10
-
11
- class FileDownloadWidget(vy.VuetifyTemplate):
12
- template_file = (__file__, "download.vue")
13
- children = traitlets.List().tag(sync=True, **widgets.widget_serialization)
14
- filename = traitlets.Unicode().tag(sync=True)
15
- bytes = traitlets.Bytes(None, allow_none=True).tag(sync=True)
16
- mime_type = traitlets.Unicode("application/octet-stream").tag(sync=True)
17
- request_download = traitlets.Bool(False).tag(sync=True)
18
-
19
-
20
- @solara.component
21
- def FileDownload(
22
- data: Union[str, bytes, BinaryIO, Callable[[], Union[str, bytes, BinaryIO]]],
23
- filename: Optional[str] = None,
24
- label: Optional[str] = None,
25
- icon_name: Optional[str] = "mdi-cloud-download-outline",
26
- close_file: bool = True,
27
- mime_type: str = "application/octet-stream",
28
- string_encoding: str = "utf-8",
29
- children=[],
30
- ):
31
- """Download a file or data.
32
-
33
- ## Simple usage
34
-
35
- By default, if no children are provided, a button is created with the label "Download: {filename}".
36
-
37
- ```solara
38
- import solara
39
-
40
- data = "This is the content of the file"
41
-
42
- @solara.component
43
- def Page():
44
- solara.FileDownload(data, filename="solara-download.txt", label="Download file")
45
- ```
46
-
47
- ## Advanced usage
48
-
49
- If children are provided, they are displayed instead of the button. The children can be any solara component,
50
- including a button, markdown text, or an image.
51
-
52
- ```solara
53
- import solara
54
-
55
- data = "This is the content of the file"
56
-
57
- @solara.component
58
- def Page():
59
- with solara.FileDownload(data, "solara-download-2.txt"):
60
- solara.Markdown("Any text, or even an image")
61
- solara.Image("https://solara.dev/static/public/beach.jpeg", width="200px")
62
- ```
63
-
64
- ## Custom button
65
-
66
- If children are provided, they are displayed instead of the button. The children can be any solara component,
67
- including a button, markdown text, or an image.
68
-
69
- ```solara
70
- import solara
71
-
72
- data = "This is the content of the file"
73
-
74
- @solara.component
75
- def Page():
76
- with solara.FileDownload(data, "solara-download-2.txt"):
77
- solara.Button("Custom download button", icon_name="mdi-cloud-download-outline", color="primary")
78
- ```
79
-
80
- ## Usage with file
81
-
82
- A file object can be used as data. The file will be closed after downloading by default.
83
-
84
- ```solara
85
- import solara
86
- import pandas as pd
87
-
88
- df = pd.DataFrame({"id": [1, 2, 3], "name": ["John", "Mary", "Bob"]})
89
-
90
- @solara.component
91
- def Page():
92
- file_object = df.to_csv(index=False)
93
- solara.FileDownload(file_object, "users.csv", mime_type="application/vnd.ms-excel")
94
- ```
95
-
96
- If a file like object is used, we try to base the filename on the file object.
97
- ```solara
98
- import solara
99
- import solara.website.pages
100
- import os
101
-
102
- filename = os.path.dirname(solara.website.__file__) + "/public/beach.jpeg"
103
-
104
- @solara.component
105
- def Page():
106
- # only open the file once by using use_memo
107
- file_object = solara.use_memo(lambda: open(filename, "rb"), [])
108
- # no filename is provided, but we can extract it from the file object
109
- solara.FileDownload(file_object, mime_type="image/jpeg", close_file=False)
110
- ```
111
-
112
- ## Lazy reading
113
-
114
- Not only is the data lazily uploaded to the browser, but also the data is only read when the download is requested.
115
- This happens for files by default, but can also be used by passing in a callback function.
116
-
117
- ```solara
118
- import solara
119
- import time
120
-
121
- @solara.component
122
- def Page():
123
- def get_data():
124
- # I run in a thread, so I can do some heavy processing
125
- time.sleep(3)
126
- # I only get called when the download is requested
127
- return "This is the content of the file"
128
- solara.FileDownload(get_data, "solara-lazy-download.txt")
129
- ```
130
-
131
- ## Arguments
132
-
133
- * `data`: The data to download. Can be a string, bytes, or a file like object, or a function that returns one of these.
134
- * `filename`: The name of the file the user will see as default when downloading (default name is "solara-download.dat").
135
- If a file object is provided, the filename will be extracted from the file object if possible.
136
- * `label`: The label of the button. If not provided, the label will be "Download: {filename}".
137
- - `icon_name`: The name of the icon to display on the button ([Overview of available icons](https://pictogrammers.github.io/@mdi/font/4.9.95/)).
138
- * `close_file`: If a file object is provided, close the file after downloading (default True).
139
- * `mime_type`: The mime type of the file. If not provided, the mime type will be "application/octet-stream",
140
- For instance setting it to "application/vnd.ms-excel" will allow the user OS to directly open the
141
- file into Excel.
142
- * `string_encoding`: The encoding to use when converting a string to bytes (default "utf-8").
143
-
144
- ## Note on file size
145
-
146
- Note that the data will be kept in memory when downloading.
147
- If the file is large (>10 MB), and when using [Solara server](/documentation/advanced/understanding/solara-server), we recommend using the
148
- [static files directory](/documentation/getting_started/reference/static-files) instead.
149
-
150
- """
151
- request_download, set_request_download = solara.use_state(False)
152
-
153
- # if the data changes, we 'reset'
154
- def reset():
155
- nonlocal request_download
156
- request_download = False
157
- set_request_download(False)
158
-
159
- solara.use_memo(reset, [data])
160
-
161
- # we only upload to the frontend if clicked
162
- def get_data() -> Optional[bytes]:
163
- if request_download:
164
- if callable(data):
165
- data_non_lazy = data()
166
- else:
167
- data_non_lazy = data
168
- if hasattr(data_non_lazy, "read"):
169
- if hasattr(data_non_lazy, "seek"):
170
- if hasattr(data_non_lazy, "tell") and data_non_lazy.tell() != 0:
171
- data_non_lazy.seek(0)
172
- content = data_non_lazy.read() # type: ignore
173
- if close_file:
174
- data_non_lazy.close() # type: ignore
175
- return content
176
- elif isinstance(data_non_lazy, str):
177
- return data_non_lazy.encode(string_encoding)
178
- else:
179
- return cast(bytes, data_non_lazy)
180
- return None
181
-
182
- bytes_result: solara.Result[Optional[bytes]] = solara.use_thread(get_data, dependencies=[request_download, data])
183
- if filename is None and hasattr(data, "name"):
184
- try:
185
- filename = Path(data.name).name # type: ignore
186
- except Exception:
187
- pass
188
- filename = filename or "solara-download.dat"
189
- label = label or ("Download: " + filename)
190
- FileDownloadWidget.element(
191
- filename=filename,
192
- bytes=bytes_result.value if bytes_result.state == solara.ResultState.FINISHED else None,
193
- request_download=request_download,
194
- on_request_download=set_request_download,
195
- children=children or [solara.Button(label, loading=bytes_result.state == solara.ResultState.RUNNING, icon_name=icon_name)],
196
- mime_type=mime_type,
197
- )
198
- if bytes_result.state == solara.ResultState.ERROR and bytes_result.error:
199
- raise bytes_result.error
@@ -1,139 +0,0 @@
1
- import threading
2
- import typing
3
- from typing import Callable, List, Optional, Union, cast
4
-
5
- import traitlets
6
- from ipyvue import Template
7
- from ipyvuetify.extra import FileInput
8
- from ipywidgets import widget_serialization
9
- from typing_extensions import TypedDict
10
-
11
- import solara
12
- import solara.hooks as hooks
13
-
14
-
15
- class FileInfo(TypedDict):
16
- name: str
17
- size: int
18
- file_obj: typing.BinaryIO
19
- data: Optional[bytes]
20
-
21
-
22
- class FileDropZone(FileInput):
23
- # override to narrow traitlet of FileInput
24
- template = traitlets.Instance(Template).tag(sync=True, **widget_serialization)
25
- template_file = (__file__, "file_drop.vue")
26
- items = traitlets.List(default_value=[]).tag(sync=True)
27
- label = traitlets.Unicode().tag(sync=True)
28
- multiple = traitlets.Bool(True).tag(sync=True)
29
-
30
-
31
- @solara.component
32
- def _FileDrop(
33
- label="Drop file(s) here",
34
- on_total_progress: Optional[Callable[[float], None]] = None,
35
- on_file: Optional[Callable[[Union[FileInfo, List[FileInfo]]], None]] = None,
36
- lazy: bool = True,
37
- multiple: bool = False,
38
- ):
39
- """Generic implementation used by FileDrop and FileDropMultiple.
40
-
41
- If multiple=True, multiple files can be uploaded.
42
- """
43
-
44
- file_info, set_file_info = solara.use_state(None)
45
- wired_files, set_wired_files = solara.use_state(cast(Optional[typing.List[FileInfo]], None))
46
-
47
- file_drop = FileDropZone.element(label=label, on_total_progress=on_total_progress, on_file_info=set_file_info, multiple=multiple) # type: ignore
48
-
49
- def wire_files():
50
- if not file_info:
51
- return
52
-
53
- real = cast(FileDropZone, solara.get_widget(file_drop))
54
-
55
- # workaround for @observe being cleared
56
- real.version += 1
57
- real.reset_stats()
58
-
59
- set_wired_files(cast(typing.List[FileInfo], real.get_files()))
60
-
61
- solara.use_side_effect(wire_files, [file_info])
62
-
63
- def handle_file(cancel: threading.Event):
64
- if not wired_files:
65
- return
66
- if on_file:
67
- for i in range(len(wired_files)):
68
- if not lazy:
69
- wired_files[i]["data"] = wired_files[i]["file_obj"].read()
70
- else:
71
- wired_files[i]["data"] = None
72
- if multiple:
73
- on_file(wired_files)
74
- else:
75
- on_file(wired_files[0])
76
-
77
- result: solara.Result = hooks.use_thread(handle_file, [wired_files])
78
- if result.error:
79
- raise result.error
80
-
81
- return file_drop
82
-
83
-
84
- @solara.component
85
- def FileDrop(
86
- label="Drop file here",
87
- on_total_progress: Optional[Callable[[float], None]] = None,
88
- on_file: Optional[Callable[[FileInfo], None]] = None,
89
- lazy: bool = True,
90
- ):
91
- """Region a user can drop a file into for file uploading.
92
-
93
- If lazy=True, no file content will be loaded into memory,
94
- nor will any data be transferred by default.
95
- If lazy=False, file content will be loaded into memory and passed to the `on_file` callback via the `FileInfo.data` attribute.
96
-
97
-
98
- A file object is of the following argument type:
99
- ```python
100
- class FileInfo(typing.TypedDict):
101
- name: str # file name
102
- size: int # file size in bytes
103
- file_obj: typing.BinaryIO
104
- data: Optional[bytes]: bytes # only present if lazy=False
105
- ```
106
-
107
-
108
- ## Arguments
109
- * `on_total_progress`: Will be called with the progress in % of the file upload.
110
- * `on_file`: Will be called with a `FileInfo` object, which contains the file `.name`, `.length` and a `.file_obj` object.
111
- * `lazy`: Whether to load the file contents into memory or not. If `False`,
112
- the file contents will be loaded into memory via the `.data` attribute of file object(s).
113
-
114
- """
115
-
116
- return _FileDrop(label=label, on_total_progress=on_total_progress, on_file=on_file, lazy=lazy, multiple=False)
117
-
118
-
119
- @solara.component
120
- def FileDropMultiple(
121
- label="Drop files here",
122
- on_total_progress: Optional[Callable[[float], None]] = None,
123
- on_file: Optional[Callable[[List[FileInfo]], None]] = None,
124
- lazy: bool = True,
125
- ):
126
- """Region a user can drop multiple files into for file uploading.
127
-
128
- Almost identical to `FileDrop` except that multiple files can be dropped and `on_file` is called
129
- with a list of `FileInfo` objects.
130
-
131
- ## Arguments
132
- * `on_total_progress`: Will be called with the progress in % of the file(s) upload.
133
- * `on_file`: Will be called with a `List[FileInfo]`.
134
- Each `FileInfo` contains the file `.name`, `.length`, `.file_obj` object, and `.data` attributes.
135
- * `lazy`: Whether to load the file contents into memory or not.
136
-
137
- """
138
-
139
- return _FileDrop(label=label, on_total_progress=on_total_progress, on_file=on_file, lazy=lazy, multiple=True)
@@ -1,83 +0,0 @@
1
- <template>
2
- <div ref="dropzone" class="solara-file-drop" effectAllowed="move">
3
- <template v-if="file_info && file_info.length > 0">
4
- <template v-if="multiple">
5
- <div v-for="file in file_info">
6
- {{ file.name }}
7
- </div>
8
- </template>
9
- <template v-else>
10
- {{ file_info[0].name }}
11
- </template>
12
- </template>
13
- <template v-else>
14
- {{ label }}
15
- </template>
16
- </div>
17
- </template>
18
-
19
- <script>
20
- module.exports = {
21
- mounted() {
22
- this.chunk_size = 2 * 1024 * 1024;
23
- this.$refs.dropzone.addEventListener('dragover', event => {
24
- event.preventDefault();
25
- });
26
-
27
- this.$refs.dropzone.addEventListener('drop', async event => {
28
- event.preventDefault();
29
- const items = await Promise.all([...event.dataTransfer.items]);
30
- const files = items.map(i => i.webkitGetAsEntry())
31
- const fileHolders = files.filter(f => f.isFile)
32
- const nativeFilesPromises = fileHolders.map(fileHolder => new Promise((rs, rj) => fileHolder.file(rs, rj)))
33
- const nativeFiles = await Promise.all(nativeFilesPromises)
34
-
35
- this.native_file_info = nativeFiles
36
- this.file_info = this.native_file_info.map(
37
- ({name, size}) => ({
38
- name,
39
- isFile: true,
40
- size,
41
- }));
42
- });
43
- },
44
- methods: {
45
- jupyter_clear() {
46
- this.native_file_info = [];
47
- this.file_info = [];
48
- },
49
- jupyter_read(chunk) {
50
- const {id, file_index, offset, length} = chunk;
51
- let to_do = length;
52
- let sub_offset = offset;
53
-
54
- (async () => {
55
- while (to_do > 0) {
56
- console.log(this.chunk_size, to_do);
57
- const sub_length = Math.min(to_do, this.chunk_size);
58
-
59
- const file = this.native_file_info[file_index];
60
- const blob = file.slice(sub_offset, sub_offset + sub_length);
61
- const buff = await blob.arrayBuffer();
62
-
63
- const msg = {id, file_index, offset: sub_offset, length: sub_length}
64
- this.upload(msg, [buff]);
65
-
66
- to_do -= sub_length
67
- sub_offset += sub_length
68
- }
69
- })();
70
- }
71
- }
72
- }
73
- </script>
74
-
75
- <style id="solara-file-drop">
76
- .solara-file-drop {
77
- height: 100px;
78
- border: 1px dashed gray;
79
- margin: 8px 0;
80
- padding: 8px;
81
- overflow: auto;
82
- }
83
- </style>
@@ -1,78 +0,0 @@
1
- <template>
2
- <v-sheet class="solara-file-list" ref="scrollpane"
3
- @click="clicked = null"
4
- >
5
- <v-list
6
- @click="clicked = null"
7
- >
8
- <v-list-item
9
- v-for="{name, is_file, size} in files"
10
- :key="name + '|' + is_file"
11
- @click.stop="clicked = { name, is_file }"
12
- @dblclick="double_clicked = { name, is_file }"
13
- :class="(clicked && clicked.name == name) ? 'solara-file-list-selected': ''"
14
- >
15
- <v-list-item-icon>
16
- <v-icon>{{ name === '..' ? 'mdi-keyboard-backspace' : is_file ? 'mdi-file-document' : 'mdi-folder' }}</v-icon>
17
- </v-list-item-icon>
18
-
19
- <v-list-item-content>
20
- <v-list-item-title :class="'solara-file-list-' + (is_file ? 'file' : 'dir')">
21
- {{ name }}<span v-if="size"> - {{ size }}</span>
22
- </v-list-item-title>
23
- </v-list-item-content>
24
- </v-list-item>
25
- </v-list>
26
- </v-sheet>
27
- </template>
28
-
29
- <script>
30
- module.exports = {
31
- mounted() {
32
- const element = this.$refs.scrollpane.$el
33
- element.scrollTop = this.scroll_pos
34
-
35
- this._scrollListener = _.debounce((e) => {
36
- this.scroll_pos = Math.round(element.scrollTop)
37
- }, 50)
38
- element.addEventListener('scroll', this._scrollListener)
39
- },
40
- watch: {
41
- scroll_pos(v) {
42
- this.$nextTick(() => this.$refs.scrollpane.$el.scrollTop = v);
43
- }
44
- }
45
- }
46
- </script>
47
-
48
- <style id="solara-file-list">
49
- .solara-file-list {
50
- height: 400px;
51
- overflow: auto;
52
- }
53
-
54
- .solara-file-list-dir {
55
- font-weight: bold;
56
- }
57
-
58
- .solara-file-list-selected {
59
- background-color: #3333;
60
-
61
- }
62
-
63
- .solara-file-list .v-list-item__icon,
64
- .solara-file-list .v-list-item__list {
65
- margin-top: 0;
66
- margin-bottom: 0;
67
- }
68
-
69
- .v-application--is-ltr .solara-file-list .v-list-item__icon {
70
- margin-right: 8px;
71
- }
72
-
73
- .solara-file-list .v-list-item {
74
- height: 28px;
75
- min-height: 0;
76
- padding-left: 0;
77
- }
78
- </style>