forked from MapComplete/MapComplete
Better handling if wikipage is missing
This commit is contained in:
parent
a996ba2a7c
commit
54bc4f24da
2 changed files with 32 additions and 9 deletions
|
@ -12,6 +12,7 @@ import Wikidata, {WikidataResponse} from "../Logic/Web/Wikidata";
|
||||||
import Locale from "./i18n/Locale";
|
import Locale from "./i18n/Locale";
|
||||||
import Link from "./Base/Link";
|
import Link from "./Base/Link";
|
||||||
import {TabbedComponent} from "./Base/TabbedComponent";
|
import {TabbedComponent} from "./Base/TabbedComponent";
|
||||||
|
import {Translation} from "./i18n/Translation";
|
||||||
|
|
||||||
export default class WikipediaBox extends Combine {
|
export default class WikipediaBox extends Combine {
|
||||||
|
|
||||||
|
@ -75,7 +76,7 @@ export default class WikipediaBox extends Combine {
|
||||||
|
|
||||||
const wp = Translations.t.general.wikipedia;
|
const wp = Translations.t.general.wikipedia;
|
||||||
|
|
||||||
const wikiLink: UIEventSource<[string, string] | "loading" | "failed" | "no page"> =
|
const wikiLink: UIEventSource<[string, string, WikidataResponse] | "loading" | "failed" | ["no page", WikidataResponse]> =
|
||||||
Wikidata.LoadWikidataEntry(wikidataId)
|
Wikidata.LoadWikidataEntry(wikidataId)
|
||||||
.map(maybewikidata => {
|
.map(maybewikidata => {
|
||||||
if (maybewikidata === undefined) {
|
if (maybewikidata === undefined) {
|
||||||
|
@ -87,7 +88,7 @@ export default class WikipediaBox extends Combine {
|
||||||
}
|
}
|
||||||
const wikidata = <WikidataResponse>maybewikidata["success"]
|
const wikidata = <WikidataResponse>maybewikidata["success"]
|
||||||
if (wikidata.wikisites.size === 0) {
|
if (wikidata.wikisites.size === 0) {
|
||||||
return "no page"
|
return ["no page", wikidata]
|
||||||
}
|
}
|
||||||
|
|
||||||
const preferredLanguage = [Locale.language.data, "en", Array.from(wikidata.wikisites.keys())[0]]
|
const preferredLanguage = [Locale.language.data, "en", Array.from(wikidata.wikisites.keys())[0]]
|
||||||
|
@ -99,7 +100,7 @@ export default class WikipediaBox extends Combine {
|
||||||
pagetitle = wikidata.wikisites.get(language)
|
pagetitle = wikidata.wikisites.get(language)
|
||||||
i++;
|
i++;
|
||||||
} while (pagetitle === undefined)
|
} while (pagetitle === undefined)
|
||||||
return [pagetitle, language]
|
return [pagetitle, language, wikidata]
|
||||||
}, [Locale.language])
|
}, [Locale.language])
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,12 +113,15 @@ export default class WikipediaBox extends Combine {
|
||||||
if (status === "failed") {
|
if (status === "failed") {
|
||||||
return wp.failed.Clone().SetClass("alert p-4")
|
return wp.failed.Clone().SetClass("alert p-4")
|
||||||
}
|
}
|
||||||
if (status == "no page") {
|
if (status[0] == "no page") {
|
||||||
return wp.noWikipediaPage.Clone()
|
const [_, wd] = <[string, WikidataResponse]> status
|
||||||
|
return new Combine([
|
||||||
|
Translation.fromMap(wd.descriptions) ,
|
||||||
|
wp.noWikipediaPage.Clone().SetClass("subtle")]).SetClass("flex flex-col p-4")
|
||||||
}
|
}
|
||||||
|
|
||||||
const [pagetitle, language] = status
|
const [pagetitle, language, wd] = <[string, string, WikidataResponse]> status
|
||||||
return WikipediaBox.createContents(pagetitle, language)
|
return WikipediaBox.createContents(pagetitle, language, wd)
|
||||||
|
|
||||||
})
|
})
|
||||||
).SetClass("overflow-auto normal-background rounded-lg")
|
).SetClass("overflow-auto normal-background rounded-lg")
|
||||||
|
@ -125,7 +129,11 @@ export default class WikipediaBox extends Combine {
|
||||||
|
|
||||||
const titleElement = new VariableUiElement(wikiLink.map(state => {
|
const titleElement = new VariableUiElement(wikiLink.map(state => {
|
||||||
if (typeof state !== "string") {
|
if (typeof state !== "string") {
|
||||||
const [pagetitle, language] = state
|
const [pagetitle, _] = state
|
||||||
|
if(pagetitle === "no page"){
|
||||||
|
const wd = <WikidataResponse> state[1]
|
||||||
|
return new Title( Translation.fromMap(wd.labels),3)
|
||||||
|
}
|
||||||
return new Title(pagetitle, 3)
|
return new Title(pagetitle, 3)
|
||||||
}
|
}
|
||||||
//return new Title(Translations.t.general.wikipedia.wikipediaboxTitle.Clone(), 2)
|
//return new Title(Translations.t.general.wikipedia.wikipediaboxTitle.Clone(), 2)
|
||||||
|
@ -136,6 +144,13 @@ export default class WikipediaBox extends Combine {
|
||||||
const linkElement = new VariableUiElement(wikiLink.map(state => {
|
const linkElement = new VariableUiElement(wikiLink.map(state => {
|
||||||
if (typeof state !== "string") {
|
if (typeof state !== "string") {
|
||||||
const [pagetitle, language] = state
|
const [pagetitle, language] = state
|
||||||
|
if(pagetitle === "no page"){
|
||||||
|
const wd = <WikidataResponse> state[1]
|
||||||
|
return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "),
|
||||||
|
"https://www.wikidata.org/wiki/"+wd.id
|
||||||
|
, true)
|
||||||
|
}
|
||||||
|
|
||||||
const url = `https://${language}.wikipedia.org/wiki/${pagetitle}`
|
const url = `https://${language}.wikipedia.org/wiki/${pagetitle}`
|
||||||
return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "), url, true)
|
return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "), url, true)
|
||||||
}
|
}
|
||||||
|
@ -157,7 +172,7 @@ export default class WikipediaBox extends Combine {
|
||||||
* @param language
|
* @param language
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
private static createContents(pagename: string, language: string): BaseUIElement {
|
private static createContents(pagename: string, language: string, wikidata: WikidataResponse): BaseUIElement {
|
||||||
const htmlContent = Wikipedia.GetArticle({
|
const htmlContent = Wikipedia.GetArticle({
|
||||||
pageName: pagename,
|
pageName: pagename,
|
||||||
language: language
|
language: language
|
||||||
|
|
|
@ -214,4 +214,12 @@ export class Translation extends BaseUIElement {
|
||||||
}
|
}
|
||||||
return allTranslations
|
return allTranslations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static fromMap(transl: Map<string, string>) {
|
||||||
|
const translations = {}
|
||||||
|
transl.forEach((value, key) => {
|
||||||
|
translations[key] = value
|
||||||
|
})
|
||||||
|
return new Translation(translations);
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue