2020-07-05 18:59:47 +02:00
import { AllKnownLayouts } from "./Customizations/AllKnownLayouts" ;
2020-07-21 00:07:04 +02:00
import { FixedUiElement } from "./UI/Base/FixedUiElement" ;
2020-07-29 15:05:19 +02:00
import { InitUiElements } from "./InitUiElements" ;
2020-08-17 17:23:15 +02:00
import { QueryParameters } from "./Logic/Web/QueryParameters" ;
2020-09-05 17:43:30 +02:00
import { UIEventSource } from "./Logic/UIEventSource" ;
2020-09-07 02:25:45 +02:00
import * as $ from "jquery" ;
2021-01-14 22:25:11 +01:00
import MoreScreen from "./UI/BigComponents/MoreScreen" ;
import State from "./State" ;
2021-01-22 01:03:50 +01:00
import Combine from "./UI/Base/Combine" ;
import Translations from "./UI/i18n/Translations" ;
2021-07-20 01:33:58 +02:00
import ValidatedTextField from "./UI/Input/ValidatedTextField" ;
import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers" ;
2021-08-07 23:11:34 +02:00
import LayoutConfig from "./Models/ThemeConfig/LayoutConfig" ;
2021-09-02 21:22:34 +02:00
import Constants from "./Models/Constants" ;
2021-09-21 02:10:42 +02:00
import MinimapImplementation from "./UI/Base/MinimapImplementation" ;
2021-03-22 02:45:22 +01:00
2021-09-21 02:10:42 +02:00
MinimapImplementation . initialize ( )
2021-06-23 02:15:28 +02:00
// Workaround for a stupid crash: inject some functions which would give stupid circular dependencies or crash the other nodejs scripts
2021-09-09 00:05:51 +02:00
ValidatedTextField . bestLayerAt = ( location , layerPref ) = > AvailableBaseLayers . SelectBestLayerAccordingTo ( location , layerPref )
2021-09-21 02:10:42 +02:00
2021-03-22 02:45:22 +01:00
2021-01-14 22:25:11 +01:00
let defaultLayout = ""
2020-07-24 01:12:57 +02:00
// --------------------- Special actions based on the parameters -----------------
2020-07-12 23:19:05 +02:00
// @ts-ignore
2020-07-15 14:03:44 +02:00
if ( location . href . startsWith ( "http://buurtnatuur.be" ) ) {
2020-07-11 11:50:03 +02:00
// Reload the https version. This is important for the 'locate me' button
2020-07-15 14:03:44 +02:00
window . location . replace ( "https://buurtnatuur.be" ) ;
2020-07-11 11:50:03 +02:00
}
2020-11-06 01:58:26 +01:00
2020-09-18 22:23:49 +02:00
if ( location . href . indexOf ( "buurtnatuur.be" ) >= 0 ) {
defaultLayout = "buurtnatuur"
}
2020-09-05 17:43:30 +02:00
let testing : UIEventSource < string > ;
2021-06-30 18:48:23 +02:00
if ( QueryParameters . GetQueryParameter ( "backend" , undefined ) . data !== "osm-test" &&
( location . hostname === "localhost" || location . hostname === "127.0.0.1" ) ) {
2020-09-05 17:43:30 +02:00
testing = QueryParameters . GetQueryParameter ( "test" , "true" ) ;
2020-06-25 03:39:31 +02:00
// Set to true if testing and changes should NOT be saved
2020-07-24 13:46:03 +02:00
testing . setData ( testing . data ? ? "true" )
2020-06-25 03:39:31 +02:00
// If you have a testfile somewhere, enable this to spoof overpass
// This should be hosted independantly, e.g. with `cd assets; webfsd -p 8080` + a CORS plugin to disable cors rules
2021-01-02 21:03:40 +01:00
// Overpass.testUrl = "http://127.0.0.1:8080/streetwidths.geojson";
2020-09-05 17:43:30 +02:00
} else {
testing = QueryParameters . GetQueryParameter ( "test" , "false" ) ;
2020-06-25 03:39:31 +02:00
}
2020-06-24 00:35:19 +02:00
2021-04-10 03:50:44 +02:00
// ----------------- SELECT THE RIGHT Theme -----------------
2020-06-24 00:35:19 +02:00
2020-09-18 22:23:49 +02:00
2020-07-26 02:01:34 +02:00
const path = window . location . pathname . split ( "/" ) . slice ( - 1 ) [ 0 ] ;
2020-09-11 19:14:32 +02:00
if ( path !== "index.html" && path !== "" ) {
2020-12-18 12:16:56 +01:00
defaultLayout = path ;
2021-01-14 22:25:11 +01:00
if ( path . endsWith ( ".html" ) ) {
2020-12-18 12:16:56 +01:00
defaultLayout = path . substr ( 0 , path . length - 5 ) ;
}
2020-09-11 19:14:32 +02:00
console . log ( "Using layout" , defaultLayout ) ;
2020-07-26 02:01:34 +02:00
}
2021-01-14 22:25:11 +01:00
defaultLayout = QueryParameters . GetQueryParameter ( "layout" , defaultLayout , "The layout to load into MapComplete" ) . data ;
2021-04-10 03:50:44 +02:00
let layoutToUse : LayoutConfig = AllKnownLayouts . allKnownLayouts . get ( defaultLayout . toLowerCase ( ) ) ;
2020-08-08 17:50:43 +02:00
2021-04-17 11:37:22 +02:00
const userLayoutParam = QueryParameters . GetQueryParameter ( "userlayout" , "false" , "If not 'false', a custom (non-official) theme is loaded. This custom layout can be done in multiple ways: \n\n- The hash of the URL contains a base64-encoded .json-file containing the theme definition\n- The hash of the URL contains a lz-compressed .json-file, as generated by the custom theme generator\n- The parameter itself is an URL, in which case that URL will be downloaded. It should point to a .json of a theme" ) ;
2021-04-22 03:54:14 +02:00
// Workaround/legacy to keep the old paramters working as I renamed some of them
2021-05-03 16:04:35 +02:00
if ( layoutToUse ? . id === "cyclofix" ) {
const legacy = QueryParameters . GetQueryParameter ( "layer-bike_shops" , "true" , "Legacy - keep De Fietsambassade working" ) ;
const correct = QueryParameters . GetQueryParameter ( "layer-bike_shop" , "true" , "Legacy - keep De Fietsambassade working" )
2021-05-28 12:59:48 +02:00
if ( legacy . data !== "true" ) {
correct . setData ( legacy . data )
2021-05-03 16:04:35 +02:00
}
2021-05-28 12:59:48 +02:00
console . log ( "layer-bike_shop toggles: legacy:" , legacy . data , "new:" , correct . data )
2021-05-03 16:04:35 +02:00
const legacyCafe = QueryParameters . GetQueryParameter ( "layer-bike_cafes" , "true" , "Legacy - keep De Fietsambassade working" )
const correctCafe = QueryParameters . GetQueryParameter ( "layer-bike_cafe" , "true" , "Legacy - keep De Fietsambassade working" )
2021-05-28 12:59:48 +02:00
if ( legacyCafe . data !== "true" ) {
2021-05-03 16:04:35 +02:00
correctCafe . setData ( legacy . data )
}
2021-04-21 18:27:15 +02:00
}
2020-09-07 02:25:45 +02:00
const layoutFromBase64 = decodeURIComponent ( userLayoutParam . data ) ;
2021-05-28 12:59:48 +02:00
new Combine ( [ "Initializing... <br/>" ,
new FixedUiElement ( "<a>If this message persist, something went wrong - click here to try again</a>" )
. SetClass ( "link-underline small" )
. onClick ( ( ) = > {
2021-06-17 00:37:57 +02:00
localStorage . clear ( ) ;
2021-05-28 12:59:48 +02:00
window . location . reload ( true ) ;
} ) ] )
. AttachTo ( "centermessage" ) ; // Add an initialization and reset button if something goes wrong
2021-01-18 19:36:19 +01:00
document . getElementById ( "decoration-desktop" ) . remove ( ) ;
2021-02-20 02:37:47 +01:00
if ( layoutFromBase64 . startsWith ( "http" ) ) {
const link = layoutFromBase64 ;
console . log ( "Downloading map theme from " , link ) ;
new FixedUiElement ( ` Downloading the theme from the <a href=" ${ link } ">link</a>... ` )
2020-09-07 02:25:45 +02:00
. AttachTo ( "centermessage" ) ;
$ . ajax ( {
2021-02-20 02:37:47 +01:00
url : link ,
2021-04-10 03:50:44 +02:00
success : ( data ) = > {
2021-03-22 02:45:22 +01:00
2020-09-07 02:25:45 +02:00
try {
2021-04-21 02:00:13 +02:00
console . log ( "Received " , data )
let parsed = data ;
2021-05-03 16:04:35 +02:00
if ( typeof parsed == "string" ) {
2021-04-21 02:00:13 +02:00
parsed = JSON . parse ( data ) ;
2021-05-28 12:59:48 +02:00
} else {
2021-05-20 12:27:33 +02:00
data = JSON . stringify ( parsed ) // De wereld op zijn kop
2021-04-21 02:00:13 +02:00
}
2021-01-15 01:57:46 +01:00
// Overwrite the id to the wiki:value
2021-02-20 02:37:47 +01:00
parsed . id = link ;
2021-04-17 11:37:22 +02:00
const layout = new LayoutConfig ( parsed , false ) . patchImages ( link , data ) ;
2020-11-17 18:23:40 +01:00
InitUiElements . InitAll ( layout , layoutFromBase64 , testing , layoutFromBase64 , btoa ( data ) ) ;
2020-09-07 02:25:45 +02:00
} catch ( e ) {
2021-04-21 02:00:13 +02:00
new FixedUiElement ( ` <a href=" ${ link } "> ${ link } </a> is invalid:<br/> ${ e } <br/> <a href='https:// ${ window . location . host } /'>Go back</a> ` )
2020-09-07 02:25:45 +02:00
. SetClass ( "clickable" )
. AttachTo ( "centermessage" ) ;
2021-01-09 00:29:12 +01:00
console . error ( "Could not parse the text" , data )
2020-09-07 02:25:45 +02:00
throw e ;
2020-07-31 04:58:58 +02:00
}
2020-09-07 02:25:45 +02:00
} ,
2021-01-15 01:57:46 +01:00
} ) . fail ( ( _ , textstatus , error ) = > {
console . error ( "Could not download the wiki theme:" , textstatus , error )
2021-02-20 02:37:47 +01:00
new FixedUiElement ( ` <a href=" ${ link } "> ${ link } </a> is invalid:<br/>Could not download - wrong URL?<br/> ` +
2021-01-15 01:57:46 +01:00
error +
"<a href='https://${window.location.host}/'>Go back</a>" )
2020-09-07 02:25:45 +02:00
. SetClass ( "clickable" )
. AttachTo ( "centermessage" ) ;
2020-07-29 18:35:46 +02:00
} ) ;
2020-07-31 01:45:54 +02:00
2020-09-15 00:25:25 +02:00
} else if ( layoutFromBase64 !== "false" ) {
2021-06-17 00:37:57 +02:00
let [ layoutToUse , encoded ] = InitUiElements . LoadLayoutFromHash ( userLayoutParam ) ;
InitUiElements . InitAll ( layoutToUse , layoutFromBase64 , testing , defaultLayout , encoded ) ;
2021-01-14 22:25:11 +01:00
} else if ( layoutToUse !== undefined ) {
// This is the default case: a builtin theme
2020-09-07 02:25:45 +02:00
InitUiElements . InitAll ( layoutToUse , layoutFromBase64 , testing , defaultLayout ) ;
2021-01-14 22:25:11 +01:00
} else {
2021-05-03 16:04:35 +02:00
// We fall through: no theme loaded: just show an overview of layouts
2021-05-30 00:17:31 +02:00
new FixedUiElement ( "" ) . AttachTo ( "centermessage" )
2021-01-14 22:25:11 +01:00
State . state = new State ( undefined ) ;
2021-01-27 03:08:46 +01:00
new Combine ( [ new MoreScreen ( true ) ,
2021-09-02 21:22:34 +02:00
Translations . t . general . aboutMapcomplete . SetClass ( "link-underline" ) ,
2021-09-09 00:05:51 +02:00
new FixedUiElement ( "v" + Constants . vNumber )
2021-01-25 03:12:09 +01:00
] ) . SetClass ( "block m-5 lg:w-3/4 lg:ml-40" )
2021-01-27 03:08:46 +01:00
. SetStyle ( "pointer-events: all;" )
2021-01-14 22:25:11 +01:00
. AttachTo ( "topleft-tools" ) ;
2020-07-29 15:05:19 +02:00
}
2021-05-11 00:40:16 +02:00
// Remove all context event listeners on mobile to prevent long presses
2021-04-10 03:50:44 +02:00
window . addEventListener ( 'contextmenu' , ( e ) = > { // Not compatible with IE < 9
2021-05-28 12:59:48 +02:00
if ( e . target [ "nodeName" ] === "INPUT" ) {
2021-05-11 00:40:16 +02:00
return ;
}
2020-12-14 00:04:53 +01:00
e . preventDefault ( ) ;
2021-05-11 00:40:16 +02:00
return false ;
2020-12-14 00:04:53 +01:00
} , false ) ;