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,