From 583bc2745eacc95b6452fca9fb078847d4785177 Mon Sep 17 00:00:00 2001 From: Benno Lorenz Date: Sun, 15 Jun 2025 22:36:30 +0200 Subject: [PATCH] Add GPX Map shortcode and related assets for displaying GPX tracks --- layouts/shortcodes/gpx-map.html | 52 +++++++++++++++++++++++++++++++ static/admin/config.yml | 10 ++++++ static/admin/index.html | 38 ++++++++++++++++++++++ static/images/pin-icon-end.png | Bin 0 -> 960 bytes static/images/pin-icon-start.png | Bin 0 -> 971 bytes static/images/pin-shadow.png | Bin 0 -> 1127 bytes 6 files changed, 100 insertions(+) create mode 100644 layouts/shortcodes/gpx-map.html create mode 100644 static/images/pin-icon-end.png create mode 100644 static/images/pin-icon-start.png create mode 100644 static/images/pin-shadow.png diff --git a/layouts/shortcodes/gpx-map.html b/layouts/shortcodes/gpx-map.html new file mode 100644 index 0000000..d498b7a --- /dev/null +++ b/layouts/shortcodes/gpx-map.html @@ -0,0 +1,52 @@ + +
+ + + + \ No newline at end of file diff --git a/static/admin/config.yml b/static/admin/config.yml index ea067ca..a278f35 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -53,6 +53,16 @@ collections: media_library: config: multiple: true + - label: "GPX Files" + name: "gpxFiles" + widget: "file" + required: false + choose_url: true + media_library: + media_folder: "/static/uploads/gpx" + public_folder: "/images/uploads" + config: + multiple: true - { label: "Body", name: "body", widget: "markdown" } ######################## # POSTS COLLECTION diff --git a/static/admin/index.html b/static/admin/index.html index 17915c8..34063f8 100644 --- a/static/admin/index.html +++ b/static/admin/index.html @@ -84,6 +84,44 @@ `; } }); + + // Register the GPX Map shortcode as an editor component + window.CMS.registerEditorComponent({ + id: "gpx-map", + label: "GPX Track Map", + fields: [ + { name: "lat", label: "Latitude", widget: "string" }, + { name: "lon", label: "Longitude", widget: "string" }, + { name: "gpx", label: "GPX File Path", widget: "string", hint: "Example: /uploads/gpx/my-track.gpx" }, + { name: "zoom", label: "Zoom Level", widget: "number", default: 13, required: false }, + { name: "height", label: "Height (e.g. 500px)", widget: "string", default: "500px", required: false } + ], + pattern: /{{<\s*gpx-map\s+lat="([^"]+)"\s+lon="([^"]+)"\s+gpx="([^"]+)"(?:\s+zoom="([^"]+)")?(?:\s+height="([^"]+)")?\s*>}}/, + fromBlock: function (match) { + return { + lat: match[1], + lon: match[2], + gpx: match[3], + zoom: match[4] || "13", + height: match[5] || "500px" + }; + }, + toBlock: function (obj) { + let params = `lat="${obj.lat}" lon="${obj.lon}" gpx="${obj.gpx}"`; + if (obj.zoom) params += ` zoom="${obj.zoom}"`; + if (obj.height) params += ` height="${obj.height}"`; + return `{{< gpx-map ${params} >}}`; + }, + toPreview: function (obj) { + // Simple preview (not interactive) + return `
+ GPX Track Map
+ Lat: ${obj.lat}, Lon: ${obj.lon}
+ GPX: ${obj.gpx}
+ Zoom: ${obj.zoom || 13}, Height: ${obj.height || "500px"} +
`; + } + }); diff --git a/static/images/pin-icon-end.png b/static/images/pin-icon-end.png new file mode 100644 index 0000000000000000000000000000000000000000..190442f59e73ac39484d06265c7c7ab6f7af1741 GIT binary patch literal 960 zcmeAS@N?(olHy`uVBq!ia0vp^ia@N(!3-qDe|%D7U|?hl@Ck7Ra*sJV4LJJ$|NnL! zogI35+cY(gIyfA*wLN5Qz1zrWuZhXuA3t^(80(Axq9}5rP zWor8K?b|Q+?mb$u;zm!;>6Da{@$tVufBydb`PWB}K3>26@yeCAr%t^-a^%Unb!Rd% zPQ=6<2@Kq0WAl9H&gVOJ+?_LLpS}H0&!zgnP|zs}@(X78!}ODj?aPN}cXw@BA;tUV z{J!G6WUIc``pPI@4+mp)Wuf>N53e6tH)n=!(60>ihqpdFhc$C2IdaOq@UcKF{Xe4-~b|MtMzp8nSj} z#|Hl|TPF1iw+Wn|=6!L)1x@vi`DaR{|8(@~a2Edy{=#|G_>hFevP>yvx!{g>E%RiCot#wH==y>AmngkI6sswFyhP0)MYWEnjBu_I>m1#onv1x;BblJl@av_}%0- zpA{3EnM`?nuU;=Zuw!muvP&=biQ?q4+x!Nu&FM1clLDR`JMQeT;r`CRWA%xTe^l{F zd{3Us>+;G``gx;qJnN}HM-?wG{I{cVix2PQegCUJa-Nq++!@@ibw9H9-;=91UeuIx zGX!)cceqVGe}CKUr>|p{@@({wX4u|WzDWPx^!5Jwr*AUxcQhOC7itWeUdHYcE*{T) z)jDOSn8IC|hh6;atdqJJ7Rw0-%(S@Yc}%W?Wzs&C5Xa+1CS9h7#9rJg6|q>#BFIv= zlqb32{^LU@d&{4%Vsf(i5PGV)eUh@1gi`rIcWuW*PK#LUj_eUJS~81+@sg%ck4KrJ zi}ma9569kJJn>^ngy1*9?0sRUYVNd0DO$4bTRK^FPp6Q~f|q`(*P5L>j#~IF5^8OB sS-s`p;pYQSu<+*2aGxRV7ZVPnV?w_VW6>>-(PUn|66x^1ft|xgw7~Kf3eb&iU8pSKVGU=h~c-qa_aO z9nQQubK=E`Ef2PIob4z&Qj~chQ*XJR&T^fPb*jgJp`lw6E-TLWeXaGCCB7aG#_Gz_Lb2D6uA4I>Qdfc}HOM4*{Q(9BCMQo9#}JFtwNsv# z-Et6cb6@oRo^NsQTpgWB4qvjE`?9O<{r5E59JR*j&F|*su6i6aId`0Hn78cpu4|JGH%`!v z;LSK}r+&>i*5ltN$CX_z_a>C{7dR(-tmAEZHj~5Ph_2HgNduJ%CYL~t+9)&i(??$) zd6IvsvT5GuDPA2dSKs9sOWE7#`v$F;@SdwzVkdKq(f4?3vF-bpRpbWjo+y37O`|F6 zjrm;W$Kt`)I8zn~Zc+Mi%4>q=`a4{KNdX@hCnoeh@0+Y1Tqe}IL#gY-$>!5L{x&Oy zsPPz@nB05Xz45ff*^3g33fWRK&$!Eq??1W0xUctOoRnaPck<3c$;YiGpT6iUy8QdS z-s8Ncwm#=v=ef@e54%?vPW`F*T<#A`r-_u+@d<04f4B*98@(lE{%S$KrA6nF`!uf-=_1)KfJVdc(}~8 zR=UK*|8+|6Lg8u`)t3Q(3N74pEu&7JF5G{ei`)F+ev=>{vx$uQ-;STSdc^Qmy1nlr wfu?d!(T%seS!x`%J@7Vv=p4oRe#Jk=N$qnl3khE?1|~xWPgg&ebxsLQ0Jm$C5C8xG literal 0 HcmV?d00001 diff --git a/static/images/pin-shadow.png b/static/images/pin-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..948646ead531cc90a28f4d03166033efd087e4b3 GIT binary patch literal 1127 zcmV-t1ep7YP)0=yn~aG&-##!e^9NXSUoE#@M~V>VRfY3963m(hv<{}BX1U9P9P z&_;^^gF5J_lWsMmM^KCaN{}j=#$b|PeXt&*-?@A$FbkvP5Rt##RK^?0tPV0VOfr!1X?q(N1bs~hXoeovK`s%HtbhM zG-<-G5J0h}Bk^b$wbmd^IrC?{#Q*^2jU~j20t9`U*|CRQU6>L}UmdPe`CJiQvf;#x zG$SD(D1gk&>v7gk%}uP*cJgVQ*VG(Y8`$d8Ok3

yqnSL;XqpTt#Je*+xTi0u(D) zoGup12B1kVy9?}02i#T@m?OU}tSZ1W%&eHydXz^OOkN&`noBNok&I~82?2Rd04&ZH z03+{#>*_4{Mq1c~7XTE?J>}D|;;nYsYlTW5)qZY0uq9t!cZy^^hPhh(RPsg0tX7$T07&KoEe<9B@g;BHCz! z_2jSXcl&L>(}QpQC^q>NF@OlH%B}>qbP>HOPNEnFK+*XG;7$O(@XBA`AL|?6dh2zd zSf&H%V**|fgNTx6U@A#^*)Li&Yv!yFbGZkYQ2MgB{k?tFDbGEH6hng4<~bnqfURjD{6N(a@s^EOx>+b&UaA!K_eF(8hoS0_(@h^cPk?hX8q!KjbGEL|`~(*+uKH#j}(>qSO^fW&yAn?1R3rxj{yV7gLt{# t(Ls+@BbiTQ;5X