2020-07-31 21:54:30 +02:00
import { OsmConnection } from "./Logic/Osm/OsmConnection" ;
2020-08-07 16:01:18 +02:00
import Combine from "./UI/Base/Combine" ;
import { Button } from "./UI/Base/Button" ;
import { TextField } from "./UI/Input/TextField" ;
import { FixedUiElement } from "./UI/Base/FixedUiElement" ;
2021-05-07 13:17:42 +02:00
import { Utils } from "./Utils" ;
import { SubtleButton } from "./UI/Base/SubtleButton" ;
2021-05-07 15:09:52 +02:00
import LZString from "lz-string" ;
2021-06-15 00:55:12 +02:00
import BaseUIElement from "./UI/BaseUIElement" ;
import Table from "./UI/Base/Table" ;
2021-08-07 23:11:34 +02:00
import { LayoutConfigJson } from "./Models/ThemeConfig/Json/LayoutConfigJson" ;
2021-09-28 17:30:48 +02:00
import { Changes } from "./Logic/Osm/Changes" ;
import { ElementStorage } from "./Logic/ElementStorage" ;
2020-07-31 21:54:30 +02:00
2021-09-28 17:30:48 +02:00
const connection = new OsmConnection ( {
osmConfiguration : 'osm' ,
changes : new Changes ( ) ,
layoutName : '' ,
allElements : new ElementStorage ( )
} ) ;
2020-08-07 16:01:18 +02:00
let rendered = false ;
2021-05-07 13:17:42 +02:00
function salvageThemes ( preferences : any ) {
const knownThemeNames = new Set < string > ( ) ;
const correctThemeNames = [ ]
for ( const key in preferences ) {
2021-11-07 16:34:51 +01:00
try {
if ( ! ( typeof key === "string" ) ) {
continue ;
}
const prefix = "mapcomplete-installed-theme-" ;
// mapcomplete-installed-theme-arbres_llefia-combined-11
//mapcomplete-installed-theme-1roadAlllanes-combined-length
if ( ! key . startsWith ( prefix ) ) {
continue ;
}
const theme = key . substring ( prefix . length , key . indexOf ( "-combined-" ) )
2021-05-07 13:17:42 +02:00
2021-11-07 16:34:51 +01:00
if ( key . endsWith ( "-length" ) ) {
correctThemeNames . push ( theme )
} else {
knownThemeNames . add ( theme ) ;
}
} catch ( e ) {
console . error ( e )
2021-05-07 13:17:42 +02:00
}
2021-11-07 16:34:51 +01:00
}
2021-05-07 13:17:42 +02:00
for ( const correctThemeName of correctThemeNames ) {
knownThemeNames . delete ( correctThemeName ) ;
}
const missingValues = Array . from ( knownThemeNames ) . map ( failedTheme = > {
let i = 0 ;
let foundValue = undefined
let combined = ""
do {
2021-05-07 15:09:52 +02:00
const prefix = "mapcomplete-installed-theme-" ;
2021-05-07 13:17:42 +02:00
const key = prefix + failedTheme + "-combined-" + i ;
foundValue = preferences [ key ]
2021-09-09 00:05:51 +02:00
console . log ( key , "-->" , foundValue )
2021-05-07 13:17:42 +02:00
i ++ ;
combined += foundValue ? ? ""
} while ( foundValue !== undefined ) ;
2021-09-09 00:05:51 +02:00
if ( combined === "" ) {
2021-05-07 15:09:52 +02:00
return null ;
}
2021-09-09 00:05:51 +02:00
2021-05-07 15:09:52 +02:00
console . log ( "COmbined value is" , combined )
let jsonObject ;
try {
jsonObject = JSON . parse ( atob ( combined ) ) ;
} catch ( e ) {
2021-11-07 16:34:51 +01:00
try {
// We try to decode with lz-string
jsonObject = JSON . parse ( Utils . UnMinify ( LZString . decompressFromBase64 ( combined ) ) ) as LayoutConfigJson ;
} catch ( e0 ) {
console . log ( "Could not salvage theme. Initial parsing failed due to:" , e , "\nWith LZ failed due " , e0 )
2021-09-28 17:30:48 +02:00
}
2021-05-07 15:09:52 +02:00
}
2021-05-07 13:17:42 +02:00
return {
themeName : failedTheme ,
2021-05-07 15:09:52 +02:00
contents : JSON.stringify ( jsonObject , null , " " )
2021-05-07 13:17:42 +02:00
}
} )
2021-09-09 00:05:51 +02:00
return Utils . NoNull ( missingValues ) ;
2021-05-07 15:09:52 +02:00
}
2021-09-09 00:05:51 +02:00
function clearAll ( preferences ) {
2021-05-07 15:09:52 +02:00
for ( const key in preferences ) {
const pref = connection . GetPreference ( key , "" ) ;
if ( key . startsWith ( "mapcomplete" ) ) {
pref . setData ( "" )
}
}
2021-05-07 13:17:42 +02:00
}
2021-05-07 15:09:52 +02:00
function SalvageButton ( theme : { themeName : string , contents : string } ) {
return new SubtleButton ( "./assets/svg/bug.svg" , "Download broken theme " + theme . themeName ) . onClick (
2021-05-07 13:17:42 +02:00
( ) = > {
2021-05-31 00:20:15 +02:00
Utils . offerContentsAsDownloadableFile ( theme . contents , theme . themeName + ".json" )
2021-05-07 13:17:42 +02:00
}
)
}
2020-08-07 16:01:18 +02:00
function createTable ( preferences : any ) {
if ( rendered ) {
return ;
}
rendered = true ;
2021-09-09 00:05:51 +02:00
const prefs : ( BaseUIElement | string ) [ ] [ ] = [ ] ;
2020-08-07 16:01:18 +02:00
for ( const key in preferences ) {
2021-09-09 00:05:51 +02:00
if ( ! preferences . hasOwnProperty ( key ) ) {
2021-06-15 00:55:12 +02:00
continue ;
}
2020-08-07 16:01:18 +02:00
const pref = connection . GetPreference ( key , "" ) ;
2021-06-15 00:55:12 +02:00
let value : BaseUIElement = new FixedUiElement ( pref . data ) ;
2020-08-07 16:01:18 +02:00
if ( connection . userDetails . data . csCount > 500 &&
( key . startsWith ( "mapcomplete" ) || connection . userDetails . data . csCount > 2500 ) ) {
2020-10-02 19:00:24 +02:00
value = new TextField ( {
2020-08-07 16:01:18 +02:00
value : pref
} ) ;
}
2021-06-15 00:55:12 +02:00
const row = [
2020-08-07 16:01:18 +02:00
key ,
2021-06-15 00:55:12 +02:00
new Button ( "delete" , ( ) = > pref . setData ( null ) ) ,
value
2020-08-07 16:01:18 +02:00
] ;
2021-06-15 00:55:12 +02:00
prefs . push ( row ) ;
2020-08-07 16:01:18 +02:00
}
2021-04-10 03:50:44 +02:00
new Combine (
2021-05-07 13:17:42 +02:00
[
. . . salvageThemes ( preferences ) . map ( theme = > SalvageButton ( theme ) ) ,
2021-06-15 00:55:12 +02:00
new Table (
2021-09-09 00:05:51 +02:00
[ "Key" , "" , "Value" ] ,
2021-06-15 00:55:12 +02:00
prefs
) ,
2021-09-09 00:05:51 +02:00
new SubtleButton ( "./assets/svg/delete_icon.svg" , "Delete all mapcomplete preferences (mangrove identies are preserved)" ) . onClick ( ( ) = > clearAll ( preferences ) ) ]
2021-04-10 03:50:44 +02:00
) . AttachTo ( "maindiv" ) ;
2020-08-07 16:01:18 +02:00
}
2020-08-27 11:11:20 +02:00
connection . preferencesHandler . preferences . addCallback ( ( prefs ) = > createTable ( prefs ) )
2020-08-07 16:01:18 +02:00