Small fixes in CustomGenerator; artworkmap is now a json-preset
This commit is contained in:
parent
c8b2dab669
commit
1cdf2ee9bc
9 changed files with 224 additions and 150 deletions
|
@ -6,7 +6,6 @@ import {Groen} from "./Layouts/Groen";
|
||||||
import Cyclofix from "./Layouts/Cyclofix";
|
import Cyclofix from "./Layouts/Cyclofix";
|
||||||
import {StreetWidth} from "./Layouts/StreetWidth";
|
import {StreetWidth} from "./Layouts/StreetWidth";
|
||||||
import {GRB} from "./Layouts/GRB";
|
import {GRB} from "./Layouts/GRB";
|
||||||
import {Artworks} from "./Layouts/Artworks";
|
|
||||||
import {ClimbingTrees} from "./Layouts/ClimbingTrees";
|
import {ClimbingTrees} from "./Layouts/ClimbingTrees";
|
||||||
import {Smoothness} from "./Layouts/Smoothness";
|
import {Smoothness} from "./Layouts/Smoothness";
|
||||||
import {MetaMap} from "./Layouts/MetaMap";
|
import {MetaMap} from "./Layouts/MetaMap";
|
||||||
|
@ -16,6 +15,7 @@ import {CustomLayoutFromJSON} from "./JSON/CustomLayoutFromJSON";
|
||||||
import * as bookcases from "../assets/themes/bookcases/Bookcases.json";
|
import * as bookcases from "../assets/themes/bookcases/Bookcases.json";
|
||||||
import * as aed from "../assets/themes/aed/aed.json";
|
import * as aed from "../assets/themes/aed/aed.json";
|
||||||
import * as toilets from "../assets/themes/toilets/toilets.json";
|
import * as toilets from "../assets/themes/toilets/toilets.json";
|
||||||
|
import * as artworks from "../assets/themes/artwork/artwork.json";
|
||||||
|
|
||||||
export class AllKnownLayouts {
|
export class AllKnownLayouts {
|
||||||
|
|
||||||
|
@ -30,11 +30,11 @@ export class AllKnownLayouts {
|
||||||
CustomLayoutFromJSON.LayoutFromJSON(bookcases),
|
CustomLayoutFromJSON.LayoutFromJSON(bookcases),
|
||||||
CustomLayoutFromJSON.LayoutFromJSON(aed),
|
CustomLayoutFromJSON.LayoutFromJSON(aed),
|
||||||
CustomLayoutFromJSON.LayoutFromJSON(toilets),
|
CustomLayoutFromJSON.LayoutFromJSON(toilets),
|
||||||
|
CustomLayoutFromJSON.LayoutFromJSON(artworks),
|
||||||
|
|
||||||
new MetaMap(),
|
new MetaMap(),
|
||||||
new StreetWidth(),
|
new StreetWidth(),
|
||||||
new ClimbingTrees(),
|
new ClimbingTrees(),
|
||||||
new Artworks(),
|
|
||||||
new Smoothness(),
|
new Smoothness(),
|
||||||
new Groen(),
|
new Groen(),
|
||||||
|
|
||||||
|
|
|
@ -1,88 +0,0 @@
|
||||||
import {LayerDefinition} from "../LayerDefinition";
|
|
||||||
import {Tag} from "../../Logic/TagsFilter";
|
|
||||||
import L from "leaflet";
|
|
||||||
import {ImageCarouselWithUploadConstructor} from "../../UI/Image/ImageCarouselWithUpload";
|
|
||||||
import Translations from "../../UI/i18n/Translations";
|
|
||||||
import Website from "../Questions/Website";
|
|
||||||
import FixedText from "../Questions/FixedText";
|
|
||||||
import {TagRenderingOptions} from "../TagRenderingOptions";
|
|
||||||
|
|
||||||
export class Artwork extends LayerDefinition {
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super("artwork");
|
|
||||||
this.name = "artwork";
|
|
||||||
const t = Translations.t.artwork;
|
|
||||||
this.title = t.title;
|
|
||||||
const tag = new Tag("tourism", "artwork");
|
|
||||||
this.presets = [
|
|
||||||
{
|
|
||||||
title: this.title,
|
|
||||||
tags: [tag]
|
|
||||||
}
|
|
||||||
];
|
|
||||||
this.icon = "./assets/statue.svg";
|
|
||||||
this.overpassFilter = tag;
|
|
||||||
this.minzoom = 13;
|
|
||||||
|
|
||||||
|
|
||||||
const to = Translations.t.artwork.type;
|
|
||||||
const artworkType = new TagRenderingOptions({
|
|
||||||
priority: 5,
|
|
||||||
question: to.question,
|
|
||||||
freeform: {
|
|
||||||
key: "artwork_type",
|
|
||||||
extraTags: new Tag("fixme", "Freeform artwork_type= tag used: possibly a wrong value"),
|
|
||||||
template: to.template.txt,
|
|
||||||
renderTemplate: to.render.txt,
|
|
||||||
placeholder: Translations.t.cyclofix.freeFormPlaceholder,
|
|
||||||
},
|
|
||||||
mappings: [
|
|
||||||
{k: new Tag("artwork_type", "architecture"), txt: to.architecture},
|
|
||||||
{k: new Tag("artwork_type", "mural"), txt: to.mural},
|
|
||||||
{k: new Tag("artwork_type", "painting"), txt: to.painting},
|
|
||||||
{k: new Tag("artwork_type", "sculpture"), txt: to.sculpture},
|
|
||||||
{k: new Tag("artwork_type", "statue"), txt: to.statue},
|
|
||||||
{k: new Tag("artwork_type", "bust"), txt: to.bust},
|
|
||||||
{k: new Tag("artwork_type", "stone"), txt: to.stone},
|
|
||||||
{k: new Tag("artwork_type", "installation"), txt: to.installation},
|
|
||||||
{k: new Tag("artwork_type", "graffiti"), txt: to.graffiti},
|
|
||||||
{k: new Tag("artwork_type", "relief"), txt: to.relief},
|
|
||||||
{k: new Tag("artwork_type", "azulejo"), txt: to.azulejo},
|
|
||||||
{k: new Tag("artwork_type", "tilework"), txt: to.tilework}
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
const artistQuestion = new TagRenderingOptions({
|
|
||||||
question: t.artist.question,
|
|
||||||
freeform: {
|
|
||||||
key: "artist_name",
|
|
||||||
template: "$$$",
|
|
||||||
renderTemplate: "{artist_name}"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.elementsToShow = [
|
|
||||||
|
|
||||||
new ImageCarouselWithUploadConstructor(),
|
|
||||||
artworkType,
|
|
||||||
artistQuestion,
|
|
||||||
new Website(t.title)
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
this.style = function (tags) {
|
|
||||||
return {
|
|
||||||
icon: {
|
|
||||||
iconUrl: "./assets/statue.svg",
|
|
||||||
iconSize: [40, 40],
|
|
||||||
},
|
|
||||||
color: "#0000ff"
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
import {Layout} from "../Layout";
|
|
||||||
import {Artwork} from "../Layers/Artwork";
|
|
||||||
|
|
||||||
export class Artworks extends Layout{
|
|
||||||
constructor() {
|
|
||||||
super( "artworks",
|
|
||||||
["en","nl","fr"],
|
|
||||||
"Open Artwork Map",
|
|
||||||
[new Artwork()],
|
|
||||||
10,
|
|
||||||
50.8435,
|
|
||||||
4.3688,
|
|
||||||
"<h3>Open Artwork Map</h3>");
|
|
||||||
this.icon = "./assets/statue.svg"
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
2
State.ts
2
State.ts
|
@ -24,7 +24,7 @@ export class State {
|
||||||
// The singleton of the global state
|
// The singleton of the global state
|
||||||
public static state: State;
|
public static state: State;
|
||||||
|
|
||||||
public static vNumber = "0.0.6a";
|
public static vNumber = "0.0.6b";
|
||||||
|
|
||||||
// The user journey states thresholds when a new feature gets unlocked
|
// The user journey states thresholds when a new feature gets unlocked
|
||||||
public static userJourney = {
|
public static userJourney = {
|
||||||
|
|
|
@ -578,17 +578,20 @@ export class ThemeGenerator extends UIElement {
|
||||||
textField = new TextField<string>({
|
textField = new TextField<string>({
|
||||||
placeholder: "single key",
|
placeholder: "single key",
|
||||||
startValidated: false,
|
startValidated: false,
|
||||||
value: new UIEventSource<string>(""),
|
value:value,
|
||||||
toString: str => str,
|
toString: str => str,
|
||||||
fromString: str => {
|
fromString: str => {
|
||||||
|
if(str === undefined){
|
||||||
|
return "";
|
||||||
|
}
|
||||||
if (str === "*") {
|
if (str === "*") {
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
str = str.trim();
|
str = str.trim();
|
||||||
if (str.match("^_*[a-zA-Z]*[a-zA-Z0-9:]*$") == null) {
|
if (str.match("^_*[a-zA-Z]*[a-zA-Z0-9:_]*$") == null) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
return str.trim();
|
return str;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -619,13 +622,18 @@ export class ThemeGenerator extends UIElement {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let sendingPing = false;
|
||||||
value.addCallback((v) => {
|
value.addCallback((v) => {
|
||||||
if (v === undefined || v === "") {
|
if (v === undefined || v === "") {
|
||||||
delete root[key];
|
delete root[key];
|
||||||
} else {
|
} else {
|
||||||
root[key] = v;
|
root[key] = v;
|
||||||
}
|
}
|
||||||
|
if(!sendingPing){
|
||||||
|
sendingPing = true;
|
||||||
self.themeObject.ping(); // We assume the root is a part of the themeObject
|
self.themeObject.ping(); // We assume the root is a part of the themeObject
|
||||||
|
sendingPing = false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
self.themeObject.addCallback(() => {
|
self.themeObject.addCallback(() => {
|
||||||
|
|
|
@ -13,6 +13,7 @@ export class ValidatedTextField {
|
||||||
"$": (str) => true,
|
"$": (str) => true,
|
||||||
"string": (str) => true,
|
"string": (str) => true,
|
||||||
"date": (str) => true, // TODO validate and add a date picker
|
"date": (str) => true, // TODO validate and add a date picker
|
||||||
|
"wikidata": (str) => true, // TODO validate wikidata IDS
|
||||||
"int": (str) => {str = ""+str; return str !== undefined && str.indexOf(".") < 0 && !isNaN(Number(str))},
|
"int": (str) => {str = ""+str; return str !== undefined && str.indexOf(".") < 0 && !isNaN(Number(str))},
|
||||||
"nat": (str) => {str = ""+str; return str !== undefined && str.indexOf(".") < 0 && !isNaN(Number(str)) && Number(str) > 0},
|
"nat": (str) => {str = ""+str; return str !== undefined && str.indexOf(".") < 0 && !isNaN(Number(str)) && Number(str) > 0},
|
||||||
"float": (str) => !isNaN(Number(str)),
|
"float": (str) => !isNaN(Number(str)),
|
||||||
|
|
|
@ -66,10 +66,15 @@ export class MoreScreen extends UIElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentLocation = State.state.locationControl.data;
|
const currentLocation = State.state.locationControl.data;
|
||||||
const linkText =
|
let linkText =
|
||||||
`https://pietervdvn.github.io/MapComplete/${layout.name}.html?z=${currentLocation.zoom}&lat=${currentLocation.lat}&lon=${currentLocation.lon}`
|
`./${layout.name}.html?z=${currentLocation.zoom}&lat=${currentLocation.lat}&lon=${currentLocation.lon}`
|
||||||
|
|
||||||
|
if (location.hostname === "localhost" || location.hostname === "127.0.0.1") {
|
||||||
|
linkText = `./index.html?layout=${layout.name}&z=${currentLocation.zoom}&lat=${currentLocation.lat}&lon=${currentLocation.lon}`
|
||||||
|
}
|
||||||
|
|
||||||
let description = Translations.W(layout.description);
|
let description = Translations.W(layout.description);
|
||||||
if(description !== undefined){
|
if (description !== undefined) {
|
||||||
description = new Combine(["<br/>", description]);
|
description = new Combine(["<br/>", description]);
|
||||||
}
|
}
|
||||||
const link =
|
const link =
|
||||||
|
|
|
@ -29,38 +29,7 @@ export default class Translations {
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
artwork: {
|
|
||||||
name: new T({ en: 'Artwork', nl: 'Kunstwerk', fr: "Oeuvre d'art" }),
|
|
||||||
title: new T({ en: 'Artwork', nl: 'Kunstwerk', fr: "Oeuvre d'art" }),
|
|
||||||
type: {
|
|
||||||
render: new T({
|
|
||||||
en: 'This is artwork of the type: {artwork_type}',
|
|
||||||
nl: 'Dit is een kunstwerk van het type: {artwork_type}',
|
|
||||||
fr: "Ceci est un travail d'art de type: {artwork_type}"
|
|
||||||
}),
|
|
||||||
template: new T({ en: 'Some other type: $$$', nl: 'Een ander type: $$$', fr: 'Un autre type: $$$' }),
|
|
||||||
question: new T({
|
|
||||||
en: 'What is the type of this artwork?',
|
|
||||||
nl: 'Wat voor type kunstwerk is dit?',
|
|
||||||
fr: "Quel est le type de cette oeuvre d'art?"
|
|
||||||
}),
|
|
||||||
architecture: new T({ en: "architecture", nl: "architectuur", fr: "architecture" }),
|
|
||||||
mural: new T({ en: "mural", nl: "muurschildering", fr: "mural" }),
|
|
||||||
painting: new T({ en: "painting", nl: "schilderij", fr: "peinture" }),
|
|
||||||
sculpture: new T({ en: "sculpture", nl: "beeldhouwwerk", fr: "sculpture" }),
|
|
||||||
statue: new T({ en: "statue", nl: "standbeeld", fr: "statue" }),
|
|
||||||
bust: new T({ en: "bust", nl: "buste", fr: "buste" }),
|
|
||||||
stone: new T({ en: "stone", nl: "steen", fr: "rocher" }),
|
|
||||||
installation: new T({ en: "installation", nl: "installatie", fr: "installation" }),
|
|
||||||
graffiti: new T({ en: "graffiti", nl: "graffiti", fr: "graffiti" }),
|
|
||||||
relief: new T({ en: "relief", nl: "verlichting", fr: "relief" }),
|
|
||||||
azulejo: new T({ en: "azulejo", nl: "azulejo", fr: "azulejo" }),
|
|
||||||
tilework: new T({ en: "tilework", nl: "tegelwerk", fr: "carrelage" })
|
|
||||||
}, artist: {
|
|
||||||
question: new T({en:"Which artist created this artwork?"})
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
cyclofix: {
|
cyclofix: {
|
||||||
title: new T({
|
title: new T({
|
||||||
en: 'Cyclofix - an open map for cyclists',
|
en: 'Cyclofix - an open map for cyclists',
|
||||||
|
@ -754,7 +723,7 @@ export default class Translations {
|
||||||
header: new T({
|
header: new T({
|
||||||
en: "<h2>Add a point?</h2>You clicked somewhere where no data is known yet.<br/>",
|
en: "<h2>Add a point?</h2>You clicked somewhere where no data is known yet.<br/>",
|
||||||
nl: "<h2>Punt toevoegen?</h2>Je klikte ergens waar er nog geen data is.<br/>",
|
nl: "<h2>Punt toevoegen?</h2>Je klikte ergens waar er nog geen data is.<br/>",
|
||||||
fr: "<h2>Pas de données</h2> vous avez cliqué sur un endroit ou il n'y a pas encore de données. <br/>"
|
fr: "<h2>Pas de données</h2>Vous avez cliqué sur un endroit ou il n'y a pas encore de données. <br/>"
|
||||||
|
|
||||||
}),
|
}),
|
||||||
pleaseLogin: new T({
|
pleaseLogin: new T({
|
||||||
|
|
|
@ -1,2 +1,198 @@
|
||||||
|
{
|
||||||
|
"startLat": 0,
|
||||||
|
"startLon": 0,
|
||||||
|
"startZoom": 12,
|
||||||
|
"maintainer": "Not logged in",
|
||||||
|
"language": [
|
||||||
|
"en",
|
||||||
|
"nl"
|
||||||
|
],
|
||||||
|
"widenFactor": 0.07,
|
||||||
|
"name": "artworks",
|
||||||
|
"title": {
|
||||||
|
"en": "Open Artwork Map",
|
||||||
|
"nl": "Kunstwerkenkaart"
|
||||||
|
},
|
||||||
|
"icon": "./assets/themes/artwork/artwork.svg",
|
||||||
|
"description": {
|
||||||
|
"en": "Welcome to Open Artwork Map, a map of statues, busts, grafittis, ... all over the world",
|
||||||
|
"nl": "Welkom op de Open Kunstwerken Kaart"
|
||||||
|
},
|
||||||
|
"layers": [
|
||||||
{
|
{
|
||||||
|
"id": "Artwork",
|
||||||
|
"title": {
|
||||||
|
"key": "*",
|
||||||
|
"render": {
|
||||||
|
"en": "Artwork",
|
||||||
|
"nl": "Kunstwerk",
|
||||||
|
"fr": "Oeuvre d'art"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"key": "*",
|
||||||
|
"render": "./assets/themes/artwork/artwork.svg"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"key": "*",
|
||||||
|
"render": "#0000ff"
|
||||||
|
},
|
||||||
|
"width": {
|
||||||
|
"key": "*",
|
||||||
|
"render": "10"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en": "",
|
||||||
|
"nl": ""
|
||||||
|
},
|
||||||
|
"minzoom": 12,
|
||||||
|
"wayHandling": 2,
|
||||||
|
"presets": [
|
||||||
|
{
|
||||||
|
"tags": "tourism=artwork",
|
||||||
|
"title": {
|
||||||
|
"en": "Artwork"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tagRenderings": [
|
||||||
|
{
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"if": "a=b",
|
||||||
|
"then": "xyz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=architecture",
|
||||||
|
"then": {
|
||||||
|
"en": "architecture",
|
||||||
|
"nl": "architectuur",
|
||||||
|
"fr": "architecture"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=mural",
|
||||||
|
"then": {
|
||||||
|
"en": "mural",
|
||||||
|
"nl": "muurschildering",
|
||||||
|
"fr": "mural"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=painting",
|
||||||
|
"then": {
|
||||||
|
"en": "painting",
|
||||||
|
"nl": "schilderij",
|
||||||
|
"fr": "peinture"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=sculpture",
|
||||||
|
"then": {
|
||||||
|
"en": "sculpture",
|
||||||
|
"nl": "beeldhouwwerk",
|
||||||
|
"fr": "sculpture"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=statue",
|
||||||
|
"then": {
|
||||||
|
"en": "statue",
|
||||||
|
"nl": "standbeeld",
|
||||||
|
"fr": "statue"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=bust",
|
||||||
|
"then": {
|
||||||
|
"en": "bust",
|
||||||
|
"nl": "buste",
|
||||||
|
"fr": "buste"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=stone",
|
||||||
|
"then": {
|
||||||
|
"en": "stone",
|
||||||
|
"nl": "steen",
|
||||||
|
"fr": "rocher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=installation",
|
||||||
|
"then": {
|
||||||
|
"en": "installation",
|
||||||
|
"nl": "installatie",
|
||||||
|
"fr": "installation"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=graffiti",
|
||||||
|
"then": {
|
||||||
|
"en": "graffiti",
|
||||||
|
"nl": "graffiti",
|
||||||
|
"fr": "graffiti"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=relief",
|
||||||
|
"then": {
|
||||||
|
"en": "relief",
|
||||||
|
"nl": "verlichting",
|
||||||
|
"fr": "relief"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=azulejo",
|
||||||
|
"then": {
|
||||||
|
"en": "azulejo",
|
||||||
|
"nl": "azulejo",
|
||||||
|
"fr": "azulejo"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "artwork_type=tilework",
|
||||||
|
"then": {
|
||||||
|
"en": "tilework",
|
||||||
|
"nl": "tegelwerk",
|
||||||
|
"fr": "carrelage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"key": "artwork_type",
|
||||||
|
"render": {
|
||||||
|
"en": "This is a {artwork_type}",
|
||||||
|
"nl": "Dit is een {artwork_type}",
|
||||||
|
"fr": "{artwork_type}"
|
||||||
|
},
|
||||||
|
"type": "text",
|
||||||
|
"question": {
|
||||||
|
"en": "What is the type of this artwork?",
|
||||||
|
"nl": "Wat voor soort kunstwerk is dit?",
|
||||||
|
"fr": "Quel est le type de cette oeuvre d'art?"
|
||||||
|
},
|
||||||
|
"addExtraTags": "fixme=Artowrk type was added with the freeform, might need another check"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"question": "Which wikidata-entry corresponds with <b>this artwork</b>?",
|
||||||
|
"key": "wikidata",
|
||||||
|
"type": "wikidata",
|
||||||
|
"render": "Corresponds with <a href='https://www.wikidata.org/wiki/{wikidata}' target='_blank'>{wikidata}</a>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"question": "Which artist created this?",
|
||||||
|
"key": "artist_name",
|
||||||
|
"render": "Created by {artist_name}",
|
||||||
|
"condition": "wikidata="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"question": "On which website is more information about this artwork?",
|
||||||
|
"key": "website",
|
||||||
|
"type": "url",
|
||||||
|
"render": "More information on {website}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"overpassTags": "tourism=artwork"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
Loading…
Reference in a new issue