Compare commits

...

623 Commits

Author SHA1 Message Date
Tykayn b0b5251211 - Added an event category field. Administrators can extend the pre-configured list of categories through configuration.
- Added possibility for administrators to have analytics (Matomo, Plausible supported) and error handling (Sentry supported) on front-end.
 - Redesigned federation admin section with dedicated instance pages
 - Allow to filter moderation reports by domain
 - Added a button to go to past events of a group if it has no upcoming events
 - Add Überauth CAS Strategy
 - Add a CLI command to delete actors
 
 - Changed mailer library from Bamboo to Swoosh, should fix emails being considered spam. **Some configuration changes are required, see below.**
 - Expose some fields to ActivityStreams event representation: `isOnline`, `remainingAttendeeCapacity` and `participantCount`
 - Expose a new field to ActivityStreams group representation: `memberCount`
 - Improve group creation errors feedback
 - Only display locality in event card
 - Stale groups are now excluded from group search
 - Event default visibility is now set according to group privacy setting
 - Remove Koena Connect button
 - Hide the whole metadata block if group has no description
 - Increase task timeout in Refresher to 60 seconds
 - Allow webfinger to be fetched over http (not https) in dev mode
 - Improve reactions when approving/rejecting an instance follow
 - Improve instance admin view for mobile
 - Allow to reject instance following
 - Allow instance to have non-standard ports
 - Add pagination to the instances list
 - Eventually fetch actors in mentions
 - Improve IdentityPicker, JoinGroupWithAccount and ActorInline components
 - Various group and posts improvements
 - Update schema.graphql file
 - Add "Accept-Language" header to sentry request metadata
 - Hide address blocks when address has no real data
 - Remove obsolete attribute type="text/css" from <style> tags
 - Improve actor cards integration
 - Use upstream dependencies for Ueberauth providers
 - Include ongoing events in search
 - Send push notification into own task
 - Add appropriate timeouts for Repo.transactions
 - Add a proper error message when adding an instance follow that doesn't respond
 - Allow the instance to be followed from Mastodon (through relays)
 - Remove unused fragment from FETCH_PERSON GraphQL query
 
 - Fixed actor refreshment being impossible
 - Fixed ical export for undefined datetimes
 - Fixed parsing links with hashtag characters
 - Fixed fetching link details from Twitter
 - Fixed Thunderbird accessing ICS feed endpoint with special `Accept` HTTP header
 - Make sure every ICS/Feed caches are emptied when modifying entities
 - Fixed time issues with DST changes
 - Fixed group preview card not truncating description
 - Fixed redirection after login
 - Fixed user admin section showing button to confirm user when the user is already confirmed
 - Fixed creating event from group view not always setting the group as organizer
 - Fixed invalid addresses blocking event metadata preview rendering
 - Fixed group deletion with comments that caused foreign key issues
 - Fixed incoming Accept activities from participations we don't already have
 - Fixed resources that didn't have metadata size limits
 - Properly fallback to UTC when sending notifications and the user doesn't have a timezone setting set
 - Fix posts creation
 - Fix rejecting instance follow
 - Fix pagination of group events
 - Add proper fallback for when a TZ isn't registered
 - Hide side of report modal on low width screens
 - Fix Telegram Logo being replaced with Mastodon logo in ShareGroupModal
 - Change URL for Mastodon Share Manager
 - Fix receiving Flag activities on federated events
 - Fix activity notifications by preloading user.activity_settings
 - Fix text overflow on group card description
 - Exclude tags with more than 40 characters from being extracted
 - Avoid duplicate tags with different casing
 - Fix invalid HTML (<div> inside <label>)
 - Fix latest group not refreshing in admin section
 - Add missing "relay@" part of federated address to follow
 - Fix Ueberauth use of CSRF with session
 - Fix being an administrator when using 3rd-party auth provider
 - Make sure activity recipient can't be nil
 - Make sure users can't create profiles or groups with non-valid patterns
 - Add description field to address representation
 - Make sure prompt show the correct message and not just "Continue?" in mix mode
 - Make sure activity notification recaps can't be sent multiple times
 - Fix group notification of new event being sent multiple times
 - Fix links to group page in group membership emails and participation
 - Fix clicking on map crashing the app
 
 - Arabic
 - Basque
 - Belarusian
 - Bengali
 - Catalan
 - Chinese (Traditional)
 - Croatian
 - Czech
 - Danish
 - Dutch
 - Esperanto
 - Finnish
 - French
 - Gaelic
 - Galician
 - German
 - Hebrew
 - Hungarian
 - Indonesian
 - Italian
 - Japanese
 - Kabyle
 - Kannada
 - Norwegian Nynorsk
 - Occitan
 - Persian
 - Polish
 - Portuguese
 - Portuguese (Brazil)
 - Russian
 - Slovenian
 - Spanish
 - Swedish
 - Welsh
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEExMITpfxOHHCvHn8FoGG53eDKB3MFAmKCI7kACgkQoGG53eDK
 B3M0cg//U3F1oCzg8piPaIAUGgXTx7yOZ+rRO8tHX63+whg6Yu7vu09G8Hm7iyVD
 t2CuzEwKNKdgwUV4XG6CJfban20p/lBhGupQvCpIUOBZ6gKn6m2j7KAHj2/GbEot
 um+Dqu/ktIZN+2vc48nH7HGgcO1c/oCzUE3nH0HYWA9GCVGIAIz+alHszOl9CtL/
 TFpgrF5ygRtk4Z4W/hg6j94PP4IpdCybob8/mgN8eZeF4VbaiCGBdsxl5jai+nqE
 wgebLqyyDAmnE/aW1E64TTLlRP8eZwmNkfxuyI5bjMX8sgvML/ZEcKmcIHPh7tby
 5+pEDnRPg8vnqI5SnkaNH2/77WWY0zPQRFsIV4NFnbMuqZ8fumIC9ke/RXEDGMfS
 ZQi0mWpTT6xZC/XyrjfcaGrV3JY/mrkEXUxFlEwMNm3dGnHKSGCgHIz4gPoQw5U+
 wxPyi+wcnmeHTbic7A89aGH3a4H2BF+f2iZeTrA+XyyopU/7Pr9xgzEHL/3Y/9wA
 +d/hJffLjOM5stg1Zqcndv9LxEFcTtjYBfIeV5kPLVc35s7IbmvoJizFBDrAWisj
 qLsmk9Tg2ODXCN9jIGto1YqQwBWUSYAfYgMzLyvLG1yb8mSBlhWUp/a3uZcekCUL
 qDOLNiiFKdD4TIjV/8Nst0YIHR3g4K2NtftjO92NWx2XeRBcS+w=
 =aZJM
 -----END PGP SIGNATURE-----

Merge tag '2.1.0' into chapril

- Added an event category field. Administrators can extend the pre-configured list of categories through configuration.
- Added possibility for administrators to have analytics (Matomo, Plausible supported) and error handling (Sentry supported) on front-end.
- Redesigned federation admin section with dedicated instance pages
- Allow to filter moderation reports by domain
- Added a button to go to past events of a group if it has no upcoming events
- Add Überauth CAS Strategy
- Add a CLI command to delete actors

- Changed mailer library from Bamboo to Swoosh, should fix emails being considered spam. **Some configuration changes are required, see below.**
- Expose some fields to ActivityStreams event representation: `isOnline`, `remainingAttendeeCapacity` and `participantCount`
- Expose a new field to ActivityStreams group representation: `memberCount`
- Improve group creation errors feedback
- Only display locality in event card
- Stale groups are now excluded from group search
- Event default visibility is now set according to group privacy setting
- Remove Koena Connect button
- Hide the whole metadata block if group has no description
- Increase task timeout in Refresher to 60 seconds
- Allow webfinger to be fetched over http (not https) in dev mode
- Improve reactions when approving/rejecting an instance follow
- Improve instance admin view for mobile
- Allow to reject instance following
- Allow instance to have non-standard ports
- Add pagination to the instances list
- Eventually fetch actors in mentions
- Improve IdentityPicker, JoinGroupWithAccount and ActorInline components
- Various group and posts improvements
- Update schema.graphql file
- Add "Accept-Language" header to sentry request metadata
- Hide address blocks when address has no real data
- Remove obsolete attribute type="text/css" from <style> tags
- Improve actor cards integration
- Use upstream dependencies for Ueberauth providers
- Include ongoing events in search
- Send push notification into own task
- Add appropriate timeouts for Repo.transactions
- Add a proper error message when adding an instance follow that doesn't respond
- Allow the instance to be followed from Mastodon (through relays)
- Remove unused fragment from FETCH_PERSON GraphQL query

- Fixed actor refreshment being impossible
- Fixed ical export for undefined datetimes
- Fixed parsing links with hashtag characters
- Fixed fetching link details from Twitter
- Fixed Thunderbird accessing ICS feed endpoint with special `Accept` HTTP header
- Make sure every ICS/Feed caches are emptied when modifying entities
- Fixed time issues with DST changes
- Fixed group preview card not truncating description
- Fixed redirection after login
- Fixed user admin section showing button to confirm user when the user is already confirmed
- Fixed creating event from group view not always setting the group as organizer
- Fixed invalid addresses blocking event metadata preview rendering
- Fixed group deletion with comments that caused foreign key issues
- Fixed incoming Accept activities from participations we don't already have
- Fixed resources that didn't have metadata size limits
- Properly fallback to UTC when sending notifications and the user doesn't have a timezone setting set
- Fix posts creation
- Fix rejecting instance follow
- Fix pagination of group events
- Add proper fallback for when a TZ isn't registered
- Hide side of report modal on low width screens
- Fix Telegram Logo being replaced with Mastodon logo in ShareGroupModal
- Change URL for Mastodon Share Manager
- Fix receiving Flag activities on federated events
- Fix activity notifications by preloading user.activity_settings
- Fix text overflow on group card description
- Exclude tags with more than 40 characters from being extracted
- Avoid duplicate tags with different casing
- Fix invalid HTML (<div> inside <label>)
- Fix latest group not refreshing in admin section
- Add missing "relay@" part of federated address to follow
- Fix Ueberauth use of CSRF with session
- Fix being an administrator when using 3rd-party auth provider
- Make sure activity recipient can't be nil
- Make sure users can't create profiles or groups with non-valid patterns
- Add description field to address representation
- Make sure prompt show the correct message and not just "Continue?" in mix mode
- Make sure activity notification recaps can't be sent multiple times
- Fix group notification of new event being sent multiple times
- Fix links to group page in group membership emails and participation
- Fix clicking on map crashing the app

