Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions map-view/src/common/MapUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,19 @@ export function getFeatureAppName(feature: Feature, overlayConfig: LayerConfig)
if (name_from_feat) {
return name_from_feat;
}
const featureType: string = feature["id_"].split(".")[0];
const feature_layer = overlayConfig["layers"].find((l) => l.identifier === featureType);
const feature_layer = getFeatureLayer(getFeatureType(feature), overlayConfig);
return feature_layer ? feature_layer["app_name"] : "traffic_control";
}

export function getFeatureLayerName(feature: Feature, overlayConfig: LayerConfig) {
const feature_layer = getFeatureLayer(getFeatureType(feature), overlayConfig);
return feature_layer ? feature_layer["name"] : "FeatureInfo title (missing)";
}

function getFeatureLayer(featureType: string, overlayConfig: LayerConfig) {
return overlayConfig["layers"].find((l) => l.identifier === featureType);
}

function getFeatureType(feature: Feature) {
return feature["id_"].split(".")[0];
}
4 changes: 2 additions & 2 deletions map-view/src/components/FeatureInfo.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ test("renders feature info", () => {
{
geometry: { type: "Point", coordinates: [1, 1] },
geometry_name: "location",
id_: "traffic_sign_real.20950c38-eb7e-11ea-adc1-0242ac120002",
id_: "overlay-1.20950c38-eb7e-11ea-adc1-0242ac120002",
getProperties: () => ({
id: "fcdbbc6f-5903-4574-baa3-fef33a4b0621",
// @ts-ignore
Expand All @@ -32,6 +32,6 @@ test("renders feature info", () => {
onSelectFeature={(feature = mockFeatures[0]) => new Promise((resolve) => resolve(0))}
/>,
);
const featureInfoTitle = getByText(/traffic_sign_real/i);
const featureInfoTitle = getByText("Overlay 1");
expect(featureInfoTitle).toBeInTheDocument();
});
10 changes: 6 additions & 4 deletions map-view/src/components/FeatureInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import React from "react";
import { APIBaseUrl } from "../consts";
import { Feature, MapConfig } from "../models";
import { withTranslation, WithTranslation } from "react-i18next";
import { getFeatureAppName } from "../common/MapUtils";
import { getFeatureAppName, getFeatureLayerName } from "../common/MapUtils";

const styles = (theme: Theme) =>
createStyles({
Expand Down Expand Up @@ -82,6 +82,10 @@ class FeatureInfo extends React.Component<FeatureInfoProps, FeatureInfoState> {
return `${APIBaseUrl}/admin/${app_name}/${featureTypeEditName.replace(/_/g, "")}/${featureId}/change`;
}

getFeatureInfoTitle(feature: Feature) {
return getFeatureLayerName(feature, this.props.mapConfig.overlayConfig);
}

runOnSelectFeature(featureIndex: number) {
const { features, onSelectFeature } = this.props;
const feature = features[featureIndex];
Expand All @@ -98,8 +102,6 @@ class FeatureInfo extends React.Component<FeatureInfoProps, FeatureInfoState> {
const { featureIndex } = this.state;
const feature = features[featureIndex];

const fid = feature["id_"];
const featureType = fid.split(".")[0];
const {
id,
value,
Expand All @@ -122,7 +124,7 @@ class FeatureInfo extends React.Component<FeatureInfoProps, FeatureInfoState> {
<Card className={classes.root}>
<CardContent>
<Typography className={classes.title} variant="h5" component="h2">
{t(`featureInfoTitle.${featureType}`)}
{this.getFeatureInfoTitle(feature)}
</Typography>
<Typography className={classes.content} variant="body1" component="p">
<b>Id</b>: {id}
Expand Down
2 changes: 2 additions & 0 deletions map-view/src/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import en from "./locale/en.json";
import fi from "./locale/fi.json";
import sv from "./locale/sv.json";

i18n
.use(initReactI18next)
Expand All @@ -11,6 +12,7 @@ i18n
resources: {
en,
fi,
sv,
},
detection: {
order: ["path"],
Expand Down
10 changes: 0 additions & 10 deletions map-view/src/locale/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,6 @@
"translation": {
"edit": "edit",
"close": "close",
"featureInfoTitle": {
"trafficsignreal": "Traffic Sign Real",
"trafficsignplan": "Traffic Sign Plan",
"additionalsignreal": "Additional Sign Real",
"additionalsignplan": "Additional Sign Plan",
"furnituresignpostreal": "Furniture Signpost Real",
"furnituresignpostplan": "Furniture Signpost Plan",
"mountrealcentroid": "Mount Real Centroid",
"mountplancentroid": "Mount Plan Centroid"
},
"Device type": "Device type",
"Direction": "Direction",
"Additional info": "Additional info",
Expand Down
10 changes: 0 additions & 10 deletions map-view/src/locale/fi.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,6 @@
"translation": {
"edit": "muokkaa",
"close": "sulje",
"featureInfoTitle": {
"trafficsignreal": "Liikennemerkkitoteuma",
"trafficsignplan": "Liikennemerkkisuunnitelma",
"additionalsignreal": "Lisäkilpitoteuma",
"additionalsignplan": "Lisäkilpisuunnitelma",
"furnituresignpostreal": "Kaupunkikalustetoteuma",
"furnituresignpostplan": "Kaupunkikalustesuunnitelma",
"mountrealcentroid": "Kiinnityskohta_keskipiste (toteuma)",
"mountplancentroid": "Kiinnityskohta_keskipiste (suunnitelma)"
},
"Device type": "Merkki",
"Direction": "Suunta",
"Additional info": "Lisätieto",
Expand Down
16 changes: 16 additions & 0 deletions map-view/src/locale/sv.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"translation": {
"edit": "redigera",
"close": "stäng",
"Device type": "Anordningstypen",
"Direction": "Riktning",
"Additional info": "Ytterligare information",
"Mount type": "Monteringstyp",
"Content Schema": "Schema för innehållet",
"Distance to plan": "Avstånd till planet",
"Layers": "Skikt",
"Settings": "Inställningar",
"Display Plan/Real difference": "Visa plan/implementering skillnad",
"Filter by Project": "Filtrera efter projekt"
}
}
18 changes: 18 additions & 0 deletions map/migrations/0009_layer_name_sv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.20 on 2025-05-20 11:46

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('map', '0008_icondrawingconfig'),
]

operations = [
migrations.AddField(
model_name='layer',
name='name_sv',
field=models.CharField(default='Missing SW translation', max_length=200, verbose_name='Swedish name'),
),
]
1 change: 1 addition & 0 deletions map/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class Layer(models.Model):
app_name = models.CharField(_("App Name"), max_length=200, default="traffic_control")
name_fi = models.CharField(_("Finnish name"), max_length=200)
name_en = models.CharField(_("English name"), max_length=200)
name_sv = models.CharField(_("Swedish name"), max_length=200, default="Missing SW translation")
is_basemap = models.BooleanField(_("Is basemap"), default=False)
order = models.IntegerField(_("Order"), default=1)
filter_fields = models.CharField(_("Filter fields"), max_length=200, blank=True)
Expand Down
23 changes: 21 additions & 2 deletions map/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,33 +65,52 @@ def test_with_icon_draw_config(self):
f"{request.build_absolute_uri(settings.STATIC_URL)}traffic_control/png/traffic_sign_icons/{idc.png_size}/",
)

def test_layer_config_return_ok(self):
def test_layer_config_return_ok_en(self):
self._do_test_layer_config_ok("en")

def test_layer_config_return_ok_fi(self):
self._do_test_layer_config_ok("fi")

def test_layer_config_return_ok_sv(self):
self._do_test_layer_config_ok("sv")

def test_layer_config_return_ok_not_supported(self):
self._do_test_layer_config_ok("not_supported_lang", "fi")

def _do_test_layer_config_ok(self, language_code, expected_language_code=None):
expect_language_code = expected_language_code or language_code
Layer.objects.create(
identifier="basemap",
name_en="Basemap en",
name_fi="Basemap fi",
name_sv="Basemap sv",
is_basemap=True,
)
Layer.objects.create(
identifier="overlay-1",
name_en="Overlay 1 en",
name_fi="Overlay 1 fi",
name_sv="Overlay 1 sv",
is_basemap=False,
)
Layer.objects.create(
identifier="overlay-2",
name_en="Overlay 2 en",
name_fi="Overlay 2 fi",
name_sv="Overlay 2 sv",
is_basemap=False,
)
FeatureTypeEditMapping.objects.create(name="featurename", edit_name="edit_featurename")
request = self.factory.get(reverse("map-config"))
request.LANGUAGE_CODE = "en"
request.LANGUAGE_CODE = language_code
response = map_config(request)
self.assertEqual(response.status_code, 200)
response_data = json.loads(response.content)
self.assertEqual(len(response_data["basemapConfig"]["layers"]), 1)
self.assertEqual(response_data["basemapConfig"]["layers"][0]["name"], f"Basemap {expect_language_code}")
self.assertEqual(len(response_data["overlayConfig"]["layers"]), 2)
self.assertEqual(response_data["overlayConfig"]["layers"][0]["name"], f"Overlay 1 {expect_language_code}")
self.assertEqual(response_data["overlayConfig"]["layers"][1]["name"], f"Overlay 2 {expect_language_code}")
self.assertEqual(
response_data["overviewConfig"]["imageUrl"],
f"{request.build_absolute_uri(settings.STATIC_URL)}traffic_control/png/map/cityinfra_overview_map-704x704.png",
Expand Down
13 changes: 12 additions & 1 deletion map/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,17 @@

from .models import FeatureTypeEditMapping, Layer

ALLOWED_MAP_LANGUAGE_CODES = ["en", "fi", "sv"]
"""Layer model needs to have field name_<language_code>"""


@staff_member_required
def map_view(request):
return render(request, "index.html")


def map_config(request):
language_code = request.LANGUAGE_CODE
language_code = _get_language_code(request)
basemaps = []
for basemap in Layer.objects.filter(is_basemap=True):
basemaps.append(
Expand Down Expand Up @@ -70,3 +73,11 @@ def _get_overview_image_extent():
Coordinates for top left corner are 25490088.0, 6687593.0
"""
return [25490088.0, 6687593.0 - 32 * 704, 25490088 + 32 * 704, 6687593.0]


def _get_language_code(request):
"""Get language code from request. If not allowed then defaults to en."""
language_from_request = request.LANGUAGE_CODE
if language_from_request not in ALLOWED_MAP_LANGUAGE_CODES:
return "fi"
return language_from_request
Loading