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