- Arabic
- Basque
- Belarusian
- Bengali
- Catalan
- Chinese (Traditional)
- Croatian
- Czech
- Danish
- Dutch
- Esperanto
- Finnish
- French
- Gaelic
- Galician
- German
- Hebrew
- Hungarian
- Indonesian
- Italian
- Japanese
- Kabyle
- Kannada
- Norwegian Nynorsk
- Occitan
- Persian
- Polish
- Portuguese
- Portuguese (Brazil)
- Russian
- Slovenian
- Spanish
- Swedish
- Welsh
2022-05-24 15:48:39 +02:00
Thomas Citharel 98229e8165
Release 2.1.0
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-16 12:12:53 +02:00
Thomas Citharel 5c39fd2852
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-16 12:12:23 +02:00
Thomas Citharel 6ea060291c Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1243
2022-05-13 08:53:22 +00:00
DignifiedSilence f82e96a5fe Translated using Weblate (Japanese)
Currently translated at 46.0% (614 of 1332 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ja/
2022-05-12 22:19:08 +02:00
Thomas Citharel 79a51e5237
Release 2.1.0-rc.6
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-11 12:23:35 +02:00
Thomas Citharel f86b82f0d5 Merge branch 'cleanup-fetch-person' into 'main'
Remove unused Profile.vue component

See merge request framasoft/mobilizon!1242
2022-05-11 10:23:01 +00:00
Thomas Citharel 63e56b5b24
Remove unused Profile.vue component
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-11 12:05:01 +02:00
setop 57d4abae68
this fragment is never used and put pressure on the DB 2022-05-11 12:04:46 +02:00
Thomas Citharel 2b852c622e Merge branch 'deps' into 'main'
Update deps

See merge request framasoft/mobilizon!1241
2022-05-11 09:58:55 +00:00
Thomas Citharel 4213e1f1ec
Send activity recap emails outside of the transaction
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-11 11:24:20 +02:00
Thomas Citharel c05243f839
Add more logging to send_activity_recap_worker
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-11 09:47:18 +02:00
Thomas Citharel ab622cb424
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-11 09:24:27 +02:00
Thomas Citharel 90980bc2c5 Merge branch 'fix-clicking-on-map' into 'main'
Fix clicking on map crashing

See merge request framasoft/mobilizon!1239
2022-05-10 16:57:28 +00:00
Thomas Citharel ef26f1a684
Fix clicking on map crashing
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-10 15:31:36 +02:00
Thomas Citharel 18ceeb450a Merge branch 'notification-fixes' into 'main'
Notification fixes

Closes #1077

See merge request framasoft/mobilizon!1238
2022-05-10 12:14:35 +00:00
Thomas Citharel 123eee675a
Fix links to group page in group membership emails and participation
card

Closes #1077

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-10 13:41:02 +02:00
Thomas Citharel 46236dbe1d
Fix group notification of new event being sent multiple times
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-10 13:15:12 +02:00
Thomas Citharel 1eb111f52f
Make sure activity notification recaps can't be sent multiple times
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-10 13:15:11 +02:00
Thomas Citharel 3fea2d0395
Allow is_delay_ok_since_last_notification_sent? to have the delay as
param

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-10 13:15:11 +02:00
Thomas Citharel 44b2ca26bd Merge branch 'fixes' into 'main'
Add a CLI command to delete actors

See merge request framasoft/mobilizon!1237
2022-05-09 16:57:27 +00:00
Thomas Citharel 5bc63185fd
Add a CLI command to delete actors
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-09 18:27:51 +02:00
Thomas Citharel 071185204e
Fix a comment
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-09 18:27:29 +02:00
Thomas Citharel 5bc9245dce
Make sure prompt show the correct message and not just "Continue?" in
mix mode

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-09 18:27:05 +02:00
Thomas Citharel 4fc5554142 Merge branch 'henrif/1096-add-desc-to-add-rep' into 'main'
Add description field to address representation

Closes #1096

See merge request framasoft/mobilizon!1234
2022-05-09 07:36:27 +00:00
Thomas Citharel f07d6d63de Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1235
2022-05-09 07:33:40 +00:00
Berto Te f6cd91ad1f Translated using Weblate (Spanish)
Currently translated at 100.0% (210 of 210 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/es/
2022-05-07 19:02:06 +02:00
Henri Febleux 5b4e6ed473 Add description field to address representation
Fixes: #1096
2022-05-07 18:28:32 +02:00
Thomas Citharel 9be4ed84da Merge branch 'fixes' into 'main'
Various fixes

Closes #1068

See merge request framasoft/mobilizon!1233
2022-05-06 18:48:32 +00:00
Thomas Citharel 7a6a013d93
Make sure users can't create profiles or groups with non-valid patterns
Closes #1068

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 20:01:05 +02:00
Thomas Citharel 3b8b150d48
Make sure activity recipient can't be nil
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 17:51:54 +02:00
Thomas Citharel 888d2ef4b8
Expose correct relay address in federation
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 17:21:11 +02:00
Thomas Citharel 3982977121
Allow to get Mastodon instance relays
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 16:59:28 +02:00
Thomas Citharel aff1959030
Only prevent following non-Mobilizon instances, but allow being followed
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 16:40:32 +02:00
Thomas Citharel 0b49021f8b
Fix admin notification e-mails from instance follow for Mastodon
instances

Show an appropriate name in the body of the mail

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 16:36:04 +02:00
Thomas Citharel f58d6829da
Bump version to 2.1.0-rc.5
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 14:56:38 +02:00
Thomas Citharel d3bc76afbf
Add changelog for 2.1.0-rc.5
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 14:56:19 +02:00
Thomas Citharel 578bd99be2
Format CHANGELOG.md
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 14:56:19 +02:00
Thomas Citharel c9ebd76cc9 Merge branch 'fixes' into 'main'
CI changes

See merge request framasoft/mobilizon!1232
2022-05-06 12:52:36 +00:00
Thomas Citharel 05724476aa
Remove unused addRelay mutation
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 14:23:16 +02:00
Thomas Citharel 6eb2b6d31a
Better display of the errors when adding an instance
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 14:23:16 +02:00
Thomas Citharel cd3d0c5fc4
Add a proper error message when adding an instance that doesn't respond
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 14:23:16 +02:00
Thomas Citharel 6a937d6ede
Remove refresh instance triggers
There are not needed anymore, instances are always refreshed when adding
a new one, and we refresh periodically

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 12:52:39 +02:00
Thomas Citharel 2651f4cf40
Remove OS-specific packages from UPGRADE.md
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 12:42:16 +02:00
Thomas Citharel 8549a16ade
Only build on Debian Buster
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-06 12:41:34 +02:00
Thomas Citharel 3fcb44642a Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1231
2022-05-05 17:28:42 +00:00
Berto Te 41dfc2bc1c Translated using Weblate (Spanish)
Currently translated at 100.0% (355 of 355 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/es/
2022-05-05 19:05:53 +02:00
Thomas Citharel a84ec21aba Merge branch 'fix-db-trigger' into 'main'
Only trigger refresh_instances when the actor being changed is a relay

Closes #1103

See merge request framasoft/mobilizon!1230
2022-05-05 10:50:46 +00:00
Thomas Citharel 61e6200b02
Only trigger refresh_instances when the actor being changed is a relay
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-05 12:19:53 +02:00
Thomas Citharel b1205b6912 Merge branch 'revert-d85f708c' into 'main'
Revert "Merge branch 'external-events' into 'main'"

See merge request framasoft/mobilizon!1228
2022-05-04 07:02:44 +00:00
Thomas Citharel 26cf892758 Revert "Merge branch 'external-events' into 'main'"
This reverts merge request !1223
2022-05-04 07:02:16 +00:00
Thomas Citharel d85f708c37 Merge branch 'external-events' into 'main'
Add option to link an external registration provider for events

See merge request framasoft/mobilizon!1223
2022-05-04 07:01:53 +00:00
Thomas Citharel a400499a57 Merge branch 'db-fixes' into 'main'
Add appropriate timeouts for Repo.transactions

See merge request framasoft/mobilizon!1227
2022-05-04 06:58:17 +00:00
Thomas Citharel 87214b038f
Add appropriate timeouts for Repo.transactions
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-04 08:21:15 +02:00
Thomas Citharel 90158f1112 Merge branch 'fixes' into 'main'
Remove unused indirect dependency

See merge request framasoft/mobilizon!1226
2022-05-03 14:23:32 +00:00
Luca Eichler 75502e2a4b
Add option to link an external registration provider for events 2022-05-03 15:33:32 +02:00
Thomas Citharel ec849b1488
Release 2.1.0-rc.4
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-03 15:15:52 +02:00
Thomas Citharel 1e9a7c2cbb
Upgrade deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-03 15:12:56 +02:00
Thomas Citharel 63a23748ac
Improve test coverage
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-03 12:58:07 +02:00
Thomas Citharel 999a33c7c3
Typespec fixes and refactoring
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-03 12:23:09 +02:00
Thomas Citharel f6a17d8b3a
Improve a guard
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-03 11:41:17 +02:00
Thomas Citharel a18c4daf4c
Avoid using actor id from config cache
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-03 11:40:16 +02:00
Thomas Citharel c0d8b2d39a
Remove unused indirect dependency
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-03 11:30:06 +02:00
Thomas Citharel b3e7f23604 Merge branch 'cas-fies' into 'main'
CAS Auth Fixes

See merge request framasoft/mobilizon!1225
2022-05-02 13:15:08 +00:00
Thomas Citharel 20542d3b68
Show provider name instead of ID in auth error message
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 14:40:17 +02:00
Thomas Citharel 1299b3baf1
CAS Auth Fixes
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 14:40:17 +02:00
Thomas Citharel d7887ccb83 Merge branch 'fixes' into 'main'
Various fixes

See merge request framasoft/mobilizon!1224
2022-05-02 11:52:57 +00:00
Thomas Citharel 62248b2f81
Add Überauth CAS Strategy
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 13:15:15 +02:00
Thomas Citharel ada22e24ef
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 13:15:14 +02:00
Thomas Citharel bf7ebfd989
Test refreshing instances does not update self relay actor
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 13:15:14 +02:00
Thomas Citharel a4cc566ee7
Fix some typespecs
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 12:08:00 +02:00
Thomas Citharel cd61a98f4d
Use Github version of WebPushEncryption
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 12:07:39 +02:00
Thomas Citharel 926dd01272
Send push notification into own task
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 12:07:21 +02:00
Thomas Citharel d87261a6fb
Fix lint after merge
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-02 09:04:57 +02:00
Thomas Citharel 93805dca11 Merge branch 'setop-main-patch-92671' into 'main'
include ongoing events in search

Closes #729

See merge request framasoft/mobilizon!1171
2022-05-02 06:48:16 +00:00
setop f071f70d1f include ongoing events in search 2022-05-02 06:48:15 +00:00
Thomas Citharel 6596e2d6bd Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1222
2022-05-01 20:25:46 +00:00
אנטולי מהגבעות האדומות 7e71399065 Translated using Weblate (Hebrew)
Currently translated at 25.4% (339 of 1332 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/he/
2022-05-01 21:00:48 +02:00
Thomas Citharel d2ebe86c9f Merge branch 'auth-modernize' into 'main'
Various 3rd-party auth providers improvements

Closes #506 et #989

See merge request framasoft/mobilizon!1221
2022-04-28 10:35:23 +00:00
Thomas Citharel c91e8f6bf3
Fix being an administrator when using 3rd-party auth provider
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-28 11:59:24 +02:00
Thomas Citharel f997f573ba
Use a session for state parameter in Ueberauth callback controller
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-28 11:59:24 +02:00
Thomas Citharel 82255b46eb
Use upstream dependencies for Ueberauth providers
Allows to work properly with state_param

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-28 11:41:28 +02:00
Thomas Citharel 9ab0768684 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1220
2022-04-28 07:34:01 +00:00
GunChleoc 303a6f8bd8 Translated using Weblate (Gaelic)
Currently translated at 99.7% (1329 of 1332 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/
2022-04-28 04:48:56 +02:00
Thomas Citharel da80fa6235 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1219
2022-04-27 13:20:06 +00:00
GunChleoc 2aedf3027e Translated using Weblate (Gaelic)
Currently translated at 3.3% (12 of 355 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/gd/
2022-04-27 14:10:50 +02:00
GunChleoc d308752f25 Translated using Weblate (Gaelic)
Currently translated at 99.7% (1329 of 1332 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/
2022-04-27 14:10:50 +02:00
Thomas Citharel ead459d79b Merge branch 'release-2.1.0-rc.3' into 'main'
Release 2.1.0-rc.3

See merge request framasoft/mobilizon!1218
2022-04-24 16:51:07 +00:00
Thomas Citharel 1323c20162
Release 2.1.0-rc.3
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-24 18:33:09 +02:00
Thomas Citharel 33e26466a6
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-24 18:33:09 +02:00
Thomas Citharel 4b8cfffede Merge branch 'fix-following-instances' into 'main'
Add missing "relay@" part of federated address to follow

See merge request framasoft/mobilizon!1217
2022-04-24 16:32:36 +00:00
Thomas Citharel ce6a25048c
Add missing "relay@" part of federated address to follow
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-24 17:52:46 +02:00
Thomas Citharel 030a149a61 Merge branch 'fixes' into 'main'
Improve actor cards integration

See merge request framasoft/mobilizon!1216
2022-04-22 10:38:42 +00:00
Thomas Citharel e4a22bdb83
Fix latest group not refreshing in admin section
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-22 12:04:05 +02:00
Thomas Citharel 3ce8c142b8
Improve actor cards integration
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-22 12:00:47 +02:00
Thomas Citharel 3ff9ee59cc Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1215
2022-04-22 07:35:13 +00:00
Berto Te 76eeceecbd Translated using Weblate (Spanish)
Currently translated at 100.0% (1332 of 1332 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/es/
2022-04-22 01:34:12 +02:00
Thomas Citharel e26364f973 Merge branch 'hashtag-fixes' into 'main'
Exclude tags with more than 40 characters from being extracted.

Closes #939 et #562

See merge request framasoft/mobilizon!1214
2022-04-21 16:07:54 +00:00
Thomas Citharel 279badb2bf
Refactor Mobilizon.Federation.ActivityPub.Types.Events tags handling
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 17:31:47 +02:00
Thomas Citharel d05eb96ac6
Remove attribute type="text/css" from <style> tags
Closes #939

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 17:13:21 +02:00
Thomas Citharel 2749491467
Fix invalid HTML (<div> inside <label>)
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 17:13:21 +02:00
Thomas Citharel f23f438763
Add test for the hashtag special cases
- Test that same hashtags with different casing are taken only once into
  account
- Test that too long hashtags are not extracted from description

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 17:13:21 +02:00
Thomas Citharel 7b3ce8d812
Avoid duplicate tags with different casing
Closes #562

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 17:13:21 +02:00
Thomas Citharel ca860273a0
Exclude tags with more than 40 characters from being extracted.
They are still in the HTML produced

Closes #562

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 17:13:20 +02:00
Thomas Citharel 95062df343 Merge branch 'enhancements' into 'main'
Various enhancements

Closes #1085

See merge request framasoft/mobilizon!1213
2022-04-21 11:06:56 +00:00
Thomas Citharel adfe7b2af2
Fix text overflow on group card description
Closes #1085

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 11:54:30 +02:00
Thomas Citharel e36f8f53ab
Hide address blocks when address has no real data
Closes #1085

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 11:54:20 +02:00
Thomas Citharel dc75a9beb3
[Front-end] Address model refactoring
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 11:43:41 +02:00
Thomas Citharel 0c49ddc65b
Add "Accept-Language" header to sentry request metadata
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 10:33:42 +02:00
Thomas Citharel 74cece5796
Preload user.activity_settings to as it's being used after
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-21 10:21:05 +02:00
Thomas Citharel 99dacb6038
Release 2.1.0-rc.2
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 20:17:23 +02:00
Thomas Citharel 04ec8fe2d3 Merge branch 'fixes' into 'main'
Update schema.graphql file

Closes #1088

See merge request framasoft/mobilizon!1212
2022-04-20 17:55:03 +00:00
Thomas Citharel b79f918d51
Correct a @moduledoc
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 19:15:33 +02:00
Thomas Citharel 0bc7864cb3
Hide the whole metadata block if group has no description
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 19:15:06 +02:00
Thomas Citharel 3f32b3409f
Increase task timeout in Refresher to 60 seconds
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 18:47:31 +02:00
Thomas Citharel 74eeaccdc6
Allow webfinger to be fetched over http (not https) in dev mode
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 18:38:03 +02:00
Thomas Citharel 7c8de2b87f
Fix rejecting instance follow
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 18:35:38 +02:00
Thomas Citharel f6ac72f08d
Allow instance to have non-standard ports
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 18:35:18 +02:00
Thomas Citharel 19052ba48b
Improve reactions when approving/rejecting an instance follow
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 18:30:16 +02:00
Thomas Citharel 10b92705e8
Improve instance admin view for mobile
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:12 +02:00
Thomas Citharel 46c0693829
Allow to reject instance following
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:12 +02:00
Thomas Citharel 993f4a7dcb
Update snapshots after front-end changes
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:12 +02:00
Thomas Citharel 79872b47df
Make sure we can call displayName with eventually undefined actor
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:11 +02:00
Thomas Citharel c216172d44
Fix pagination of group events
Closes #1088

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:11 +02:00
Thomas Citharel 409439a916
Make sure we can't refresh the local instance
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:11 +02:00
Thomas Citharel 28f5cdd03a
Handle webfinger JSON data being invalid format
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:10 +02:00
Thomas Citharel 0ebb797740
Directly delete an object if the actor is itself
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:10 +02:00
Thomas Citharel 00f4c0b02c
Make sure remote Update activities can't affect local actors other than
Groups

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:10 +02:00
Thomas Citharel 4b869a6015
Make some functions private in Mobilizon.Federation.ActivityPub.Utils
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:09 +02:00
Thomas Citharel df8721670a
Add a comment about why we don't sign object fetches when refetching actor keys
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:09 +02:00
Thomas Citharel 11bde88a02
Add pagination to the instances list
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:09 +02:00
Thomas Citharel 69b88c9238
Upgrade deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:08 +02:00
Thomas Citharel 15418bfb8d
Fix an issue in the french translation
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:08 +02:00
Thomas Citharel 852be15a3e
Eventually fetch actors in mentions
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:08 +02:00
Thomas Citharel 14545fd983
Add proper fallback for when a TZ isn't registered
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 16:18:08 +02:00
Thomas Citharel f5791d1413
Debug log mentions in text to be processed
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:15 +02:00
Thomas Citharel eebcd48447
Improve IdentityPicker
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:15 +02:00
Thomas Citharel 48f1d3efc6
Hide side of report modal on low width screens
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:15 +02:00
Thomas Citharel 62f4f2bd24
Improve JoinGroupWithAccount component
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:15 +02:00
Thomas Citharel 5bbb9713d4
Various group and posts improvements
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:15 +02:00
Thomas Citharel 74e8dd1eb2
Fix Telegram Logo being replaced with Mastodon logo in ShareGroupModal
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:15 +02:00
Thomas Citharel 54afbd395f
Change URL to Mastodon Share Manager
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:14 +02:00
Thomas Citharel 7275a530a2
Improve ActorInline component
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:14 +02:00
Thomas Citharel 4ee1efd4b9
Avoid assuming we're on Debian-based in release build
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:14 +02:00
Thomas Citharel 48d17c122d
Fix an issue with no default timezone
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:14 +02:00
Thomas Citharel d7aa432cca
Fix receiving Flag activities on federated events
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:03:14 +02:00
Thomas Citharel 24331d75b0
Update schema.graphql file
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-20 09:02:59 +02:00
Thomas Citharel b1a4f1b581 Merge branch 'fixes' into 'main'
Various fixes

See merge request framasoft/mobilizon!1211
2022-04-18 14:23:11 +00:00
Thomas Citharel f389b060c8
Release 2.1.0-rc.1
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-18 15:01:32 +02:00
Thomas Citharel a731a96b58
Remove HEX_MIRROR uses
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-18 15:01:32 +02:00
Thomas Citharel 0b04980332
Remove Koena Connect button
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-18 15:01:32 +02:00
Thomas Citharel 2eac639200
Fix front-end post creation
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-18 14:47:44 +02:00
Thomas Citharel 83f2880dd9
Fix some typespecs
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-18 14:47:44 +02:00
Thomas Citharel 714e9216c1
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-18 14:17:04 +02:00
Thomas Citharel cc8a115974
[CI] Fix docker buildpack image name
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-09 22:03:30 +02:00
Thomas Citharel 75f549170d Merge branch '2.1.0-beta.3' into 'main'
Add fedora and alpine release builds

See merge request framasoft/mobilizon!1210
2022-04-09 15:49:03 +00:00
Thomas Citharel 7d5581bf73
Release 2.1.0-beta.3
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-09 17:48:03 +02:00
Thomas Citharel 2917eea50f
Add fedora and alpine release builds
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-09 17:46:48 +02:00
Thomas Citharel 086aa0df8b
Release 2.1.0-beta.2
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-08 14:08:34 +02:00
Thomas Citharel c49200f82b Merge branch 'test-build-multiple-os' into 'main'
Test multi-os building

Closes #1081

See merge request framasoft/mobilizon!1209
2022-04-08 11:27:35 +00:00
Thomas Citharel e8c4382901
Test multi-os building
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-08 12:37:36 +02:00
Thomas Citharel c5edc1a0c3
Add a section in UPGRADE.md for 2.1
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-08 09:00:40 +02:00
Thomas Citharel 58c05d57f2 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1208
2022-04-07 21:38:10 +00:00
Berto Te 55071c71cb Translated using Weblate (Spanish)
Currently translated at 100.0% (1323 of 1323 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/es/
2022-04-07 22:11:19 +02:00
Thomas Citharel 64efd47cdc Merge branch 'clean-docs' into 'main'
Reorganize docs

See merge request framasoft/mobilizon!1207
2022-04-07 17:27:37 +00:00
Thomas Citharel 7a18d0b2bb
Fix ex_docs warnings
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 18:51:10 +02:00
Thomas Citharel 698f78ee9a
Reorganize docs
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 18:51:10 +02:00
Thomas Citharel 5bb1247f37
Put env directly when building docker images
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 14:46:34 +02:00
Thomas Citharel d01bbcad98
Use JSDeliver mirror when building Docker images as well
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 13:59:15 +02:00
Thomas Citharel d11929d231
Release 2.1.0-beta.1
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 12:19:45 +02:00
Thomas Citharel 837aec4de7
Update CHANGELOG for 2.1.0-beta.1
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 12:19:02 +02:00
Thomas Citharel f788839665 Merge branch 'setop/mobilizon-fix-search-perf' into 'main'
Add spatial indexes on address table

Closes #1047

See merge request framasoft/mobilizon!1206
2022-04-07 10:01:45 +00:00
Thomas Citharel de8231858a
Use JSDeliver mirror
Until https://github.com/hexpm/hexpm/issues/1130 is solved or understood

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 11:20:52 +02:00
Thomas Citharel 70cb96dc96
Add spatial indexes on address table
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 10:51:31 +02:00
setop febb68e702
add haversine dependency 2022-04-07 10:51:30 +02:00
setop 38579d9dc2
add search box to filter addresses quickly 2022-04-07 10:51:30 +02:00
Thomas Citharel 4f92add78d
Format LiveView templates after adding the LiveView formatter plugin
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 10:33:11 +02:00
Thomas Citharel bde831299d
Add LiveView plugin to formatter
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 10:31:44 +02:00
Thomas Citharel c77b979a97
Upgrade Phoenix LiveView
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-07 10:31:29 +02:00
Thomas Citharel d45c8b194b Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1205
2022-04-06 21:22:19 +00:00
Berto Te c9427a77f2 Translated using Weblate (Spanish)
Currently translated at 100.0% (355 of 355 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/es/
2022-04-06 20:31:55 +02:00
Thomas Citharel ca6db74a73 Merge branch 'analytics' into 'main'
Provide analytics on Front-end

Closes #690

See merge request framasoft/mobilizon!1200
2022-04-06 18:31:49 +00:00
Thomas Citharel 257050eabc
Pin ex_cldr version until ex_cldr_dates_times is updated
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:11 +02:00
Thomas Citharel 68c24e2425
Update tests Dockerfile
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:11 +02:00
Thomas Citharel 822a16fc53
Update Postgis image used in tests
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:10 +02:00
Thomas Citharel e2682c570d
Only display locality in event card address section and truncate
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:10 +02:00
Thomas Citharel 8b3278b60f
Fix display of contacts on event view
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:10 +02:00
Thomas Citharel 0abb9a13e5
Various group events improvements
Adds a button to show pasts events of a group if no upcoming events are
displayed
q
Closes #690

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:10 +02:00
Thomas Citharel 927d2296eb
Improve event metadata links display
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:09 +02:00
Thomas Citharel 2ed69f9484
Actor card improvements
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:09 +02:00
Thomas Citharel 999f2f8e14
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:09 +02:00
Thomas Citharel e3adc0684f
Make FrontEndAnalytics provide CSP configuration
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 19:56:09 +02:00
Thomas Citharel da2254089c
Make sure suspended actors are not in the AP cache anymore
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 16:54:00 +02:00
Thomas Citharel 501e0d12e4
Properly fallback to MEETING category if category is not in the
allowlist

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 14:42:01 +02:00
Thomas Citharel 2978ae5d1e
Fix some warnings in js unit tests
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 14:25:38 +02:00
Thomas Citharel bcf936d103
Set initial analytics configuration
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 14:25:38 +02:00
Thomas Citharel 3f538ccf95
Avoid NavigationDuplicated error after Login
Only redirect on mounted if already logged-in

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 14:25:38 +02:00
Thomas Citharel 709d26735b
Provide analytics on Front-end
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 12:31:46 +02:00
Thomas Citharel c1a59f5536
Use better default for SMTP mailer
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-06 10:24:14 +02:00
Thomas Citharel 990a442c87 Merge branch 'update-translations' into 'main'
Remove unused variable

See merge request framasoft/mobilizon!1204
2022-04-05 12:13:55 +00:00
Thomas Citharel 46c38fad28
Update translations
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-05 14:13:20 +02:00
Thomas Citharel cb1e41d90d
Remove unused variable
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-05 14:10:21 +02:00
Thomas Citharel e1009f76e9 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1202
2022-04-05 12:08:39 +00:00
Norwin 505e45d87d Translated using Weblate (German)
Currently translated at 99.8% (1309 of 1311 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-04-05 13:21:30 +02:00
Norwin 24cd0a23a5 Translated using Weblate (German)
Currently translated at 96.6% (342 of 354 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/de/
2022-04-05 13:21:30 +02:00
Norwin 4cde0c058e Translated using Weblate (German)
Currently translated at 99.8% (1309 of 1311 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-04-05 13:21:30 +02:00
Thomas Citharel 4b9a38b2a7 Merge branch 'email-spam' into 'main'
Move mailer from Bamboo to Swoosh

Closes #491

See merge request framasoft/mobilizon!1203
2022-04-05 11:21:24 +00:00
Thomas Citharel e49a8e3905
Fix issue in function signature
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-05 12:38:03 +02:00
Thomas Citharel 8ebcba998b
Upgrade erlang version
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-05 12:38:02 +02:00
Thomas Citharel e841fb6fbb
Move mailer from Bamboo to Swoosh
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-05 12:38:02 +02:00
Thomas Citharel 8e16c64989 Merge branch 'redirect-after-login' into 'main'
Fix redirection after login

Closes #1067

See merge request framasoft/mobilizon!1201
2022-04-04 14:30:48 +00:00
Thomas Citharel ee69ce1972 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1198
2022-04-04 14:27:52 +00:00
Norwin e30af9adbe Translated using Weblate (German)
Currently translated at 99.7% (1308 of 1311 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-04-04 16:27:26 +02:00
Jiri Podhorecky cd0d74f832 Translated using Weblate (Czech)
Currently translated at 100.0% (209 of 209 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/cs/
2022-04-04 16:27:26 +02:00
Jiri Podhorecky a5e9ab3273 Translated using Weblate (Czech)
Currently translated at 100.0% (354 of 354 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2022-04-04 16:27:26 +02:00
Jiri Podhorecky 29ad4dbddf Translated using Weblate (Czech)
Currently translated at 99.9% (1310 of 1311 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2022-04-04 16:27:26 +02:00
Marco Ciampa 5e8bec0263 Translated using Weblate (Italian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/it/
2022-04-04 16:27:26 +02:00
Marco Ciampa b769738f08 Translated using Weblate (Italian)
Currently translated at 86.7% (307 of 354 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/it/
2022-04-04 16:27:26 +02:00
Berto Te f38f3acf9b Translated using Weblate (Spanish)
Currently translated at 100.0% (355 of 355 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/es/
2022-04-04 16:27:26 +02:00
Thomas Citharel 0fac23cc4b Merge branch 'fixes' into 'main'
Various fixes

Closes #997

See merge request framasoft/mobilizon!1199
2022-04-04 14:27:16 +00:00
Thomas Citharel 05648fc1f4
Fix redirection after login
Closes #1067

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-04 15:57:44 +02:00
Thomas Citharel e5ccdccbc7
Allow to get a group by it's ID
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-04 15:42:17 +02:00
Thomas Citharel 84a5c6f893
Directly load the group in OrganizerPickerWrapper if we have the group ID
Fixes #997

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-04 15:42:17 +02:00
Thomas Citharel a2bb0c0a4d
Debounce contact filter
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-04 15:42:17 +02:00
Thomas Citharel 59c39efb80
Redesign organizer picker with tailwind
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-04 15:42:17 +02:00
Thomas Citharel 4e3eb33d01
Don't offer to confirm already confirmed user
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-04 15:42:16 +02:00
Thomas Citharel 7fcaa4a151
[GraphQL] Allow to get group by ID in person memberships
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-04 15:42:16 +02:00
Thomas Citharel d2864a22d9
Allow to exclude stale actors from group search (one week without refreshment)
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-04 15:42:16 +02:00
Thomas Citharel 2e1c284565 Merge branch 'fixes' into 'main'
Make sure every relation of actor is loaded when operating on it

Closes #1049, #1016 et #996

See merge request framasoft/mobilizon!1196
2022-04-01 13:42:33 +00:00
Thomas Citharel 7c770dd59c Merge branch 'allilengyi/mobilizon-issue912' into 'main'
Set default event visibility from group privacy setting

Closes #912

See merge request framasoft/mobilizon!1197
2022-04-01 13:13:23 +00:00
Thomas Citharel 2bdce8b2fc
Handle address is invalid while rendering event preview
Closes #996

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-01 15:01:57 +02:00
allilengyi a407a56051
Set default event visibility from group privacy setting
Closes #912
2022-04-01 14:41:29 +02:00
Thomas Citharel a99d66b68f
Fix group deletion caused by foreign keys issue with comments &
discussions

Closes #1016

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-01 12:09:23 +02:00
Thomas Citharel 7e7eed290f
Handle errors when loading group pictures
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-01 12:08:53 +02:00
Thomas Citharel c0ef41cb71
Fix accessing explore page without config
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-01 10:04:22 +02:00
Thomas Citharel b1ac997f8a
Make sure every relation of actor is loaded when operating on it
Closes #1049

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-04-01 10:03:43 +02:00
Thomas Citharel 9b7cd5831a
Add g++ to the Docker image
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 16:08:53 +02:00
Thomas Citharel 34432f9521 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1194
2022-03-31 10:52:05 +00:00
Berto Te 44bc441f1b Translated using Weblate (Spanish)
Currently translated at 100.0% (354 of 354 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/es/
2022-03-31 12:21:04 +02:00
Berto Te d4ce53646d Translated using Weblate (Spanish)
Currently translated at 100.0% (1311 of 1311 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/es/
2022-03-31 12:21:04 +02:00
Thomas Citharel b8d40a90ab Merge branch 'sentry-feedback-fixes' into 'main'
Various issues reported by sentry

See merge request framasoft/mobilizon!1195
2022-03-31 10:20:59 +00:00
Thomas Citharel 1578fd093b
Update sobelow ignores
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 11:38:33 +02:00
Thomas Citharel 1109ca1bc5
Use a specific version of dind
Follow-up to 7a82fed92a

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 11:24:23 +02:00
Thomas Citharel 458ab8ef3f
Add a missing french translation
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 11:24:23 +02:00
Thomas Citharel 3f4d007f0e
Only focus focusable HTMLElements
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 11:24:22 +02:00
Thomas Citharel de5a5345b6
Don't return error 500 when issue with media proxy
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 11:24:22 +02:00
Thomas Citharel a49bda5e4c
Handle error from converting from AP to note when having error with
actor

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 11:24:22 +02:00
Thomas Citharel c56b898379
Fix incoming Accept activities from participations we don't already have
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 11:24:22 +02:00
Thomas Citharel 4c9065ce68
Resource fixes
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 11:24:22 +02:00
Thomas Citharel 9ab95efb08
Fix an email template and rename a translated string
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 10:49:15 +02:00
Thomas Citharel dd97565dd5
Give extra content to Sentry when creating a signature
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 10:49:15 +02:00
Thomas Citharel 4a8064f24f
Move Sentry request context to new module and load it everytime
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 10:49:15 +02:00
Thomas Citharel 3c8a2a1313
Add details of object in exception when AP object as no
actor/attributedTo

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-31 10:49:15 +02:00
Thomas Citharel bd64e19af4
Move a logging warning for HTTP issue to an info
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-29 11:51:07 +02:00
Thomas Citharel 9ddcd6dff6
Make sure timezone as an UTC fallback in case it's nil
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-29 11:51:07 +02:00
Thomas Citharel 0bc931fef0 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1192
2022-03-29 08:44:16 +00:00
Norwin 5bbf288053 Translated using Weblate (German)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/de/
2022-03-29 10:09:52 +02:00
Thebigal Wisi fc2a2ddef5 Translated using Weblate (German)
Currently translated at 100.0% (324 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/de/
2022-03-29 10:09:52 +02:00
Norwin 2158017994 Translated using Weblate (German)
Currently translated at 100.0% (324 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/de/
2022-03-29 10:09:51 +02:00
fluxx f0627cbc31 Translated using Weblate (German)
Currently translated at 100.0% (1308 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-03-29 10:09:51 +02:00
Thorsten Panknin 1ff003f917 Translated using Weblate (German)
Currently translated at 100.0% (1308 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-03-29 10:09:51 +02:00
Thebigal Wisi aefb2e2dee Translated using Weblate (German)
Currently translated at 100.0% (1308 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-03-29 10:09:51 +02:00
tunda 3d6971b08c Translated using Weblate (German)
Currently translated at 100.0% (1308 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-03-29 10:09:51 +02:00
Norwin 7ab055af70 Translated using Weblate (German)
Currently translated at 100.0% (1308 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-03-29 10:09:51 +02:00
Thebigal Wisi f181ee9158 Translated using Weblate (German)
Currently translated at 100.0% (1308 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-03-29 10:09:51 +02:00
Norwin 436baa148f Translated using Weblate (German)
Currently translated at 100.0% (1308 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-03-29 10:09:51 +02:00
Kira Sinn d6ec612393 Translated using Weblate (German)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/de/
2022-03-29 10:09:51 +02:00
Thomas Citharel bccbfb1624 Merge branch 'categories' into 'main'
Categories

Closes #1056

See merge request framasoft/mobilizon!1193
2022-03-29 08:09:44 +00:00
Thomas Citharel 3a3d14fddc
Add CHANGELOG entry for 2.1.0
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-29 09:29:15 +02:00
Thomas Citharel 4983f2d695
Fix tests after category changes
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-29 09:29:15 +02:00
Thomas Citharel 368911b58e
Allow to register custom categories
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-28 20:02:43 +02:00
Thomas Citharel f5bdedf789
Introduce event categories
Closes #1056

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-28 17:42:59 +02:00
Thomas Citharel 91ed13d5c2
Fix first-day-of-week prop in event edition
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-28 13:56:37 +02:00
Thomas Citharel 85f8450a85
Debounce tag input autocomplete
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-28 11:22:40 +02:00
Thomas Citharel b47e46cef5
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-28 10:48:40 +02:00
Thomas Citharel 7a82fed92a
Use specific version of Docker dind
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-28 10:43:06 +02:00
Thomas Citharel 771348e6e0 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1191
2022-03-26 18:17:11 +00:00
Berto Te 49bacc4ea1 Translated using Weblate (Spanish)
Currently translated at 100.0% (209 of 209 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/es/
2022-03-26 09:51:47 +01:00
Thomas Citharel 786987c969 Merge branch 'truncate-description-in-group-card' into 'main'
Show only 3 lines of description on group card

Closes #1021

See merge request framasoft/mobilizon!1190
2022-03-24 16:24:42 +00:00
Thomas Citharel e50f3b1967
Follow-up to 969cfc78be
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 16:43:36 +01:00
Thomas Citharel e528984a3a
Show error messages contextually when creating a group
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 16:43:36 +01:00
Thomas Citharel befc9aa86e
Update translations after adding translatable string
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 16:43:36 +01:00
Thomas Citharel cd3c316881
Return a proper error directly when a group name conflicts
And translate the error

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 16:39:44 +01:00
Thomas Citharel 93425108c5
Allow GraphQL Error handler return custom Mobilizon.GraphQL.Error
directly

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 16:39:44 +01:00
Thomas Citharel 45ce7d52b0
Attribute errors with field property to the correct property
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 16:39:44 +01:00
Thomas Citharel 3c294b33a8
Provide group creation changeset errors as well to absinthe
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 16:39:44 +01:00
Thomas Citharel 1b0f59937d
Show only 3 lines of description on group card
Closes #1021

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 16:39:43 +01:00
Thomas Citharel f33a9bf2ae Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1189
2022-03-24 14:30:06 +00:00
Thomas Citharel 355173fd6f Translated using Weblate (French (France) (fr_FR))
Currently translated at 99.9% (1307 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fr_FR/
2022-03-24 14:57:05 +01:00
Marco Ciampa 73098498b1 Translated using Weblate (Italian)
Currently translated at 94.1% (305 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/it/
2022-03-24 14:57:05 +01:00
Thomas Citharel 884a69aef9 Merge branch 'expose-memberCount-in-ap' into 'main'
Expose member count in AP data

Closes #1057

See merge request framasoft/mobilizon!1188
2022-03-24 13:57:00 +00:00
Thomas Citharel a71c51a174
Expose member count in AP data
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 14:19:24 +01:00
Thomas Citharel b4eb6e9893 Merge branch 'cler-feed-cache' into 'main'
Clear all ics/feed caches when modifying events/posts/actors

Closes #1059

See merge request framasoft/mobilizon!1187
2022-03-24 12:27:18 +00:00
Thomas Citharel 019d694d2a
Clear all ics/feed caches when modifying events/posts/actors
Closes #1059

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 12:51:23 +01:00
Thomas Citharel 117052fb91 Merge branch 'fixes' into 'main'
Various fixes

Closes #1069

See merge request framasoft/mobilizon!1186
2022-03-24 09:43:16 +00:00
Thomas Citharel 35fb06c345
Pass the date to getTimezoneOffset() so that the DST is accounted for
See https://github.com/marnusw/date-fns-tz#gettimezoneoffset

Closes #1069

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 10:01:04 +01:00
Thomas Citharel 72ed766f26
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 09:45:54 +01:00
Thomas Citharel 63356b5994
Fix wrong prop initialization
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-24 09:43:59 +01:00
Thomas Citharel c30944dede Merge branch 'upgrade-deps' into 'main'
Upgrade dependencies

See merge request framasoft/mobilizon!1184
2022-03-23 15:51:15 +00:00
Thomas Citharel 9daf031928
Remove the oc locale
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 16:10:15 +01:00
Thomas Citharel 91f2b2bd6d
Format GraphQL block in test
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 15:22:56 +01:00
Thomas Citharel e4467ec4ad
Fix timeouts in tests by removing async: true for DB tests
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 15:22:14 +01:00
Thomas Citharel 969cfc78be
Upgrade buildx version in CI
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 14:51:26 +01:00
Thomas Citharel 9d3cd05e33
Fix embed of actor card
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 12:35:27 +01:00
Thomas Citharel e7ce24966b
Fix loading list of languages after ex_cldr update
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 12:35:27 +01:00
Thomas Citharel ed4a55b4b6
Add fallbackRootWithEmptyString when languages have empty strings
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 12:35:26 +01:00
Thomas Citharel f5e6e51817
Fix invalid GraphQL request for event creation/update
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 12:35:26 +01:00
Thomas Citharel a461674f9d
Make GraphQL parameters strict following Absinthe 1.7 validating
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 12:35:26 +01:00
Thomas Citharel 3d50f2d90d
Update pattern matching for Oban.drain_queue following update
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-23 12:35:26 +01:00
Thomas Citharel 4c5cb34b5b Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1185
2022-03-22 11:48:48 +00:00
jim@killock.org.uk f50b2b51b8 Translated using Weblate (Welsh)
Currently translated at 15.7% (206 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cy/
2022-03-22 12:15:00 +01:00
Thomas Citharel 7067173a5a
Refactor to avoid calling Mobilizon.Cldr.known_locale_name with a string
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-21 17:50:38 +01:00
Thomas Citharel 3dd0b60606
Fix duplicate field in schema
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-21 16:55:01 +01:00
Thomas Citharel 4b7498c67e
Migrations after Oban 2.11
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-21 16:55:01 +01:00
Thomas Citharel edbe6ee21a
Upgrade dependencies
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-21 16:55:01 +01:00
Thomas Citharel 27b7138c58 Merge branch 'allow-xml-accept-header' into 'main'
Thunderbird 91+ seems to send Accept: XML when doing any query

Closes #1019

See merge request framasoft/mobilizon!1183
2022-03-21 12:42:35 +00:00
Thomas Citharel f043ec32d1
Thunderbird 91+ seems to send Accept: XML when doing any query
We only accept ICS, so it didn't work.

Closes #1019

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-03-21 12:46:56 +01:00
Thomas Citharel 0fe6d54eb3 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1182
2022-03-21 11:00:56 +00:00
Marco Ciampa 74694a423b Translated using Weblate (Italian)
Currently translated at 80.5% (1053 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/it/
2022-03-21 10:36:45 +01:00
Eivind Ødegård 9804743747 Translated using Weblate (Norwegian Nynorsk)
Currently translated at 100.0% (324 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/nn/
2022-03-17 21:28:16 +01:00
Philip Bernhart 67d791c925 Translated using Weblate (Esperanto)
Currently translated at 2.5% (34 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/eo/
2022-03-10 07:24:03 +01:00
Kenneth Aalberg 0ee35c3505 Translated using Weblate (Norwegian Bokmål)
Currently translated at 4.9% (16 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/nb_NO/
2022-03-07 16:08:07 +01:00
Amanda Graven 53dd1935e0 Translated using Weblate (Danish)
Currently translated at 16.3% (214 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/da/
2022-03-07 16:08:07 +01:00
Kenneth Aalberg f9249ebce2 Added translation using Weblate (Norwegian Bokmål) 2022-03-06 23:54:31 +01:00
Amanda Graven c72c1f4080 Translated using Weblate (Danish)
Currently translated at 16.2% (213 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/da/
2022-03-04 15:02:01 +01:00
Amanda Graven b5804d517f Translated using Weblate (Danish)
Currently translated at 3.1% (41 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/da/
2022-03-04 09:41:27 +01:00
Amanda Graven 83ecdc0142 Added translation using Weblate (Danish) 2022-03-04 08:05:17 +01:00
Thomas Citharel 532949526f Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1181
2022-02-24 14:14:45 +00:00
Thebigal Wisi 3233a7e258 Translated using Weblate (German)
Currently translated at 100.0% (324 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/de/
2022-02-24 13:36:24 +01:00
Thebigal Wisi a32b6dd03e Translated using Weblate (German)
Currently translated at 99.6% (1304 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-02-24 13:36:24 +01:00
Thomas Citharel b81326b7fb Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1179
2022-02-18 09:03:08 +00:00
Mark 215306e08a Translated using Weblate (Dutch)
Currently translated at 74.6% (976 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-02-18 10:02:17 +01:00
Thomas Citharel a165b654f1 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1178
2022-02-17 08:10:56 +00:00
Eivind Ødegård cb06f2cd6c Translated using Weblate (Norwegian Nynorsk)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/nn/
2022-02-17 01:07:15 +01:00
Eivind Ødegård 684e77d54b Translated using Weblate (Norwegian Nynorsk)
Currently translated at 100.0% (1308 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nn/
2022-02-17 01:07:14 +01:00
Thomas Citharel 073f8dfebf Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1177
2022-02-15 14:43:03 +00:00
Thebigal Wisi 67fdefbf3c Translated using Weblate (German)
Currently translated at 100.0% (324 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/de/
2022-02-15 15:42:07 +01:00
Thomas Citharel 283282f834 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1176
2022-02-15 08:15:07 +00:00
Mark f01eba136f Translated using Weblate (Dutch)
Currently translated at 73.7% (964 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-02-15 05:13:24 +01:00
Thomas Citharel 7afa2d129b Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1175
2022-02-14 13:25:20 +00:00
Mark 7dad52f2e2 Translated using Weblate (Dutch)
Currently translated at 68.1% (892 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-02-14 14:24:47 +01:00
Thomas Citharel 4e218746a8 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1174
2022-02-11 08:00:38 +00:00
Jiri Podhorecky 4669430b05 Translated using Weblate (Czech)
Currently translated at 100.0% (324 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2022-02-11 06:38:04 +01:00
Jiri Podhorecky e09f25a304 Translated using Weblate (Czech)
Currently translated at 99.9% (1307 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2022-02-11 06:38:04 +01:00
אנטולי מהגבעות האדומות 1a5679970b Translated using Weblate (Hebrew)
Currently translated at 23.3% (306 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/he/
2022-02-10 20:20:18 +01:00
Thomas Citharel 6c17906eaf Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1173
2022-02-10 08:45:03 +00:00
אנטולי מהגבעות האדומות 79d804a331 Translated using Weblate (Hebrew)
Currently translated at 19.1% (251 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/he/
2022-02-09 19:28:12 +01:00
אנטולי מהגבעות האדומות 99abdb007c Added translation using Weblate (Hebrew) 2022-02-09 12:07:53 +01:00
Thomas Citharel a0c5ddbc2e Merge branch 'expose-needed-ap-data-for-search' into 'main'
Expose isOnline through AP

Closes #1044

See merge request framasoft/mobilizon!1172
2022-02-08 15:34:48 +00:00
Thomas Citharel 11ac2dcceb
Expose remainingAttendeeCapacity and participantCount through AP
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-02-08 15:41:42 +01:00
Thomas Citharel 87b37a4153
Expose isOnline through AP
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-02-08 15:27:17 +01:00
Thomas Citharel b012be0541 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1169
2022-02-01 08:02:54 +00:00
deadmorose 494c173001 Translated using Weblate (Russian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/ru/
2022-01-28 13:48:03 +01:00
deadmorose 95be4d0436 Translated using Weblate (Russian)
Currently translated at 100.0% (208 of 208 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/ru/
2022-01-28 13:48:03 +01:00
Jiri Podhorecky 8cca22abc4 Translated using Weblate (Czech)
Currently translated at 100.0% (208 of 208 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/cs/
2022-01-28 01:12:47 +01:00
Jiri Podhorecky 7d8060ab71 Translated using Weblate (Czech)
Currently translated at 99.6% (323 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2022-01-28 01:12:47 +01:00
Jiri Podhorecky d8c307eef4 Translated using Weblate (Czech)
Currently translated at 99.9% (1307 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2022-01-28 01:12:46 +01:00
Jiri Podhorecky 3917f616a9 Translated using Weblate (Czech)
Currently translated at 99.3% (322 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2022-01-27 23:05:49 +01:00
Jiri Podhorecky be10044186 Translated using Weblate (Czech)
Currently translated at 98.0% (1282 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2022-01-27 23:05:49 +01:00
Thomas Citharel 99b2e9b9e7 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1168
2022-01-27 21:36:03 +00:00
Mark e796e4dcb7 Translated using Weblate (Dutch)
Currently translated at 63.5% (831 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-01-27 18:34:06 +01:00
Thomas Citharel ba931ec55b Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1167
2022-01-27 11:57:06 +00:00
Mark 541e9b515f Translated using Weblate (Dutch)
Currently translated at 58.4% (765 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-01-27 12:55:55 +01:00
Thomas Citharel fddc818572 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1166
2022-01-27 07:39:55 +00:00
GunChleoc 7a83eac12a Translated using Weblate (Gaelic)
Currently translated at 99.7% (1305 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/
2022-01-26 23:51:53 +01:00
Thomas Citharel 89f22d785f Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1165
2022-01-25 15:17:50 +00:00
Mark 81fcfd68b4 Translated using Weblate (Dutch)
Currently translated at 56.4% (739 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-01-25 14:39:38 +01:00
Thomas Citharel 3df2102f78 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1164
2022-01-25 09:08:51 +00:00
Novel Martin Harianto 9888c01a9e Translated using Weblate (Indonesian)
Currently translated at 55.9% (732 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/id/
2022-01-25 00:18:56 +01:00
Al Wisi 981f94296e Translated using Weblate (German)
Currently translated at 99.6% (1304 of 1308 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-01-25 00:18:55 +01:00
Thomas Citharel 425420439b Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1163
2022-01-24 15:50:01 +00:00
Weblate 3b606cddb8 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/
2022-01-24 16:13:39 +01:00
Thomas Citharel d1fb2e2f32 Merge branch 'remove-Text-when-instance-is-closed-to-registrations' into 'main'
remove Text when instance is closed to registrations

Closes #918

See merge request framasoft/mobilizon!1161
2022-01-24 15:13:32 +00:00
setop ed2c5aaeca remove Text when instance is closed to registrations 2022-01-24 15:13:31 +00:00
Thomas Citharel 749746b8b5 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1160
2022-01-24 15:07:09 +00:00
Al Wisi b55328ec30 Translated using Weblate (German)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/de/
2022-01-24 13:23:47 +01:00
Al Wisi 4e41fc584a Translated using Weblate (German)
Currently translated at 98.5% (205 of 208 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/de/
2022-01-24 13:23:47 +01:00
Al Wisi feb5e039ae Translated using Weblate (German)
Currently translated at 99.6% (323 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/de/
2022-01-24 13:23:47 +01:00
Al Wisi da85c20112 Translated using Weblate (German)
Currently translated at 99.6% (1305 of 1309 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-01-24 13:23:47 +01:00
Jiri Podhorecky 3ee68bb2ed Translated using Weblate (Czech)
Currently translated at 96.5% (1264 of 1309 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2022-01-24 13:23:47 +01:00
Al Wisi f5fae3cf95 Translated using Weblate (German)
Currently translated at 92.1% (70 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/de/
2022-01-24 13:23:47 +01:00
Al Wisi 7a71306ebc Translated using Weblate (German)
Currently translated at 96.6% (201 of 208 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/de/
2022-01-24 13:23:47 +01:00
Al Wisi 9ed953a3ed Translated using Weblate (German)
Currently translated at 87.3% (283 of 324 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/de/
2022-01-24 13:23:47 +01:00
Al Wisi aa49b221fe Translated using Weblate (German)
Currently translated at 99.5% (1303 of 1309 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-01-24 13:23:47 +01:00
Thomas Citharel 97eb25340c Merge branch 'setop-main-patch-01351' into 'main'
add requirements for export

See merge request framasoft/mobilizon!1162
2022-01-24 12:23:37 +00:00
setop e401050ca6 add requirements for export 2022-01-24 12:01:47 +00:00
Thomas Citharel 83b07fa348 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1159
2022-01-20 12:22:08 +00:00
Berto Te 99ce4942fb Translated using Weblate (Spanish)
Currently translated at 100.0% (326 of 326 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/es/
2022-01-20 12:28:14 +01:00
Thomas Citharel 10ca260fc5 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1158
2022-01-19 08:00:18 +00:00
Berto Te ce672a4aeb Translated using Weblate (Spanish)
Currently translated at 99.0% (323 of 326 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/es/
2022-01-19 06:44:17 +01:00
Thomas Citharel 1be3ab1b55 Merge branch 'ci-show-credo-diff' into 'main'
Show credo diff in CI

See merge request framasoft/mobilizon!1157
2022-01-18 13:32:06 +00:00
Thomas Citharel b70ed5a76e
Show credo diff in CI
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-18 14:17:48 +01:00
Thomas Citharel 880c4fdf6b Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1156
2022-01-18 12:55:29 +00:00
Berto Te 1968c87a69 Translated using Weblate (Spanish)
Currently translated at 100.0% (208 of 208 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/es/
2022-01-18 13:35:21 +01:00
Berto Te 26e110fd03 Translated using Weblate (Spanish)
Currently translated at 100.0% (320 of 320 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/es/
2022-01-18 13:35:21 +01:00
Berto Te 3dcd9d1b2c Translated using Weblate (Spanish)
Currently translated at 100.0% (1309 of 1309 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/es/
2022-01-18 13:35:20 +01:00
Thomas Citharel 769d164159 Merge branch 'fix-link-to-instance-on-follow' into 'main'
Fix link on instance follow email

Closes #1008

See merge request framasoft/mobilizon!1155
2022-01-18 12:35:09 +00:00
Thomas Citharel fe05a2563d
Remove duplicate entries in sv gettext translation
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-18 12:53:01 +01:00
Thomas Citharel 2134e7b152
Improve rich media parsers
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-18 12:52:45 +01:00
Thomas Citharel a66f19cc5d
Fix fetching details from Twitter
Due to 429 error. Details: e6dc2ca5f2

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-18 12:52:01 +01:00
Thomas Citharel c57d192abe
Fix actor auto-complete
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-18 12:51:37 +01:00
Thomas Citharel fbe5a8d0c4
Detect and convert html body in the correct charset before parsing it
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-18 12:47:45 +01:00
Thomas Citharel c8735e5837
Fix parsing links with hashtag characters
Closes #1008

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-18 12:46:33 +01:00
Thomas Citharel bda18a2150
Disable follow of non-instances for now
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 17:50:00 +01:00
Thomas Citharel 2a629759fa
Fix link on instance follow email
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 17:45:12 +01:00
Thomas Citharel bba76c7ab6 Merge branch 'update-deps' into 'main'
Deps update

See merge request framasoft/mobilizon!1154
2022-01-17 16:02:41 +00:00
Thomas Citharel 5b639f10f8
Update front-end deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 17:02:01 +01:00
Thomas Citharel 24ddb6e2bf
Bump ueberauth version because of a CRSF security issue
ueberauth_discord is dropped because it's abandonned

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 16:50:58 +01:00
Thomas Citharel e8e3d9ef1c Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1153
2022-01-17 15:44:25 +00:00
Thomas Citharel b9fba5650d Translated using Weblate (Swedish)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/sv/
2022-01-17 16:44:00 +01:00
Weblate 4f6bc0cd7a Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/
2022-01-17 16:42:17 +01:00
Anonymous 175d3d49e0 Translated using Weblate (Croatian)
Currently translated at 75.2% (950 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hr/
2022-01-17 16:42:15 +01:00
Anonymous 648c4d28e4 Translated using Weblate (Welsh)
Currently translated at 16.2% (205 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cy/
2022-01-17 16:42:15 +01:00
Anonymous 9f07e48be4 Translated using Weblate (Indonesian)
Currently translated at 57.0% (720 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/id/
2022-01-17 16:42:15 +01:00
Anonymous 2d5df1d5f1 Translated using Weblate (Persian)
Currently translated at 12.8% (162 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fa/
2022-01-17 16:42:14 +01:00
Anonymous 9cc0419417 Translated using Weblate (Gaelic)
Currently translated at 99.2% (1253 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/
2022-01-17 16:42:14 +01:00
Anonymous 0adbfc60cb Translated using Weblate (Chinese (Traditional))
Currently translated at 0.8% (11 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/zh_Hant/
2022-01-17 16:42:14 +01:00
Anonymous 7d404433fc Translated using Weblate (Slovenian)
Currently translated at 77.8% (982 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/sl/
2022-01-17 16:42:14 +01:00
Anonymous b726970448 Translated using Weblate (Bengali)
Currently translated at 2.3% (30 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/bn/
2022-01-17 16:42:14 +01:00
Anonymous 91e17b37e5 Translated using Weblate (Kabyle)
Currently translated at 14.2% (180 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/kab/
2022-01-17 16:42:14 +01:00
Anonymous 82cac08642 Translated using Weblate (Basque)
Currently translated at 2.2% (29 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/eu/
2022-01-17 16:42:14 +01:00
Anonymous 1fa44dea70 Translated using Weblate (Hungarian)
Currently translated at 99.4% (1255 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hu/
2022-01-17 16:42:14 +01:00
Anonymous 3d14b72eee Translated using Weblate (Kannada)
Currently translated at 0.5% (7 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/kn/
2022-01-17 16:42:14 +01:00
Anonymous 8bfca857fc Translated using Weblate (Norwegian Nynorsk)
Currently translated at 95.1% (1201 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nn/
2022-01-17 16:42:14 +01:00
Anonymous 7f60fe2faa Translated using Weblate (Esperanto)
Currently translated at 1.8% (23 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/eo/
2022-01-17 16:42:14 +01:00
Anonymous a5b0f26f46 Translated using Weblate (Galician)
Currently translated at 83.9% (1059 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gl/
2022-01-17 16:42:14 +01:00
Anonymous 6bcccc91b9 Translated using Weblate (Portuguese (Brazil))
Currently translated at 61.8% (781 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/pt_BR/
2022-01-17 16:42:14 +01:00
Anonymous c351587783 Translated using Weblate (Belarusian)
Currently translated at 15.2% (192 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/be/
2022-01-17 16:42:14 +01:00
Anonymous 50a54e0610 Translated using Weblate (Finnish)
Currently translated at 89.3% (1128 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fi/
2022-01-17 16:42:14 +01:00
Anonymous cd08c0db4f Translated using Weblate (Catalan)
Currently translated at 82.8% (1046 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ca/
2022-01-17 16:42:14 +01:00
Anonymous e713f28fe6 Translated using Weblate (Arabic)
Currently translated at 22.8% (288 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ar/
2022-01-17 16:42:14 +01:00
Anonymous 9e928cf9c5 Translated using Weblate (Swedish)
Currently translated at 37.5% (474 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/sv/
2022-01-17 16:42:14 +01:00
Anonymous 86b488a07d Translated using Weblate (Russian)
Currently translated at 95.1% (1201 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/
2022-01-17 16:42:14 +01:00
Anonymous 93bb3b89be Translated using Weblate (Portuguese)
Currently translated at 4.9% (63 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/pt/
2022-01-17 16:42:14 +01:00
Anonymous 41e5daacdf Translated using Weblate (Polish)
Currently translated at 60.3% (762 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/pl/
2022-01-17 16:42:14 +01:00
Anonymous ecc3264ac1 Translated using Weblate (Occitan)
Currently translated at 72.2% (912 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/oc/
2022-01-17 16:42:14 +01:00
Anonymous d78fbcd670 Translated using Weblate (Dutch)
Currently translated at 56.6% (715 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-01-17 16:42:14 +01:00
Anonymous 6cf7512933 Translated using Weblate (Japanese)
Currently translated at 5.8% (74 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ja/
2022-01-17 16:42:14 +01:00
Anonymous d400347a3e Translated using Weblate (Italian)
Currently translated at 73.0% (922 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/it/
2022-01-17 16:42:14 +01:00
Anonymous a1df30f4a7 Translated using Weblate (German)
Currently translated at 94.8% (1197 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2022-01-17 16:42:14 +01:00
Thomas Citharel e6b95a43d1 Merge branch 'tailwind2' into 'main'
Various admin improvements

Closes #973

See merge request framasoft/mobilizon!1152
2022-01-17 15:42:02 +00:00
Thomas Citharel 6e5061250c
Improve admin views (2)
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 15:53:24 +01:00
Thomas Citharel ca6ef9b06b
Improve admin views
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:48 +01:00
Thomas Citharel d428d1ddf7
Add @tailwindcss/line-clamp
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:48 +01:00
Thomas Citharel 260fa83c3f
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:48 +01:00
Thomas Citharel 1daa8c5f5a
Add a breadcrumbs component
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:47 +01:00
Thomas Citharel 40758a83d5
Add .devcontainer files
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:47 +01:00
Thomas Citharel 6c8ecc6dbb
Add .tool-versions file for ASDF
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:47 +01:00
Thomas Citharel 411d7eca6c
Allow custom focus target for a11y
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:47 +01:00
Thomas Citharel 2ac3755120
Fix ical export for undefined datetimes
Closes #973

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:46 +01:00
Thomas Citharel 193fcde123
Allow to filter reports by domain
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:46 +01:00
Thomas Citharel 26b1ea401a
Fix various issues reported by Dializer
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:49:46 +01:00
Thomas Citharel 1319985047
Rename Mobilizon.Actors.is_following/2 to check_follow/2
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:41:03 +01:00
Thomas Citharel bc6cec45fa
Improve logging in module and handle more Webfinger errors
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:41:03 +01:00
Thomas Citharel e717312de7
Introduce instances admin page
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:41:03 +01:00
Thomas Citharel 65249b60f2
Add TailwindCSS
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:41:03 +01:00
Thomas Citharel 7f665daaf3
Handle actor refreshment being impossible
If we can't refresh the actor, just return the stale actor

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-01-17 14:41:03 +01:00
Thomas Citharel 722bb67fb9
Revert "Translated using Weblate (French (France) (fr_FR))"
This reverts commit 2e6d80295b.
2022-01-17 13:12:28 +01:00
Thomas Citharel 8581ecc106
Merge branch 'weblate/mobilizon-weblate-mobilizon-frontend' 2022-01-17 13:12:11 +01:00
setop 2e6d80295b Translated using Weblate (French (France) (fr_FR))
Currently translated at 100.0% (1262 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fr_FR/
2022-01-15 22:22:41 +01:00
Mark f41a27f331 Translated using Weblate (Dutch)
Currently translated at 18.9% (56 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/nl/
2022-01-15 22:22:41 +01:00
Mark d228805c6d Translated using Weblate (Dutch)
Currently translated at 56.6% (715 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-01-15 22:22:41 +01:00
Mark 397ce507d6 Translated using Weblate (Dutch)
Currently translated at 20.7% (262 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/nl/
2022-01-14 18:00:03 +01:00
Kristoffer Grundström 35e12cf056 Translated using Weblate (Swedish)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/sv/
2022-01-14 09:50:43 +01:00
Anders Trobäck 5db3123ef0 Translated using Weblate (Swedish)
Currently translated at 37.5% (474 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/sv/
2022-01-14 09:50:42 +01:00
Kristoffer Grundström ef9ebeb80c Translated using Weblate (Swedish)
Currently translated at 37.5% (474 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/sv/
2022-01-14 09:50:42 +01:00
Kristoffer Grundström 48dcbe6c3a Translated using Weblate (Swedish)
Currently translated at 47.3% (36 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/sv/
2022-01-13 10:06:26 +01:00
Kristoffer Grundström f051419c2f Translated using Weblate (Swedish)
Currently translated at 29.8% (377 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/sv/
2022-01-13 10:06:25 +01:00
Quentin PAGÈS eeb40b15b0 Translated using Weblate (Occitan)
Currently translated at 72.2% (912 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/oc/
2022-01-09 20:49:59 +01:00
Quentin PAGÈS c58b1f5219 Translated using Weblate (Occitan)
Currently translated at 72.1% (910 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/oc/
2022-01-08 23:42:12 +01:00
Quentin PAGÈS 968d2ce051 Translated using Weblate (Occitan)
Currently translated at 71.4% (902 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/oc/
2022-01-08 18:22:10 +01:00
Jiri Podhorecky b564817962 Translated using Weblate (Czech)
Currently translated at 100.0% (1262 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-30 00:58:01 +01:00
Thomas Citharel 5d75452c8e Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1150
2021-12-29 10:09:48 +00:00
Jiri Podhorecky 1e2273e4f0 Translated using Weblate (Czech)
Currently translated at 100.0% (1262 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-29 10:45:53 +01:00
Thomas Citharel e9ece4893b
Bump version to 2.0.2
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-22 14:34:41 +01:00
Thomas Citharel 4dd7f73456
Add CHANGELOG entry for 2.0.2
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-22 14:34:27 +01:00
Thomas Citharel 7d1e8cbfa2 Merge branch 'fix-instance-language' into 'main'
Update deps

Closes #976

See merge request framasoft/mobilizon!1149
2021-12-22 09:22:05 +00:00
Thomas Citharel e9601fac72
Remove gancio fixture picture as the server is down
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-22 09:51:14 +01:00
Thomas Citharel 15d186cc25
Fix admin editing instance language
Closes #976

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-21 19:47:54 +01:00
Thomas Citharel 19bf587dc9
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-21 19:47:38 +01:00
Thomas Citharel 943643c7f1
Restore langs.json
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-19 15:29:28 +01:00
Thomas Citharel e2bab6268c Translated using Weblate (French)
Currently translated at 100.0% (296 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/fr/
2021-12-17 22:15:29 +01:00
Weblate dee8c90bb3 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/
2021-12-17 10:43:37 +01:00
Thomas Citharel 9e2060c1bc Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1147
2021-12-17 09:43:25 +00:00
Weblate 23071f2cc5 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/
2021-12-17 10:08:23 +01:00
Thomas Citharel 4beab2b1fd Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1146
2021-12-17 09:08:09 +00:00
Weblate 72b4f8e869 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/
2021-12-17 09:22:11 +01:00
Thomas Citharel 2d69e85340 Merge branch 'update-upload-package-image' into 'main'
Update upload package image

See merge request framasoft/mobilizon!1145
2021-12-16 15:50:04 +00:00
Thomas Citharel 79901e85ee
Update upload package image
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-16 16:49:37 +01:00
Thomas Citharel 815eec071e Merge branch 'bugs' into 'main'
Various backend improvements

See merge request framasoft/mobilizon!1144
2021-12-15 14:26:44 +00:00
Thomas Citharel bd6f8206a7
Use Elixir 1.13 in Docker builds
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-15 14:55:47 +01:00
Thomas Citharel 79b58012cb
Refresh CI image
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-15 14:54:48 +01:00
Thomas Citharel ba097c736e
Improve handling of media file deletion
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-15 12:59:56 +01:00
Thomas Citharel c174e18b39
Improve compilation dependency in endpoint and context
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-15 12:59:56 +01:00
Thomas Citharel b484629010
Fix test to know whether we should perform unused accounts cleanup
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-15 12:59:55 +01:00
Thomas Citharel 3ad5f8977e
Simplify response for user not found
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-15 12:59:55 +01:00
Thomas Citharel dddcd4f2be Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1143
2021-12-14 13:00:26 +00:00
fr33domlover 462e76c93d Translated using Weblate (Hebrew)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/he/
2021-12-14 13:35:51 +01:00
Thomas Citharel 49b0a0778e Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1142
2021-12-14 08:37:27 +00:00
fr33domlover cd25002bdf Added translation using Weblate (Hebrew) 2021-12-14 09:13:40 +01:00
Berto Te 68bc0c44ce Translated using Weblate (Spanish)
Currently translated at 100.0% (1262 of 1262 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/es/
2021-12-14 09:05:59 +01:00
Thomas Citharel 308f3a6d60 Merge branch 'bugs' into 'main'
Various fixes

Closes #941, #969, #981, #966 et #965

See merge request framasoft/mobilizon!1141
2021-12-13 17:32:09 +00:00
Thomas Citharel 9e3b6ec419
Reduce package expiration to two days
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-13 17:59:54 +01:00
Thomas Citharel 44cd4129bb
Update translations
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-13 17:45:29 +01:00
Thomas Citharel 9e8e2a97d1
Fix group members pagination on admin group profile view
Closes #965

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-13 17:39:02 +01:00
Thomas Citharel a481413153
Handle groups/profiles/users not found in admin
Closes #966

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-13 17:33:38 +01:00
Thomas Citharel eb9b9d8f69
Fix first day of week not depending on locale
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-13 17:33:37 +01:00
Thomas Citharel 7771b27b55
Allow to filter user memberships and group memberships (contacts=) on
backend side

Closes #981 #969

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-13 17:33:36 +01:00
Thomas Citharel daca9d71e7
Upgrade deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-13 17:33:36 +01:00
Thomas Citharel 305f53cb03
Fix text overflow when a link is too long in event mobile view
Closes #941

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-12-13 10:43:32 +01:00
Thomas Citharel e624671da1 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1140
2021-12-10 12:23:54 +00:00
Jiri Podhorecky 8a36999121 Translated using Weblate (Czech)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/cs/
2021-12-10 02:26:28 +01:00
Jiri Podhorecky eb9268be49 Translated using Weblate (Czech)
Currently translated at 100.0% (204 of 204 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/cs/
2021-12-10 02:26:28 +01:00
Jiri Podhorecky 2a2124a251 Translated using Weblate (Czech)
Currently translated at 100.0% (1255 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-10 02:26:28 +01:00
Jiri Podhorecky c9f0907d59 Translated using Weblate (Czech)
Currently translated at 97.6% (1226 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-10 01:26:10 +01:00
Jiri Podhorecky 9984daee1f Translated using Weblate (Czech)
Currently translated at 95.3% (1197 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-10 00:35:51 +01:00
Jiri Podhorecky 50176ba5c3 Translated using Weblate (Czech)
Currently translated at 95.2% (1195 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-10 00:02:37 +01:00
Jiri Podhorecky f27cf520d3 Translated using Weblate (Czech)
Currently translated at 93.7% (1176 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-09 23:38:57 +01:00
Jiri Podhorecky 3a35ce8668 Translated using Weblate (Czech)
Currently translated at 90.0% (1130 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-09 22:45:00 +01:00
Thomas Frenzel bfac39f954 Translated using Weblate (German)
Currently translated at 95.3% (1197 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2021-12-09 21:27:19 +01:00
Jiri Podhorecky f7e07e366f Translated using Weblate (Czech)
Currently translated at 87.4% (1097 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-09 21:27:18 +01:00
Jiri Podhorecky c1571e11e6 Translated using Weblate (Czech)
Currently translated at 100.0% (296 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2021-12-09 20:12:09 +01:00
Thomas Frenzel 1c619a309e Translated using Weblate (German)
Currently translated at 94.9% (1191 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2021-12-09 20:12:09 +01:00
Jiri Podhorecky 626974595b Translated using Weblate (Czech)
Currently translated at 84.3% (1058 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-09 20:12:08 +01:00
Jiri Podhorecky dae0bd54a0 Translated using Weblate (Czech)
Currently translated at 90.2% (267 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2021-12-09 19:44:10 +01:00
Thomas Frenzel e27390f289 Translated using Weblate (German)
Currently translated at 94.8% (1190 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2021-12-09 19:44:10 +01:00
Jiri Podhorecky 00ed9c2f3e Translated using Weblate (Czech)
Currently translated at 85.4% (253 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2021-12-09 19:17:43 +01:00
Jiri Podhorecky de7375a970 Translated using Weblate (Czech)
Currently translated at 85.1% (252 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2021-12-09 18:58:13 +01:00
Thomas Citharel d7bad319ab Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1139
2021-12-09 16:20:29 +00:00
Jiri Podhorecky 5398d61561 Translated using Weblate (Czech)
Currently translated at 83.5% (1048 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-09 16:58:16 +01:00
Jiri Podhorecky d315c75926 Translated using Weblate (Czech)
Currently translated at 80.4% (238 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2021-12-09 02:11:32 +01:00
Jiri Podhorecky fa0885b8dd Translated using Weblate (Czech)
Currently translated at 79.1% (993 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-09 02:11:31 +01:00
Jiri Podhorecky d8fdd3aaf9 Translated using Weblate (Czech)
Currently translated at 77.2% (969 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-09 00:45:22 +01:00
Jiri Podhorecky aeecc4b140 Translated using Weblate (Czech)
Currently translated at 53.3% (669 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-08 18:40:05 +01:00
Luka Filipović eb540dfaa3 Translated using Weblate (Croatian)
Currently translated at 75.6% (950 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hr/
2021-12-08 18:10:01 +01:00
Jiri Podhorecky 4fd1ebefa6 Translated using Weblate (Czech)
Currently translated at 52.9% (665 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-08 18:09:59 +01:00
Thomas Citharel 1d912568ac Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1138
2021-12-08 12:46:20 +00:00
Jiri Podhorecky 266055ff48 Translated using Weblate (Czech)
Currently translated at 26.6% (334 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-08 12:18:56 +01:00
Thomas Citharel d32cc1e0d9 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1137
2021-12-08 07:55:52 +00:00
Luka Filipović 2067422f3c Translated using Weblate (Croatian)
Currently translated at 71.7% (900 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hr/
2021-12-08 05:59:52 +01:00
Jiri Podhorecky 2abab8d25f Translated using Weblate (Czech)
Currently translated at 97.3% (74 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/cs/
2021-12-08 05:59:47 +01:00
Jiri Podhorecky b7d4885ce6 Translated using Weblate (Czech)
Currently translated at 97.0% (198 of 204 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/cs/
2021-12-08 05:59:46 +01:00
Jiri Podhorecky e47c6da569 Translated using Weblate (Czech)
Currently translated at 66.5% (197 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2021-12-08 05:59:46 +01:00
Thomas Citharel 9c657ac571 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1136
2021-12-07 14:49:56 +00:00
Jiri Podhorecky f0fbf20f5b Translated using Weblate (Czech)
Currently translated at 19.7% (15 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/cs/
2021-12-07 15:27:11 +01:00
Marco Ciampa a41919774c Translated using Weblate (Esperanto)
Currently translated at 1.8% (23 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/eo/
2021-12-07 15:27:10 +01:00
Jiri Podhorecky 611750f44c Translated using Weblate (Czech)
Currently translated at 16.1% (33 of 204 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/cs/
2021-12-07 15:27:10 +01:00
deadmorose 8c1c79ad6c Translated using Weblate (Russian)
Currently translated at 100.0% (296 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/ru/
2021-12-07 15:27:09 +01:00
Jiri Podhorecky 27edb05d5e Translated using Weblate (Czech)
Currently translated at 25.3% (75 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2021-12-07 15:27:09 +01:00
Thomas Frenzel 25bd0a1ad5 Translated using Weblate (German)
Currently translated at 94.4% (1185 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2021-12-07 15:27:09 +01:00
Thomas Citharel cfb2226e6c Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1135
2021-12-06 08:33:28 +00:00
Luka Filipović 331269778b Translated using Weblate (Croatian)
Currently translated at 61.8% (776 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hr/
2021-12-06 03:36:51 +01:00
Jiri Podhorecky a977d7f6d6 Translated using Weblate (Czech)
Currently translated at 10.5% (8 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/cs/
2021-12-05 05:32:01 +01:00
Jiri Podhorecky af6e71d8e6 Translated using Weblate (Czech)
Currently translated at 16.8% (50 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/cs/
2021-12-05 05:32:01 +01:00
Thomas Frenzel 2b0d5d0ef5 Translated using Weblate (German)
Currently translated at 93.7% (1176 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2021-12-05 05:20:18 +01:00
Jiri Podhorecky 422d380a6d Translated using Weblate (Czech)
Currently translated at 2.6% (2 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/cs/
2021-12-04 02:43:28 +01:00
Jiri Podhorecky a4ffddd30b Translated using Weblate (Czech)
Currently translated at 7.8% (16 of 204 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/cs/
2021-12-04 02:43:28 +01:00
Jiri Podhorecky 55f6a57c81 Translated using Weblate (Czech)
Currently translated at 24.3% (306 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-12-04 02:43:27 +01:00
Thomas Citharel 935a4bb34f Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1134
2021-12-03 08:30:43 +00:00
Luka Filipović d86830bb1c Translated using Weblate (Croatian)
Currently translated at 52.5% (659 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hr/
2021-12-03 02:07:22 +01:00
Thomas Citharel 821fd3cdf0 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1133
2021-12-01 17:36:45 +00:00
Luka Filipović 80e3e354d8 Translated using Weblate (Croatian)
Currently translated at 43.9% (552 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hr/
2021-12-01 17:58:47 +01:00
Quentin PAGÈS aed259e901 Translated using Weblate (Occitan)
Currently translated at 71.1% (893 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/oc/
2021-12-01 17:58:37 +01:00
Thorsten Panknin 5e97361045 Translated using Weblate (German)
Currently translated at 92.9% (1166 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2021-12-01 17:58:37 +01:00
Thomas Citharel 41e99aa82f Merge branch 'bugs' into 'main'
Fix position of tentative tag on EventCard

See merge request framasoft/mobilizon!1132
2021-11-30 11:14:47 +00:00
Thomas Citharel 67ee95f81e
Fix position of tentative tag on EventCard
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-30 11:30:38 +01:00
Thomas Citharel 52343ea5cf Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1131
2021-11-30 07:09:33 +00:00
Luka Filipović 798ee0b6c9 Translated using Weblate (Croatian)
Currently translated at 25.9% (326 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hr/
2021-11-30 05:39:20 +01:00
Mostafa Ahangarha 24ab288e45 Translated using Weblate (Persian)
Currently translated at 12.9% (162 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fa/
2021-11-30 05:39:08 +01:00
Quentin PAGÈS 11c9831159 Translated using Weblate (Occitan)
Currently translated at 70.5% (885 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/oc/
2021-11-30 05:39:06 +01:00
Luca E e597c21aea Translated using Weblate (German)
Currently translated at 92.8% (1165 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2021-11-30 05:39:03 +01:00
Thorsten Panknin 6662ef35de Translated using Weblate (German)
Currently translated at 92.8% (1165 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/
2021-11-30 05:39:03 +01:00
Thomas Citharel 1e1a145847 Merge branch 'bugs' into 'main'
Various bugs

Closes #962, #964, #960 et #963

See merge request framasoft/mobilizon!1130
2021-11-29 10:34:46 +00:00
Thomas Citharel 4f0ba30076
Update CHANGELOG.md
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-29 11:07:44 +01:00
Thomas Citharel 822a5604e0
Fix docker build scheduled job
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-29 11:07:44 +01:00
Thomas Citharel 1bfff235f3
Don't sign fetches to instance actor when refreshing their keys
Closes #963

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-29 11:07:44 +01:00
Thomas Citharel 07d679c4ab
Fix reject of already following instances
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-29 10:39:22 +01:00
Thomas Citharel f437eb842c
Download tz_world data for Docker image directly
Closes #960

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-29 10:39:21 +01:00
Thomas Citharel 3fb0265d2d
Refresh loggeduser information before the final step of onboarding
Otherwise we endup in a loop

Closes #964

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-29 10:39:20 +01:00
Thomas Citharel 21325a014d
Handle tzinfo being absent
Closes #962

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-29 10:39:19 +01:00
Thomas Citharel 402e3d97ea Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1129
2021-11-29 08:29:34 +00:00
David Clubb 2a02ae0a03 Translated using Weblate (Welsh)
Currently translated at 16.3% (205 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cy/
2021-11-27 19:25:20 +01:00
Luka Filipović 99e4f612b2 Translated using Weblate (Croatian)
Currently translated at 2.0% (26 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hr/
2021-11-27 06:31:01 +01:00
Luka Filipović 861a7afc95 Translated using Weblate (Croatian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/hr/
2021-11-27 06:30:59 +01:00
Thomas Citharel 79252c4a5d Merge branch '2.0.1' into 'main'
2.0.1

Closes #959

See merge request framasoft/mobilizon!1128
2021-11-26 14:15:25 +00:00
Thomas Citharel e1216befa9
Bump version to 2.0.1
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 14:47:58 +01:00
Thomas Citharel 77207342a2
Update CHANGELOG.md for 2.0.1
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 14:47:58 +01:00
Thomas Citharel 3da846cdf9
Always show the cancelled status of an event
Closes #959

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 14:47:10 +01:00
Thomas Citharel 51afec1856
Fix new credo warnings
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 14:47:10 +01:00
Thomas Citharel 52e624bb88
Update deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 12:52:44 +01:00
Thomas Citharel f39d760cef
Update list of languages
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 12:43:43 +01:00
Thomas Citharel 0beea8e6c6 Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1126
2021-11-26 10:18:51 +00:00
David Clubb 1f58915eb6 Translated using Weblate (Welsh)
Currently translated at 11.1% (140 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cy/
2021-11-26 10:13:12 +01:00
Jiri Podhorecky 22724f2446 Translated using Weblate (Czech)
Currently translated at 16.3% (205 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/cs/
2021-11-26 10:13:12 +01:00
Luc Didry c9c1aa1452 Added translation using Weblate (Croatian) 2021-11-26 10:13:12 +01:00
Luc Didry a44bb963d2 Added translation using Weblate (Croatian) 2021-11-26 10:13:12 +01:00
Luc Didry dd925fd0f3 Added translation using Weblate (Croatian) 2021-11-26 10:13:12 +01:00
Luc Didry adc508e734 Added translation using Weblate (Croatian) 2021-11-26 10:13:12 +01:00
David Clubb 36ebb1b59d Added translation using Weblate (Welsh) 2021-11-26 10:13:12 +01:00
Thomas Citharel 50e9f463ed Merge branch 'bugs' into 'main'
Various bugs

Closes #956, #949, #954, #947 et #948

See merge request framasoft/mobilizon!1127
2021-11-26 09:12:57 +00:00
Thomas Citharel 566d84b957
Always focus the search field after results have been fetched
Close #948

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 09:45:55 +01:00
Thomas Citharel 22550a60e9
Put latest docker tag directly from CI
Also only do amd64 architecture for tags, not main

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 09:45:55 +01:00
Thomas Citharel 541d2f49c8
Add tzworld to the Docker image
Closes #947

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 09:45:55 +01:00
Thomas Citharel e81db2e643
Remove litepub context
Closes #954

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 09:45:54 +01:00
Thomas Citharel 3aa67dcc0b
Improve phrasing of UPGRADE.md for timezones location path
Closes #949

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 09:45:54 +01:00
Thomas Citharel 7b6ad312c0
Fix prettier config
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-26 09:45:54 +01:00
Thomas Citharel bfe833af7f
Remove cypress
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-25 16:46:21 +01:00
Thomas Citharel 477e8a5778
Upgrade deps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-25 16:45:20 +01:00
Thomas Citharel be7905cebf
Update tiptap styles
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-25 16:32:10 +01:00
Thomas Citharel df364371a1
Replace @tiptap/starter-kit with indidual extensions
So that @tiptap/extension-code-block is removed

Closes #956

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-25 16:31:09 +01:00
Thomas Citharel 31d297172c Merge branch 'weblate-mobilizon-frontend' into 'main'
Translations update from Weblate

See merge request framasoft/mobilizon!1125
2021-11-25 07:17:52 +00:00
TA f5a777004c Translated using Weblate (Indonesian)
Currently translated at 57.3% (720 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/id/
2021-11-25 02:22:19 +01:00
Balázs Úr 6316fdb4a7 Translated using Weblate (Hungarian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Mobilizon/Activity
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/hu/
2021-11-25 02:22:18 +01:00
GunChleoc 694e6dbe6b Translated using Weblate (Gaelic)
Currently translated at 99.8% (1253 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/
2021-11-25 02:22:18 +01:00
Balázs Úr 260bae4a93 Translated using Weblate (Hungarian)
Currently translated at 45.6% (135 of 296 strings)

Translation: Mobilizon/Backend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/hu/
2021-11-25 02:22:17 +01:00
Balázs Úr d748e246cd Translated using Weblate (Hungarian)
Currently translated at 100.0% (204 of 204 strings)

Translation: Mobilizon/Backend errors
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/hu/
2021-11-25 02:22:17 +01:00
Balázs Úr 4bebc8a7a2 Translated using Weblate (Hungarian)
Currently translated at 100.0% (1255 of 1255 strings)

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/hu/
2021-11-25 02:22:17 +01:00
Thomas Citharel eacdcee812 Merge branch 'activity-no-actor' into 'main'
Raise exception when object contains no actor

See merge request framasoft/mobilizon!1124
2021-11-24 17:19:45 +00:00
Thomas Citharel 4a2fe900cd
Refactor and test Mobilizon.Federation.ActivityPub.Utils.get_actor/1
Raise exception when object contains no actor. Friendica seems to send an Update activity with no actor

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-24 17:31:47 +01:00
Thomas Citharel bebc112148 Merge branch 'participant-pagination' into 'main'
Fix event participants pagination

See merge request framasoft/mobilizon!1123
2021-11-24 15:43:02 +00:00
Thomas Citharel baa8582df7
Fix event participants pagination
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-24 16:05:52 +01:00
Thomas Citharel ef954569f4 Merge branch 'order-upcoming-my-group-events' into 'main'
Order my group upcoming events by begins_on

See merge request framasoft/mobilizon!1122
2021-11-24 08:59:47 +00:00
Thomas Citharel 9aaea50f59
Order my group upcoming events by begins_on
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-11-24 09:28:59 +01:00
378 changed files with 23307 additions and 19016 deletions

View File

@ -19,7 +19,6 @@ MOBILIZON_REPLY_EMAIL=contact@mobilizon.lan
# Email settings
MOBILIZON_SMTP_SERVER=localhost
MOBILIZON_SMTP_PORT=25
MOBILIZON_SMTP_HOSTNAME=localhost
MOBILIZON_SMTP_USERNAME=noreply@mobilizon.lan
MOBILIZON_SMTP_PASSWORD=password
MOBILIZON_SMTP_SSL=false

View File

@ -1,3 +1,4 @@
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test,priv}/**/*.{ex,exs}"]
plugins: [Phoenix.LiveView.HTMLFormatter],
inputs: ["{mix,.formatter}.exs", "{config,lib,test,priv}/**/*.{ex,exs,heex}"]
]

View File

@ -110,7 +110,7 @@ deps:
exunit:
stage: test
services:
- name: postgis/postgis:13-3.1
- name: postgis/postgis:14-3.2
alias: postgres
variables:
MIX_ENV: test
@ -238,9 +238,13 @@ build-docker-tag:
# Packaging app for amd64
package-app:
image: mobilizon/buildpack:1.13.4-erlang-24.3.3-debian-buster
stage: package
variables: &release-variables
MIX_ENV: "prod"
DEBIAN_FRONTEND: noninteractive
TZ: Etc/UTC
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
script: &release-script
- mix local.hex --force
- mix local.rebar --force
@ -274,7 +278,7 @@ package-app-dev:
# Packaging app for multi-arch
multi-arch-release:
stage: package
image: docker:stable
image: docker:20.10.12
variables:
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_HOST: tcp://docker:2376
@ -282,8 +286,9 @@ multi-arch-release:
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
DOCKER_DRIVER: overlay2
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
OS: debian-buster
services:
- docker:stable-dind
- docker:20.10.12-dind
cache: {}
before_script:
# Install buildx

View File

@ -8,5 +8,5 @@
out: "",
threshold: "medium",
ignore: ["Config.HTTPS", "Config.CSP"],
ignore_files: ["config/dev.1.secret.exs", "config/dev.2.secret.exs", "config/dev.3.secret.exs", "config/dev.secret.exs", "config/e2e.secret.exs", "config/prod.secret.exs", "config/test.secret.exs", "config/runtime.1.secret.exs", "config/runtime.2.secret.exs", "config/runtime.3.secret.exs", "config/runtime.exs"]
ignore_files: ["config/runtime.exs"]
]

View File

@ -1,12 +1,16 @@
5048AE33D6269B15E21CF28C6F545AB6
752C0E897CA81ACD81F4BB215FA5F8E4
23412CF16549E4E88366DC9DECF39071
81C1F600C5809C7029EE32DE4818CD7D
02CE4963DFD1B0D6D5C567357CAFFE97
155A1FB53DE39EC8EFCFD7FB94EA823D
73B351E4CB3AF715AD450A085F5E6304
BBACD7F0BACD4A6D3010C26604671692
6D4D4A4821B93BCFAC9CDBB367B34C4B
5674F0D127852889ED0132DC2F442AAB
1600B7206E47F630D94AB54C360906F0
2262742E5C8944D5BF6698EC61F5DE50
25BEE162A99754480967216281E9EF33
2A6F71CD6F1246F0B152C2376E2E398A
30552A09D485A6AA73401C1D54F63C21
52900CE4EE3598F6F178A651FB256770
6151F44368FC19F2394274F513C29151
765526195D4C6D770EAF4DC944A8CBF4
B2FF1A12F13B873507C85091688C1D6D
B9AF8A342CD7FF39E10CC10A408C28E1
C042E87389F7BDCFF4E076E95731AE69
C42BFAEF7100F57BED75998B217C857A
D11958E86F1B6D37EF656B63405CA8A4
F16F054F2628609A726B9FF2F089D484

View File

@ -1,2 +1,2 @@
elixir 1.13.3-otp-24
erlang 24.3.2
elixir 1.13.4-otp-24
erlang 24.3.3

View File

@ -1,21 +1,55 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## 2.1.0 - 2022-03-28
## 2.1.0 - 2022-05-16
### Added
- Event category field
- Added an event category field. Administrators can extend the pre-configured list of categories through configuration.
- Added possibility for administrators to have analytics (Matomo, Plausible supported) and error handling (Sentry supported) on front-end.
- Redesigned federation admin section with dedicated instance pages
- Allow to filter moderation reports by domain
- Added a button to go to past events of a group if it has no upcoming events
- Add Überauth CAS Strategy
- Add a CLI command to delete actors
### Changed
- Changed mailer library from Bamboo to Swoosh, should fix emails being considered spam. **Some configuration changes are required, see below.**
- Expose some fields to ActivityStreams event representation: `isOnline`, `remainingAttendeeCapacity` and `participantCount`
- Expose a new field to ActivityStreams group representation: `memberCount`
- Improve group creation errors feedback
- Only display locality in event card
- Stale groups are now excluded from group search
- Event default visibility is now set according to group privacy setting
- Remove Koena Connect button
- Hide the whole metadata block if group has no description
- Increase task timeout in Refresher to 60 seconds
- Allow webfinger to be fetched over http (not https) in dev mode
- Improve reactions when approving/rejecting an instance follow
- Improve instance admin view for mobile
- Allow to reject instance following
- Allow instance to have non-standard ports
- Add pagination to the instances list
- Eventually fetch actors in mentions
- Improve IdentityPicker, JoinGroupWithAccount and ActorInline components
- Various group and posts improvements
- Update schema.graphql file
- Add "Accept-Language" header to sentry request metadata
- Hide address blocks when address has no real data
- Remove obsolete attribute type="text/css" from <style> tags
- Improve actor cards integration
- Use upstream dependencies for Ueberauth providers
- Include ongoing events in search
- Send push notification into own task
- Add appropriate timeouts for Repo.transactions
- Add a proper error message when adding an instance follow that doesn't respond
- Allow the instance to be followed from Mastodon (through relays)
- Remove unused fragment from FETCH_PERSON GraphQL query
### Fixed
@ -27,6 +61,216 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Make sure every ICS/Feed caches are emptied when modifying entities
- Fixed time issues with DST changes
- Fixed group preview card not truncating description
- Fixed redirection after login
- Fixed user admin section showing button to confirm user when the user is already confirmed
- Fixed creating event from group view not always setting the group as organizer
- Fixed invalid addresses blocking event metadata preview rendering
- Fixed group deletion with comments that caused foreign key issues
- Fixed incoming Accept activities from participations we don't already have
- Fixed resources that didn't have metadata size limits
- Properly fallback to UTC when sending notifications and the user doesn't have a timezone setting set
- Fix posts creation
- Fix rejecting instance follow
- Fix pagination of group events
- Add proper fallback for when a TZ isn't registered
- Hide side of report modal on low width screens
- Fix Telegram Logo being replaced with Mastodon logo in ShareGroupModal
- Change URL for Mastodon Share Manager
- Fix receiving Flag activities on federated events
- Fix activity notifications by preloading user.activity_settings
- Fix text overflow on group card description
- Exclude tags with more than 40 characters from being extracted
- Avoid duplicate tags with different casing
- Fix invalid HTML (<div> inside <label>)
- Fix latest group not refreshing in admin section
- Add missing "relay@" part of federated address to follow
- Fix Ueberauth use of CSRF with session
- Fix being an administrator when using 3rd-party auth provider
- Make sure activity recipient can't be nil
- Make sure users can't create profiles or groups with non-valid patterns
- Add description field to address representation
- Make sure prompt show the correct message and not just "Continue?" in mix mode
- Make sure activity notification recaps can't be sent multiple times
- Fix group notification of new event being sent multiple times
- Fix links to group page in group membership emails and participation
- Fix clicking on map crashing the app
### Translations
- Arabic
- Basque
- Belarusian
- Bengali
- Catalan
- Chinese (Traditional)
- Croatian
- Czech
- Danish
- Dutch
- Esperanto
- Finnish
- French
- Gaelic
- Galician
- German
- Hebrew
- Hungarian
- Indonesian
- Italian
- Japanese
- Kabyle
- Kannada
- Norwegian Nynorsk
- Occitan
- Persian
- Polish
- Portuguese
- Portuguese (Brazil)
- Russian
- Slovenian
- Spanish
- Swedish
- Welsh
## 2.1.0-rc.6 - 2022-05-11
Changes since rc.5:
- Allow the instance to be followed from Mastodon (through relays)
- Make sure activity recipient can't be nil
- Make sure users can't create profiles or groups with non-valid patterns
- Add description field to address representation
- Make sure prompt show the correct message and not just "Continue?" in mix mode
- Add a CLI command to delete actors
- Make sure activity notification recaps can't be sent multiple times
- Fix group notification of new event being sent multiple times
- Fix links to group page in group membership emails and participation
- Fix clicking on map crashing the app
- Remove unused fragment from FETCH_PERSON GraphQL query
## 2.1.0-rc.5 - 2022-05-06
Changes since rc.4:
- Add appropriate timeouts for Repo.transactions
- Remove OS-specific packages
- Remove refresh instance triggers
- Add a proper error message when adding an instance follow that doesn't respond
## 2.1.0-rc.4 - 2022-05-03
Changes since rc.3:
- Use upstream dependencies for Ueberauth providers
- Fix Ueberauth use of CSRF with session
- Fix being an administrator when using 3rd-party auth provider
- Include ongoing events in search
- Send push notification into own task
- Add Überauth CAS Strategy
## 2.1.0-rc.3 - 2022-04-24
Changes since rc.2:
- Fix activity notifications by preloading user.activity_settings
- Add "Accept-Language" header to sentry request metadata
- Hide address blocks when address has no real data
- Fix text overflow on group card description
- Exclude tags with more than 40 characters from being extracted
- Avoid duplicate tags with different casing
- Fix invalid HTML (<div> inside <label>)
- Remove attribute type="text/css" from <style> tags
- Improve actor cards integration
- Fix latest group not refreshing in admin section
- Add missing "relay@" part of federated address to follow
## 2.1.0-rc.2 - 2022-04-20
Changes since rc.1:
- Hide the whole metadata block if group has no description
- Increase task timeout in Refresher to 60 seconds
- Allow webfinger to be fetched over http (not https) in dev mode
- Fix rejecting instance follow
- Allow instance to have non-standard ports
- Improve reactions when approving/rejecting an instance follow
- Improve instance admin view for mobile
- Allow to reject instance following
- Fix pagination of group events
- Add pagination to the instances list
- Upgrade deps
- Eventually fetch actors in mentions
- Add proper fallback for when a TZ isn't registered
- Improve IdentityPicker
- Hide side of report modal on low width screens
- Improve JoinGroupWithAccount component
- Various group and posts improvements
- Fix Telegram Logo being replaced with Mastodon logo in ShareGroupModal
- Change URL to Mastodon Share Manager
- Improve ActorInline component
- Avoid assuming we're on Debian-based in release build
- Fix receiving Flag activities on federated events
- Update schema.graphql file
## 2.1.0-rc.1 - 2022-04-18
Changes since beta.3:
- Fix posts creation
- Fix some typespecs
- Remove Koena Connect button
- Update dependencies
## 2.1.0-beta.3 - 2022-04-09
Changes since beta.2:
- Add Fedora and Alpine builds
## 2.1.0-beta.2 - 2022-04-08
Changes since beta.1 :
- Build release packages for several distributions (Debian Bullseye, Debian Buster, Ubuntu Focal, Ubuntu Bionic) because of libc version changes
## 2.1.0-beta.1 - 2022-04-07
### Added
- Added an event category field. Administrators can extend the pre-configured list of categories through configuration.
- Added possibility for administrators to have analytics (Matomo, Plausible supported) and error handling (Sentry supported) on front-end.
- Redesigned federation admin section with dedicated instance pages
- Allow to filter moderation reports by domain
- Added a button to go to past events of a group if it has no upcoming events
### Changed
- Changed mailer library from Bamboo to Swoosh, should fix emails being considered spam. **Some configuration changes are required, see below.**
- Expose some fields to ActivityStreams event representation: `isOnline`, `remainingAttendeeCapacity` and `participantCount`
- Expose a new field to ActivityStreams group representation: `memberCount`
- Improve group creation errors feedback
- Only display locality in event card
- Stale groups are now excluded from group search
- Event default visibility is now set according to group privacy setting
### Fixed
- Fixed actor refreshment being impossible
- Fixed ical export for undefined datetimes
- Fixed parsing links with hashtag characters
- Fixed fetching link details from Twitter
- Fixed Thunderbird accessing ICS feed endpoint with special `Accept` HTTP header
- Make sure every ICS/Feed caches are emptied when modifying entities
- Fixed time issues with DST changes
- Fixed group preview card not truncating description
- Fixed redirection after login
- Fixed user admin section showing button to confirm user when the user is already confirmed
- Fixed creating event from group view not always setting the group as organizer
- Fixed invalid addresses blocking event metadata preview rendering
- Fixed group deletion with comments that caused foreign key issues
- Fixed incoming Accept activities from participations we don't already have
- Fixed resources that didn't have metadata size limits
- Properly fallback to UTC when sending notifications and the user doesn't have a timezone setting set
### Translations
@ -81,6 +325,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed the admin page when a group/profile/user was not found
- Fixed group members pagination on admin group profile view
- Fixed admin edition of the instance's language
### Translations
- Croatian
@ -253,7 +498,6 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
- Slovenian
- Spanish
## 2.0.0-rc.3 - 2021-11-22
This lists changes since 2.0.0-rc.3. Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/main/UPGRADE.md#upgrading-from-13-to-20) file as well.
@ -274,11 +518,13 @@ This lists changes since 2.0.0-rc.1. Please read the [UPGRADE.md](https://framag
- Improve MyEvents page description text
### Fixed
- Fix spacing in organizer picker
- Increase number of close events and follow group events
- Fix accessing user profile in admin section
- Set initial values for some EventMetadata elements, fixing submitting them right away with no value
- Avoid giving an error page if the apollo futureParticipations query is undefined
### Translations
- German
@ -299,6 +545,7 @@ This lists changes since 2.0.0-beta.2. Please read the [UPGRADE.md](https://fram
- Add "formerType" and "delete" attributes on Tombstones ActivityPub objects representation
### Fixed
- Fixed creating group activities when creating events with some fields
- Move release package at correct path for CI upload
- Fixed event contacts that were not exposed and fetched over federation
@ -317,6 +564,7 @@ This lists changes since 2.0.0-beta.2. Please read the [UPGRADE.md](https://fram
## 2.0.0-beta.2 - 2021-11-15
This lists changes since 2.0.0-beta.1. Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/main/UPGRADE.md#upgrading-from-13-to-20) file as well.
### Added
- Group followers and members get an notification email by default when a group publishes a new event (subject to activity notification settings)
@ -353,6 +601,7 @@ This lists changes since 2.0.0-beta.1. Please read the [UPGRADE.md](https://fram
## 2.0.0-beta.1 - 2021-11-09
Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/main/UPGRADE.md#upgrading-from-13-to-20) file as well.
### Added
- Added possibility to follow groups and be notified from new upcoming events
@ -417,6 +666,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
### Security
- Fixed private messages sent as event replies from Mastodon that were shown publically as public comments. They are now discarded.
### Translations
- Czech
@ -484,7 +734,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
### Fixed
- Fixed links contained in event & post description that didn't open in new tabs
- Add back missing RSS/ical links on public group pages
- Add back missing RSS/ical links on public group pages
- Fixed links to Framacolibri forum
- Fixed drafts and restricted visibility events & posts listed on group page
- Fixed notification page on Safari
@ -506,7 +756,6 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
- Fixed token refreshment issues
- Fixed search from 404 page
### Translations
- Catalan
@ -532,9 +781,10 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
- Fixed group discussions with deleted comments
## 1.2.2 - 2021-07-01
### Changed
- Improved UI for participations when message is too long
- Improved UI for participations when message is too long
### Fixed
@ -542,7 +792,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
- Fixed crash when trying to notify activities not from groups
- Fixed imagemagick missing from Dockerfile
- Fixed push notifications for group, members & post activities
- Fixed ellipsis in DiscussionListView
- Fixed ellipsis in DiscussionListView
- Fixed submission button for posts not visible on mobile
- Fixed remote profile suspension
@ -558,6 +808,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
- Fixed compatibility check in Notification section for service workers
## 1.2.0 - 2021-06-29
### Added
- **Notifications for various group and event activity, both by email and browser push notifications. Daily and weekly digests are also available.**
@ -572,7 +823,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
- **Various improvements to mobile views**
- Make JWT access tokens short-lived
- Disabled Cldr warning that the `Cldr.Plug.AcceptLanguage` plug didn't many any known locale
- Replaced GraphiQL web interface with graphql-playground
- Replaced GraphiQL web interface with graphql-playground
### Removed
@ -732,7 +983,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
### Changed
- Added an unique index on the addresses url
- Added org.opencontainers.image.source annotation to the Docker image
- Added org.opencontainers.image.source annotation to the Docker image
- Improved the moderation action logs interface
### Fixes
@ -853,7 +1104,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
- Fixed getting metadata from tweets when creating a resource
- Fixed bad handling of duplicate usernames
- Fixed handling of bad URIs to proxify
- Fixed creating discussion with title containing only spaces
- Fixed creating discussion with title containing only spaces
- Fixed registering new user account with same email as unconfirmed
- Fixed handling changing default actor unlogged
- Fixed handling getting organized events from an actor when not authorized
@ -925,6 +1176,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
- Hungarian
- Russian
- Spanish
## 1.1.0-rc.1 - 2021-03-29
### Added
@ -950,7 +1202,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
- Fixed getting metadata from tweets when creating a resource
- Fixed bad handling of duplicate usernames
- Fixed handling of bad URIs to proxify
- Fixed creating discussion with title containing only spaces
- Fixed creating discussion with title containing only spaces
- Fixed registering new user account with same email as unconfirmed
- Fixed handling changing default actor unlogged
- Fixed handling getting organized events from an actor when not authorized
@ -972,11 +1224,13 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
## 1.1.0-beta.6 - 2021-03-17
### Fixed
- Fixed a typo in range/radius showing the wrong radius for close events on homepage
## 1.1.0-beta.5 - 2021-03-17
### Fixed
- Fixed a typo in range/radius preventing close events from showing up
## 1.1.0-beta.4 - 2021-03-17
@ -990,15 +1244,18 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
## 1.1.0-beta.3 - 2021-03-16
### Fixed
- Handle ActivityPub Fetcher returning text that's not JSON
- Fix accessing a group profile when not a member
## 1.1.0-beta.2 - 2021-03-16
### Fixed
- Fixed geospatial configuration only being evaluated at compile-time, not at runtime
### Translations
- Slovenian
## 1.1.0-beta.1 - 2021-03-10
@ -1140,23 +1397,23 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
### Special operations
* **Reattach media files to their entity.**
- **Reattach media files to their entity.**
When media files were uploaded and added in events and posts bodies, they were only attached to the profile that uploaded them, not to the event or post. This task attaches them back to their entity so that the command to clean orphan media files doesn't remove them.
* Source install
- Source install
`MIX_ENV=prod mix mobilizon.maintenance.fix_unattached_media_in_body`
* Docker
- Docker
`docker-compose exec mobilizon mobilizon_ctl maintenance.fix_unattached_media_in_body`
* **Refresh remote profiles to save avatars locally**
- **Refresh remote profiles to save avatars locally**
Profile avatars and banners were previously only proxified and cached. Now we save them locally. Refreshing all remote actors will save profile media locally instead.
* Source install
- Source install
`MIX_ENV=prod mix mobilizon.actors.refresh --all`
* Docker
- Docker
`docker-compose exec mobilizon mobilizon_ctl actors.refresh --all`
* **imagemagick and webp are now a required dependency** to build Mobilizon.
- **imagemagick and webp are now a required dependency** to build Mobilizon.
Optimized versions of Mobilizon's pictures are now produced during front-end build.
See [the documentation](https://docs.joinmobilizon.org/administration/dependencies/#misc) to make sure these dependencies are installed.
@ -1199,7 +1456,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
- Fixed error message not showing up when you are already an anonymous participant for an event
- Fixed error message not showing up when you pick an username already in user for a new profile or a group
- Fixed translations not fallbacking properly to english when not found
-
-
### Security
@ -1208,6 +1465,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
### Translations
Updated translations:
- Catalan
- Dutch
- English
@ -1380,20 +1638,21 @@ Updated translations:
### Special operations
* We added `application/ld+json` as acceptable MIME type for ActivityPub requests, so you'll need to recompile the `mime` library we use before recompiling Mobilizon:
```
MIX_ENV=prod mix deps.clean mime --build
```
- We added `application/ld+json` as acceptable MIME type for ActivityPub requests, so you'll need to recompile the `mime` library we use before recompiling Mobilizon:
* The [nginx configuration](https://framagit.org/framasoft/mobilizon/-/blob/main/support/nginx/mobilizon.conf) has been changed with improvements and support for custom error pages.
```
MIX_ENV=prod mix deps.clean mime --build
```
* The cmake dependency has been added (see [our documentation](https://docs.joinmobilizon.org/administration/dependencies/#basic-tools))
- The [nginx configuration](https://framagit.org/framasoft/mobilizon/-/blob/main/support/nginx/mobilizon.conf) has been changed with improvements and support for custom error pages.
- The cmake dependency has been added (see [our documentation](https://docs.joinmobilizon.org/administration/dependencies/#basic-tools))
### Added
- Possibility to login using LDAP
- Possibility to login using OAuth providers
- Enabled group features in production mode
- Enabled group features in production mode
- including posts (that can be public, unlisted, or restricted to your group members)
- resources (collections of links, with folders, accessible to your group members)
- discussions (group private and organized chats)
@ -1417,11 +1676,12 @@ Updated translations:
### Security
- Fix group settings being accessible and editable by non-group-admins (thx @pigpig for reporting this responsibly)
- Fix events being editable by profiles without permissions (thx @pigpig for reporting this responsibly)
- Fix events being editable by profiles without permissions (thx @pigpig for reporting this responsibly)
## [1.0.0-beta.3] - 2020-06-24
### Special operations
Config has moved from `.env` files to a more traditional way to handle things in the Elixir world, with `.exs` files.
To migrate existing configuration, you can simply run `mix mobilizon.instance gen` and fill in the adequate values previously in `.env` files (you don't need to perform the operations to create the database).
@ -1431,6 +1691,7 @@ A minimal file template [is available](https://framagit.org/framasoft/mobilizon/
Also make sure to remove the `EnvironmentFile=` line from the systemd service and set `Environment=MIX_ENV=prod` instead. See [the updated file](https://framagit.org/framasoft/mobilizon/blob/main/support/systemd/mobilizon.service).
### Added
- Possibility to participate to an event without an account (confirmation through email required)
- Possibility to participate to a remote event (being redirected by providing federated identity)
- Possibility to add a note as a participant when event participation is manually validated (required when participating without an account)
@ -1447,6 +1708,7 @@ Also make sure to remove the `EnvironmentFile=` line from the systemd service an
- Allow user to change language
### Changed
- Configuration handling (see above)
- Improved a bit color theme
- Signature validation also now checks if `Date` header has acceptable values
@ -1457,6 +1719,7 @@ Also make sure to remove the `EnvironmentFile=` line from the systemd service an
- Improved public event page
### Fixed
- Fixed URL search
- Fixed content accessed through URL search being public
- Fix event links in some emails
@ -1464,17 +1727,21 @@ Also make sure to remove the `EnvironmentFile=` line from the systemd service an
## [1.0.0-beta.2] - 2019-12-18
### Special operations
These two operations couldn't be handled during migrations.
They are optional, but you won't be able to search or get participant stats on existing events if they are not executed.
These commands will be removed in Mobilizon 1.0.0-beta.3.
In order to populate search index for existing events, you need to run the following command (with prod environment):
* `mix mobilizon.setup_search`
- `mix mobilizon.setup_search`
In order to move participant stats to the event table for existing events, you need to run the following command (with prod environment):
* `mix mobilizon.move_participant_stats`
- `mix mobilizon.move_participant_stats`
### Added
- Federation is active
- Added an interface for admins to view and manage instance followers and followings
- Ability to comment below events
@ -1499,6 +1766,7 @@ In order to move participant stats to the event table for existing events, you n
- Upgraded frontend and backend dependencies
### Changed
- Move participant stats to event table **(read special instructions above)**
- Limit length (20 characters) and number (10) of tags allowed
- Added some backend changes and validation for field length
@ -1512,6 +1780,7 @@ In order to move participant stats to the event table for existing events, you n
- Also consider the PeerTube `CommentsEnabled` property to know if you can reply to an event
### Fixed
- Fix event URL validation and check if hostname is correct before showing it
- Fix participations stats on the MyEvents page
- Fix event description lists margin
@ -1541,8 +1810,11 @@ In order to move participant stats to the event table for existing events, you n
- Fixed event HTML representation when `GET` request has no `Accept` header
### Security
- Sanitize event title to avoid XSS
## [1.0.0-beta.1] - 2019-10-15
### Added
- Initial release

View File

@ -1,7 +1,49 @@
# Upgrading from 2.0 to 2.1
## Mailer library change
### Docker
The change is already applied. You may remove the `MOBILIZON_SMTP_HOSTNAME` environment key which is not used anymore.
### Release and source mode
In your configuration file under `config :mobilizon, Mobilizon.Web.Email.Mailer`,
- Change `Bamboo.SMTPAdapter` to `Swoosh.Adapters.SMTP`,
- rename the `server` key to `relay`
- remove the `hostname` key,
- the default value of the username and password fields is an empty string and no longer `nil`.
```diff
config :mobilizon, Mobilizon.Web.Email.Mailer,
- adapter: Bamboo.SMTPAdapter,
+ adapter: Swoosh.Adapters.SMTP,
- server: "localhost",
+ relay: "localhost",
- hostname: "localhost",
# usually 25, 465 or 587
port: 25,
- username: nil,
+ username: "",
- password: nil,
+ password: "",
# can be `:always` or `:never`
tls: :if_available,
allowed_tls_versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"],
retries: 1,
# can be `true`
no_mx_lookups: false,
# can be `:always`. If your smtp relay requires authentication set it to `:always`.
auth: :if_available
```
# Upgrading from 1.3 to 2.0
Requirements dependencies depend on the way Mobilizon is installed.
## New Elixir version requirement
### Docker and Release install
You are already using latest Elixir version in the release tarball and Docker images.
@ -17,17 +59,19 @@ Mobilizon 2.0 uses data based on [timezone-boundary-builder](https://github.com/
### Docker install
The geographic timezone data is already bundled into the image, you have nothing to do.
### Release install
In order to keep the release tarballs light, the geographic timezone data is not bundled directly. You need to download the data :
* either raw from Github, but **requires an extra ~1Gio of memory** to process the data
- either raw from Github, but **requires an extra ~1Gio of memory** to process the data
```sh
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
sudo -u mobilizon ./bin/mobilizon_ctl tz_world.update
```
* either already processed from our own distribution server
- either already processed from our own distribution server
```sh
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
@ -35,6 +79,7 @@ In order to keep the release tarballs light, the geographic timezone data is not
```
In both cases, ~700Mio of disk will be used. You may use the following configuration to specify where the data is expected if you decide to change it from the default location (`/var/lib/mobilizon/timezones`) :
```elixir
config :tz_world, data_dir: "/some/place"
```
@ -42,14 +87,15 @@ config :tz_world, data_dir: "/some/place"
### Source install
You need to download the data :
* either raw from Github, but **requires an extra ~1Gio of memory** to process the data
- either raw from Github, but **requires an extra ~1Gio of memory** to process the data
```sh
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
sudo -u mobilizon mix mobilizon.tz_world.update
```
* either already processed from our own distribution server
- either already processed from our own distribution server
```sh
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
@ -57,6 +103,7 @@ You need to download the data :
```
In both cases, ~700Mio of disk will be used. You may use the following configuration to specify where the data is expected:
```elixir
config :tz_world, data_dir: "/some/place"
```
@ -75,14 +122,18 @@ Files in this folder are temporary and are cleaned once an hour.
## New optional dependencies
These are optional, installing them will allow Mobilizon to export to PDF and ODS as well. Mobilizon 2.0 allows to export the participant list, but more is planned.
### Docker
Everything is included in our Docker image.
### Release and source install
New optional Python dependencies:
* `Python` >= 3.6
* `weasyprint` for PDF export (with [a few extra dependencies](https://doc.courtbouillon.org/weasyprint/stable/first_steps.html))
* `pyexcel-ods3` for ODS export (no extra dependencies)
- `Python` >= 3.6
- `weasyprint` for PDF export (with [a few extra dependencies](https://doc.courtbouillon.org/weasyprint/stable/first_steps.html))
- `pyexcel-ods3` for ODS export (no extra dependencies)
Both can be installed through pip. You need to enable and configure exports for PDF and ODS in the configuration afterwards. Read [the dedicated docs page about this](https://docs.joinmobilizon.org/administration/configure/exports/).
@ -91,35 +142,41 @@ Both can be installed through pip. You need to enable and configure exports for
The 1.1 version of Mobilizon brings Elixir releases support. An Elixir release is a self-contained directory that contains all of Mobilizon's code (front-end and backend), it's dependencies, as well as the Erlang Virtual Machine and runtime (only the parts you need). As long as the release has been assembled on the same OS and architecture, it can be deploy and run straight away. [Read more about releases](https://elixir-lang.org/getting-started/mix-otp/config-and-releases.html#releases).
## Comparison
Migrating to releases means:
* You only get a precompiled binary, so you avoid compilation times when updating
* No need to have Elixir/NodeJS installed on the system
* Code/data/config location is more common (/opt, /var/lib, /etc)
* More efficient, as only what you need from the Elixir/Erlang standard libraries is included and all of the code is directly preloaded
* You can't hardcode modifications in Mobilizon's code
- You only get a precompiled binary, so you avoid compilation times when updating
- No need to have Elixir/NodeJS installed on the system
- Code/data/config location is more common (/opt, /var/lib, /etc)
- More efficient, as only what you need from the Elixir/Erlang standard libraries is included and all of the code is directly preloaded
- You can't hardcode modifications in Mobilizon's code
Staying on source releases means:
* You need to recompile everything with each update
* Compiling frontend and backend has higher system requirements than just running Mobilizon
* You can change things in Mobilizon's code and recompile right away to test changes
- You need to recompile everything with each update
- Compiling frontend and backend has higher system requirements than just running Mobilizon
- You can change things in Mobilizon's code and recompile right away to test changes
## Releases
If you want to migrate to releases, [we provide a full guide](https://docs.joinmobilizon.org/administration/upgrading/source_to_release/). You may do this at any time.
## Source install
To stay on a source release, you just need to check the following things:
* Rename your configuration file `config/prod.secret.exs` to `config/runtime.exs`.
* If your config file includes `server: true` under `Mobilizon.Web.Endpoint`, remove it.
```diff
config :mobilizon, Mobilizon.Web.Endpoint,
- server: true,
```
* The uploads default directory is now `/var/lib/mobilizon/uploads`. To keep it in the previous `uploads/` directory, just add the following line to `config/runtime.exs`:
- Rename your configuration file `config/prod.secret.exs` to `config/runtime.exs`.
- If your config file includes `server: true` under `Mobilizon.Web.Endpoint`, remove it.
```diff
config :mobilizon, Mobilizon.Web.Endpoint,
- server: true,
```
- The uploads default directory is now `/var/lib/mobilizon/uploads`. To keep it in the previous `uploads/` directory, just add the following line to `config/runtime.exs`:
```elixir
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads"
```
Or you may use any other directory where the `mobilizon` user has write permissions.
* The GeoIP database default directory is now `/var/lib/mobilizon/geo/GeoLite2-City.mmdb`. To keep it in the previous `priv/data/GeoLite2-City.mmdb` directory, just add the following line to `config/runtime.exs`:
- The GeoIP database default directory is now `/var/lib/mobilizon/geo/GeoLite2-City.mmdb`. To keep it in the previous `priv/data/GeoLite2-City.mmdb` directory, just add the following line to `config/runtime.exs`:
```elixir
config :geolix, databases: [
%{
@ -129,4 +186,4 @@ To stay on a source release, you just need to check the following things:
}
]
```
Or you may use any other directory where the `mobilizon` user has read permissions.
Or you may use any other directory where the `mobilizon` user has read permissions.

View File

@ -106,13 +106,16 @@ config :mobilizon, :media_proxy,
]
config :mobilizon, Mobilizon.Web.Email.Mailer,
adapter: Bamboo.SMTPAdapter,
server: "localhost",
hostname: "localhost",
adapter: Swoosh.Adapters.SMTP,
relay: "localhost",
# usually 25, 465 or 587
port: 25,
username: nil,
password: nil,
username: "",
password: "",
# can be `:always` or `:never`
auth: :if_available,
# can be `true`
ssl: false,
# can be `:always` or `:never`
tls: :if_available,
allowed_tls_versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"],
@ -212,7 +215,8 @@ config :mobilizon, :activitypub,
# One day
actor_stale_period: 3_600 * 48,
actor_key_rotation_delay: 3_600 * 48,
sign_object_fetches: true
sign_object_fetches: true,
stale_actor_search_exclusion_after: 3_600 * 24 * 7
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Nominatim
@ -343,6 +347,8 @@ config :mobilizon, :exports,
Mobilizon.Service.Export.Participants.ODS
]
config :mobilizon, :analytics, providers: []
# Import environment specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above.
import_config "#{config_env()}.exs"

View File

@ -67,7 +67,7 @@ config :phoenix, :stacktrace_depth, 20
# Initialize plugs at runtime for faster development compilation
config :phoenix, :plug_init_mode, :runtime
config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Bamboo.LocalAdapter
config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Swoosh.Adapters.Local
# Configure your database
config :mobilizon, Mobilizon.Storage.Repo,

View File

@ -43,9 +43,8 @@ config :mobilizon, Mobilizon.Storage.Repo,
pool_size: 10
config :mobilizon, Mobilizon.Web.Email.Mailer,
adapter: Bamboo.SMTPAdapter,
server: System.get_env("MOBILIZON_SMTP_SERVER", "localhost"),
hostname: System.get_env("MOBILIZON_SMTP_HOSTNAME", "localhost"),
adapter: Swoosh.Adapters.SMTP,
relay: System.get_env("MOBILIZON_SMTP_SERVER", "localhost"),
port: System.get_env("MOBILIZON_SMTP_PORT", "25"),
username: System.get_env("MOBILIZON_SMTP_USERNAME", nil),
password: System.get_env("MOBILIZON_SMTP_PASSWORD", nil),

View File

@ -54,7 +54,7 @@ config :mobilizon, :ldap,
bind_uid: System.get_env("LDAP_BIND_UID"),
bind_password: System.get_env("LDAP_BIND_PASSWORD")
config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Bamboo.TestAdapter
config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Swoosh.Adapters.Test
config :mobilizon, Mobilizon.Web.Upload, filters: [], link_name: false

View File

@ -49,7 +49,7 @@ LABEL org.opencontainers.image.title="mobilizon" \
org.opencontainers.image.revision=$VCS_REF \
org.opencontainers.image.created=$BUILD_DATE
RUN apk add --no-cache curl openssl ca-certificates ncurses-libs file postgresql-client libgcc libstdc++ imagemagick python3 py3-pip py3-pillow py3-cffi py3-brotli gcc musl-dev python3-dev pango libxslt-dev ttf-cantarell
RUN apk add --no-cache curl openssl ca-certificates ncurses-libs file postgresql-client libgcc libstdc++ imagemagick python3 py3-pip py3-pillow py3-cffi py3-brotli gcc g++ musl-dev python3-dev pango libxslt-dev ttf-cantarell
RUN pip install weasyprint pyexcel-ods3
RUN mkdir -p /var/lib/mobilizon/uploads && chown nobody:nobody /var/lib/mobilizon/uploads

View File

@ -1,15 +1,11 @@
FROM elixir:latest
LABEL maintainer="Thomas Citharel <tcit@tcit.fr>"
ENV REFRESHED_AT=2021-12-15
ENV REFRESHED_AT=2022-04-06
RUN apt-get update -yq && apt-get install -yq build-essential inotify-tools postgresql-client git curl gnupg xvfb libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 cmake exiftool python3-pip python3-setuptools
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash && apt-get install nodejs -yq
RUN npm install -g yarn wait-on
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN mix local.hex --force && mix local.rebar --force
# Weasyprint 53 requires pango >= 1.44.0, which is not available in Stretch.
# TODO: Remove the version requirement when elixir:latest is based on Bullseye
# https://github.com/erlang/docker-erlang-otp/issues/362
# https://github.com/Kozea/WeasyPrint/issues/1384
RUN pip3 install -Iv weasyprint==52 pyexcel_ods3
RUN pip3 install -Iv weasyprint pyexcel_ods3
RUN curl https://dbip.mirror.framasoft.org/files/dbip-city-lite-latest.mmdb --output GeoLite2-City.mmdb -s && mkdir -p /usr/share/GeoIP && mv GeoLite2-City.mmdb /usr/share/GeoIP/

View File

@ -1,6 +1,6 @@
{
"name": "mobilizon",
"version": "2.0.2",
"version": "2.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
@ -8,7 +8,7 @@
"test:unit": "LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 TZ=UTC vue-cli-service test:unit",
"test:e2e": "vue-cli-service test:e2e",
"lint": "vue-cli-service lint",
"build:assets": "vue-cli-service build",
"build:assets": "vue-cli-service build --report",
"build:pictures": "bash ./scripts/build/pictures.sh"
},
"dependencies": {
@ -16,7 +16,9 @@
"@absinthe/socket-apollo-link": "^0.2.1",
"@apollo/client": "^3.3.16",
"@mdi/font": "^6.1.95",
"@tailwindcss/line-clamp": "^0.3.0",
"@sentry/tracing": "^6.16.1",
"@sentry/vue": "^6.16.1",
"@tailwindcss/line-clamp": "^0.4.0",
"@tiptap/core": "^2.0.0-beta.41",
"@tiptap/extension-blockquote": "^2.0.0-beta.25",
"@tiptap/extension-bold": "^2.0.0-beta.24",
@ -69,7 +71,9 @@
"vue": "^2.6.11",
"vue-class-component": "^7.2.3",
"vue-i18n": "^8.14.0",
"vue-matomo": "^4.1.0",
"vue-meta": "^2.3.1",
"vue-plausible": "^1.3.1",
"vue-property-decorator": "^9.0.0",
"vue-router": "^3.1.6",
"vue-scrollto": "^2.17.1",
@ -112,7 +116,7 @@
"jest-junit": "^13.0.0",
"mock-apollo-client": "^1.1.0",
"prettier": "^2.2.1",
"prettier-eslint": "^13.0.0",
"prettier-eslint": "^14.0.0",
"sass": "^1.34.1",
"sass-loader": "^12.0.0",
"ts-jest": "27",

View File

@ -203,6 +203,16 @@ export default class App extends Vue {
this.interval = undefined;
}
@Watch("config")
async initializeStatistics(config: IConfig) {
if (config) {
const { statistics } = (await import("./services/statistics")) as {
statistics: (config: IConfig, environment: Record<string, any>) => void;
};
statistics(config, { router: this.$router, version: config.version });
}
}
@Watch("$route", { immediate: true })
updateAnnouncement(route: Route): void {
const pageTitle = this.extractPageTitleFromRoute(route);
@ -221,7 +231,7 @@ export default class App extends Vue {
? this.routerView?.$refs?.componentFocusTarget
: this.routerView?.$el
) as HTMLElement;
if (focusTarget) {
if (focusTarget && focusTarget instanceof Element) {
// Make focustarget programmatically focussable
focusTarget.setAttribute("tabindex", "-1");

View File

@ -7,61 +7,18 @@
@import "styles/vue-announcer.scss";
@import "styles/vue-skip-to.scss";
// a {
// color: $violet-2;
// }
a.out,
.content a,
.ProseMirror a {
text-decoration: underline;
text-decoration-color: $secondary;
text-decoration-color: #ed8d07;
text-decoration-thickness: 2px;
}
.step-content {
height: auto;
}
main {
> section > .columns {
min-height: 50vh;
}
> section {
&.container {
min-height: 80vh;
}
}
> .container {
background: $whitest;
min-height: 70vh;
}
> #homepage {
background: $whitest;
#featured_events {
background: $whitest;
}
#picture {
.container,
.section {
background: $whitest;
}
}
> .container {
min-height: 25vh;
}
}
}
.section {
padding: 1rem 1% 4rem;
}
figure img.is-rounded {
border: 1px solid $chapril_blue;
}
$color-black: #000;
.mention {
@ -104,16 +61,11 @@ body {
overflow-x: hidden;
}
#mobilizon {
> main {
background: $body-background-color;
}
> .container > .message {
margin: 1rem auto auto;
.message-header {
button.delete {
background: $chapril_grey;
}
#mobilizon > .container > .message {
margin: 1rem auto auto;
.message-header {
button.delete {
background: #4a4a4a;
}
}
}
@ -130,7 +82,7 @@ $list-radius: $radius !default;
$list-item-border: 1px solid $border !default;
$list-item-color: $text !default;
$list-item-active-background-color: $purple-1 !default;
$list-item-active-background-color: $link !default;
$list-item-active-color: $link-invert !default;
$list-item-hover-background-color: $background !default;
@ -165,74 +117,16 @@ a.list-item {
.setting-title {
margin-top: 2rem;
margin-bottom: 1rem;
h1,
h2,
h3,
h4,
h5,
h6 {
background: $secondary;
color: $white;
span {
background: $secondary !important;
color: $white !important;
}
}
h2 {
display: inline;
background: $secondary;
padding: 2px 7.5px;
text-transform: uppercase;
font-size: 1.25rem;
}
}
.hero-body {
background-color: $chapril_blue_light;
}
.columns {
background: $whitest;
}
.setting-menu-item {
background-color: $yellow-4;
.router-link-active,
.router-link-active {
background-color: $info;
color: $white;
a {
color: $white;
font-weight: 600 !important;
text-decoration: none;
}
}
}
.date-component-container {
.datetime-container {
margin-right: 1em;
}
}
.time.datetime-container {
color: $white;
background: $chapril_blue_light;
span.month {
color: $whitest;
}
}
/**
footer
*/
footer.footer[data-v-40ab164b] span.select select {
background: $chapril_blue_light;
color: $footer-text-color;
}
@mixin focus() {
&:focus {
border: 2px solid black;

View File

@ -1,7 +1,7 @@
<template>
<div
class="w-80 bg-white rounded-lg shadow-md flex space-x-4 items-center"
:class="{ 'flex-col p-4 sm:p-8 pb-10': !inline }"
class="bg-white rounded-lg flex space-x-4 items-center"
:class="{ 'flex-col p-4 shadow-md sm:p-8 pb-10 w-80': !inline }"
>
<div>
<figure class="w-12 h-12" v-if="actor.avatar">
@ -20,8 +20,10 @@
class="ltr:-mr-0.5 rtl:-ml-0.5"
/>
</div>
<div :class="{ 'text-center': !inline }">
<h5 class="text-xl font-medium violet-title tracking-tight text-gray-900">
<div :class="{ 'text-center': !inline }" class="overflow-hidden w-full">
<h5
class="text-xl font-medium violet-title tracking-tight text-gray-900 whitespace-pre-line line-clamp-2"
>
{{ displayName(actor) }}
</h5>
<p class="text-gray-500 truncate" v-if="actor.name">
@ -29,7 +31,11 @@
</p>
<div
v-if="full"
:class="{ 'line-clamp-3': limit }"
class="only-first-child"
:class="{
'line-clamp-3': limit,
'line-clamp-10': !limit,
}"
v-html="actor.summary"
/>
</div>
@ -93,3 +99,8 @@ export default class ActorCard extends Vue {
displayName = displayName;
}
</script>
<style scoped>
.only-first-child ::v-deep :not(:first-child) {
display: none;
}
</style>

View File

@ -1,16 +1,19 @@
<template>
<div class="actor-inline">
<div class="actor-avatar">
<figure class="image is-24x24" v-if="actor.avatar">
<div class="inline-flex items-start">
<div class="flex-none mr-2">
<figure class="image is-48x48" v-if="actor.avatar">
<img class="is-rounded" :src="actor.avatar.url" alt="" />
</figure>
<b-icon v-else size="is-medium" icon="account-circle" />
<b-icon v-else size="is-large" icon="account-circle" />
</div>
<div class="actor-name">
<p>
<div class="flex-auto">
<p class="text-base line-clamp-3 md:line-clamp-2 max-w-xl">
{{ displayName(actor) }}
</p>
<p class="text-sm text-gray-500 truncate">
@{{ usernameWithDomain(actor) }}
</p>
</div>
</div>
</template>

View File

@ -1,6 +1,6 @@
<template>
<div
class="ellipsis"
class="truncate"
:title="
isDescriptionDifferentFromLocality
? `${physicalAddress.description}, ${physicalAddress.locality}`
@ -8,8 +8,7 @@
"
>
<b-icon icon="map-marker" />
<span v-if="isDescriptionDifferentFromLocality">
{{ physicalAddress.description }},
<span v-if="physicalAddress.locality">
{{ physicalAddress.locality }}
</span>
<span v-else>
@ -35,11 +34,3 @@ export default class InlineAddress extends Vue {
}
}
</script>
<style lang="scss" scoped>
.ellipsis {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>

View File

@ -48,13 +48,75 @@
$t("Mobilizon")
}}</a>
</i18n>
{{
$t(
"We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):"
)
}}
<span v-if="sentryEnabled && sentryReady">
{{
$t(
"We collect your feedback and the error information in order to improve this service."
)
}}</span
>
<span v-else>
{{
$t(
"We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):"
)
}}
</span>
</p>
<div class="content">
<form
v-if="sentryEnabled && sentryReady && !submittedFeedback"
@submit.prevent="sendErrorToSentry"
>
<b-field :label="$t('What happened?')" label-for="what-happened">
<b-input
v-model="feedback"
type="textarea"
id="what-happened"
:placeholder="$t(`I've clicked on X, then on Y`)"
/>
</b-field>
<b-button icon-left="send" native-type="submit" type="is-primary">{{
$t("Send feedback")
}}</b-button>
<p class="content">
{{
$t(
"Please add as many details as possible to help identify the problem."
)
}}
</p>
</form>
<b-message type="is-danger" v-else-if="feedbackError">
<p>
{{
$t(
"Sorry, we wen't able to save your feedback. Don't worry, we'll try to fix this issue anyway."
)
}}
</p>
<i18n path="You may now close this page or {return_to_the_homepage}.">
<template #return_to_the_homepage>
<router-link :to="{ name: RouteName.HOME }">{{
$t("return to the homepage")
}}</router-link>
</template>
</i18n>
</b-message>
<b-message type="is-success" v-else-if="submittedFeedback">
<p>{{ $t("Thanks a lot, your feedback was submitted!") }}</p>
<i18n path="You may now close this page or {return_to_the_homepage}.">
<template #return_to_the_homepage>
<router-link :to="{ name: RouteName.HOME }">{{
$t("return to the homepage")
}}</router-link>
</template>
</i18n>
</b-message>
<div
class="content"
v-if="!(sentryEnabled && sentryReady) || submittedFeedback"
>
<p v-if="submittedFeedback">{{ $t("You may also:") }}</p>
<ul>
<li>
<a
@ -65,7 +127,7 @@
</li>
<li>
<a
href="https://framagit.org/framasoft/mobilizon/-/issues/new?issuable_template=Bug"
href="https://framagit.org/framasoft/mobilizon/-/issues/"
target="_blank"
>{{
$t("Open an issue on our bug tracker (advanced users)")
@ -74,7 +136,7 @@
</li>
</ul>
</div>
<p class="content">
<p class="content" v-if="!sentryEnabled">
{{
$t(
"Please add as many details as possible to help identify the problem."
@ -89,14 +151,14 @@
<p>{{ $t("Error stacktrace") }}</p>
<pre>{{ error.stack }}</pre>
</details>
<p>
<p v-if="!sentryEnabled">
{{
$t(
"The technical details of the error can help developers solve the problem more easily. Please add them to your feedback."
)
}}
</p>
<div class="buttons">
<div class="buttons" v-if="!sentryEnabled">
<b-tooltip
:label="tooltipConfig.label"
:type="tooltipConfig.type"
@ -115,14 +177,20 @@
</div>
</template>
<script lang="ts">
import { CONTACT } from "@/graphql/config";
import { CONFIG } from "@/graphql/config";
import { checkProviderConfig, convertConfig } from "@/services/statistics";
import { IAnalyticsConfig, IConfig } from "@/types/config.model";
import { Component, Prop, Vue } from "vue-property-decorator";
import { LOGGED_USER } from "@/graphql/user";
import { IUser } from "@/types/current-user.model";
import { ISentryConfiguration } from "@/types/analytics/sentry.model";
import { submitFeedback } from "@/services/statistics/sentry";
import RouteName from "@/router/name";
@Component({
apollo: {
config: {
query: CONTACT,
},
config: CONFIG,
loggedUser: LOGGED_USER,
},
metaInfo() {
return {
@ -138,7 +206,17 @@ export default class ErrorComponent extends Vue {
copied: "success" | "error" | false = false;
config!: { contact: string | null; name: string };
config!: IConfig;
feedback = "";
submittedFeedback = false;
feedbackError = false;
loggedUser!: IUser;
RouteName = RouteName;
async copyErrorToClipboard(): Promise<void> {
try {
@ -193,6 +271,56 @@ export default class ErrorComponent extends Vue {
document.body.removeChild(textArea);
}
get sentryEnabled(): boolean {
return this.sentryProvider?.enabled === true;
}
get sentryProvider(): IAnalyticsConfig | undefined {
return this.config && checkProviderConfig(this.config, "sentry");
}
get sentryConfig(): ISentryConfiguration | undefined {
if (this.sentryProvider?.configuration) {
return convertConfig(
this.sentryProvider?.configuration
) as ISentryConfiguration;
}
return undefined;
}
get sentryReady() {
const eventId = window.sessionStorage.getItem("lastEventId");
const dsn = this.sentryConfig?.dsn;
const organization = this.sentryConfig?.organization;
const project = this.sentryConfig?.project;
const host = this.sentryConfig?.host;
return eventId && dsn && organization && project && host;
}
async sendErrorToSentry() {
try {
const eventId = window.sessionStorage.getItem("lastEventId");
const dsn = this.sentryConfig?.dsn;
const organization = this.sentryConfig?.organization;
const project = this.sentryConfig?.project;
const host = this.sentryConfig?.host;
const endpoint = `https://${host}/api/0/projects/${organization}/${project}/user-feedback/`;
if (eventId && dsn && this.sentryReady) {
await submitFeedback(endpoint, dsn, {
event_id: eventId,
name:
this.loggedUser?.defaultActor?.preferredUsername || "Unknown user",
email: this.loggedUser?.email || "unknown@email.org",
comments: this.feedback,
});
this.submittedFeedback = true;
}
} catch (error) {
console.error(error);
this.feedbackError = true;
}
}
}
</script>
<style lang="scss" scoped>

View File

@ -67,7 +67,6 @@
<inline-address
dir="auto"
v-if="event.physicalAddress"
class="event-subtitle"
:physical-address="event.physicalAddress"
/>
<div

View File

@ -36,6 +36,7 @@
>
<router-link
v-if="event.attributedTo"
class="hover:underline"
:to="{
name: RouteName.GROUP,
params: {
@ -53,6 +54,7 @@
</router-link>
<actor-card v-else :actor="event.organizerActor" :inline="true" />
<actor-card
:inline="true"
:actor="contact"
v-for="contact in event.contacts"
:key="contact.id"
@ -65,6 +67,7 @@
>
<a
target="_blank"
class="hover:underline"
rel="noopener noreferrer ugc"
:href="event.onlineAddress"
:title="

View File

@ -1,6 +1,6 @@
<template>
<router-link
class="event-minimalist-card-wrapper"
class="event-minimalist-card-wrapper bg-white rounded-lg shadow-md"
dir="auto"
:to="{ name: RouteName.EVENT, params: { uuid: event.uuid } }"
>

View File

@ -5,33 +5,48 @@
:placeholder="$t('Filter by profile or group name')"
v-model="actorFilter"
/>
<b-radio-button
v-model="selectedActor"
:native-value="availableActor"
class="list-item"
v-for="availableActor in actualFilteredAvailableActors"
:key="availableActor.id"
<transition-group
tag="ul"
class="grid grid-cols-1 gap-y-3 m-5 max-w-md mx-auto"
enter-active-class="duration-300 ease-out"
enter-from-class="transform opacity-0"
enter-to-class="opacity-100"
leave-active-class="duration-200 ease-in"
leave-from-class="opacity-100"
leave-to-class="transform opacity-0"
>
<div class="media" dir="auto">
<figure class="image is-48x48" v-if="availableActor.avatar">
<img
class="image is-rounded"
:src="availableActor.avatar.url"
alt=""
/>
</figure>
<b-icon
class="media-left"
v-else
size="is-large"
icon="account-circle"
<li
class="relative focus-within:shadow-lg"
v-for="availableActor in actualFilteredAvailableActors"
:key="availableActor.id"
>
<input
class="sr-only peer"
type="radio"
:value="availableActor"
name="availableActors"
v-model="selectedActor"
:id="`availableActor-${availableActor.id}`"
/>
<div class="media-content">
<h3>{{ availableActor.name }}</h3>
<small>{{ `@${availableActor.preferredUsername}` }}</small>
</div>
</div>
</b-radio-button>
<label
class="flex flex-wrap p-3 bg-white border border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50 peer-checked:ring-primary peer-checked:ring-2 peer-checked:border-transparent"
:for="`availableActor-${availableActor.id}`"
>
<figure class="image is-48x48" v-if="availableActor.avatar">
<img
class="image is-rounded"
:src="availableActor.avatar.url"
alt=""
/>
</figure>
<b-icon v-else size="is-large" icon="account-circle" />
<div>
<h3>{{ availableActor.name }}</h3>
<small>{{ `@${availableActor.preferredUsername}` }}</small>
</div>
</label>
</li>
</transition-group>
</div>
</template>
<script lang="ts">

View File

@ -1,5 +1,8 @@
<template>
<div class="organizer-picker" v-if="selectedActor">
<div
class="bg-white border border-gray-300 rounded-lg cursor-pointer"
v-if="selectedActor"
>
<!-- If we have a current actor (inline) -->
<div
v-if="inline && selectedActor.id"
@ -69,7 +72,8 @@
<p>{{ $t("Add a contact") }}</p>
<b-input
:placeholder="$t('Filter by name')"
v-model="contactFilter"
:value="contactFilter"
@input="debounceSetFilterByName"
dir="auto"
/>
<div v-if="actorMembers.length > 0">
@ -144,11 +148,12 @@ import EmptyContent from "../Utils/EmptyContent.vue";
import {
CURRENT_ACTOR_CLIENT,
IDENTITIES,
LOGGED_USER_MEMBERSHIPS,
PERSON_GROUP_MEMBERSHIPS,
} from "../../graphql/actor";
import { Paginate } from "../../types/paginate";
import { GROUP_MEMBERS } from "@/graphql/member";
import { ActorType, MemberRole } from "@/types/enums";
import debounce from "lodash/debounce";
const MEMBER_ROLES = [
MemberRole.CREATOR,
@ -179,15 +184,17 @@ const MEMBER_ROLES = [
},
},
currentActor: CURRENT_ACTOR_CLIENT,
userMemberships: {
query: LOGGED_USER_MEMBERSHIPS,
personMemberships: {
query: PERSON_GROUP_MEMBERSHIPS,
variables() {
return {
id: this.currentActor?.id,
page: 1,
limit: 10,
groupId: this.$route.query?.actorId,
};
},
update: (data) => data.loggedUser.memberships,
update: (data) => data.person.memberships,
},
identities: IDENTITIES,
},
@ -197,6 +204,9 @@ export default class OrganizerPickerWrapper extends Vue {
@Prop({ default: true, type: Boolean }) inline!: boolean;
@Prop({ type: Array, required: false, default: () => [] })
contacts!: IActor[];
currentActor!: IPerson;
identities!: IPerson[];
@ -207,13 +217,17 @@ export default class OrganizerPickerWrapper extends Vue {
usernameWithDomain = usernameWithDomain;
@Prop({ type: Array, required: false, default: () => [] })
contacts!: IActor[];
members: Paginate<IMember> = { elements: [], total: 0 };
membersPage = 1;
userMemberships: Paginate<IMember> = { elements: [], total: 0 };
personMemberships: Paginate<IMember> = { elements: [], total: 0 };
data(): Record<string, unknown> {
return {
debounceSetFilterByName: debounce(this.setContactFilter, 1000),
};
}
get actualContacts(): (string | undefined)[] {
return this.contacts.map(({ id }) => id);
@ -226,15 +240,17 @@ export default class OrganizerPickerWrapper extends Vue {
);
}
@Watch("userMemberships")
setContactFilter(contactFilter: string) {
this.contactFilter = contactFilter;
}
@Watch("personMemberships")
setInitialActor(): void {
if (this.$route.query?.actorId) {
const actorId = this.$route.query?.actorId as string;
const actor = this.userMemberships.elements.find(
({ parent: { id }, role }) =>
actorId === id && MEMBER_ROLES.includes(role)
)?.parent as IActor;
this.selectedActor = actor;
if (
this.personMemberships?.elements[0]?.parent?.id ===
this.$route.query?.actorId
) {
this.selectedActor = this.personMemberships?.elements[0]?.parent;
}
}
@ -276,7 +292,7 @@ export default class OrganizerPickerWrapper extends Vue {
actor.preferredUsername.toLowerCase(),
actor.name?.toLowerCase(),
actor.domain?.toLowerCase(),
].some((match) => match?.includes(this.contactFilter.toLowerCase()));
];
});
}

View File

@ -190,7 +190,7 @@ export default class ShareEventModal extends Vue {
}
get mastodonShareUrl(): string {
return `https://toot.karamoff.dev/?text=${encodeURIComponent(
return `https://toot.kytta.dev/?text=${encodeURIComponent(
this.basicTextToEncode
)}`;
}

View File

@ -31,15 +31,11 @@
</span>
</div>
</div>
<div
class="content mb-2 line-clamp-3"
dir="auto"
v-html="group.summary"
/>
<div class="mb-2 line-clamp-3" dir="auto" v-html="group.summary" />
<div>
<inline-address
class="has-text-grey-dark"
v-if="group.physicalAddress"
v-if="group.physicalAddress && addressFullName(group.physicalAddress)"
:physicalAddress="group.physicalAddress"
/>
<p class="has-text-grey-dark">
@ -65,6 +61,7 @@ import { displayName, IGroup, usernameWithDomain } from "@/types/actor";
import LazyImageWrapper from "@/components/Image/LazyImageWrapper.vue";
import RouteName from "../../router/name";
import InlineAddress from "@/components/Address/InlineAddress.vue";
import { addressFullName } from "@/types/address.model";
@Component({
components: {
@ -80,6 +77,8 @@ export default class GroupCard extends Vue {
usernameWithDomain = usernameWithDomain;
displayName = displayName;
addressFullName = addressFullName;
}
</script>
<style lang="scss" scoped>

View File

@ -10,7 +10,7 @@
import { Component, Prop, Vue } from "vue-property-decorator";
import RedirectWithAccount from "@/components/Utils/RedirectWithAccount.vue";
import { FETCH_GROUP } from "@/graphql/group";
import { IGroup } from "@/types/actor";
import { displayName, IGroup } from "@/types/actor";
@Component({
components: { RedirectWithAccount },
@ -52,7 +52,7 @@ export default class JoinGroupWithAccount extends Vue {
}
get groupTitle(): undefined | string {
return this.group?.name || this.group?.preferredUsername;
return this.group && displayName(this.group);
}
sentence = this.$t(

View File

@ -117,7 +117,7 @@ import { Component, Prop, Vue, Ref } from "vue-property-decorator";
import { GroupVisibility } from "@/types/enums";
import DiasporaLogo from "../Share/DiasporaLogo.vue";
import MastodonLogo from "../Share/MastodonLogo.vue";
import TelegramLogo from "../Share/MastodonLogo.vue";
import TelegramLogo from "../Share/TelegramLogo.vue";
import { displayName, IGroup } from "@/types/actor";
@Component({
@ -177,7 +177,7 @@ export default class ShareGroupModal extends Vue {
}
get mastodonShareUrl(): string {
return `https://toot.karamoff.dev/?text=${encodeURIComponent(
return `https://toot.kytta.dev/?text=${encodeURIComponent(
this.basicTextToEncode
)}`;
}

View File

@ -142,7 +142,9 @@ export default class Map extends Vue {
}
updateDraggableMarkerPosition(e: LatLng): void {
this.updateDraggableMarkerCallback(e, this.zoom);
if (this.updateDraggableMarkerCallback) {
this.updateDraggableMarkerCallback(e, this.zoom);
}
}
updateZoom(zoom: number): void {

View File

@ -56,21 +56,6 @@
>{{ $t("Create") }}</b-button
>
</b-navbar-item>
<b-navbar-item
v-if="config && config.features.koenaConnect"
class="koena"
tag="a"
href="https://mediation.koena.net/framasoft/mobilizon/"
target="_blank"
rel="noopener external"
hreflang="fr"
>
<img
src="/img/koena-a11y.svg"
width="150"
alt="Contact accessibilité"
/>
</b-navbar-item>
</template>
<template slot="end">
<b-navbar-item
@ -394,15 +379,6 @@ nav {
background-color: inherit;
}
.koena {
padding-top: 0;
padding-bottom: 0;
& > img {
max-height: 4rem;
padding-top: 0.2rem;
}
}
.identity-wrapper {
display: flex;

View File

@ -9,7 +9,7 @@
:rounded="true"
style="height: 120px"
/>
<div class="title-info-wrapper has-text-grey-dark">
<div class="title-info-wrapper has-text-grey-dark px-1">
<h3 class="post-minimalist-title" :lang="post.language">
{{ post.title }}
</h3>

View File

@ -179,7 +179,7 @@ export default class SharePostModal extends Vue {
}
get mastodonShareUrl(): string {
return `https://toot.karamoff.dev/?text=${encodeURIComponent(
return `https://toot.kytta.dev/?text=${encodeURIComponent(
this.basicTextToEncode
)}`;
}

View File

@ -9,7 +9,7 @@
:class="{ 'is-titleless': !title }"
>
<div class="media">
<div class="media-left">
<div class="media-left hidden md:block">
<b-icon icon="alert" type="is-warning" size="is-large" />
</div>
<div class="media-content">

View File

@ -45,7 +45,7 @@
</a>
<resource-dropdown
class="actions"
v-if="!inline || !preview"
v-if="!inline && !preview"
@delete="$emit('delete', resource.id)"
@move="$emit('move', resource)"
@rename="$emit('rename', resource)"

View File

@ -1,7 +1,7 @@
<template>
<div v-if="resource">
<article class="panel is-primary">
<p class="panel-heading">
<p class="panel-heading truncate">
{{
$t('Move "{resourceName}"', { resourceName: initialResource.title })
}}
@ -28,7 +28,7 @@
</a>
<template v-if="resource.children">
<a
class="panel-block"
class="panel-block flex-wrap"
v-for="element in resource.children.elements"
:class="{
clickable:
@ -37,15 +37,17 @@
:key="element.id"
@click="goDown(element)"
>
<span class="panel-icon">
<b-icon
icon="folder"
size="is-small"
v-if="element.type === 'folder'"
/>
<b-icon icon="link" size="is-small" v-else />
</span>
{{ element.title }}
<p class="truncate">
<span class="panel-icon">
<b-icon
icon="folder"
size="is-small"
v-if="element.type === 'folder'"
/>
<b-icon icon="link" size="is-small" v-else />
</span>
<span>{{ element.title }}</span>
</p>
<span v-if="element.id === initialResource.id">
<em v-if="element.type === 'folder'"> {{ $t("(this folder)") }}</em>
<em v-else> {{ $t("(this link)") }}</em>
@ -89,7 +91,7 @@
</div>
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
import { Component, Vue, Prop, Watch } from "vue-property-decorator";
import { GET_RESOURCE } from "../../graphql/resources";
import { IResource } from "../../types/resource";
@ -119,7 +121,7 @@ export default class ResourceSelector extends Vue {
@Prop({ required: true }) username!: string;
resource: IResource | undefined = this.initialResource.parent;
resource: IResource | undefined = undefined;
RESOURCES_PER_PAGE = 10;
@ -131,6 +133,20 @@ export default class ResourceSelector extends Vue {
}
}
data() {
return {
resource: this.initialResource?.parent,
};
}
@Watch("initialResource")
updateResourceFromProp() {
if (this.initialResource) {
this.resource = this.initialResource?.parent;
this.$apollo.queries.resource.refetch();
}
}
updateResource(): void {
this.$emit(
"update-resource",

View File

@ -1,18 +1,22 @@
<template>
<label for="navSearchField">
<span class="visually-hidden">{{ defaultPlaceHolder }}</span>
<b-field label-for="navSearchField" class="-mt-2">
<b-input
custom-class="searchField"
:placeholder="defaultPlaceHolder"
type="search"
id="navSearchField"
icon="magnify"
type="search"
icon-clickable
rounded
custom-class="searchField"
dir="auto"
:placeholder="defaultPlaceHolder"
v-model="search"
@keyup.native.enter="enter"
/>
</label>
>
</b-input>
<template #label>
<span class="sr-only">{{ defaultPlaceHolder }}</span>
</template>
</b-field>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
@ -47,6 +51,7 @@ label span.visually-hidden {
input.searchField {
box-shadow: none;
border-color: #b5b5b5;
border-radius: 9999px !important;
&::placeholder {
color: gray;

View File

@ -1,11 +1,15 @@
<template>
<div class="empty-content" :class="{ inline }" role="note">
<div
class="empty-content"
:class="{ inline, 'text-center': center }"
role="note"
>
<b-icon :icon="icon" size="is-large" />
<h2 class="empty-content__title">
<!-- @slot Mandatory title -->
<slot />
</h2>
<p v-show="$slots.desc">
<p v-show="$slots.desc" :class="descriptionClasses">
<!-- @slot Optional description -->
<slot name="desc" />
</p>
@ -17,7 +21,10 @@ import { Component, Prop, Vue } from "vue-property-decorator";
@Component
export default class EmptyContent extends Vue {
@Prop({ type: String, required: true }) icon!: string;
@Prop({ type: String, required: false, default: "" })
descriptionClasses!: string;
@Prop({ type: Boolean, required: false, default: false }) inline!: boolean;
@Prop({ type: Boolean, required: false, default: false }) center!: boolean;
}
</script>

View File

@ -34,16 +34,6 @@ export const FETCH_PERSON = gql`
feedTokens {
token
}
organizedEvents {
total
elements {
id
uuid
title
beginsOn
status
}
}
}
}
${ACTOR_FRAGMENT}
@ -351,6 +341,30 @@ export const PERSON_STATUS_GROUP = gql`
${ACTOR_FRAGMENT}
`;
export const PERSON_GROUP_MEMBERSHIPS = gql`
query PersonGroupMemberships($id: ID!, $groupId: ID!) {
person(id: $id) {
id
memberships(groupId: $groupId) {
total
elements {
id
role
parent {
...ActorFragment
}
invitedBy {
...ActorFragment
}
insertedAt
updatedAt
}
}
}
}
${ACTOR_FRAGMENT}
`;
export const GROUP_MEMBERSHIP_SUBSCRIPTION_CHANGED = gql`
subscription GroupMembershipSubscriptionChanged(
$actorId: ID!

View File

@ -74,6 +74,7 @@ export const INSTANCE_FRAGMENT = gql`
fragment InstanceFragment on Instance {
domain
hasRelay
relayAddress
followerStatus
followedStatus
eventCount
@ -131,15 +132,6 @@ export const ADD_INSTANCE = gql`
${INSTANCE_FRAGMENT}
`;
export const ADD_RELAY = gql`
mutation addRelay($address: String!) {
addRelay(address: $address) {
...relayFragment
}
}
${RELAY_FRAGMENT}
`;
export const REMOVE_RELAY = gql`
mutation removeRelay($address: String!) {
removeRelay(address: $address) {

View File

@ -71,7 +71,6 @@ export const CONFIG = gql`
features {
groups
eventCreation
koenaConnect
}
restrictions {
onlyAdminCanCreateGroups
@ -96,6 +95,15 @@ export const CONFIG = gql`
enabled
publicKey
}
analytics {
id
enabled
configuration {
key
value
type
}
}
}
}
`;

View File

@ -226,6 +226,15 @@ export const FETCH_GROUP = gql`
${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
`;
export const FETCH_GROUP_BY_ID = gql`
query FetchGroupById($id: ID!) {
groupById(id: $name) {
...GroupFullFields
}
}
${GROUP_FIELDS_FRAGMENTS}
`;
export const GET_GROUP = gql`
query GetGroup(
$id: ID!

View File

@ -98,7 +98,7 @@ export const FETCH_POST = gql`
export const CREATE_POST = gql`
mutation CreatePost(
$title: String!
$body: String
$body: String!
$attributedToId: ID!
$visibility: PostVisibility
$draft: Boolean

View File

@ -103,6 +103,7 @@
"Anonymous participant": "Anonymní účastník",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Anonymní účastníci budou požádáni o potvrzení své účasti e-mailem.",
"Anonymous participations": "Anonymní účasti",
"Any category": "Jakákoliv kategorie",
"Any day": "Jakýkoliv den",
"Any type": "Jakýkoli typ",
"Anyone can join freely": "Každý se může volně připojit",
@ -158,6 +159,7 @@
"Cancel my participation…": "Zrušit moji účast…",
"Cancelled": "Zrušeno",
"Cancelled: Won't happen": "Zrušeno: Neuskuteční se",
"Category": "Kategorie",
"Change": "Změnit",
"Change email": "Změnit e-mail",
"Change my email": "Změnit můj email",
@ -818,6 +820,7 @@
"Search": "Hledat",
"Search events, groups, etc.": "Hledání událostí, skupin atd.",
"Searching…": "Hledání…",
"Select a category": "Vybrat kategorii",
"Select a language": "Výběr jazyka",
"Select a radius": "Vybrat poloměr",
"Select a timezone": "Výběr časového pásma",

View File

@ -158,6 +158,7 @@
"Cancel my participation…": "Meine Teilnahme stornieren…",
"Cancelled": "Abgesagt",
"Cancelled: Won't happen": "Abgesagt: Wird nicht stattfinden",
"Category": "Kategorie",
"Change": "Ändern",
"Change email": "E-Mail ändern",
"Change my email": "Meine E-Mail ändern",
@ -284,7 +285,7 @@
"Draft": "Entwurf",
"Drafts": "Entwürfe",
"Due on": "Fällig am",
"Duplicate": "Duplikat",
"Duplicate": "Duplizieren",
"Edit": "Bearbeiten",
"Edit post": "Beitrag bearbeiten",
"Edit profile {profile}": "Profil {profile} bearbeiten",
@ -390,7 +391,7 @@
"Gather ⋅ Organize ⋅ Mobilize": "Treffen ⋅ Organisieren ⋅ Mobilisieren",
"General": "Allgemein",
"General information": "Allgemeine Informationen",
"General settings": "Allgemeine EInstellungen",
"General settings": "Allgemeine Einstellungen",
"Geolocation was not determined in time.": "Geolokalisierung konnte nicht rechtzeitig ermittelt werden.",
"Getting location": "Standort ermitteln",
"Getting there": "Hin kommen",
@ -427,7 +428,7 @@
"Homepage": "Website",
"Hourly email summary": "Stündliche E-Mail-Zusammenfassungen",
"I agree to the {instanceRules} and {termsOfService}": "Ich stimme den {instanceRules} und den {termsOfService} zu",
"I create an identity": "Ich erstelle eine Identität",
"I create an identity": "Neue Identität erstellen",
"I don't have a Mobilizon account": "Ich habe kein Mobilizon Konto",
"I have a Mobilizon account": "Ich habe ein Mobilizon Konto",
"I have an account on another Mobilizon instance.": "Ich habe ein Konto auf einer anderen Mobilizon-Instanz.",

View File

@ -1309,5 +1309,26 @@
"Reset filters": "Reset filters",
"Category": "Category",
"Select a category": "Select a category",
"Any category": "Any category"
}
"Any category": "Any category",
"We collect your feedback and the error information in order to improve this service.": "We collect your feedback and the error information in order to improve this service.",
"What happened?": "What happened?",
"I've clicked on X, then on Y": "I've clicked on X, then on Y",
"Send feedback": "Send feedback",
"Sorry, we wen't able to save your feedback. Don't worry, we'll try to fix this issue anyway.": "Sorry, we wen't able to save your feedback. Don't worry, we'll try to fix this issue anyway.",
"return to the homepage": "return to the homepage",
"Thanks a lot, your feedback was submitted!": "Thanks a lot, your feedback was submitted!",
"You may also:": "You may also:",
"You may now close this page or {return_to_the_homepage}.": "You may now close this page or {return_to_the_homepage}.",
"This group is a remote group, it's possible the original instance has more informations.": "This group is a remote group, it's possible the original instance has more informations.",
"View the group profile on the original instance": "View the group profile on the original instance",
"View past events": "View past events",
"Get informed of the upcoming public events": "Get informed of the upcoming public events",
"Join": "Join",
"Become part of the community and start organizing events": "Become part of the community and start organizing events",
"Follow requests will be approved by a group moderator": "Follow requests will be approved by a group moderator",
"Follow request pending approval": "Follow request pending approval",
"Your membership is pending approval": "Your membership is pending approval",
"Activate notifications": "Activate notifications",
"Deactivate notifications": "Deactivate notifications",
"Membership requests will be approved by a group moderator": "Membership requests will be approved by a group moderator"
}

View File

@ -55,6 +55,7 @@
"Account settings": "Configuración de la cuenta",
"Actions": "Acciones",
"Activate browser push notifications": "Activar notificaciones push del navegador",
"Activate notifications": "Activar notificaciones",
"Activated": "Activado",
"Active": "Activo",
"Activity": "Actividad",
@ -103,6 +104,7 @@
"Anonymous participant": "Participante anónimo",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Los participantes anónimos deberán confirmar su participación por correo electrónico.",
"Anonymous participations": "Participaciones anónimas",
"Any category": "Cualquier categoría",
"Any day": "Cualquier día",
"Any type": "Cualquier tipo",
"Anyone can join freely": "Cualquiera puede unirse libremente",
@ -135,6 +137,7 @@
"Back to top": "Volver arriba",
"Back to user list": "Volver a la lista de usuarios",
"Banner": "Pancarta",
"Become part of the community and start organizing events": "Forma parte de la comunidad y empieza a organizar eventos",
"Before you can login, you need to click on the link inside it to validate your account.": "Antes de iniciar sesión, debe hacer clic en el enlace que se encuentra dentro para validar su cuenta.",
"Begins on": "Comienza en",
"Big Blue Button": "Big Blue Button",
@ -158,6 +161,7 @@
"Cancel my participation…": "Cancelar mi participación …",
"Cancelled": "Cancelado",
"Cancelled: Won't happen": "Cancelado: no sucederá",
"Category": "Categoría",
"Change": "Cambiar",
"Change email": "Cambiar e-mail",
"Change my email": "Cambiar mi correo electrónico",
@ -239,6 +243,7 @@
"Date and time": "Fecha y hora",
"Date and time settings": "Configuración de fecha y hora",
"Date parameters": "Parámetros de fecha",
"Deactivate notifications": "Activar notificaciones",
"Decline": "Rechazar",
"Decrease": "Disminución",
"Default": "Valor predeterminados",
@ -365,6 +370,8 @@
"Follow": "Seguir",
"Follow a new instance": "Seguir una nueva instancia",
"Follow instance": "Seguir instancia",
"Follow request pending approval": "Seguir solicitud pendiente de aprobación",
"Follow requests will be approved by a group moderator": "Las solicitudes de seguimiento serán aprobadas por un moderador del grupo",
"Follow status": "Seguir estado",
"Followed": "Seguidos",
"Followed, pending response": "Seguido, pendiente de respuesta",
@ -392,6 +399,7 @@
"General information": "Información general",
"General settings": "Configuración general",
"Geolocation was not determined in time.": "La geolocalización no se determinó a tiempo.",
"Get informed of the upcoming public events": "Infórmese de los próximos eventos públicos",
"Getting location": "Obtener ubicación",
"Getting there": "Llegar allí",
"Glossary": "Glosario",
@ -436,6 +444,7 @@
"I want to approve every participation request": "Quiero aprobar cada solicitud de participación",
"I've been mentionned in a comment under an event": "Me han mencionado en un comentario en un evento",
"I've been mentionned in a group discussion": "Me han mencionado en una discusión grupal",
"I've clicked on X, then on Y": "He hecho clic en X, luego en Y",
"ICS feed for events": "Flujo ICS para eventos",
"ICS/WebCal Feed": "Flujo ICS/WebCal",
"IP Address": "Dirección IP",
@ -484,6 +493,7 @@
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Es posible que el contenido no sea accesible en esta instancia, porque esta instancia ha bloqueado los perfiles o grupos detrás de este contenido.",
"Italic": "Cursiva",
"Jitsi Meet": "Jitsi Meet",
"Join": "Unirse",
"Join <b>{instance}</b>, a Mobilizon instance": "Únase a <b> {instance} </b>, una instancia de Mobilizon",
"Join group": "Unirse al grupo",
"Join group {group}": "Unirse al grupo {group}",
@ -532,6 +542,7 @@
"Member": "Miembro",
"Members": "Miembros",
"Members-only post": "Publicación solo para miembros",
"Membership requests will be approved by a group moderator": "Las solicitudes de membresía serán aprobadas por un moderador del grupo",
"Memberships": "Miembros",
"Mentions": "Menciones",
"Message": "Mensaje",
@ -819,6 +830,7 @@
"Search": "Buscar",
"Search events, groups, etc.": "Buscar eventos, grupos, etc.",
"Searching…": "Buscando…",
"Select a category": "Seleccione una categoría",
"Select a language": "Selecciona un idioma",
"Select a radius": "Seleccione un radio",
"Select a timezone": "Selecciona una zona horaria",
@ -826,6 +838,7 @@
"Select the activities for which you wish to receive an email or a push notification.": "Seleccione las actividades para las que desea recibir un correo electrónico o una notificación automática.",
"Send": "Enviar",
"Send email": "Enviar correo electrónico",
"Send feedback": "Enviar comentarios",
"Send notification e-mails": "Enviar correos electrónicos de notificación",
"Send password reset": "Enviar restablecimiento de contraseña",
"Send the confirmation email again": "Enviar el correo electrónico de confirmación nuevamente",
@ -852,6 +865,7 @@
"Skip to main content": "Saltar al contenido principal",
"Social": "Social",
"Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "Algunos términos, técnicos o de otro tipo, utilizados en el texto a continuación pueden abarcar conceptos que son difíciles de comprender. Hemos proporcionado un glosario aquí para ayudarlo a comprenderlos mejor:",
"Sorry, we wen't able to save your feedback. Don't worry, we'll try to fix this issue anyway.": "Lo sentimos, no pudimos guardar sus comentarios. No se preocupe, intentaremos solucionar este problema de todos modos.",
"Starts on…": "Comienza en …",
"Status": "Estado",
"Stop following instance": "Dejar de seguir la instancia",
@ -871,6 +885,7 @@
"Terms": "Condiciones",
"Terms of service": "Términos de servicio",
"Text": "Texto",
"Thanks a lot, your feedback was submitted!": "¡Muchas gracias, sus comentarios fueron enviados!",
"That you follow or of which you are a member": "Que sigues o del que eres miembro",
"The Big Blue Button video teleconference URL": "La URL de la videoconferencia de Big Blue Button",
"The Google Meet video teleconference URL": "La URL de la videoconferencia de Google Meet",
@ -944,6 +959,7 @@
"This event has been cancelled.": "Este evento ha sido cancelado.",
"This event is accessible only through it's link. Be careful where you post this link.": "Este evento es accesible solo a través de su enlace. Tenga cuidado donde publica este enlace.",
"This group doesn't have a description yet.": "Este grupo aún no tiene una descripción.",
"This group is a remote group, it's possible the original instance has more informations.": "Este grupo es un grupo remoto, es posible que la instancia original tenga más información.",
"This group is accessible only through it's link. Be careful where you post this link.": "Este grupo es accesible solo a través de su enlace. Tenga cuidado donde publica este enlace.",
"This group is invite-only": "Este grupo es solo por invitación",
"This group was not found": "No se encontró este grupo",
@ -1045,6 +1061,8 @@
"View less": "Ver menos",
"View more": "Ver más",
"View page on {hostname} (in a new window)": "Ver página en {hostname} (en una nueva ventana)",
"View past events": "Ver eventos pasados",
"View the group profile on the original instance": "Ver el perfil del grupo en la instancia original",
"Visibility was set to an unknown value.": "La visibilidad se estableció en un valor desconocido.",
"Visibility was set to private.": "La visibilidad se estableció en privada.",
"Visibility was set to public.": "La visibilidad se estableció en público.",
@ -1052,6 +1070,7 @@
"Visible everywhere on the web (public)": "Visible en todas partes de la web (público)",
"Waiting for organization team approval.": "Esperando la aprobación del equipo de la organización.",
"Warning": "Advertencia",
"We collect your feedback and the error information in order to improve this service.": "Recopilamos sus comentarios y la información de error para mejorar este servicio.",
"We couldn't save your participation inside this browser. Not to worry, you have successfully confirmed your participation, we just couldn't save it's status in this browser because of a technical issue.": "No pudimos guardar su participación dentro de este navegador. No se preocupe, ha confirmado con éxito su participación, simplemente no pudimos guardar su estado en este navegador debido a un problema técnico.",
"We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):": "Mejoramos este software gracias a sus comentarios. Para informarnos sobre este problema, hay dos posibilidades (ambas lamentablemente requieren la creación de una cuenta de usuario):",
"We just sent an email to {email}": "Acabamos de enviar un correo electrónico a {email}",
@ -1067,6 +1086,7 @@
"Welcome back!": "¡Bienvenido de nuevo!",
"Welcome to Mobilizon, {username}!": "¡Bienvenido a Mobilizon, {username}!",
"What can I do to help?": "¿Que puedo hacer para ayudar?",
"What happened?": "¿Qué pasó?",
"Wheelchair accessibility": "Accesibilidad para sillas de ruedas",
"When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Cuando un moderador del grupo crea un evento y lo atribuye al grupo, se mostrará aquí.",
"When the event is private, you'll need to share the link around.": "Cuando el evento sea privado, deberá compartir el enlace.",
@ -1125,7 +1145,9 @@
"You have one event tomorrow.": "No tienes eventos mañana|Tienes un evento mañana.|Tienes {count} eventos mañana",
"You haven't interacted with other instances yet.": "Aún no has interactuado con otras instancias.",
"You invited {member}.": "as invitado a {member}.",
"You may also:": "También puedes:",
"You may clear all participation information for this device with the buttons below.": "Puede borrar toda la información de participación de este dispositivo con los botones a continuación.",
"You may now close this page or {return_to_the_homepage}.": "Ahora puede cerrar esta página o {return_to_the_homepage}.",
"You may now close this window, or {return_to_event}.": "Ahora puede cerrar esta ventana o {return_to_event}.",
"You may show some members as contacts.": "Puede mostrar algunos miembros como contactos.",
"You moved the folder {resource} into {new_path}.": "Moviste la carpeta {resource} a {new_path}.",
@ -1177,6 +1199,7 @@
"Your email is being changed": "Su correo electrónico está siendo cambiado",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Su correo electrónico solo se utilizará para confirmar que es una persona real y enviarle actualizaciones eventuales para este evento. NO se transmitirá a otras instancias ni al organizador del evento.",
"Your federated identity": "Su identidad federada",
"Your membership is pending approval": "Su membresía está pendiente de aprobación",
"Your membership was approved by {profile}.": "Su adesión fue aprobada por {profile}.",
"Your participation has been confirmed": "Su participación ha sido confirmada",
"Your participation has been rejected": "Su participación ha sido rechazada",
@ -1227,6 +1250,7 @@
"profile@instance": "perfil@instancia",
"report #{report_number}": "informe #{report_number}",
"return to the event's page": "volver a la página del evento",
"return to the homepage": "Vuelve a la página inicial",
"terms of service": "términos de servicio",
"with another identity…": "con otra identidad …",
"your notification settings": "tu configuración de notificaciones",

View File

@ -1308,5 +1308,18 @@
"© The OpenStreetMap Contributors": "© Les Contributeur⋅ices OpenStreetMap",
"Category": "Catégorie",
"Select a category": "Choisissez une categorie",
"Any category": "N'importe quelle catégorie"
"Any category": "N'importe quelle catégorie",
"No instance found.": "Aucune instance trouvée.",
"This group is a remote group, it's possible the original instance has more informations.": "Ce groupe est un groupe distant, il est possible que l'instance d'origine ait plus d'informations.",
"View the group profile on the original instance": "Afficher le profil du groupe sur l'instance d'origine",
"View past events": "Voir les événements passés",
"Get informed of the upcoming public events": "Soyez informé⋅e des événements publics à venir",
"Join": "Rejoindre",
"Become part of the community and start organizing events": "Faites partie de la communauté et commencez à organiser des événements",
"Follow requests will be approved by a group moderator": "Les demandes de suivi seront approuvées par un⋅e modérateur⋅ice du groupe",
"Follow request pending approval": "Demande de suivi en attente d'approbation",
"Your membership is pending approval": "Votre adhésion est en attente d'approbation",
"Activate notifications": "Activer les notifications",
"Deactivate notifications": "Désactiver les notifications",
"Membership requests will be approved by a group moderator": "Les demandes d'adhésion seront approuvées par un⋅e modérateur⋅ice du groupe"
}

View File

@ -55,6 +55,7 @@
"Account settings": "Roghainnean a chunntais",
"Actions": "Gnìomhan",
"Activate browser push notifications": "Gnìomhaich brathan putaidh a bhrabhsair",
"Activate notifications": "Gnìomhaich na brathan",
"Activated": "An gnìomh",
"Active": "Gnìomhach",
"Activity": "Gnìomhachd",
@ -103,6 +104,7 @@
"Anonymous participant": "Freastalaiche gun ainm",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Thèid iarraidh air freastalaichean gun ainm gun dearbh iad an com-pàirteachadh air a phost-d.",
"Anonymous participations": "Com-pàirteachaidhean gun ainm",
"Any category": "Roinn-seòrsa sam bith",
"Any day": "Latha sam bith",
"Any type": "Seòrsa sam bith",
"Anyone can join freely": "Faodaidh neach sam bith a dhol an sàs ann gu saor",
@ -135,6 +137,7 @@
"Back to top": "Air ais gun bhàrr",
"Back to user list": "Air ais gu liosta nan cleachdaichean",
"Banner": "Bratach",
"Become part of the community and start organizing events": "Faigh ballrachd sa choimhearsnachd agus tòisich air tachartasan a chur air dòigh",
"Before you can login, you need to click on the link inside it to validate your account.": "Mus urrainn dhut clàradh a-steach, feumaidh tu briogadh air a cheangal na broinn gus an cunntas agad a dhearbhadh.",
"Begins on": "Tòisichidh e aig",
"Big Blue Button": "Big Blue Button",
@ -158,6 +161,7 @@
"Cancel my participation…": "Sguir dhen chom-pàirteachadh agam…",
"Cancelled": "Chaidh a chur gu neoini",
"Cancelled: Won't happen": "Sguireadh dheth: Cha tachair seo",
"Category": "Roinn-seòrsa",
"Change": "Atharraich",
"Change email": "Atharraich am post-d",
"Change my email": "Atharraich am post-d agam",
@ -192,7 +196,7 @@
"Confirm my particpation": "Dearbh an com-pàirteachadh agam",
"Confirm participation": "Dearbh an com-pàirteachadh",
"Confirm user": "Dearbh an cleachdaiche",
"Confirmed": "Air a dhearbhachadh",
"Confirmed": "Air a dhearbhadh",
"Confirmed at": "Chaidh a dhearbhachadh",
"Confirmed: Will happen": "Air dearbhadh: Tachraidh seo",
"Congratulations, your account is now created!": "Meal do naidheachd, chaidh an cunntas agad a chruthachadh!",
@ -239,6 +243,7 @@
"Date and time": "Ceann-là s àm",
"Date and time settings": "Roghainnean a chinn-là s an ama",
"Date parameters": "Paramadairean a chinn-là",
"Deactivate notifications": "Cuir na brathan à gnìomh",
"Decline": "Diùlt",
"Decrease": "Lùghdaich",
"Default": "Bun-roghainn",
@ -365,6 +370,8 @@
"Follow": "Lean air",
"Follow a new instance": "Lean air ionstans ùr",
"Follow instance": "Lean air an ionstans",
"Follow request pending approval": "Iarrtas leantainn ri aontachadh",
"Follow requests will be approved by a group moderator": "Thèid aontachadh ri iarrtasan leantainn le maor a bhuidhinn",
"Follow status": "Staid na leantainn",
"Followed": "Ga leantainn leinne",
"Followed, pending response": "Ga leantainn leinne, a feitheamh air freagairt",
@ -392,6 +399,7 @@
"General information": "Fiosrachadh coitcheann",
"General settings": "Roghainnean coitcheann",
"Geolocation was not determined in time.": "Cha deach leis a gheò-lorgadh ri àm.",
"Get informed of the upcoming public events": "Faigh naidheachdan mu thachartasan poblach ri thighinn",
"Getting location": "A faighinn an ionaid",
"Getting there": "Mar a gheibh thu ann",
"Glossary": "Briathrachan",
@ -436,6 +444,7 @@
"I want to approve every participation request": "Tha mi airson aontachadh ris a h-uile iarrtas air com-pàirteachadh",
"I've been mentionned in a comment under an event": "Chaidh iomradh a thoirt orm ann am beachd fo thachartas",
"I've been mentionned in a group discussion": "Chaidh iomradh a thoirt orm ann an deasbad buidhinn",
"I've clicked on X, then on Y": "Briog mi air X s an uairsin air Y",
"ICS feed for events": "Inbhir ICS dha na tachartasan",
"ICS/WebCal Feed": "Inbhir ICS/WebCal",
"IP Address": "Seòladh IP",
@ -484,6 +493,7 @@
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Dhfhaoidte nach gabh an t-susbaint inntrigeadh air an ionstans seo on a bhac an t-ionstans seo na pròifilean no buidhnean a tha air cùlaibh na susbainte seo.",
"Italic": "Eadailteach",
"Jitsi Meet": "Jitsi Meet",
"Join": "Faigh ballrachd",
"Join <b>{instance}</b>, a Mobilizon instance": "Faigh ballrachd air <b>{instance}</b>, seo ionstans Mobilizon",
"Join group": "Faigh ballrachd sa bhuidheann",
"Join group {group}": "Faigh ballrachd sa bhuidheann {group}",
@ -532,6 +542,7 @@
"Member": "Ball",
"Members": "Buill",
"Members-only post": "Post do bhuill a-mhàin",
"Membership requests will be approved by a group moderator": "Thèid aontachadh ri iarrtasan ballrachd le maor a bhuidhinn",
"Memberships": "Ballrachdan",
"Mentions": "Iomraidhean",
"Message": "Teachdaireachd",
@ -818,6 +829,7 @@
"Search": "Lorg",
"Search events, groups, etc.": "Lorg tachartasan, buidhnean is msaa.",
"Searching…": "Ga lorg…",
"Select a category": "Tagh roinn-seòrsa",
"Select a language": "Tagh cànan",
"Select a radius": "Tagh astar",
"Select a timezone": "Tagh roinn-tìde",
@ -825,6 +837,7 @@
"Select the activities for which you wish to receive an email or a push notification.": "Tagh na gnìomhachdan dhan fhaigh thu post-d no brath putaidh.",
"Send": "Cuir",
"Send email": "Cuir post-d",
"Send feedback": "Cuir do bheachd thugainn",
"Send notification e-mails": "Cuir puist-d bhrathan",
"Send password reset": "Cuir ath-shuidheachadh an fhacail-fhaire",
"Send the confirmation email again": "Cuir am post-d dearbhaidh a-rithist",
@ -851,6 +864,7 @@
"Skip to main content": "Thoir leum gun phrìomh shusbaint",
"Social": "Sòisealta",
"Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "Tha cuid dhe na faclan a tha gan cleachdadh san teacsa gu h-ìosal, co-dhiù an e faclan teicnigeach a th annta gus nach e, mu bheachdan a tha caran doirbh a thuigsinn ma dhfhaoidte. Rinn sinn briathrachan ach am bhiod e na b fhasa dhut an tuigsinn:",
"Sorry, we wen't able to save your feedback. Don't worry, we'll try to fix this issue anyway.": "Tha sinn duilich ach cha b urrainn dhuinn do bheachd a shàbhaladh. Na gabh dragh, feuchaidh sinn gun càraich sinn an duilgheadas co-dhiù.",
"Starts on…": "Àm-tòiseachaidh…",
"Status": "Staid",
"Stop following instance": "Na lean tuilleadh air an ionstans",
@ -870,6 +884,7 @@
"Terms": "Teirmichean",
"Terms of service": "Teirmichean na seirbheise",
"Text": "Teacsa",
"Thanks a lot, your feedback was submitted!": "Mòran taing, chaidh do bheachdan a chur thugainn!",
"That you follow or of which you are a member": "A tha thu a leantainn orra no nad bhall ann",
"The Big Blue Button video teleconference URL": "URL co-labhairt video Big Blue Button",
"The Google Meet video teleconference URL": "URL co-labhairt video Google Meet",
@ -943,6 +958,7 @@
"This event has been cancelled.": "Chaidh an tachartas seo a chur gu neoini.",
"This event is accessible only through it's link. Be careful where you post this link.": "Cha ghabh an tachartas seo inntrigeadh ach leis a cheangal aige. Thoir an aire mus postaich thu an ceangal seo am badeigin.",
"This group doesn't have a description yet.": "Chan eil tuairisgeul aig a bhuidheann seo fhathast.",
"This group is a remote group, it's possible the original instance has more informations.": "S e buidheann cèin a tha seo agus dhfhaoidte gu bheil barrachd fiosrachaidh aig an ionstans tùsail.",
"This group is accessible only through it's link. Be careful where you post this link.": "Cha ghabh an tachartas seo inntrigeadh ach leis a cheangal aige. Thoir an aire mus postaich thu an ceangal seo am badeigin.",
"This group is invite-only": "Feumaidh tu cuireadh airson ballrachd fhaighinn sa bhuidheann seo",
"This group was not found": "Cha deach am buidheann seo a lorg",
@ -1044,6 +1060,8 @@
"View less": "Seall nas lugha",
"View more": "Seall barrachd",
"View page on {hostname} (in a new window)": "Seall an duilleag air {hostname} (ann an uinneag ùr)",
"View past events": "Seall na tachartasan san àm a dhfhalbh",
"View the group profile on the original instance": "Faic pròifil a buidhinn air an ionstans tùsail",
"Visibility was set to an unknown value.": "Chaidh luach nach aithne dhuinn a shuidheachadh air an t-so-fhaicsinneachd.",
"Visibility was set to private.": "Chaidh so-fhaicsinneachd phrìobhaideach a shuidheachadh air.",
"Visibility was set to public.": "Chaidh so-fhaicsinneachd phoblach a shuidheachadh air.",
@ -1051,6 +1069,7 @@
"Visible everywhere on the web (public)": "Chithear air feadh an lìn e (poblach)",
"Waiting for organization team approval.": "A feitheamh air aontachadh leis an sgioba eagrachaidh.",
"Warning": "Rabhadh",
"We collect your feedback and the error information in order to improve this service.": "Cruinnichidh sinn do bheachdan agus am fiosrachadh mun mhearachd ach an doir sinn piseach air an t-seirbheis seo.",
"We couldn't save your participation inside this browser. Not to worry, you have successfully confirmed your participation, we just couldn't save it's status in this browser because of a technical issue.": "Cha b urrainn dhuinn an com-pàirteachadh agad a shàbhaladh sa bhrabhsair seo. Na gabh dragh, dhearbh thu gun gabh thu pàirt ann ach cha b urrainn dhuinn sin a shàbhaladh sa bhrabhsair seo ri linn duilgheadas teicnigeach.",
"We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):": "Bheir sinn piseach air a bhathar-bhog le taic do bheachdan. Tha dà dhòigh ann airson innse dhuinn mu dhèidhinn na trioblaide seo (gu mì-fhortanach, feumaidh tu cunntas a chruthachadh dhaibh):",
"We just sent an email to {email}": "Tha sinn air post-d a chur gu {email}",
@ -1066,6 +1085,7 @@
"Welcome back!": "Fàilte air ais!",
"Welcome to Mobilizon, {username}!": "Fàilte gu Mobilizon, {username}!",
"What can I do to help?": "Dè nì mi airson cuideachadh?",
"What happened?": "Dè thachair?",
"Wheelchair accessibility": "Inntrigeadh cathrach-cuibhle",
"When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Nuair a chruthaicheas maor a bhuidhinn tachartas le iomruineadh dhan bhuidheann, nochdaidh e an-seo.",
"When the event is private, you'll need to share the link around.": "Nuair a bhios an tachartas prìobhaideach, feumaidh tu fhèin an ceangal a cho-roinneadh.",
@ -1124,7 +1144,9 @@
"You have one event tomorrow.": "Bidh {count} tachartas agad a-màireach| Bidh {count} thachartas agad a-màireach| Bidh {count} tachartasan agad a-màireach| Bidh {count} tachartas agad a-màireach",
"You haven't interacted with other instances yet.": "Cha do rinn thu eadar-ghnìomh le ionstans sam bith eile fhathast.",
"You invited {member}.": "Thug thu cuireadh dha {member}.",
"You may also:": "S urrainn dhut cuideachd:",
"You may clear all participation information for this device with the buttons below.": "S urrainn dhut gach fiosrachadh mun chom-pàirteachadh a shuathadh bàn on uidheam seo leis na putanan gu h-ìosal.",
"You may now close this page or {return_to_the_homepage}.": "S urrainn dhut an duilleag seo a dhùnadh a-nis no {return_to_the_homepage}.",
"You may now close this window, or {return_to_event}.": "S urrainn dhut an uinneag seo a dhùnadh a-nis no {return_to_event}.",
"You may show some members as contacts.": "Faodaidh tu cuid a bhuill a shealltainn nan luchd-aithne.",
"You moved the folder {resource} into {new_path}.": "Ghluais thu am pasgan {resource} gu {new_path}.",
@ -1176,6 +1198,7 @@
"Your email is being changed": "Tha am post-d agad ga atharrachadh",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Cha dèid am post-d agad a chleachdadh ach airson dearbhadh gur e neach a th annad agus airson naidheachdan a chur thugad mun tachartas seo. S ann NACH DÈID a thar-chur gu ionstansan eile no gu eagraiche an tachartais.",
"Your federated identity": "An dearbh-aithne co-naisgte agad",
"Your membership is pending approval": "Tha do bhallrachd a feitheamh ri aontachadh",
"Your membership was approved by {profile}.": "Dhaontaich {profile} gum faigh thu ballrachd.",
"Your participation has been confirmed": "Chaidh an com-pàirteachadh agad a dhearbhadh",
"Your participation has been rejected": "Chaidh an com-pàirteachadh agad a dhiùltadh",
@ -1226,6 +1249,7 @@
"profile@instance": "ainm@ionstans",
"report #{report_number}": "gearan #{report_number}",
"return to the event's page": "till gu duilleag an tachartais",
"return to the homepage": "tilleadh dhan duilleag-dhachaigh",
"terms of service": "teirmichean na seirbheise",
"with another identity…": "le dearbh-aithne eile…",
"your notification settings": "roghainnean nam brathan",

View File

@ -258,10 +258,16 @@
"Previous page": "הדף הקודם",
"Privacy Policy": "מדיניות פרטיות",
"Private event": "אירוע פרטי",
"Private feeds": "היזנים פרטיים",
"Profiles": "פרופילים",
"Public RSS/Atom Feed": "ערוץ RSS/Atom פומבי",
"Public comment moderation": "בקרת תגובות פומביות",
"Public event": "אירוע פומבי",
"Public feeds": "היזנים פומביים",
"Public iCal Feed": "ערוץ iCal פומבי",
"Publish": "פרסום",
"Published events with <b>{comments}</b> comments and <b>{participations}</b> confirmed participations": "אירועים שפורסמו שיש להם <b>{comments}</b> תגובות ו־<b>{participations}</b> אישורי השתתפות",
"RSS/Atom Feed": "היזן רסס/אטום",
"Region": "אזור",
"Registration is allowed, anyone can register.": "ההרשמה מאופשרת, כל אחד.ת יכול.ה להירשם.",
"Registration is closed.": "ההרשמה סגורה.",
@ -272,9 +278,11 @@
"Report": "דיווח",
"Report this comment": "דיווח על תגובה זו",
"Report this event": "דיווח על אירוע זה",
"Reported": "מדווח",
"Reported by": "דווח על־ידי",
"Reported by someone on {domain}": "דווח על־ידי מישהו.י מהאתר {domain}",
"Reported by {reporter}": "דווח על־ידי {reporter}",
"Reported identity": "זהות מדווחת",
"Reports": "דיווחים",
"Reset my password": "איפוס הססמה שלי",
"Resolved": "נפתר",
@ -287,6 +295,7 @@
"Searching…": "מחפש…",
"Send email": "שליחת דוא\"ל",
"Send the report": "שליחת הדיווח",
"Set an URL to a page with your own terms.": "הגדרת קישור לעמוד עם תנאים משלך.",
"Settings": "הגדרות",
"Share this event": "שיתוף אירוע זה",
"Show map": "הצגת מפה",
@ -294,6 +303,8 @@
"Show the time when the event begins": "הצגת זמן תחילת האירוע",
"Show the time when the event ends": "הצגת זמן סיום האירוע",
"Sign up": "הרשמה",
"Starts on…": "מתחיל ב…",
"Status": "מצב",
"Street": "רחוב",
"Tentative: Will be confirmed later": "לא סופי: יאושר בהמשך",
"Terms": "תנאים",
@ -304,5 +315,27 @@
"The event has been created as a draft": "האירוע נוצר כטיוטה",
"The event has been published": "האירוע פורסם",
"The event has been updated": "האירוע עודכן",
"The event has been updated and published": "האירוע עודכן ופורסם"
"The event has been updated and published": "האירוע עודכן ופורסם",
"The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "בקשות השתתפות מאושרות ידנית על־ידי מארגנ.ת האירוע. האם ברצונך להוסיף הערה עם הסבר מדוע את.ה רוצה להשתתף באירוע זה?",
"The event organizer didn't add any description.": "מארגנ.ת האירוע לא הוסיפ.ה תיאור.",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "בקשות השתתפות מאושרות ידנית על־ידי מארגנ.ת האירוע. היות ובחרת להשתתף ללא חשבון, אנא צרפ.י הסבר מדוע את.ה רוצה להשתתף באירוע זה.",
"The event title will be ellipsed.": "כותרת האירוע תוצג באופן מקוצר עם שלוש נקודות בסוף.",
"The page you're looking for doesn't exist.": "העמוד שחיפשת לא קיים.",
"The password was successfully changed": "הססמה שונתה בהצלחה",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "הדיווח יישלח למנהלים.ות של השרת שלך. ניתן להסביר למטה את סיבת הדיווח של תוכן זה.",
"The {default_terms} will be used. They will be translated in the user's language.": "ייעשה שימוש ב{default_terms}. הם יתורגמו לשפה של המשתמש.ת.",
"There are {participants} participants.": "יש {participants} משתתפים.ות.",
"There will be no way to recover your data.": "לא תהיה אפשרות לשחזר את המידע שלך.",
"These events may interest you": "האירועים האלה עשויים לעניין אותך",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "שרת מוביליזון זה ואירוע זה מאפשרים בקשת השתתפות ללא חשבון, אך נדרש אימות באמצעות דואר אלקטרוני.",
"This information is saved only on your computer. Click for details": "מידע זה נשמר רק על המחשב שלך. לפרטים לחצ.י",
"This instance isn't opened to registrations, but you can register on other instances.": "שרת זה אינו פתוח להרשמה, אך ניתן להירשם בשרתים אחרים.",
"This is a demonstration site to test Mobilizon.": "זהו אתר הדגמה לצורך בדיקה של מוביליזון.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "הדבר ימחק / יהפוך לאנונימי את כל התוכן (אירועים, תגובות, הודעות, אישורי השתתפות…) שנוצר מתוך זהות זו.",
"Title": "כותרת",
"To confirm, type your event title \"{eventTitle}\"": "לאישור, נא להזין את כותרת האירוע \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "לאישור, נא להזין את שם המשתמש.ת שלך \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "העברה לשרת {outsideDomain}",
"Type": "סוג",
"URL": "קישור"
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,50 @@
import {
IAnalyticsConfig,
IConfig,
IKeyValueConfig,
} from "@/types/config.model";
export const statistics = async (config: IConfig, environement: any) => {
console.debug("Loading statistics", config.analytics);
const matomoConfig = checkProviderConfig(config, "matomo");
if (matomoConfig?.enabled === true) {
const { matomo } = (await import("./matomo")) as any;
matomo(environement, convertConfig(matomoConfig.configuration));
}
const sentryConfig = checkProviderConfig(config, "sentry");
if (sentryConfig?.enabled === true) {
const { sentry } = (await import("./sentry")) as any;
sentry(environement, convertConfig(sentryConfig.configuration));
}
};
export const checkProviderConfig = (
config: IConfig,
providerName: string
): IAnalyticsConfig | undefined => {
return config?.analytics?.find((provider) => provider.id === providerName);
};
export const convertConfig = (
configs: IKeyValueConfig[]
): Record<string, any> => {
return configs.reduce((acc, config) => {
acc[config.key] = toType(config.value, config.type);
return acc;
}, {} as Record<string, any>);
};
const toType = (value: string, type: string): string | number | boolean => {
switch (type) {
case "boolean":
return value === "true";
case "integer":
return parseInt(value, 10);
case "float":
return parseFloat(value);
case "string":
default:
return value;
}
};

View File

@ -0,0 +1,14 @@
import Vue from "vue";
import VueMatomo from "vue-matomo";
export const matomo = (environment: any, matomoConfiguration: any) => {
console.debug("Loading Matomo statistics");
console.debug(
"Calling VueMatomo with the following configuration",
matomoConfiguration
);
Vue.use(VueMatomo, {
...matomoConfiguration,
router: environment.router,
});
};

View File

@ -0,0 +1,11 @@
import VueRouter from "vue-router";
import Vue from "vue";
import { VuePlausible } from "vue-plausible";
export default (router: VueRouter, plausibleConfiguration: any) => {
console.debug("Loading Plausible statistics");
Vue.use(VuePlausible, {
// see configuration section
...plausibleConfiguration,
});
};

View File

@ -0,0 +1,54 @@
import Vue from "vue";
import * as Sentry from "@sentry/vue";
import { Integrations } from "@sentry/tracing";
export const sentry = (environment: any, sentryConfiguration: any) => {
console.debug("Loading Sentry statistics");
console.debug(
"Calling Sentry with the following configuration",
sentryConfiguration
);
// Don't attach errors to previous events
window.sessionStorage.removeItem("lastEventId");
Sentry.init({
Vue,
dsn: sentryConfiguration.dsn,
integrations: [
new Integrations.BrowserTracing({
routingInstrumentation: Sentry.vueRouterInstrumentation(
environment.router
),
tracingOrigins: ["localhost", "mobilizon1.com", /^\//],
}),
],
beforeSend(event) {
// Check if it is an exception, and if so, save it in session storage
// so that it can be retreived from the error component
if (event.exception && event.event_id) {
window.sessionStorage.setItem("lastEventId", event.event_id);
}
return event;
},
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for performance monitoring.
// We recommend adjusting this value in production
tracesSampleRate: sentryConfiguration.tracesSampleRate,
release: environment.version,
});
};
export const submitFeedback = async (
endpoint: string,
dsn: string,
params: Record<string, string>
): Promise<void> => {
await fetch(endpoint, {
method: "POST",
headers: {
"Content-type": "application/json",
Authorization: `DSN ${dsn}`,
},
body: JSON.stringify(params),
});
};

View File

@ -68,7 +68,7 @@ export function usernameWithDomain(actor: IActor, force = false): string {
}
export function displayName(actor: IActor): string {
return actor.name != null && actor.name !== ""
return actor && actor.name != null && actor.name !== ""
? actor.name
: usernameWithDomain(actor);
}

View File

@ -65,80 +65,93 @@ export class Address implements IAddress {
}
get poiInfos(): IPoiInfo {
/* generate name corresponding to poi type */
let name = "";
let alternativeName = "";
let poiIcon: IPOIIcon = poiIcons.default;
// Google Maps doesn't have a type
if (this.type == null && this.description === this.street) {
this.type = "house";
}
switch (this.type) {
case "house":
name = this.description;
alternativeName = [this.postalCode, this.locality, this.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultAddress;
break;
case "street":
case "secondary":
name = this.description;
alternativeName = [this.postalCode, this.locality, this.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultStreet;
break;
case "zone":
case "city":
case "administrative":
name = this.postalCode
? `${this.description} (${this.postalCode})`
: this.description;
alternativeName = [this.region, this.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultAdministrative;
break;
default:
// POI
name = this.description;
alternativeName = "";
if (this.street && this.street.trim()) {
alternativeName = `${this.street}`;
if (this.locality) {
alternativeName += ` (${this.locality})`;
}
} else if (this.locality && this.locality.trim()) {
alternativeName = `${this.locality}, ${this.region}, ${this.country}`;
} else if (this.region && this.region.trim()) {
alternativeName = `${this.region}, ${this.country}`;
} else if (this.country && this.country.trim()) {
alternativeName = this.country;
}
poiIcon = this.iconForPOI;
break;
}
return { name, alternativeName, poiIcon };
return addressToPoiInfos(this);
}
get fullName(): string {
const { name, alternativeName } = this.poiInfos;
if (name && alternativeName) {
return `${name}, ${alternativeName}`;
}
if (name) {
return name;
}
return "";
return addressFullName(this);
}
get iconForPOI(): IPOIIcon {
if (this.type == null) {
return poiIcons.default;
}
const type = this.type.split(":").pop() || "";
if (poiIcons[type]) return poiIcons[type];
return poiIcons.default;
return iconForAddress(this);
}
}
export function addressToPoiInfos(address: IAddress): IPoiInfo {
/* generate name corresponding to poi type */
let name = "";
let alternativeName = "";
let poiIcon: IPOIIcon = poiIcons.default;
let addressType = address.type;
// Google Maps doesn't have a type
if (address.type == null && address.description === address.street) {
addressType = "house";
}
switch (addressType) {
case "house":
name = address.description;
alternativeName = [address.postalCode, address.locality, address.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultAddress;
break;
case "street":
case "secondary":
name = address.description;
alternativeName = [address.postalCode, address.locality, address.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultStreet;
break;
case "zone":
case "city":
case "administrative":
name = address.postalCode
? `${address.description} (${address.postalCode})`
: address.description;
alternativeName = [address.region, address.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultAdministrative;
break;
default:
// POI
name = address.description;
alternativeName = "";
if (address.street && address.street.trim()) {
alternativeName = `${address.street}`;
if (address.locality) {
alternativeName += ` (${address.locality})`;
}
} else if (address.locality && address.locality.trim()) {
alternativeName = `${address.locality}, ${address.region}, ${address.country}`;
} else if (address.region && address.region.trim()) {
alternativeName = `${address.region}, ${address.country}`;
} else if (address.country && address.country.trim()) {
alternativeName = address.country;
}
poiIcon = iconForAddress(address);
break;
}
return { name, alternativeName, poiIcon };
}
export function iconForAddress(address: IAddress): IPOIIcon {
if (address.type == null) {
return poiIcons.default;
}
const type = address.type.split(":").pop() || "";
if (poiIcons[type]) return poiIcons[type];
return poiIcons.default;
}
export function addressFullName(address: IAddress): string {
const { name, alternativeName } = addressToPoiInfos(address);
if (name && alternativeName) {
return `${name}, ${alternativeName}`;
}
if (name) {
return name;
}
return "";
}

View File

@ -0,0 +1,7 @@
export interface ISentryConfiguration {
dsn: string;
organization?: string;
project?: string;
host?: string;
tracesSampleRate: number;
}

View File

@ -6,6 +6,18 @@ export interface IOAuthProvider {
label: string;
}
export interface IKeyValueConfig {
key: string;
value: string;
type: "boolean" | "integer" | "string";
}
export interface IAnalyticsConfig {
id: string;
enabled: boolean;
configuration: IKeyValueConfig[];
}
export interface IConfig {
name: string;
description: string;
@ -83,7 +95,6 @@ export interface IConfig {
features: {
eventCreation: boolean;
groups: boolean;
koenaConnect: boolean;
};
restrictions: {
onlyAdminCanCreateGroups: boolean;
@ -110,4 +121,5 @@ export interface IConfig {
exportFormats: {
eventParticipants: string[];
};
analytics: IAnalyticsConfig[];
}

View File

@ -3,6 +3,7 @@ import { InstanceFollowStatus } from "./enums";
export interface IInstance {
domain: string;
hasRelay: boolean;
relayAddress: string | null;
followerStatus: InstanceFollowStatus;
followedStatus: InstanceFollowStatus;
personCount: number;

1
js/src/typings/matomo.d.ts vendored Normal file
View File

@ -0,0 +1 @@
declare module "vue-matomo";

View File

@ -140,4 +140,5 @@ export const SELECTED_PROVIDERS: { [key: string]: string } = {
google: "Google",
keycloak: "Keycloak",
ldap: "LDAP",
cas: "CAS",
};

View File

@ -1,14 +1,7 @@
@import "~bulma/sass/utilities/functions.sass";
@import "~bulma/sass/utilities/initial-variables.sass";
@import "~bulma/sass/utilities/derived-variables.sass";
// chapril colors
$chapril_blue: #2e5281;
$chapril_blue_light: #bcd0e5;
$white: mix(#fff, #bcd0e5);
$whitest: #fff;
$chapril_orange: #ff5e00;
$chapril_grey: #5f5f5f;
// other
$bleuvert: #1e7d97;
$jaune: #ffd599;
$violet: #424056;
@ -27,45 +20,44 @@ $violet-3: #3c376e;
/**
* Borders
*/
$borders: mix($chapril_blue, #d7d6de);
$backgrounds: mix($chapril_blue, #ecebf2);
$borders: #d7d6de;
$backgrounds: #ecebf2;
/**
* Text
*/
$purple-1: mix($chapril_blue, #757199);
$purple-1: #757199;
/**
* Background
*/
$purple-2: mix($chapril_blue, #cdcaea);
$purple-3: mix($chapril_blue, #e6e4f4);
$purple-2: #cdcaea;
$purple-3: #e6e4f4;
$orange-2: mix($chapril_blue, #ed8d07);
$orange-3: mix($chapril_blue, #d35204);
$orange-2: #ed8d07;
$orange-3: #d35204;
$yellow-1: mix($chapril_blue, #fff1e8);
$yellow-2: mix($chapril_blue, #fff1de);
$yellow-3: mix($chapril_blue, #fff8f6);
$yellow-4: mix($chapril_blue, #b4f0ff);
$yellow-1: #ffd599;
$yellow-2: #fff1de;
$yellow-3: #fbd5cb;
$yellow-4: #f7ba30;
$primary: $chapril_blue;
$primary: $bleuvert;
$primary-invert: findColorInvert($primary);
$secondary: lighten($chapril_blue, 20%);
$secondary: $jaune;
$secondary-invert: findColorInvert($secondary);
$background-color: mix($chapril_blue, $violet-2);
$background-color-darker: darken($background-color, 10%);
$background-color: $violet-2;
$success: mix($chapril_blue, #0d8758);
$success: #0d8758;
$success-invert: findColorInvert($success);
$info: mix($chapril_blue, #36bcd4);
$info: #36bcd4;
$info-invert: findColorInvert($info);
$danger: mix($chapril_blue, #cd2026);
$danger: #cd2026;
$danger-invert: findColorInvert($danger);
$link: $primary;
$link-invert: $primary-invert;
$text: mix($chapril_blue, $violet-1);
$text: $violet-1;
$grey: #757575;
$colors: map-merge(
@ -109,14 +101,18 @@ $navbar-height: 4rem;
// Footer
$footer-padding: 3rem 1.5rem 1rem;
$footer-background-color: $violet-2;
$footer-text-color: mix(#000, $violet-2);
$footer-background-color: $background-color;
$body-background-color: mix($chapril_blue, #efeef4);
$body-background-color: #efeef4;
$fullhd-enabled: false;
$hero-body-padding-medium: 6rem 1.5rem;
$title-color: $chapril_blue;
main > .container {
background: $body-background-color;
min-height: 70vh;
}
$title-color: #3c376e;
$title-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial,
serif;
$title-weight: 700;
@ -124,7 +120,7 @@ $title-size: 40px;
$title-sub-size: 45px;
$title-sup-size: 30px;
$subtitle-color: $chapril_grey;
$subtitle-color: #3a384c;
$subtitle-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial,
serif;
$subtitle-weight: 400;
@ -142,7 +138,7 @@ $subtitle-sup-size: 15px;
//$input-border-color: #dbdbdb;
$breadcrumb-item-color: $primary;
$checkbox-background-color: #fff;
$title-color: $chapril_blue;
$title-color: $violet-3;
:root {
--color-primary: 30 125 151;

View File

@ -4,7 +4,7 @@
<p class="modal-card-title">{{ $t("Pick an identity") }}</p>
</header>
<section class="modal-card-body">
<div class="list is-hoverable">
<div class="list is-hoverable list-none">
<a
class="list-item"
v-for="identity in identities"
@ -12,7 +12,7 @@
:class="{
'is-active': currentIdentity && identity.id === currentIdentity.id,
}"
@click="changeCurrentIdentity(identity)"
@click="currentIdentity = identity"
>
<div class="media">
<img
@ -60,10 +60,11 @@ export default class IdentityPicker extends Vue {
identities: IActor[] = [];
currentIdentity: IActor = this.value;
get currentIdentity(): IActor {
return this.value;
}
changeCurrentIdentity(identity: IActor): void {
this.currentIdentity = identity;
set currentIdentity(identity: IActor) {
this.$emit("input", identity);
}
}

View File

@ -1,160 +0,0 @@
<template>
<section class="container">
<div v-if="person">
<div class="card-image" v-if="person.banner">
<figure class="image">
<img :src="person.banner.url" />
</figure>
</div>
<div class="card-content">
<div class="media">
<div class="media-left">
<figure class="image is-48x48" v-if="person.avatar">
<img :src="person.avatar.url" />
</figure>
</div>
<div class="media-content">
<p class="title">{{ person.name }}</p>
<p class="subtitle">@{{ person.preferredUsername }}</p>
</div>
</div>
<div class="content">
<vue-simple-markdown :source="person.summary"></vue-simple-markdown>
</div>
<b-dropdown hoverable has-link aria-role="list">
<button class="button is-primary" slot="trigger">
{{ $t("Public feeds") }}
<b-icon icon="menu-down"></b-icon>
</button>
<b-dropdown-item aria-role="listitem">
<a :href="feedUrls('atom', true)">
{{ $t("Public RSS/Atom Feed") }}
</a>
</b-dropdown-item>
<b-dropdown-item aria-role="listitem">
<a :href="feedUrls('ics', true)">
{{ $t("Public iCal Feed") }}
</a>
</b-dropdown-item>
</b-dropdown>
<b-dropdown
hoverable
has-link
aria-role="list"
v-if="person.feedTokens.length > 0"
>
<button class="button is-info" slot="trigger">
{{ $t("Private feeds") }}
<b-icon icon="menu-down"></b-icon>
</button>
<b-dropdown-item aria-role="listitem">
<a :href="feedUrls('atom', false)">
{{ $t("RSS/Atom Feed") }}
</a>
</b-dropdown-item>
<b-dropdown-item aria-role="listitem">
<a :href="feedUrls('ics', false)">
{{ $t("iCal Feed") }}
</a>
</b-dropdown-item>
</b-dropdown>
<a
class="button"
v-if="currentActor.id === person.id"
@click="createToken"
>
{{ $t("Create token") }}
</a>
</div>
<section v-if="person.organizedEvents.length > 0">
<h2 class="subtitle">
{{ $t("Organized") }}
</h2>
<div class="columns">
<EventCard
v-for="event in person.organizedEvents"
:event="event"
:options="{ hideDetails: true, organizerActor: person }"
:key="event.uuid"
class="column is-one-third"
/>
</div>
<div class="field is-grouped">
<p class="control">
<a
class="button"
@click="deleteProfile()"
v-if="currentActor && currentActor.id === person.id"
>
{{ $t("Delete") }}
</a>
</p>
</div>
</section>
</div>
</section>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import EventCard from "@/components/Event/EventCard.vue";
import { FETCH_PERSON, CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
import { MOBILIZON_INSTANCE_HOST } from "../../api/_entrypoint";
import { IPerson } from "../../types/actor";
import { CREATE_FEED_TOKEN_ACTOR } from "../../graphql/feed_tokens";
@Component({
apollo: {
person: {
query: FETCH_PERSON,
variables() {
return {
username: this.$route.params.name,
};
},
},
currentActor: {
query: CURRENT_ACTOR_CLIENT,
},
},
components: {
EventCard,
},
metaInfo() {
return {
title: this.$t("Profile") as string,
};
},
})
export default class Profile extends Vue {
@Prop({ type: String, required: true }) name!: string;
person!: IPerson;
currentActor!: IPerson;
feedUrls(format: "ics" | "webcal:" | "atom", isPublic = true): string {
let url = format === "ics" ? "webcal:" : "";
url += `//${MOBILIZON_INSTANCE_HOST}/`;
if (isPublic === true) {
url += `@${this.person.preferredUsername}/feed/`;
} else {
url += `events/going/${this.person.feedTokens[0].token}/`;
}
return url + (format === "ics" ? "ics" : "atom");
}
async createToken(): Promise<void> {
const { data } = await this.$apollo.mutate({
mutation: CREATE_FEED_TOKEN_ACTOR,
variables: { actor_id: this.person.id },
});
this.person.feedTokens.push(data);
}
}
</script>

View File

@ -14,8 +14,8 @@
},
]"
/>
<div class="actor-card">
<p v-if="group.suspended">
<div>
<p v-if="group.suspended" class="mx-auto max-w-sm block mb-2">
<actor-card
:actor="group"
:full="true"
@ -24,6 +24,7 @@
/>
</p>
<router-link
class="mx-auto max-w-sm block mb-2"
v-else
:to="{
name: RouteName.GROUP,
@ -572,16 +573,3 @@ export default class AdminGroupProfile extends Vue {
}
}
</script>
<style lang="scss" scoped>
table,
section {
margin: 2rem 0;
}
.actor-card {
background: #fff;
padding: 1.5rem;
border-radius: 10px;
}
</style>

View File

@ -95,7 +95,7 @@
>
<b-button
size="is-small"
v-if="!user.confirmedAt || !user.disabled"
v-if="!user.confirmedAt || user.disabled"
@click="isConfirmationModalActive = true"
type="is-text"
icon-left="check"

View File

@ -8,7 +8,9 @@
]"
/>
<h1 class="text-2xl">{{ instance.domain }}</h1>
<div class="grid md:grid-cols-4 gap-2 content-center text-center mt-2">
<div
class="grid md:grid-cols-2 xl:grid-cols-4 gap-2 content-center text-center mt-2"
>
<div class="bg-gray-50 rounded-xl p-8">
<router-link
:to="{
@ -64,8 +66,11 @@
<span class="text-sm block">{{ $t("Uploaded media size") }}</span>
</div>
</div>
<div class="mt-3 grid md:grid-cols-2 gap-4" v-if="instance.hasRelay">
<div class="border bg-white p-6 shadow-md rounded-md">
<div class="mt-3 grid xl:grid-cols-2 gap-4">
<div
class="border bg-white p-6 shadow-md rounded-md"
v-if="instance.hasRelay"
>
<button
@click="removeInstanceFollow"
v-if="instance.followedStatus == InstanceFollowStatus.APPROVED"
@ -88,7 +93,10 @@
{{ $t("Follow instance") }}
</button>
</div>
<div class="border bg-white p-6 shadow-md rounded-md">
<div v-else class="md:h-48 py-16 text-center opacity-50">
{{ $t("Only Mobilizon instances can be followed") }}
</div>
<div class="border bg-white p-6 shadow-md rounded-md flex flex-col gap-2">
<button
@click="acceptInstance"
v-if="instance.followerStatus == InstanceFollowStatus.PENDING"
@ -98,19 +106,16 @@
</button>
<button
@click="rejectInstance"
v-else-if="instance.followerStatus != InstanceFollowStatus.NONE"
v-if="instance.followerStatus != InstanceFollowStatus.NONE"
class="bg-red-700 hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2 focus:ring-offset-gray-50 text-white hover:text-white font-semibold h-12 px-6 rounded-lg w-full flex items-center justify-center sm:w-auto"
>
{{ $t("Reject follow") }}
</button>
<p v-else>
<p v-if="instance.followerStatus == InstanceFollowStatus.NONE">
{{ $t("This instance doesn't follow yours.") }}
</p>
</div>
</div>
<div v-else class="md:h-48 py-16 text-center opacity-50">
{{ $t("Only Mobilizon instances can be followed") }}
</div>
</div>
</template>
<script lang="ts">
@ -124,7 +129,6 @@ import {
import { Component, Prop, Vue } from "vue-property-decorator";
import { formatBytes } from "@/utils/datetime";
import RouteName from "@/router/name";
import { SnackbarProgrammatic as Snackbar } from "buefy";
import { IInstance } from "@/types/instance.model";
import { ApolloCache, gql, Reference } from "@apollo/client/core";
import { InstanceFollowStatus } from "@/types/enums";
@ -154,38 +158,61 @@ export default class Instance extends Vue {
async acceptInstance(): Promise<void> {
try {
const { instance } = this;
await this.$apollo.mutate({
mutation: ACCEPT_RELAY,
variables: {
address: `relay@${this.domain}`,
address: this.instance.relayAddress,
},
update(cache: ApolloCache<any>) {
cache.writeFragment({
id: cache.identify(instance as unknown as Reference),
fragment: gql`
fragment InstanceFollowerStatus on Instance {
followerStatus
}
`,
data: {
followerStatus: InstanceFollowStatus.APPROVED,
},
});
},
});
} catch (e: any) {
if (e.message) {
Snackbar.open({
message: e.message,
type: "is-danger",
position: "is-bottom",
});
} catch (error: any) {
if (error.graphQLErrors && error.graphQLErrors.length > 0) {
this.$notifier.error(error.graphQLErrors[0].message);
}
}
}
/**
* Reject instance follow
*/
async rejectInstance(): Promise<void> {
try {
const { instance } = this;
await this.$apollo.mutate({
mutation: REJECT_RELAY,
variables: {
address: `relay@${this.domain}`,
address: this.instance.relayAddress,
},
update(cache: ApolloCache<any>) {
cache.writeFragment({
id: cache.identify(instance as unknown as Reference),
fragment: gql`
fragment InstanceFollowerStatus on Instance {
followerStatus
}
`,
data: {
followerStatus: InstanceFollowStatus.NONE,
},
});
},
});
} catch (e: any) {
if (e.message) {
Snackbar.open({
message: e.message,
type: "is-danger",
position: "is-bottom",
});
} catch (error: any) {
if (error.graphQLErrors && error.graphQLErrors.length > 0) {
this.$notifier.error(error.graphQLErrors[0].message);
}
}
}
@ -199,24 +226,23 @@ export default class Instance extends Vue {
domain: this.domain,
},
});
} catch (err: any) {
if (err.message) {
Snackbar.open({
message: err.message,
type: "is-danger",
position: "is-bottom",
});
} catch (error: any) {
if (error.graphQLErrors && error.graphQLErrors.length > 0) {
this.$notifier.error(error.graphQLErrors[0].message);
}
}
}
/**
* Stop following instance
*/
async removeInstanceFollow(): Promise<void> {
const { instance } = this;
try {
await this.$apollo.mutate({
mutation: REMOVE_RELAY,
variables: {
address: `relay@${this.domain}`,
address: this.instance.relayAddress,
},
update(cache: ApolloCache<any>) {
cache.writeFragment({
@ -232,13 +258,9 @@ export default class Instance extends Vue {
});
},
});
} catch (e: any) {
if (e.message) {
Snackbar.open({
message: e.message,
type: "is-danger",
position: "is-bottom",
});
} catch (error: any) {
if (error.graphQLErrors && error.graphQLErrors.length > 0) {
this.$notifier.error(error.graphQLErrors[0].message);
}
}
}

View File

@ -21,6 +21,11 @@
<b-button type="is-primary" native-type="submit">{{
$t("Add an instance")
}}</b-button>
<b-loading
:is-full-page="true"
v-model="followInstanceLoading"
:can-cancel="false"
/>
</p>
</b-field>
</b-field>
@ -124,6 +129,17 @@
</p>
</div>
</router-link>
<b-pagination
v-show="instances.total > INSTANCES_PAGE_LIMIT"
:total="instances.total"
v-model="instancePage"
:per-page="INSTANCES_PAGE_LIMIT"
:aria-next-label="$t('Next page')"
:aria-previous-label="$t('Previous page')"
:aria-page-label="$t('Page')"
:aria-current-label="$t('Current page')"
>
</b-pagination>
</div>
<div v-else-if="instances && instances.elements.length == 0">
<empty-content icon="lan-disconnect" :inline="true">
@ -160,9 +176,10 @@ import {
InstanceFilterFollowStatus,
InstanceFollowStatus,
} from "@/types/enums";
import { SnackbarProgrammatic as Snackbar } from "buefy";
const { isNavigationFailure, NavigationFailureType } = VueRouter;
const INSTANCES_PAGE_LIMIT = 10;
@Component({
apollo: {
instances: {
@ -171,7 +188,7 @@ const { isNavigationFailure, NavigationFailureType } = VueRouter;
variables() {
return {
page: this.instancePage,
limit: 10,
limit: INSTANCES_PAGE_LIMIT,
filterDomain: this.filterDomain,
filterFollowStatus: this.followStatus,
};
@ -190,6 +207,8 @@ const { isNavigationFailure, NavigationFailureType } = VueRouter;
export default class Follows extends Vue {
RouteName = RouteName;
followInstanceLoading = false;
newRelayAddress = "";
instances!: Paginate<IInstance>;
@ -204,6 +223,8 @@ export default class Follows extends Vue {
InstanceFollowStatus = InstanceFollowStatus;
INSTANCES_PAGE_LIMIT = INSTANCES_PAGE_LIMIT;
data(): Record<string, unknown> {
return {
debouncedUpdateDomainFilter: debounce(this.updateDomainFilter, 500),
@ -242,6 +263,7 @@ export default class Follows extends Vue {
async followInstance(e: Event): Promise<void> {
e.preventDefault();
this.followInstanceLoading = true;
const domain = this.newRelayAddress.trim(); // trim to fix copy and paste domain name spaces and tabs
try {
await this.$apollo.mutate<{ relayFollowings: Paginate<IFollower> }>({
@ -251,18 +273,18 @@ export default class Follows extends Vue {
},
});
this.newRelayAddress = "";
this.followInstanceLoading = false;
this.$router.push({
name: RouteName.INSTANCE,
params: { domain },
});
} catch (err: any) {
if (err.message) {
Snackbar.open({
message: err.message,
type: "is-danger",
position: "is-bottom",
});
} catch (error: any) {
if (error.message) {
if (error.graphQLErrors && error.graphQLErrors.length > 0) {
this.$notifier.error(error.graphQLErrors[0].message);
}
}
this.followInstanceLoading = false;
}
}

View File

@ -615,6 +615,7 @@ import {
EventJoinOptions,
EventStatus,
EventVisibility,
GroupVisibility,
MemberRole,
ParticipantRole,
} from "@/types/enums";
@ -638,6 +639,7 @@ import {
LOGGED_USER_DRAFTS,
PERSON_STATUS_GROUP,
} from "../../graphql/actor";
import { FETCH_GROUP } from "../../graphql/group";
import {
displayNameAndUsername,
IActor,
@ -718,6 +720,21 @@ const DEFAULT_LIMIT_NUMBER_OF_PLACES = 10;
);
},
},
group: {
query: FETCH_GROUP,
fetchPolicy: "cache-and-network",
variables() {
return {
name: this.event?.attributedTo?.preferredUsername,
};
},
skip() {
return (
!this.event?.attributedTo ||
!this.event?.attributedTo?.preferredUsername
);
},
},
},
metaInfo() {
return {
@ -736,6 +753,8 @@ export default class EditEvent extends Vue {
@Prop({ type: Boolean, default: false }) isDuplicate!: boolean;
group!: IGroup;
currentActor!: IActor;
loggedUser!: IUser;
@ -781,6 +800,16 @@ export default class EditEvent extends Vue {
}
}
@Watch("group")
updateEventVisibility(group: IGroup): void {
if (!this.isUpdate && group.visibility == GroupVisibility.UNLISTED) {
this.event.visibility = EventVisibility.UNLISTED;
}
if (!this.isUpdate && group.visibility == GroupVisibility.PUBLIC) {
this.event.visibility = EventVisibility.PUBLIC;
}
}
private initializeEvent() {
const roundUpTo15Minutes = (time: Date) => {
time.setMilliseconds(Math.round(time.getMilliseconds() / 1000) * 1000);

View File

@ -24,10 +24,14 @@
:actor="event.organizerActor"
:inline="true"
>
<i18n path="By {username}" dir="auto">
<span dir="ltr" slot="username"
>@{{ usernameWithDomain(event.organizerActor) }}</span
>
<i18n
path="By {username}"
dir="auto"
class="block truncate max-w-xs md:max-w-sm"
>
<span dir="ltr" slot="username">{{
displayName(event.organizerActor)
}}</span>
</i18n>
</popover-actor-card>
</div>
@ -36,9 +40,23 @@
:actor="event.attributedTo"
:inline="true"
>
<i18n path="By {group}" dir="auto">
<span dir="ltr" slot="group"
>@{{ usernameWithDomain(event.attributedTo) }}</span
<i18n
path="By {group}"
dir="auto"
class="block truncate max-w-xs md:max-w-sm"
>
<router-link
:to="{
name: RouteName.GROUP,
params: {
preferredUsername: usernameWithDomain(
event.attributedTo
),
},
}"
dir="ltr"
slot="group"
>{{ displayName(event.attributedTo) }}</router-link
>
</i18n>
</popover-actor-card>
@ -474,7 +492,13 @@ import {
} from "../../graphql/event";
import { CURRENT_ACTOR_CLIENT, PERSON_STATUS_GROUP } from "../../graphql/actor";
import { EventModel, IEvent } from "../../types/event.model";
import { IActor, IPerson, Person, usernameWithDomain } from "../../types/actor";
import {
displayName,
IActor,
IPerson,
Person,
usernameWithDomain,
} from "../../types/actor";
import { GRAPHQL_API_ENDPOINT } from "../../api/_entrypoint";
import DateCalendarIcon from "../../components/Event/DateCalendarIcon.vue";
import MultiCard from "../../components/Event/MultiCard.vue";
@ -659,6 +683,8 @@ export default class Event extends EventMixin {
usernameWithDomain = usernameWithDomain;
displayName = displayName;
RouteName = RouteName;
observer!: IntersectionObserver;

View File

@ -18,7 +18,7 @@
<h1 class="title" v-if="group">
{{
$t("{group}'s events", {
group: group.name || group.preferredUsername,
group: displayName(group),
})
}}
</h1>
@ -43,23 +43,42 @@
<subtitle>
{{ showPassedEvents ? $t("Past events") : $t("Upcoming events") }}
</subtitle>
<b-switch v-model="showPassedEvents">{{ $t("Past events") }}</b-switch>
<b-switch class="mb-4" v-model="showPassedEvents">{{
$t("Past events")
}}</b-switch>
<grouped-multi-event-minimalist-card
:events="group.organizedEvents.elements"
:isCurrentActorMember="isCurrentActorMember"
/>
<b-message
<empty-content
v-if="
group.organizedEvents.elements.length === 0 &&
$apollo.loading === false
"
type="is-danger"
icon="calendar"
:inline="true"
:center="true"
>
{{ $t("No events found") }}
</b-message>
<template v-if="group.domain !== null">
<div class="mt-4">
<p>
{{
$t(
"This group is a remote group, it's possible the original instance has more informations."
)
}}
</p>
<b-button type="is-text" tag="a" :href="group.url">
{{ $t("View the group profile on the original instance") }}
</b-button>
</div>
</template>
</empty-content>
<b-pagination
class="mt-4"
:total="group.organizedEvents.total"
v-model="eventsPage"
v-model="page"
:per-page="EVENTS_PAGE_LIMIT"
:aria-next-label="$t('Next page')"
:aria-previous-label="$t('Previous page')"
@ -72,16 +91,15 @@
</div>
</template>
<script lang="ts">
import { Component } from "vue-property-decorator";
import { mixins } from "vue-class-component";
import { Component, Vue } from "vue-property-decorator";
import RouteName from "@/router/name";
import Subtitle from "@/components/Utils/Subtitle.vue";
import GroupedMultiEventMinimalistCard from "@/components/Event/GroupedMultiEventMinimalistCard.vue";
import { PERSON_MEMBERSHIPS } from "@/graphql/actor";
import GroupMixin from "@/mixins/group";
import { IMember } from "@/types/actor/member.model";
import { FETCH_GROUP_EVENTS } from "@/graphql/event";
import { displayName, usernameWithDomain } from "../../types/actor";
import EmptyContent from "../../components/Utils/EmptyContent.vue";
import { displayName, IGroup, usernameWithDomain } from "../../types/actor";
const EVENTS_PAGE_LIMIT = 10;
@ -107,13 +125,15 @@ const EVENTS_PAGE_LIMIT = 10;
name: this.$route.params.preferredUsername,
beforeDateTime: this.showPassedEvents ? new Date() : null,
afterDateTime: this.showPassedEvents ? null : new Date(),
organisedEventsPage: this.eventsPage,
organisedEventsPage: this.page,
organisedEventsLimit: EVENTS_PAGE_LIMIT,
};
},
update: (data) => data.group,
},
},
components: {
EmptyContent,
Subtitle,
GroupedMultiEventMinimalistCard,
},
@ -123,15 +143,27 @@ const EVENTS_PAGE_LIMIT = 10;
const { group } = this;
return {
title: this.$t("{group} events", {
group: group?.name || usernameWithDomain(group),
group: displayName(group),
}) as string,
};
},
})
export default class GroupEvents extends mixins(GroupMixin) {
export default class GroupEvents extends Vue {
group!: IGroup;
memberships!: IMember[];
eventsPage = 1;
get page(): number {
return parseInt((this.$route.query.page as string) || "1", 10);
}
set page(page: number) {
this.$router.push({
name: RouteName.GROUP_EVENTS,
query: { ...this.$route.query, page: page.toString() },
});
this.$apollo.queries.group.refetch();
}
usernameWithDomain = usernameWithDomain;
@ -149,14 +181,11 @@ export default class GroupEvents extends mixins(GroupMixin) {
}
get showPassedEvents(): boolean {
return (
this.$route.query.future !== undefined &&
this.$route.query.future.toString() === "false"
);
return this.$route.query.future === "false";
}
set showPassedEvents(value: boolean) {
this.$router.push({ query: { future: this.showPassedEvents.toString() } });
this.$router.replace({ query: { future: (!value).toString() } });
}
}
</script>

View File

@ -27,11 +27,11 @@
<div class="title-container">
<h1 v-if="group.name">{{ group.name }}</h1>
<b-skeleton v-else :animated="true" />
<small
<span
dir="ltr"
class="has-text-grey-dark"
v-if="group.preferredUsername"
>@{{ usernameWithDomain(group) }}</small
>@{{ usernameWithDomain(group) }}</span
>
<b-skeleton v-else :animated="true" />
<br />
@ -78,7 +78,7 @@
>
</p>
</div>
<div class="buttons">
<div class="flex gap-2">
<b-button
outlined
icon-left="timeline-text"
@ -101,78 +101,123 @@
}"
>{{ $t("Group settings") }}</b-button
>
<b-tooltip
v-if="
(!isCurrentActorAGroupMember || previewPublic) &&
group.openness === Openness.INVITE_ONLY
"
:label="$t('This group is invite-only')"
position="is-bottom"
>
<b-button disabled type="is-primary">{{
$t("Join group")
}}</b-button></b-tooltip
>
<b-button
v-else-if="
((!isCurrentActorAGroupMember &&
!isCurrentActorAPendingGroupMember) ||
previewPublic) &&
currentActor.id
"
@click="joinGroup"
@keyup.enter="joinGroup"
type="is-primary"
:disabled="previewPublic"
>{{ $t("Join group") }}</b-button
<b-dropdown
aria-role="list"
trap-focus
v-show="showJoinButton && showFollowButton"
>
<template #trigger>
<b-button
:label="$t('Follow')"
type="is-primary"
icon-left="rss"
icon-right="menu-down"
/>
</template>
<b-dropdown-item
aria-role="listitem"
class="p-0"
custom
:focusable="false"
:disabled="
isCurrentActorPendingFollow && currentActor.id !== undefined
"
>
<button class="media py-4 px-2 w-full" @click="followGroup">
<b-icon class="media-left" icon="rss" />
<div class="media-content">
<h3 class="font-medium text-lg">{{ $t("Follow") }}</h3>
<p class="whitespace-normal md:whitespace-nowrap text-sm">
{{ $t("Get informed of the upcoming public events") }}
</p>
<p
v-if="
doesGroupManuallyApprovesFollowers &&
!isCurrentActorPendingFollow
"
class="whitespace-normal md:whitespace-nowrap text-sm italic"
>
{{
$t(
"Follow requests will be approved by a group moderator"
)
}}
</p>
<p
v-if="isCurrentActorPendingFollow && currentActor.id"
class="whitespace-normal md:whitespace-nowrap text-sm italic"
>
{{ $t("Follow request pending approval") }}
</p>
</div>
</button>
</b-dropdown-item>
<b-dropdown-item
aria-role="listitem"
class="p-0 border-t border-solid"
custom
:focusable="false"
:disabled="
isGroupInviteOnly || isCurrentActorAPendingGroupMember
"
>
<button class="media py-4 px-2 w-full" @click="joinGroup">
<b-icon
class="media-left"
icon="account-multiple-plus"
></b-icon>
<div class="media-content">
<h3 class="font-medium text-lg">{{ $t("Join") }}</h3>
<div v-if="showJoinButton">
<p
class="whitespace-normal md:whitespace-nowrap text-sm"
>
{{
$t(
"Become part of the community and start organizing events"
)
}}
</p>
<p
v-if="isGroupInviteOnly"
class="whitespace-normal md:whitespace-nowrap text-sm italic"
>
{{ $t("This group is invite-only") }}
</p>
<p
v-if="
areGroupMembershipsModerated &&
!isCurrentActorAPendingGroupMember
"
class="whitespace-normal md:whitespace-nowrap text-sm italic"
>
{{
$t(
"Membership requests will be approved by a group moderator"
)
}}
</p>
<p
v-if="isCurrentActorAPendingGroupMember"
class="whitespace-normal md:whitespace-nowrap text-sm italic"
>
{{ $t("Your membership is pending approval") }}
</p>
</div>
</div>
</button>
</b-dropdown-item>
</b-dropdown>
<b-button
outlined
v-else-if="isCurrentActorAPendingGroupMember"
v-if="isCurrentActorAPendingGroupMember"
@click="leaveGroup"
@keyup.enter="leaveGroup"
type="is-primary"
>{{ $t("Cancel membership request") }}</b-button
>
<b-button
tag="router-link"
:to="{
name: RouteName.GROUP_JOIN,
params: { preferredUsername: usernameWithDomain(group) },
}"
v-else-if="!isCurrentActorAGroupMember || previewPublic"
:disabled="previewPublic"
type="is-primary"
>{{ $t("Join group") }}</b-button
>
<b-button
v-if="
((!isCurrentActorFollowing && !isCurrentActorAGroupMember) ||
previewPublic) &&
!isCurrentActorPendingFollow &&
currentActor.id
"
@click="followGroup"
@keyup.enter="followGroup"
type="is-primary"
:disabled="isCurrentActorPendingFollow"
>{{ $t("Follow") }}</b-button
>
<b-button
tag="router-link"
:to="{
name: RouteName.GROUP_FOLLOW,
params: { preferredUsername: usernameWithDomain(group) },
}"
v-else-if="
!isCurrentActorPendingFollow &&
!isCurrentActorFollowing &&
previewPublic
"
:disabled="previewPublic"
type="is-primary"
>{{ $t("Follow") }}</b-button
>
<b-button
outlined
v-if="isCurrentActorPendingFollow && currentActor.id"
@ -192,12 +237,20 @@
v-if="isCurrentActorFollowing"
@click="toggleFollowNotify"
@keyup.enter="toggleFollowNotify"
class="notification-button p-1.5"
outlined
:icon-left="
isCurrentActorFollowingNotify
? 'bell-outline'
: 'bell-off-outline'
"
></b-button>
>
<span class="sr-only">{{
isCurrentActorFollowingNotify
? $t("Activate notifications")
: $t("Deactivate notifications")
}}</span>
</b-button>
<b-button
outlined
icon-left="share"
@ -308,28 +361,6 @@
)
}}
</b-message>
<b-message
v-if="
!isCurrentActorAGroupMember &&
!isCurrentActorAPendingGroupMember &&
!isCurrentActorPendingFollow &&
!isCurrentActorFollowing
"
type="is-info"
has-icon
class="m-3"
>
<i18n
path="Following the group will allow you to be informed of the {group_upcoming_public_events}, whereas joining the group means you will {access_to_group_private_content_as_well}, including group discussions, group resources and members-only posts."
>
<b slot="group_upcoming_public_events">{{
$t("group's upcoming public events")
}}</b>
<b slot="access_to_group_private_content_as_well">{{
$t("access to the group's private content as well")
}}</b>
</i18n>
</b-message>
</div>
</header>
</div>
@ -506,6 +537,12 @@
$t("View full profile")
}}</a>
</b-message>
<event-metadata-block
:title="$t('About')"
v-if="group.summary && group.summary !== '<p></p>'"
>
<div dir="auto" v-html="group.summary" />
</event-metadata-block>
<event-metadata-block :title="$t('Members')" icon="account-group">
{{
$tc("{count} members", group.members.total, {
@ -521,9 +558,10 @@
"
>
<div class="address-wrapper">
<span v-if="!physicalAddress">{{
$t("No address defined")
}}</span>
<span
v-if="!physicalAddress || !addressFullName(physicalAddress)"
>{{ $t("No address defined") }}</span
>
<div class="address" v-if="physicalAddress">
<div>
<address dir="auto">
@ -553,17 +591,6 @@
</div>
</aside>
<div class="main-content">
<section>
<subtitle>{{ $t("About") }}</subtitle>
<div
dir="auto"
v-html="group.summary"
v-if="group.summary && group.summary !== '<p></p>'"
/>
<empty-content v-else-if="group" icon="image-text" :inline="true">
{{ $t("This group doesn't have a description yet.") }}
</empty-content>
</section>
<section>
<subtitle>{{ $t("Upcoming events") }}</subtitle>
<div
@ -577,34 +604,57 @@
class="organized-event"
/>
</div>
<empty-content v-else-if="group" icon="calendar" :inline="true">
<empty-content
v-else-if="group"
icon="calendar"
:inline="true"
description-classes="flex flex-col items-stretch"
>
{{ $t("No public upcoming events") }}
<template #desc v-if="isCurrentActorFollowing">
<i18n
class="has-text-grey-dark"
path="You will receive notifications about this group's public activity depending on %{notification_settings}."
>
<router-link
:to="{ name: RouteName.NOTIFICATIONS }"
slot="notification_settings"
>{{ $t("your notification settings") }}</router-link
<template #desc>
<template v-if="isCurrentActorFollowing">
<i18n
class="has-text-grey-dark"
path="You will receive notifications about this group's public activity depending on %{notification_settings}."
>
</i18n>
<router-link
:to="{ name: RouteName.NOTIFICATIONS }"
slot="notification_settings"
>{{ $t("your notification settings") }}</router-link
>
</i18n>
</template>
<b-button
tag="router-link"
class="my-2 self-center"
type="is-text"
:to="{
name: RouteName.GROUP_EVENTS,
params: { preferredUsername: usernameWithDomain(group) },
query: { future: false },
}"
>{{ $t("View past events") }}</b-button
>
</template>
</empty-content>
<b-skeleton animated v-else-if="$apollo.loading"></b-skeleton>
<router-link
v-if="organizedEvents.total > 0"
:to="{
name: RouteName.GROUP_EVENTS,
params: { preferredUsername: usernameWithDomain(group) },
query: { future: organizedEvents.elements.length > 0 },
}"
>{{ $t("View all events") }}</router-link
>
<div class="flex justify-center">
<b-button
tag="router-link"
class="my-4"
type="is-text"
v-if="organizedEvents.total > 0"
:to="{
name: RouteName.GROUP_EVENTS,
params: { preferredUsername: usernameWithDomain(group) },
query: { future: organizedEvents.elements.length > 0 },
}"
>{{ $t("View all events") }}</b-button
>
</div>
</section>
<section>
<subtitle>{{ $t("Latest posts") }}</subtitle>
<section class="flex flex-col items-stretch">
<subtitle class="ml-0">{{ $t("Latest posts") }}</subtitle>
<multi-post-list-item
v-if="
@ -624,13 +674,16 @@
{{ $t("No posts yet") }}
</empty-content>
<b-skeleton animated v-else-if="$apollo.loading"></b-skeleton>
<router-link
<b-button
class="self-center my-2"
v-if="posts.total > 0"
tag="router-link"
type="is-text"
:to="{
name: RouteName.POSTS,
params: { preferredUsername: usernameWithDomain(group) },
}"
>{{ $t("View all posts") }}</router-link
>{{ $t("View all posts") }}</b-button
>
</section>
</div>
@ -687,7 +740,7 @@ import DiscussionListItem from "@/components/Discussion/DiscussionListItem.vue";
import MultiPostListItem from "@/components/Post/MultiPostListItem.vue";
import ResourceItem from "@/components/Resource/ResourceItem.vue";
import FolderItem from "@/components/Resource/FolderItem.vue";
import { Address } from "@/types/address.model";
import { Address, addressFullName } from "@/types/address.model";
import Invitations from "@/components/Group/Invitations.vue";
import addMinutes from "date-fns/addMinutes";
import { CONFIG } from "@/graphql/config";
@ -768,6 +821,8 @@ export default class Group extends mixins(GroupMixin) {
displayName = displayName;
addressFullName = addressFullName;
PostVisibility = PostVisibility;
Openness = Openness;
@ -788,25 +843,38 @@ export default class Group extends mixins(GroupMixin) {
}
async joinGroup(): Promise<void> {
const [group, currentActorId] = [
usernameWithDomain(this.group),
this.currentActor.id,
];
this.$apollo.mutate({
mutation: JOIN_GROUP,
variables: {
groupId: this.group.id,
},
refetchQueries: [
{
query: PERSON_STATUS_GROUP,
variables: {
id: currentActorId,
group,
},
if (!this.currentActor?.id) {
this.$router.push({
name: RouteName.GROUP_JOIN,
params: { preferredUsername: usernameWithDomain(this.group) },
});
return;
}
try {
const [group, currentActorId] = [
usernameWithDomain(this.group),
this.currentActor.id,
];
await this.$apollo.mutate({
mutation: JOIN_GROUP,
variables: {
groupId: this.group.id,
},
],
});
refetchQueries: [
{
query: PERSON_STATUS_GROUP,
variables: {
id: currentActorId,
group,
},
},
],
});
} catch (error: any) {
if (error.graphQLErrors && error.graphQLErrors.length > 0) {
this.$notifier.error(error.graphQLErrors[0].message);
}
}
}
protected async openLeaveGroupModal(): Promise<void> {
@ -852,6 +920,13 @@ export default class Group extends mixins(GroupMixin) {
}
async followGroup(): Promise<void> {
if (!this.currentActor?.id) {
this.$router.push({
name: RouteName.GROUP_FOLLOW,
params: { preferredUsername: usernameWithDomain(this.group) },
});
return;
}
try {
const [group, currentActorId] = [
usernameWithDomain(this.group),
@ -1070,6 +1145,41 @@ export default class Group extends mixins(GroupMixin) {
}),
};
}
get showFollowButton(): boolean {
return (
(!this.isCurrentActorFollowing || this.previewPublic) &&
this.currentActor?.id !== undefined
);
}
get showJoinButton(): boolean {
return (
(!this.isCurrentActorAGroupMember || this.previewPublic) &&
this.currentActor?.id !== undefined
);
}
get isGroupInviteOnly(): boolean {
return (
(!this.isCurrentActorAGroupMember || this.previewPublic) &&
this.group?.openness === Openness.INVITE_ONLY
);
}
get areGroupMembershipsModerated(): boolean {
return (
(!this.isCurrentActorAGroupMember || this.previewPublic) &&
this.group?.openness === Openness.MODERATED
);
}
get doesGroupManuallyApprovesFollowers(): boolean {
return (
(!this.isCurrentActorAGroupMember || this.previewPublic) &&
this.group?.manuallyApprovesFollowers
);
}
}
</script>
<style lang="scss" scoped>
@ -1206,6 +1316,7 @@ div.container {
.media-content {
h2 {
color: #3c376e;
font-family: "Liberation Sans", "Helvetica Neue", Roboto,
Helvetica, Arial, serif;
font-size: 1.5rem;
@ -1361,4 +1472,7 @@ div.container {
height: 60vh;
width: 100%;
}
button.button.notification-button ::v-deep span.icon.is-small {
margin: 0 !important;
}
</style>

View File

@ -259,17 +259,22 @@ export default class GroupSettings extends mixins(GroupMixin) {
@Watch("group")
async watchUpdateGroup(oldGroup: IGroup, newGroup: IGroup): Promise<void> {
if (
oldGroup?.avatar !== undefined &&
oldGroup?.avatar !== newGroup?.avatar
) {
this.avatarFile = await buildFileFromIMedia(this.group.avatar);
}
if (
oldGroup?.banner !== undefined &&
oldGroup?.banner !== newGroup?.banner
) {
this.bannerFile = await buildFileFromIMedia(this.group.banner);
try {
if (
oldGroup?.avatar !== undefined &&
oldGroup?.avatar !== newGroup?.avatar
) {
this.avatarFile = await buildFileFromIMedia(this.group.avatar);
}
if (
oldGroup?.banner !== undefined &&
oldGroup?.banner !== newGroup?.banner
) {
this.bannerFile = await buildFileFromIMedia(this.group.banner);
}
} catch (e) {
// Catch errors while building media
console.error(e);
}
this.editableGroup = { ...this.group };
}

View File

@ -15,7 +15,9 @@
v-if="post.draft"
>{{ $t("Draft") }}</b-tag
>
<h1 class="title" :lang="post.language">{{ post.title }}</h1>
<h1 class="title text-3xl" :lang="post.language">
{{ post.title }}
</h1>
</div>
<p class="metadata">
<router-link
@ -441,7 +443,6 @@ article.post {
h1.title {
margin: 0;
font-weight: 500;
font-size: 38px;
font-family: "Roboto", "Helvetica", "Arial", serif;
}

View File

@ -9,10 +9,7 @@
<b-icon icon="folder" />
{{ $t("New folder") }}
</b-dropdown-item>
<b-dropdown-item
aria-role="listitem"
@click="createLinkResourceModal = true"
>
<b-dropdown-item aria-role="listitem" @click="createLinkModal">
<b-icon icon="link" />
{{ $t("New link") }}
</b-dropdown-item>
@ -124,7 +121,11 @@
<section class="modal-card-body">
<form @submit.prevent="renameResource">
<b-field :label="$t('Title')">
<b-input aria-required="true" v-model="updatedResource.title" />
<b-input
ref="resourceRenameInput"
aria-required="true"
v-model="updatedResource.title"
/>
</b-field>
<b-button native-type="submit">{{
@ -154,12 +155,17 @@
:active.sync="createResourceModal"
has-modal-card
:close-button-aria-label="$t('Close')"
trap-focus
>
<div class="modal-card">
<section class="modal-card-body">
<b-message type="is-danger" v-if="modalError">
{{ modalError }}
</b-message>
<form @submit.prevent="createResource">
<b-field :label="$t('Title')" label-for="new-resource-title">
<b-input
ref="modalNewResourceInput"
aria-required="true"
v-model="newResource.title"
id="new-resource-title"
@ -179,6 +185,7 @@
class="link-resource-modal"
aria-modal
:close-button-aria-label="$t('Close')"
trap-focus
>
<div class="modal-card">
<section class="modal-card-body">
@ -193,6 +200,7 @@
required
v-model="newResource.resourceUrl"
@blur="previewResource"
ref="modalNewResourceLinkInput"
/>
</b-field>
@ -355,6 +363,12 @@ export default class Resources extends Mixins(ResourceMixin) {
put: true,
};
$refs!: {
resourceRenameInput: any;
modalNewResourceInput: HTMLElement;
modalNewResourceLinkInput: HTMLElement;
};
mapServiceTypeToIcon = mapServiceTypeToIcon;
get page(): number {
@ -458,15 +472,25 @@ export default class Resources extends Mixins(ResourceMixin) {
}
}
createFolderModal(): void {
this.newResource.type = "folder";
this.createResourceModal = true;
async createLinkModal(): Promise<void> {
this.createLinkResourceModal = true;
await this.$nextTick();
this.$refs.modalNewResourceLinkInput.focus();
}
createResourceFromProvider(provider: IProvider): void {
async createFolderModal(): Promise<void> {
this.newResource.type = "folder";
this.createResourceModal = true;
await this.$nextTick();
this.$refs.modalNewResourceInput.focus();
}
async createResourceFromProvider(provider: IProvider): Promise<void> {
this.newResource.resourceUrl = Resources.generateFullResourceUrl(provider);
this.newResource.type = provider.software;
this.createResourceModal = true;
await this.$nextTick();
this.$refs.modalNewResourceInput.focus();
}
static generateFullResourceUrl(provider: IProvider): string {
@ -549,10 +573,12 @@ export default class Resources extends Mixins(ResourceMixin) {
}
}
handleRename(resource: IResource): void {
console.log("handleRename");
async handleRename(resource: IResource): Promise<void> {
this.renameModal = true;
this.updatedResource = { ...resource };
await this.$nextTick();
this.$refs.resourceRenameInput.focus();
this.$refs.resourceRenameInput.$el.querySelector("input").select();
}
handleMove(resource: IResource): void {

View File

@ -93,6 +93,7 @@
</b-select>
</b-field>
<b-field
v-if="config"
expanded
:label="$t('Category')"
label-for="category"
@ -564,8 +565,6 @@ export default class Search extends Vue {
}
private prepareLocation(value: string | undefined): void {
console.info("geohash location", this.location);
if (value !== undefined) {
// decode
const latlon = ngeohash.decode(value);

View File

@ -18,7 +18,9 @@
$t(
"Error while login with {provider}. Retry or login another way.",
{
provider: $route.query.provider,
provider:
SELECTED_PROVIDERS[$route.query.provider] ||
"unknown provider",
}
)
}}</b-message
@ -31,7 +33,9 @@
$t(
"Error while login with {provider}. This login provider doesn't exist.",
{
provider: $route.query.provider,
provider:
SELECTED_PROVIDERS[$route.query.provider] ||
"unknown provider",
}
)
}}</b-message
@ -123,7 +127,7 @@
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from "vue-property-decorator";
import { Component, Prop, Vue } from "vue-property-decorator";
import { Route } from "vue-router";
import { ICurrentUser } from "@/types/current-user.model";
import { LoginError, LoginErrorCode } from "@/types/enums";
@ -136,6 +140,7 @@ import {
initializeCurrentActor,
NoIdentitiesException,
saveUserData,
SELECTED_PROVIDERS,
} from "../../utils/auth";
import { ILogin } from "../../types/login.model";
import {
@ -189,6 +194,8 @@ export default class Login extends Vue {
password: "",
};
redirect: string | undefined = "";
errors: string[] = [];
rules = {
@ -196,6 +203,8 @@ export default class Login extends Vue {
email: validateEmailField,
};
SELECTED_PROVIDERS = SELECTED_PROVIDERS;
submitted = false;
mounted(): void {
@ -204,6 +213,12 @@ export default class Login extends Vue {
const { query } = this.$route;
this.errorCode = query.code as LoginErrorCode;
this.redirect = query.redirect as string | undefined;
// Already-logged-in and accessing /login
if (this.currentUser.isLoggedIn) {
this.$router.push("/");
}
}
async loginAction(e: Event): Promise<Route | void> {
@ -230,14 +245,14 @@ export default class Login extends Vue {
saveUserData(data.login);
await this.setupClientUserAndActors(data.login);
if (this.$route.query.redirect) {
this.$router.push(this.$route.query.redirect as string);
if (this.redirect) {
this.$router.push(this.redirect as string);
return;
}
if (window.localStorage) {
window.localStorage.setItem("welcome-back", "yes");
}
this.$router.push({ name: RouteName.HOME });
this.$router.replace({ name: RouteName.HOME });
return;
} catch (err: any) {
this.submitted = false;
@ -276,13 +291,6 @@ export default class Login extends Vue {
}
}
@Watch("currentUser")
redirectToHomepageIfAlreadyLoggedIn(): Promise<Route> | void {
if (this.currentUser.isLoggedIn) {
return this.$router.push("/");
}
}
get hasCaseWarning(): boolean {
return this.credentials.email !== this.credentials.email.toLowerCase();
}

View File

@ -46,7 +46,7 @@ export default class ProviderValidate extends Vue {
id: userId,
email: userEmail,
isLoggedIn: true,
role: ICurrentUserRole.USER,
role: userRole,
},
});
const { data } = await this.$apollo.query<{ loggedUser: IUser }>({

View File

@ -16,6 +16,9 @@ module.exports = {
secondary: withOpacityValue("--color-secondary"),
"violet-title": withOpacityValue("--color-violet-title"),
},
lineClamp: {
10: "10",
},
},
},
plugins: [require("@tailwindcss/line-clamp")],

View File

@ -13,6 +13,7 @@ export const defaultResolvers = {
id: "67",
preferredUsername: "someone",
name: "Personne",
avatar: null,
__typename: "CurrentActor",
}),
},

View File

@ -67,7 +67,7 @@ exports[`CommentTree renders an empty comment tree 1`] = `
</article>
</form>
<transition-group-stub tag="div" name="comment-empty-list">
<empty-content-stub icon="comment" inline="true"><span>No comments yet</span></empty-content-stub>
<empty-content-stub icon="comment" descriptionclasses="" inline="true"><span>No comments yet</span></empty-content-stub>
</transition-group-stub>
</div>
`;

View File

@ -3,7 +3,7 @@
exports[`PostListItem renders post list item with basic informations 1`] = `
<a href="/p/my-blog-post-some-uuid" class="post-minimalist-card-wrapper" dir="auto">
<!---->
<div class="title-info-wrapper has-text-grey-dark">
<div class="title-info-wrapper has-text-grey-dark px-1">
<h3 lang="en" class="post-minimalist-title">
My Blog Post
</h3>
@ -17,7 +17,7 @@ exports[`PostListItem renders post list item with basic informations 1`] = `
exports[`PostListItem renders post list item with publisher name 1`] = `
<a href="/p/my-blog-post-some-uuid" class="post-minimalist-card-wrapper" dir="auto">
<!---->
<div class="title-info-wrapper has-text-grey-dark">
<div class="title-info-wrapper has-text-grey-dark px-1">
<h3 lang="en" class="post-minimalist-title">
My Blog Post
</h3>
@ -31,7 +31,7 @@ exports[`PostListItem renders post list item with publisher name 1`] = `
exports[`PostListItem renders post list item with tags 1`] = `
<a href="/p/my-blog-post-some-uuid" class="post-minimalist-card-wrapper" dir="auto">
<!---->
<div class="title-info-wrapper has-text-grey-dark">
<div class="title-info-wrapper has-text-grey-dark px-1">
<h3 lang="en" class="post-minimalist-title">
My Blog Post
</h3>

View File

@ -22,7 +22,7 @@ import { InMemoryCache } from "@apollo/client/cache";
const localVue = createLocalVue();
localVue.use(Buefy);
config.mocks.$t = (key: string): string => key;
const $router = { push: jest.fn() };
const $router = { push: jest.fn(), replace: jest.fn() };
describe("Render login form", () => {
let wrapper: Wrapper<Vue>;
@ -125,9 +125,9 @@ describe("Render login form", () => {
await flushPromises();
expect(currentUser?.email).toBe("some@email.tld");
expect(currentUser?.id).toBe("1");
expect(jest.isMockFunction(wrapper.vm.$router.push)).toBe(true);
expect(jest.isMockFunction(wrapper.vm.$router.replace)).toBe(true);
await flushPromises();
expect($router.push).toHaveBeenCalledWith({ name: RouteName.HOME });
expect($router.replace).toHaveBeenCalledWith({ name: RouteName.HOME });
});
it("handles a login error", async () => {

View File

@ -54,7 +54,6 @@ export const configMock = {
__typename: "Features",
eventCreation: true,
groups: true,
koenaConnect: false,
},
restrictions: {
__typename: "Restrictions",
@ -123,6 +122,8 @@ export const configMock = {
enabled: true,
publicKey: "",
},
eventCategories: [],
analytics: [],
},
},
};

View File

@ -6,6 +6,14 @@ module.exports = {
// remove the prefetch plugin
config.plugins.delete("prefetch");
},
configureWebpack: (config) => {
const miniCssExtractPlugin = config.plugins.find(
(plugin) => plugin.constructor.name === "MiniCssExtractPlugin"
);
if (miniCssExtractPlugin) {
miniCssExtractPlugin.options.linkType = false;
}
},
pwa: {
themeColor: "#ffd599", //not required for service worker, but place theme color here if manifest.json doesn't change the color
workboxPluginMode: "InjectManifest",

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,7 @@ defmodule Mobilizon.Federation.ActivityPub.Actions.Flag do
Enum.each(Users.list_moderators(), fn moderator ->
moderator
|> Admin.report(report)
|> Mailer.send_email_later()
|> Mailer.send_email()
end)
{:ok, activity, report}

View File

@ -28,7 +28,7 @@ defmodule Mobilizon.Federation.ActivityPub.Actions.Update do
Logger.debug("updating an activity")
Logger.debug(inspect(args))
case Managable.update(old_entity, args, additional) do
case Managable.update(old_entity, args, Map.put(additional, :local, local)) do
{:ok, entity, update_data} ->
{:ok, activity} = create_activity(update_data, local)
maybe_federate(activity)

View File

@ -228,13 +228,13 @@ defmodule Mobilizon.Federation.ActivityPub.Audience do
|> Enum.uniq()
end
defp add_event_contacts(%Event{contacts: contacts}) do
defp add_event_contacts(%Event{contacts: contacts}) when is_list(contacts) do
contacts
|> Enum.map(& &1.url)
|> Enum.uniq()
end
defp add_event_contacts(%Event{}), do: []
defp add_event_contacts(_), do: []
defp process_mention({_, mentioned_actor}), do: mentioned_actor.url

View File

@ -148,7 +148,7 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do
{:error, :http_error}
{:error, error} ->
Logger.warn("Could not fetch actor at fetch #{url}, #{inspect(error)}")
Logger.info("Could not fetch actor at #{url}, #{inspect(error)}")
{:error, :http_error}
end
end

View File

@ -8,7 +8,9 @@ defmodule Mobilizon.Federation.ActivityPub.Publisher do
alias Mobilizon.Federation.ActivityPub.{Activity, Federator, Relay, Transmogrifier, Visibility}
alias Mobilizon.Federation.HTTPSignatures.Signature
require Logger
import Mobilizon.Federation.ActivityPub.Utils, only: [remote_actors: 1]
import Mobilizon.Federation.ActivityPub.Utils,
only: [remote_actors: 1, create_full_domain_string: 1]
@doc """
Publish an activity to all appropriated audiences inboxes
@ -77,7 +79,7 @@ defmodule Mobilizon.Federation.ActivityPub.Publisher do
Tesla.Env.result()
def publish_one(%{inbox: inbox, json: json, actor: actor, id: id}) do
Logger.info("Federating #{id} to #{inbox}")
%URI{host: host, path: path} = URI.parse(inbox)
%URI{path: path} = uri = URI.new!(inbox)
digest = Signature.build_digest(json)
date = Signature.generate_date_header()
@ -87,7 +89,7 @@ defmodule Mobilizon.Federation.ActivityPub.Publisher do
signature =
Signature.sign(actor, %{
"(request-target)": "post #{path}",
host: host,
host: create_full_domain_string(uri),
"content-length": byte_size(json),
digest: digest,
date: date
@ -108,13 +110,17 @@ defmodule Mobilizon.Federation.ActivityPub.Publisher do
@spec convert_followers_in_recipients(list(String.t())) :: {list(String.t()), list(String.t())}
defp convert_followers_in_recipients(recipients) do
Enum.reduce(recipients, {recipients, []}, fn recipient, {recipients, follower_actors} = acc ->
case Actors.get_actor_by_followers_url(recipient) do
%Actor{} = group ->
{Enum.filter(recipients, fn recipient -> recipient != group.followers_url end),
follower_actors ++ Actors.list_external_followers_for_actor(group)}
if is_nil(recipient) do
acc
else
case Actors.get_actor_by_followers_url(recipient) do
%Actor{} = group ->
{Enum.filter(recipients, fn recipient -> recipient != group.followers_url end),
follower_actors ++ Actors.list_external_followers_for_actor(group)}
nil ->
acc
nil ->
acc
end
end
end)
end
@ -126,19 +132,23 @@ defmodule Mobilizon.Federation.ActivityPub.Publisher do
@spec convert_members_in_recipients(list(String.t())) :: {list(String.t()), list(Actor.t())}
defp convert_members_in_recipients(recipients) do
Enum.reduce(recipients, {recipients, []}, fn recipient, {recipients, member_actors} = acc ->
case Actors.get_group_by_members_url(recipient) do
# If the group is local just add external members
%Actor{domain: domain} = group when is_nil(domain) ->
{Enum.filter(recipients, fn recipient -> recipient != group.members_url end),
member_actors ++ Actors.list_external_actors_members_for_group(group)}
if is_nil(recipient) do
acc
else
case Actors.get_group_by_members_url(recipient) do
# If the group is local just add external members
%Actor{domain: domain} = group when is_nil(domain) ->
{Enum.filter(recipients, fn recipient -> recipient != group.members_url end),
member_actors ++ Actors.list_external_actors_members_for_group(group)}
# If it's remote add the remote group actor as well
%Actor{} = group ->
{Enum.filter(recipients, fn recipient -> recipient != group.members_url end),
member_actors ++ Actors.list_external_actors_members_for_group(group) ++ [group]}
# If it's remote add the remote group actor as well
%Actor{} = group ->
{Enum.filter(recipients, fn recipient -> recipient != group.members_url end),
member_actors ++ Actors.list_external_actors_members_for_group(group) ++ [group]}
_ ->
acc
_ ->
acc
end
end
end)
end

View File

@ -10,6 +10,8 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do
alias Mobilizon.Federation.ActivityPub.{Fetcher, Relay, Transmogrifier, Utils}
require Logger
@collection_element_task_processing_time 60_000
@doc """
Refresh a remote profile
"""
@ -158,7 +160,7 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do
items
|> Enum.map(fn item -> Task.async(fn -> handling_element(item) end) end)
|> Task.await_many()
|> Task.await_many(@collection_element_task_processing_time)
Logger.debug("Finished processing a collection")
:ok
@ -189,8 +191,8 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do
defp process_collection(_, _), do: :error
# If we're handling an activity
@spec handling_element(map()) :: {:ok, any, struct} | :error
@spec handling_element(String.t()) :: {:ok, struct} | {:ok, atom, struct} | {:error, any()}
@spec handling_element(map() | String.t()) ::
{:ok, any, struct} | {:ok, struct} | {:ok, atom, struct} | {:error, any()} | :error
defp handling_element(%{"type" => activity_type} = data)
when activity_type in ["Create", "Update", "Delete"] do
object = get_in(data, ["object"])

View File

@ -14,9 +14,9 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do
alias Mobilizon.Federation.ActivityPub.{Actions, Activity, Transmogrifier}
alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor
alias Mobilizon.Federation.WebFinger
alias Mobilizon.Service.Workers.Background
alias Mobilizon.GraphQL.API.Follows
alias Mobilizon.Service.Workers.Background
import Mobilizon.Federation.ActivityPub.Utils, only: [create_full_domain_string: 1]
require Logger
@ -172,14 +172,17 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do
defp fetch_actor("http://" <> address), do: fetch_actor(address)
defp fetch_actor(address) do
%URI{host: host} = URI.parse("http://" <> address)
%URI{host: host} = uri = URI.parse("http://" <> address)
cond do
String.contains?(address, "@") ->
check_actor(address)
!is_nil(host) ->
check_actor("relay@#{host}")
uri
|> create_full_domain_string()
|> then(&Kernel.<>("relay@", &1))
|> check_actor()
true ->
{:error, :bad_url}

View File

@ -41,7 +41,8 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
params = %{
reporter_id: params["reporter"].id,
reported_id: params["reported"].id,
comments_ids: params["comments"] |> Enum.map(& &1.id),
comments_ids:
if(params["comments"], do: params["comments"] |> Enum.map(& &1.id), else: []),
content: params["content"] || "",
additional: %{
"cc" => [params["reported"].url]
@ -91,6 +92,9 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
# Object already exists
{:ok, nil, comment}
end
{:error, err} ->
{:error, err}
end
end
@ -403,6 +407,13 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
Actions.Update.update(old_actor, object_data, false, %{updater_actor: author}) do
{:ok, activity, new_actor}
else
{:error, :update_not_allowed} ->
Logger.warn("Activity tried to update an actor that's local or not a group",
activity: params
)
:error
e ->
Sentry.capture_message("Error while handling an Update activity",
extra: %{params: params}
@ -611,19 +622,25 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
{:error, :unknown_actor}
{:ok, %Actor{} = actor} ->
case is_group_object_gone(object_id) do
{:ok, object} ->
if Utils.origin_check_from_id?(actor_url, object_id) ||
Permission.can_delete_group_object?(actor, object) do
Actions.Delete.delete(object, actor, false)
else
Logger.warn("Object origin check failed")
:error
end
# If the actor itself is being deleted, no need to check anything other than the object being remote
if remote_actor_is_being_deleted(data) do
Actions.Delete.delete(actor, actor, false)
else
case is_group_object_gone(object_id) do
# The group object is no longer there, we can remove the element
{:ok, entity} ->
if Utils.origin_check_from_id?(actor_url, object_id) ||
Permission.can_delete_group_object?(actor, entity) do
Actions.Delete.delete(entity, actor, false)
else
Logger.warn("Object origin check failed")
:error
end
{:error, err} ->
Logger.debug(inspect(err))
{:error, err}
{:error, err} ->
Logger.debug(inspect(err))
{:error, err}
end
end
end
end
@ -850,8 +867,8 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
# Handle incoming `Accept` activities wrapping a `Join` activity on an event
defp do_handle_incoming_accept_join(join_object, %Actor{} = actor_accepting) do
case get_participant(join_object, actor_accepting) do
{:ok, participant} ->
do_handle_incoming_accept_join_event(participant, actor_accepting)
{:ok, activity, participant} ->
do_handle_incoming_accept_join_event(participant, actor_accepting, activity)
{:error, _err} ->
case get_member(join_object) do
@ -870,17 +887,22 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
end
end
defp do_handle_incoming_accept_join_event(%Participant{role: :participant}, _actor) do
defp do_handle_incoming_accept_join_event(
%Participant{role: :participant} = participant,
_actor,
activity
) do
Logger.debug(
"Tried to handle an Accept activity on a Join activity with a event object but the participant is already validated"
)
nil
{:ok, activity, participant}
end
defp do_handle_incoming_accept_join_event(
%Participant{role: role, event: event} = participant,
%Actor{} = actor_accepting
%Actor{} = actor_accepting,
_activity
)
when role in [:not_approved, :rejected] do
with %Event{} = event <- Events.get_event_with_preload!(event.id),
@ -932,7 +954,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
# Handle incoming `Reject` activities wrapping a `Join` activity on an event
defp do_handle_incoming_reject_join(join_object, %Actor{} = actor_accepting) do
with {:join_event, {:ok, %Participant{event: event, role: role} = participant}}
with {:join_event, {:ok, _activity, %Participant{event: event, role: role} = participant}}
when role != :rejected <-
{:join_event, get_participant(join_object, actor_accepting)},
{:event, %Event{} = event} <- {:event, Events.get_event_with_preload!(event.id)},
@ -943,7 +965,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
:ok <- Participation.send_emails_to_local_user(participant) do
{:ok, activity, participant}
else
{:join_event, {:ok, %Participant{role: :rejected}}} ->
{:join_event, {:ok, _activity, %Participant{role: :rejected}}} ->
Logger.warn(
"Tried to handle an Reject activity on a Join activity with a event object but the participant is already rejected"
)
@ -1040,18 +1062,18 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
end
end
defp get_participant(join_object, %Actor{} = actor_accepting, loop \\ 1) do
defp get_participant(join_object, %Actor{} = actor_accepting, loop \\ 1, activity \\ nil) do
with join_object_id when not is_nil(join_object_id) <- Utils.get_url(join_object),
{:not_found, %Participant{} = participant} <-
{:not_found, Events.get_participant_by_url(join_object_id)} do
{:ok, participant}
{:ok, activity, participant}
else
{:not_found, _err} ->
with true <- is_map(join_object),
true <- loop < 2,
true <- Utils.are_same_origin?(actor_accepting.url, join_object["id"]),
{:ok, _activity, %Participant{url: participant_url}} <- handle_incoming(join_object) do
get_participant(participant_url, actor_accepting, 2)
{:ok, activity, %Participant{url: participant_url}} <- handle_incoming(join_object) do
get_participant(participant_url, actor_accepting, 2, activity)
else
_ ->
{:error, "Participant URL not found"}
@ -1199,4 +1221,9 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
moderator.domain == group.domain
end
end
defp remote_actor_is_being_deleted(%{"object" => object} = data) do
object_id = Utils.get_url(object)
Utils.get_actor(data) == object_id and not Utils.are_same_origin?(object_id, Endpoint.url())
end
end

View File

@ -1,7 +1,7 @@
defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
@moduledoc false
alias Mobilizon.Actors
alias Mobilizon.Actors.{Actor, Follower, Member, MemberRole}
alias Mobilizon.Actors.{Actor, Follower, Member}
alias Mobilizon.Federation.ActivityPub.{Actions, Audience, Permission, Relay}
alias Mobilizon.Federation.ActivityPub.Types.Entity
alias Mobilizon.Federation.ActivityStream
@ -45,25 +45,30 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
def update(%Actor{} = old_actor, args, additional) do
updater_actor = Map.get(args, :updater_actor) || Map.get(additional, :updater_actor)
case Actors.update_actor(old_actor, args) do
{:ok, %Actor{} = new_actor} ->
GroupActivity.insert_activity(new_actor,
subject: "group_updated",
old_group: old_actor,
updater_actor: updater_actor
)
if Map.get(additional, :local, false) == true or not match?(%Actor{domain: nil}, old_actor) or
match?(%Actor{type: :Group}, old_actor) do
case Actors.update_actor(old_actor, args) do
{:ok, %Actor{} = new_actor} ->
GroupActivity.insert_activity(new_actor,
subject: "group_updated",
old_group: old_actor,
updater_actor: updater_actor
)
actor_as_data = Convertible.model_to_as(new_actor)
Cachex.del(:activity_pub, "actor_#{new_actor.preferred_username}")
audience = Audience.get_audience(new_actor)
actor_as_data = Convertible.model_to_as(new_actor)
Cachex.del(:activity_pub, "actor_#{new_actor.preferred_username}")
audience = Audience.get_audience(new_actor)
additional = Map.merge(additional, %{"actor" => (updater_actor || old_actor).url})
additional = Map.merge(additional, %{"actor" => (updater_actor || old_actor).url})
update_data = make_update_data(actor_as_data, Map.merge(audience, additional))
{:ok, new_actor, update_data}
update_data = make_update_data(actor_as_data, Map.merge(audience, additional))
{:ok, new_actor, update_data}
{:error, %Ecto.Changeset{} = err} ->
{:error, err}
{:error, %Ecto.Changeset{} = err} ->
{:error, err}
end
else
{:error, :update_not_allowed}
end
end
@ -244,7 +249,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
Actor.t(),
ActivityStreams.t(),
Member.t(),
MemberRole.t()
atom()
) ::
{:ok, ActivityStreams.t(), Member.t()}
defp approve_if_default_role_is_member(

View File

@ -3,7 +3,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do
alias Mobilizon.Actors
alias Mobilizon.Actors.Actor
alias Mobilizon.Events, as: EventsManager
alias Mobilizon.Events.{Event, Participant, ParticipantRole}
alias Mobilizon.Events.{Event, Participant}
alias Mobilizon.Federation.ActivityPub.{Actions, Audience, Permission}
alias Mobilizon.Federation.ActivityPub.Types.Entity
alias Mobilizon.Federation.ActivityStream
@ -191,7 +191,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do
Event.t(),
ActivityStreams.t(),
Participant.t(),
ParticipantRole.t()
atom()
) :: {:ok, ActivityStreams.t(), Participant.t()} | {:accept, any()}
defp approve_if_default_role_is_participant(event, activity_data, participant, role) do
case event do
@ -217,7 +217,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do
end
end
@spec do_approve(Event.t(), ActivityStreams.t(), Particpant.t(), ParticipantRole.t(), map()) ::
@spec do_approve(Event.t(), ActivityStreams.t(), Particpant.t(), atom(), map()) ::
{:accept, any} | {:ok, ActivityStreams.t(), Participant.t()}
defp do_approve(event, activity_data, participant, role, additionnal) do
cond do
@ -267,12 +267,22 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do
Map.merge(args, %{
description: description,
mentions: mentions,
tags: tags
# Exclude tags with length > 40
tags: Enum.filter(tags, &exclude_too_long_tags/1)
})
else
args
end
# Make sure we don't have duplicate (with different casing) tags
args =
Map.update(
args,
:tags,
[],
&Enum.uniq_by(&1, fn tag -> tag |> tag_to_string() |> String.downcase() end)
)
# Check that we can only allow anonymous participation if our instance allows it
{_, options} =
Map.get_and_update(
@ -292,4 +302,16 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do
|> Map.update(:tags, [], &ConverterUtils.fetch_tags/1)
|> Map.update(:contacts, [], &ConverterUtils.fetch_actors/1)
end
@spec exclude_too_long_tags(%{title: String.t()} | String.t()) :: boolean()
defp exclude_too_long_tags(tag) do
tag
|> tag_to_string()
|> String.length()
|> Kernel.<(40)
end
@spec tag_to_string(%{title: String.t()} | String.t()) :: String.t()
defp tag_to_string(%{title: tag}), do: tag
defp tag_to_string(tag), do: tag
end

View File

@ -1,7 +1,7 @@
defmodule Mobilizon.Federation.ActivityPub.Types.Members do
@moduledoc false
alias Mobilizon.Actors
alias Mobilizon.Actors.{Actor, Member, MemberRole}
alias Mobilizon.Actors.{Actor, Member}
alias Mobilizon.Federation.ActivityPub.Actions
alias Mobilizon.Federation.ActivityStream
alias Mobilizon.Federation.ActivityStream.Convertible
@ -89,8 +89,8 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Members do
@spec check_admins_left?(
String.t() | integer,
String.t() | integer,
MemberRole.t(),
MemberRole.t()
atom(),
atom()
) :: boolean
defp check_admins_left?(member_id, group_id, current_role, updated_role) do
Actors.is_only_administrator?(member_id, group_id) && current_role == :administrator &&

View File

@ -337,8 +337,9 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do
message: "Object contains an actor object with invalid type: #{inspect(type)}"
end
def get_actor(%{"actor" => nil, "attributedTo" => nil}) do
raise ArgumentError, message: "Object contains both actor and attributedTo fields being null"
def get_actor(%{"actor" => nil, "attributedTo" => nil} = object) do
raise ArgumentError,
message: "Object contains both actor and attributedTo fields being null: #{inspect(object)}"
end
def get_actor(%{"actor" => _}) do
@ -671,8 +672,15 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do
@doc """
Converts PEM encoded keys to a public key representation
"""
@spec pem_to_public_key_pem(String.t()) :: String.t()
def pem_to_public_key_pem(pem) do
public_key = pem_to_public_key(pem)
public_key = :public_key.pem_entry_encode(:RSAPublicKey, public_key)
:public_key.pem_encode([public_key])
end
@spec pem_to_public_key(String.t()) :: {:RSAPublicKey, any(), any()}
def pem_to_public_key(pem) do
defp pem_to_public_key(pem) do
[key_code] = :public_key.pem_decode(pem)
key = :public_key.pem_entry_decode(key_code)
@ -685,14 +693,8 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do
end
end
@spec pem_to_public_key_pem(String.t()) :: String.t()
def pem_to_public_key_pem(pem) do
public_key = pem_to_public_key(pem)
public_key = :public_key.pem_entry_encode(:RSAPublicKey, public_key)
:public_key.pem_encode([public_key])
end
def make_signature(actor, id, date) do
@spec make_signature(Actor.t(), String.t(), DateTime.t()) :: list({atom(), String.t()})
defp make_signature(actor, id, date) do
uri = URI.parse(id)
signature =
@ -779,4 +781,16 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do
params
end
end
@schemes_with_no_port ["http", "https"]
def create_full_domain_string(%URI{host: host, port: nil}), do: host
def create_full_domain_string(%URI{host: host, port: port}) do
if port in Enum.map(@schemes_with_no_port, &URI.default_port/1) do
host
else
"#{host}:#{port}"
end
end
end

Some files were not shown because too many files have changed in this diff Show More