2021-02-26 17:22:24 +01:00
import AllKnownLayers from "./AllKnownLayers" ;
2021-04-10 03:50:44 +02:00
import * as known_themes from "../assets/generated/known_layers_and_themes.json"
2021-08-07 23:11:34 +02:00
import LayoutConfig from "../Models/ThemeConfig/LayoutConfig" ;
2021-09-28 17:30:48 +02:00
import LayerConfig from "../Models/ThemeConfig/LayerConfig" ;
2021-11-08 02:36:01 +01:00
import BaseUIElement from "../UI/BaseUIElement" ;
import Combine from "../UI/Base/Combine" ;
import Title from "../UI/Base/Title" ;
import List from "../UI/Base/List" ;
2021-12-05 02:06:14 +01:00
import DependencyCalculator from "../Models/ThemeConfig/DependencyCalculator" ;
2021-07-03 22:00:36 +02:00
2020-07-05 18:59:47 +02:00
export class AllKnownLayouts {
2020-09-17 13:13:02 +02:00
2021-04-10 03:50:44 +02:00
public static allKnownLayouts : Map < string , LayoutConfig > = AllKnownLayouts . AllLayouts ( ) ;
public static layoutsList : LayoutConfig [ ] = AllKnownLayouts . GenerateOrderedList ( AllKnownLayouts . allKnownLayouts ) ;
2021-11-07 16:34:51 +01:00
public static AllPublicLayers() {
const allLayers : LayerConfig [ ] = [ ]
2021-09-28 17:30:48 +02:00
const seendIds = new Set < string > ( )
const publicLayouts = AllKnownLayouts . layoutsList . filter ( l = > ! l . hideFromOverview )
for ( const layout of publicLayouts ) {
2021-11-07 16:34:51 +01:00
if ( layout . hideFromOverview ) {
2021-09-28 17:30:48 +02:00
continue
}
for ( const layer of layout . layers ) {
2021-11-07 16:34:51 +01:00
if ( seendIds . has ( layer . id ) ) {
2021-09-28 17:30:48 +02:00
continue
}
seendIds . add ( layer . id )
allLayers . push ( layer )
}
}
return allLayers
}
2021-11-07 16:34:51 +01:00
2021-11-08 02:36:01 +01:00
public static GenLayerOverviewText ( ) : BaseUIElement {
for ( const id of AllKnownLayers . priviliged_layers ) {
if ( ! AllKnownLayers . sharedLayers . has ( id ) ) {
throw "Priviliged layer definition not found: " + id
}
}
2021-12-04 21:44:18 +01:00
2021-11-08 02:36:01 +01:00
const allLayers : LayerConfig [ ] = Array . from ( AllKnownLayers . sharedLayers . values ( ) )
2021-12-04 21:44:18 +01:00
. filter ( layer = > AllKnownLayers . priviliged_layers . indexOf ( layer . id ) < 0 )
const builtinLayerIds : Set < string > = new Set < string > ( )
allLayers . forEach ( l = > builtinLayerIds . add ( l . id ) )
2021-11-08 02:36:01 +01:00
const themesPerLayer = new Map < string , string [ ] > ( )
for ( const layout of Array . from ( AllKnownLayouts . allKnownLayouts . values ( ) ) ) {
2021-12-04 21:44:18 +01:00
if ( layout . hideFromOverview ) {
2021-11-08 02:36:01 +01:00
continue
}
for ( const layer of layout . layers ) {
2021-12-04 21:44:18 +01:00
if ( ! builtinLayerIds . has ( layer . id ) ) {
continue
}
2021-11-08 02:36:01 +01:00
if ( ! themesPerLayer . has ( layer . id ) ) {
themesPerLayer . set ( layer . id , [ ] )
}
themesPerLayer . get ( layer . id ) . push ( layout . id )
}
}
let popularLayerCutoff = 2 ;
2021-12-04 21:44:18 +01:00
const popuparLayers = allLayers . filter ( layer = > themesPerLayer . get ( layer . id ) ? . length >= 2 )
const unpopularLayers = allLayers . filter ( layer = > themesPerLayer . get ( layer . id ) ? . length < 2 )
2021-11-08 02:36:01 +01:00
2021-12-05 02:06:14 +01:00
// Determine the cross-dependencies
const layerIsNeededBy : Map < string , string [ ] > = new Map < string , string [ ] > ( )
for ( const layer of allLayers ) {
for ( const dep of DependencyCalculator . getLayerDependencies ( layer ) ) {
const dependency = dep . neededLayer
if ( ! layerIsNeededBy . has ( dependency ) ) {
layerIsNeededBy . set ( dependency , [ ] )
}
layerIsNeededBy . get ( dependency ) . push ( layer . id )
}
}
2021-11-08 02:36:01 +01:00
return new Combine ( [
new Title ( "Special and other useful layers" , 1 ) ,
"MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they get a mention here." ,
new Title ( "Priviliged layers" , 1 ) ,
new List ( AllKnownLayers . priviliged_layers . map ( id = > "[" + id + "](#" + id + ")" ) ) ,
. . . AllKnownLayers . priviliged_layers
. map ( id = > AllKnownLayers . sharedLayers . get ( id ) )
2021-12-05 02:06:14 +01:00
. map ( ( l ) = > l . GenerateDocumentation ( themesPerLayer . get ( l . id ) , layerIsNeededBy , DependencyCalculator . getLayerDependencies ( l ) , AllKnownLayers . added_by_default . indexOf ( l . id ) >= 0 , AllKnownLayers . no_include . indexOf ( l . id ) < 0 ) ) ,
2021-12-04 21:44:18 +01:00
new Title ( "Normal layers" , 1 ) ,
"The following layers are included in MapComplete" ,
new Title ( "Frequently reused layers" , 2 ) ,
"The following layers are used by at least " + popularLayerCutoff + " mapcomplete themes and might be interesting for your custom theme too" ,
new List ( popuparLayers . map ( layer = > "[" + layer . id + "](#" + layer . id + ")" ) ) ,
2021-12-05 02:06:14 +01:00
. . . popuparLayers . map ( ( layer ) = > layer . GenerateDocumentation ( themesPerLayer . get ( layer . id ) , layerIsNeededBy , DependencyCalculator . getLayerDependencies ( layer ) ) ) ,
2021-12-04 21:44:18 +01:00
new List ( unpopularLayers . map ( layer = > "[" + layer . id + "](#" + layer . id + ")" ) ) ,
2021-12-05 02:06:14 +01:00
. . . unpopularLayers . map ( layer = > layer . GenerateDocumentation ( themesPerLayer . get ( layer . id ) , layerIsNeededBy , DependencyCalculator . getLayerDependencies ( layer ) )
2021-12-04 21:44:18 +01:00
)
2021-11-08 02:36:01 +01:00
] )
}
2021-04-10 03:50:44 +02:00
private static GenerateOrderedList ( allKnownLayouts : Map < string , LayoutConfig > ) : LayoutConfig [ ] {
2021-04-22 03:57:50 +02:00
const keys = [ "personal" , "cyclofix" , "hailhydrant" , "bookcases" , "toilets" , "aed" ]
2021-04-10 03:50:44 +02:00
const list = [ ]
for ( const key of keys ) {
list . push ( allKnownLayouts . get ( key ) )
}
allKnownLayouts . forEach ( ( layout , key ) = > {
if ( keys . indexOf ( key ) < 0 ) {
list . push ( layout )
}
} )
return list ;
}
private static AddGhostBikes ( layout : LayoutConfig ) : LayoutConfig {
2021-03-21 01:49:08 +01:00
const now = new Date ( ) ;
const m = now . getMonth ( ) + 1 ;
const day = new Date ( ) . getDate ( ) + 1 ;
const date = day + "/" + m ;
if ( date === "31/10" || date === "1/11" || date === "2/11" ) {
console . log ( "The current date is " , date , ", which means we remember our dead" )
// Around Halloween/Fiesta de muerte/Allerzielen, we remember the dead
layout . layers . push (
AllKnownLayers . sharedLayers . get ( "ghost_bike" )
) ;
2020-07-31 04:58:58 +02:00
2021-03-21 01:49:08 +01:00
}
return layout ;
}
2020-07-25 01:07:02 +02:00
2020-11-11 16:23:49 +01:00
private static AllLayouts ( ) : Map < string , LayoutConfig > {
2021-04-10 03:50:44 +02:00
const dict : Map < string , LayoutConfig > = new Map ( ) ;
for ( const layoutConfigJson of known_themes . themes ) {
2021-10-11 23:52:17 +02:00
// @ts-ignore
2021-04-10 03:50:44 +02:00
const layout = new LayoutConfig ( layoutConfigJson , true )
if ( layout . id === "cyclofix" ) {
AllKnownLayouts . AddGhostBikes ( layout )
}
dict . set ( layout . id , layout )
2020-08-31 02:59:47 +02:00
for ( let i = 0 ; i < layout . layers . length ; i ++ ) {
let layer = layout . layers [ i ] ;
if ( typeof ( layer ) === "string" ) {
2021-02-26 17:22:24 +01:00
layer = layout . layers [ i ] = AllKnownLayers . sharedLayers . get ( layer ) ;
2021-03-21 01:49:08 +01:00
if ( layer === undefined ) {
2021-02-26 17:22:24 +01:00
console . log ( "Defined layers are " , AllKnownLayers . sharedLayers . keys ( ) )
2020-09-11 02:14:16 +02:00
throw ` Layer ${ layer } was not found or defined - probably a type was made `
}
2020-08-31 02:59:47 +02:00
}
2020-07-25 01:07:02 +02:00
}
}
2021-04-10 03:50:44 +02:00
return dict ;
2020-07-05 18:59:47 +02:00
}
2020-07-15 15:55:08 +02:00
2020-07-05 18:59:47 +02:00
}