diff --git a/CHANGELOG.md b/CHANGELOG.md
index 760bcdd5..61d16627 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,85 @@ 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.0.0 - unreleased
+
+### Added
+
+- Added possibility to follow groups and be notified from new upcoming events
+- Export list of participants to CSV, `PDF` and `ODS`
+- Allow to set timezone for an event. The timezone is automatically defined from the address if one is defined. If the event timezone is different than the user's current one, a toggle is shown to switch between the two.
+- Added initial support for Right To Left languages (such as arabic) and [BiDi](https://en.wikipedia.org/wiki/Bidirectional_text)
+- Build releases in `arm` and `arm64` format in addition to `amd64`
+- Build Docker images in `arm` and `arm64` format in addition to `amd64`
+- Added possibility to indicate the event is fully online
+- Added possibility to search only for online events
+- Added possibility to search only in past events
+- Detect event, comments and posts languages automatically. Allows setting language
+- Allow to change an user's password through the users.modify mix task
+- Add instance setting so that only the admin can create groups
+- Add instance setting so that only groups can create events
+- Added JSON-LD metadata about the event in emails
+- Added a quick link to email notification settings at the bottom of emails
+- Allow to access Mobilizon with a specific language directly by using `https://instance.tld/lang` where `lang` is a language supported by Mobilizon
+
+### Changed
+
+- Multiple UI improvements, including post, event and participation cards, discussions and emails. The « My Events » page was also redesigned to allow showing events from your groups.
+- Various accessibility improvements
+- Delete current actor ID as well from local storage when unlogging
+- Show a default text for instance contact in default terms text when no instance contact is set
+- Only show locatecontrol button in leaflet map when we can do geolocation
+- Disable push column in notification settings when push is not available
+- Show actual language instead of language code in Users admin view
+- Empty old & new passwords fields when successful password change
+- Don't link to the group page from admin when actor is suspended
+- Warn participants when the event organizer is suspended (and therefore the event cancelled)
+- Improve metadata on public page
+- Make sure some event action pages (participate remotely or without an account) don't get indexed by search engines
+- Only send `Tombstone` element in `Delete` activities, not the whole previous deleted element.
+- Only add address and tags to event icalendar export if they exist
+- `master` branch has been renamed to `main`
+
+### Removed
+
+- Support for Elixir < 1.12 and OTP < 22
+
+### Fixed
+
+- Fix tags autocomplete
+- Fix config onboarding after LDAP initial connexion
+- Fix events pagination on tags page
+- Fixed deduplicated files from orphan media being deleted as well
+- Fix deleting own account
+- Fix search returning user profiles instead of only groups
+- Fix federating geo coordinates
+- Fix an issue with group activity items when moving resources
+- Fix an issue with Identity Picker
+- Fix an issue with TagInput
+- Fix an issue when leaving a group
+- Fix admin settings edition
+- Fix an issue when showing public page of suspended group
+- Removed non existing page (`/about/mobilizon`) from sitemap
+- Fix action logs containing group suspension events
+- Fixed group physical address not exposed to ActivityPub
+
+### Security
+
+- Fixed private messages sent as event replies from Mastodon that were shown publically as public comments. They are now discarded.
+### Translations
+
+- Czech
+- Gaelic
+- German
+- Indonesian
+- Norwegian Nynorsk
+- Occitan
+- Persian
+- Portuguese (Brazil)
+- Russian
+- Slovenian
+- Spanish
+
## 1.3.2 - 2021-08-23
### Fixed
diff --git a/UPGRADE.md b/UPGRADE.md
index 257e16eb..58bb9087 100644
--- a/UPGRADE.md
+++ b/UPGRADE.md
@@ -1,3 +1,30 @@
+# Upgrading from 1.3 to 2.0
+
+Requirements dependencies depend on the way Mobilizon is installed.
+## New dependencies requirements
+
+### Release and Docker
+
+You are already using latest Elixir version in the release tarball and Docker images.
+
+### Source install
+
+* Elixir 1.12 and Erlang OTP 22 is now required. If your distribution doesn't provide these versions, you can uninstall them and install [Elixir](https://github.com/asdf-vm/asdf-elixir) through the [ASDF tool](https://asdf-vm.com/).
+
+## Optional dependencies
+
+These are optional, installing them will allow Mobilizon to export to PDF and ODS as well.
+### 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)
+
+Both can be installed through pip.
+
# Upgrading from 1.0 to 1.1
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).
diff --git a/config/config.exs b/config/config.exs
index bec1c440..9d0aabaf 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -88,6 +88,8 @@ config :mobilizon, Mobilizon.Web.Upload,
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "/var/lib/mobilizon/uploads"
+config :tz_world, data_dir: "/var/lib/mobilizon/timezones"
+
config :mobilizon, :media_proxy,
enabled: true,
proxy_opts: [
diff --git a/config/dev.exs b/config/dev.exs
index cd4d9ea1..0484b983 100644
--- a/config/dev.exs
+++ b/config/dev.exs
@@ -94,6 +94,8 @@ config :mobilizon, Mobilizon.Web.Auth.Guardian,
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads"
+config :tz_world, data_dir: "_build/dev/lib/tz_world/priv"
+
config :mobilizon, :anonymous,
reports: [
allowed: true
diff --git a/config/docker.exs b/config/docker.exs
index c2014142..e370644e 100644
--- a/config/docker.exs
+++ b/config/docker.exs
@@ -33,9 +33,6 @@ config :mobilizon, :instance,
email_from: System.get_env("MOBILIZON_INSTANCE_EMAIL", "noreply@mobilizon.lan"),
email_reply_to: System.get_env("MOBILIZON_REPLY_EMAIL", "noreply@mobilizon.lan")
-config :mobilizon, Mobilizon.Web.Upload.Uploader.Local,
- uploads: System.get_env("MOBILIZON_UPLOADS", "/app/uploads")
-
config :mobilizon, Mobilizon.Storage.Repo,
adapter: Ecto.Adapters.Postgres,
username: System.get_env("MOBILIZON_DATABASE_USERNAME", "username"),
@@ -68,4 +65,8 @@ config :geolix,
}
]
-config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "/var/lib/mobilizon/uploads"
+config :mobilizon, Mobilizon.Web.Upload.Uploader.Local,
+ uploads: System.get_env("MOBILIZON_UPLOADS", "/var/lib/mobilizon/uploads")
+
+config :tz_world,
+ data_dir: System.get_env("MOBILIZON_TIMEZONES_DIR", "/var/lib/mobilizon/timezones")
diff --git a/config/prod.exs b/config/prod.exs
index 382d3655..9400d1ef 100644
--- a/config/prod.exs
+++ b/config/prod.exs
@@ -37,12 +37,3 @@ config :mobilizon, :cldr,
"ru",
"sv"
]
-
-cond do
- System.get_env("INSTANCE_CONFIG") &&
- File.exists?("./config/#{System.get_env("INSTANCE_CONFIG")}") ->
- import_config System.get_env("INSTANCE_CONFIG")
-
- true ->
- :ok
-end
diff --git a/config/test.exs b/config/test.exs
index 86dce9eb..507e4cd0 100644
--- a/config/test.exs
+++ b/config/test.exs
@@ -60,6 +60,8 @@ config :mobilizon, Mobilizon.Web.Upload, filters: [], link_name: false
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "test/uploads"
+config :tz_world, data_dir: "_build/test/lib/tz_world/priv"
+
config :exvcr,
vcr_cassette_library_dir: "test/fixtures/vcr_cassettes"
diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile
index 2d33ae3d..e031be94 100644
--- a/docker/production/Dockerfile
+++ b/docker/production/Dockerfile
@@ -48,9 +48,11 @@ LABEL org.opencontainers.image.title="mobilizon" \
org.opencontainers.image.revision=$VCS_REF \
org.opencontainers.image.created=$BUILD_DATE
-RUN apk add --no-cache openssl ca-certificates ncurses-libs file postgresql-client libgcc libstdc++ imagemagick
+RUN apk add --no-cache 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
+RUN pip install weasyprint pyexcel-ods3
-RUN mkdir -p /app/uploads && chown nobody:nobody /app/uploads
+RUN mkdir -p /var/lib/mobilizon/uploads && chown nobody:nobody /var/lib/mobilizon/uploads
+RUN mkdir -p /var/lib/mobilizon/timezones && chown nobody:nobody /var/lib/mobilizon/timezones
RUN mkdir -p /etc/mobilizon && chown nobody:nobody /etc/mobilizon
USER nobody
diff --git a/js/.eslintrc.js b/js/.eslintrc.js
index 7ee28a44..5d470019 100644
--- a/js/.eslintrc.js
+++ b/js/.eslintrc.js
@@ -9,8 +9,7 @@ module.exports = {
"plugin:vue/essential",
"eslint:recommended",
"@vue/typescript/recommended",
- "@vue/prettier",
- "@vue/prettier/@typescript-eslint",
+ "plugin:prettier/recommended",
],
plugins: ["prettier"],
diff --git a/js/package.json b/js/package.json
index ef9662ea..8799976b 100644
--- a/js/package.json
+++ b/js/package.json
@@ -1,6 +1,6 @@
{
"name": "mobilizon",
- "version": "1.3.2",
+ "version": "2.0.0-beta.1",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
@@ -39,7 +39,7 @@
"core-js": "^3.6.4",
"date-fns": "^2.16.0",
"date-fns-tz": "^1.1.6",
- "graphql": "^15.0.0",
+ "graphql": "^16.0.0",
"graphql-tag": "^2.10.3",
"intersection-observer": "^0.12.0",
"jwt-decode": "^3.1.2",
@@ -74,27 +74,27 @@
"@types/prosemirror-model": "^1.7.2",
"@types/prosemirror-state": "^1.2.4",
"@types/prosemirror-view": "^1.11.4",
- "@typescript-eslint/eslint-plugin": "^4.18.0",
- "@typescript-eslint/parser": "^4.18.0",
- "@vue/cli-plugin-babel": "~5.0.0-beta.7",
- "@vue/cli-plugin-e2e-cypress": "~5.0.0-beta.7",
- "@vue/cli-plugin-eslint": "~5.0.0-beta.7",
- "@vue/cli-plugin-pwa": "~5.0.0-beta.7",
- "@vue/cli-plugin-router": "~5.0.0-beta.7",
- "@vue/cli-plugin-typescript": "~5.0.0-beta.7",
- "@vue/cli-plugin-unit-jest": "~5.0.0-beta.7",
- "@vue/cli-service": "~5.0.0-beta.7",
- "@vue/eslint-config-prettier": "^6.0.0",
- "@vue/eslint-config-typescript": "^7.0.0",
+ "@typescript-eslint/eslint-plugin": "^5.3.0",
+ "@typescript-eslint/parser": "^5.3.0",
+ "@vue/cli-plugin-babel": "~5.0.0-rc.0",
+ "@vue/cli-plugin-e2e-cypress": "~5.0.0-rc.0",
+ "@vue/cli-plugin-eslint": "~5.0.0-rc.0",
+ "@vue/cli-plugin-pwa": "~5.0.0-rc.0",
+ "@vue/cli-plugin-router": "~5.0.0-rc.0",
+ "@vue/cli-plugin-typescript": "~5.0.0-rc.0",
+ "@vue/cli-plugin-unit-jest": "~5.0.0-rc.0",
+ "@vue/cli-service": "~5.0.0-rc.0",
+ "@vue/eslint-config-typescript": "^9.0.0",
"@vue/test-utils": "^1.1.0",
- "@vue/vue2-jest": "^27.0.0-alpha.2",
+ "@vue/vue2-jest": "^27.0.0-alpha.3",
"@vue/vue3-jest": "^27.0.0-alpha.1",
"cypress": "^8.3.0",
- "eslint": "^7.20.0",
+ "eslint": "^8.2.0",
+ "eslint-config-prettier": "^8.3.0",
"eslint-plugin-cypress": "^2.10.3",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-prettier": "^4.0.0",
- "eslint-plugin-vue": "^7.6.0",
+ "eslint-plugin-vue": "^8.0.3",
"flush-promises": "^1.0.2",
"jest": "^27.1.0",
"jest-junit": "^13.0.0",
diff --git a/js/src/components/Account/PopoverActorCard.vue b/js/src/components/Account/PopoverActorCard.vue
index 7374376c..4f75672b 100644
--- a/js/src/components/Account/PopoverActorCard.vue
+++ b/js/src/components/Account/PopoverActorCard.vue
@@ -6,7 +6,7 @@
:class="{ inline, clickable: actor && actor.type === ActorType.GROUP }"
>