From 7ba77a9da782d9cbd611e614b00b9c08f4c340bb Mon Sep 17 00:00:00 2001 From: ofritz Date: Thu, 19 Mar 2026 17:06:32 +0100 Subject: [PATCH 01/10] feat(street): add street image provider enum and panoramax custom URL support - Expose StreetImageProviderNameEnum from backend via GraphQL and consume it in EnumsContext, replacing the hardcoded frontend enum - Remove StreetImageProviderInput/constants.ts (UI enum no longer needed) - Add PANORAMAX_CUSTOM provider option with required URL field - Rename isPano to panoOnly for semantic clarity; move filtering logic to backend (only filters when true) - Simplify StreetImageProviderInput and StreetMapillaryImageFiltersInput by removing unnecessary callback wrappers - Add Panoramax image preview component - Add user-friendly error message when image provider URL is unreachable --- .../PanoramaxImagePreview/index.tsx | 59 ++++ .../PanoramaxImagePreview/styles.module.css | 3 + .../StreetDetails/index.tsx | 23 +- .../domain/StreetImageProviderInput/index.tsx | 101 ++++++ .../domain/StreetImageProviderInput/schema.ts | 61 ++++ .../domain/StreetScenarioPreview/index.tsx | 26 +- app/contexts/EnumsContext.ts | 7 + app/utils/query.ts | 6 +- .../index.tsx | 18 +- .../schema.ts | 3 +- .../StreetProjectSpecifics/index.tsx | 17 + .../StreetProjectSpecifics/schema.ts | 3 + .../EditProject/UpdateProjectForm/index.tsx | 3 +- app/views/EditProject/query.ts | 7 + .../TaskInput/StreetPropertyInput/index.tsx | 2 +- .../EditTutorial/ScenarioPageInput/index.tsx | 1 + app/views/RootLayout/index.tsx | 9 + backend | 2 +- package.json | 1 + pnpm-lock.yaml | 291 ++++++++++++++++++ 20 files changed, 619 insertions(+), 24 deletions(-) create mode 100644 app/components/PanoramaxImagePreview/index.tsx create mode 100644 app/components/PanoramaxImagePreview/styles.module.css create mode 100644 app/components/domain/StreetImageProviderInput/index.tsx create mode 100644 app/components/domain/StreetImageProviderInput/schema.ts diff --git a/app/components/PanoramaxImagePreview/index.tsx b/app/components/PanoramaxImagePreview/index.tsx new file mode 100644 index 00000000..773bab75 --- /dev/null +++ b/app/components/PanoramaxImagePreview/index.tsx @@ -0,0 +1,59 @@ +import '@panoramax/web-viewer/build/index.css'; +import '@panoramax/web-viewer'; + +import { + useEffect, + useMemo, + useRef, +} from 'react'; +import { + _cs, + isDefined, +} from '@togglecorp/fujs'; + +import styles from './styles.module.css'; + +interface Props { + className?: string; + imageId: string | undefined; + url?: string | undefined | null; +} + +const DEFAULT_ENDPOINT = 'https://api.panoramax.xyz/api'; + +function PanoramaxImagePreview({ className, imageId, url }: Props) { + const containerRef = useRef(null); + const endpoint = useMemo(() => { + if (!url) return DEFAULT_ENDPOINT; + return url.includes('mapcomplete') ? DEFAULT_ENDPOINT : `${url.replace(/\/+$/, '')}/api`; + }, [url]); + + useEffect(() => { + const container = containerRef.current; + if (!container || !isDefined(imageId)) return () => {}; + const viewer = document.createElement('pnx-photo-viewer'); + viewer.setAttribute('endpoint', endpoint); + viewer.setAttribute('picture', imageId); + viewer.setAttribute('widgets', 'false'); + viewer.setAttribute('url-parameters', 'false'); + viewer.setAttribute('keyboard-shortcuts', 'false'); + viewer.setAttribute('psv-options', "{'picturesNavigation': 'pic', 'displayAnnotations': 'false'}"); + viewer.style.width = '100%'; + viewer.style.height = '100%'; + + container.appendChild(viewer); + + return () => { + container.removeChild(viewer); + }; + }, [imageId, endpoint]); + + return ( +
+ ); +} + +export default PanoramaxImagePreview; diff --git a/app/components/PanoramaxImagePreview/styles.module.css b/app/components/PanoramaxImagePreview/styles.module.css new file mode 100644 index 00000000..e0b35541 --- /dev/null +++ b/app/components/PanoramaxImagePreview/styles.module.css @@ -0,0 +1,3 @@ +.panoramax-image-preview { + isolation: isolate; +} diff --git a/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx b/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx index 404db765..4aa72cd5 100644 --- a/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx +++ b/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx @@ -36,7 +36,7 @@ function StreetDetails(props: Props) { + + + {data.imageProvider?.url && ( + + )} + ); diff --git a/app/components/domain/StreetImageProviderInput/index.tsx b/app/components/domain/StreetImageProviderInput/index.tsx new file mode 100644 index 00000000..14368cf6 --- /dev/null +++ b/app/components/domain/StreetImageProviderInput/index.tsx @@ -0,0 +1,101 @@ +import { + useCallback, + useContext, + useMemo, +} from 'react'; +import { + EntriesAsList, + getErrorObject, + LeafError, + ObjectError, +} from '@togglecorp/toggle-form'; + +import Container from '#components/Container'; +import ListLayout from '#components/ListLayout'; +import RadioInput from '#components/RadioInput'; +import TextInput from '#components/TextInput'; +import EnumsContext from '#contexts/EnumsContext'; +import { StreetImageProviderNameEnum } from '#generated/types/graphql'; + +import { PartialStreetImageProviderInputFields } from './schema'; + +interface Props { + value: PartialStreetImageProviderInputFields | undefined; + error: LeafError | ObjectError; + setFieldValue: ( + ...entries: EntriesAsList + ) => void; + disabled?: boolean; +} + +interface StreetProviderOption { + key: StreetImageProviderNameEnum; + label: string; +} + +function providerKeySelector(option: StreetProviderOption) { + return option.key; +} + +function providerLabelSelector(option: StreetProviderOption) { + return option.label; +} + +function StreetImageProviderInput(props: Props) { + const { + value, error: formError, setFieldValue, disabled, + } = props; + + const { streetImageProviderNameOptions } = useContext(EnumsContext); + const error = getErrorObject(formError); + + const providerOptions = useMemo(() => { + if (!streetImageProviderNameOptions || streetImageProviderNameOptions.length === 0) { + return []; + } + + return streetImageProviderNameOptions.map((option) => ({ + key: option.key as StreetImageProviderNameEnum, + label: option.label, + })); + }, [streetImageProviderNameOptions]); + + const handleChange = useCallback((newValue: StreetImageProviderNameEnum) => { + setFieldValue(newValue, 'name'); + if (newValue !== StreetImageProviderNameEnum.PanoramaxCustom) { + setFieldValue(undefined, 'url'); + } + }, [setFieldValue]); + + return ( + + + + + {value?.name === StreetImageProviderNameEnum.PanoramaxCustom && ( + + )} + + + ); +} + +export default StreetImageProviderInput; diff --git a/app/components/domain/StreetImageProviderInput/schema.ts b/app/components/domain/StreetImageProviderInput/schema.ts new file mode 100644 index 00000000..03a40b7b --- /dev/null +++ b/app/components/domain/StreetImageProviderInput/schema.ts @@ -0,0 +1,61 @@ +import { + addCondition, + ObjectSchema, + PartialForm, + requiredStringCondition, +} from '@togglecorp/toggle-form'; + +import { + StreetImageProviderInput, + StreetImageProviderNameEnum, +} from '#generated/types/graphql'; +import { DeepNonNullable } from '#utils/types'; + +export type PartialStreetImageProviderInputFields = PartialForm< + DeepNonNullable +>; + +type StreetImageProviderSchema = + ObjectSchema; + +type StreetImageProviderFields = + ReturnType; + +export const defaultStreetImageProviderValue: +PartialStreetImageProviderInputFields = { + name: StreetImageProviderNameEnum.Mapillary, +}; + +const streetImageProviderSchema: StreetImageProviderSchema = { + fields: (value): StreetImageProviderFields => { + const baseSchema: StreetImageProviderFields = { + name: { + required: true, + }, + url: {}, + }; + + return addCondition( + baseSchema, + value, + ['name'], + ['url'], + (): StreetImageProviderFields => { + if (value?.name === StreetImageProviderNameEnum.PanoramaxCustom) { + return { + url: { + required: true, + requiredValidation: requiredStringCondition, + }, + }; + } + + return { + url: { required: false }, + }; + }, + ); + }, +}; + +export default streetImageProviderSchema; diff --git a/app/components/domain/StreetScenarioPreview/index.tsx b/app/components/domain/StreetScenarioPreview/index.tsx index 65f268b2..4aa803a5 100644 --- a/app/components/domain/StreetScenarioPreview/index.tsx +++ b/app/components/domain/StreetScenarioPreview/index.tsx @@ -6,7 +6,12 @@ import { PreviewItem } from '#components/domain/TutorialPreviewScreenSelectInput import ListLayout from '#components/ListLayout'; import MapillaryImagePreview from '#components/MapillaryImagePreview'; import MobilePreview from '#components/MobilePreview'; -import { TutorialScenarioPageCreateInput } from '#generated/types/graphql'; +import PanoramaxImagePreview from '#components/PanoramaxImagePreview'; +import { + StreetImageProvider, + StreetImageProviderNameEnum, + TutorialScenarioPageCreateInput, +} from '#generated/types/graphql'; import { PartialCustomOptionInputFields } from '../CustomOptionInput/schema'; import CustomOptionPreview from '../CustomOptionsPreview'; @@ -19,6 +24,7 @@ interface Props { scenario: PartialForm | undefined; customOptions: PartialCustomOptionInputFields[] | undefined; preview: PreviewItem | undefined; + imageProvider: StreetImageProvider | null | undefined; } function StreetScenarioPreview(props: Props) { @@ -28,6 +34,7 @@ function StreetScenarioPreview(props: Props) { projectInstruction, customOptions, preview, + imageProvider, } = props; const imageId = scenario?.tasks?.[0].projectTypeSpecifics?.street?.mapillaryImageId; @@ -45,10 +52,19 @@ function StreetScenarioPreview(props: Props) { popupVariant={preview?.popupVariant} contentClassName={styles.content} > - + {imageProvider?.name === StreetImageProviderNameEnum.Mapillary && ( + + )} + {imageProvider?.name === StreetImageProviderNameEnum.Panoramax && ( + + )} diff --git a/app/contexts/EnumsContext.ts b/app/contexts/EnumsContext.ts index b46213dd..6e8a980c 100644 --- a/app/contexts/EnumsContext.ts +++ b/app/contexts/EnumsContext.ts @@ -12,6 +12,7 @@ export interface EnumsContextProps { overlayLayerTypeOptions: AllEnumsQuery['enums']['OverlayLayerTypeEnum'], tutorialStatusOptions: AllEnumsQuery['enums']['TutorialStatusEnum'], firebasePushStatusOptions: AllEnumsQuery['enums']['FirebasePushStatusEnum'], + streetImageProviderNameOptions: AllEnumsQuery['enums']['StreetImageProviderNameEnum'], validateObjectSourceTypeMapping: Record< AllEnumsQuery['enums']['ValidateObjectSourceTypeEnum'][number]['key'], @@ -49,6 +50,10 @@ export interface EnumsContextProps { AllEnumsQuery['enums']['FirebasePushStatusEnum'][number]['key'], AllEnumsQuery['enums']['FirebasePushStatusEnum'][number] > | undefined; + streetImageProviderNameMapping: Record< + AllEnumsQuery['enums']['StreetImageProviderNameEnum'][number]['key'], + AllEnumsQuery['enums']['StreetImageProviderNameEnum'][number] + > | undefined; } export const defaultAllEnumsValue: EnumsContextProps = { @@ -61,6 +66,7 @@ export const defaultAllEnumsValue: EnumsContextProps = { overlayLayerTypeOptions: [], tutorialStatusOptions: [], firebasePushStatusOptions: [], + streetImageProviderNameOptions: [], validateObjectSourceTypeMapping: undefined, validateImageSourceTypeMapping: undefined, @@ -71,6 +77,7 @@ export const defaultAllEnumsValue: EnumsContextProps = { overlayLayerTypeMapping: undefined, tutorialStatusMapping: undefined, firebasePushStatusMapping: undefined, + streetImageProviderNameMapping: undefined, }; const EnumsContext = createContext(defaultAllEnumsValue); diff --git a/app/utils/query.ts b/app/utils/query.ts index 9a919eeb..a41ddf90 100644 --- a/app/utils/query.ts +++ b/app/utils/query.ts @@ -139,12 +139,16 @@ fragment ProjectTypeSpecificFields on CompareProjectPropertyTypeFindProjectPrope mapillaryImageFilters { creatorId endTime - isPano + panoOnly organizationId randomizeOrder samplingThreshold startTime } + imageProvider { + name + url + } } } `; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx index 77389d06..8bf15e98 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx @@ -11,7 +11,7 @@ import ListLayout from '#components/ListLayout'; import NumberInput from '#components/NumberInput'; import TextInput from '#components/TextInput'; -import { PartialStreetMapillaryImageFiltersInputFields } from './schema'; +import { PartialStreetMapillaryImageFiltersInputFields } from './schema.ts'; interface Props { value: PartialStreetMapillaryImageFiltersInputFields | undefined | null; @@ -34,7 +34,7 @@ function StreetMapillaryImageFiltersInput(props: Props) { return ( @@ -63,16 +63,16 @@ function StreetMapillaryImageFiltersInput(props: Props) { error={error?.creatorId} onChange={setFieldValue} disabled={disabled} - hint="Provide a valid Mapillary creator ID to filter for images belonging to a specific Mapillary user." + hint="Provide a valid ID to filter for images belonging to a specific Mapillary/Panoramax user." /> diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts index 4f68b54c..6b64ae13 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts @@ -17,12 +17,11 @@ type StreetMapillaryImageFiltersFormSchema = ObjectSchema< // eslint-disable-next-line max-len export const defaultStreetMapillaryImageFiltersInputFormValue: PartialStreetMapillaryImageFiltersInputFields = { randomizeOrder: false, - isPano: false, }; const streetMapillaryimageFiltersFormSchema: StreetMapillaryImageFiltersFormSchema = { fields: (): ReturnType => ({ - isPano: {}, + panoOnly: {}, creatorId: {}, organizationId: {}, startTime: {}, diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx index 74066e9b..5e78802b 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx @@ -16,6 +16,11 @@ import Container from '#components/Container'; import AssetInput from '#components/domain/AssetInput'; import CustomOptionInput from '#components/domain/CustomOptionInput'; import { PartialCustomOptionInputFields } from '#components/domain/CustomOptionInput/schema'; +import StreetImageProviderInput from '#components/domain/StreetImageProviderInput'; +import { + defaultStreetImageProviderValue, + PartialStreetImageProviderInputFields, +} from '#components/domain/StreetImageProviderInput/schema'; import ListLayout from '#components/ListLayout'; import NonFieldError from '#components/NonFieldError'; import { ProjectAssetInputTypeEnum } from '#generated/types/graphql'; @@ -74,6 +79,12 @@ function StreetProjectSpecifics(props: Props) { defaultStreetMapillaryImageFiltersInputFormValue, ); + const setStreetImageProviderFieldValue = useFormObject<'imageProvider', PartialStreetImageProviderInputFields>( + 'imageProvider' as const, + setFieldValue, + defaultStreetImageProviderValue, + ); + return ( <> + ); } diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/schema.ts b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/schema.ts index d7ad1b0e..0d3382e9 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/schema.ts +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/schema.ts @@ -4,6 +4,7 @@ import { } from '@togglecorp/toggle-form'; import customOptionSchema from '#components/domain/CustomOptionInput/schema'; +import streetImageProviderSchema, { defaultStreetImageProviderValue } from '#components/domain/StreetImageProviderInput/schema'; import { StreetProjectPropertyInput } from '#generated/types/graphql'; import { DeepNonNullable } from '#utils/types'; @@ -25,6 +26,7 @@ type StreetSpecificFormSchema = ObjectSchema< export const defaultStreetSpecificFormValue: PartialStreetSpecificFields = { mapillaryImageFilters: defaultStreetMapillaryImageFiltersInputFormValue, + imageProvider: defaultStreetImageProviderValue, }; const streetSpecificFormSchema: StreetSpecificFormSchema = { @@ -35,6 +37,7 @@ const streetSpecificFormSchema: StreetSpecificFormSchema = { }, aoiGeometry: {}, mapillaryImageFilters: streetMapillaryimageFiltersFormSchema, + imageProvider: streetImageProviderSchema, }), }; diff --git a/app/views/EditProject/UpdateProjectForm/index.tsx b/app/views/EditProject/UpdateProjectForm/index.tsx index c3274323..92bd9a7e 100644 --- a/app/views/EditProject/UpdateProjectForm/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/index.tsx @@ -165,8 +165,7 @@ function UpdateProjectForm(props: Props) { if (projectData.project.projectType === ProjectTypeEnum.Street) { return { ...defaultStreetSpecificFormValue, - // FIXME: use custom options from street project - customOptions: projectData.defaultValidateCustomOptions.map((customOption) => ({ + customOptions: projectData.defaultStreetCustomOptions.map((customOption) => ({ clientId: ulid(), ...customOption, })), diff --git a/app/views/EditProject/query.ts b/app/views/EditProject/query.ts index 4165fda6..ec0fad71 100644 --- a/app/views/EditProject/query.ts +++ b/app/views/EditProject/query.ts @@ -23,5 +23,12 @@ query ProjectDetails($id: ID!) { title value } + defaultStreetCustomOptions: defaultCustomOptions(projectType: STREET) { + description + icon + iconColor + title + value + } } `; diff --git a/app/views/EditTutorial/ScenarioPageInput/TaskInput/StreetPropertyInput/index.tsx b/app/views/EditTutorial/ScenarioPageInput/TaskInput/StreetPropertyInput/index.tsx index f1626ed0..78ba0079 100644 --- a/app/views/EditTutorial/ScenarioPageInput/TaskInput/StreetPropertyInput/index.tsx +++ b/app/views/EditTutorial/ScenarioPageInput/TaskInput/StreetPropertyInput/index.tsx @@ -35,7 +35,7 @@ function StreetPropertyInput(props: Props) { return (
)} diff --git a/app/views/RootLayout/index.tsx b/app/views/RootLayout/index.tsx index fcb41b93..cc2aaddf 100644 --- a/app/views/RootLayout/index.tsx +++ b/app/views/RootLayout/index.tsx @@ -107,6 +107,10 @@ query AllEnums { key label } + StreetImageProviderNameEnum { + key + label + } } } `; @@ -200,6 +204,7 @@ function RootLayout() { overlayLayerTypeOptions: allEnumsResponse?.enums.OverlayLayerTypeEnum ?? [], tutorialStatusOptions: allEnumsResponse?.enums.TutorialStatusEnum ?? [], firebasePushStatusOptions: allEnumsResponse?.enums.FirebasePushStatusEnum ?? [], + streetImageProviderNameOptions: allEnumsResponse?.enums.StreetImageProviderNameEnum ?? [], validateObjectSourceTypeMapping: listToMap( allEnumsResponse?.enums.ValidateObjectSourceTypeEnum, ({ key }) => key, @@ -236,6 +241,10 @@ function RootLayout() { allEnumsResponse?.enums.FirebasePushStatusEnum, ({ key }) => key, ), + streetImageProviderNameMapping: listToMap( + allEnumsResponse?.enums.StreetImageProviderNameEnum, + ({ key }) => key, + ), } satisfies EnumsContextProps), [allEnumsResponse]); return ( diff --git a/backend b/backend index c0282605..f15f817e 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit c028260535afd6a8fe1518d501e7536d1e6ac99e +Subproject commit f15f817edfa8bf63411d5b6f5e0256a5873765b5 diff --git a/package.json b/package.json index 9a211046..bece54b4 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ }, "dependencies": { "@mapbox/tilebelt": "^2.0.2", + "@panoramax/web-viewer": "^4.4.0", "@placemarkio/check-geojson": "^0.1.12", "@sentry/react": "^9.13.0", "@sentry/tracing": "^7.120.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea588aa4..1f4ceafa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,9 @@ importers: '@mapbox/tilebelt': specifier: ^2.0.2 version: 2.0.2 + '@panoramax/web-viewer': + specifier: ^4.4.0 + version: 4.4.0 '@placemarkio/check-geojson': specifier: ^0.1.12 version: 0.1.12 @@ -1298,6 +1301,25 @@ packages: '@firebase/webchannel-wrapper@1.0.4': resolution: {integrity: sha512-6m8+P+dE/RPl4OPzjTxcTbQ0rGeRyeTvAi9KwIffBVCiAMKrfXfLZaqD1F+m8t4B5/Q5aHsMozOgirkH1F5oMQ==} + '@fontsource/atkinson-hyperlegible-next@5.2.7': + resolution: {integrity: sha512-FDRsNkqauNRBRiTD3YF6FV8yOVFjkcBqUjwrv6KnooEIRjsTuePUnahPsLHApWNtp1riztVCOPnr9RMHUZU3TQ==} + + '@fortawesome/fontawesome-common-types@6.7.2': + resolution: {integrity: sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==} + engines: {node: '>=6'} + + '@fortawesome/fontawesome-svg-core@6.7.2': + resolution: {integrity: sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==} + engines: {node: '>=6'} + + '@fortawesome/free-regular-svg-icons@6.7.2': + resolution: {integrity: sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==} + engines: {node: '>=6'} + + '@fortawesome/free-solid-svg-icons@6.7.2': + resolution: {integrity: sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==} + engines: {node: '>=6'} + '@graphql-codegen/add@5.0.3': resolution: {integrity: sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==} peerDependencies: @@ -1616,6 +1638,9 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -1648,6 +1673,12 @@ packages: '@keyv/serialize@1.0.3': resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==} + '@lit-labs/ssr-dom-shim@1.5.1': + resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + '@mapbox/geojson-rewind@0.5.2': resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} hasBin: true @@ -1659,26 +1690,48 @@ packages: '@mapbox/point-geometry@0.1.0': resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + '@mapbox/point-geometry@1.1.0': + resolution: {integrity: sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==} + '@mapbox/tilebelt@2.0.2': resolution: {integrity: sha512-pzFgrmsCUjOAAeYns1MKJ1dJICYdEC+sYwtWLdxO7iJwmDlepGrEXDqP9ejApO/YUVctA/SYKDS4Oc0mBNNLZw==} '@mapbox/tiny-sdf@2.0.6': resolution: {integrity: sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==} + '@mapbox/tiny-sdf@2.0.7': + resolution: {integrity: sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==} + '@mapbox/unitbezier@0.0.1': resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} '@mapbox/vector-tile@1.3.1': resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + '@mapbox/vector-tile@2.0.4': + resolution: {integrity: sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==} + '@mapbox/whoots-js@3.1.0': resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} engines: {node: '>=6.0.0'} + '@maplibre/geojson-vt@5.0.4': + resolution: {integrity: sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==} + '@maplibre/maplibre-gl-style-spec@23.3.0': resolution: {integrity: sha512-IGJtuBbaGzOUgODdBRg66p8stnwj9iDXkgbYKoYcNiiQmaez5WVRfXm4b03MCDwmZyX93csbfHFWEJJYHnn5oA==} hasBin: true + '@maplibre/maplibre-gl-style-spec@24.4.1': + resolution: {integrity: sha512-UKhA4qv1h30XT768ccSv5NjNCX+dgfoq2qlLVmKejspPcSQTYD4SrVucgqegmYcKcmwf06wcNAa/kRd0NHWbUg==} + hasBin: true + + '@maplibre/mlt@1.1.6': + resolution: {integrity: sha512-rgtY3x65lrrfXycLf6/T22ZnjTg5WgIOsptOIoCaMZy4O4UAKTyZlYY0h6v8le721pTptF94U65yMDQkug+URw==} + + '@maplibre/vt-pbf@4.2.1': + resolution: {integrity: sha512-IxZBGq/+9cqf2qdWlFuQ+ZfoMhWpxDUGQZ/poPHOJBvwMUT1GuxLo6HgYTou+xxtsOsjfbcjI8PZaPCtmt97rA==} + '@napi-rs/wasm-runtime@0.2.9': resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} @@ -1698,6 +1751,32 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@panoramax/web-viewer@4.4.0': + resolution: {integrity: sha512-6tgxINkdbb8rRC70sTMcyc5gjsVXjca+4EEa03F3ecPc5b36krnkmoEJqC5KIBa+CxIRuZ+UkTucVVG4AENHNA==} + + '@photo-sphere-viewer/core@5.14.1': + resolution: {integrity: sha512-qrwUudrX9YZms4c2shlY/H3jUP0oh9FyGEqIDr/95ulNZgKbhQ6C/i8zDQ4j8ooFR4+z5FDORQtGvLgPyX8VCA==} + + '@photo-sphere-viewer/equirectangular-tiles-adapter@5.14.1': + resolution: {integrity: sha512-QHd9y5cIFXAAZInbKbh+nUz5uzSRTiR8HYApm+ONlDu8JHAp410xNhB1vNm2Q1mVgg8IigQpD9Za5mPq10fESA==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/gallery-plugin@5.14.1': + resolution: {integrity: sha512-MzIB4Kc652yfdgPkh3xh/Kvu3XY84VkmshqZhXxa9UV4E2uNMop+vttkWeKogsaNSDT5/aEkMaFgwL/Bs/ZmRw==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/markers-plugin@5.14.1': + resolution: {integrity: sha512-tKMrVem19sZFVQwH6IlubEIucDD2EtwxzmWClHCEojM/+ajucuTDvO2N+I6HEqJClBcNsdHAUwA/zyY6MGOu2Q==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/virtual-tour-plugin@5.14.1': + resolution: {integrity: sha512-PRRQXoViKAg8g1TfagKJnvLMuuOXnGN9rvWOAs7W7J+knhcAuAenPFUax1Z5FgKli45mo21NspsPf1RV9lJHkQ==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.1 + '@placemarkio/check-geojson@0.1.12': resolution: {integrity: sha512-sSNPtPDVB0oKwImi4NYg1LVE2QSCIqs/jIRmu8U4fQVWdRjlGy+C/n7AbNO2FycE9rVWtz256f33aMGzvKC7gg==} engines: {node: '>=10'} @@ -2108,6 +2187,9 @@ packages: '@types/three@0.134.0': resolution: {integrity: sha512-4YB+99Rgqq27EjiYTItEoZtdjLnTh8W9LxowgpC9eWsjaQJIL4Kn/ZcUKAnW3gB/jS4hqGN8iqmid+RcUZDzpA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/virtual-dom@2.1.4': resolution: {integrity: sha512-Y7L/frVydXRd16MevczslJZQu+QWsrqZlj6ytk7mST3xen0fkx7Ollw31By/89A8Wq+nfNWm/IoTR1ac/0fRhA==} @@ -3246,6 +3328,9 @@ packages: earcut@3.0.1: resolution: {integrity: sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==} + earcut@3.0.2: + resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} + easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} @@ -3584,6 +3669,9 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -3743,6 +3831,9 @@ packages: gl-matrix@3.4.3: resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + gl-matrix@3.4.4: + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3957,6 +4048,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + iconify-icon@3.0.2: + resolution: {integrity: sha512-DYPAumiUeUeT/GHT8x2wrAVKn1FqZJqFH0Y5pBefapWRreV1BBvqBVMb0020YQ2njmbR59r/IathL2d2OrDrxA==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -4457,6 +4551,15 @@ packages: enquirer: optional: true + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.2: + resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + + lit@3.3.2: + resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} + local-pkg@0.5.1: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} @@ -4547,6 +4650,10 @@ packages: mapillary-js@4.1.2: resolution: {integrity: sha512-LYj6xbp/Y9wfBkr/prRwgJGb3+KwvzUri0yl5QEpMEH7oC1p52ErshWmPXysKefmm6JaFML4D7FJ89viwJ4T5g==} + maplibre-gl@5.19.0: + resolution: {integrity: sha512-REhYUN8gNP3HlcIZS6QU2uy8iovl31cXsrNDkCcqWSQbCkcpdYLczqDz5PVIwNH42UQNyvukjes/RoHPDrOUmQ==} + engines: {node: '>=16.14.0', npm: '>=8.1.0'} + maplibre-gl@5.5.0: resolution: {integrity: sha512-p8AOPuzzqn1ZA9gcXxKw0IED715we/2Owa/YUr6PANmgMvNMe/JG+V/C1hRra43Wm62Biz+Aa8AgbOLJimA8tA==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} @@ -4928,6 +5035,10 @@ packages: resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} hasBin: true + pbf@4.0.1: + resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} + hasBin: true + performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -4955,6 +5066,9 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pmtiles@4.4.0: + resolution: {integrity: sha512-tCLI1C5134MR54i8izUWhse0QUtO/EC33n9yWp1N5dYLLvyc197U0fkF5gAJhq1TdWO9Tvl+9hgvFvM0fR27Zg==} + pn@1.1.0: resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} @@ -5174,6 +5288,9 @@ packages: potpack@2.0.0: resolution: {integrity: sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==} + potpack@2.1.0: + resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -5235,6 +5352,9 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5849,6 +5969,9 @@ packages: three@0.134.0: resolution: {integrity: sha512-LbBerg7GaSPjYtTOnu41AMp7tV6efUNR3p4Wk5NzkSsNTBuA5mDGOfwwZL1jhhVMLx9V20HolIUo0+U3AXehbg==} + three@0.179.1: + resolution: {integrity: sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -6251,6 +6374,7 @@ packages: whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} @@ -7649,6 +7773,22 @@ snapshots: '@firebase/webchannel-wrapper@1.0.4': {} + '@fontsource/atkinson-hyperlegible-next@5.2.7': {} + + '@fortawesome/fontawesome-common-types@6.7.2': {} + + '@fortawesome/fontawesome-svg-core@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + + '@fortawesome/free-regular-svg-icons@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + + '@fortawesome/free-solid-svg-icons@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + '@graphql-codegen/add@5.0.3(graphql@16.10.0)': dependencies: '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) @@ -8188,6 +8328,8 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} + '@iconify/types@2.0.0': {} + '@istanbuljs/schema@0.1.3': {} '@jest/schemas@29.6.3': @@ -8217,6 +8359,12 @@ snapshots: dependencies: buffer: 6.0.3 + '@lit-labs/ssr-dom-shim@1.5.1': {} + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@mapbox/geojson-rewind@0.5.2': dependencies: get-stream: 6.0.1 @@ -8226,18 +8374,30 @@ snapshots: '@mapbox/point-geometry@0.1.0': {} + '@mapbox/point-geometry@1.1.0': {} + '@mapbox/tilebelt@2.0.2': {} '@mapbox/tiny-sdf@2.0.6': {} + '@mapbox/tiny-sdf@2.0.7': {} + '@mapbox/unitbezier@0.0.1': {} '@mapbox/vector-tile@1.3.1': dependencies: '@mapbox/point-geometry': 0.1.0 + '@mapbox/vector-tile@2.0.4': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@types/geojson': 7946.0.16 + pbf: 4.0.1 + '@mapbox/whoots-js@3.1.0': {} + '@maplibre/geojson-vt@5.0.4': {} + '@maplibre/maplibre-gl-style-spec@23.3.0': dependencies: '@mapbox/jsonlint-lines-primitives': 2.0.2 @@ -8248,6 +8408,30 @@ snapshots: rw: 1.3.3 tinyqueue: 3.0.0 + '@maplibre/maplibre-gl-style-spec@24.4.1': + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/unitbezier': 0.0.1 + json-stringify-pretty-compact: 4.0.0 + minimist: 1.2.8 + quickselect: 3.0.0 + rw: 1.3.3 + tinyqueue: 3.0.0 + + '@maplibre/mlt@1.1.6': + dependencies: + '@mapbox/point-geometry': 1.1.0 + + '@maplibre/vt-pbf@4.2.1': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@mapbox/vector-tile': 2.0.4 + '@maplibre/geojson-vt': 5.0.4 + '@types/geojson': 7946.0.16 + '@types/supercluster': 7.1.3 + pbf: 4.0.1 + supercluster: 8.0.1 + '@napi-rs/wasm-runtime@0.2.9': dependencies: '@emnapi/core': 1.4.3 @@ -8269,6 +8453,46 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@panoramax/web-viewer@4.4.0': + dependencies: + '@fontsource/atkinson-hyperlegible-next': 5.2.7 + '@fortawesome/fontawesome-svg-core': 6.7.2 + '@fortawesome/free-regular-svg-icons': 6.7.2 + '@fortawesome/free-solid-svg-icons': 6.7.2 + '@maplibre/vt-pbf': 4.2.1 + '@photo-sphere-viewer/core': 5.14.1 + '@photo-sphere-viewer/equirectangular-tiles-adapter': 5.14.1(@photo-sphere-viewer/core@5.14.1) + '@photo-sphere-viewer/gallery-plugin': 5.14.1(@photo-sphere-viewer/core@5.14.1) + '@photo-sphere-viewer/markers-plugin': 5.14.1(@photo-sphere-viewer/core@5.14.1) + '@photo-sphere-viewer/virtual-tour-plugin': 5.14.1(@photo-sphere-viewer/core@5.14.1) + geojson-vt: 4.0.2 + iconify-icon: 3.0.2 + json5: 2.2.3 + lit: 3.3.2 + maplibre-gl: 5.19.0 + pmtiles: 4.4.0 + query-selector-shadow-dom: 1.0.1 + + '@photo-sphere-viewer/core@5.14.1': + dependencies: + three: 0.179.1 + + '@photo-sphere-viewer/equirectangular-tiles-adapter@5.14.1(@photo-sphere-viewer/core@5.14.1)': + dependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/gallery-plugin@5.14.1(@photo-sphere-viewer/core@5.14.1)': + dependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/markers-plugin@5.14.1(@photo-sphere-viewer/core@5.14.1)': + dependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/virtual-tour-plugin@5.14.1(@photo-sphere-viewer/core@5.14.1)': + dependencies: + '@photo-sphere-viewer/core': 5.14.1 + '@placemarkio/check-geojson@0.1.12': {} '@poppinss/cliui@6.4.3': @@ -8629,6 +8853,8 @@ snapshots: '@types/three@0.134.0': {} + '@types/trusted-types@2.0.7': {} + '@types/virtual-dom@2.1.4': {} '@types/ws@8.18.1': @@ -10180,6 +10406,8 @@ snapshots: earcut@3.0.1: {} + earcut@3.0.2: {} + easy-table@1.2.0: dependencies: ansi-regex: 5.0.1 @@ -10707,6 +10935,8 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + fflate@0.8.2: {} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -10904,6 +11134,8 @@ snapshots: gl-matrix@3.4.3: {} + gl-matrix@3.4.4: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -11125,6 +11357,10 @@ snapshots: human-signals@5.0.0: {} + iconify-icon@3.0.2: + dependencies: + '@iconify/types': 2.0.0 + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -11636,6 +11872,22 @@ snapshots: through: 2.3.8 wrap-ansi: 7.0.0 + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.2 + + lit-html@3.3.2: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.2: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + local-pkg@0.5.1: dependencies: mlly: 1.7.4 @@ -11754,6 +12006,31 @@ snapshots: three: 0.134.0 virtual-dom: 2.1.1 + maplibre-gl@5.19.0: + dependencies: + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/point-geometry': 1.1.0 + '@mapbox/tiny-sdf': 2.0.7 + '@mapbox/unitbezier': 0.0.1 + '@mapbox/vector-tile': 2.0.4 + '@mapbox/whoots-js': 3.1.0 + '@maplibre/geojson-vt': 5.0.4 + '@maplibre/maplibre-gl-style-spec': 24.4.1 + '@maplibre/mlt': 1.1.6 + '@maplibre/vt-pbf': 4.2.1 + '@types/geojson': 7946.0.16 + '@types/supercluster': 7.1.3 + earcut: 3.0.2 + gl-matrix: 3.4.4 + kdbush: 4.0.2 + murmurhash-js: 1.0.0 + pbf: 4.0.1 + potpack: 2.1.0 + quickselect: 3.0.0 + supercluster: 8.0.1 + tinyqueue: 3.0.0 + maplibre-gl@5.5.0: dependencies: '@mapbox/geojson-rewind': 0.5.2 @@ -12147,6 +12424,10 @@ snapshots: ieee754: 1.2.1 resolve-protobuf-schema: 2.1.0 + pbf@4.0.1: + dependencies: + resolve-protobuf-schema: 2.1.0 + performance-now@2.1.0: optional: true @@ -12168,6 +12449,10 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 + pmtiles@4.4.0: + dependencies: + fflate: 0.8.2 + pn@1.1.0: optional: true @@ -12442,6 +12727,8 @@ snapshots: potpack@2.0.0: {} + potpack@2.1.0: {} + prelude-ls@1.1.2: optional: true @@ -12504,6 +12791,8 @@ snapshots: quansync@0.2.11: {} + query-selector-shadow-dom@1.0.1: {} + queue-microtask@1.2.3: {} quickselect@2.0.0: {} @@ -13236,6 +13525,8 @@ snapshots: three@0.134.0: {} + three@0.179.1: {} + through@2.3.8: {} timeout-signal@2.0.0: {} From 0bd8e1aee2578c7f0fccaad669982ec77c6fbd67 Mon Sep 17 00:00:00 2001 From: ofritz Date: Thu, 19 Mar 2026 17:45:51 +0100 Subject: [PATCH 02/10] feat(street): update submodule pointer --- backend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend b/backend index f15f817e..d307d247 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit f15f817edfa8bf63411d5b6f5e0256a5873765b5 +Subproject commit d307d247a621873a83a83c3f57793c0f0a3a9344 From 72c4b3ea06b300eaa4641bf1cc8aee551d6b38f3 Mon Sep 17 00:00:00 2001 From: ofritz Date: Mon, 23 Mar 2026 14:32:54 +0100 Subject: [PATCH 03/10] fix(street): render panoramax image preview for custom and default instance --- app/components/domain/StreetScenarioPreview/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/components/domain/StreetScenarioPreview/index.tsx b/app/components/domain/StreetScenarioPreview/index.tsx index 4aa803a5..c9817953 100644 --- a/app/components/domain/StreetScenarioPreview/index.tsx +++ b/app/components/domain/StreetScenarioPreview/index.tsx @@ -38,6 +38,10 @@ function StreetScenarioPreview(props: Props) { } = props; const imageId = scenario?.tasks?.[0].projectTypeSpecifics?.street?.mapillaryImageId; + const isPanoramaxProvider = [ + StreetImageProviderNameEnum.Panoramax, + StreetImageProviderNameEnum.PanoramaxCustom, + ].includes(imageProvider?.name as StreetImageProviderNameEnum); return ( )} - {imageProvider?.name === StreetImageProviderNameEnum.Panoramax && ( + {isPanoramaxProvider && ( Date: Mon, 23 Mar 2026 14:40:06 +0100 Subject: [PATCH 04/10] feat(street): refactor panoramax preview --- .../PanoramaxImagePreview/index.tsx | 49 +++++++------------ .../PanoramaxImagePreview/styles.module.css | 6 +++ 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/app/components/PanoramaxImagePreview/index.tsx b/app/components/PanoramaxImagePreview/index.tsx index 773bab75..1250c338 100644 --- a/app/components/PanoramaxImagePreview/index.tsx +++ b/app/components/PanoramaxImagePreview/index.tsx @@ -1,11 +1,7 @@ import '@panoramax/web-viewer/build/index.css'; import '@panoramax/web-viewer'; -import { - useEffect, - useMemo, - useRef, -} from 'react'; +import { useMemo } from 'react'; import { _cs, isDefined, @@ -22,37 +18,30 @@ interface Props { const DEFAULT_ENDPOINT = 'https://api.panoramax.xyz/api'; function PanoramaxImagePreview({ className, imageId, url }: Props) { - const containerRef = useRef(null); const endpoint = useMemo(() => { + // NOTE: Workaround to use Metacatalog API for MapComplete Panoramax due to CORS issues. if (!url) return DEFAULT_ENDPOINT; return url.includes('mapcomplete') ? DEFAULT_ENDPOINT : `${url.replace(/\/+$/, '')}/api`; }, [url]); - useEffect(() => { - const container = containerRef.current; - if (!container || !isDefined(imageId)) return () => {}; - const viewer = document.createElement('pnx-photo-viewer'); - viewer.setAttribute('endpoint', endpoint); - viewer.setAttribute('picture', imageId); - viewer.setAttribute('widgets', 'false'); - viewer.setAttribute('url-parameters', 'false'); - viewer.setAttribute('keyboard-shortcuts', 'false'); - viewer.setAttribute('psv-options', "{'picturesNavigation': 'pic', 'displayAnnotations': 'false'}"); - viewer.style.width = '100%'; - viewer.style.height = '100%'; - - container.appendChild(viewer); - - return () => { - container.removeChild(viewer); - }; - }, [imageId, endpoint]); - + const PanoramaxPhotoViewer = 'pnx-photo-viewer' as React.ElementType; return ( -
+
+ {isDefined(imageId) && ( + + )} +
); } diff --git a/app/components/PanoramaxImagePreview/styles.module.css b/app/components/PanoramaxImagePreview/styles.module.css index e0b35541..c9707bd4 100644 --- a/app/components/PanoramaxImagePreview/styles.module.css +++ b/app/components/PanoramaxImagePreview/styles.module.css @@ -1,3 +1,9 @@ .panoramax-image-preview { isolation: isolate; + height: 20rem; + + .viewer { + width: 100%; + height: 100%; + } } From 030984bd6f8739aa22c89ea30f07d0f0ca8e3e9e Mon Sep 17 00:00:00 2001 From: ofritz Date: Mon, 23 Mar 2026 16:55:36 +0100 Subject: [PATCH 05/10] feat(street): update submodule pointer --- backend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend b/backend index d307d247..036888a0 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit d307d247a621873a83a83c3f57793c0f0a3a9344 +Subproject commit 036888a039f0fadb4cc5694f7cfced4ac96af351 From 2f2f1f2aea35efa693f8dd906f3fec7b63b9a4c5 Mon Sep 17 00:00:00 2001 From: ofritz Date: Thu, 2 Apr 2026 12:22:50 +0200 Subject: [PATCH 06/10] feat(street): update submodule pointer --- backend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend b/backend index 036888a0..3089d827 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 036888a039f0fadb4cc5694f7cfced4ac96af351 +Subproject commit 3089d827103cc40157930d0ff527ca93d0caa33f From 26e2fd9ed899163709eb26e12e071a4373b5ff23 Mon Sep 17 00:00:00 2001 From: ofritz Date: Tue, 28 Apr 2026 11:23:09 +0200 Subject: [PATCH 07/10] feat(street): check for image provider type for panoramax custom api url input --- .../ProjectSpecificDetails/StreetDetails/index.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx b/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx index 4aa72cd5..f555aae0 100644 --- a/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx +++ b/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx @@ -6,7 +6,10 @@ import CustomOptionPreview from '#components/domain/CustomOptionsPreview'; import ProjectAssetPreview from '#components/domain/ProjectAssetPreview'; import ListLayout from '#components/ListLayout'; import TextOutput from '#components/TextOutput'; -import { StreetProjectPropertyType } from '#generated/types/graphql'; +import { + StreetImageProviderNameEnum, + StreetProjectPropertyType, +} from '#generated/types/graphql'; interface Props { data: StreetProjectPropertyType | undefined; @@ -89,7 +92,10 @@ function StreetDetails(props: Props) { value={data.imageProvider?.name} valueType="text" /> - {data.imageProvider?.url && ( + {( + data.imageProvider?.name === StreetImageProviderNameEnum.PanoramaxCustom + && data.imageProvider?.url + ) && ( Date: Tue, 28 Apr 2026 11:30:03 +0200 Subject: [PATCH 08/10] feat(street): conditionally show Mapillary organization id input --- .../index.tsx | 24 ++++++++++++------- .../StreetProjectSpecifics/index.tsx | 1 + 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx index 8bf15e98..e1fa4b2a 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx @@ -7,9 +7,11 @@ import { import Checkbox from '#components/Checkbox'; import Container from '#components/Container'; +import { PartialStreetImageProviderInputFields } from '#components/domain/StreetImageProviderInput/schema'; import ListLayout from '#components/ListLayout'; import NumberInput from '#components/NumberInput'; import TextInput from '#components/TextInput'; +import { StreetImageProviderNameEnum } from '#generated/types/graphql'; import { PartialStreetMapillaryImageFiltersInputFields } from './schema.ts'; @@ -20,6 +22,7 @@ interface Props { ...entries: EntriesAsList ) => void; disabled?: boolean; + imageProvider?: PartialStreetImageProviderInputFields | undefined | null; } function StreetMapillaryImageFiltersInput(props: Props) { @@ -28,6 +31,7 @@ function StreetMapillaryImageFiltersInput(props: Props) { error: formError, setFieldValue, disabled, + imageProvider, } = props; const error = getErrorObject(formError); @@ -65,15 +69,17 @@ function StreetMapillaryImageFiltersInput(props: Props) { disabled={disabled} hint="Provide a valid ID to filter for images belonging to a specific Mapillary/Panoramax user." /> - + {imageProvider?.name === StreetImageProviderNameEnum.Mapillary && ( + + )} Date: Tue, 28 Apr 2026 16:24:04 +0200 Subject: [PATCH 09/10] feat(street): remove Mapillary from names --- .../StreetImageFiltersInput/index.tsx | 115 ++++++++++++++++++ .../StreetImageFiltersInput/schema.ts | 33 +++++ .../index.tsx | 115 ------------------ .../schema.ts | 34 ------ .../StreetProjectSpecifics/index.tsx | 16 +-- .../StreetProjectSpecifics/schema.ts | 6 +- backend | 2 +- 7 files changed, 160 insertions(+), 161 deletions(-) create mode 100644 app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/index.tsx create mode 100644 app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/schema.ts delete mode 100644 app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/index.tsx new file mode 100644 index 00000000..ab3e7886 --- /dev/null +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/index.tsx @@ -0,0 +1,115 @@ +import { + EntriesAsList, + getErrorObject, + LeafError, + ObjectError, +} from '@togglecorp/toggle-form'; + +import Checkbox from '#components/Checkbox'; +import Container from '#components/Container'; +import { PartialStreetImageProviderInputFields } from '#components/domain/StreetImageProviderInput/schema'; +import ListLayout from '#components/ListLayout'; +import NumberInput from '#components/NumberInput'; +import TextInput from '#components/TextInput'; +import { StreetImageProviderNameEnum } from '#generated/types/graphql'; + +import { PartialStreetImageFiltersInputFields } from './schema.ts'; + +interface Props { + value: PartialStreetImageFiltersInputFields | undefined | null; + error: LeafError | ObjectError; + setFieldValue: ( + ...entries: EntriesAsList + ) => void; + disabled?: boolean; + imageProvider?: PartialStreetImageProviderInputFields | undefined | null; +} + +function StreetImageFiltersInput(props: Props) { + const { + value, + error: formError, + setFieldValue, + disabled, + imageProvider, + } = props; + + const error = getErrorObject(formError); + + return ( + + + + + + {imageProvider?.name === StreetImageProviderNameEnum.Mapillary && ( + + )} + + + + + + ); +} + +export default StreetImageFiltersInput; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/schema.ts b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/schema.ts new file mode 100644 index 00000000..08033e7d --- /dev/null +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/schema.ts @@ -0,0 +1,33 @@ +import { + ObjectSchema, + PartialForm, +} from '@togglecorp/toggle-form'; + +import { StreetImageFiltersInput } from '#generated/types/graphql'; +import { DeepNonNullable } from '#utils/types'; + +export type PartialStreetImageFiltersInputFields = PartialForm< + DeepNonNullable +>; + +type StreetImageFiltersFormSchema = ObjectSchema< + PartialStreetImageFiltersInputFields +>; + +export const defaultStreetImageFiltersInputFormValue: PartialStreetImageFiltersInputFields = { + randomizeOrder: false, +}; + +const streetImageFiltersFormSchema: StreetImageFiltersFormSchema = { + fields: (): ReturnType => ({ + panoOnly: {}, + creatorId: {}, + organizationId: {}, + startTime: {}, + endTime: {}, + randomizeOrder: {}, + samplingThreshold: {}, + }), +}; + +export default streetImageFiltersFormSchema; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx index e1fa4b2a..e69de29b 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx @@ -1,115 +0,0 @@ -import { - EntriesAsList, - getErrorObject, - LeafError, - ObjectError, -} from '@togglecorp/toggle-form'; - -import Checkbox from '#components/Checkbox'; -import Container from '#components/Container'; -import { PartialStreetImageProviderInputFields } from '#components/domain/StreetImageProviderInput/schema'; -import ListLayout from '#components/ListLayout'; -import NumberInput from '#components/NumberInput'; -import TextInput from '#components/TextInput'; -import { StreetImageProviderNameEnum } from '#generated/types/graphql'; - -import { PartialStreetMapillaryImageFiltersInputFields } from './schema.ts'; - -interface Props { - value: PartialStreetMapillaryImageFiltersInputFields | undefined | null; - error: LeafError | ObjectError; - setFieldValue: ( - ...entries: EntriesAsList - ) => void; - disabled?: boolean; - imageProvider?: PartialStreetImageProviderInputFields | undefined | null; -} - -function StreetMapillaryImageFiltersInput(props: Props) { - const { - value, - error: formError, - setFieldValue, - disabled, - imageProvider, - } = props; - - const error = getErrorObject(formError); - - return ( - - - - - - {imageProvider?.name === StreetImageProviderNameEnum.Mapillary && ( - - )} - - - - - - ); -} - -export default StreetMapillaryImageFiltersInput; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts deleted file mode 100644 index 6b64ae13..00000000 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - ObjectSchema, - PartialForm, -} from '@togglecorp/toggle-form'; - -import { StreetMapillaryImageFiltersInput } from '#generated/types/graphql'; -import { DeepNonNullable } from '#utils/types'; - -export type PartialStreetMapillaryImageFiltersInputFields = PartialForm< - DeepNonNullable ->; - -type StreetMapillaryImageFiltersFormSchema = ObjectSchema< - PartialStreetMapillaryImageFiltersInputFields ->; - -// eslint-disable-next-line max-len -export const defaultStreetMapillaryImageFiltersInputFormValue: PartialStreetMapillaryImageFiltersInputFields = { - randomizeOrder: false, -}; - -const streetMapillaryimageFiltersFormSchema: StreetMapillaryImageFiltersFormSchema = { - fields: (): ReturnType => ({ - panoOnly: {}, - creatorId: {}, - organizationId: {}, - startTime: {}, - endTime: {}, - randomizeOrder: {}, - samplingThreshold: {}, - }), -}; - -export default streetMapillaryimageFiltersFormSchema; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx index cf02f8d7..49d4536d 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx @@ -26,11 +26,11 @@ import NonFieldError from '#components/NonFieldError'; import { ProjectAssetInputTypeEnum } from '#generated/types/graphql'; import { - defaultStreetMapillaryImageFiltersInputFormValue, - PartialStreetMapillaryImageFiltersInputFields, -} from './StreetMapillaryImageFiltersInput/schema'; + defaultStreetImageFiltersInputFormValue, + PartialStreetImageFiltersInputFields, +} from './StreetImageFiltersInput/schema'; import { type PartialStreetSpecificFields } from './schema'; -import StreetMapillaryImageFiltersInput from './StreetMapillaryImageFiltersInput'; +import StreetImageFiltersInput from './StreetImageFiltersInput'; interface Props { projectId: string; @@ -73,10 +73,10 @@ function StreetProjectSpecifics(props: Props) { ); }, [setFieldValue]); - const setStreetMapillaryImageFiltersInputFieldValue = useFormObject<'mapillaryImageFilters', PartialStreetMapillaryImageFiltersInputFields>( + const setStreetImageFiltersInputFieldValue = useFormObject<'mapillaryImageFilters', PartialStreetImageFiltersInputFields>( 'mapillaryImageFilters' as const, setFieldValue, - defaultStreetMapillaryImageFiltersInputFormValue, + defaultStreetImageFiltersInputFormValue, ); const setStreetImageProviderFieldValue = useFormObject<'imageProvider', PartialStreetImageProviderInputFields>( @@ -138,9 +138,9 @@ function StreetProjectSpecifics(props: Props) { hint="Upload your project area as GeoJSON File (max. 1MB). Make sure that you provide a single polygon geometry." /> - , @@ -25,7 +25,7 @@ type StreetSpecificFormSchema = ObjectSchema< >; export const defaultStreetSpecificFormValue: PartialStreetSpecificFields = { - mapillaryImageFilters: defaultStreetMapillaryImageFiltersInputFormValue, + mapillaryImageFilters: defaultStreetImageFiltersInputFormValue, imageProvider: defaultStreetImageProviderValue, }; @@ -36,7 +36,7 @@ const streetSpecificFormSchema: StreetSpecificFormSchema = { member: () => customOptionSchema, }, aoiGeometry: {}, - mapillaryImageFilters: streetMapillaryimageFiltersFormSchema, + mapillaryImageFilters: streetImageFiltersFormSchema, imageProvider: streetImageProviderSchema, }), }; diff --git a/backend b/backend index 3089d827..201cc929 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 3089d827103cc40157930d0ff527ca93d0caa33f +Subproject commit 201cc929ec5e8ff5f6db632545fcb9eaf5b0a994 From 70d54877bb95cb90913362ac6ddd1f1d59e403ff Mon Sep 17 00:00:00 2001 From: ofritz Date: Wed, 29 Apr 2026 10:45:19 +0200 Subject: [PATCH 10/10] feat(street): update submodule pointer --- backend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend b/backend index 201cc929..5a5553cd 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 201cc929ec5e8ff5f6db632545fcb9eaf5b0a994 +Subproject commit 5a5553cd46e649b5cd0a62ece187c59073ef9547