diff --git a/src/components/FeaturePanel/ClimbingRouteGrade.tsx b/src/components/FeaturePanel/ClimbingRouteGrade.tsx index 1597a22b..ebfc50f5 100644 --- a/src/components/FeaturePanel/ClimbingRouteGrade.tsx +++ b/src/components/FeaturePanel/ClimbingRouteGrade.tsx @@ -1,12 +1,12 @@ import { useFeatureContext } from '../utils/FeatureContext'; -import { isClimbingRoute } from '../../utils'; +import { isFeatureClimbingRoute } from '../../utils'; import { getDifficulties } from './Climbing/utils/grades/routeGrade'; import { ConvertedRouteDifficultyBadge } from './Climbing/ConvertedRouteDifficultyBadge'; import React from 'react'; export const ClimbingRouteGrade = () => { const { feature } = useFeatureContext(); - if (!isClimbingRoute(feature)) { + if (!isFeatureClimbingRoute(feature)) { return null; } diff --git a/src/components/FeaturePanel/EditDialog/EditContent/FeatureEditSection/MajorKeysEditor.tsx b/src/components/FeaturePanel/EditDialog/EditContent/FeatureEditSection/MajorKeysEditor.tsx index 13edcf05..d26b10ff 100644 --- a/src/components/FeaturePanel/EditDialog/EditContent/FeatureEditSection/MajorKeysEditor.tsx +++ b/src/components/FeaturePanel/EditDialog/EditContent/FeatureEditSection/MajorKeysEditor.tsx @@ -10,6 +10,15 @@ import { OpeningHoursEditor } from './OpeningHoursEditor/OpeningHoursEditor'; import styled from '@emotion/styled'; import { CharacterCount, getInputTypeForKey } from '../helpers'; import { useFeatureEditData } from './SingleFeatureEditContext'; +import { isClimbingRoute } from '../../../../../utils'; + +export const climbingRouteMajorKeys = [ + 'author', + 'climbing:grade:uiaa', + 'climbing:grade:french', + 'climbing:boulder', + 'length', +]; export const majorKeys = [ 'name', @@ -21,7 +30,7 @@ export const majorKeys = [ const MAX_INPUT_LENGTH = 255; -const getData = (numberOfWikimediaItems: number) => { +const getData = (numberOfWikimediaItems: number, isClimbingRoute?: boolean) => { const wikimediaCommonTags = Array(numberOfWikimediaItems) .fill('') .reduce((acc, _, index) => { @@ -31,7 +40,11 @@ const getData = (numberOfWikimediaItems: number) => { }, {}); return { - keys: [...majorKeys, ...Object.keys(wikimediaCommonTags)], + keys: [ + ...majorKeys, + ...Object.keys(wikimediaCommonTags), + ...(isClimbingRoute ? climbingRouteMajorKeys : []), + ], names: { name: t('tags.name'), description: t('tags.description'), @@ -39,6 +52,15 @@ const getData = (numberOfWikimediaItems: number) => { phone: t('tags.phone'), opening_hours: t('tags.opening_hours'), ...wikimediaCommonTags, + ...(isClimbingRoute + ? { + author: t('tags.author'), + 'climbing:grade:uiaa': t('tags.climbing_grade_uiaa'), + 'climbing:grade:french': t('tags.climbing_grade_french'), + 'climbing:boulder': t('tags.climbing_boulder'), + length: t('tags.length'), + } + : {}), }, }; }; @@ -100,8 +122,7 @@ export const MajorKeysEditor = () => { // TODO this code will be replaced when implementing id presets fields const nextWikimediaCommonsIndex = getNextWikimediaCommonsIndex(tags); - const data = getData(nextWikimediaCommonsIndex + 1); - + const data = getData(nextWikimediaCommonsIndex + 1, isClimbingRoute(tags)); const [activeMajorKeys, setActiveMajorKeys] = useState(() => data.keys.filter((k) => !!tags[k]), ); diff --git a/src/components/FeaturePanel/Properties/Properties.tsx b/src/components/FeaturePanel/Properties/Properties.tsx index 0b0af814..de0572aa 100644 --- a/src/components/FeaturePanel/Properties/Properties.tsx +++ b/src/components/FeaturePanel/Properties/Properties.tsx @@ -12,7 +12,7 @@ import { getReactKey, getShortId } from '../../../services/helpers'; import * as Sentry from '@sentry/nextjs'; import { MyRouteTicks } from '../Climbing/Ticks/MyRouteTicks'; -import { isClimbingRoute } from '../../../utils'; +import { isFeatureClimbingRoute } from '../../../utils'; class ErrorBoundary extends React.Component< { fallback: React.ReactNode }, @@ -92,7 +92,9 @@ export const Properties = ({ showTags }) => { )} - {isClimbingRoute(feature) && } + {isFeatureClimbingRoute(feature) && ( + + )} ); }; diff --git a/src/locales/cs.js b/src/locales/cs.js index 2f9ffe8f..98071eaa 100644 --- a/src/locales/cs.js +++ b/src/locales/cs.js @@ -227,6 +227,11 @@ export default { 'tags.website': 'Web', 'tags.phone': 'Telefon', 'tags.opening_hours': 'Otevírací doba', + 'tags.author': 'Autor', + 'tags.climbing_grade_uiaa': 'UIAA klasifikace', + 'tags.climbing_grade_french': 'Francouzská klasifikace', + 'tags.climbing_boulder': 'Boulder', + 'tags.length': 'Délka', 'coordinates.geo_uri': 'GeoURI (mapová appka v telefonu)', diff --git a/src/locales/vocabulary.js b/src/locales/vocabulary.js index 8ac46260..e8b4635b 100644 --- a/src/locales/vocabulary.js +++ b/src/locales/vocabulary.js @@ -270,6 +270,11 @@ export default { 'tags.website': 'Website', 'tags.phone': 'Phone', 'tags.opening_hours': 'Hours', + 'tags.author': 'Author', + 'tags.climbing_grade_uiaa': 'UIAA climbing grade', + 'tags.climbing_grade_french': 'French climbing grade', + 'tags.climbing_boulder': 'Boulder', + 'tags.length': 'Length', 'coordinates.geo_uri': 'GeoURI (phone map app)', diff --git a/src/services/osm/osmApi.ts b/src/services/osm/osmApi.ts index 2f7e397c..9153bdb0 100644 --- a/src/services/osm/osmApi.ts +++ b/src/services/osm/osmApi.ts @@ -10,7 +10,7 @@ import { getImageDefs, mergeMemberImageDefs } from '../images/getImageDefs'; import { fetchOverpassCenter } from '../overpass/fetchOverpassCenter'; import { isClimbingRelation, - isClimbingRoute, + isFeatureClimbingRoute, isPublictransportRoute, isRouteMaster, } from '../../utils'; @@ -180,7 +180,7 @@ const addMemberFeaturesToRelation = async (relation: Feature) => { export const addMembersAndParents = async ( feature: Feature, ): Promise => { - if (isClimbingRoute(feature)) { + if (isFeatureClimbingRoute(feature)) { const parentFeatures = await fetchParentFeatures(feature.osmMeta); return { ...feature, parentFeatures }; } diff --git a/src/utils.ts b/src/utils.ts index 65d52415..979703ed 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,6 @@ import { Feature, + FeatureTags, LonLatRounded, Position, PositionBoth, @@ -68,8 +69,11 @@ export const isClimbingRelation = (feature: Feature) => feature.osmMeta.type === 'relation' && (feature.tags.climbing === 'crag' || feature.tags.climbing === 'area'); -export const isClimbingRoute = (feature: Feature) => - ['route_bottom', 'route_top', 'route'].includes(feature?.tags.climbing); +export const isFeatureClimbingRoute = (feature: Feature) => + isClimbingRoute(feature?.tags); + +export const isClimbingRoute = (tags: FeatureTags) => + ['route_bottom', 'route_top', 'route'].includes(tags.climbing); export const isRouteMaster = ({ tags,