diff --git a/lib/web/controllers/page_controller.ex b/lib/web/controllers/page_controller.ex
index 486791eef..e24b49a58 100644
--- a/lib/web/controllers/page_controller.ex
+++ b/lib/web/controllers/page_controller.ex
@@ -18,6 +18,8 @@ defmodule Mobilizon.Web.PageController do
defdelegate my_events(conn, params), to: PageController, as: :index
@spec create_event(Plug.Conn.t(), any) :: Plug.Conn.t()
defdelegate create_event(conn, params), to: PageController, as: :index
+ @spec calendar(Plug.Conn.t(), any) :: Plug.Conn.t()
+ defdelegate calendar(conn, params), to: PageController, as: :index
@spec list_events(Plug.Conn.t(), any) :: Plug.Conn.t()
defdelegate list_events(conn, params), to: PageController, as: :index
@spec edit_event(Plug.Conn.t(), any) :: Plug.Conn.t()
diff --git a/lib/web/plugs/http_security_plug.ex b/lib/web/plugs/http_security_plug.ex
index 862803b49..eeb2f3702 100644
--- a/lib/web/plugs/http_security_plug.ex
+++ b/lib/web/plugs/http_security_plug.ex
@@ -77,7 +77,7 @@ defmodule Mobilizon.Web.Plugs.HTTPSecurityPlug do
# unsafe-eval is because of JS issues with regenerator-runtime
@script_src "script-src 'self' 'unsafe-eval' "
@style_src "style-src 'self' "
- @font_src "font-src 'self' "
+ @font_src "font-src 'self' data: "
@spec csp_string(Keyword.t()) :: String.t()
defp csp_string(options) do
@@ -117,6 +117,8 @@ defmodule Mobilizon.Web.Plugs.HTTPSecurityPlug do
style_src = [style_src] ++ [get_csp_config(:style_src, options)]
+ style_src = [style_src] ++ ["'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU='"]
+
font_src = [@font_src] ++ [get_csp_config(:font_src, options)]
frame_src = build_csp_field(:frame_src, options)
diff --git a/lib/web/router.ex b/lib/web/router.ex
index 9a1534e88..6233aed7b 100644
--- a/lib/web/router.ex
+++ b/lib/web/router.ex
@@ -120,6 +120,7 @@ defmodule Mobilizon.Web.Router do
get("/@:name", PageController, :actor)
get("/events/me", PageController, :my_events)
get("/events/create", PageController, :create_event)
+ get("/events/calendar", PageController, :calendar)
get("/events/:uuid", PageController, :event)
get("/comments/:uuid", PageController, :comment)
get("/resource/:uuid", PageController, :resource)
@@ -188,6 +189,7 @@ defmodule Mobilizon.Web.Router do
get("/events/create", PageController, :create_event)
get("/events/list", PageController, :list_events)
get("/events/me", PageController, :my_events)
+ get("/events/calendar", PageController, :calendar)
get("/events/:uuid/edit", PageController, :edit_event)
# This is a hack to ease link generation into emails
diff --git a/package-lock.json b/package-lock.json
index 41b806ebd..9768dd4a1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,6 +11,11 @@
"@apollo/client": "^3.3.16",
"@framasoft/socket": "^1.0.0",
"@framasoft/socket-apollo-link": "^1.0.0",
+ "@fullcalendar/core": "^6.1.10",
+ "@fullcalendar/daygrid": "^6.1.10",
+ "@fullcalendar/icalendar": "^6.1.10",
+ "@fullcalendar/interaction": "^6.1.10",
+ "@fullcalendar/vue3": "^6.1.10",
"@oruga-ui/oruga-next": "^0.8.2",
"@oruga-ui/theme-oruga": "^0.2.0",
"@sentry/tracing": "^7.1",
@@ -56,6 +61,7 @@
"graphql": "^16.8.1",
"graphql-tag": "^2.10.3",
"hammerjs": "^2.0.8",
+ "ical.js": "^1.5.0",
"intersection-observer": "^0.12.0",
"jwt-decode": "^4.0.0",
"leaflet": "^1.4.0",
@@ -2649,6 +2655,48 @@
"zen-observable": "^0.10.0"
}
},
+ "node_modules/@fullcalendar/core": {
+ "version": "6.1.10",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.10.tgz",
+ "integrity": "sha512-oTXGJSAGpCf1oY+CKp5qYjMHkJCPBkJ3SHitl63n8Q6xKeiwQ4EF6Au451euUovREwJpLmD1AyZrCnWmtB9AVg==",
+ "dependencies": {
+ "preact": "~10.12.1"
+ }
+ },
+ "node_modules/@fullcalendar/daygrid": {
+ "version": "6.1.10",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.10.tgz",
+ "integrity": "sha512-Z4GRm1IyHKgxXFTWGcEI0nTsvYOIkpE0aMt3/o3ER2SZkF+hfwcDFhtj0c9+WhMjXFIWYeoTnA9rUOY7Zl/nxA==",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.10"
+ }
+ },
+ "node_modules/@fullcalendar/icalendar": {
+ "version": "6.1.10",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/icalendar/-/icalendar-6.1.10.tgz",
+ "integrity": "sha512-TXjtZhjYIQZjeqULRjwDd2VWlymdhJmltaN26YS0dcGuCrQhJJ3x/sODVbVaW1mvbMjnjXYUE8AhdpxvhYGIJg==",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.10",
+ "ical.js": "^1.4.0"
+ }
+ },
+ "node_modules/@fullcalendar/interaction": {
+ "version": "6.1.10",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.10.tgz",
+ "integrity": "sha512-aZRlwCpmDasq2RNeWV0ub20Uevare9Cb6iMlxCacx0fhOC14H28G9d1FsduJIecInL84SPGwt5ItqAYMsWv7zw==",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.10"
+ }
+ },
+ "node_modules/@fullcalendar/vue3": {
+ "version": "6.1.10",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.1.10.tgz",
+ "integrity": "sha512-YMYBQx0TlWNuN4G6ra2dkf5cCF5aVi/2zDLGLvLqe2Nk2o7uNbTkrCSG40061OepWQlJv+hYqm1JukLRmyqi4Q==",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.10",
+ "vue": "^3.0.11"
+ }
+ },
"node_modules/@graphql-typed-document-node/core": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz",
@@ -7962,6 +8010,11 @@
"url": "https://github.com/sponsors/typicode"
}
},
+ "node_modules/ical.js": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-1.5.0.tgz",
+ "integrity": "sha512-7ZxMkogUkkaCx810yp0ZGKvq1ZpRgJeornPttpoxe6nYZ3NLesZe1wWMXDdwTkj/b5NtXT+Y16Aakph/ao98ZQ=="
+ },
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -10310,6 +10363,15 @@
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
},
+ "node_modules/preact": {
+ "version": "10.12.1",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz",
+ "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
diff --git a/package.json b/package.json
index 2a60ad9c6..904f00447 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,11 @@
"@apollo/client": "^3.3.16",
"@framasoft/socket": "^1.0.0",
"@framasoft/socket-apollo-link": "^1.0.0",
+ "@fullcalendar/core": "^6.1.10",
+ "@fullcalendar/daygrid": "^6.1.10",
+ "@fullcalendar/icalendar": "^6.1.10",
+ "@fullcalendar/interaction": "^6.1.10",
+ "@fullcalendar/vue3": "^6.1.10",
"@oruga-ui/oruga-next": "^0.8.2",
"@oruga-ui/theme-oruga": "^0.2.0",
"@sentry/tracing": "^7.1",
@@ -76,6 +81,7 @@
"graphql": "^16.8.1",
"graphql-tag": "^2.10.3",
"hammerjs": "^2.0.8",
+ "ical.js": "^1.5.0",
"intersection-observer": "^0.12.0",
"jwt-decode": "^4.0.0",
"leaflet": "^1.4.0",
diff --git a/src/components/FullCalendar/EventsAgenda.vue b/src/components/FullCalendar/EventsAgenda.vue
new file mode 100644
index 000000000..bcbf806bd
--- /dev/null
+++ b/src/components/FullCalendar/EventsAgenda.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+ {{ t("No events found") }}
+
+
+
+
+
+
+
+
diff --git a/src/components/FullCalendar/EventsCalendar.vue b/src/components/FullCalendar/EventsCalendar.vue
new file mode 100644
index 000000000..68ac3bfbb
--- /dev/null
+++ b/src/components/FullCalendar/EventsCalendar.vue
@@ -0,0 +1,105 @@
+
+
+
+
+ {{ arg.event.title }}
+
+
+
+
+
+
+
+
diff --git a/src/components/Home/SearchFields.vue b/src/components/Home/SearchFields.vue
index 436dbf8bf..807870d45 100644
--- a/src/components/Home/SearchFields.vue
+++ b/src/components/Home/SearchFields.vue
@@ -19,20 +19,18 @@
maxlength="1024"
expanded
/>
-
-
+