Merge branch 'bug/fixes' into 'master'
Various fixes See merge request framasoft/mobilizon!306
|
@ -52,7 +52,7 @@ config :mobilizon, MobilizonWeb.Endpoint,
|
||||||
# Do not include metadata nor timestamps in development logs
|
# Do not include metadata nor timestamps in development logs
|
||||||
config :logger, :console, format: "[$level] $message\n", level: :debug
|
config :logger, :console, format: "[$level] $message\n", level: :debug
|
||||||
|
|
||||||
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Nominatim
|
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.GoogleMaps
|
||||||
|
|
||||||
# Set a higher stacktrace during development. Avoid configuring such
|
# Set a higher stacktrace during development. Avoid configuring such
|
||||||
# in production as building large stacktraces may be expensive.
|
# in production as building large stacktraces may be expensive.
|
||||||
|
|
|
@ -1,134 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" x="0" y="0" viewBox="0 0 64 64" xml:space="preserve" id="svg4965"><style type="text/css" id="style4919">.st1{opacity:.2}.st2{fill:#231f20}.st6{fill:#e0e0d1}</style><g id="Layer_1"><g id="g4923"><circle cx="32" cy="32" r="32" id="circle4921" fill="#77b3d4"/></g><g id="g4961"><g class="st1" id="g4927"><path class="st2" d="M12 25v25c0 2.2 1.8 4 4 4h32c2.2 0 4-1.8 4-4V25H12z" id="path4925"/></g><g id="g4931"><path d="M12 23v25c0 2.2 1.8 4 4 4h32c2.2 0 4-1.8 4-4V23H12z" id="path4929" fill="#fff"/></g><g class="st1" id="g4935"><path class="st2" d="M48 14H16c-2.2 0-4 1.8-4 4v7h40v-7c0-2.2-1.8-4-4-4z" id="path4933"/></g><g id="g4939"><path d="M48 12H16c-2.2 0-4 1.8-4 4v7h40v-7c0-2.2-1.8-4-4-4z" id="path4937" fill="#c75c5c"/></g><g class="st1" id="g4947"><path class="st2" d="M20 21c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 1.1-.9 2-2 2z" id="path4945"/></g><g class="st1" id="g4951"><path class="st2" d="M45 21c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 1.1-.9 2-2 2z" id="path4949"/></g><g id="g4955"><path class="st6" d="M20 19c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 1.1-.9 2-2 2z" id="path4953"/></g><g id="g4959"><path class="st6" d="M45 19c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 1.1-.9 2-2 2z" id="path4957"/></g></g></g></svg>
|
||||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
version="1.1"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
viewBox="0 0 64 64"
|
|
||||||
style="enable-background:new 0 0 64 64;"
|
|
||||||
xml:space="preserve"
|
|
||||||
id="svg4965"
|
|
||||||
sodipodi:docname="Circle-icons-calendar.svg"
|
|
||||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata
|
|
||||||
id="metadata4971"><rdf:RDF><cc:Work
|
|
||||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
|
||||||
id="defs4969" /><sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1920"
|
|
||||||
inkscape:window-height="1018"
|
|
||||||
id="namedview4967"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="10.429825"
|
|
||||||
inkscape:cx="30.416304"
|
|
||||||
inkscape:cy="28.788016"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="34"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="g4961" />
|
|
||||||
<style
|
|
||||||
type="text/css"
|
|
||||||
id="style4919">
|
|
||||||
.st0{fill:#77B3D4;}
|
|
||||||
.st1{opacity:0.2;}
|
|
||||||
.st2{fill:#231F20;}
|
|
||||||
.st3{fill:#FFFFFF;}
|
|
||||||
.st4{fill:#C75C5C;}
|
|
||||||
.st5{fill:#4F5D73;}
|
|
||||||
.st6{fill:#E0E0D1;}
|
|
||||||
</style>
|
|
||||||
<g
|
|
||||||
id="Layer_1">
|
|
||||||
<g
|
|
||||||
id="g4923">
|
|
||||||
<circle
|
|
||||||
class="st0"
|
|
||||||
cx="32"
|
|
||||||
cy="32"
|
|
||||||
r="32"
|
|
||||||
id="circle4921" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g4961">
|
|
||||||
<g
|
|
||||||
class="st1"
|
|
||||||
id="g4927">
|
|
||||||
<path
|
|
||||||
class="st2"
|
|
||||||
d="M12,25v25c0,2.2,1.8,4,4,4h32c2.2,0,4-1.8,4-4V25H12z"
|
|
||||||
id="path4925" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g4931">
|
|
||||||
<path
|
|
||||||
class="st3"
|
|
||||||
d="M12,23v25c0,2.2,1.8,4,4,4h32c2.2,0,4-1.8,4-4V23H12z"
|
|
||||||
id="path4929" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
class="st1"
|
|
||||||
id="g4935">
|
|
||||||
<path
|
|
||||||
class="st2"
|
|
||||||
d="M48,14H16c-2.2,0-4,1.8-4,4v7h40v-7C52,15.8,50.2,14,48,14z"
|
|
||||||
id="path4933" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g4939">
|
|
||||||
<path
|
|
||||||
class="st4"
|
|
||||||
d="M48,12H16c-2.2,0-4,1.8-4,4v7h40v-7C52,13.8,50.2,12,48,12z"
|
|
||||||
id="path4937" />
|
|
||||||
</g>
|
|
||||||
|
|
||||||
<g
|
|
||||||
class="st1"
|
|
||||||
id="g4947">
|
|
||||||
<path
|
|
||||||
class="st2"
|
|
||||||
d="M20,21c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.9,2,2v7C22,20.1,21.1,21,20,21L20,21z"
|
|
||||||
id="path4945" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
class="st1"
|
|
||||||
id="g4951">
|
|
||||||
<path
|
|
||||||
class="st2"
|
|
||||||
d="M45,21c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.9,2,2v7C47,20.1,46.1,21,45,21L45,21z"
|
|
||||||
id="path4949" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g4955">
|
|
||||||
<path
|
|
||||||
class="st6"
|
|
||||||
d="M20,19c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.9,2,2v7C22,18.1,21.1,19,20,19L20,19z"
|
|
||||||
id="path4953" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g4959">
|
|
||||||
<path
|
|
||||||
class="st6"
|
|
||||||
d="M45,19c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.9,2,2v7C47,18.1,46.1,19,45,19L45,19z"
|
|
||||||
id="path4957" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="Layer_2">
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.3 KiB |
|
@ -1,31 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 248.16 46.78">
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 248.16 46.78"><g data-name="header"><path d="M0 45.82l3.18-40.8a29.88 29.88 0 015.07-.36 27.74 27.74 0 014.95.36l4.86 17.16a92.19 92.19 0 012.34 10.08h.36a92.19 92.19 0 012.34-10.08L28 5.02a29.23 29.23 0 015-.36 29.23 29.23 0 015 .36l3.18 40.8a13.61 13.61 0 01-3.63.42 23.41 23.41 0 01-3.63-.24l-1.2-19.92q-.36-5.52-.48-12.84h-.44l-7.32 26.51a25.62 25.62 0 01-4 .3 23.36 23.36 0 01-3.84-.3L9.36 13.24H9q-.3 8.94-.48 12.84L7.26 46a22.47 22.47 0 01-3.6.24A13.75 13.75 0 010 45.82zM74 31.06q0 8-4.26 12.3a12.21 12.21 0 01-9 3.42 12.21 12.21 0 01-9-3.42q-4.26-4.26-4.26-12.3t4.24-12.31a12.21 12.21 0 019-3.42 12.21 12.21 0 019 3.42Q74 23.02 74 31.06zM60.75 20.98q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM103.2 19.75q2.7 4.11 2.7 11.28T102 42.31a13.18 13.18 0 01-10 4.11 31.41 31.41 0 01-11.34-2V2.2l.4-.45h2.76A4 4 0 0187 2.83a5.38 5.38 0 01.93 3.57v11.94a12.08 12.08 0 017.56-2.7 8.71 8.71 0 017.71 4.11zm-9.72 2a7.28 7.28 0 00-5.58 2.82v16a15 15 0 004.08.54 5.25 5.25 0 004.68-2.67q1.68-2.67 1.68-7.59 0-9.03-4.86-9.1zM121 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014 1.62A6.27 6.27 0 01121 22z"/><path d="M119.82.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z" fill="#fff"/><path d="M139.08 40.42h2a10.23 10.23 0 01.6 3.18 9.24 9.24 0 01-.18 2.1 38.47 38.47 0 01-5.64.54q-6.48 0-6.48-7v-37l.36-.42h2.88a3.94 3.94 0 013.12 1.05 5.52 5.52 0 01.9 3.57v31.31q-.02 2.67 2.44 2.67zM155.94 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014.05 1.62 6.27 6.27 0 011.43 4.39z"/><path d="M154.8 2.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z" fill="#fff"/><path d="M163.08 39.22l8.76-11.82q1.32-1.8 4.8-5.7l-.18-.3a63.09 63.09 0 01-7.74.42H163a9.79 9.79 0 01-.24-2.34 15.8 15.8 0 01.42-3.3h20.4a16.31 16.31 0 011 4.26 4.1 4.1 0 01-.78 2.34L175 34.66a64.65 64.65 0 01-4.56 5.7l.18.24q3.12-.3 5.22-.3h2.58a15.35 15.35 0 006.12-.9 9.4 9.4 0 01.72 3.12q0 3.42-4.32 3.42h-18a14.27 14.27 0 01-.9-3.93 5.08 5.08 0 011.04-2.79zM215.88 31.06q0 8-4.26 12.3a13.63 13.63 0 01-18.06 0q-4.26-4.26-4.26-12.3t4.26-12.31a13.63 13.63 0 0118.06 0q4.26 4.27 4.26 12.31zm-13.29-10.08q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM247 25.84v13.32a11 11 0 001.2 5.64 7 7 0 01-4.41 1.56q-2.43 0-3.33-1.14a5.69 5.69 0 01-.9-3.54V27.4a7.74 7.74 0 00-.72-3.87 2.78 2.78 0 00-2.58-1.17 8.62 8.62 0 00-6.3 3v20.58a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3v-29.7l.42-.36h2.76q3.42 0 4.08 3.6 4.38-3.84 8.73-3.84t6.42 2.82a12.17 12.17 0 012.07 7.38z"/><path d="M57.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84zM198.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84z" fill="#fff"/></g></svg>
|
||||||
<title id="MobilizonLogoTitle">Mobilizon Logo</title>
|
|
||||||
<g id="ab18705c-9f78-4d57-8f04-bd2f1ccdd04c" data-name="header">
|
|
||||||
<path d="M0,46.07,3.18,5.27a29.88,29.88,0,0,1,5.07-.36,27.74,27.74,0,0,1,4.95.36l4.86,17.16A92.19,92.19,0,0,1,20.4,32.51h.36A92.19,92.19,0,0,1,23.1,22.43L28,5.27a29.23,29.23,0,0,1,5-.36,29.23,29.23,0,0,1,5,.36l3.18,40.8a13.61,13.61,0,0,1-3.63.42,23.41,23.41,0,0,1-3.63-.24l-1.2-19.92q-.36-5.52-.48-12.84H31.8L24.48,40a25.62,25.62,0,0,1-4,.3,23.36,23.36,0,0,1-3.84-.3L9.36,13.49H9q-.3,8.94-.48,12.84L7.26,46.25a22.47,22.47,0,0,1-3.6.24A13.75,13.75,0,0,1,0,46.07Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M74,31.31q0,8-4.26,12.3a12.21,12.21,0,0,1-9,3.42,12.21,12.21,0,0,1-9-3.42q-4.26-4.26-4.26-12.3T51.72,19a12.21,12.21,0,0,1,9-3.42,12.21,12.21,0,0,1,9,3.42Q74,23.27,74,31.31ZM60.75,21.23q-5.67,0-5.67,10.08t5.67,10.08q5.67,0,5.67-10.08T60.75,21.23Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M103.2,20q2.7,4.11,2.7,11.28T102,42.56a13.18,13.18,0,0,1-10,4.11,31.41,31.41,0,0,1-11.34-2V2.45L81.06,2h2.76A4,4,0,0,1,87,3.08a5.38,5.38,0,0,1,.93,3.57V18.59a12.08,12.08,0,0,1,7.56-2.7A8.71,8.71,0,0,1,103.2,20ZM93.48,22a7.28,7.28,0,0,0-5.58,2.82v16a15,15,0,0,0,4.08.54,5.25,5.25,0,0,0,4.68-2.67q1.68-2.67,1.68-7.59Q98.34,22.07,93.48,22Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M121,22.25V46.19a20.85,20.85,0,0,1-3.66.3,23,23,0,0,1-3.78-.3V25q0-3.24-2.7-3.24h-.72a9.32,9.32,0,0,1-.3-2.58,10.7,10.7,0,0,1,.3-2.7,39.63,39.63,0,0,1,4.38-.24h1a5.19,5.19,0,0,1,4,1.62A6.27,6.27,0,0,1,121,22.25Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M119.82,1.09a7.37,7.37,0,0,1,.6,3,7.37,7.37,0,0,1-.6,3,7.46,7.46,0,0,1-3.87.84A6.49,6.49,0,0,1,112.26,7a7.37,7.37,0,0,1-.6-3,7.37,7.37,0,0,1,.6-3,8.09,8.09,0,0,1,3.87-.84A7.05,7.05,0,0,1,119.82,1.09Z"
|
|
||||||
transform="translate(0 -0.25)" fill="#fff"/>
|
|
||||||
<path d="M139.08,40.67h2a10.23,10.23,0,0,1,.6,3.18,9.24,9.24,0,0,1-.18,2.1,38.47,38.47,0,0,1-5.64.54q-6.48,0-6.48-7v-37l.36-.42h2.88a3.94,3.94,0,0,1,3.12,1.05,5.52,5.52,0,0,1,.9,3.57V38Q136.62,40.67,139.08,40.67Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M155.94,22.25V46.19a20.85,20.85,0,0,1-3.66.3,23,23,0,0,1-3.78-.3V25q0-3.24-2.7-3.24h-.72a9.32,9.32,0,0,1-.3-2.58,10.7,10.7,0,0,1,.3-2.7,39.63,39.63,0,0,1,4.38-.24h1a5.19,5.19,0,0,1,4.05,1.62A6.27,6.27,0,0,1,155.94,22.25Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M154.8,3.09a7.37,7.37,0,0,1,.6,3,7.37,7.37,0,0,1-.6,3,7.46,7.46,0,0,1-3.87.84A6.49,6.49,0,0,1,147.24,9a7.37,7.37,0,0,1-.6-3,7.37,7.37,0,0,1,.6-3,8.09,8.09,0,0,1,3.87-.84A7.05,7.05,0,0,1,154.8,3.09Z"
|
|
||||||
transform="translate(0 -0.25)" fill="#fff"/>
|
|
||||||
<path d="M163.08,39.47l8.76-11.82q1.32-1.8,4.8-5.7l-.18-.3a63.09,63.09,0,0,1-7.74.42H163a9.79,9.79,0,0,1-.24-2.34,15.8,15.8,0,0,1,.42-3.3h20.4a16.31,16.31,0,0,1,1,4.26,4.1,4.1,0,0,1-.78,2.34L175,34.91a64.65,64.65,0,0,1-4.56,5.7l.18.24q3.12-.3,5.22-.3h2.58a15.35,15.35,0,0,0,6.12-.9,9.4,9.4,0,0,1,.72,3.12q0,3.42-4.32,3.42h-18a14.27,14.27,0,0,1-.9-3.93A5.08,5.08,0,0,1,163.08,39.47Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M215.88,31.31q0,8-4.26,12.3a13.63,13.63,0,0,1-18.06,0q-4.26-4.26-4.26-12.3T193.56,19a13.63,13.63,0,0,1,18.06,0Q215.88,23.27,215.88,31.31ZM202.59,21.23q-5.67,0-5.67,10.08t5.67,10.08q5.67,0,5.67-10.08T202.59,21.23Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M247,26.09V39.41a11,11,0,0,0,1.2,5.64,7,7,0,0,1-4.41,1.56q-2.43,0-3.33-1.14a5.69,5.69,0,0,1-.9-3.54V27.65a7.74,7.74,0,0,0-.72-3.87,2.78,2.78,0,0,0-2.58-1.17,8.62,8.62,0,0,0-6.3,3V46.19a20.85,20.85,0,0,1-3.66.3,23,23,0,0,1-3.78-.3V16.49l.42-.36h2.76q3.42,0,4.08,3.6,4.38-3.84,8.73-3.84t6.42,2.82A12.17,12.17,0,0,1,247,26.09Z"
|
|
||||||
transform="translate(0 -0.25)"/>
|
|
||||||
<path d="M57.26,11a7.37,7.37,0,0,1-.6-3,7.37,7.37,0,0,1,.6-3,8.09,8.09,0,0,1,3.87-.84,7.05,7.05,0,0,1,3.69.84,7.37,7.37,0,0,1,.6,3,7.37,7.37,0,0,1-.6,3,7.46,7.46,0,0,1-3.87.84A6.49,6.49,0,0,1,57.26,11Z"
|
|
||||||
transform="translate(0 -0.25)" fill="#fff"/>
|
|
||||||
<path d="M198.26,11a7.37,7.37,0,0,1-.6-3,7.37,7.37,0,0,1,.6-3,8.09,8.09,0,0,1,3.87-.84,7.05,7.05,0,0,1,3.69.84,7.37,7.37,0,0,1,.6,3,7.37,7.37,0,0,1-.6,3,7.46,7.46,0,0,1-3.87.84A6.49,6.49,0,0,1,198.26,11Z"
|
|
||||||
transform="translate(0 -0.25)" fill="#fff"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 3.3 KiB |
|
@ -1,65 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" viewBox="0 0 100 125">">"><path d="M77.74 83.19H22.26v-6.72a24 24 0 0124-24h7.48a24 24 0 0124 24zm-51.48-4h47.48v-2.72a20 20 0 00-20-20h-7.48a20 20 0 00-20 20z"/><g>"><path d="M50 50.5a16.85 16.85 0 1116.85-16.84A16.87 16.87 0 0150 50.5zm0-29.7a12.85 12.85 0 1012.85 12.86A12.86 12.86 0 0050 20.81z"/></g></svg>
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
data-name="Layer 1"
|
|
||||||
viewBox="0 0 100 125"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
id="svg2"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.91 r13725"
|
|
||||||
sodipodi:docname="profile.svg">
|
|
||||||
<metadata
|
|
||||||
id="metadata24">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs22" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="640"
|
|
||||||
inkscape:window-height="480"
|
|
||||||
id="namedview20"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="1.888"
|
|
||||||
inkscape:cx="50"
|
|
||||||
inkscape:cy="62.5"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="36"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg2" />
|
|
||||||
<title
|
|
||||||
id="title4">47 all</title>
|
|
||||||
<g
|
|
||||||
id="g6">"><g
|
|
||||||
id="g8">"><path
|
|
||||||
d="M77.74,83.19H22.26V76.47a24,24,0,0,1,24-24h7.48a24,24,0,0,1,24,24Zm-51.48-4H73.74V76.47a20,20,0,0,0-20-20H46.26a20,20,0,0,0-20,20Z"
|
|
||||||
id="path10" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g12">"><path
|
|
||||||
d="M50,50.5A16.85,16.85,0,1,1,66.85,33.66,16.87,16.87,0,0,1,50,50.5Zm0-29.7A12.85,12.85,0,1,0,62.85,33.66,12.86,12.86,0,0,0,50,20.81Z"
|
|
||||||
id="path14" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 395 B |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 14 KiB |
|
@ -25,5 +25,9 @@ export default class SearchField extends Vue {
|
||||||
input.searchField {
|
input.searchField {
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
border-color: #b5b5b5;
|
border-color: #b5b5b5;
|
||||||
|
|
||||||
|
&::placeholder {
|
||||||
|
color: gray;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -298,6 +298,7 @@
|
||||||
"You are already a participant of this event.": "You are already a participant of this event.",
|
"You are already a participant of this event.": "You are already a participant of this event.",
|
||||||
"You are already logged-in.": "You are already logged-in.",
|
"You are already logged-in.": "You are already logged-in.",
|
||||||
"You can add tags by hitting the Enter key or by adding a comma": "You can add tags by hitting the Enter key or by adding a comma",
|
"You can add tags by hitting the Enter key or by adding a comma": "You can add tags by hitting the Enter key or by adding a comma",
|
||||||
|
"You can't remove your last identity.": "You can't remove your last identity.",
|
||||||
"You have been disconnected": "You have been disconnected",
|
"You have been disconnected": "You have been disconnected",
|
||||||
"You have cancelled your participation": "You have cancelled your participation",
|
"You have cancelled your participation": "You have cancelled your participation",
|
||||||
"You have one event in {days} days.": "You have no events in {days} days | You have one event in {days} days. | You have {count} events in {days} days",
|
"You have one event in {days} days.": "You have no events in {days} days | You have one event in {days} days. | You have {count} events in {days} days",
|
||||||
|
|
|
@ -298,6 +298,7 @@
|
||||||
"You are already a participant of this event.": "Vous participez déjà à cet événement.",
|
"You are already a participant of this event.": "Vous participez déjà à cet événement.",
|
||||||
"You are already logged-in.": "Vous êtes déjà connecté.",
|
"You are already logged-in.": "Vous êtes déjà connecté.",
|
||||||
"You can add tags by hitting the Enter key or by adding a comma": "Vous pouvez ajouter des tags en appuyant sur la touche Entrée ou bien en ajoutant une virgule",
|
"You can add tags by hitting the Enter key or by adding a comma": "Vous pouvez ajouter des tags en appuyant sur la touche Entrée ou bien en ajoutant une virgule",
|
||||||
|
"You can't remove your last identity.": "Vous ne pouvez pas supprimer votre dernière identité",
|
||||||
"You have been disconnected": "Vous avez été déconnecté⋅e",
|
"You have been disconnected": "Vous avez été déconnecté⋅e",
|
||||||
"You have cancelled your participation": "Vous avez annulé votre participation",
|
"You have cancelled your participation": "Vous avez annulé votre participation",
|
||||||
"You have one event in {days} days.": "Vous n'avez pas d'événements dans {days} jours | Vous avez un événement dans {days} jours. | Vous avez {count} événements dans {days} jours",
|
"You have one event in {days} days.": "Vous n'avez pas d'événements dans {days} jours | Vous avez un événement dans {days} jours. | Vous avez {count} événements dans {days} jours",
|
||||||
|
|
|
@ -48,6 +48,11 @@ export const errors: IError[] = [
|
||||||
value: i18n.t("The current identity doesn't have any permission on this event. You should probably change it.") as string,
|
value: i18n.t("The current identity doesn't have any permission on this event. You should probably change it.") as string,
|
||||||
suggestRefresh: false,
|
suggestRefresh: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
match: /Cannot remove the last identity of a user/,
|
||||||
|
value: i18n.t("You can't remove your last identity.") as string,
|
||||||
|
suggestRefresh: false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
match: /^No user with this email was found$/,
|
match: /^No user with this email was found$/,
|
||||||
value: null,
|
value: null,
|
||||||
|
|
|
@ -134,9 +134,14 @@ export default class EditIdentity extends Vue {
|
||||||
|
|
||||||
this.resetFields();
|
this.resetFields();
|
||||||
this.identityName = val;
|
this.identityName = val;
|
||||||
|
const identity = await this.getIdentity();
|
||||||
|
|
||||||
if (this.identityName) {
|
if (!identity) {
|
||||||
this.identity = await this.getIdentity();
|
return await this.$router.push({ name: 'CreateIdentity' });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.identityName && identity) {
|
||||||
|
this.identity = identity;
|
||||||
|
|
||||||
this.avatarFile = await buildFileFromIPicture(this.identity.avatar);
|
this.avatarFile = await buildFileFromIPicture(this.identity.avatar);
|
||||||
}
|
}
|
||||||
|
@ -280,15 +285,18 @@ export default class EditIdentity extends Vue {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getIdentity() {
|
private async getIdentity(): Promise<Person|null> {
|
||||||
const result = await this.$apollo.query({
|
try {
|
||||||
query: FETCH_PERSON,
|
const result = await this.$apollo.query({
|
||||||
variables: {
|
query: FETCH_PERSON,
|
||||||
username: this.identityName,
|
variables: {
|
||||||
},
|
username: this.identityName,
|
||||||
});
|
},
|
||||||
|
});
|
||||||
return new Person(result.data.fetchPerson);
|
return new Person(result.data.fetchPerson);
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleError(err: any) {
|
private handleError(err: any) {
|
||||||
|
|
|
@ -173,8 +173,8 @@ import {ParticipantRole} from "@/types/event.model";
|
||||||
</div>
|
</div>
|
||||||
<section class="share" v-if="!event.draft">
|
<section class="share" v-if="!event.draft">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="columns">
|
<div class="columns is-centered is-multiline">
|
||||||
<div class="column is-half-desktop has-text-centered">
|
<div class="column is-half-widescreen has-text-centered">
|
||||||
<h3 class="title">{{ $t('Share this event') }}</h3>
|
<h3 class="title">{{ $t('Share this event') }}</h3>
|
||||||
<small class="maximumNumberOfPlacesWarning" v-if="!eventCapacityOK">
|
<small class="maximumNumberOfPlacesWarning" v-if="!eventCapacityOK">
|
||||||
{{ $t('All the places have already been taken') }}
|
{{ $t('All the places have already been taken') }}
|
||||||
|
@ -189,7 +189,8 @@ import {ParticipantRole} from "@/types/event.model";
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<div class="column is-half has-text-right add-to-calendar">
|
<div class="column is-half-widescreen has-text-right add-to-calendar">
|
||||||
|
<img src="../../assets/undraw_events.svg" class="is-hidden-mobile is-hidden-tablet-only" />
|
||||||
<h3 @click="downloadIcsEvent()">
|
<h3 @click="downloadIcsEvent()">
|
||||||
{{ $t('Add to my calendar') }}
|
{{ $t('Add to my calendar') }}
|
||||||
</h3>
|
</h3>
|
||||||
|
@ -911,20 +912,21 @@ export default class Event extends EventMixin {
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
margin-left: auto;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.add-to-calendar {
|
.add-to-calendar {
|
||||||
background-repeat: no-repeat;
|
display: flex;
|
||||||
background-size: 400px;
|
|
||||||
background-position: 10% 50%;
|
|
||||||
background-image: url('../../assets/undraw_events.svg');
|
|
||||||
position: relative;
|
|
||||||
h3 {
|
h3 {
|
||||||
|
margin-left: 0;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content:"";
|
content:"";
|
||||||
background: #B3B3B2;
|
background: #B3B3B2;
|
||||||
|
|
|
@ -69,4 +69,20 @@ defmodule Mobilizon.Addresses.Address do
|
||||||
|
|
||||||
put_change(changeset, :url, url)
|
put_change(changeset, :url, url)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def coords(nil), do: nil
|
||||||
|
|
||||||
|
def coords(%__MODULE__{} = address) do
|
||||||
|
with %Geo.Point{coordinates: {latitude, longitude}, srid: 4326} <- address.geom do
|
||||||
|
{latitude, longitude}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def representation(nil), do: nil
|
||||||
|
|
||||||
|
def representation(%__MODULE__{} = address) do
|
||||||
|
"#{address.street} #{address.postal_code} #{address.locality} #{address.region} #{
|
||||||
|
address.country
|
||||||
|
}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -187,8 +187,9 @@ defmodule Mobilizon.Events.Event do
|
||||||
|
|
||||||
# In case the provided addresses is an existing one
|
# In case the provided addresses is an existing one
|
||||||
@spec put_address(Changeset.t(), map) :: Changeset.t()
|
@spec put_address(Changeset.t(), map) :: Changeset.t()
|
||||||
defp put_address(%Changeset{} = changeset, %{physical_address: %{id: id} = _physical_address}) do
|
defp put_address(%Changeset{} = changeset, %{physical_address: %{id: id} = _physical_address})
|
||||||
case Addresses.get_address!(id) do
|
when not is_nil(id) do
|
||||||
|
case Addresses.get_address(id) do
|
||||||
%Address{} = address ->
|
%Address{} = address ->
|
||||||
put_assoc(changeset, :physical_address, address)
|
put_assoc(changeset, :physical_address, address)
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ defmodule Mobilizon.Service.Export.ICalendar do
|
||||||
alias Mobilizon.{Actors, Events, Users}
|
alias Mobilizon.{Actors, Events, Users}
|
||||||
alias Mobilizon.Actors.Actor
|
alias Mobilizon.Actors.Actor
|
||||||
alias Mobilizon.Events.{Event, FeedToken}
|
alias Mobilizon.Events.{Event, FeedToken}
|
||||||
|
alias Mobilizon.Addresses.Address
|
||||||
alias Mobilizon.Users.User
|
alias Mobilizon.Users.User
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
|
@ -31,7 +32,10 @@ defmodule Mobilizon.Service.Export.ICalendar do
|
||||||
dtend: event.ends_on,
|
dtend: event.ends_on,
|
||||||
description: HtmlSanitizeEx.strip_tags(event.description),
|
description: HtmlSanitizeEx.strip_tags(event.description),
|
||||||
uid: event.uuid,
|
uid: event.uuid,
|
||||||
categories: event.tags |> Enum.map(& &1.slug)
|
url: event.url,
|
||||||
|
geo: Address.coords(event.physical_address),
|
||||||
|
location: Address.representation(event.physical_address),
|
||||||
|
categories: event.tags |> Enum.map(& &1.title)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
37
test/mobilizon/service/export/icalendar_test.exs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
defmodule Mobilizon.Service.ICalendarTest do
|
||||||
|
alias Mobilizon.Service.Export.ICalendar, as: ICalendarService
|
||||||
|
alias Mobilizon.Events.Event
|
||||||
|
alias Mobilizon.Addresses.Address
|
||||||
|
alias ICalendar.Value
|
||||||
|
use Mobilizon.DataCase
|
||||||
|
|
||||||
|
import Mobilizon.Factory
|
||||||
|
|
||||||
|
describe "export an event to ics" do
|
||||||
|
test "export basic infos" do
|
||||||
|
%Event{} = event = insert(:event)
|
||||||
|
|
||||||
|
ics = """
|
||||||
|
BEGIN:VCALENDAR
|
||||||
|
CALSCALE:GREGORIAN
|
||||||
|
VERSION:2.0
|
||||||
|
PRODID:-//ICalendar//Mobilizon//EN
|
||||||
|
BEGIN:VEVENT
|
||||||
|
CATEGORIES:#{event.tags |> Enum.map(& &1.title) |> Enum.join(",")}
|
||||||
|
DESCRIPTION:Ceci est une description avec une première phrase assez longue\\,\\n puis sur une seconde ligne
|
||||||
|
DTEND:#{Value.to_ics(event.ends_on)}
|
||||||
|
DTSTAMP:#{Value.to_ics(event.publish_at)}
|
||||||
|
DTSTART:#{Value.to_ics(event.begins_on)}
|
||||||
|
GEO:#{event.physical_address |> Address.coords() |> Tuple.to_list() |> Enum.join(";")}
|
||||||
|
LOCATION:#{Address.representation(event.physical_address)}
|
||||||
|
SUMMARY:#{event.title}
|
||||||
|
UID:#{event.uuid}
|
||||||
|
URL:#{event.url}
|
||||||
|
END:VEVENT
|
||||||
|
END:VCALENDAR
|
||||||
|
"""
|
||||||
|
|
||||||
|
assert {:ok, ics} == ICalendarService.export_public_event(event)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -36,8 +36,10 @@ defmodule MobilizonWeb.FeedControllerTest do
|
||||||
assert entry.title in [event1.title, event2.title]
|
assert entry.title in [event1.title, event2.title]
|
||||||
end)
|
end)
|
||||||
|
|
||||||
assert entry1.categories == [tag2.slug, tag1.slug]
|
# It seems categories takes term instead of Label
|
||||||
assert entry2.categories == [tag1.slug]
|
# <category label=\"RSS\" term=\"rss\"/>
|
||||||
|
assert entry1.categories == [tag2.title, tag1.title] |> Enum.map(&String.downcase/1)
|
||||||
|
assert entry2.categories == [tag1.title] |> Enum.map(&String.downcase/1)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it returns a 404 for the actor's public events Atom feed if the actor is not publicly visible",
|
test "it returns a 404 for the actor's public events Atom feed if the actor is not publicly visible",
|
||||||
|
@ -112,8 +114,8 @@ defmodule MobilizonWeb.FeedControllerTest do
|
||||||
assert entry.summary in [event1.title, event2.title]
|
assert entry.summary in [event1.title, event2.title]
|
||||||
end)
|
end)
|
||||||
|
|
||||||
assert entry1.categories == [tag1.slug]
|
assert entry1.categories == [tag1.title]
|
||||||
assert entry2.categories == [tag1.slug, tag2.slug]
|
assert entry2.categories == [tag1.title, tag2.title]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it returns a 404 page for the actor's public events iCal feed with an actor not publicly visible",
|
test "it returns a 404 page for the actor's public events iCal feed with an actor not publicly visible",
|
||||||
|
@ -183,7 +185,7 @@ defmodule MobilizonWeb.FeedControllerTest do
|
||||||
|
|
||||||
assert entry1.summary == event1.title
|
assert entry1.summary == event1.title
|
||||||
|
|
||||||
assert entry1.categories == [tag1.slug, tag2.slug]
|
assert entry1.categories == [tag1.title, tag2.title]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -325,7 +327,7 @@ defmodule MobilizonWeb.FeedControllerTest do
|
||||||
|
|
||||||
[entry1] = ExIcal.parse(conn.resp_body)
|
[entry1] = ExIcal.parse(conn.resp_body)
|
||||||
assert entry1.summary == event1.title
|
assert entry1.summary == event1.title
|
||||||
assert entry1.categories == event1.tags |> Enum.map(& &1.slug)
|
assert entry1.categories == event1.tags |> Enum.map(& &1.title)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it returns 404 for an not existing feed", %{conn: conn} do
|
test "it returns 404 for an not existing feed", %{conn: conn} do
|
||||||
|
|
|
@ -124,6 +124,7 @@ defmodule Mobilizon.Factory do
|
||||||
visibility: :public,
|
visibility: :public,
|
||||||
tags: build_list(3, :tag),
|
tags: build_list(3, :tag),
|
||||||
mentions: [],
|
mentions: [],
|
||||||
|
publish_at: DateTime.utc_now(),
|
||||||
url: Routes.page_url(Endpoint, :event, uuid),
|
url: Routes.page_url(Endpoint, :event, uuid),
|
||||||
picture: insert(:picture),
|
picture: insert(:picture),
|
||||||
uuid: uuid,
|
uuid: uuid,
|
||||||
|
|