solara 1.6.0__tar.gz → 1.7.0__tar.gz
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.
- {solara-1.6.0 → solara-1.7.0}/.bumpversion.cfg +1 -1
- {solara-1.6.0 → solara-1.7.0}/.pre-commit-config.yaml +2 -2
- {solara-1.6.0 → solara-1.7.0}/PKG-INFO +2 -2
- {solara-1.6.0 → solara-1.7.0}/packages/assets/solara_assets/__init__.py +1 -1
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/pyproject.toml +1 -1
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/__init__.py +1 -1
- {solara-1.6.0 → solara-1.7.0}/pyproject.toml +1 -1
- {solara-1.6.0 → solara-1.7.0}/release.md +3 -3
- {solara-1.6.0 → solara-1.7.0}/solara/__init__.py +2 -1
- {solara-1.6.0 → solara-1.7.0}/solara/autorouting.py +2 -1
- {solara-1.6.0 → solara-1.7.0}/solara/checks.py +1 -1
- {solara-1.6.0 → solara-1.7.0}/solara/components/applayout.py +1 -1
- {solara-1.6.0 → solara-1.7.0}/solara/components/cross_filter.py +2 -2
- solara-1.7.0/solara/components/datatable.py +220 -0
- solara-1.7.0/solara/components/datatable.vue +175 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/assets/style.css +5 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/static/solara_bootstrap.py +1 -1
- {solara-1.6.0 → solara-1.7.0}/solara/website/assets/custom.css +0 -1
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/__init__.py +5 -1
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/dataframe.py +13 -21
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/warning.py +7 -0
- solara-1.7.0/solara/widgets/widgets.py +57 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/api_test.py +18 -0
- solara-1.6.0/solara/components/datatable.py +0 -88
- solara-1.6.0/solara/widgets/vue/datatable.vue +0 -173
- solara-1.6.0/solara/widgets/widgets.py +0 -114
- {solara-1.6.0 → solara-1.7.0}/.flake8 +0 -0
- {solara-1.6.0 → solara-1.7.0}/.github/workflows/codequality.yaml +0 -0
- {solara-1.6.0 → solara-1.7.0}/.github/workflows/installation.yml +0 -0
- {solara-1.6.0 → solara-1.7.0}/.github/workflows/integration.yml +0 -0
- {solara-1.6.0 → solara-1.7.0}/.github/workflows/javascript.yaml +0 -0
- {solara-1.6.0 → solara-1.7.0}/.github/workflows/release.yaml +0 -0
- {solara-1.6.0 → solara-1.7.0}/.github/workflows/release_solara_vuetify_app.yaml +0 -0
- {solara-1.6.0 → solara-1.7.0}/.github/workflows/unittest.yml +0 -0
- {solara-1.6.0 → solara-1.7.0}/.gitignore +0 -0
- {solara-1.6.0 → solara-1.7.0}/LICENSE +0 -0
- {solara-1.6.0 → solara-1.7.0}/Procfile +0 -0
- {solara-1.6.0 → solara-1.7.0}/README.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/mypy.ini +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/assets/.gitignore +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/assets/LICENSE +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/assets/RELEASE.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/assets/download_cdn_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/assets/hatch_build.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/assets/pyproject.toml +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/LICENSE +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/RELEASE.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/cache/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/cache/base.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/cache/disk.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/cache/memory_size.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/cache/multi_level.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/cache/redis.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/license.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/search/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/search/index.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/search/search.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/search/search.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-enterprise/solara_enterprise/ssg.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-milkdown/package-lock.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-milkdown/package.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-milkdown/src/index.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-milkdown/webpack.config.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-vuetify-app/.bumpversion.cfg +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-vuetify-app/README.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-vuetify-app/package-lock.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-vuetify-app/package.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-vuetify-app/release.sh +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-vuetify-app/src/solara-vuetify-app.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-vuetify-app/src/solara.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-vuetify-app/webpack.config.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/LICENSE.voila.txt +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/package-lock.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/package.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/src/index.ts +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/src/kernel.ts +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/src/loader.ts +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/src/manager.ts +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/src/mathjax.ts +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/src/rendermime.ts +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/src/typings.d.ts +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/style/index.css +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/tsconfig.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/packages/solara-widget-manager/webpack.config.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
- {solara-1.6.0 → solara-1.7.0}/release.sh +0 -0
- {solara-1.6.0 → solara-1.7.0}/requirements.txt +0 -0
- {solara-1.6.0 → solara-1.7.0}/runtime.txt +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/__main__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/alias.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/cache.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/checks.html +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/alert.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/button.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/checkbox.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/code_highlight_css.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/code_highlight_css.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/columns.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/dataframe.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/details.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/download.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/echarts.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/echarts.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/figure_altair.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/file_browser.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/file_download.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/file_drop.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/file_drop.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/file_list_widget.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/head.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/head_tag.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/head_tag.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/image.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/input.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/link.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/markdown.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/markdown_editor.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/markdown_editor.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/matplotlib.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/meta.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/misc.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/pivot_table.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/pivot_table.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/select.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/select.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/slider.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/slider_date.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/sql_code.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/sql_code.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/style.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/tab_navigation.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/title.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/title.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/components/togglebuttons.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/datatypes.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/express.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/hooks/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/hooks/dataframe.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/hooks/misc.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/kitchensink.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/lab/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/lab/components/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/lab/components/cross_filter.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/lab/hooks/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/lab/hooks/dataframe.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/lab/toestand.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/lab/utils/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/lab/utils/dataframe.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/layout.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/py.typed +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/routing.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/scope/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/scope/types.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/app.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/assets/custom.css +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/assets/custom.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/assets/favicon.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/assets/favicon.svg +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/assets/theme.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/cdn_helper.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/fastapi.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/flask.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/jupyter/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/jupyter/cdn_handler.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/jupyter/server_extension.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/kernel.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/patch.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/pyodide.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/reload.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/server.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/settings.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/starlette.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/static/ansi.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/static/highlight-dark.css +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/static/highlight.css +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/static/main-vuetify.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/static/main.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/static/sun.svg +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/static/webworker.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/telemetry.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/templates/index.html.j2 +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/templates/loader-plain.css +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/templates/loader-plain.html +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/templates/loader-solara.css +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/templates/loader-solara.html +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/templates/plain.html +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/templates/solara.html.j2 +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/threaded.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/utils.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/server/websocket.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/settings.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/button.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/markdown.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/.flake8 +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/.pre-commit-config.yaml +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/LICENSE +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/Procfile +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/mypy.ini +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/pyproject.toml +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/components/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/components/article.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/components/data.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/components/header.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/components/layout.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/data.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/util.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/assets/images/logo-small.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/assets/images/logo.svg +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/assets/theme.js +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/components/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/components/header.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/components/hero.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/README.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/altair.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/app_bar.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/app_layout.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/button.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/checkbox.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/column.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/columns.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/columns_responsive.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/common.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/cross_filter_dataframe.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/cross_filter_report.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/cross_filter_select.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/cross_filter_slider.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/default_layout.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/display.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/echarts.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/error.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/file_browser.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/file_download.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/file_drop.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/generate_routes.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/generate_routes_directory.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/griddraggable.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/gridfixed.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/hbox.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/head.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/html.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/image.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/info.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/input.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/link.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/markdown.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/markdown_editor.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/matplotlib.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/memoize.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/meta.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/pivot_table.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/plotly.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/plotly_express.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/resolve_path.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/route.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/row.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/select.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/sidebar.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/slider.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/sql_code.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/style.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/success.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/title.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/togglebuttons.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/use_cross_filter.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/use_exception.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/use_previous.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/use_route.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/use_state.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/use_state_or_update.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/use_thread.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/use_thread.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/vbox.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/api/widget.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/apps/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/apps/layout-demo.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/apps/multipage/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/apps/multipage/page1.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/apps/multipage/page2.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/apps/scatter.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/doc_use_download.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/00-introduction.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/02-installing.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/03-quickstart.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/04-tutorial/00-overview.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/04-tutorial/10_data_science.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/04-tutorial/20-web-app.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/04-tutorial/30-ipywidgets.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/04-tutorial/40-streamlit.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/04-tutorial/50-dash.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/04-tutorial/_data_science.ipynb +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/10-howto/00-overview.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/10-howto/20-multipage.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/10-howto/30-layout.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/15-reference/00-overview.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/15-reference/40-static_files.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/15-reference/41-asset-files.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/15-reference/60-static-site-generation.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/15-reference/70-search.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/15-reference/80-reloading.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/15-reference/90-notebook-support.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/15-reference/95-caching.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/00-introduction.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/05-ipywidgets.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/06-ipyvuetify.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/10-reacton.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/12-reacton-basics.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/15-anatomy.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/17-rules-of-hooks.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/18-containers.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/20-solara.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/40-routing.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/50-solara-server.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/20-understanding/60-voila.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/30-deploying/00-overview.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/30-deploying/10-self-hosted.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/30-deploying/20-cloud-hosted.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/90-development/10-setup.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/90-troubleshoot.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/99-faq.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/lab/00-what-is-lab.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docs/content/lab/toestand.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/docutils.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/basics/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/basics/sine.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/fullscreen.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/general/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/general/pokemon_search.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/ipycanvas.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/utilities/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/utilities/calculator.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/utilities/countdown_timer.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/visualization/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/visualization/bqplot.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/visualization/linked_views.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/pages/examples/visualization/plotly.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/beach.jpeg +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/docs/anatomy.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/docs/reacton-basics.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/docs/solara-stack.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/hero.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/landing/complexity.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/landing/python-love-react.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/landing/what.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/public/quickstart-notebook.png +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/templates/index.html.j2 +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/website/utils.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/widgets/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/widgets/vue/gridlayout.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/widgets/vue/html.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/widgets/vue/navigator.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/solara/widgets/vue/vegalite.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/conftest.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/app_widget.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/cmdline_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/conftest.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/create_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/error_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/file_download_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/markdown_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/reload_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/router_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/server_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/ssg_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/test.vue +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/integration/testapp.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/app_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/applayout_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/autorouting_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/cache_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/cdn_helper_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/common.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/conftest.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/cross_filter_component_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/cross_filter_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/dataframe_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/datatable_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/express_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/file_browser_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/file_download_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/hooks_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/lab/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/lab/toestand_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/matplotlib_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/patch_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/pivottable_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/router_test.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/food/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/food/food.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/food/index.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/notebookapp_component.ipynb +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
- {solara-1.6.0 → solara-1.7.0}/tests/unit/telemetry_tests.py +0 -0
- {solara-1.6.0 → solara-1.7.0}/tsconfigbase.json +0 -0
|
@@ -10,13 +10,13 @@ repos:
|
|
|
10
10
|
rev: 22.12.0
|
|
11
11
|
hooks:
|
|
12
12
|
- id: black
|
|
13
|
-
- repo: https://
|
|
13
|
+
- repo: https://github.com/PyCQA/flake8
|
|
14
14
|
rev: 4.0.1
|
|
15
15
|
hooks:
|
|
16
16
|
- id: flake8
|
|
17
17
|
additional_dependencies: [flake8-print]
|
|
18
18
|
- repo: https://github.com/PyCQA/isort
|
|
19
|
-
rev: 5.
|
|
19
|
+
rev: 5.11.5
|
|
20
20
|
hooks:
|
|
21
21
|
- id: isort
|
|
22
22
|
files: \.py$
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: solara
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.0
|
|
4
4
|
Summary: Build webapps using IPywidgets
|
|
5
5
|
Author-email: "Maarten A. Breddels" <maartenbreddels@gmail.com>
|
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -33,7 +33,7 @@ Requires-Dist: jupyter_client>=7.0.0
|
|
|
33
33
|
Requires-Dist: watchdog
|
|
34
34
|
Requires-Dist: requests
|
|
35
35
|
Requires-Dist: pygments==2.10; python_version < '3.7'
|
|
36
|
-
Requires-Dist: solara-assets==1.
|
|
36
|
+
Requires-Dist: solara-assets==1.7.0 ; extra == "assets"
|
|
37
37
|
Requires-Dist: flake8 ; extra == "dev"
|
|
38
38
|
Requires-Dist: bqplot ; extra == "dev"
|
|
39
39
|
Requires-Dist: bqplot-image-gl ; extra == "dev"
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"CDN assets for Solara"
|
|
2
|
-
__version__ = "1.
|
|
2
|
+
__version__ = "1.7.0"
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"Enterprise features for Solara"
|
|
2
|
-
__version__ = "1.
|
|
2
|
+
__version__ = "1.7.0"
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
## Making an alpha release
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
$ ./release.sh patch --new-version 1.
|
|
10
|
+
$ ./release.sh patch --new-version 1.7.0a1
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
# semi automated
|
|
14
14
|
To make a new release
|
|
15
15
|
```
|
|
16
16
|
# update solara/__init__.py
|
|
17
|
-
$ git add -u && git commit -m 'Release v1.
|
|
17
|
+
$ git add -u && git commit -m 'Release v1.7.0' && git tag v1.7.0 && git push upstream master v1.7.0
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
|
|
@@ -22,5 +22,5 @@ If a problem happens, and you want to keep the history clean
|
|
|
22
22
|
```
|
|
23
23
|
# do fix
|
|
24
24
|
$ git rebase -i HEAD~3
|
|
25
|
-
$ git tag v1.
|
|
25
|
+
$ git tag v1.7.0 -f && git push upstream master v1.7.0 -f
|
|
26
26
|
```
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""Build webapps using IPywidgets"""
|
|
2
|
-
__version__ = "1.
|
|
2
|
+
__version__ = "1.7.0"
|
|
3
3
|
github_url = "https://github.com/widgetti/solara"
|
|
4
4
|
git_branch = "master"
|
|
5
5
|
|
|
@@ -35,6 +35,7 @@ from reacton import (
|
|
|
35
35
|
use_state,
|
|
36
36
|
use_state_widget,
|
|
37
37
|
) # noqa: F403, F401
|
|
38
|
+
from reacton.core import Element # noqa: F403, F401
|
|
38
39
|
from . import util
|
|
39
40
|
|
|
40
41
|
# flake8: noqa: F402
|
|
@@ -3,6 +3,7 @@ import importlib
|
|
|
3
3
|
import inspect
|
|
4
4
|
import pkgutil
|
|
5
5
|
import re
|
|
6
|
+
import warnings
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
from types import ModuleType
|
|
8
9
|
from typing import Any, Callable, List, Optional, cast
|
|
@@ -356,7 +357,7 @@ def generate_routes(module: ModuleType) -> List[solara.Route]:
|
|
|
356
357
|
raise KeyError(f"Route {k!r} listen in route_order not found in {module}")
|
|
357
358
|
routes = [lookup[k] for k in route_order]
|
|
358
359
|
if set(lookup) - set(route_order):
|
|
359
|
-
|
|
360
|
+
warnings.warn(f"Some routes are not in route_order: {set(lookup) - set(route_order)}")
|
|
360
361
|
|
|
361
362
|
else:
|
|
362
363
|
children = getattr(module, "routes", [])
|
|
@@ -62,7 +62,7 @@ def get_server_python_executable(silent: bool = False):
|
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
libraries_minimal = [
|
|
65
|
-
{"python": "ipyvuetify", "classic": "jupyter-vuetify/extension", "lab": "jupyter-
|
|
65
|
+
{"python": "ipyvuetify", "classic": "jupyter-vuetify/extension", "lab": "jupyter-vuetify"},
|
|
66
66
|
{"python": "ipyvue", "classic": "jupyter-vue/extension", "lab": "jupyter-vue"},
|
|
67
67
|
]
|
|
68
68
|
|
|
@@ -218,7 +218,7 @@ def AppLayout(
|
|
|
218
218
|
|
|
219
219
|
title = t.use_title_get() or title
|
|
220
220
|
|
|
221
|
-
show_app_bar = title or routes or children_appbar or use_drawer
|
|
221
|
+
show_app_bar = title or (routes and navigation) or children_appbar or use_drawer
|
|
222
222
|
if not show_app_bar and not children_sidebar and len(children) == 1:
|
|
223
223
|
return children[0]
|
|
224
224
|
if embedded_mode and not fullscreen:
|
|
@@ -315,7 +315,7 @@ def CrossFilterSlider(
|
|
|
315
315
|
|
|
316
316
|
|
|
317
317
|
@solara.component
|
|
318
|
-
def CrossFilterDataFrame(df, column_actions: List[ColumnAction] = [], cell_actions: List[CellAction] = []):
|
|
318
|
+
def CrossFilterDataFrame(df, items_per_page=20, column_actions: List[ColumnAction] = [], cell_actions: List[CellAction] = [], scrollable=False):
|
|
319
319
|
"""Display a DataFrame with filters applied from the cross filter.
|
|
320
320
|
|
|
321
321
|
This component wraps [DataFrame](/api/dataframe).
|
|
@@ -333,4 +333,4 @@ def CrossFilterDataFrame(df, column_actions: List[ColumnAction] = [], cell_actio
|
|
|
333
333
|
filter, set_filter = solara.use_cross_filter(id(df), "dataframe")
|
|
334
334
|
if filter is not None:
|
|
335
335
|
dff = df[filter]
|
|
336
|
-
return solara.DataFrame(dff)
|
|
336
|
+
return solara.DataFrame(dff, items_per_page=items_per_page, scrollable=scrollable, column_actions=column_actions, cell_actions=cell_actions)
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import dataclasses
|
|
2
|
+
import math
|
|
3
|
+
import os
|
|
4
|
+
from dataclasses import replace
|
|
5
|
+
from typing import Callable, List, Optional
|
|
6
|
+
|
|
7
|
+
import ipyvuetify as v
|
|
8
|
+
import ipywidgets
|
|
9
|
+
import traitlets
|
|
10
|
+
|
|
11
|
+
import solara
|
|
12
|
+
import solara.hooks.dataframe
|
|
13
|
+
import solara.lab
|
|
14
|
+
from solara.lab.hooks.dataframe import use_df_column_names
|
|
15
|
+
from solara.lab.utils.dataframe import df_type
|
|
16
|
+
|
|
17
|
+
from .. import CellAction, ColumnAction
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _ensure_dict(d):
|
|
21
|
+
if dataclasses.is_dataclass(d):
|
|
22
|
+
return dataclasses.asdict(d)
|
|
23
|
+
return d
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _drop_keys_from_list_of_mappings(drop):
|
|
27
|
+
def closure(list_of_dicts, widget):
|
|
28
|
+
return [{k: v for k, v in _ensure_dict(d).items() if k not in drop} for d in list_of_dicts]
|
|
29
|
+
|
|
30
|
+
return closure
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class DataTableWidget(v.VuetifyTemplate):
|
|
34
|
+
template_file = os.path.realpath(os.path.join(os.path.dirname(__file__), "datatable.vue"))
|
|
35
|
+
|
|
36
|
+
total_length = traitlets.CInt().tag(sync=True)
|
|
37
|
+
checked = traitlets.List([]).tag(sync=True) # indices of which rows are selected
|
|
38
|
+
column_actions = traitlets.List(trait=traitlets.Instance(ColumnAction), default_value=[]).tag(
|
|
39
|
+
sync=True, to_json=_drop_keys_from_list_of_mappings(["on_click"])
|
|
40
|
+
)
|
|
41
|
+
_column_actions_callbacks = traitlets.List(trait=traitlets.Callable(), default_value=[])
|
|
42
|
+
cell_actions = traitlets.List(trait=traitlets.Instance(CellAction), default_value=[]).tag(sync=True, to_json=_drop_keys_from_list_of_mappings(["on_click"]))
|
|
43
|
+
_cell_actions_callbacks = traitlets.List(trait=traitlets.Callable(), default_value=[])
|
|
44
|
+
items = traitlets.Any().tag(sync=True) # the data, a list of dict
|
|
45
|
+
headers = traitlets.Any().tag(sync=True)
|
|
46
|
+
headers_selections = traitlets.Any().tag(sync=True)
|
|
47
|
+
options = traitlets.Any().tag(sync=True)
|
|
48
|
+
items_per_page = traitlets.CInt(11).tag(sync=True)
|
|
49
|
+
selections = traitlets.Any([]).tag(sync=True)
|
|
50
|
+
selection_colors = traitlets.Any([]).tag(sync=True)
|
|
51
|
+
selection_enabled = traitlets.Bool(True).tag(sync=True)
|
|
52
|
+
highlighted = traitlets.Int(None, allow_none=True).tag(sync=True)
|
|
53
|
+
scrollable = traitlets.Bool(False).tag(sync=True)
|
|
54
|
+
|
|
55
|
+
# for use with scrollable, when used in the default UI
|
|
56
|
+
height = traitlets.Unicode(None, allow_none=True).tag(sync=True)
|
|
57
|
+
|
|
58
|
+
hidden_components = traitlets.List([]).tag(sync=False)
|
|
59
|
+
column_header_hover = traitlets.Unicode(allow_none=True).tag(sync=True)
|
|
60
|
+
column_header_widget = traitlets.Any(allow_none=True).tag(sync=True, **ipywidgets.widget_serialization)
|
|
61
|
+
|
|
62
|
+
def vue_on_column_action(self, data):
|
|
63
|
+
header_value, action_index = data
|
|
64
|
+
on_click = self._column_actions_callbacks[action_index]
|
|
65
|
+
if on_click:
|
|
66
|
+
on_click(header_value)
|
|
67
|
+
|
|
68
|
+
def vue_on_cell_action(self, data):
|
|
69
|
+
row, header_value, action_index = data
|
|
70
|
+
on_click = self._cell_actions_callbacks[action_index]
|
|
71
|
+
if on_click:
|
|
72
|
+
on_click(header_value, row)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def format_default(df, column, row_index, value):
|
|
76
|
+
if isinstance(value, float) and math.isnan(value):
|
|
77
|
+
return "NaN"
|
|
78
|
+
return str(value)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@solara.component
|
|
82
|
+
def DataTable(
|
|
83
|
+
df,
|
|
84
|
+
page=0,
|
|
85
|
+
items_per_page=20,
|
|
86
|
+
format=None,
|
|
87
|
+
column_actions: List[ColumnAction] = [],
|
|
88
|
+
cell_actions: List[CellAction] = [],
|
|
89
|
+
scrollable=False,
|
|
90
|
+
on_column_header_hover: Optional[Callable[[Optional[str]], None]] = None,
|
|
91
|
+
column_header_info: Optional[solara.Element] = None,
|
|
92
|
+
):
|
|
93
|
+
total_length = len(df)
|
|
94
|
+
options = {"descending": False, "page": page + 1, "itemsPerPage": items_per_page, "sortBy": [], "totalItems": total_length}
|
|
95
|
+
options, set_options = solara.use_state(options, key="options")
|
|
96
|
+
format = format or format_default
|
|
97
|
+
# frontend does 1 base, we use 0 based
|
|
98
|
+
page = options["page"] - 1
|
|
99
|
+
items_per_page = options["itemsPerPage"]
|
|
100
|
+
i1 = page * items_per_page
|
|
101
|
+
i2 = min(total_length, (page + 1) * items_per_page)
|
|
102
|
+
|
|
103
|
+
columns = use_df_column_names(df)
|
|
104
|
+
|
|
105
|
+
items = []
|
|
106
|
+
column_data = {}
|
|
107
|
+
dfs = df[i1:i2]
|
|
108
|
+
|
|
109
|
+
if df_type(df) == "pandas":
|
|
110
|
+
column_data = dfs[columns].to_dict("records")
|
|
111
|
+
else:
|
|
112
|
+
column_data = dfs[columns].to_records()
|
|
113
|
+
for i in range(i2 - i1):
|
|
114
|
+
item = {"__row__": i + i1} # special key for the row number
|
|
115
|
+
for column in columns:
|
|
116
|
+
item[column] = format(dfs, column, i + i1, column_data[i][column])
|
|
117
|
+
items.append(item)
|
|
118
|
+
|
|
119
|
+
headers = [{"text": name, "value": name, "sortable": False} for name in columns]
|
|
120
|
+
column_actions_callbacks = [k.on_click for k in column_actions]
|
|
121
|
+
cell_actions_callbacks = [k.on_click for k in cell_actions]
|
|
122
|
+
column_actions = [replace(k, on_click=None) for k in column_actions]
|
|
123
|
+
cell_actions = [replace(k, on_click=None) for k in cell_actions]
|
|
124
|
+
|
|
125
|
+
return DataTableWidget.element(
|
|
126
|
+
total_length=total_length,
|
|
127
|
+
items=items,
|
|
128
|
+
headers=headers,
|
|
129
|
+
headers_selections=[],
|
|
130
|
+
options=options,
|
|
131
|
+
items_per_page=items_per_page,
|
|
132
|
+
selections=[],
|
|
133
|
+
selection_colors=[],
|
|
134
|
+
selection_enabled=False,
|
|
135
|
+
highlighted=None,
|
|
136
|
+
scrollable=scrollable,
|
|
137
|
+
on_options=set_options,
|
|
138
|
+
column_actions=column_actions,
|
|
139
|
+
cell_actions=cell_actions,
|
|
140
|
+
_column_actions_callbacks=column_actions_callbacks,
|
|
141
|
+
_cell_actions_callbacks=cell_actions_callbacks,
|
|
142
|
+
on_column_header_hover=on_column_header_hover,
|
|
143
|
+
column_header_widget=column_header_info,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
@solara.component
|
|
148
|
+
def DataFrame(
|
|
149
|
+
df,
|
|
150
|
+
items_per_page=20,
|
|
151
|
+
column_actions: List[ColumnAction] = [],
|
|
152
|
+
cell_actions: List[CellAction] = [],
|
|
153
|
+
scrollable=False,
|
|
154
|
+
on_column_header_hover: Optional[Callable[[Optional[str]], None]] = None,
|
|
155
|
+
column_header_info: Optional[solara.Element] = None,
|
|
156
|
+
):
|
|
157
|
+
"""Displays a Pandas dataframe in a table.
|
|
158
|
+
|
|
159
|
+
Pass in a dataframe as first argument, and optionally how many items per page to display.
|
|
160
|
+
|
|
161
|
+
```solara
|
|
162
|
+
import solara
|
|
163
|
+
import pandas as pd
|
|
164
|
+
import plotly
|
|
165
|
+
|
|
166
|
+
df = plotly.data.iris()
|
|
167
|
+
|
|
168
|
+
@solara.component
|
|
169
|
+
def Page():
|
|
170
|
+
solara.DataFrame(df, items_per_page=5)
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
# Custom column header info
|
|
175
|
+
|
|
176
|
+
Use the `column_header_info` argument to display a custom component on the column header when
|
|
177
|
+
the user hover above it. In this case we display the value counts for the column.
|
|
178
|
+
|
|
179
|
+
```solara
|
|
180
|
+
import solara
|
|
181
|
+
import pandas as pd
|
|
182
|
+
import plotly
|
|
183
|
+
|
|
184
|
+
df = plotly.data.iris()
|
|
185
|
+
|
|
186
|
+
@solara.component
|
|
187
|
+
def Page():
|
|
188
|
+
column_hover, set_column_hover = solara.use_state(None)
|
|
189
|
+
|
|
190
|
+
with solara.Column(margin=4) as column_header_info:
|
|
191
|
+
if column_hover:
|
|
192
|
+
solara.Text("Value counts for " + column_hover)
|
|
193
|
+
display(df[column_hover].value_counts())
|
|
194
|
+
# if no column is hovered above, we provide an empty container
|
|
195
|
+
# so we always see the triple dot icon on the column header
|
|
196
|
+
|
|
197
|
+
solara.DataFrame(df, column_header_info=column_header_info, on_column_header_hover=set_column_hover)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
## Arguments
|
|
202
|
+
|
|
203
|
+
* `df` - `DataFrame` - a Pandas dataframe.
|
|
204
|
+
* `items_per_page` - `int` - number of items per page.
|
|
205
|
+
* `column_actions` - Triggered via clicking on the triple dot icon on the headers (visible when hovering).
|
|
206
|
+
* `cell_actions` - Triggered via clicking on the triple dot icon in the cell (visible when hovering).
|
|
207
|
+
* `on_column_header_hover` - Optional callback when the user hovers over the triple dot icon on a header.
|
|
208
|
+
* `column_header_info` - Element to display in the column menu popup (visible when hovering), provide an
|
|
209
|
+
empty container element (like [Column](/api/column)) to force showing the trigle dot icon (see example).
|
|
210
|
+
|
|
211
|
+
"""
|
|
212
|
+
return DataTable(
|
|
213
|
+
df,
|
|
214
|
+
items_per_page=items_per_page,
|
|
215
|
+
column_actions=column_actions,
|
|
216
|
+
cell_actions=cell_actions,
|
|
217
|
+
scrollable=scrollable,
|
|
218
|
+
on_column_header_hover=on_column_header_hover,
|
|
219
|
+
column_header_info=column_header_info,
|
|
220
|
+
)
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<v-slide-x-transition appear>
|
|
3
|
+
<div class="solara-data-table__viewport">
|
|
4
|
+
<v-data-table dense hide-default-header :headers="[...headers]" :items="items"
|
|
5
|
+
:footer-props="{ 'items-per-page-options': [10, 20, 50, 100] }" :options.sync="options"
|
|
6
|
+
:items_per_page.sync="items_per_page" :server-items-length="total_length" :class="[
|
|
7
|
+
'elevation-1',
|
|
8
|
+
'solara-data-table',
|
|
9
|
+
scrollable && 'solara-data-table--scrollable',
|
|
10
|
+
]" :style="scrollable && height != null && `height: ${height}`">
|
|
11
|
+
<template v-slot:header="props">
|
|
12
|
+
<thead>
|
|
13
|
+
<tr>
|
|
14
|
+
<th style="padding: 0 10px; width: 40px">#</th>
|
|
15
|
+
<th style="padding: 0 1px; width: 30px" v-if="selection_enabled">
|
|
16
|
+
<v-btn icon color="primary" text small @click="apply_filter">
|
|
17
|
+
<v-icon>filter_list</v-icon>
|
|
18
|
+
</v-btn>
|
|
19
|
+
</th>
|
|
20
|
+
<th style="padding: 0 1px" v-for="(header, index) in headers_selections" :key="header.text">
|
|
21
|
+
<v-icon style="padding: 0 1px" :key="index" :color="selection_colors[index]">brightness_1</v-icon>
|
|
22
|
+
</th>
|
|
23
|
+
<v-slide-x-transition :key="header.text" v-for="header in headers">
|
|
24
|
+
<th class="text-no-wrap">
|
|
25
|
+
{{ header.text }}
|
|
26
|
+
<v-menu open-on-hover bottom offset-y @input="isOpen => onHeaderHover({ isOpen, header })"
|
|
27
|
+
v-if="(column_actions && column_actions.length) || column_header_widget">
|
|
28
|
+
<template v-slot:activator="{ on, attrs }">
|
|
29
|
+
<v-icon v-bind="attrs" v-on="on" small class="solara-data-table-menu">mdi-dots-vertical</v-icon>
|
|
30
|
+
</template>
|
|
31
|
+
<v-sheet v-if="header.value === column_header_hover" class="solara-data-table-column-header-sheet">
|
|
32
|
+
<jupyter-widget v-if="column_header_widget" :widget="column_header_widget"></jupyter-widget>
|
|
33
|
+
</v-sheet>
|
|
34
|
+
<v-list v-if="column_actions && column_actions.length">
|
|
35
|
+
<v-subheader>Actions:</v-subheader>
|
|
36
|
+
<v-list-item link @click="on_column_action([header.value, index])"
|
|
37
|
+
v-for="(action, index) in column_actions" :key="index">
|
|
38
|
+
<v-list-item-icon><v-icon>{{ action.icon }}</v-icon></v-list-item-icon>
|
|
39
|
+
<v-list-item-title>{{ action.name }}</v-list-item-title>
|
|
40
|
+
</v-list-item>
|
|
41
|
+
</v-list>
|
|
42
|
+
</v-menu>
|
|
43
|
+
</th>
|
|
44
|
+
</v-slide-x-transition>
|
|
45
|
+
</tr>
|
|
46
|
+
</thead>
|
|
47
|
+
</template>
|
|
48
|
+
<template v-slot:item="props">
|
|
49
|
+
<!-- @click="on_row_clicked(props.item.__row__)" -->
|
|
50
|
+
<tr :class="{ highlightedRow: props.item.__row__ === highlighted }">
|
|
51
|
+
<td style="padding: 0 10px" class="text-xs-left">
|
|
52
|
+
<i>{{ props.item.__row__ }}</i>
|
|
53
|
+
</td>
|
|
54
|
+
<td style="padding: 0 1px" class="text-xs-left" v-if="selection_enabled">
|
|
55
|
+
<v-checkbox hide-details style="margin-top: 0; padding-top: 0"
|
|
56
|
+
:input-value="checked.indexOf(props.item.__row__) != -1" :key="props.item.__row__"
|
|
57
|
+
@change="(value) => select({ checked: value, row: props.item.__row__ })" />
|
|
58
|
+
</td>
|
|
59
|
+
<td style="padding: 0 1px" :key="header.text" v-for="(header, index) in headers_selections">
|
|
60
|
+
<v-fade-transition leave-absolute>
|
|
61
|
+
<v-icon v-if="props.item[header.value]" v-model="props.item[header.value]"
|
|
62
|
+
:color="selection_colors[index]">brightness_1</v-icon>
|
|
63
|
+
</v-fade-transition>
|
|
64
|
+
</td>
|
|
65
|
+
<td v-for="header in headers" class="text-truncate text-no-wrap" :key="header.text"
|
|
66
|
+
:title="props.item[header.value]">
|
|
67
|
+
<v-slide-x-transition appear>
|
|
68
|
+
<!-- <span @click="on_item_click([props.item.__row__, header.value])">{{ props.item[header.value] }}</span> -->
|
|
69
|
+
<span>
|
|
70
|
+
{{ props.item[header.value] }}
|
|
71
|
+
<v-menu open-on-hover bottom offset-y v-if="cell_actions.length">
|
|
72
|
+
<template v-slot:activator="{ on, attrs }">
|
|
73
|
+
<v-icon v-bind="attrs" v-on="on" small class="solara-data-table-menu">mdi-dots-vertical</v-icon>
|
|
74
|
+
</template>
|
|
75
|
+
<v-list v-for="(action, index) in cell_actions" :key="index">
|
|
76
|
+
<v-list-item link @click="on_cell_action([props.item.__row__, header.value, index])">
|
|
77
|
+
<v-list-item-icon><v-icon>{{ action.icon }}</v-icon></v-list-item-icon>
|
|
78
|
+
<v-list-item-title>{{ action.name }}</v-list-item-title>
|
|
79
|
+
</v-list-item>
|
|
80
|
+
</v-list>
|
|
81
|
+
</v-menu>
|
|
82
|
+
</span>
|
|
83
|
+
|
|
84
|
+
</v-slide-x-transition>
|
|
85
|
+
</td>
|
|
86
|
+
</tr>
|
|
87
|
+
</template>
|
|
88
|
+
</v-data-table>
|
|
89
|
+
</div>
|
|
90
|
+
</v-slide-x-transition>
|
|
91
|
+
</template>
|
|
92
|
+
|
|
93
|
+
<script>
|
|
94
|
+
module.exports = {
|
|
95
|
+
methods: {
|
|
96
|
+
onHeaderHover({ header, isOpen }) {
|
|
97
|
+
if (isOpen) {
|
|
98
|
+
// if isOpen is true, we clicked, and we set it header.value
|
|
99
|
+
this.column_header_hover = header.value
|
|
100
|
+
} else {
|
|
101
|
+
// if false, we only 'unset' if the current header equals the current open menu
|
|
102
|
+
// because sometimes the menu from another column is closed after opening the new one
|
|
103
|
+
if (this.column_header_hover == header.value) {
|
|
104
|
+
this.column_header_hover = null
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
</script>
|
|
111
|
+
<style id="solara_table">
|
|
112
|
+
.highlightedRow {
|
|
113
|
+
background-color: #e3f2fd;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.solara-data-table table {
|
|
117
|
+
table-layout: fixed;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.solara-data-table--scrollable .v-data-table__wrapper {
|
|
121
|
+
overflow-y: auto;
|
|
122
|
+
height: calc(100% - 59px);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.solara-data-table--scrollable thead>tr {
|
|
126
|
+
position: sticky;
|
|
127
|
+
top: 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.solara-data-table--scrollable .v-data-table__wrapper,
|
|
131
|
+
.solara-data-table--scrollable .v-data-table__wrapper>table,
|
|
132
|
+
.solara-data-table--scrollable .v-data-table__wrapper>table thead,
|
|
133
|
+
.solara-data-table--scrollable .v-data-table__wrapper>table thead * {
|
|
134
|
+
background-color: inherit;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* prevent checkboxes overlaying the table header */
|
|
138
|
+
.solara-data-table--scrollable .v-data-table__wrapper>table thead {
|
|
139
|
+
position: relative;
|
|
140
|
+
z-index: 1;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* avoid margins to collapse, to avoid a white background */
|
|
144
|
+
.solara-data-table-column-header-sheet {
|
|
145
|
+
overflow: auto;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.solara-data-table.v-data-table th,
|
|
149
|
+
.solara-data-table.v-data-table td {
|
|
150
|
+
padding-left: 4px;
|
|
151
|
+
padding-right: 0;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.v-data-table .solara-data-table-menu {
|
|
155
|
+
opacity: 0;
|
|
156
|
+
transition: opacity 0.5s;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.v-data-table th:hover .solara-data-table-menu,
|
|
160
|
+
.v-data-table td:hover .solara-data-table-menu {
|
|
161
|
+
opacity: 1;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.solara-data-table__viewport {
|
|
165
|
+
overflow-x: auto;
|
|
166
|
+
width: 100%;
|
|
167
|
+
max-height: 100%;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.solara-data-table.v-data-table,
|
|
171
|
+
.solara-data-table.v-data-table table {
|
|
172
|
+
max-width: unset;
|
|
173
|
+
width: unset;
|
|
174
|
+
}
|
|
175
|
+
</style>
|
|
@@ -119,7 +119,7 @@ async def main():
|
|
|
119
119
|
]
|
|
120
120
|
for dep in requirements:
|
|
121
121
|
await micropip.install(dep, keep_going=True)
|
|
122
|
-
await micropip.install("/wheels/solara-1.
|
|
122
|
+
await micropip.install("/wheels/solara-1.7.0-py2.py3-none-any.whl", keep_going=True)
|
|
123
123
|
import solara
|
|
124
124
|
|
|
125
125
|
el = solara.Warning("lala")
|
|
@@ -81,7 +81,9 @@ def Layout(children=[]):
|
|
|
81
81
|
return children[0]
|
|
82
82
|
with solara.VBox(grow=False) as main:
|
|
83
83
|
Title(title="Solara documentation")
|
|
84
|
-
solara.Meta(
|
|
84
|
+
solara.Meta(name="twitter:card", content="summary_large_image")
|
|
85
|
+
solara.Meta(name="twitter:site", content="@solara_dev")
|
|
86
|
+
solara.Meta(name="twitter:image", content="https://solara.dev/static/assets/images/logo-small.png")
|
|
85
87
|
solara.Meta(property="og:url", content="https://solara.dev" + router.path)
|
|
86
88
|
solara.Meta(property="og:image", content="https://solara.dev/static/assets/images/logo-small.png")
|
|
87
89
|
solara.Meta(property="og:type", content="website")
|
|
@@ -101,7 +103,9 @@ def Layout(children=[]):
|
|
|
101
103
|
description = "Use ipywidgets with Solara to build powerful and scalable web apps for Jupyter and production in Python."
|
|
102
104
|
# both tags in one
|
|
103
105
|
solara.Meta(name="description", property="og:description", content=description)
|
|
106
|
+
solara.Meta(name="twitter:description", content=description)
|
|
104
107
|
solara.Meta(property="og:title", content="Solara documentation")
|
|
108
|
+
solara.Meta(name="twitter:title", content="Solara documentation")
|
|
105
109
|
|
|
106
110
|
with rv.Row(class_="ma-2"):
|
|
107
111
|
with rv.Col(md=4, offset_md=2, sm=5, offset_sm=1):
|
|
@@ -5,18 +5,12 @@
|
|
|
5
5
|
|
|
6
6
|
from typing import Any, Dict, Optional, cast
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
import plotly
|
|
9
9
|
|
|
10
|
-
try:
|
|
11
|
-
import vaex
|
|
12
|
-
except ImportError:
|
|
13
|
-
vaex = None
|
|
14
10
|
import solara
|
|
11
|
+
from solara.website.utils import apidoc
|
|
15
12
|
|
|
16
|
-
|
|
17
|
-
df = vaex.datasets.titanic()
|
|
18
|
-
else:
|
|
19
|
-
df = None
|
|
13
|
+
df = plotly.data.iris()
|
|
20
14
|
|
|
21
15
|
|
|
22
16
|
@solara.component
|
|
@@ -32,21 +26,19 @@ def Page():
|
|
|
32
26
|
|
|
33
27
|
column_actions = [solara.ColumnAction(icon="mdi-sunglasses", name="User column action", on_click=on_action_column)]
|
|
34
28
|
cell_actions = [solara.CellAction(icon="mdi-white-balance-sunny", name="User cell action", on_click=on_action_cell)]
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
## Demo
|
|
29
|
+
solara.MarkdownIt(
|
|
30
|
+
f"""
|
|
31
|
+
## Demo
|
|
39
32
|
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
Below we show display the titanic dataset, and demonstrate a user colum and cell action. Try clicking on the triple icon when hovering
|
|
34
|
+
above a column or cell. And see the following values changes:
|
|
42
35
|
|
|
43
|
-
|
|
44
|
-
|
|
36
|
+
* Column action on: `{column}`
|
|
37
|
+
* Cell action on: `{cell}`
|
|
45
38
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return main
|
|
39
|
+
"""
|
|
40
|
+
)
|
|
41
|
+
solara.DataFrame(df, column_actions=column_actions, cell_actions=cell_actions)
|
|
50
42
|
|
|
51
43
|
|
|
52
44
|
__doc__ += apidoc(solara.DataFrame.f) # type: ignore
|