From a0f743b43232c3f6ae4675910b9500a5655cab93 Mon Sep 17 00:00:00 2001 From: Will Freeman Date: Thu, 12 Dec 2024 13:19:50 -0700 Subject: [PATCH 01/18] better map markers --- webapp/package-lock.json | 50 +++++++++++++++++++++ webapp/package.json | 2 + webapp/public/map-icon.svg | 10 +++++ webapp/src/components/DFMapMarker.vue | 63 ++++++--------------------- webapp/src/components/DFMapPopup.vue | 8 +++- 5 files changed, 82 insertions(+), 51 deletions(-) create mode 100644 webapp/public/map-icon.svg diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 1b9e9de..71f74d1 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -17,6 +17,7 @@ "devDependencies": { "@mdi/font": "^7.4.47", "@tsconfig/node20": "^20.1.4", + "@types/leaflet": "^1.9.15", "@types/node": "^20.14.5", "@vitejs/plugin-vue": "^5.0.5", "@vue-leaflet/vue-leaflet": "^0.10.1", @@ -25,6 +26,7 @@ "npm-run-all2": "^6.2.0", "typescript": "~5.4.0", "vite": "^5.3.1", + "vue-leaflet-rotate-marker": "^0.1.0", "vue-tsc": "^2.0.21" } }, @@ -669,6 +671,21 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/geojson": { + "version": "7946.0.15", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", + "dev": true + }, + "node_modules/@types/leaflet": { + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.15.tgz", + "integrity": "sha512-7UuggAuAs+mva66gtf2OTB1nEhzU/9JED93TIaOEgvFMvG/dIGQaukHE7izHo1Zd+Ko1L4ETUw7TBc8yUxevpg==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, "node_modules/@types/node": { "version": "20.16.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.6.tgz", @@ -1472,6 +1489,15 @@ } } }, + "node_modules/vue-leaflet-rotate-marker": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vue-leaflet-rotate-marker/-/vue-leaflet-rotate-marker-0.1.0.tgz", + "integrity": "sha512-qBrb/ydvl+cuQSZ3cinH2G0nmFNglh5h9qVIFRAlrcjCNqZE1RIEHxwjvxA0CCxdlNFxGeeZy0RFrkdSqNToeg==", + "dev": true, + "dependencies": { + "vue": "^3.3.4" + } + }, "node_modules/vue-router": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", @@ -1872,6 +1898,21 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "@types/geojson": { + "version": "7946.0.15", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", + "dev": true + }, + "@types/leaflet": { + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.15.tgz", + "integrity": "sha512-7UuggAuAs+mva66gtf2OTB1nEhzU/9JED93TIaOEgvFMvG/dIGQaukHE7izHo1Zd+Ko1L4ETUw7TBc8yUxevpg==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, "@types/node": { "version": "20.16.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.6.tgz", @@ -2433,6 +2474,15 @@ "@vue/shared": "3.5.8" } }, + "vue-leaflet-rotate-marker": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vue-leaflet-rotate-marker/-/vue-leaflet-rotate-marker-0.1.0.tgz", + "integrity": "sha512-qBrb/ydvl+cuQSZ3cinH2G0nmFNglh5h9qVIFRAlrcjCNqZE1RIEHxwjvxA0CCxdlNFxGeeZy0RFrkdSqNToeg==", + "dev": true, + "requires": { + "vue": "^3.3.4" + } + }, "vue-router": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", diff --git a/webapp/package.json b/webapp/package.json index c48f62f..490777b 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -20,6 +20,7 @@ "devDependencies": { "@mdi/font": "^7.4.47", "@tsconfig/node20": "^20.1.4", + "@types/leaflet": "^1.9.15", "@types/node": "^20.14.5", "@vitejs/plugin-vue": "^5.0.5", "@vue-leaflet/vue-leaflet": "^0.10.1", @@ -28,6 +29,7 @@ "npm-run-all2": "^6.2.0", "typescript": "~5.4.0", "vite": "^5.3.1", + "vue-leaflet-rotate-marker": "^0.1.0", "vue-tsc": "^2.0.21" } } diff --git a/webapp/public/map-icon.svg b/webapp/public/map-icon.svg new file mode 100644 index 0000000..213d7b5 --- /dev/null +++ b/webapp/public/map-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/webapp/src/components/DFMapMarker.vue b/webapp/src/components/DFMapMarker.vue index eb2f991..4d620b1 100644 --- a/webapp/src/components/DFMapMarker.vue +++ b/webapp/src/components/DFMapMarker.vue @@ -1,28 +1,25 @@ diff --git a/webapp/src/components/DFMapPopup.vue b/webapp/src/components/DFMapPopup.vue index aa98f60..0fbb382 100644 --- a/webapp/src/components/DFMapPopup.vue +++ b/webapp/src/components/DFMapPopup.vue @@ -5,13 +5,13 @@ mdi-face-recognition Face Recognition - mdi-car License Plate + mdi-cctv License Plate Reader mdi-adjust Omnidirectional - mdi-cctv Directional {{ alpr.tags.direction ? `(${degreesToCardinal(parseInt(alpr.tags.direction))})` : '' }} + mdi-compass-outline {{ cardinalDirection }} mdi-domain @@ -75,6 +75,10 @@ const kvTags = computed(() => { .map(([key, value]) => ({ key, value: valueTransformations[key]?.(value) ?? value })); }); +const cardinalDirection = computed(() => + props.alpr.tags.direction === undefined ? 'Unknown' : degreesToCardinal(parseInt(props.alpr.tags.direction)) +); + function degreesToCardinal(degrees: number): string { const cardinals = ['North', 'Northeast', 'East', 'Southeast', 'South', 'Southwest', 'West', 'Northwest']; return cardinals[Math.round(degrees / 45) % 8]; From dfd8f397649b18aad720ee051047ad2815bf09a0 Mon Sep 17 00:00:00 2001 From: Will Freeman Date: Thu, 12 Dec 2024 14:28:40 -0700 Subject: [PATCH 02/18] remove analytics --- webapp/index.html | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/webapp/index.html b/webapp/index.html index c80d13d..ca14df7 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -14,16 +14,6 @@ DeFlock - ALPR Database -
From 572149e79782ceb70fe0f67c4a2aa2007f066d0c Mon Sep 17 00:00:00 2001 From: Will Freeman Date: Sun, 22 Dec 2024 17:47:07 -0800 Subject: [PATCH 03/18] rotate icons, transparent area not clickable --- webapp/package-lock.json | 93 +++++------- webapp/package.json | 4 +- webapp/src/components/DFMapMarker.vue | 40 ----- webapp/src/components/DFMapPopup.vue | 1 + webapp/src/components/LeafletMap.vue | 211 ++++++++++++++++++++++++++ webapp/src/views/Map.vue | 67 ++------ 6 files changed, 260 insertions(+), 156 deletions(-) delete mode 100644 webapp/src/components/DFMapMarker.vue create mode 100644 webapp/src/components/LeafletMap.vue diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 71f74d1..4a20603 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -8,8 +8,10 @@ "name": "deflock", "version": "0.0.0", "dependencies": { + "@types/leaflet.markercluster": "^1.5.5", "axios": "^1.7.7", "countup.js": "^2.8.0", + "leaflet.markercluster": "^1.5.3", "vue": "^3.4.29", "vue-router": "^4.3.3", "vuetify": "^3.7.2" @@ -20,13 +22,11 @@ "@types/leaflet": "^1.9.15", "@types/node": "^20.14.5", "@vitejs/plugin-vue": "^5.0.5", - "@vue-leaflet/vue-leaflet": "^0.10.1", "@vue/tsconfig": "^0.5.1", "leaflet": "^1.9.4", "npm-run-all2": "^6.2.0", "typescript": "~5.4.0", "vite": "^5.3.1", - "vue-leaflet-rotate-marker": "^0.1.0", "vue-tsc": "^2.0.21" } }, @@ -674,18 +674,24 @@ "node_modules/@types/geojson": { "version": "7946.0.15", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", - "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", - "dev": true + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==" }, "node_modules/@types/leaflet": { "version": "1.9.15", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.15.tgz", "integrity": "sha512-7UuggAuAs+mva66gtf2OTB1nEhzU/9JED93TIaOEgvFMvG/dIGQaukHE7izHo1Zd+Ko1L4ETUw7TBc8yUxevpg==", - "dev": true, "dependencies": { "@types/geojson": "*" } }, + "node_modules/@types/leaflet.markercluster": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.5.tgz", + "integrity": "sha512-TkWOhSHDM1ANxmLi+uK0PjsVcjIKBr8CLV2WoF16dIdeFmC0Cj5P5axkI3C1Xsi4+ht6EU8+BfEbbqEF9icPrg==", + "dependencies": { + "@types/leaflet": "*" + } + }, "node_modules/@types/node": { "version": "20.16.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.6.tgz", @@ -734,24 +740,6 @@ "vscode-uri": "^3.0.8" } }, - "node_modules/@vue-leaflet/vue-leaflet": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@vue-leaflet/vue-leaflet/-/vue-leaflet-0.10.1.tgz", - "integrity": "sha512-RNEDk8TbnwrJl8ujdbKgZRFygLCxd0aBcWLQ05q/pGv4+d0jamE3KXQgQBqGAteE1mbQsk3xoNcqqUgaIGfWVg==", - "dev": true, - "dependencies": { - "vue": "^3.2.25" - }, - "peerDependencies": { - "@types/leaflet": "^1.5.7", - "leaflet": "^1.6.0" - }, - "peerDependenciesMeta": { - "@types/leaflet": { - "optional": true - } - } - }, "node_modules/@vue/compiler-core": { "version": "3.5.8", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.8.tgz", @@ -1112,8 +1100,15 @@ "node_modules/leaflet": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", - "dev": true + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + }, + "node_modules/leaflet.markercluster": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", + "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", + "peerDependencies": { + "leaflet": "^1.3.1" + } }, "node_modules/magic-string": { "version": "0.30.11", @@ -1489,15 +1484,6 @@ } } }, - "node_modules/vue-leaflet-rotate-marker": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vue-leaflet-rotate-marker/-/vue-leaflet-rotate-marker-0.1.0.tgz", - "integrity": "sha512-qBrb/ydvl+cuQSZ3cinH2G0nmFNglh5h9qVIFRAlrcjCNqZE1RIEHxwjvxA0CCxdlNFxGeeZy0RFrkdSqNToeg==", - "dev": true, - "dependencies": { - "vue": "^3.3.4" - } - }, "node_modules/vue-router": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", @@ -1901,18 +1887,24 @@ "@types/geojson": { "version": "7946.0.15", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", - "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", - "dev": true + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==" }, "@types/leaflet": { "version": "1.9.15", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.15.tgz", "integrity": "sha512-7UuggAuAs+mva66gtf2OTB1nEhzU/9JED93TIaOEgvFMvG/dIGQaukHE7izHo1Zd+Ko1L4ETUw7TBc8yUxevpg==", - "dev": true, "requires": { "@types/geojson": "*" } }, + "@types/leaflet.markercluster": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.5.tgz", + "integrity": "sha512-TkWOhSHDM1ANxmLi+uK0PjsVcjIKBr8CLV2WoF16dIdeFmC0Cj5P5axkI3C1Xsi4+ht6EU8+BfEbbqEF9icPrg==", + "requires": { + "@types/leaflet": "*" + } + }, "@types/node": { "version": "20.16.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.6.tgz", @@ -1955,15 +1947,6 @@ "vscode-uri": "^3.0.8" } }, - "@vue-leaflet/vue-leaflet": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@vue-leaflet/vue-leaflet/-/vue-leaflet-0.10.1.tgz", - "integrity": "sha512-RNEDk8TbnwrJl8ujdbKgZRFygLCxd0aBcWLQ05q/pGv4+d0jamE3KXQgQBqGAteE1mbQsk3xoNcqqUgaIGfWVg==", - "dev": true, - "requires": { - "vue": "^3.2.25" - } - }, "@vue/compiler-core": { "version": "3.5.8", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.8.tgz", @@ -2255,8 +2238,13 @@ "leaflet": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", - "dev": true + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + }, + "leaflet.markercluster": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", + "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", + "requires": {} }, "magic-string": { "version": "0.30.11", @@ -2474,15 +2462,6 @@ "@vue/shared": "3.5.8" } }, - "vue-leaflet-rotate-marker": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vue-leaflet-rotate-marker/-/vue-leaflet-rotate-marker-0.1.0.tgz", - "integrity": "sha512-qBrb/ydvl+cuQSZ3cinH2G0nmFNglh5h9qVIFRAlrcjCNqZE1RIEHxwjvxA0CCxdlNFxGeeZy0RFrkdSqNToeg==", - "dev": true, - "requires": { - "vue": "^3.3.4" - } - }, "vue-router": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", diff --git a/webapp/package.json b/webapp/package.json index 490777b..cc7795e 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -11,8 +11,10 @@ "type-check": "vue-tsc --build --force" }, "dependencies": { + "@types/leaflet.markercluster": "^1.5.5", "axios": "^1.7.7", "countup.js": "^2.8.0", + "leaflet.markercluster": "^1.5.3", "vue": "^3.4.29", "vue-router": "^4.3.3", "vuetify": "^3.7.2" @@ -23,13 +25,11 @@ "@types/leaflet": "^1.9.15", "@types/node": "^20.14.5", "@vitejs/plugin-vue": "^5.0.5", - "@vue-leaflet/vue-leaflet": "^0.10.1", "@vue/tsconfig": "^0.5.1", "leaflet": "^1.9.4", "npm-run-all2": "^6.2.0", "typescript": "~5.4.0", "vite": "^5.3.1", - "vue-leaflet-rotate-marker": "^0.1.0", "vue-tsc": "^2.0.21" } } diff --git a/webapp/src/components/DFMapMarker.vue b/webapp/src/components/DFMapMarker.vue deleted file mode 100644 index 4d620b1..0000000 --- a/webapp/src/components/DFMapMarker.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - diff --git a/webapp/src/components/DFMapPopup.vue b/webapp/src/components/DFMapPopup.vue index 0fbb382..ae26bb5 100644 --- a/webapp/src/components/DFMapPopup.vue +++ b/webapp/src/components/DFMapPopup.vue @@ -52,6 +52,7 @@ import { defineProps, computed } from 'vue'; import type { PropType } from 'vue'; import type { ALPR } from '@/types'; +import { VIcon, VList, VSheet, VListItem } from 'vuetify/components'; const props = defineProps({ alpr: { diff --git a/webapp/src/components/LeafletMap.vue b/webapp/src/components/LeafletMap.vue new file mode 100644 index 0000000..bbf15e3 --- /dev/null +++ b/webapp/src/components/LeafletMap.vue @@ -0,0 +1,211 @@ + + + + + + + diff --git a/webapp/src/views/Map.vue b/webapp/src/views/Map.vue index b4b1d67..15912d5 100644 --- a/webapp/src/views/Map.vue +++ b/webapp/src/views/Map.vue @@ -7,59 +7,13 @@ - - -
- - - -
-
- - - - - - - mdi-crosshairs-gps - - - - - -
-
+ /> +
Loading Map
@@ -77,9 +31,12 @@ import type { Cluster } from '@/services/apiService'; import { getALPRs, geocodeQuery, getClusters } from '@/services/apiService'; import { useDisplay, useTheme } from 'vuetify'; import DFMapMarker from '@/components/DFMapMarker.vue'; -import DFMarkerCluster from '@/components/DFMarkerCluster.vue'; -import NewVisitor from '@/components/NewVisitor.vue'; import type { ALPR } from '@/types'; +import L from 'leaflet'; +globalThis.L = L; +import 'leaflet/dist/leaflet.css' +import 'vue-leaflet-markercluster/dist/style.css' +import LeafletMap from '@/components/LeafletMap.vue'; const DEFAULT_ZOOM = 12; const MIN_ZOOM_FOR_REFRESH = 4; @@ -167,10 +124,6 @@ function getUserLocation(): Promise<[number, number]> { }); }; -function mapLoaded(map: any) { - updateBounds(map.getBounds()); -} - function updateBounds(newBounds: any) { updateURL(); @@ -187,7 +140,7 @@ function updateBounds(newBounds: any) { return; } - updateMarkers(); + // updateMarkers(); } function updateURL() { From 53db8673854b10211d8e1045ccb83db3bc37f421 Mon Sep 17 00:00:00 2001 From: Will Freeman Date: Sun, 22 Dec 2024 20:14:41 -0800 Subject: [PATCH 04/18] cleanup, restore buttons, show current location --- webapp/src/components/LeafletMap.vue | 81 ++++++++++++++++++++---- webapp/src/components/NewVisitor.vue | 92 ---------------------------- webapp/src/views/Map.vue | 51 ++++++++++++--- 3 files changed, 110 insertions(+), 114 deletions(-) delete mode 100644 webapp/src/components/NewVisitor.vue diff --git a/webapp/src/components/LeafletMap.vue b/webapp/src/components/LeafletMap.vue index bbf15e3..c7d4cf7 100644 --- a/webapp/src/components/LeafletMap.vue +++ b/webapp/src/components/LeafletMap.vue @@ -1,10 +1,18 @@ - - diff --git a/webapp/src/views/Map.vue b/webapp/src/views/Map.vue index 15912d5..a753dac 100644 --- a/webapp/src/views/Map.vue +++ b/webapp/src/views/Map.vue @@ -1,18 +1,47 @@ + + diff --git a/webapp/src/views/ReportView.vue b/webapp/src/views/ReportView.vue index c2d6737..c994bc5 100644 --- a/webapp/src/views/ReportView.vue +++ b/webapp/src/views/ReportView.vue @@ -1,31 +1,11 @@ diff --git a/webapp/src/views/TermsOfService.vue b/webapp/src/views/TermsOfService.vue new file mode 100644 index 0000000..a643e10 --- /dev/null +++ b/webapp/src/views/TermsOfService.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/webapp/src/views/WhatIsAnALPRView.vue b/webapp/src/views/WhatIsAnALPRView.vue index a5b481b..6ec28e7 100644 --- a/webapp/src/views/WhatIsAnALPRView.vue +++ b/webapp/src/views/WhatIsAnALPRView.vue @@ -63,11 +63,14 @@
+ +