Skip to content

Commit 9e271a9

Browse files
authored
Merge pull request #80 from mapswipe/street-panoramax
Add Panoramax as image provider in View Streets projects
2 parents 910911a + bf77ad2 commit 9e271a9

File tree

7 files changed

+330
-10
lines changed

7 files changed

+330
-10
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
},
1919
"dependencies": {
2020
"@intlify/unplugin-vue-i18n": "^6.0.8",
21+
"@panoramax/web-viewer": "^4.1.0",
2122
"@togglecorp/fujs": "^2.2.0",
2223
"@turf/bbox": "^7.2.0",
2324
"base-64": "^1.0.0",

src/components/StreetProject.vue

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import createInformationPages from '@/utils/createInformationPages'
33
import StreetProjectTask from './StreetProjectTask.vue'
4+
import StreetProjectTaskPanoramax from './StreetProjectTaskPanoramax.vue'
45
import StreetProjectTutorial from '@/components/StreetProjectTutorial.vue'
56
import OptionButtons from './OptionButtons.vue'
67
import ProjectHeader from './ProjectHeader.vue'
@@ -14,6 +15,7 @@ export default defineComponent({
1415
components: {
1516
streetProjectInstructions: StreetProjectInstructions,
1617
streetProjectTask: StreetProjectTask,
18+
streetProjectTaskPanoramax: StreetProjectTaskPanoramax,
1719
streetProjectTutorial: StreetProjectTutorial,
1820
optionButtons: OptionButtons,
1921
projectHeader: ProjectHeader,
@@ -93,6 +95,7 @@ export default defineComponent({
9395
saveResults: 'saveResults',
9496
showSnackbar: 'showSnackbar',
9597
},
98+
emits: ['created'],
9699
computed: {
97100
mission() {
98101
const message = isDefined(this.project.projectInstruction)
@@ -131,7 +134,6 @@ export default defineComponent({
131134
this.errorLoading = true
132135
this.addResult(null)
133136
this.showSnackbar(this.$t('streetProject.couldNotLoadImage'), 'error', 1200)
134-
this.forward()
135137
},
136138
isAnswered() {
137139
const result = this.results[this.taskId]
@@ -170,10 +172,19 @@ export default defineComponent({
170172
</template>
171173
</project-info>
172174
</project-header>
175+
<street-project-task-panoramax
176+
v-if="project.tileServer?.name == 'panoramax'"
177+
:taskId="taskId"
178+
:endpoint="project.tileServer?.url"
179+
@dataloading="(e) => (isLoading = e)"
180+
@imageError="handleImageError()"
181+
style="position: relative; height: calc(100vh - 390px)"
182+
/>
173183
<street-project-task
184+
v-else
174185
:taskId="taskId"
175186
@dataloading="(e) => (isLoading = e.loading)"
176-
@imageError="handleImageError(taskId)"
187+
@imageError="handleImageError()"
177188
style="position: relative; height: calc(100vh - 390px)"
178189
/>
179190
<option-buttons

src/components/StreetProjectTask.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ export default defineComponent({
1414
containerId: {
1515
type: String,
1616
default: 'mapillary',
17-
required: true,
1817
},
1918
taskId: {
2019
type: String,
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<script lang="ts">
2+
import { defineComponent } from 'vue'
3+
import '@panoramax/web-viewer/build/index.css'
4+
import '@panoramax/web-viewer'
5+
6+
export default defineComponent({
7+
props: {
8+
containerId: {
9+
type: String,
10+
default: 'panoramax',
11+
},
12+
taskId: { type: String, required: true },
13+
endpoint: { type: String, default: 'https://api.panoramax.xyz/api' },
14+
},
15+
data() {
16+
return {
17+
viewer: null as HTMLElement | null,
18+
}
19+
},
20+
watch: {
21+
taskId(newTaskId) {
22+
this.moveViewer(newTaskId)
23+
},
24+
},
25+
methods: {
26+
initialiseViewer() {
27+
this.viewer = this.$refs.viewer as HTMLElement
28+
this.viewer.addEventListener('ready', () => {
29+
this.removeArrows()
30+
})
31+
this.viewer.addEventListener('psv:picture-loading', () => {
32+
this.$emit('dataloading', true)
33+
})
34+
this.viewer.addEventListener('psv:picture-loaded', () => {
35+
this.$emit('dataloading', false)
36+
})
37+
this.viewer.addEventListener('broken', () => {
38+
this.$emit('imageError', this.taskId)
39+
})
40+
},
41+
moveViewer(pictureId) {
42+
this.viewer.select(undefined, pictureId, true)
43+
},
44+
removeArrows() {
45+
const arrows = this.viewer.querySelector('.psv-virtual-tour-arrows')
46+
if (arrows) arrows.remove()
47+
},
48+
},
49+
mounted() {
50+
this.initialiseViewer()
51+
this.moveViewer(this.taskId)
52+
},
53+
})
54+
</script>
55+
56+
<template>
57+
<v-container :id="`${containerId}`" class="ma-0 pa-0">
58+
<pnx-photo-viewer
59+
ref="viewer"
60+
:endpoint="endpoint"
61+
widgets="false"
62+
url-parameters="false"
63+
keyboard-shortcuts="false"
64+
/>
65+
</v-container>
66+
</template>
67+
68+
<style scoped></style>

src/components/StreetProjectTutorial.vue

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import matchIcon from '@/utils/matchIcon'
44
import OptionButtons from '@/components/OptionButtons.vue'
55
import TaskProgress from '@/components/TaskProgress.vue'
66
import StreetProjectTask from '@/components/StreetProjectTask.vue'
7+
import StreetProjectTaskPanoramax from '@/components/StreetProjectTaskPanoramax.vue'
78
import TutorialCompletionCard from './TutorialCompletionCard.vue'
89
import { isDefined } from '@/utils/common'
910
@@ -42,6 +43,7 @@ interface Tutorial {
4243
export default defineComponent({
4344
components: {
4445
StreetProjectTask,
46+
StreetProjectTaskPanoramax,
4547
OptionButtons,
4648
TaskProgress,
4749
TutorialCompletionCard,
@@ -215,8 +217,17 @@ export default defineComponent({
215217
</v-row>
216218
<v-row justify="center">
217219
<v-col>
220+
<street-project-task-panoramax
221+
v-if="taskId && tutorial && tutorial.tileServer?.name == 'panoramax'"
222+
:key="taskId"
223+
:taskId="taskId"
224+
:endpoint="tutorial.tileServer?.url"
225+
:containerId="'panoramax_tutorial'"
226+
@dataloading="(e) => (isLoading = e)"
227+
style="position: relative; height: calc(70vh - 390px)"
228+
/>
218229
<street-project-task
219-
v-if="taskId && tutorial"
230+
v-else-if="taskId && tutorial"
220231
:key="taskId"
221232
:taskId="taskId"
222233
:containerId="'mapillary_tutorial'"

vite.config.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@ export default defineConfig({
1111
base: './',
1212
plugins: [
1313
ValidateEnv(),
14-
vue(),
14+
vue({
15+
template: {
16+
compilerOptions: {
17+
// Treat pnx-* as custom elements (prevents warnings)
18+
isCustomElement: (tag) => tag.startsWith('pnx-')
19+
}
20+
}
21+
}),
1522
vueJsx(),
1623
VueI18nPlugin({
1724
runtimeOnly: false,

0 commit comments

Comments
 (0)