geo-activity-playground 1.10.0__tar.gz → 1.12.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.
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/PKG-INFO +1 -1
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/config.py +4 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/app.py +1 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/explorer_blueprint.py +53 -20
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/settings_blueprint.py +36 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/server-side-explorer.js +7 -2
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/explorer/server-side.html.j2 +39 -9
- geo_activity_playground-1.12.0/geo_activity_playground/webui/templates/settings/color-strategy.html.j2 +38 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/index.html.j2 +10 -1
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/pyproject.toml +1 -1
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/LICENSE +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/__init__.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/__main__.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/README +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/env.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/script.py.mako +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/0f02b92c4f94_add_tag_color.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/10021d238ada_add_explorer_tile_bookmarks.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/38882503dc7c_add_tags_to_activities.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/85fe0348e8a2_add_time_series_uuid_field.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/93cc82ad1b60_add_parametricplotspec.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/da2cba03b71d_add_photos.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/dc8073871da7_add_plotspec_group_by.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activity_nullable.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/script.py.mako +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/__init__.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/activities.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/coordinates.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/copernicus_dem.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/datamodel.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/enrichment.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/export.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/heart_rate.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/meta_search.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/missing_values.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/parametric_plot.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/paths.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/photos.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/privacy_zones.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/raster_map.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/similarity.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/summary_stats.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/tasks.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_datamodel.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_meta_search.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_missing_values.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_pandas_timezone.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_summary_stats.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_tiles.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_time_zone_from_location.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_time_zone_import.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_timezone_sqlalchemy.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/tiles.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/time_conversion.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/explorer/__init__.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/explorer/grid_file.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/explorer/tile_visits.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/explorer/video.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/heatmap_video.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/__init__.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/activity_parsers.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/csv_parser.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/directory.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/strava_api.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/strava_checkout.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/test_csv_parser.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/test_directory.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/test_strava_api.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/__init__.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/authenticator.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/__init__.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/activity_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/auth_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/calendar_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/eddington_blueprints.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/entry_views.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/equipment_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/export_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/heatmap_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/photo_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/plot_builder_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/search_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/square_planner_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/summary_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/tile_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/time_zone_fixer_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/upload_blueprint.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/columns.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/flasher.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/plot_util.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/search_util.py +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/activity-trim.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/bootstrap/bootstrap-dark-mode.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/bootstrap/bootstrap.bundle.min.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/bootstrap/bootstrap.min.css +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/android-chrome-192x192.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/android-chrome-512x512.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/apple-touch-icon.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/browserconfig.xml +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon-16x16.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon-32x32.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon-48x48.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon.ico +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon.svg +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/mstile-150x150.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/site.webmanifest +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/web-app-manifest-192x192.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/web-app-manifest-512x512.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/layers-2x.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/layers.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/marker-icon-2x.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/marker-icon.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/marker-shadow.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/Leaflet.fullscreen.min.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/MarkerCluster.Default.css +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/MarkerCluster.css +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/fullscreen.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/fullscreen@2x.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/images/layers-2x.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/images/layers.png +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/leaflet.css +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/leaflet.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/table-sort.min.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/vega/vega-embed@6.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/vega/vega-lite@4.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/vega/vega@5.js +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/day.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/edit.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/lines.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/name.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/show.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/trim.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/auth/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/bubble_chart/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/calendar/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/calendar/month.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/eddington/distance.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/elevation_eddington/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/equipment/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/export/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/hall_of_fame/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/heatmap/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/home.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/page.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/photo/map.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/photo/new.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/plot-macros.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/plot_builder/edit.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/plot_builder/import-spec.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/plot_builder/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/search/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/search_form.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/admin-password.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/cluster-bookmarks-new.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/color-schemes.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/heart-rate.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/manage-equipments.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/manage-kinds.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/privacy-zones.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/segmentation.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/sharepic.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/strava.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/tags-edit.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/tags-list.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/tags-new.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/tile-source.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/square_planner/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/summary/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/summary/vega-chart.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/upload/index.html.j2 +0 -0
- {geo_activity_playground-1.10.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/upload/reload.html.j2 +0 -0
|
@@ -25,6 +25,10 @@ class Config:
|
|
|
25
25
|
color_scheme_for_counts: str = "teals"
|
|
26
26
|
color_scheme_for_kind: str = "category10"
|
|
27
27
|
color_scheme_for_heatmap: str = "hot"
|
|
28
|
+
color_strategy_max_cluster_color: str = "#377eb84d"
|
|
29
|
+
color_strategy_max_cluster_other_color: str = "#4daf4a4d"
|
|
30
|
+
color_strategy_visited_color: str = "#0000004d"
|
|
31
|
+
color_strategy_cmap_opacity: float = 0.5
|
|
28
32
|
equipment_offsets: dict[str, float] = dataclasses.field(default_factory=dict)
|
|
29
33
|
explorer_zoom_levels: list[int] = dataclasses.field(
|
|
30
34
|
default_factory=lambda: [14, 17]
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import abc
|
|
2
2
|
import datetime
|
|
3
|
+
import functools
|
|
3
4
|
import hashlib
|
|
4
5
|
import io
|
|
6
|
+
import itertools
|
|
5
7
|
import logging
|
|
6
8
|
from collections.abc import Iterable
|
|
7
9
|
from typing import Any
|
|
@@ -24,6 +26,7 @@ from flask import Response
|
|
|
24
26
|
from flask import url_for
|
|
25
27
|
from flask.typing import ResponseReturnValue
|
|
26
28
|
|
|
29
|
+
from ...core.config import Config
|
|
27
30
|
from ...core.config import ConfigAccessor
|
|
28
31
|
from ...core.coordinates import Bounds
|
|
29
32
|
from ...core.datamodel import Activity
|
|
@@ -55,6 +58,15 @@ def blend_color(
|
|
|
55
58
|
return (1 - opacity) * base + opacity * addition
|
|
56
59
|
|
|
57
60
|
|
|
61
|
+
@functools.cache
|
|
62
|
+
def hex_color_to_float(color: str) -> np.ndarray:
|
|
63
|
+
values = [int("".join(x), base=16) / 255 for x in itertools.batched(color[1:], 2)]
|
|
64
|
+
assert (
|
|
65
|
+
min(values) >= 0.0 and max(values) <= 1.0
|
|
66
|
+
), f"All {values=} must be within 0.0 and 1.0."
|
|
67
|
+
return np.array([[values]])
|
|
68
|
+
|
|
69
|
+
|
|
58
70
|
class ColorStrategy(abc.ABC):
|
|
59
71
|
@abc.abstractmethod
|
|
60
72
|
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
|
@@ -62,27 +74,32 @@ class ColorStrategy(abc.ABC):
|
|
|
62
74
|
|
|
63
75
|
|
|
64
76
|
class MaxClusterColorStrategy(ColorStrategy):
|
|
65
|
-
def __init__(self, evolution_state, tile_visits):
|
|
77
|
+
def __init__(self, evolution_state, tile_visits, config: Config):
|
|
66
78
|
self.evolution_state = evolution_state
|
|
67
79
|
self.tile_visits = tile_visits
|
|
68
80
|
self.max_cluster_members = max(
|
|
69
81
|
evolution_state.clusters.values(),
|
|
70
82
|
key=len,
|
|
71
83
|
)
|
|
84
|
+
self._config = config
|
|
72
85
|
|
|
73
86
|
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
|
74
87
|
if tile_xy in self.max_cluster_members:
|
|
75
|
-
return
|
|
88
|
+
return hex_color_to_float(self._config.color_strategy_max_cluster_color)
|
|
76
89
|
elif tile_xy in self.evolution_state.memberships:
|
|
77
|
-
return
|
|
90
|
+
return hex_color_to_float(
|
|
91
|
+
self._config.color_strategy_max_cluster_other_color
|
|
92
|
+
)
|
|
78
93
|
elif tile_xy in self.tile_visits:
|
|
79
|
-
return
|
|
94
|
+
return hex_color_to_float(self._config.color_strategy_visited_color)
|
|
80
95
|
else:
|
|
81
96
|
return None
|
|
82
97
|
|
|
83
98
|
|
|
84
99
|
class ColorfulClusterColorStrategy(ColorStrategy):
|
|
85
|
-
def __init__(
|
|
100
|
+
def __init__(
|
|
101
|
+
self, evolution_state: TileEvolutionState, tile_visits, config: Config
|
|
102
|
+
):
|
|
86
103
|
self.evolution_state = evolution_state
|
|
87
104
|
self.tile_visits = tile_visits
|
|
88
105
|
self.max_cluster_members = max(
|
|
@@ -90,6 +107,7 @@ class ColorfulClusterColorStrategy(ColorStrategy):
|
|
|
90
107
|
key=len,
|
|
91
108
|
)
|
|
92
109
|
self._cmap = matplotlib.colormaps["hsv"]
|
|
110
|
+
self._config = config
|
|
93
111
|
|
|
94
112
|
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
|
95
113
|
if tile_xy in self.evolution_state.memberships:
|
|
@@ -97,17 +115,20 @@ class ColorfulClusterColorStrategy(ColorStrategy):
|
|
|
97
115
|
m = hashlib.sha256()
|
|
98
116
|
m.update(str(cluster_id).encode())
|
|
99
117
|
d = int(m.hexdigest(), base=16) / (256.0**m.digest_size)
|
|
100
|
-
return np.array(
|
|
118
|
+
return np.array(
|
|
119
|
+
[[self._cmap(d)[:3] + (self._config.color_strategy_cmap_opacity,)]]
|
|
120
|
+
)
|
|
101
121
|
elif tile_xy in self.tile_visits:
|
|
102
|
-
return
|
|
122
|
+
return hex_color_to_float(self._config.color_strategy_visited_color)
|
|
103
123
|
else:
|
|
104
124
|
return None
|
|
105
125
|
|
|
106
126
|
|
|
107
127
|
class VisitTimeColorStrategy(ColorStrategy):
|
|
108
|
-
def __init__(self, tile_visits, use_first=True):
|
|
128
|
+
def __init__(self, tile_visits, config: Config, use_first=True):
|
|
109
129
|
self.tile_visits = tile_visits
|
|
110
130
|
self.use_first = use_first
|
|
131
|
+
self._config = config
|
|
111
132
|
|
|
112
133
|
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
|
113
134
|
if tile_xy in self.tile_visits:
|
|
@@ -118,39 +139,43 @@ class VisitTimeColorStrategy(ColorStrategy):
|
|
|
118
139
|
tile_info["first_time"] if self.use_first else tile_info["last_time"]
|
|
119
140
|
)
|
|
120
141
|
if pd.isna(relevant_time):
|
|
121
|
-
color =
|
|
142
|
+
color = hex_color_to_float(self._config.color_strategy_visited_color)
|
|
122
143
|
else:
|
|
123
144
|
last_age_days = (today - relevant_time.date()).days
|
|
124
145
|
color = cmap(max(1 - last_age_days / (2 * 365), 0.0))
|
|
125
|
-
color = np.array(
|
|
146
|
+
color = np.array(
|
|
147
|
+
[[color[:3] + (self._config.color_strategy_cmap_opacity,)]]
|
|
148
|
+
)
|
|
126
149
|
return color
|
|
127
150
|
else:
|
|
128
151
|
return None
|
|
129
152
|
|
|
130
153
|
|
|
131
154
|
class NumVisitsColorStrategy(ColorStrategy):
|
|
132
|
-
def __init__(self, tile_visits):
|
|
155
|
+
def __init__(self, tile_visits, config: Config):
|
|
133
156
|
self.tile_visits = tile_visits
|
|
157
|
+
self._config = config
|
|
134
158
|
|
|
135
159
|
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
|
136
160
|
if tile_xy in self.tile_visits:
|
|
137
161
|
cmap = matplotlib.colormaps["viridis"]
|
|
138
162
|
tile_info = self.tile_visits[tile_xy]
|
|
139
163
|
color = cmap(min(len(tile_info["activity_ids"]) / 50, 1.0))
|
|
140
|
-
return np.array([[color[:3] + (
|
|
164
|
+
return np.array([[color[:3] + (self._config.color_strategy_cmap_opacity,)]])
|
|
141
165
|
else:
|
|
142
166
|
return None
|
|
143
167
|
|
|
144
168
|
|
|
145
169
|
class MissingColorStrategy(ColorStrategy):
|
|
146
|
-
def __init__(self, tile_visits):
|
|
170
|
+
def __init__(self, tile_visits, config: Config):
|
|
147
171
|
self.tile_visits = tile_visits
|
|
172
|
+
self._config = config
|
|
148
173
|
|
|
149
174
|
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
|
150
175
|
if tile_xy in self.tile_visits:
|
|
151
176
|
return None
|
|
152
177
|
else:
|
|
153
|
-
return
|
|
178
|
+
return hex_color_to_float(self._config.color_strategy_visited_color)
|
|
154
179
|
|
|
155
180
|
|
|
156
181
|
def make_explorer_blueprint(
|
|
@@ -159,6 +184,7 @@ def make_explorer_blueprint(
|
|
|
159
184
|
config_accessor: ConfigAccessor,
|
|
160
185
|
tile_getter: TileGetter,
|
|
161
186
|
image_transforms: dict[str, ImageTransform],
|
|
187
|
+
config: Config,
|
|
162
188
|
) -> Blueprint:
|
|
163
189
|
blueprint = Blueprint("explorer", __name__, template_folder="templates")
|
|
164
190
|
|
|
@@ -255,6 +281,7 @@ def make_explorer_blueprint(
|
|
|
255
281
|
continue
|
|
256
282
|
bookmarks.append(
|
|
257
283
|
{
|
|
284
|
+
"id": bookmark.id,
|
|
258
285
|
"name": bookmark.name,
|
|
259
286
|
"bbox": geojson_bounding_box_for_tile_collection(cluster, zoom),
|
|
260
287
|
"size": len(cluster),
|
|
@@ -307,19 +334,25 @@ def make_explorer_blueprint(
|
|
|
307
334
|
color_strategy_name = config_accessor().cluster_color_strategy
|
|
308
335
|
match color_strategy_name:
|
|
309
336
|
case "max_cluster":
|
|
310
|
-
color_strategy = MaxClusterColorStrategy(
|
|
337
|
+
color_strategy = MaxClusterColorStrategy(
|
|
338
|
+
evolution_state, tile_visits, config
|
|
339
|
+
)
|
|
311
340
|
case "colorful_cluster":
|
|
312
341
|
color_strategy = ColorfulClusterColorStrategy(
|
|
313
|
-
evolution_state, tile_visits
|
|
342
|
+
evolution_state, tile_visits, config
|
|
314
343
|
)
|
|
315
344
|
case "first":
|
|
316
|
-
color_strategy = VisitTimeColorStrategy(
|
|
345
|
+
color_strategy = VisitTimeColorStrategy(
|
|
346
|
+
tile_visits, config, use_first=True
|
|
347
|
+
)
|
|
317
348
|
case "last":
|
|
318
|
-
color_strategy = VisitTimeColorStrategy(
|
|
349
|
+
color_strategy = VisitTimeColorStrategy(
|
|
350
|
+
tile_visits, config, use_first=False
|
|
351
|
+
)
|
|
319
352
|
case "visits":
|
|
320
|
-
color_strategy = NumVisitsColorStrategy(tile_visits)
|
|
353
|
+
color_strategy = NumVisitsColorStrategy(tile_visits, config)
|
|
321
354
|
case "missing":
|
|
322
|
-
color_strategy = MissingColorStrategy(tile_visits)
|
|
355
|
+
color_strategy = MissingColorStrategy(tile_visits, config)
|
|
323
356
|
case _:
|
|
324
357
|
raise ValueError("Unsupported color strategy.")
|
|
325
358
|
|
|
@@ -134,6 +134,15 @@ def make_settings_blueprint(
|
|
|
134
134
|
tile_y=request.args["tile_y"],
|
|
135
135
|
)
|
|
136
136
|
|
|
137
|
+
@blueprint.route("/cluster-bookmarks/delete/<int:id>")
|
|
138
|
+
@needs_authentication(authenticator)
|
|
139
|
+
def cluster_bookmark_delete(id: int):
|
|
140
|
+
bookmark = DB.session.get_one(ExplorerTileBookmark, id)
|
|
141
|
+
flasher.flash_message(f"Bookmark {bookmark.name} deleted.", FlashTypes.SUCCESS)
|
|
142
|
+
DB.session.delete(bookmark)
|
|
143
|
+
DB.session.commit()
|
|
144
|
+
return redirect(request.referrer)
|
|
145
|
+
|
|
137
146
|
@blueprint.route("/color-schemes", methods=["GET", "POST"])
|
|
138
147
|
@needs_authentication(authenticator)
|
|
139
148
|
def color_schemes():
|
|
@@ -175,6 +184,33 @@ def make_settings_blueprint(
|
|
|
175
184
|
color_scheme_for_heatmap_avail=MATPLOTLIB_COLOR_SCHEMES_CONTINUOUS,
|
|
176
185
|
)
|
|
177
186
|
|
|
187
|
+
@blueprint.route("/color-strategy", methods=["GET", "POST"])
|
|
188
|
+
@needs_authentication(authenticator)
|
|
189
|
+
def color_strategy():
|
|
190
|
+
if request.method == "POST":
|
|
191
|
+
config_accessor().color_strategy_max_cluster_color = request.form[
|
|
192
|
+
"color_strategy_max_cluster_color"
|
|
193
|
+
]
|
|
194
|
+
config_accessor().color_strategy_max_cluster_other_color = request.form[
|
|
195
|
+
"color_strategy_max_cluster_other_color"
|
|
196
|
+
]
|
|
197
|
+
config_accessor().color_strategy_visited_color = request.form[
|
|
198
|
+
"color_strategy_visited_color"
|
|
199
|
+
]
|
|
200
|
+
config_accessor().color_strategy_cmap_opacity = float(
|
|
201
|
+
request.form["color_strategy_cmap_opacity"]
|
|
202
|
+
)
|
|
203
|
+
config_accessor.save()
|
|
204
|
+
flash("Updated color strategy values.", category="success")
|
|
205
|
+
|
|
206
|
+
return render_template(
|
|
207
|
+
"settings/color-strategy.html.j2",
|
|
208
|
+
color_strategy_max_cluster_color=config_accessor().color_strategy_max_cluster_color,
|
|
209
|
+
color_strategy_max_cluster_other_color=config_accessor().color_strategy_max_cluster_other_color,
|
|
210
|
+
color_strategy_visited_color=config_accessor().color_strategy_visited_color,
|
|
211
|
+
color_strategy_cmap_opacity=config_accessor().color_strategy_cmap_opacity,
|
|
212
|
+
)
|
|
213
|
+
|
|
178
214
|
@blueprint.route("/manage-equipments", methods=["GET", "POST"])
|
|
179
215
|
@needs_authentication(authenticator)
|
|
180
216
|
def manage_equipments():
|
|
@@ -44,7 +44,7 @@ let overlay_maps = {
|
|
|
44
44
|
maxZoom: 19,
|
|
45
45
|
attribution: map_tile_attribution
|
|
46
46
|
}),
|
|
47
|
-
"
|
|
47
|
+
"Missing": L.tileLayer(`/explorer/${zoom}/tile/{z}/{x}/{y}.png?color_strategy=missing`, {
|
|
48
48
|
maxZoom: 19,
|
|
49
49
|
attribution: map_tile_attribution
|
|
50
50
|
}),
|
|
@@ -84,7 +84,12 @@ map.on('click', e => {
|
|
|
84
84
|
]
|
|
85
85
|
if (data.this_cluster_size) {
|
|
86
86
|
lines.push(`<dt>This cluster size</dt><dd>${data.this_cluster_size}</dd>`)
|
|
87
|
-
|
|
87
|
+
if (data.new_bookmark_url === undefined) {
|
|
88
|
+
console.error("Somehow we got a cluster that doesn't have a proper URL. This is the data that we got in response:")
|
|
89
|
+
console.error(data)
|
|
90
|
+
} else {
|
|
91
|
+
lines.push(`<dt>Bookmark</dt><dd><a href="${data.new_bookmark_url}">Create cluster bookmark</a></dd>`)
|
|
92
|
+
}
|
|
88
93
|
}
|
|
89
94
|
|
|
90
95
|
L.popup()
|
|
@@ -26,11 +26,10 @@
|
|
|
26
26
|
|
|
27
27
|
{% if bookmarks %}
|
|
28
28
|
<div class="btn-group mb-3" role="group" aria-label="Cluster bookmarks">
|
|
29
|
-
<button type="button" class="btn
|
|
30
|
-
max_cluster_size }})</button>
|
|
29
|
+
<button type="button" class="btn" onclick='centerOn({{ center.bbox | safe }})'>Biggest</button>
|
|
31
30
|
{% for bookmark in bookmarks %}
|
|
32
|
-
<button type="button" class="btn
|
|
33
|
-
|
|
31
|
+
<button type="button" class="btn" onclick='centerOn({{ bookmark.bbox | safe }})'>{{ bookmark.name
|
|
32
|
+
}}</button>
|
|
34
33
|
{% endfor %}
|
|
35
34
|
</div>
|
|
36
35
|
{% endif %}
|
|
@@ -53,11 +52,42 @@
|
|
|
53
52
|
</div>
|
|
54
53
|
</div>
|
|
55
54
|
|
|
56
|
-
<
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
<p><a href="{{ url_for('settings.color_strategy') }}">Modify color values</a>.</p>
|
|
56
|
+
|
|
57
|
+
{% if bookmarks %}
|
|
58
|
+
<h2 class="mb-3">Bookmarked cluster sizes</h2>
|
|
59
|
+
|
|
60
|
+
<table class="table mb-3">
|
|
61
|
+
<thead>
|
|
62
|
+
<tr>
|
|
63
|
+
<th>Name</th>
|
|
64
|
+
<th>Tiles</th>
|
|
65
|
+
<th>Relative to maximum</th>
|
|
66
|
+
</tr>
|
|
67
|
+
</thead>
|
|
68
|
+
<tbody>
|
|
69
|
+
<tr>
|
|
70
|
+
<td>Max Cluster</td>
|
|
71
|
+
<td>{{ max_cluster_size }}</td>
|
|
72
|
+
<td></td>
|
|
73
|
+
<td></td>
|
|
74
|
+
</tr>
|
|
75
|
+
{% for bookmark in bookmarks %}
|
|
76
|
+
<tr>
|
|
77
|
+
<td>{{ bookmark.name }}</td>
|
|
78
|
+
<td>{{ bookmark.size }}</td>
|
|
79
|
+
<td>{{ '%.1f'|format(bookmark.size / max_cluster_size * 100) }} %</td>
|
|
80
|
+
<td><a class="btn btn-danger btn-sm"
|
|
81
|
+
href="{{ url_for('settings.cluster_bookmark_delete', id=bookmark.id) }}"
|
|
82
|
+
onclick="if(!confirm('Are you sure to Delete This?')){ event.preventDefault() }">Delete</a></td>
|
|
83
|
+
</tr>
|
|
84
|
+
{% endfor %}
|
|
85
|
+
</tbody>
|
|
86
|
+
</table>
|
|
87
|
+
|
|
88
|
+
{% endif %}
|
|
89
|
+
|
|
90
|
+
<h2 class="mb-3">Tile history</h2>
|
|
61
91
|
|
|
62
92
|
<div class="row mb-3">
|
|
63
93
|
<div class="col-md-4">
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{% extends "page.html.j2" %}
|
|
2
|
+
|
|
3
|
+
{% block container %}
|
|
4
|
+
|
|
5
|
+
<h1 class="mb-3">Color Strategy Values</h1>
|
|
6
|
+
|
|
7
|
+
<form method="POST">
|
|
8
|
+
<div class="mb-3">
|
|
9
|
+
<label for="color_strategy_max_cluster_color" class="form-label">Max cluster</label>
|
|
10
|
+
<input type="color" alpha class="form-control" id="color_strategy_max_cluster_color"
|
|
11
|
+
name="color_strategy_max_cluster_color" value="{{ color_strategy_max_cluster_color }}" />
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<div class="mb-3">
|
|
15
|
+
<label for="color_strategy_max_cluster_other_color" class="form-label">Other clusters besides the maximum
|
|
16
|
+
one</label>
|
|
17
|
+
<input type="color" alpha class="form-control" id="color_strategy_max_cluster_other_color"
|
|
18
|
+
name="color_strategy_max_cluster_other_color" value="{{ color_strategy_max_cluster_other_color }}" />
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div class="mb-3">
|
|
22
|
+
<label for="color_strategy_visited_color" class="form-label">Visited tiles that are not part of a
|
|
23
|
+
cluster</label>
|
|
24
|
+
<input type="color" alpha class="form-control" id="color_strategy_visited_color"
|
|
25
|
+
name="color_strategy_visited_color" value="{{ color_strategy_visited_color }}" />
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div class="mb-3">
|
|
29
|
+
<label for="color_strategy_cmap_opacity" class="form-label">Color map opacity</label>
|
|
30
|
+
<input type="number" class="form-control" id="color_strategy_cmap_opacity" name="color_strategy_cmap_opacity"
|
|
31
|
+
value="{{ color_strategy_cmap_opacity }}" min="0.0" max="1.0" step="0.05" />
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<button type="submit" class="btn btn-primary">Save</button>
|
|
35
|
+
</form>
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
{% endblock %}
|
|
@@ -24,11 +24,20 @@
|
|
|
24
24
|
<div class="card">
|
|
25
25
|
<div class="card-body">
|
|
26
26
|
<h5 class="card-title">Color schemes</h5>
|
|
27
|
-
<p class="card-text">Don't like the colors in the plots?</p>
|
|
27
|
+
<p class="card-text">Don't like the colors in the statistics plots?</p>
|
|
28
28
|
<a href="{{ url_for('.color_schemes') }}" class="btn btn-primary">Set up color schemes</a>
|
|
29
29
|
</div>
|
|
30
30
|
</div>
|
|
31
31
|
</div>
|
|
32
|
+
<div class="col">
|
|
33
|
+
<div class="card">
|
|
34
|
+
<div class="card-body">
|
|
35
|
+
<h5 class="card-title">Color strategy</h5>
|
|
36
|
+
<p class="card-text">Don't like the cluster colors in the explorer tile map?</p>
|
|
37
|
+
<a href="{{ url_for('.color_strategy') }}" class="btn btn-primary">Modify color strategies</a>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
32
41
|
<div class="col">
|
|
33
42
|
<div class="card">
|
|
34
43
|
<div class="card-body">
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|