[feat] add user onboarding tour, remove section with direct huggingface space link
Browse files- static/package.json +1 -0
- static/pnpm-lock.yaml +9 -0
- static/src/components/PagePredictionMap.vue +24 -12
- static/src/input.css +2 -0
static/package.json
CHANGED
|
@@ -11,6 +11,7 @@
|
|
| 11 |
"type": "module",
|
| 12 |
"dependencies": {
|
| 13 |
"@geoman-io/leaflet-geoman-free": "^2.15.0",
|
|
|
|
| 14 |
"leaflet": "^1.9.4",
|
| 15 |
"leaflet-providers": "^2.0.0",
|
| 16 |
"vue": "^3.4.0"
|
|
|
|
| 11 |
"type": "module",
|
| 12 |
"dependencies": {
|
| 13 |
"@geoman-io/leaflet-geoman-free": "^2.15.0",
|
| 14 |
+
"driver.js": "github:trincadev/driver.js",
|
| 15 |
"leaflet": "^1.9.4",
|
| 16 |
"leaflet-providers": "^2.0.0",
|
| 17 |
"vue": "^3.4.0"
|
static/pnpm-lock.yaml
CHANGED
|
@@ -8,6 +8,9 @@ dependencies:
|
|
| 8 |
'@geoman-io/leaflet-geoman-free':
|
| 9 |
specifier: ^2.15.0
|
| 10 |
version: 2.15.0([email protected])
|
|
|
|
|
|
|
|
|
|
| 11 |
leaflet:
|
| 12 |
specifier: ^1.9.4
|
| 13 |
version: 1.9.4
|
|
@@ -2056,3 +2059,9 @@ packages:
|
|
| 2056 |
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
|
| 2057 |
engines: {node: '>=10'}
|
| 2058 |
dev: true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
'@geoman-io/leaflet-geoman-free':
|
| 9 |
specifier: ^2.15.0
|
| 10 |
version: 2.15.0([email protected])
|
| 11 |
+
driver.js:
|
| 12 |
+
specifier: github:trincadev/driver.js
|
| 13 |
+
version: github.com/trincadev/driver.js/7418968e80d10bc79ea1212f43e76aa5f48aed9a
|
| 14 |
leaflet:
|
| 15 |
specifier: ^1.9.4
|
| 16 |
version: 1.9.4
|
|
|
|
| 2059 |
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
|
| 2060 |
engines: {node: '>=10'}
|
| 2061 |
dev: true
|
| 2062 |
+
|
| 2063 |
+
github.com/trincadev/driver.js/7418968e80d10bc79ea1212f43e76aa5f48aed9a:
|
| 2064 |
+
resolution: {tarball: https://codeload.github.com/trincadev/driver.js/tar.gz/7418968e80d10bc79ea1212f43e76aa5f48aed9a}
|
| 2065 |
+
name: driver.js
|
| 2066 |
+
version: 1.3.1
|
| 2067 |
+
dev: false
|
static/src/components/PagePredictionMap.vue
CHANGED
|
@@ -1,17 +1,14 @@
|
|
| 1 |
<template>
|
| 2 |
-
<div class="h-auto">
|
| 3 |
|
| 4 |
<div class="grid grid-cols-1 2xl:grid-cols-5 lg:gap-1 lg:border-r ml-2 mt-2 md:ml-4 md:mr-4">
|
| 5 |
|
| 6 |
<div class="lg:border-r lg:col-span-3">
|
| 7 |
<div id="id-map-cont" class="">
|
| 8 |
-
<p
|
| 9 |
-
class="block lg:hidden"
|
| 10 |
-
v-if="currentPathnameRef.startsWith(pathnameCheckRef)"
|
| 11 |
-
>Trouble on page scrolling? Use the <a :href="embeddedSpaceRef">embedded space</a>.</p>
|
| 12 |
<p class="hidden lg:block">{{ description }}</p>
|
| 13 |
<div class="w-full md:pt-1 md:pb-1 lg:hidden portrait:xl:hidden">
|
| 14 |
<ButtonMapSendRequest
|
|
|
|
| 15 |
class="h-8 text-sm font-extralight min-w-[180px] max-w-[180px]"
|
| 16 |
:current-base-map-name="currentBaseMapNameRef"
|
| 17 |
:map="map"
|
|
@@ -25,6 +22,7 @@
|
|
| 25 |
<ButtonMapSendRequest
|
| 26 |
class="h-8 min-w-[240px] max-w-[240px] mt-2 mb-2 hidden sd:h-14 lg:block portrait:xl:block"
|
| 27 |
:current-base-map-name="currentBaseMapNameRef"
|
|
|
|
| 28 |
:map="map"
|
| 29 |
:prompts-array="promptsArrayRef"
|
| 30 |
:response-message="responseMessageRef"
|
|
@@ -36,7 +34,7 @@
|
|
| 36 |
</div>
|
| 37 |
|
| 38 |
<div class="lg:col-span-2">
|
| 39 |
-
<div class="lg:pl-2 lg:pr-2 lg:border-l lg:border-3">
|
| 40 |
|
| 41 |
<h1>Map Info</h1>
|
| 42 |
<div class="grid grid-cols-1 md:grid-cols-3">
|
|
@@ -60,7 +58,7 @@
|
|
| 60 |
</div>
|
| 61 |
</div>
|
| 62 |
|
| 63 |
-
<h1>ML request prompt</h1>
|
| 64 |
<div v-if="promptsArrayRef.filter(el => {return el.type === 'point'}).length > 0">
|
| 65 |
<TableGenericComponent
|
| 66 |
:header="['id', 'data', 'label']"
|
|
@@ -99,6 +97,7 @@ import {
|
|
| 99 |
import 'leaflet-providers'
|
| 100 |
import '@geoman-io/leaflet-geoman-free'
|
| 101 |
import { onMounted, ref, type Ref } from 'vue'
|
|
|
|
| 102 |
|
| 103 |
import {
|
| 104 |
durationRef,
|
|
@@ -109,7 +108,7 @@ import {
|
|
| 109 |
responseMessageRef,
|
| 110 |
Satellite,
|
| 111 |
waitingString
|
| 112 |
-
} from '
|
| 113 |
import {
|
| 114 |
applyFnToObjectWithinArray,
|
| 115 |
getExtentCurrentViewMapBBox,
|
|
@@ -123,13 +122,25 @@ import StatsGrid from '@/components/StatsGrid.vue';
|
|
| 123 |
import TableGenericComponent from '@/components/TableGenericComponent.vue';
|
| 124 |
import ButtonMapSendRequest from '@/components/buttons/ButtonMapSendRequest.vue';
|
| 125 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
const currentBaseMapNameRef = ref("")
|
| 127 |
const currentMapBBoxRef = ref()
|
| 128 |
const currentZoomRef = ref()
|
| 129 |
const promptsArrayRef: Ref<Array<IPointPrompt | IRectanglePrompt>> = ref([])
|
| 130 |
-
const pathnameCheckRef = ref(import.meta.env.VITE__PATHNAME_CHECK || "")
|
| 131 |
-
const currentPathnameRef = ref("current-pathname-placeholder")
|
| 132 |
-
const embeddedSpaceRef = ref(import.meta.env.VITE__SAMGIS_SPACE || "")
|
| 133 |
let map: LMap
|
| 134 |
type ServiceTiles = {
|
| 135 |
[key: SourceTileType]: LTileLayer;
|
|
@@ -195,7 +206,6 @@ const getCurrentBasemap = (url: string, providersArray: ServiceTiles) => {
|
|
| 195 |
}
|
| 196 |
|
| 197 |
onMounted(async () => {
|
| 198 |
-
currentPathnameRef.value = window.location.pathname || ""
|
| 199 |
const osmTile = tileLayer.provider(OpenStreetMap)
|
| 200 |
let localVarSatellite: SourceTileType = import.meta.env.VITE_SATELLITE_NAME ? String(import.meta.env.VITE_SATELLITE_NAME) : Satellite
|
| 201 |
const satelliteTile = tileLayer.provider(localVarSatellite)
|
|
@@ -227,6 +237,8 @@ onMounted(async () => {
|
|
| 227 |
map.on('baselayerchange', (e: LEvented) => {
|
| 228 |
currentBaseMapNameRef.value = getCurrentBasemap(e.layer._url, baseMaps)
|
| 229 |
})
|
|
|
|
|
|
|
| 230 |
})
|
| 231 |
</script>
|
| 232 |
|
|
|
|
| 1 |
<template>
|
| 2 |
+
<div class="h-auto" id="id-prediction-map-container">
|
| 3 |
|
| 4 |
<div class="grid grid-cols-1 2xl:grid-cols-5 lg:gap-1 lg:border-r ml-2 mt-2 md:ml-4 md:mr-4">
|
| 5 |
|
| 6 |
<div class="lg:border-r lg:col-span-3">
|
| 7 |
<div id="id-map-cont" class="">
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
<p class="hidden lg:block">{{ description }}</p>
|
| 9 |
<div class="w-full md:pt-1 md:pb-1 lg:hidden portrait:xl:hidden">
|
| 10 |
<ButtonMapSendRequest
|
| 11 |
+
id="id-button-submit"
|
| 12 |
class="h-8 text-sm font-extralight min-w-[180px] max-w-[180px]"
|
| 13 |
:current-base-map-name="currentBaseMapNameRef"
|
| 14 |
:map="map"
|
|
|
|
| 22 |
<ButtonMapSendRequest
|
| 23 |
class="h-8 min-w-[240px] max-w-[240px] mt-2 mb-2 hidden sd:h-14 lg:block portrait:xl:block"
|
| 24 |
:current-base-map-name="currentBaseMapNameRef"
|
| 25 |
+
id="id-button-submit"
|
| 26 |
:map="map"
|
| 27 |
:prompts-array="promptsArrayRef"
|
| 28 |
:response-message="responseMessageRef"
|
|
|
|
| 34 |
</div>
|
| 35 |
|
| 36 |
<div class="lg:col-span-2">
|
| 37 |
+
<div class="lg:pl-2 lg:pr-2 lg:border-l lg:border-3" id="id-map-info">
|
| 38 |
|
| 39 |
<h1>Map Info</h1>
|
| 40 |
<div class="grid grid-cols-1 md:grid-cols-3">
|
|
|
|
| 58 |
</div>
|
| 59 |
</div>
|
| 60 |
|
| 61 |
+
<h1 id="id-ml-request-prompt">ML request prompt</h1>
|
| 62 |
<div v-if="promptsArrayRef.filter(el => {return el.type === 'point'}).length > 0">
|
| 63 |
<TableGenericComponent
|
| 64 |
:header="['id', 'data', 'label']"
|
|
|
|
| 97 |
import 'leaflet-providers'
|
| 98 |
import '@geoman-io/leaflet-geoman-free'
|
| 99 |
import { onMounted, ref, type Ref } from 'vue'
|
| 100 |
+
import { driver } from "../../node_modules/driver.js/src/driver"
|
| 101 |
|
| 102 |
import {
|
| 103 |
durationRef,
|
|
|
|
| 108 |
responseMessageRef,
|
| 109 |
Satellite,
|
| 110 |
waitingString
|
| 111 |
+
} from './constants'
|
| 112 |
import {
|
| 113 |
applyFnToObjectWithinArray,
|
| 114 |
getExtentCurrentViewMapBBox,
|
|
|
|
| 122 |
import TableGenericComponent from '@/components/TableGenericComponent.vue';
|
| 123 |
import ButtonMapSendRequest from '@/components/buttons/ButtonMapSendRequest.vue';
|
| 124 |
|
| 125 |
+
const driverObj = driver({
|
| 126 |
+
showProgress: true,
|
| 127 |
+
steps: [
|
| 128 |
+
{ element: 'id-prediction-map-container', popover: { title: 'SamGIS', description: 'A quick tour about SamGIS functionality' } },
|
| 129 |
+
{ element: '#map', popover: { title: 'Webmap for ML prompt', description: 'Add here your machine learning prompt' } },
|
| 130 |
+
{ element: '.leaflet-pm-icon-marker-include', popover: { title: '"Include" point prompt', description: 'add "include" points prompt for machine learning request' } },
|
| 131 |
+
{ element: '.leaflet-pm-icon-marker-exclude', popover: { title: '"Exclude" point prompt', description: 'add "exclude" points prompt for machine learning request' } },
|
| 132 |
+
{ element: '.leaflet-pm-icon-rectangle', popover: { title: '"Include" rectangle prompt', description: 'add "include" rectangles prompt for machine learning request' } },
|
| 133 |
+
{ element: "#id-button-submit", popover: { title: 'ML submit button', description: 'Machine learning submit button' } },
|
| 134 |
+
{ element: '.leaflet-control-layers-toggle', popover: { title: 'Map provider selector', description: 'select a different map provider' } },
|
| 135 |
+
{ element: '#id-map-info', popover: { title: 'map info', description: 'Section about various map info' } },
|
| 136 |
+
{ element: '#id-ml-request-prompt', popover: { title: 'ML prompt quest', description: 'Empty at beginning, this table will contain the machine learning prompt (points and rectangles) section' } }
|
| 137 |
+
]
|
| 138 |
+
});
|
| 139 |
+
|
| 140 |
const currentBaseMapNameRef = ref("")
|
| 141 |
const currentMapBBoxRef = ref()
|
| 142 |
const currentZoomRef = ref()
|
| 143 |
const promptsArrayRef: Ref<Array<IPointPrompt | IRectanglePrompt>> = ref([])
|
|
|
|
|
|
|
|
|
|
| 144 |
let map: LMap
|
| 145 |
type ServiceTiles = {
|
| 146 |
[key: SourceTileType]: LTileLayer;
|
|
|
|
| 206 |
}
|
| 207 |
|
| 208 |
onMounted(async () => {
|
|
|
|
| 209 |
const osmTile = tileLayer.provider(OpenStreetMap)
|
| 210 |
let localVarSatellite: SourceTileType = import.meta.env.VITE_SATELLITE_NAME ? String(import.meta.env.VITE_SATELLITE_NAME) : Satellite
|
| 211 |
const satelliteTile = tileLayer.provider(localVarSatellite)
|
|
|
|
| 237 |
map.on('baselayerchange', (e: LEvented) => {
|
| 238 |
currentBaseMapNameRef.value = getCurrentBasemap(e.layer._url, baseMaps)
|
| 239 |
})
|
| 240 |
+
|
| 241 |
+
driverObj.drive();
|
| 242 |
})
|
| 243 |
</script>
|
| 244 |
|
static/src/input.css
CHANGED
|
@@ -1,6 +1,8 @@
|
|
| 1 |
@import "leaflet/dist/leaflet.css";
|
| 2 |
@import "leaflet-custom.css";
|
| 3 |
@import "@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css";
|
|
|
|
|
|
|
| 4 |
@tailwind base;
|
| 5 |
|
| 6 |
@layer base {
|
|
|
|
| 1 |
@import "leaflet/dist/leaflet.css";
|
| 2 |
@import "leaflet-custom.css";
|
| 3 |
@import "@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css";
|
| 4 |
+
@import "../node_modules/driver.js/src/driver.css";
|
| 5 |
+
|
| 6 |
@tailwind base;
|
| 7 |
|
| 8 |
@layer base {
|