Themes: improve favourite panel
This commit is contained in:
parent
37cdf0f01a
commit
59090fdb39
14 changed files with 176 additions and 51 deletions
62
assets/svg/center.svg
Normal file
62
assets/svg/center.svg
Normal file
|
@ -0,0 +1,62 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="544.02838"
|
||||
height="544.02838"
|
||||
viewBox="0 0 544.02838 544.02838"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
sodipodi:docname="center.svg"
|
||||
inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showguides="true"
|
||||
inkscape:zoom="0.90326851"
|
||||
inkscape:cx="393.57068"
|
||||
inkscape:cy="250.756"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="995"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1">
|
||||
<sodipodi:guide
|
||||
position="171.95879,103.32864"
|
||||
orientation="0,-1"
|
||||
id="guide4"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="271.68286,132.35281"
|
||||
orientation="1,0"
|
||||
id="guide5"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<path
|
||||
d="m 365.63918,111.75001 h -62.375 V 15.9375 c 0,-8.75 -7,-15.9375 -15.625,-15.9375 h -31.1875 c -8.5625,0 -15.625,7.1875 -15.625,15.9375 v 95.81251 h -62.375 l 93.5625,127.75 z"
|
||||
id="path1"
|
||||
sodipodi:nodetypes="ccsssscccc" />
|
||||
<path
|
||||
d="m 432.27837,365.63919 v -62.375 h 95.8125 c 8.75,0 15.9375,-7 15.9375,-15.625 v -31.1875 c 0,-8.5625 -7.1875,-15.625 -15.9375,-15.625 h -95.8125 v -62.375 l -127.75,93.5625 z"
|
||||
id="path1-5"
|
||||
sodipodi:nodetypes="ccsssscccc" />
|
||||
<path
|
||||
d="m 178.38918,432.27838 h 62.375 v 95.8125 c 0,8.75 7,15.9375 15.625,15.9375 h 31.1875 c 8.5625,0 15.625,-7.1875 15.625,-15.9375 v -95.8125 h 62.375 l -93.5625,-127.75 z"
|
||||
id="path2"
|
||||
sodipodi:nodetypes="ccsssscccc" />
|
||||
<path
|
||||
d="m 111.75,178.38919 v 62.375 H 15.9375 c -8.75,0 -15.9375,7 -15.9375,15.625 v 31.1875 c 0,8.5625 7.1875,15.625 15.9375,15.625 H 111.75 v 62.375 l 127.74999,-93.5625 z"
|
||||
id="path3"
|
||||
sodipodi:nodetypes="ccsssscccc" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
2
assets/svg/center.svg.license
Normal file
2
assets/svg/center.svg.license
Normal file
|
@ -0,0 +1,2 @@
|
|||
SPDX-FileCopyrightText: Pieter Vander Vennet
|
||||
SPDX-License-Identifier: CC0
|
|
@ -153,6 +153,14 @@
|
|||
"https://commons.wikimedia.org/wiki/File:Camera_font_awesome.svg"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "center.svg",
|
||||
"license": "CC0-1.0",
|
||||
"authors": [
|
||||
"Pieter Vander Vennet"
|
||||
],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"path": "checkmark.svg",
|
||||
"license": "CC0-1.0",
|
||||
|
@ -859,24 +867,6 @@
|
|||
],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"path": "no_checkmark.svg",
|
||||
"license": "TRIVIAL",
|
||||
"authors": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"path": "no_checkmark.svg",
|
||||
"license": "TRIVIAL",
|
||||
"authors": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"path": "none.svg",
|
||||
"license": "TRIVIAL",
|
||||
"authors": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"path": "not_found.svg",
|
||||
"license": "CC-BY-4.0",
|
||||
|
|
|
@ -69,10 +69,12 @@
|
|||
},
|
||||
"+titleIcons": [
|
||||
{
|
||||
"id": "climbing_length",
|
||||
"render": "<div class='flex' style='word-wrap: normal; padding-right: 0.25rem;'><img src='./assets/themes/climbing/height.svg' style='height: 1.75rem;'/>{climbing:length}m</div>",
|
||||
"condition": "climbing:length~*"
|
||||
},
|
||||
{
|
||||
"id":"climbing_bolts",
|
||||
"mappings": [
|
||||
{
|
||||
"if": "__bolts_max~*",
|
||||
|
@ -95,6 +97,7 @@
|
|||
"render": "<div class='w-8 flex justify-center rounded-right-full climbing-{__difficulty_max:char}'> {__difficulty_max}</div>"
|
||||
},
|
||||
{
|
||||
"id": "difficulty",
|
||||
"render": "<div class='flex justify-center rounded-full pl-1 pr-1 climbing-{__difficulty:char}'> {climbing:grade:french}</div>",
|
||||
"condition": "__difficulty:char~*"
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
"generate:service-worker": "tsc src/service-worker.ts --outFile public/service-worker.js && git_hash=$(git rev-parse HEAD) && sed -i \"s/GITHUB-COMMIT/$git_hash/\" public/service-worker.js",
|
||||
"optimize-images": "cd assets/generated/ && find -name '*.png' -exec optipng '{}' \\; && echo 'PNGs are optimized'",
|
||||
"generate:stats": "vite-node scripts/GenerateSeries.ts",
|
||||
"reset:layeroverview": "mkdir -p ./src/assets/generated/layers; echo {\\\"themes\\\":[]} > ./src/assets/generated/known_themes.json && echo {\\\"layers\\\": []} > ./src/assets/generated/known_layers.json && rm -f ./src/assets/generated/layers/*.json && rm -f ./src/assets/generated/themes/*.json && cp ./assets/layers/usersettings/usersettings.json ./src/assets/generated/layers/usersettings.json && npm run generate:layeroverview && vite-node scripts/generateLayerOverview.ts -- --force",
|
||||
"reset:layeroverview": "mkdir -p ./src/assets/generated/layers; echo {\\\"themes\\\":[]} > ./src/assets/generated/known_themes.json && echo {\\\"layers\\\": []} > ./src/assets/generated/known_layers.json && rm -f ./src/assets/generated/layers/*.json && rm -f ./src/assets/generated/themes/*.json && cp ./assets/layers/usersettings/usersettings.json ./src/assets/generated/layers/usersettings.json && echo '{}' > ./src/assets/generated/layers/favourite.json && npm run generate:layeroverview && vite-node scripts/generateLayerOverview.ts -- --force",
|
||||
"generate": "mkdir -p ./assets/generated; npm run generate:licenses; npm run generate:images; npm run generate:charging-stations; npm run generate:translations; npm run reset:layeroverview; npm run generate:service-worker",
|
||||
"generate:charging-stations": "cd ./assets/layers/charging_station && vite-node csvToJson.ts && cd -",
|
||||
"prepare-deploy": "npm run generate:service-worker && ./scripts/build.sh",
|
||||
|
|
|
@ -15,7 +15,7 @@ export class AllKnownLayoutsLazy {
|
|||
constructor(includeFavouriteLayer = true) {
|
||||
for (const layoutConfigJson of known_themes["themes"]) {
|
||||
for (const layerId of Constants.added_by_default) {
|
||||
if (layerId === "favourite") {
|
||||
if (layerId === "favourite" && favourite.id) {
|
||||
if (includeFavouriteLayer) {
|
||||
layoutConfigJson.layers.push(favourite)
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ export class MenuState {
|
|||
public static readonly _menuviewTabs = [
|
||||
"about",
|
||||
"settings",
|
||||
"favourites",
|
||||
"community",
|
||||
"privacy",
|
||||
"advanced",
|
||||
|
|
|
@ -22,7 +22,7 @@ import { TagsFilter } from "../../../Logic/Tags/TagsFilter"
|
|||
import { Translatable } from "../Json/Translatable"
|
||||
import { ConversionContext } from "./ConversionContext"
|
||||
|
||||
class ValidateLanguageCompleteness extends DesugaringStep<any> {
|
||||
class ValidateLanguageCompleteness extends DesugaringStep<LayoutConfig> {
|
||||
private readonly _languages: string[]
|
||||
|
||||
constructor(...languages: string[]) {
|
||||
|
@ -34,7 +34,9 @@ class ValidateLanguageCompleteness extends DesugaringStep<any> {
|
|||
this._languages = languages ?? ["en"]
|
||||
}
|
||||
|
||||
convert(obj: any, context: ConversionContext): LayerConfig {
|
||||
convert(obj: LayoutConfig, context: ConversionContext): LayoutConfig {
|
||||
const origLayers = obj.layers
|
||||
obj.layers = [...obj.layers].filter((l) => l["id"] !== "favourite")
|
||||
const translations = Translation.ExtractAllTranslationsFrom(obj)
|
||||
for (const neededLanguage of this._languages) {
|
||||
translations
|
||||
|
@ -56,7 +58,7 @@ class ValidateLanguageCompleteness extends DesugaringStep<any> {
|
|||
)
|
||||
})
|
||||
}
|
||||
|
||||
obj.layers = origLayers
|
||||
return obj
|
||||
}
|
||||
}
|
||||
|
@ -1369,7 +1371,12 @@ export class ValidateLayerConfig extends DesugaringStep<LayerConfigJson> {
|
|||
}
|
||||
|
||||
convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson {
|
||||
return this.validator.convert(json, context).raw
|
||||
const prepared = this.validator.convert(json, context)
|
||||
if (!prepared) {
|
||||
context.err("Preparing layer failed")
|
||||
return undefined
|
||||
}
|
||||
return prepared?.raw
|
||||
}
|
||||
}
|
||||
export class ValidateLayer extends Conversion<
|
||||
|
|
|
@ -243,7 +243,7 @@ export interface LayerConfigJson {
|
|||
* Type: icon[]
|
||||
* group: infobox
|
||||
*/
|
||||
titleIcons?: (string | TagRenderingConfigJson)[] | ["defaults"]
|
||||
titleIcons?: (string | (TagRenderingConfigJson & { id?: string }))[] | ["defaults"]
|
||||
|
||||
/**
|
||||
* Creates points to render on the map.
|
||||
|
|
|
@ -1,10 +1,59 @@
|
|||
<script lang="ts">
|
||||
|
||||
export let properties: Record<string, string>
|
||||
import type { SpecialVisualizationState } from "../SpecialVisualization";
|
||||
import TagRenderingAnswer from "../Popup/TagRendering/TagRenderingAnswer.svelte";
|
||||
import type { Feature } from "geojson";
|
||||
import { ImmutableStore } from "../../Logic/UIEventSource";
|
||||
import { GeoOperations } from "../../Logic/GeoOperations";
|
||||
import Center from "../../assets/svg/Center.svelte";
|
||||
|
||||
export let feature: Feature;
|
||||
let properties: Record<string, string> = feature.properties;
|
||||
export let state: SpecialVisualizationState;
|
||||
let tags = state.featureProperties.getStore(properties.id) ?? new ImmutableStore(properties);
|
||||
|
||||
const favLayer = state.layerState.filteredLayers.get("favourite");
|
||||
const favConfig = favLayer.layerDef;
|
||||
const titleConfig = favConfig.title;
|
||||
|
||||
function center(){
|
||||
const [lon, lat] = GeoOperations.centerpointCoordinates(feature)
|
||||
state.mapProperties.location.setData(
|
||||
{lon, lat}
|
||||
)
|
||||
state.guistate.menuIsOpened.setData(false)
|
||||
}
|
||||
|
||||
function select(){
|
||||
state.selectedLayer.setData(favConfig)
|
||||
state.selectedElement.setData(feature)
|
||||
center()
|
||||
}
|
||||
|
||||
const titleIconBlacklist = ["osmlink","sharelink","favourite_title_icon"]
|
||||
|
||||
</script>
|
||||
|
||||
<div>
|
||||
{JSON.stringify(properties)}
|
||||
{properties?.id ?? "undefined"}
|
||||
<a href={properties._backend +"/"+ properties?.id}>OSM</a>
|
||||
<div class="px-1 my-1 border-2 border-dashed border-gray-300 rounded flex justify-between items-center">
|
||||
<h3 on:click={() => select()} class="cursor-pointer ml-1 m-0">
|
||||
<TagRenderingAnswer config={titleConfig} layer={favConfig} selectedElement={feature} {tags} />
|
||||
</h3>
|
||||
|
||||
<div class="flex items-center">
|
||||
{#each favConfig.titleIcons as titleIconConfig}
|
||||
{#if (titleIconBlacklist.indexOf(titleIconConfig.id) < 0) && (titleIconConfig.condition?.matchesProperties(properties) ?? true) && (titleIconConfig.metacondition?.matchesProperties( { ...properties, ...state.userRelatedState.preferencesAsTags.data } ) ?? true) && titleIconConfig.IsKnown(properties)}
|
||||
<div class={titleIconConfig.renderIconClass ?? "flex h-8 w-8 items-center"}>
|
||||
<TagRenderingAnswer
|
||||
config={titleIconConfig}
|
||||
{tags}
|
||||
selectedElement={feature}
|
||||
{state}
|
||||
layer={favLayer}
|
||||
extraClasses="h-full justify-center"
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
{/each}
|
||||
<button on:click={() => center()} class="p-1" ><Center class="w-6 h-6"/></button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -11,9 +11,9 @@
|
|||
|
||||
<div class="flex flex-col">
|
||||
You marked {$favourites.length} locations as a favourite location.
|
||||
|
||||
|
||||
This list is only visible to you
|
||||
{#each $favourites as f}
|
||||
<FavouriteSummary properties={f.properties} />
|
||||
{/each}
|
||||
{#each $favourites as feature (feature.properties.id)}
|
||||
<FavouriteSummary {feature} {state} />
|
||||
{/each}
|
||||
</div>
|
||||
|
|
|
@ -64,7 +64,6 @@
|
|||
import Community from "../assets/svg/Community.svelte";
|
||||
import Download from "../assets/svg/Download.svelte";
|
||||
import Share from "../assets/svg/Share.svelte";
|
||||
import FavouriteSummary from "./Favourites/FavouriteSummary.svelte";
|
||||
import Favourites from "./Favourites/Favourites.svelte";
|
||||
|
||||
export let state: ThemeViewState;
|
||||
|
@ -499,7 +498,7 @@
|
|||
Your favourites
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col" slot="content2">
|
||||
<div class="flex flex-col m-2" slot="content2">
|
||||
<h3>Your favourite locations</h3>
|
||||
<Favourites {state}/>
|
||||
</div>
|
||||
|
|
File diff suppressed because one or more lines are too long
4
src/assets/svg/Center.svelte
Normal file
4
src/assets/svg/Center.svelte
Normal file
|
@ -0,0 +1,4 @@
|
|||
<script>
|
||||
export let color = "#000000"
|
||||
</script>
|
||||
<svg {...$$restProps} on:click on:mouseover on:mouseenter on:mouseleave on:keydown width="544.02838" height="544.02838" viewBox="0 0 544.02838 544.02838" version="1.1" id="svg1" sodipodi:docname="center.svg" inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> <defs id="defs1" /> <sodipodi:namedview id="namedview1" pagecolor="#505050" bordercolor="#eeeeee" borderopacity="1" inkscape:showpageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" showguides="true" inkscape:zoom="0.90326851" inkscape:cx="393.57068" inkscape:cy="250.756" inkscape:window-width="1920" inkscape:window-height="995" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="svg1"> <sodipodi:guide position="171.95879,103.32864" orientation="0,-1" id="guide4" inkscape:locked="false" /> <sodipodi:guide position="271.68286,132.35281" orientation="1,0" id="guide5" inkscape:locked="false" /> </sodipodi:namedview> <path d="m 365.63918,111.75001 h -62.375 V 15.9375 c 0,-8.75 -7,-15.9375 -15.625,-15.9375 h -31.1875 c -8.5625,0 -15.625,7.1875 -15.625,15.9375 v 95.81251 h -62.375 l 93.5625,127.75 z" id="path1" sodipodi:nodetypes="ccsssscccc" /> <path d="m 432.27837,365.63919 v -62.375 h 95.8125 c 8.75,0 15.9375,-7 15.9375,-15.625 v -31.1875 c 0,-8.5625 -7.1875,-15.625 -15.9375,-15.625 h -95.8125 v -62.375 l -127.75,93.5625 z" id="path1-5" sodipodi:nodetypes="ccsssscccc" /> <path d="m 178.38918,432.27838 h 62.375 v 95.8125 c 0,8.75 7,15.9375 15.625,15.9375 h 31.1875 c 8.5625,0 15.625,-7.1875 15.625,-15.9375 v -95.8125 h 62.375 l -93.5625,-127.75 z" id="path2" sodipodi:nodetypes="ccsssscccc" /> <path d="m 111.75,178.38919 v 62.375 H 15.9375 c -8.75,0 -15.9375,7 -15.9375,15.625 v 31.1875 c 0,8.5625 7.1875,15.625 15.9375,15.625 H 111.75 v 62.375 l 127.74999,-93.5625 z" id="path3" sodipodi:nodetypes="ccsssscccc" /> </svg>
|
Loading…
Reference in a new issue