Merge branch 'bug/fixes' into 'master'

Various fixes

See merge request framasoft/mobilizon!306
This commit is contained in:
Thomas Citharel 2019-11-06 10:16:03 +01:00
commit ddbe637c34
18 changed files with 118 additions and 1010 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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">&quot;&gt;&quot;&gt;<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>&quot;&gt;<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">&quot;&gt;<g
id="g8">&quot;&gt;<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">&quot;&gt;<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

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -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>

View File

@ -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",

View File

@ -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",

View File

@ -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,

View File

@ -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) {

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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

View 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

View File

@ -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

View File

@ -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,