From 5bd4793b6ee448b3c5e706409643b38171e42272 Mon Sep 17 00:00:00 2001 From: Alex Lion Date: Fri, 26 Dec 2025 14:46:16 +0100 Subject: [PATCH] Version 2.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## ⚠️ Breaking changes - S3 variables are now named: S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_REGION and S3_BUCKET - Users now have roles. Refer to the `roles` table and assign a role to a user with the `role_id` column in the `users` table. ## Features - Add Admin Panel to manage users and presentations - Add user roles: user, admin - Add `LANGUAGES` setting to configure available languages in the app - Add hideable presenter attendee count (#183 #155) - Add Hungarian translation (#161) - Add Latvian translation (#163) - Add custom S3 endpoint with `S3_SCHEME`, `S3_HOST`, `S3_PORT` and `S3_PUBLIC_URL` ## Fixes and improvements - Upgrade JS dependencies - Upgrade Elixir dependencies, including Phoenix Live View to 1.0.17 - Upgrade to Tailwind 4+ - Refactor view templates to use {} instead of <%= %> - Fix event name validation to be required - Docker image is now using Ubuntu instead of Alpine for better dependencies support - Fix scrollbar not showing in event manager when no presentation file (#164) (@aryel780) - Fix settings scroll for small screen (#168) - Fix duplicate key quiz when duplicate (#182) - Fix email change confirmation (#172) - Fix italian translation (#179) - Fix random poll choices (#184) --- .env.sample | 22 +- .github/workflows/elixir.yml | 4 +- .gitignore | 7 +- CHANGELOG.md | 32 + CLAUDE.md | 112 + CNAME | 1 - Dockerfile | 89 +- Dockerfile.dev | 13 +- README.md | 2 +- assets/css/admin.css | 63 + assets/css/app.css | 93 +- assets/css/modern.css | 152 + assets/css/theme.css | 87 + assets/js/admin-charts.js | 207 ++ assets/js/app.js | 176 +- assets/js/hooks.js | 197 ++ assets/package-lock.json | 2912 ++++++++--------- assets/package.json | 10 +- assets/postcss.config.js | 4 +- assets/tailwind.config.js | 134 - charts/claper/templates/_env.yaml | 8 +- config/config.exs | 19 +- config/dev.exs | 12 +- config/runtime.exs | 60 +- dev.sh | 14 - docker-compose.yml | 2 - elixir_buildpack.config | 2 - lib/claper/accounts.ex | 376 ++- lib/claper/accounts/guardian.ex | 27 + lib/claper/accounts/oidc.ex | 119 + lib/claper/accounts/oidc/provider.ex | 57 + lib/claper/accounts/role.ex | 31 + lib/claper/accounts/user.ex | 31 +- lib/claper/accounts/user_notifier.ex | 2 +- lib/claper/admin.ex | 635 ++++ lib/claper/embeds/embed.ex | 4 +- lib/claper/events.ex | 543 +-- lib/claper/events/event.ex | 15 +- lib/claper/forms/field.ex | 6 +- lib/claper/forms/form_submit.ex | 2 +- lib/claper/polls/poll.ex | 6 +- lib/claper/presentations.ex | 59 + .../presentations/presentation_state.ex | 3 + lib/claper/quizzes.ex | 64 +- lib/claper/quizzes/quiz.ex | 16 + lib/claper/quizzes/quiz_question.ex | 12 +- lib/claper/quizzes/quiz_question_opt.ex | 11 + lib/claper/quizzes/quiz_response.ex | 14 +- lib/claper/release.ex | 3 +- lib/claper/tasks/converter.ex | 34 +- lib/claper/workers/mailers.ex | 14 +- lib/claper_web.ex | 8 +- lib/claper_web/controllers/stat_controller.ex | 2 +- lib/claper_web/controllers/user_oidc_auth.ex | 2 +- lib/claper_web/gettext.ex | 4 +- lib/claper_web/helpers/csv_exporter.ex | 169 + .../live/admin_live/dashboard_live.ex | 109 + .../live/admin_live/dashboard_live.html.heex | 212 ++ lib/claper_web/live/admin_live/event_live.ex | 175 + .../live/admin_live/event_live.html.heex | 367 +++ .../admin_live/event_live/form_component.ex | 160 + .../live/admin_live/form_field_component.ex | 184 ++ .../live/admin_live/modal_component.ex | 196 ++ .../live/admin_live/oidc_provider_live.ex | 155 + .../admin_live/oidc_provider_live.html.heex | 358 ++ .../oidc_provider_live/form_component.ex | 222 ++ .../admin_live/search_filter_component.ex | 175 + .../admin_live/searchable_select_component.ex | 170 + .../admin_live/table_actions_component.ex | 242 ++ .../live/admin_live/table_component.ex | 282 ++ lib/claper_web/live/admin_live/user_live.ex | 192 ++ .../live/admin_live/user_live.html.heex | 348 ++ .../admin_live/user_live/form_component.ex | 196 ++ .../live/embed_live/form_component.html.heex | 26 +- .../live/event_live/embed_component.ex | 6 +- .../live/event_live/embed_iframe_component.ex | 2 +- .../live/event_live/event_card_component.ex | 80 +- .../event_live/event_form_component.html.heex | 84 +- .../live/event_live/form_component.ex | 14 +- lib/claper_web/live/event_live/index.ex | 35 +- .../live/event_live/index.html.heex | 35 +- lib/claper_web/live/event_live/join.html.heex | 34 +- lib/claper_web/live/event_live/manage.ex | 58 +- .../live/event_live/manage.html.heex | 253 +- .../event_live/manageable_post_component.ex | 32 +- .../event_live/manageable_quiz_component.ex | 16 +- .../event_live/manager_settings_component.ex | 749 +++-- .../live/event_live/poll_component.ex | 26 +- .../live/event_live/post_component.ex | 42 +- lib/claper_web/live/event_live/presenter.ex | 4 +- .../live/event_live/presenter.html.heex | 62 +- .../live/event_live/quiz_component.ex | 42 +- lib/claper_web/live/event_live/show.ex | 21 +- lib/claper_web/live/event_live/show.html.heex | 78 +- .../live/form_live/form_component.html.heex | 19 +- lib/claper_web/live/modal_component.ex | 15 +- .../live/poll_live/form_component.html.heex | 28 +- .../live/quiz_live/quiz_component.html.heex | 44 +- lib/claper_web/live/stat_live/index.html.heex | 92 +- .../live/user_settings_live/show.html.heex | 107 +- lib/claper_web/notifiers/leader_notifier.ex | 2 +- lib/claper_web/notifiers/user_notifier.ex | 30 +- lib/claper_web/plugs/admin_required_plug.ex | 33 + lib/claper_web/router.ex | 28 + lib/claper_web/templates/error/404.html.heex | 6 +- lib/claper_web/templates/error/500.html.heex | 6 +- .../templates/error/csrf_error.html.heex | 20 +- .../templates/layout/_avatar.html.heex | 4 +- .../layout/_profile_dropdown.html.heex | 6 +- .../templates/layout/_user_menu.html.heex | 17 +- .../templates/layout/admin.html.heex | 316 ++ lib/claper_web/templates/layout/app.html.heex | 2 +- .../templates/layout/email.html.heex | 2 +- .../templates/layout/live.html.heex | 10 +- .../templates/layout/root.html.heex | 11 +- .../templates/layout/user.html.heex | 8 +- .../leader_notifier/invitation.html.heex | 16 +- .../templates/lti/launch/error.html.heex | 8 +- .../templates/lti/registration/new.html.heex | 10 +- .../lti/registration/success.html.heex | 14 +- .../page/user_confirmation/edit.html.heex | 6 +- .../page/user_confirmation/new.html.heex | 10 +- .../templates/user_confirmation/new.html.heex | 10 +- .../templates/user_notifier/change.html.heex | 14 +- .../templates/user_notifier/confirm.html.heex | 14 +- .../templates/user_notifier/magic.html.heex | 14 +- .../templates/user_notifier/reset.html.heex | 14 +- .../templates/user_notifier/welcome.html.heex | 32 +- .../user_registration/confirm.html.heex | 12 +- .../templates/user_registration/new.html.heex | 6 +- .../user_reset_password/edit.html.heex | 6 +- .../user_reset_password/new.html.heex | 6 +- .../templates/user_session/new.html.heex | 20 +- .../validators/admin_form_validator.ex | 122 + lib/claper_web/views/admin/shared_view.ex | 3 + .../views/components/alert_component.ex | 8 +- .../views/components/input_component.ex | 108 +- lib/claper_web/views/error_helpers.ex | 10 +- lib/claper_web/views/layout_view.ex | 11 + lib/claper_web/views/leader_notifier_view.ex | 2 +- lib/claper_web/views/user_notifier_view.ex | 2 +- lib/utils/file_upload.ex | 27 - lib/utils/simple_s3_upload.ex | 127 - mix.exs | 71 +- mix.lock | 112 +- phoenix_static_buildpack.config | 1 - priv/gettext/de/LC_MESSAGES/default.po | 1142 ++++++- priv/gettext/default.pot | 1142 ++++++- priv/gettext/en/LC_MESSAGES/default.po | 1142 ++++++- priv/gettext/es/LC_MESSAGES/default.po | 1146 +++++-- priv/gettext/fr/LC_MESSAGES/default.po | 1144 ++++++- priv/gettext/hu/LC_MESSAGES/default.po | 2681 +++++++++++++++ priv/gettext/hu/LC_MESSAGES/errors.po | 97 + priv/gettext/it/LC_MESSAGES/default.po | 1152 +++++-- priv/gettext/lv/LC_MESSAGES/default.po | 2685 +++++++++++++++ priv/gettext/lv/LC_MESSAGES/errors.po | 90 + priv/gettext/nl/LC_MESSAGES/default.po | 1142 ++++++- .../20250711135508_create_roles.exs | 14 + .../20250711135909_add_role_id_to_users.exs | 11 + .../20250711164053_create_oidc_providers.exs | 22 + ...show_attendee_count_presentation_state.exs | 9 + priv/repo/seeds.exs | 46 + .../Montserrat-Italic-VariableFont_wght.ttf | Bin 0 -> 701156 bytes .../Montserrat-VariableFont_wght.ttf | Bin 0 -> 688600 bytes reset-db.sh | 6 - test/claper/accounts/role_test.exs | 133 + test/claper/embeds_test.exs | 8 +- test/claper/events_test.exs | 570 +++- test/claper/forms_test.exs | 4 +- test/claper/quizzes_test.exs | 6 +- test/claper_web/helpers/csv_exporter_test.exs | 219 ++ test/support/data_case.ex | 10 +- test/support/fixtures/events_fixtures.ex | 22 +- with_env.sh | 36 + 174 files changed, 23526 insertions(+), 4920 deletions(-) create mode 100644 CLAUDE.md delete mode 100644 CNAME create mode 100644 assets/css/admin.css create mode 100644 assets/css/modern.css create mode 100644 assets/css/theme.css create mode 100644 assets/js/admin-charts.js create mode 100644 assets/js/hooks.js delete mode 100644 assets/tailwind.config.js delete mode 100755 dev.sh delete mode 100644 elixir_buildpack.config create mode 100644 lib/claper/accounts/guardian.ex create mode 100644 lib/claper/accounts/oidc.ex create mode 100644 lib/claper/accounts/oidc/provider.ex create mode 100644 lib/claper/accounts/role.ex create mode 100644 lib/claper/admin.ex create mode 100644 lib/claper_web/helpers/csv_exporter.ex create mode 100644 lib/claper_web/live/admin_live/dashboard_live.ex create mode 100644 lib/claper_web/live/admin_live/dashboard_live.html.heex create mode 100644 lib/claper_web/live/admin_live/event_live.ex create mode 100644 lib/claper_web/live/admin_live/event_live.html.heex create mode 100644 lib/claper_web/live/admin_live/event_live/form_component.ex create mode 100644 lib/claper_web/live/admin_live/form_field_component.ex create mode 100644 lib/claper_web/live/admin_live/modal_component.ex create mode 100644 lib/claper_web/live/admin_live/oidc_provider_live.ex create mode 100644 lib/claper_web/live/admin_live/oidc_provider_live.html.heex create mode 100644 lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex create mode 100644 lib/claper_web/live/admin_live/search_filter_component.ex create mode 100644 lib/claper_web/live/admin_live/searchable_select_component.ex create mode 100644 lib/claper_web/live/admin_live/table_actions_component.ex create mode 100644 lib/claper_web/live/admin_live/table_component.ex create mode 100644 lib/claper_web/live/admin_live/user_live.ex create mode 100644 lib/claper_web/live/admin_live/user_live.html.heex create mode 100644 lib/claper_web/live/admin_live/user_live/form_component.ex create mode 100644 lib/claper_web/plugs/admin_required_plug.ex create mode 100644 lib/claper_web/templates/layout/admin.html.heex create mode 100644 lib/claper_web/validators/admin_form_validator.ex create mode 100644 lib/claper_web/views/admin/shared_view.ex delete mode 100644 lib/utils/file_upload.ex delete mode 100644 lib/utils/simple_s3_upload.ex delete mode 100644 phoenix_static_buildpack.config create mode 100644 priv/gettext/hu/LC_MESSAGES/default.po create mode 100644 priv/gettext/hu/LC_MESSAGES/errors.po create mode 100644 priv/gettext/lv/LC_MESSAGES/default.po create mode 100644 priv/gettext/lv/LC_MESSAGES/errors.po create mode 100644 priv/repo/migrations/20250711135508_create_roles.exs create mode 100644 priv/repo/migrations/20250711135909_add_role_id_to_users.exs create mode 100644 priv/repo/migrations/20250711164053_create_oidc_providers.exs create mode 100644 priv/repo/migrations/20251020162958_add_show_attendee_count_presentation_state.exs create mode 100644 priv/static/fonts/Montserrat/Montserrat-Italic-VariableFont_wght.ttf create mode 100644 priv/static/fonts/Montserrat/Montserrat-VariableFont_wght.ttf delete mode 100755 reset-db.sh create mode 100644 test/claper/accounts/role_test.exs create mode 100644 test/claper_web/helpers/csv_exporter_test.exs create mode 100755 with_env.sh diff --git a/.env.sample b/.env.sample index 7e069d2..dc725c4 100644 --- a/.env.sample +++ b/.env.sample @@ -3,7 +3,7 @@ BASE_URL=http://localhost:4000 # SECURE_COOKIE=false DATABASE_URL=postgres://claper:claper@db:5432/claper -SECRET_KEY_BASE=0LZiQBLw4WvqPlz4cz8RsHJlxNiSqM9B48y4ChyJ5v1oA0L/TPIqRjQNdPZN3iEG # Generate with `mix phx.gen.secret` +SECRET_KEY_BASE=0LZiQBLw4WvqPlz4cz8RsHJlxNiSqM9B48y4ChyJ5v1oA0L/TPIqRjQNdPZN3iEG # Generate with `mix phx.gen.secret` # ⚠️ Don't use this exact value for SECRET_KEY_BASE or someone would be able to sign a cookie with user_id=1 and log in as the admin! # Storage configuration @@ -12,10 +12,19 @@ PRESENTATION_STORAGE=local PRESENTATION_STORAGE_DIR=/app/uploads #MAX_FILE_SIZE_MB=15 -#AWS_ACCESS_KEY_ID=xxx -#AWS_SECRET_ACCESS_KEY=xxx -#AWS_REGION=eu-west-3 -#AWS_PRES_BUCKET=xxx +# The standard AWS environment variables +#S3_ACCESS_KEY_ID=xxx +#S3_SECRET_ACCESS_KEY=xxx +#S3_REGION=eu-west-3 +#S3_BUCKET=xxx + +# If you're using an alternative S3-compatible service, port optional +#S3_SCHEME=https:// +#S3_HOST=www.example.com +#S3_PORT=443 + +# If the public S3-compatible URL is different from the one used to write data +#S3_PUBLIC_URL=https://www.example.com # Mail configuration @@ -39,6 +48,7 @@ MAIL_FROM_NAME=Claper #ALLOW_UNLINK_EXTERNAL_PROVIDER=false #LOGOUT_REDIRECT_URL=https://google.com #GS_JPG_RESOLUTION=300x300 +#LANGUAGES=en,fr,es,it,nl,de # OIDC configuration @@ -49,4 +59,4 @@ MAIL_FROM_NAME=Claper # OIDC_SCOPES="openid email profile" # OIDC_LOGO_URL="" # OIDC_PROPERTY_MAPPINGS="roles:custom_attributes.roles,organization:custom_attributes.organization" -# OIDC_AUTO_REDIRECT_LOGIN=true \ No newline at end of file +# OIDC_AUTO_REDIRECT_LOGIN=true diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml index 0f1934e..6dc5a15 100644 --- a/.github/workflows/elixir.yml +++ b/.github/workflows/elixir.yml @@ -42,8 +42,8 @@ jobs: - name: Set up Elixir uses: erlef/setup-beam@v1 with: - elixir-version: '1.16.2' - otp-version: '26' + elixir-version: '1.18.4' + otp-version: '28' - name: Restore dependencies cache uses: actions/cache@v3 with: diff --git a/.gitignore b/.gitignore index b7b3375..bb6c6f5 100644 --- a/.gitignore +++ b/.gitignore @@ -30,16 +30,21 @@ claper-*.tar # Ignore digested assets cache. /priv/static/cache_manifest.json +# Env files except sample +.env* +!.env.sample + # In case you use Node.js/npm, you want to ignore these. npm-debug.log /assets/node_modules/ priv/static/images/.DS_Store priv/static/.DS_Store -.env priv/static/fonts/.DS_Store test/e2e/node_modules .DS_Store priv/static/.well-known/apple-developer-merchantid-domain-association priv/static/loaderio-eb3b956a176cdd4f54eb8570ce8bbb06.txt .elixir_ls + +tailwind.config.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 422a79c..5949489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ +### v.2.4.0 + +### ⚠️ Breaking changes + +- S3 variables are now named: S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_REGION and S3_BUCKET +- Users now have roles. Refer to the `roles` table and assign a role to a user with the `role_id` column in the `users` table. + +### Features + +- Add Admin Panel to manage users and presentations +- Add user roles: user, admin +- Add `LANGUAGES` setting to configure available languages in the app +- Add hideable presenter attendee count (#183 #155) +- Add Hungarian translation (#161) +- Add Latvian translation (#163) +- Add custom S3 endpoint with `S3_SCHEME`, `S3_HOST`, `S3_PORT` and `S3_PUBLIC_URL` + +### Fixes and improvements + +- Upgrade JS dependencies +- Upgrade Elixir dependencies, including Phoenix Live View to 1.0.17 +- Upgrade to Tailwind 4+ +- Refactor view templates to use {} instead of <%= %> +- Fix event name validation to be required +- Docker image is now using Ubuntu instead of Alpine for better dependencies support +- Fix scrollbar not showing in event manager when no presentation file (#164) (@aryel780) +- Fix settings scroll for small screen (#168) +- Fix duplicate key quiz when duplicate (#182) +- Fix email change confirmation (#172) +- Fix italian translation (#179) +- Fix random poll choices (#184) + ### v.2.3.2 ### Fixes and improvements diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e043078 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,112 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Common Development Commands + +### Setup and Dependencies +```bash +# Install dependencies +mix deps.get +mix setup # Runs deps.get + ecto.setup + +# Setup database +mix ecto.setup # Creates DB, runs migrations, seeds +mix ecto.reset # Drops DB and runs ecto.setup + +# Install frontend dependencies +cd assets && npm install && cd .. +``` + +### Running the Application +```bash +# Start Phoenix server +mix phx.server + +# Or inside IEx +iex -S mix phx.server +``` + +### Testing +```bash +# Run tests +mix test + +# Run specific test file +mix test test/path/to/test_file.exs + +# Run test with specific line number +mix test test/path/to/test_file.exs:42 +``` + +### Code Quality +```bash +# Format code +mix format + +# Run Credo for code analysis +mix credo +``` + +### Building Assets +```bash +# For production deployment +mix assets.deploy +``` + +## High-Level Architecture + +Claper is an interactive presentation platform built with Phoenix Framework and Elixir. It enables real-time audience interaction during presentations through polls, forms, messages, and quizzes. + +### Core Components + +1. **Phoenix LiveView Architecture** + - Real-time updates without JavaScript through WebSocket connections + - LiveView modules in `lib/claper_web/live/` handle interactive UI + - Presence tracking for real-time user counts + +2. **Main Domain Contexts** (in `lib/claper/`) + - `Accounts` - User management, authentication, OIDC integration + - `Events` - Core presentation/event management + - `Posts` - Audience messages and reactions + - `Polls` - Interactive polls with real-time voting + - `Forms` - Custom forms for audience feedback + - `Quizzes` - Quiz functionality with LTI support + - `Presentations` - Slide management and state tracking + - `Embeds` - External content embedding + +3. **Authentication & Authorization** + - Multiple auth methods: email/password, OIDC + - Role-based access control with admin panel + - LTI 1.3 support for educational platforms + +4. **Real-time Features** + - Phoenix PubSub for broadcasting updates + - Phoenix Presence for tracking online users + - LiveView for reactive UI without custom JavaScript + +5. **Background Jobs** + - Oban for background job processing + - Email sending + +6. **Frontend Stack** + - Tailwind CSS for styling (with DaisyUI components) + - Alpine.js for minimal JavaScript interactions + - esbuild for JavaScript bundling + - Separate admin and user interfaces + +7. **Key LiveView Modules** + - `EventLive.Show` - Attendee view + - `EventLive.Presenter` - Presenter control view + - `EventLive.Manage` - Event management interface + - `AdminLive.*` - Admin panel components + +8. **Database Structure** + - PostgreSQL with Ecto + - Key models: User, Event, Post, Poll, Quiz, PresentationState + - Soft deletes for users + - UUID-based public identifiers + +9. **LTI Integration** + - LTI 1.3 support for quizzes, publish score to LMS + - LTI launch handling in `LtiController` diff --git a/CNAME b/CNAME deleted file mode 100644 index d0de72e..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -docs.claper.co \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 8132d81..7d006ae 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,22 @@ -# Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian instead of -# Alpine to avoid DNS resolution issues in production. -# -# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu -# https://hub.docker.com/_/ubuntu?tab=tags -# -# -# This file is based on these images: -# -# - https://hub.docker.com/r/hexpm/elixir/tags - for the build image -# - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20210902-slim - for the release image -# - https://pkgs.org/ - resource for finding needed packages -# - Ex: hexpm/elixir:1.13.2-erlang-24.2.1-debian-bullseye-20210902-slim -# -ARG BUILDER_IMAGE="hexpm/elixir:1.16.0-erlang-26.2.1-alpine-3.18.4" -ARG RUNNER_IMAGE="alpine:3.18.4" +ARG BUILDER_IMAGE="hexpm/elixir:1.18.4-erlang-28.0.1-ubuntu-noble-20250619" +ARG RUNNER_IMAGE="ubuntu:24.04" FROM ${BUILDER_IMAGE} as builder -# install build dependencies -# RUN apt-get update -y && apt-get install -y curl build-essential git \ -# && apt-get clean && rm -f /var/lib/apt/lists/*_* -RUN apk add --no-cache -U build-base git curl bash ca-certificates nodejs npm openssl ncurses +RUN apt-get update && apt-get install -y \ + build-essential \ + git \ + curl \ + bash \ + ca-certificates \ + nodejs \ + npm \ + openssl \ + libncurses5-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* -ENV NODE_VERSION 16.20.0 +ENV NODE_VERSION 22.17.0 ENV PRESENTATION_STORAGE_DIR /app/uploads # custom ERL_FLAGS are passed for (public) multi-platform builds @@ -30,19 +24,6 @@ ENV PRESENTATION_STORAGE_DIR /app/uploads ARG ERL_FLAGS ENV ERL_FLAGS=$ERL_FLAGS -# Install nvm with node and npm -# RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash \ -# && . $HOME/.nvm/nvm.sh \ -# && nvm install $NODE_VERSION \ -# && nvm alias default $NODE_VERSION \ -# && nvm use default - -# ENV NODE_PATH $HOME/.nvm/versions/node/v$NODE_VERSION/lib/node_modules -# ENV PATH $HOME/.nvm/versions/node/v$NODE_VERSION/bin:$PATH - -# RUN ln -sf $HOME/.nvm/versions/node/v$NODE_VERSION/bin/npm /usr/bin/npm -# RUN ln -sf $HOME/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/node - # prepare build dir WORKDIR /app @@ -66,25 +47,14 @@ RUN mix deps.compile COPY priv priv -# note: if your project uses a tool like https://purgecss.com/, -# which customizes asset compilation based on what it finds in -# your Elixir templates, you will need to move the asset compilation -# step down so that `lib` is available. COPY assets assets -# Compile the release COPY lib lib RUN mix compile -RUN npm install -g sass -RUN cd assets && npm i && \ - sass --no-source-map --style=compressed css/custom.scss ../priv/static/assets/custom.css +RUN mix assets.deploy -# compile assets -RUN mix assets.deploy.nosass - -# Changes to config/runtime.exs don't require recompiling the code COPY config/runtime.exs config/ COPY rel rel @@ -94,20 +64,27 @@ RUN mix release # the compiled release and other runtime necessities FROM ${RUNNER_IMAGE} -# RUN apt-get update -y && apt-get install -y curl libstdc++6 openssl libncurses5 locales ghostscript default-jre libreoffice-java-common \ -# && apt-get install -y libreoffice --no-install-recommends && apt-get clean && rm -f /var/lib/apt/lists/*_* -RUN apk add --no-cache curl libstdc++6 openssl ncurses ghostscript openjdk11-jre +RUN apt-get update -y && apt-get install -y curl libstdc++6 openssl locales ghostscript default-jre libreoffice-java-common \ + && apt-get install -y libreoffice --no-install-recommends && apt-get clean && rm -f /var/lib/apt/lists/*_* +# RUN apk add --no-cache curl libstdc++ openssl ncurses ghostscript openjdk11-jre # Install LibreOffice & Common Fonts -RUN apk --no-cache add bash libreoffice util-linux libreoffice-common \ - font-droid-nonlatin font-droid ttf-dejavu ttf-freefont ttf-liberation && \ - rm -rf /var/cache/apk/* +RUN apt-get update && apt-get install -y \ + libreoffice \ + fonts-dejavu \ + fonts-freefont-ttf \ + fonts-liberation \ + fonts-droid-fallback \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* # Install Microsoft Core Fonts -RUN apk --no-cache add msttcorefonts-installer fontconfig && \ - update-ms-fonts && \ - fc-cache -f && \ - rm -rf /var/cache/apk/* +RUN apt-get update && apt-get install -y \ + ttf-mscorefonts-installer \ + fontconfig \ + && fc-cache -f \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en diff --git a/Dockerfile.dev b/Dockerfile.dev index d502072..2a3a655 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -61,19 +61,18 @@ RUN ARCH=$(uname -m) && \ && rm asdf-v${ASDF_VERSION}-linux-${ASDF_ARCH}.tar.gz \ && mv asdf /usr/bin/ - # Install Erlang and Elixir using asdf RUN asdf plugin add erlang \ && asdf plugin add elixir \ - && asdf install erlang 26.2.1 \ - && asdf install elixir 1.16.0 \ - && asdf set -u erlang 26.2.1 \ - && asdf set -u elixir 1.16.0 + && asdf install erlang 28.0.1 \ + && asdf install elixir 1.18.4-otp-28 \ + && asdf set -u erlang 28.0.1 \ + && asdf set -u elixir 1.18.4-otp-28 # Install Node.js using asdf RUN asdf plugin add nodejs \ - && asdf install nodejs 22.1.0 \ - && asdf set -u nodejs 22.1.0 + && asdf install nodejs 22.17.0 \ + && asdf set -u nodejs 22.17.0 ENV PATH="/root/.asdf/shims:$PATH" diff --git a/README.md b/README.md index e56581b..a4ae41c 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Claper has a two-sided mission: - The first one is to help these people presenting an idea or a message by giving them the opportunity to make their presentation unique and to have real-time feedback from their audience. - The second one is to help each participant to take their place, to be an actor in the presentation, in the meeting and to feel important and useful. -Supported languages: 🇬🇧 English, 🇫🇷 French, 🇩🇪 German, 🇪🇸 Spanish, 🇳🇱 Dutch, 🇮🇹 Italian +Supported languages: 🇬🇧 English, 🇫🇷 French, 🇩🇪 German, 🇪🇸 Spanish, 🇳🇱 Dutch, 🇮🇹 Italian, 🇭🇺 Hungarian, 🇱🇻 Latvian ### Built With diff --git a/assets/css/admin.css b/assets/css/admin.css new file mode 100644 index 0000000..c8d7ad5 --- /dev/null +++ b/assets/css/admin.css @@ -0,0 +1,63 @@ +@import "tailwindcss"; +@plugin "daisyui"; + +@utility btn { + @apply rounded-full !font-display text-small-body; +} + +@utility input { + @apply rounded-full focus:outline-none focus-within:outline-none focus:border-2 focus-within:border-2 !font-display text-small-body transition-all; +} + +@utility select { + @apply rounded-full focus:outline-none focus-within:outline-none focus:border-2 focus-within:border-2 !font-display text-small-body transition-all; +} + +@utility label { + @apply ml-2; +} + +@utility fieldset-legend { + @apply ml-3; +} + +@plugin "daisyui/theme" { + name: "claper"; + default: true; /* set as default */ + prefersdark: false; /* set as default dark mode (prefers-color-scheme:dark) */ + color-scheme: light; /* color of browser-provided UI */ + + --color-primary: #140753; + --color-primary-content: #ffffff; + --color-secondary: #f4f4f4; + --color-secondary-content: #140553; + --color-accent: #8611ed; + --color-accent-content: #ffffff; + --color-neutral: #000000; + --color-neutral-content: #ffffff; + --color-info: #79bfe2; + --color-info-content: #0e3649; + --color-success: #3cb957; + --color-success-content: #143e1d; + --color-warning: #ffb62e; + --color-warning-content: #523500; + --color-error: #e7000b; + --color-error-content: #fff; + /* border radius */ + --radius-selector: 1rem; + --radius-field: 0.25rem; + --radius-box: 0.5rem; + + /* base sizes */ + --size-selector: 0.25rem; + --size-field: 0.25rem; + + /* border size */ + --border: 1px; + + /* effects */ + --depth: 1; + --noise: 0; +} + +@import "./modern.css" layer(theme); diff --git a/assets/css/app.css b/assets/css/app.css index 88a6251..b3d3e4d 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -1,12 +1,26 @@ -@import url('air-datepicker/air-datepicker.css'); -@import url("animate.css/animate.min.css"); +@import 'air-datepicker/air-datepicker.css'; +@import 'animate.css/animate.min.css'; -@tailwind base; -@tailwind components; -@tailwind utilities; +@import 'tailwindcss'; +@import './theme.css' layer(theme); + +@plugin "daisyui" { + themes: light --default; + include: toggle; +} + +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } +} * { - font-family: 'Roboto', sans-serif; + font-family: var(--font-family-sans); } [x-cloak] { display: none !important; } @@ -19,19 +33,19 @@ border-radius: 4px; } .alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; + color: var(--color-primary-700); + background-color: var(--color-primary-100); + border-color: var(--color-primary-200); } .alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; + color: var(--color-supporting-yellow-700); + background-color: var(--color-supporting-yellow-50); + border-color: var(--color-supporting-yellow-100); } .alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; + color: var(--color-supporting-red-700); + background-color: var(--color-supporting-red-100); + border-color: var(--color-supporting-red-200); } .alert p { margin-bottom: 0; @@ -40,7 +54,7 @@ display: none; } .invalid-feedback { - color: #a94442; + color: var(--color-supporting-red-700); display: block; margin-top: 2px; } @@ -80,12 +94,13 @@ background-color: #fefefe; margin: 15vh auto; padding: 20px; - border: 1px solid #888; + border: 1px solid var(--color-neutral-300); width: 80%; + box-shadow: var(--shadow-lg); } .phx-modal-close { - color: #aaa; + color: var(--color-neutral-400); float: right; font-size: 28px; font-weight: bold; @@ -93,7 +108,7 @@ .phx-modal-close:hover, .phx-modal-close:focus { - color: black; + color: var(--color-neutral-900); text-decoration: none; cursor: pointer; } @@ -104,13 +119,21 @@ .input:focus~.label, .input:active~.label, .input.filled~.label { - @apply text-sm transition-all duration-100 -top-1.5 text-primary-500; + font-size: 0.875rem; + transition-property: all; + transition-duration: 100ms; + top: -0.375rem; + color: var(--color-primary-500); } .input:focus~.icon, .input:active~.icon, .input.filled~.icon { - @apply transition-all duration-100 left-3 top-6 h-5; + transition-property: all; + transition-duration: 100ms; + left: 0.75rem; + top: 1.5rem; + height: 1.25rem; } .date-placeholder-hidden::-webkit-datetime-edit { @@ -284,8 +307,22 @@ url('/fonts/Roboto/roboto-v29-latin-900italic.svg#Roboto') format('svg'); /* Legacy iOS */ } +@font-face { + font-family: 'Montserrat'; + font-style: normal; + font-weight: 100 300 400 500 700 900; + src: url('/fonts/Montserrat/Montserrat-VariableFont_wght.ttf'); +} + +@font-face { + font-family: 'Montserrat'; + font-style: italic; + font-weight: 100 300 400 500 700 900; + src: url('/fonts/Montserrat/Montserrat-Italic-VariableFont_wght.ttf'); +} + .bg-gradient-animate { - background: linear-gradient(-45deg, #b80fef, #8611ed, #14bfdb, #14bfdb); + background: linear-gradient(-45deg, var(--color-secondary-500), var(--color-secondary-600), var(--color-primary-400), var(--color-primary-400)); background-size: 400% 400%; animation: gradient 15s ease infinite; } @@ -305,7 +342,7 @@ .arrow_box { position: relative; background: #fff; - border: 2px solid #e1e1e1; + border: 2px solid var(--color-neutral-100); } .arrow_box.arrow_right:after, .arrow_box.arrow_right:before { left: 100%; @@ -419,8 +456,7 @@ left: 0; top: 50%; right: 0; - border-top: 3px solid; - @apply border-supporting-red-600; + border-top: var(--color-supporting-red-600) 3px solid; -webkit-transform:rotate(-20deg); -moz-transform:rotate(-20deg); @@ -431,15 +467,16 @@ /* Air datepicker */ .air-datepicker-body--day-name { - @apply text-primary-600; + color: var(--color-primary-600); } .air-datepicker-cell.-selected-, .air-datepicker-cell.-selected-.-current- { - @apply bg-primary-500 text-white hover:bg-primary-600; + background-color: var(--color-primary-500); + color: var(--color-white); } .air-datepicker-cell.-current- { - @apply text-secondary-500; + color: var(--color-secondary-500); } .animate__slow_slow { diff --git a/assets/css/modern.css b/assets/css/modern.css new file mode 100644 index 0000000..9dc3070 --- /dev/null +++ b/assets/css/modern.css @@ -0,0 +1,152 @@ +@theme { + /* Colors */ + /* Main colors */ + --color-*: initial; + --color-sky-blue: #81EBFE; + --color-teal: #14BFDB; + --color-azure: #29ACED; + --color-mauve: #8611ED; + --color-purple: #B80FEF; + --color-navy: #140553; + + /* Light colors */ + --color-cold-pink: #F3DEFA; + --color-warm-pink: #FFD2F6; + --color-yeallaw: #FFEAC2; + --color-pistacio: #D4FFF4; + --color-sky-tern: #C8EDFF; + --color-tealy: #81EBFE; + --color-earl-night: #0A7BB4; + --color-dark-night: #184992; + + /* Gradient */ + --gradient-primary: 123deg, var(--color-sky-blue) -36%, var(--color-teal) -12%, var(--color-azure) 21%, var(--color-mauve) 81%, var(--color-purple) 130%; + --gradient-secondary: 123deg, rgba(129, 235, 254, 0.9) -36%, rgba(20, 191, 219, 0.9) -12%, rgba(41, 172, 237, 0.9) 21%, rgba(134, 17, 237, 0.9) 81%, rgba(184, 15, 239, 0.9) 130%; + + /* Grayscale */ + --color-white: #FFFFFF; + --color-black: #191919; + --color-gray-20: #CCCCCC; + --color-gray-40: #9F9F9F; + --color-gray-60: #737373; + --color-gray-80: #464646; + --color-gray-100: #191919; + --color-gray-120: #000000; + + --color-platinum: #F0F0F0; + --color-platinum-20: #FFFFFF; + --color-platinum-40: #FCFCFC; + --color-platinum-60: #F8F8F8; + --color-platinum-80: #F4F4F4; + --color-platinum-100: #F0F0F0; + --color-platinum-120: #EEEEEE; + + /* Typography */ + --font-display: "Montserrat", sans-serif; + + /* Font Sizes - Desktop */ + --text-h1: 80px; + --leading-h1: 120%; + --font-weight-h1: 900; + + --text-h2: 40px; + --leading-h2: 120%; + --font-weight-h2: 700; + + --text-h3: 32px; + --leading-h3: 120%; + --font-weight-h3: 600; + + --text-h4: 24px; + --leading-h4: 120%; + --font-weight-h4: 500; + + --text-h5: 18px; + --leading-h5: 120%; + --font-weight-h5: 600; + + --text-h6: 16px; + --leading-h6: 120%; + --font-weight-h6: 500; + + --text-subheading: 20px; + --leading-subheading: 150%; + --font-weight-subheading: 300; + + --text-body-bold: 16px; + --leading-body-bold: 150%; + --font-weight-body-bold: 700; + + --text-body: 16px; + --leading-body: 150%; + --font-weight-body: 400; + + --text-small-body-bold: 14px; + --leading-small-body-bold: 150%; + --font-weight-small-body-bold: 600; + + --text-small-body: 14px; + --leading-small-body: 150%; + --font-weight-small-body: 400; + + --text-caption: 14px; + --leading-caption: 150%; + --font-weight-caption: 300; + + /* Font Sizes - Mobile */ + --text-mobile-h1: 32px; + --leading-mobile-h1: 120%; + --font-weight-mobile-h1: 900; + + --text-mobile-h2: 28px; + --leading-mobile-h2: 120%; + --font-weight-mobile-h2: 700; + + --text-mobile-h3: 22px; + --leading-mobile-h3: 120%; + --font-weight-mobile-h3: 600; + + --text-mobile-h4: 18px; + --leading-mobile-h4: 120%; + --font-weight-mobile-h4: 500; + + --text-mobile-h5: 16px; + --leading-mobile-h5: 120%; + --font-weight-mobile-h5: 600; + + --text-mobile-h6: 14px; + --leading-mobile-h6: 120%; + --font-weight-mobile-h6: 500; + + /* Spacing */ + --spacing-0: 0px; + --spacing-4: 4px; + --spacing-8: 8px; + --spacing-12: 12px; + --spacing-16: 16px; + --spacing-20: 20px; + --spacing-24: 24px; + --spacing-28: 28px; + --spacing-32: 32px; + --spacing-36: 36px; + --spacing-40: 40px; + --spacing-44: 44px; + --spacing-48: 48px; + --spacing-52: 52px; + --spacing-56: 56px; + --spacing-60: 60px; + --spacing-64: 64px; + --spacing-68: 68px; + --spacing-72: 72px; + --spacing-76: 76px; + --spacing-80: 80px; + --spacing-128: 128px; + + /* Font Weights */ + --font-weight-regular: 400; + --font-weight-bold: 700; + + /* Shadows */ + --shadow-3xl: 0px 902px 253px 0px rgba(65, 69, 124, 0.00), 0px 577px 231px 0px rgba(65, 69, 124, 0.01), 0px 325px 195px 0px rgba(65, 69, 124, 0.05), 0px 144px 144px 0px rgba(65, 69, 124, 0.09), 0px 36px 79px 0px rgba(65, 69, 124, 0.10) + +} \ No newline at end of file diff --git a/assets/css/theme.css b/assets/css/theme.css new file mode 100644 index 0000000..10987a5 --- /dev/null +++ b/assets/css/theme.css @@ -0,0 +1,87 @@ + +@theme { + /* Primary Colors (water-blue) */ + --color-primary-50: #E3F2FD; + --color-primary-100: #C2E3FA; + --color-primary-200: #84C8F6; + --color-primary-300: #3DA7F0; + --color-primary-400: #1395EC; + --color-primary-500: #1186D5; + --color-primary-600: #0D65A1; + --color-primary-700: #0A5689; + --color-primary-800: #0A4B76; + --color-primary-900: #073250; + + /* Secondary Colors (electric-purple) */ + --color-secondary-50: #F2E0FF; + --color-secondary-100: #E3BDFF; + --color-secondary-200: #C77AFF; + --color-secondary-300: #A62EFF; + --color-secondary-400: #9200FF; + --color-secondary-500: #A327FF; + --color-secondary-600: #6400AD; + --color-secondary-700: #550094; + --color-secondary-800: #490080; + --color-secondary-900: #320057; + + /* Neutral Colors (wedgewood) */ + --color-neutral-50: #F0F4F8; + --color-neutral-100: #D9E3ED; + --color-neutral-200: #B9CCDF; + --color-neutral-300: #97B3CE; + --color-neutral-400: #7499BE; + --color-neutral-500: #507DAA; + --color-neutral-600: #3F6388; + --color-neutral-700: #314D68; + --color-neutral-800: #253B50; + --color-neutral-900: #1A2938; + + /* Supporting Red Colors (rose-madder) */ + --color-supporting-red-50: #FCEDEE; + --color-supporting-red-100: #F9D5D7; + --color-supporting-red-200: #F3ABB0; + --color-supporting-red-300: #ED8188; + --color-supporting-red-400: #E75761; + --color-supporting-red-500: #E12D39; + --color-supporting-red-600: #B4242E; + --color-supporting-red-700: #871B22; + --color-supporting-red-800: #5A1217; + --color-supporting-red-900: #2D090B; + + /* Supporting Yellow Colors (school-bus-yellow) */ + --color-supporting-yellow-50: #FFFBEB; + --color-supporting-yellow-100: #FEF3C7; + --color-supporting-yellow-200: #FDE68A; + --color-supporting-yellow-300: #FCD34D; + --color-supporting-yellow-400: #FBBF24; + --color-supporting-yellow-500: #F59E0B; + --color-supporting-yellow-600: #D97706; + --color-supporting-yellow-700: #B45309; + --color-supporting-yellow-800: #92400E; + --color-supporting-yellow-900: #78350F; + + /* Supporting Green Colors (green-teal) */ + --color-supporting-green-50: #ECFDF5; + --color-supporting-green-100: #D1FAE5; + --color-supporting-green-200: #A7F3D0; + --color-supporting-green-300: #6EE7B7; + --color-supporting-green-400: #34D399; + --color-supporting-green-500: #10B981; + --color-supporting-green-600: #059669; + --color-supporting-green-700: #047857; + --color-supporting-green-800: #065F46; + --color-supporting-green-900: #064E3B; + + /* Font Family */ + --font-family-sans: 'Roboto', sans-serif; + --font-family-serif: 'Merriweather', serif; + --font-display: 'Montserrat', sans-serif; + + /* Box Shadows */ + --shadow-base: 0px 1px 3px 0px rgba(0,0,0,0.1), 0px 1px 2px 0px rgba(0,0,0,0.06); + --shadow-md: 0px 4px 6px 0px rgba(0,0,0,0.1), 0px 2px 4px 0px rgba(0,0,0,0.06); + --shadow-lg: 0px 4px 6px 0px rgba(0,0,0,0.05), 0px 10px 15px 0px rgba(0,0,0,0.1); + --shadow-xl: 0px 10px 10px 0px rgba(0,0,0,0.04), 0px 20px 25px 0px rgba(0,0,0,0.1); + --shadow-2xl: 0px 25px 50px 0px rgba(0,0,0,0.25); + --shadow-inner: inset 0px 2px 4px 0px rgba(0,0,0,0.06); +} diff --git a/assets/js/admin-charts.js b/assets/js/admin-charts.js new file mode 100644 index 0000000..9ab3818 --- /dev/null +++ b/assets/js/admin-charts.js @@ -0,0 +1,207 @@ +import { + Chart, + LineElement, + PointElement, + CategoryScale, + LinearScale, + Title, + Tooltip, + Legend, + LineController, + Filler +} from 'chart.js'; +import 'chartjs-adapter-moment'; + +// Register Chart.js components +Chart.register( + LineElement, + PointElement, + CategoryScale, + LinearScale, + Title, + Tooltip, + Legend, + LineController, + Filler +); + +export class AdminCharts { + constructor() { + this.charts = {}; + this.defaultOptions = { + responsive: true, + maintainAspectRatio: false, + interaction: { + intersect: false, + mode: 'index' + }, + plugins: { + legend: { + display: true, + position: 'top', + labels: { + usePointStyle: true, + padding: 20, + font: { + size: 12, + family: 'Inter, system-ui, sans-serif' + }, + color: 'rgba(255, 255, 255, 0.9)' + } + }, + tooltip: { + enabled: true, + backgroundColor: 'rgba(0, 0, 0, 0.8)', + titleColor: 'rgba(255, 255, 255, 0.9)', + bodyColor: 'rgba(255, 255, 255, 0.9)', + borderColor: 'rgba(255, 255, 255, 0.1)', + borderWidth: 1, + cornerRadius: 8, + displayColors: false, + padding: 12, + titleFont: { + size: 14, + weight: 'bold' + }, + bodyFont: { + size: 13 + } + } + }, + scales: { + x: { + display: true, + grid: { + display: false + }, + ticks: { + color: 'rgba(255, 255, 255, 0.7)', + font: { + size: 11 + } + } + }, + y: { + display: true, + grid: { + color: 'rgba(255, 255, 255, 0.1)', + drawBorder: false + }, + ticks: { + color: 'rgba(255, 255, 255, 0.7)', + font: { + size: 11 + }, + callback: function(value) { + return Number.isInteger(value) ? value : ''; + } + } + } + }, + elements: { + line: { + tension: 0.4, + borderWidth: 3, + fill: true + }, + point: { + radius: 0, + hoverRadius: 6, + hoverBorderWidth: 2, + hoverBorderColor: 'rgba(255, 255, 255, 0.9)' + } + }, + animation: { + duration: 800, + easing: 'easeInOutQuart' + } + }; + } + + createUsersChart(canvasId, data) { + const ctx = document.getElementById(canvasId); + if (!ctx) return null; + + const chartData = { + labels: data.labels, + datasets: [{ + label: 'Users', + data: data.values, + borderColor: 'rgba(102, 126, 234, 1)', + backgroundColor: 'rgba(102, 126, 234, 0.1)', + pointBackgroundColor: 'rgba(102, 126, 234, 1)', + pointBorderColor: 'rgba(255, 255, 255, 0.9)', + pointHoverBackgroundColor: 'rgba(102, 126, 234, 1)', + pointHoverBorderColor: 'rgba(255, 255, 255, 0.9)', + }] + }; + + if (this.charts[canvasId]) { + this.charts[canvasId].destroy(); + } + + this.charts[canvasId] = new Chart(ctx, { + type: 'line', + data: chartData, + options: this.defaultOptions + }); + + return this.charts[canvasId]; + } + + createEventsChart(canvasId, data) { + const ctx = document.getElementById(canvasId); + if (!ctx) return null; + + const chartData = { + labels: data.labels, + datasets: [{ + label: 'Events', + data: data.values, + borderColor: 'rgba(16, 185, 129, 1)', + backgroundColor: 'rgba(16, 185, 129, 0.1)', + pointBackgroundColor: 'rgba(16, 185, 129, 1)', + pointBorderColor: 'rgba(255, 255, 255, 0.9)', + pointHoverBackgroundColor: 'rgba(16, 185, 129, 1)', + pointHoverBorderColor: 'rgba(255, 255, 255, 0.9)', + }] + }; + + if (this.charts[canvasId]) { + this.charts[canvasId].destroy(); + } + + this.charts[canvasId] = new Chart(ctx, { + type: 'line', + data: chartData, + options: this.defaultOptions + }); + + return this.charts[canvasId]; + } + + updateChart(canvasId, data) { + const chart = this.charts[canvasId]; + if (!chart) return; + + chart.data.labels = data.labels; + chart.data.datasets[0].data = data.values; + chart.update('active'); + } + + destroyChart(canvasId) { + if (this.charts[canvasId]) { + this.charts[canvasId].destroy(); + delete this.charts[canvasId]; + } + } + + destroyAllCharts() { + Object.keys(this.charts).forEach(canvasId => { + this.destroyChart(canvasId); + }); + } +} + +// Create global instance +window.AdminCharts = new AdminCharts(); \ No newline at end of file diff --git a/assets/js/app.js b/assets/js/app.js index 9eb6282..93fefdf 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -13,40 +13,71 @@ import airdatepickerLocaleDe from "air-datepicker/locale/de"; import airdatepickerLocaleEs from "air-datepicker/locale/es"; import airdatepickerLocaleNl from "air-datepicker/locale/nl"; import airdatepickerLocaleIt from "air-datepicker/locale/it"; +import airdatepickerLocaleHu from "air-datepicker/locale/hu"; import "moment/locale/de"; import "moment/locale/fr"; import "moment/locale/es"; import "moment/locale/nl"; import "moment/locale/it"; +import "moment/locale/hu"; +import "moment/locale/lv"; import QRCodeStyling from "qr-code-styling"; import { Presenter } from "./presenter"; import { Manager } from "./manager"; import Split from "split-grid"; +import CustomHooks from "./hooks"; import { TourGuideClient } from "@sjmc11/tourguidejs/src/Tour"; +import "./admin-charts.js"; window.moment = moment; -const supportedLocales = ["en", "fr", "de", "es", "nl", "it"]; +// Get supported locales from backend configuration or fallback to default list +const supportedLocales = window.claperConfig?.supportedLocales || [ + "en", + "fr", + "de", + "es", + "nl", + "it", + "hu", + "lv", +]; + +const airdatePickrSupportedLocales = window.claperConfig?.supportedLocales || [ + "en", + "fr", + "de", + "es", + "nl", + "it", + "hu", +]; var locale = document.querySelector("html").getAttribute("lang") || navigator.language.split("-")[0]; +var airdatepickrLocale = locale; + if (!supportedLocales.includes(locale)) { locale = "en"; } +if (!airdatePickrSupportedLocales.includes(locale)) { + airdatepickrLocale = "en"; +} window.moment.locale("en"); window.moment.locale(locale); window.Alpine = Alpine; Alpine.start(); -let airdatepickerLocale = { +let airdatePickrLocales = { en: airdatepickerLocaleEn, fr: airdatepickerLocaleFr, de: airdatepickerLocaleDe, es: airdatepickerLocaleEs, nl: airdatepickerLocaleNl, it: airdatepickerLocaleIt, + hu: airdatepickerLocaleHu, }; let csrfToken = document .querySelector("meta[name='csrf-token']") @@ -69,8 +100,8 @@ Hooks.EmbeddedBanner = { Hooks.TourGuide = { mounted() { this.triggerDiv = document.querySelector(this.el.dataset.btnTrigger); - this.btnTrigger = this.triggerDiv.querySelector('.open'); - this.closeBtnTrigger = this.triggerDiv.querySelector('.close'); + this.btnTrigger = this.triggerDiv.querySelector(".open"); + this.closeBtnTrigger = this.triggerDiv.querySelector(".close"); this.tour = new TourGuideClient({ nextLabel: this.el.dataset.nextLabel, @@ -105,7 +136,7 @@ Hooks.TourGuide = { destroyed() { this.btnTrigger.removeEventListener("click", () => { this.startTour(); - }); + }); this.closeBtnTrigger.removeEventListener("click", () => { this.triggerDiv.classList.add("hidden"); this.tour.finishTour(true, this.el.dataset.group); @@ -200,26 +231,36 @@ Hooks.Scroll = { Hooks.ScrollIntoDiv = { mounted() { let useParent = this.el.dataset.useParent === "true"; - this.scrollElement = this.el.dataset.useParent === "true" ? this.el.parentElement : this.el; + this.scrollElement = + this.el.dataset.useParent === "true" ? this.el.parentElement : this.el; this.checkIfAtBottom(); this.scrollToBottom(true); this.handleEvent("scroll", () => this.scrollToBottom()); this.scrollElement.addEventListener("scroll", () => this.checkIfAtBottom()); }, checkIfAtBottom() { - this.isAtBottom = this.scrollElement.scrollHeight - this.scrollElement.scrollTop - this.scrollElement.clientHeight <= 30; + this.isAtBottom = + this.scrollElement.scrollHeight - + this.scrollElement.scrollTop - + this.scrollElement.clientHeight <= + 30; }, scrollToBottom(force = false) { if (force || this.isAtBottom) { - this.scrollElement.scrollTo({ top: this.scrollElement.scrollHeight, behavior: "smooth" }); + this.scrollElement.scrollTo({ + top: this.scrollElement.scrollHeight, + behavior: "smooth", + }); } }, updated() { this.scrollToBottom(); }, destroyed() { - this.scrollElement.removeEventListener("scroll", () => this.checkIfAtBottom()); - } + this.scrollElement.removeEventListener("scroll", () => + this.checkIfAtBottom(), + ); + }, }; Hooks.NicknamePicker = { @@ -243,7 +284,7 @@ Hooks.NicknamePicker = { clicked(e) { let nickname = prompt( this.el.dataset.prompt, - localStorage.getItem("nickname") || "" + localStorage.getItem("nickname") || "", ); if (nickname) { @@ -265,6 +306,19 @@ Hooks.EmptyNickname = { }, }; +Hooks.SearchableSelect = { + mounted() { + this.handleEvent("update_hidden_field", (payload) => { + if (payload.id === this.el.id) { + this.el.value = payload.value; + // Trigger a change event to update the form + const event = new Event('input', { bubbles: true }); + this.el.dispatchEvent(event); + } + }); + } +}; + Hooks.PostForm = { onPress(e, submitBtn, TA) { if (e.key == "Enter" && !e.shiftKey) { @@ -353,7 +407,7 @@ Hooks.Pickr = { const utc = moment(date).utc().format("YYYY-MM-DDTHH:mm:ss"); utcTime.value = utc; }, - locale: airdatepickerLocale[locale], + locale: airdatePickrLocales[airdatepickrLocale], }); }, updated() {}, @@ -392,7 +446,7 @@ Hooks.OpenPresenter = { window.open( this.el.dataset.url, "newwindow", - "width=" + window.screen.width + ",height=" + window.screen.height + "width=" + window.screen.width + ",height=" + window.screen.height, ); }, mounted() { @@ -417,7 +471,12 @@ Hooks.GlobalReacts = { const container = document.createElement("div"); container.innerHTML = svgContent; const svgElement = container.firstChild; - svgElement.classList.add("react-animation", "absolute", "transform", "opacity-0"); + svgElement.classList.add( + "react-animation", + "absolute", + "transform", + "opacity-0", + ); svgElement.classList.add(...this.el.className.split(" ")); this.el.appendChild(svgElement); } @@ -429,15 +488,17 @@ Hooks.GlobalReacts = { preloadSVGs() { const svgTypes = ["heart", "hundred", "clap", "raisehand"]; - svgTypes.forEach(type => { + svgTypes.forEach((type) => { fetch(`/images/icons/${type}.svg`) - .then(response => response.text()) - .then(svgContent => { + .then((response) => response.text()) + .then((svgContent) => { this.svgCache[type] = svgContent; }) - .catch(error => console.error(`Error loading SVG for ${type}:`, error)); + .catch((error) => + console.error(`Error loading SVG for ${type}:`, error), + ); }); - } + }, }; Hooks.JoinEvent = { mounted() { @@ -570,35 +631,61 @@ Hooks.Dropdown = { }, }; -let Uploaders = {}; - -Uploaders.S3 = function (entries, onViewError) { - entries.forEach((entry) => { - let formData = new FormData(); - let { url, fields } = entry.meta; - Object.entries(fields).forEach(([key, val]) => formData.append(key, val)); - formData.append("file", entry.file); - let xhr = new XMLHttpRequest(); - onViewError(() => xhr.abort()); - xhr.onload = () => - xhr.status === 204 ? entry.progress(100) : entry.error(); - xhr.onerror = () => entry.error(); - xhr.upload.addEventListener("progress", (event) => { - if (event.lengthComputable) { - let percent = Math.round((event.loaded / event.total) * 100); - if (percent < 100) { - entry.progress(percent); - } - } +Hooks.AdminChart = { + mounted() { + const chartType = this.el.dataset.chartType; + const canvasId = this.el.querySelector('canvas').id; + const data = JSON.parse(this.el.dataset.chartData); + + if (chartType === 'users') { + window.AdminCharts.createUsersChart(canvasId, data); + } else if (chartType === 'events') { + window.AdminCharts.createEventsChart(canvasId, data); + } + + this.handleEvent("update_chart", (newData) => { + window.AdminCharts.updateChart(canvasId, newData); }); - - xhr.open("POST", url, true); - xhr.send(formData); - }); + }, + + updated() { + const chartType = this.el.dataset.chartType; + const canvasId = this.el.querySelector('canvas').id; + const data = JSON.parse(this.el.dataset.chartData); + + if (chartType === 'users') { + window.AdminCharts.createUsersChart(canvasId, data); + } else if (chartType === 'events') { + window.AdminCharts.createEventsChart(canvasId, data); + } + }, + + destroyed() { + const canvasId = this.el.querySelector('canvas').id; + window.AdminCharts.destroyChart(canvasId); + } }; +Hooks.CSVDownloader = { + mounted() { + this.handleEvent("download_csv", ({ filename, content }) => { + const blob = new Blob([content], { type: 'text/csv' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + }); + } +}; + +// Merge our custom hooks with the existing hooks +Object.assign(Hooks, CustomHooks); + let liveSocket = new LiveSocket("/live", Socket, { - uploaders: Uploaders, params: { _csrf_token: csrfToken, tz: Intl.DateTimeFormat().resolvedOptions().timeZone, @@ -629,7 +716,6 @@ window.addEventListener("phx:page-loading-stop", (info) => { topbar.hide(); }); - const onlineUserTemplate = function (user) { return `
diff --git a/assets/js/hooks.js b/assets/js/hooks.js new file mode 100644 index 0000000..779e08c --- /dev/null +++ b/assets/js/hooks.js @@ -0,0 +1,197 @@ +// LiveView hooks for client-side functionality + +const Hooks = { + // Hook for handling CSV downloads from LiveView + CSVDownloader: { + mounted() { + this.handleEvent("download_csv", ({ filename, content }) => { + // Create a Blob with the CSV content + const blob = new Blob([content], { type: "text/csv" }); + + // Create a temporary URL for the Blob + const url = window.URL.createObjectURL(blob); + + // Create a temporary link element + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", filename); + + // Append the link to the document body + document.body.appendChild(link); + + // Trigger the download + link.click(); + + // Clean up + window.URL.revokeObjectURL(url); + document.body.removeChild(link); + }); + } + }, + + // Hook for User Growth Chart + UserGrowthChart: { + mounted() { + // Import Chart.js dynamically + import("chart.js/auto").then(({ default: Chart }) => { + const ctx = this.el.getContext("2d"); + const labels = JSON.parse(this.el.dataset.labels); + const values = JSON.parse(this.el.dataset.values); + + this.chart = new Chart(ctx, { + type: "line", + data: { + labels: labels, + datasets: [{ + label: "New Users", + data: values, + borderColor: "#111827", + backgroundColor: "rgba(17, 24, 39, 0.05)", + borderWidth: 2, + tension: 0.4, + fill: true, + pointRadius: 0, + pointHoverRadius: 0, + pointBackgroundColor: "transparent", + pointBorderColor: "transparent" + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + interaction: { + intersect: false, + mode: 'index' + }, + plugins: { + legend: { + display: false + }, + tooltip: { + enabled: true, + backgroundColor: "rgba(17, 24, 39, 0.9)", + titleColor: "#fff", + bodyColor: "#fff", + borderColor: "#111827", + borderWidth: 1, + cornerRadius: 4, + displayColors: false, + padding: 8, + titleFont: { + size: 12 + }, + bodyFont: { + size: 14, + weight: 'bold' + }, + callbacks: { + label: function(context) { + return context.parsed.y + ' users'; + } + } + } + }, + scales: { + x: { + display: false + }, + y: { + display: false + } + } + } + }); + }); + }, + + destroyed() { + if (this.chart) { + this.chart.destroy(); + } + } + }, + + // Hook for Event Creation Chart + EventCreationChart: { + mounted() { + // Import Chart.js dynamically + import("chart.js/auto").then(({ default: Chart }) => { + const ctx = this.el.getContext("2d"); + const labels = JSON.parse(this.el.dataset.labels); + const values = JSON.parse(this.el.dataset.values); + + this.chart = new Chart(ctx, { + type: "line", + data: { + labels: labels, + datasets: [{ + label: "New Events", + data: values, + borderColor: "#111827", + backgroundColor: "rgba(17, 24, 39, 0.05)", + borderWidth: 2, + tension: 0.4, + fill: true, + pointRadius: 0, + pointHoverRadius: 0, + pointBackgroundColor: "transparent", + pointBorderColor: "transparent" + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + interaction: { + intersect: false, + mode: 'index' + }, + plugins: { + legend: { + display: false + }, + tooltip: { + enabled: true, + backgroundColor: "rgba(17, 24, 39, 0.9)", + titleColor: "#fff", + bodyColor: "#fff", + borderColor: "#111827", + borderWidth: 1, + cornerRadius: 4, + displayColors: false, + padding: 8, + titleFont: { + size: 12 + }, + bodyFont: { + size: 14, + weight: 'bold' + }, + callbacks: { + label: function(context) { + return context.parsed.y + ' events'; + } + } + } + }, + scales: { + x: { + display: false + }, + y: { + display: false + } + } + } + }); + }); + }, + + destroyed() { + if (this.chart) { + this.chart.destroy(); + } + } + } +}; + +export default Hooks; diff --git a/assets/package-lock.json b/assets/package-lock.json index c9bfb81..4365d3b 100644 --- a/assets/package-lock.json +++ b/assets/package-lock.json @@ -6,9 +6,10 @@ "": { "dependencies": { "@sjmc11/tourguidejs": "^0.0.16", - "@tailwindcss/container-queries": "^0.1.1", "air-datepicker": "^3.5.0", "animate.css": "^4.1.1", + "chart.js": "^4.4.0", + "chartjs-adapter-moment": "^1.0.1", "moment": "^2.29.4", "moment-timezone": "^0.5.43", "phoenix": "file:../deps/phoenix", @@ -20,32 +21,52 @@ "tiny-slider": "^2.9.4" }, "devDependencies": { + "@tailwindcss/postcss": "^4.1.11", "alpinejs": "^3.13.8", - "autoprefixer": "^10.4.19", - "esbuild": "^0.20.2", + "daisyui": "^5.0.47", + "esbuild": "^0.25.5", "postcss": "^8.4.38", - "postcss-import": "^15.1.0", - "tailwindcss": "^3.3.3" + "tailwindcss": "^4.1.11" } }, "../deps/phoenix": { - "version": "1.7.11", + "version": "1.7.21", "license": "MIT" }, "../deps/phoenix_html": { - "version": "4.1.0" + "version": "4.2.1" }, "../deps/phoenix_live_view": { - "version": "0.20.14", + "version": "1.0.17", "license": "MIT", + "dependencies": { + "morphdom": "2.7.5" + }, "devDependencies": { - "@playwright/test": "^1.41.0" + "@babel/cli": "7.27.0", + "@babel/core": "7.26.10", + "@babel/preset-env": "7.26.9", + "@eslint/js": "^9.24.0", + "@playwright/test": "^1.51.1", + "@stylistic/eslint-plugin-js": "^4.2.0", + "css.escape": "^1.5.1", + "eslint": "9.24.0", + "eslint-plugin-jest": "28.11.0", + "eslint-plugin-playwright": "^2.2.0", + "globals": "^16.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-monocart-coverage": "^1.1.1", + "monocart-reporter": "^2.9.17", + "phoenix": "1.7.21" } }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -53,10 +74,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -66,13 +101,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -82,13 +117,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -98,13 +133,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -114,13 +149,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -130,13 +165,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -146,13 +181,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -162,13 +197,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -178,13 +213,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -194,13 +229,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -210,13 +245,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -226,13 +261,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -242,13 +277,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -258,13 +293,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -274,13 +309,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -290,13 +325,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -306,13 +341,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -322,13 +357,29 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -338,13 +389,29 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -354,13 +421,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -370,13 +437,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -386,13 +453,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -402,13 +469,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -418,7 +485,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@floating-ui/core": { @@ -443,80 +510,63 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "minipass": "^7.0.4" }, "engines": { - "node": ">=6.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" }, "node_modules/@sjmc11/tourguidejs": { "version": "0.0.16", @@ -527,12 +577,280 @@ "sass": "^1.55.0" } }, - "node_modules/@tailwindcss/container-queries": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz", - "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==", - "peerDependencies": { - "tailwindcss": ">=3.2.0" + "node_modules/@tailwindcss/node": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.11", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", + "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "postcss": "^8.4.41", + "tailwindcss": "4.1.11" } }, "node_modules/@vue/reactivity": { @@ -569,11 +887,6 @@ "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz", "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==" }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -586,53 +899,6 @@ "node": ">= 8" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -644,15 +910,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -664,66 +921,28 @@ "node": ">=8" } }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/chart.js": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" + "@kurkle/color": "^0.3.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "pnpm": ">=8" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" + "node_modules/chartjs-adapter-moment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chartjs-adapter-moment/-/chartjs-adapter-moment-1.0.1.tgz", + "integrity": "sha512-Uz+nTX/GxocuqXpGylxK19YG4R3OSVf8326D+HwSTsNw1LgzyIGRo+Qujwro1wy6X+soNSnfj5t2vZ+r6EaDmA==", + "license": "MIT", + "peerDependencies": { + "chart.js": ">=3.0.0", + "moment": "^2.10.2" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001609", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz", - "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -747,114 +966,88 @@ "fsevents": "~2.3.2" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 6" + "node": ">=18" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "node_modules/daisyui": { + "version": "5.0.47", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.0.47.tgz", + "integrity": "sha512-RuYjjVKpodDoOYAHIvG6qC3BeRxhlyj4JCO+6aV0VzK+i3RWD7cmICh0m5+Xfr5938mV0Mk7FUOQ00msz8H8dw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/saadeghi/daisyui?sponsor=1" + } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.736", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", - "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==", - "dev": true - }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/fill-range": { @@ -868,24 +1061,6 @@ "node": ">=8" } }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -899,14 +1074,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -918,36 +1085,18 @@ "node": ">= 6" } }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, "node_modules/immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -959,17 +1108,6 @@ "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -998,55 +1136,301 @@ } }, "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/moment": { @@ -1068,26 +1452,18 @@ "node": "*" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1095,12 +1471,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1109,52 +1479,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, "node_modules/phoenix": { "resolved": "../deps/phoenix", "link": true @@ -1168,9 +1492,11 @@ "link": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -1183,26 +1509,11 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw= sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -1217,112 +1528,16 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, "node_modules/qr-code-styling": { "version": "1.6.0-rc.1", "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.6.0-rc.1.tgz", @@ -1336,33 +1551,6 @@ "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz", "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1374,53 +1562,6 @@ "node": ">=8.10.0" } }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/sass": { "version": "1.72.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", @@ -1438,9 +1579,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1455,121 +1597,39 @@ "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=6" } }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" + "node": ">=18" } }, "node_modules/tiny-slider": { @@ -1588,57 +1648,14 @@ "node": ">=8.0" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 14" + "node": ">=18" } } }, @@ -1646,166 +1663,191 @@ "@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } }, "@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "dev": true, "optional": true }, "@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "dev": true, "optional": true }, @@ -1831,62 +1873,51 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "minipass": "^7.0.4" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } + "@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==" }, "@sjmc11/tourguidejs": { "version": "0.0.16", @@ -1897,11 +1928,147 @@ "sass": "^1.55.0" } }, - "@tailwindcss/container-queries": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz", - "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==", - "requires": {} + "@tailwindcss/node": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" + } + }, + "@tailwindcss/oxide": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "dev": true, + "requires": { + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11", + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + } + }, + "@tailwindcss/oxide-android-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-darwin-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", + "dev": true, + "optional": true, + "requires": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.11", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + } + }, + "@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", + "dev": true, + "optional": true + }, + "@tailwindcss/postcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", + "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "postcss": "^8.4.41", + "tailwindcss": "4.1.11" + } }, "@vue/reactivity": { "version": "3.1.5", @@ -1937,11 +2104,6 @@ "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz", "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==" }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -1951,44 +2113,11 @@ "picomatch": "^2.0.4" } }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "dev": true, - "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, "binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -1997,28 +2126,19 @@ "fill-range": "^7.1.1" } }, - "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, + "chart.js": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "@kurkle/color": "^0.3.0" } }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "caniuse-lite": { - "version": "1.0.30001609", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz", - "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==", - "dev": true + "chartjs-adapter-moment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chartjs-adapter-moment/-/chartjs-adapter-moment-1.0.1.tgz", + "integrity": "sha512-Uz+nTX/GxocuqXpGylxK19YG4R3OSVf8326D+HwSTsNw1LgzyIGRo+Qujwro1wy6X+soNSnfj5t2vZ+r6EaDmA==", + "requires": {} }, "chokidar": { "version": "3.6.0", @@ -2035,92 +2155,65 @@ "readdirp": "~3.6.0" } }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "cssesc": { + "chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "electron-to-chromium": { - "version": "1.4.736", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", - "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true }, - "esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "daisyui": { + "version": "5.0.47", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.0.47.tgz", + "integrity": "sha512-RuYjjVKpodDoOYAHIvG6qC3BeRxhlyj4JCO+6aV0VzK+i3RWD7cmICh0m5+Xfr5938mV0Mk7FUOQ00msz8H8dw==", + "dev": true + }, + "detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, "requires": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, - "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true - }, - "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "requires": { - "reusify": "^1.0.4" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "fill-range": { @@ -2131,28 +2224,12 @@ "to-regex-range": "^5.0.1" } }, - "fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, "fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "optional": true }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -2161,33 +2238,17 @@ "is-glob": "^4.0.1" } }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "requires": { - "function-bind": "^1.1.2" - } + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2196,14 +2257,6 @@ "binary-extensions": "^2.0.0" } }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "requires": { - "hasown": "^2.0.0" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2223,42 +2276,130 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "detect-libc": "^2.0.3", + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "dev": true, + "optional": true + }, + "lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "dev": true, + "optional": true + }, + "lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "dev": true, + "optional": true + }, + "lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "dev": true, + "optional": true + }, + "lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "dev": true, + "optional": true + }, + "lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "dev": true, + "optional": true + }, + "lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "dev": true, + "optional": true + }, + "magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, + "minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "requires": { + "minipass": "^7.1.2" + } + }, + "mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true + }, "moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -2272,25 +2413,10 @@ "moment": "^2.29.4" } }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true }, "normalize-path": { @@ -2298,40 +2424,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, "phoenix": { "version": "file:../deps/phoenix" }, @@ -2341,88 +2433,47 @@ "phoenix_live_view": { "version": "file:../deps/phoenix_live_view", "requires": { - "@playwright/test": "^1.41.0" + "@babel/cli": "7.27.0", + "@babel/core": "7.26.10", + "@babel/preset-env": "7.26.9", + "@eslint/js": "^9.24.0", + "@playwright/test": "^1.51.1", + "@stylistic/eslint-plugin-js": "^4.2.0", + "css.escape": "^1.5.1", + "eslint": "9.24.0", + "eslint-plugin-jest": "28.11.0", + "eslint-plugin-playwright": "^2.2.0", + "globals": "^16.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-monocart-coverage": "^1.1.1", + "monocart-reporter": "^2.9.17", + "morphdom": "2.7.5", + "phoenix": "1.7.21" } }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw= sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" - }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, - "postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - } - }, - "postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "requires": { - "postcss-selector-parser": "^6.0.11" - } - }, - "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, "qr-code-styling": { "version": "1.6.0-rc.1", "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.6.0-rc.1.tgz", @@ -2436,19 +2487,6 @@ "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz", "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "requires": { - "pify": "^2.3.0" - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2457,29 +2495,6 @@ "picomatch": "^2.2.1" } }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, "sass": { "version": "1.72.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", @@ -2491,9 +2506,9 @@ } }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" }, "split-grid": { "version": "1.0.11", @@ -2505,93 +2520,30 @@ "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" }, - "sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, "tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "requires": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - } - } + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "dev": true }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "requires": { - "any-promise": "^1.0.0" - } + "tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, "requires": { - "thenify": ">= 3.1.0 < 4" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" } }, "tiny-slider": { @@ -2607,35 +2559,11 @@ "is-number": "^7.0.0" } }, - "ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==" + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true } } } diff --git a/assets/package.json b/assets/package.json index f7f2c37..6911815 100644 --- a/assets/package.json +++ b/assets/package.json @@ -3,18 +3,20 @@ "deploy": "NODE_ENV=production tailwindcss --postcss --minify --input=css/app.css --output=../priv/static/assets/app.css" }, "devDependencies": { + "@tailwindcss/postcss": "^4.1.11", "alpinejs": "^3.13.8", - "autoprefixer": "^10.4.19", - "esbuild": "^0.20.2", + "daisyui": "^5.0.47", + "esbuild": "^0.25.5", "postcss": "^8.4.38", - "postcss-import": "^15.1.0", - "tailwindcss": "^3.3.3" + "tailwindcss": "^4.1.11" }, "dependencies": { "@sjmc11/tourguidejs": "^0.0.16", "@tailwindcss/container-queries": "^0.1.1", "air-datepicker": "^3.5.0", "animate.css": "^4.1.1", + "chart.js": "^4.4.0", + "chartjs-adapter-moment": "^1.0.1", "moment": "^2.29.4", "moment-timezone": "^0.5.43", "phoenix": "file:../deps/phoenix", diff --git a/assets/postcss.config.js b/assets/postcss.config.js index f6c9294..36521a5 100644 --- a/assets/postcss.config.js +++ b/assets/postcss.config.js @@ -1,7 +1,5 @@ module.exports = { plugins: { - "postcss-import": {}, - tailwindcss: {}, - autoprefixer: {}, + '@tailwindcss/postcss': {}, } } \ No newline at end of file diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js deleted file mode 100644 index d927e1d..0000000 --- a/assets/tailwind.config.js +++ /dev/null @@ -1,134 +0,0 @@ -const { colors: defaultColors } = require("tailwindcss/defaultTheme"); - -const colors = { - ...defaultColors, - ...{ - "water-blue": { - 50: "#E3F2FD", - 100: "#C2E3FA", - 200: "#84C8F6", - 300: "#3DA7F0", - 400: "#1395EC", - 500: "#1186D5", - 600: "#0D65A1", - 700: "#0A5689", - 800: "#0A4B76", - 900: "#073250", - }, - "electric-purple": { - 50: "#F2E0FF", - 100: "#E3BDFF", - 200: "#C77AFF", - 300: "#A62EFF", - 400: "#9200FF", - 500: "#A327FF", - 600: "#6400AD", - 700: "#550094", - 800: "#490080", - 900: "#320057", - }, - wedgewood: { - 50: "#F0F4F8", - 100: "#D9E3ED", - 200: "#B9CCDF", - 300: "#97B3CE", - 400: "#7499BE", - 500: "#507DAA", - 600: "#3F6388", - 700: "#314D68", - 800: "#253B50", - 900: "#1A2938", - }, - "rose-madder": { - 50: "#FCEDEE", - 100: "#F9D5D7", - 200: "#F3ABB0", - 300: "#ED8188", - 400: "#E75761", - 500: "#E12D39", - 600: "#B4242E", - 700: "#871B22", - 800: "#5A1217", - 900: "#2D090B", - }, - "school-bus-yellow": { - 50: "#FFFBEB", - 100: "#FEF3C7", - 200: "#FDE68A", - 300: "#FCD34D", - 400: "#FBBF24", - 500: "#F59E0B", - 600: "#D97706", - 700: "#B45309", - 800: "#92400E", - 900: "#78350F", - }, - "green-teal": { - 50: "#ECFDF5", - 100: "#D1FAE5", - 200: "#A7F3D0", - 300: "#6EE7B7", - 400: "#34D399", - 500: "#10B981", - 600: "#059669", - 700: "#047857", - 800: "#065F46", - 900: "#064E3B", - }, - }, -}; - -module.exports = { - mode: "jit", - content: ["./js/**/*.js", "../lib/*_web/**/*.*ex"], - safelist: [ - "-top-1.5", - "top-1", - "left-3", - "top-6", - "h-5", - "left-2.5", - "top-3", - "h-7", - "bg-secondary-600", - "text-white", - "bg-white", - "text-gray-600", - ], - darkMode: "media", - theme: { - extend: { - backgroundSize: { - "size-200": "200% 200%", - }, - backgroundPosition: { - "pos-0": "0% 0%", - "pos-100": "100% 100%", - }, - colors: { - primary: colors["water-blue"], - secondary: colors["electric-purple"], - neutral: colors["wedgewood"], - "supporting-red": colors["rose-madder"], - "supporting-yellow": colors["school-bus-yellow"], - "supporting-green": colors["green-teal"], - }, - }, - fontFamily: { - sans: ["Roboto", "sans-serif"], - serif: ["Merriweather", "serif"], - }, - boxShadow: { - base: "0px 1px 3px 0px rgba(0,0,0,0.1), 0px 1px 2px 0px rgba(0,0,0,0.06)", - lg: "0px 4px 6px 0px rgba(0,0,0,0.05), 0px 10px 15px 0px rgba(0,0,0,0.1)", - md: "0px 4px 6px 0px rgba(0,0,0,0.1), 0px 2px 4px 0px rgba(0,0,0,0.06)", - xl: "0px 10px 10px 0px rgba(0,0,0,0.04), 0px 20px 25px 0px rgba(0,0,0,0.1)", - "2xl": "0px 25px 50px 0px rgba(0,0,0,0.25)", - inner: "inset 0px 2px 4px 0px rgba(0,0,0,0.06)", - }, - }, - variants: { - extend: {}, - }, - plugins: [require("@tailwindcss/container-queries")], -}; diff --git a/charts/claper/templates/_env.yaml b/charts/claper/templates/_env.yaml index 8ac902c..0af766f 100644 --- a/charts/claper/templates/_env.yaml +++ b/charts/claper/templates/_env.yaml @@ -16,15 +16,15 @@ value: claper.co - name: DATABASE_URL value: postgresql://claper:claper@10.0.0.6:6432/claper -- name: AWS_ACCESS_KEY_ID +- name: S3_ACCESS_KEY_ID value: XXX -- name: AWS_PRES_BUCKET +- name: S3_BUCKET value: XXX - name: POOL_SIZE value: "20" -- name: AWS_REGION +- name: S3_REGION value: eu-west-3 -- name: AWS_SECRET_ACCESS_KEY +- name: S3_SECRET_ACCESS_KEY value: XXX - name: PRESENTATION_STORAGE value: s3 diff --git a/config/config.exs b/config/config.exs index 1aa67c7..51120c3 100644 --- a/config/config.exs +++ b/config/config.exs @@ -36,9 +36,26 @@ config :dart_sass, cd: Path.expand("../assets", __DIR__) ] +config :tailwind, + version: "4.1.10", + default: [ + args: ~w( + --input=assets/css/app.css + --output=priv/static/assets/app.css + ), + cd: Path.expand("..", __DIR__) + ], + admin: [ + args: ~w( + --input=assets/css/admin.css + --output=priv/static/assets/admin.css + ), + cd: Path.expand("..", __DIR__) + ] + # Configure esbuild (the version is required) config :esbuild, - version: "0.12.18", + version: "0.25.5", default: [ args: ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*), diff --git a/config/dev.exs b/config/dev.exs index 720a20b..41198be 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -13,19 +13,13 @@ config :claper, ClaperWeb.Endpoint, watchers: [ # Start the esbuild watcher by calling Esbuild.install_and_run(:default, args) esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}, + tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]}, + tailwind_admin: {Tailwind, :install_and_run, [:admin, ~w(--watch)]}, sass: { DartSass, :install_and_run, [:default, ~w(--embed-source-map --source-map-urls=absolute --watch)] - }, - npx: [ - "tailwindcss", - "--input=css/app.css", - "--output=../priv/static/assets/app.css", - "--postcss", - "--watch", - cd: Path.expand("../assets", __DIR__) - ] + } ] # Watch static and templates for browser reloading. diff --git a/config/runtime.exs b/config/runtime.exs index 8fd9681..d1e0476 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -86,9 +86,39 @@ smtp_tls = get_var_from_path_or_env(config_dir, "SMTP_TLS", "always") smtp_auth = get_var_from_path_or_env(config_dir, "SMTP_AUTH", "always") smtp_port = get_int_from_path_or_env(config_dir, "SMTP_PORT", 25) -aws_access_key_id = get_var_from_path_or_env(config_dir, "AWS_ACCESS_KEY_ID", nil) -aws_secret_access_key = get_var_from_path_or_env(config_dir, "AWS_SECRET_ACCESS_KEY", nil) -aws_region = get_var_from_path_or_env(config_dir, "AWS_REGION", nil) +storage = get_var_from_path_or_env(config_dir, "PRESENTATION_STORAGE", "local") +if storage not in ["local", "s3"], do: raise("Invalid PRESENTATION_STORAGE value #{storage}") + +s3_access_key_id = get_var_from_path_or_env(config_dir, "S3_ACCESS_KEY_ID") +s3_secret_access_key = get_var_from_path_or_env(config_dir, "S3_SECRET_ACCESS_KEY") +s3_region = get_var_from_path_or_env(config_dir, "S3_REGION") +s3_bucket = get_var_from_path_or_env(config_dir, "S3_BUCKET") + +if storage == "s3" and + not Enum.all?([s3_access_key_id, s3_secret_access_key, s3_region, s3_bucket]) do + raise( + "S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_REGION and S3_BUCKET required when PRESENTATION_STORAGE=s3" + ) +end + +s3_scheme = get_var_from_path_or_env(config_dir, "S3_SCHEME") +s3_host = get_var_from_path_or_env(config_dir, "S3_HOST") +s3_port = get_var_from_path_or_env(config_dir, "S3_PORT") + +if storage == "s3" do + if !!s3_scheme and !s3_host, do: "S3_HOST required if S3_SCHEME is set" + if !s3_scheme and !!s3_host, do: "S3_SCHEME required if S3_HOST is set" +end + +s3_public_url = + get_var_from_path_or_env( + config_dir, + "S3_PUBLIC_URL", + if(s3_scheme && s3_host, + do: s3_scheme <> s3_host <> if(s3_port, do: ":#{s3_port}", else: ""), + else: "https://#{s3_bucket}.s3.#{s3_region}.amazonaws.com" + ) + ) same_site_cookie = get_var_from_path_or_env(config_dir, "SAME_SITE_COOKIE", "Lax") @@ -128,6 +158,11 @@ allow_unlink_external_provider = logout_redirect_url = get_var_from_path_or_env(config_dir, "LOGOUT_REDIRECT_URL", nil) +languages = + get_var_from_path_or_env(config_dir, "LANGUAGES", "en,fr,es,it,de") + |> String.split(",") + |> Enum.map(&String.trim/1) + config :claper, :oidc, enabled: oidc_enabled, issuer: oidc_issuer, @@ -166,13 +201,15 @@ config :claper, enable_account_creation: enable_account_creation, email_confirmation: email_confirmation, allow_unlink_external_provider: allow_unlink_external_provider, - logout_redirect_url: logout_redirect_url + logout_redirect_url: logout_redirect_url, + languages: languages config :claper, :presentations, max_file_size: max_file_size, - storage: get_var_from_path_or_env(config_dir, "PRESENTATION_STORAGE", "local"), - aws_bucket: get_var_from_path_or_env(config_dir, "AWS_PRES_BUCKET", nil), - resolution: get_var_from_path_or_env(config_dir, "GS_JPG_RESOLUTION", "300x300") + storage: storage, + s3_bucket: s3_bucket, + resolution: get_var_from_path_or_env(config_dir, "GS_JPG_RESOLUTION", "300x300"), + s3_public_url: s3_public_url config :claper, :mail, from: get_var_from_path_or_env(config_dir, "MAIL_FROM", "noreply@claper.co"), @@ -221,9 +258,10 @@ case mail_transport do end config :ex_aws, - access_key_id: aws_access_key_id, - secret_access_key: aws_secret_access_key, - region: aws_region, - normalize_path: false + access_key_id: s3_access_key_id, + secret_access_key: s3_secret_access_key, + region: s3_region, + normalize_path: false, + s3: [scheme: s3_scheme, host: s3_host, port: s3_port] config :swoosh, :api_client, Swoosh.ApiClient.Finch diff --git a/dev.sh b/dev.sh deleted file mode 100755 index 9254574..0000000 --- a/dev.sh +++ /dev/null @@ -1,14 +0,0 @@ -set -a -source .env -set +a - -args=("$@") - -if [ "${args[0]}" == "start" ]; then - mix phx.server -elif [ "${args[0]}" == "iex" ]; then - iex -S mix -else - mix "$@" -fi - diff --git a/docker-compose.yml b/docker-compose.yml index c25890c..0fe4637 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,6 @@ services: db: image: postgres:15 - ports: - - 5432:5432 volumes: - "claper-db:/var/lib/postgresql/data" healthcheck: diff --git a/elixir_buildpack.config b/elixir_buildpack.config deleted file mode 100644 index 63e1e63..0000000 --- a/elixir_buildpack.config +++ /dev/null @@ -1,2 +0,0 @@ -elixir_version=1.13.2 -erlang_version=24.0 diff --git a/lib/claper/accounts.ex b/lib/claper/accounts.ex index f93508c..0570419 100644 --- a/lib/claper/accounts.ex +++ b/lib/claper/accounts.ex @@ -7,7 +7,7 @@ defmodule Claper.Accounts do alias Claper.Accounts alias Claper.Repo - alias Claper.Accounts.{User, UserToken, UserNotifier} + alias Claper.Accounts.{User, UserToken, UserNotifier, Role} @doc """ Creates a user. @@ -20,6 +20,9 @@ defmodule Claper.Accounts do {:error, %Ecto.Changeset{}} """ def create_user(attrs) do + # Get user role if not explicitly set + attrs = maybe_set_default_role(attrs) + %User{} |> User.registration_changeset(attrs) |> Repo.insert(returning: [:uuid]) @@ -55,18 +58,39 @@ defmodule Claper.Accounts do def get_user_by_email_or_create(email) when is_binary(email) do case get_user_by_email(email) do nil -> - create_user(%{ + attrs = %{ email: email, confirmed_at: DateTime.utc_now(), is_randomized_password: true, password: :crypto.strong_rand_bytes(32) - }) + } + + # Set default role if not explicitly set + attrs = maybe_set_default_role(attrs) + + create_user(attrs) user -> {:ok, user} end end + @doc """ + Lists all users that are not deleted. + + ## Examples + + iex> list_users() + [%User{}, ...] + + """ + def list_users(preload \\ []) do + User + |> where([u], is_nil(u.deleted_at)) + |> Repo.all() + |> Repo.preload(preload) + end + @doc """ Gets a user by email and password. @@ -147,6 +171,9 @@ defmodule Claper.Accounts do """ def register_user(attrs) do + # Get user role if not explicitly set + attrs = maybe_set_default_role(attrs) + %User{} |> User.registration_changeset(attrs) |> Repo.insert(returning: [:uuid]) @@ -165,6 +192,37 @@ defmodule Claper.Accounts do User.registration_changeset(user, attrs, hash_password: false) end + @doc """ + Returns an `%Ecto.Changeset{}` for tracking user changes for admin operations. + + ## Examples + + iex> change_user(user) + %Ecto.Changeset{data: %User{}} + + """ + def change_user(%User{} = user, attrs \\ %{}) do + User.admin_changeset(user, attrs, hash_password: false) + end + + @doc """ + Updates a user for admin operations. + + ## Examples + + iex> update_user(user, %{field: new_value}) + {:ok, %User{}} + + iex> update_user(user, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_user(%User{} = user, attrs) do + user + |> User.admin_changeset(attrs) + |> Repo.update() + end + ## Settings @doc """ @@ -262,6 +320,23 @@ defmodule Claper.Accounts do end end + # Alternative version with different signature - keeping for compatibility + def update_user_password(user, %{"current_password" => curr_pw} = attrs) do + changeset = + user + |> User.password_changeset(attrs) + |> User.validate_current_password(curr_pw) + + Ecto.Multi.new() + |> Ecto.Multi.update(:user, changeset) + |> Ecto.Multi.delete_all(:tokens, UserToken.user_and_contexts_query(user, :all)) + |> Repo.transaction() + |> case do + {:ok, %{user: user}} -> {:ok, user} + {:error, :user, changeset, _} -> {:error, changeset} + end + end + @doc """ Sets the user password. ## Examples @@ -343,34 +418,6 @@ defmodule Claper.Accounts do User.password_changeset(user, attrs) end - @doc """ - Updates the user password. - - ## Examples - - iex> update_user_password(user, "valid password", %{password: ...}) - {:ok, %User{}} - - iex> update_user_password(user, "invalid password", %{password: ...}) - {:error, %Ecto.Changeset{}} - - """ - def update_user_password(user, %{"current_password" => curr_pw} = attrs) do - changeset = - user - |> User.password_changeset(attrs) - |> User.validate_current_password(curr_pw) - - Ecto.Multi.new() - |> Ecto.Multi.update(:user, changeset) - |> Ecto.Multi.delete_all(:tokens, UserToken.user_and_contexts_query(user, :all)) - |> Repo.transaction() - |> case do - {:ok, %{user: user}} -> {:ok, user} - {:error, :user, changeset, _} -> {:error, changeset} - end - end - ## Session @doc """ @@ -602,4 +649,271 @@ defmodule Claper.Accounts do {:error, changeset} -> {:error, changeset} end end + + ## Role Management + + @doc """ + Returns the list of roles. + + ## Examples + + iex> list_roles() + [%Role{}, ...] + + """ + def list_roles do + Repo.all(Role) + end + + @doc """ + Gets a single role. + + Raises `Ecto.NoResultsError` if the Role does not exist. + + ## Examples + + iex> get_role!(123) + %Role{} + + iex> get_role!(456) + ** (Ecto.NoResultsError) + + """ + def get_role!(id), do: Repo.get!(Role, id) + + @doc """ + Gets a role by name. + + Returns nil if the Role does not exist. + + ## Examples + + iex> get_role_by_name("admin") + %Role{} + + iex> get_role_by_name("nonexistent") + nil + + """ + def get_role_by_name(name) when is_binary(name) do + Repo.get_by(Role, name: name) + end + + @doc """ + Creates a role. + + ## Examples + + iex> create_role(%{field: value}) + {:ok, %Role{}} + + iex> create_role(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_role(attrs \\ %{}) do + %Role{} + |> Role.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a role. + + ## Examples + + iex> update_role(role, %{field: new_value}) + {:ok, %Role{}} + + iex> update_role(role, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_role(%Role{} = role, attrs) do + role + |> Role.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a role. + + ## Examples + + iex> delete_role(role) + {:ok, %Role{}} + + iex> delete_role(role) + {:error, %Ecto.Changeset{}} + + """ + def delete_role(%Role{} = role) do + Repo.delete(role) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking role changes. + + ## Examples + + iex> change_role(role) + %Ecto.Changeset{data: %Role{}} + + """ + def change_role(%Role{} = role, attrs \\ %{}) do + Role.changeset(role, attrs) + end + + @doc """ + Assigns a role to a user by role name or role struct. + + ## Examples + + iex> assign_role(user, "admin") + {:ok, %User{}} + + iex> assign_role(user, %Role{id: 1}) + {:ok, %User{}} + + iex> assign_role(user, "unknown") + {:error, :role_not_found} + """ + def assign_role(%User{} = user, %Role{} = role) do + user + |> Ecto.Changeset.change(%{role_id: role.id}) + |> Repo.update() + end + + def assign_role(%User{} = user, role_name) when is_binary(role_name) do + case get_role_by_name(role_name) do + nil -> + {:error, :role_not_found} + + role -> + user + |> Ecto.Changeset.change(%{role_id: role.id}) + |> Repo.update() + end + end + + @doc """ + Gets the role of a user. + + ## Examples + + iex> get_user_role(user) + %Role{} + + iex> get_user_role(user_without_role) + nil + """ + def get_user_role(%User{} = user) do + user = user |> Repo.preload(:role) + user.role + end + + @doc """ + Lists users by role name. + + ## Examples + + iex> list_users_by_role("admin") + [%User{}, ...] + + iex> list_users_by_role("unknown") + [] + """ + def list_users_by_role(role_name) when is_binary(role_name) do + case get_role_by_name(role_name) do + nil -> + [] + + role -> + User + |> where([u], u.role_id == ^role.id and is_nil(u.deleted_at)) + |> Repo.all() + end + end + + @doc """ + Checks if a user has a specific role. + + ## Examples + + iex> user_has_role?(user, "admin") + true + + iex> user_has_role?(user, "unknown") + false + """ + def user_has_role?(%User{} = user, role_name) when is_binary(role_name) do + case get_user_role(user) do + nil -> false + role -> role.name == role_name + end + end + + @doc """ + Promotes a user to admin role. + + ## Examples + + iex> promote_to_admin(user) + {:ok, %User{}} + + iex> promote_to_admin(already_admin_user) + {:ok, %User{}} + """ + def promote_to_admin(%User{} = user) do + assign_role(user, "admin") + end + + @doc """ + Demotes a user from admin role to regular user role. + + ## Examples + + iex> demote_from_admin(admin_user) + {:ok, %User{}} + + iex> demote_from_admin(already_user_user) + {:ok, %User{}} + """ + def demote_from_admin(%User{} = user) do + assign_role(user, "user") + end + + # Private helper to set default role if not already set + defp maybe_set_default_role(attrs) do + # Only set default role if role_id is not explicitly provided + case Map.get(attrs, :role_id) || Map.get(attrs, "role_id") do + nil -> set_default_user_role(attrs) + _ -> attrs + end + end + + defp set_default_user_role(attrs) do + case get_role_by_name("user") do + nil -> attrs + user_role -> put_role_id(attrs, user_role.id) + end + end + + defp put_role_id(attrs, role_id) do + key = determine_role_key(attrs) + Map.put(attrs, key, role_id) + end + + defp determine_role_key(attrs) do + if has_string_keys?(attrs) do + "role_id" + else + :role_id + end + end + + defp has_string_keys?(attrs) do + is_map(attrs) and map_size(attrs) > 0 and + Enum.all?(Map.keys(attrs), &is_binary/1) + end end diff --git a/lib/claper/accounts/guardian.ex b/lib/claper/accounts/guardian.ex new file mode 100644 index 0000000..0af6669 --- /dev/null +++ b/lib/claper/accounts/guardian.ex @@ -0,0 +1,27 @@ +defmodule Claper.Accounts.Guardian do + @moduledoc """ + Implementation module for Guardian authentication. + This module handles JWT token generation and validation for user authentication. + """ + + defmodule Plug do + @moduledoc """ + Plug helpers for Guardian authentication in tests. + """ + + @doc """ + Sign in a user to a conn. + + ## Parameters + - conn: The connection + - user: The user to sign in + + ## Returns + - Updated conn with user signed in + """ + def sign_in(conn, user) do + # For tests, we'll just put the user in the conn assigns + Elixir.Plug.Conn.assign(conn, :current_user, user) + end + end +end diff --git a/lib/claper/accounts/oidc.ex b/lib/claper/accounts/oidc.ex new file mode 100644 index 0000000..3961494 --- /dev/null +++ b/lib/claper/accounts/oidc.ex @@ -0,0 +1,119 @@ +defmodule Claper.Accounts.Oidc do + @moduledoc """ + The OIDC context for authentication and provider management. + """ + + import Ecto.Query, warn: false + alias Claper.Repo + alias Claper.Accounts.Oidc.Provider + + @doc """ + Returns the list of oidc_providers. + + ## Examples + + iex> list_providers() + [%Provider{}, ...] + + """ + def list_providers do + Repo.all(Provider) + end + + @doc """ + Gets a single provider. + + Raises `Ecto.NoResultsError` if the Provider does not exist. + + ## Examples + + iex> get_provider!(123) + %Provider{} + + iex> get_provider!(456) + ** (Ecto.NoResultsError) + + """ + def get_provider!(id), do: Repo.get!(Provider, id) + + @doc """ + Creates a provider. + + ## Examples + + iex> create_provider(%{field: value}) + {:ok, %Provider{}} + + iex> create_provider(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_provider(attrs \\ %{}) do + %Provider{} + |> Provider.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a provider. + + ## Examples + + iex> update_provider(provider, %{field: new_value}) + {:ok, %Provider{}} + + iex> update_provider(provider, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_provider(%Provider{} = provider, attrs) do + provider + |> Provider.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a provider. + + ## Examples + + iex> delete_provider(provider) + {:ok, %Provider{}} + + iex> delete_provider(provider) + {:error, %Ecto.Changeset{}} + + """ + def delete_provider(%Provider{} = provider) do + Repo.delete(provider) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking provider changes. + + ## Examples + + iex> change_provider(provider) + %Ecto.Changeset{data: %Provider{}} + + """ + def change_provider(%Provider{} = provider, attrs \\ %{}) do + Provider.changeset(provider, attrs) + end + + @doc """ + Search providers by name or issuer. + + ## Examples + + iex> search_providers("%example%") + [%Provider{}, ...] + + """ + def search_providers(search_term) do + from(p in Provider, + where: ilike(p.name, ^search_term) or ilike(p.issuer, ^search_term) + ) + |> Repo.all() + end +end diff --git a/lib/claper/accounts/oidc/provider.ex b/lib/claper/accounts/oidc/provider.ex new file mode 100644 index 0000000..ba1c10f --- /dev/null +++ b/lib/claper/accounts/oidc/provider.ex @@ -0,0 +1,57 @@ +defmodule Claper.Accounts.Oidc.Provider do + use Ecto.Schema + import Ecto.Changeset + + @type t :: %__MODULE__{ + id: integer(), + name: String.t(), + issuer: String.t(), + client_id: String.t(), + client_secret: String.t(), + redirect_uri: String.t(), + scope: String.t(), + active: boolean(), + response_type: String.t(), + response_mode: String.t(), + inserted_at: NaiveDateTime.t(), + updated_at: NaiveDateTime.t() + } + + schema "oidc_providers" do + field :name, :string + field :issuer, :string + field :client_id, :string + field :client_secret, :string + field :redirect_uri, :string + field :scope, :string, default: "openid email profile" + field :active, :boolean, default: true + field :response_type, :string, default: "code" + field :response_mode, :string, default: "query" + + timestamps() + end + + @doc """ + A changeset for creating or updating an OIDC provider. + """ + def changeset(provider, attrs) do + provider + |> cast(attrs, [ + :name, + :issuer, + :client_id, + :client_secret, + :redirect_uri, + :scope, + :active, + :response_type, + :response_mode + ]) + |> validate_required([:name, :issuer, :client_id, :client_secret, :redirect_uri]) + |> validate_format(:issuer, ~r/^https?:\/\//, message: "must start with http:// or https://") + |> validate_format(:redirect_uri, ~r/^https?:\/\//, + message: "must start with http:// or https://" + ) + |> unique_constraint(:name) + end +end diff --git a/lib/claper/accounts/role.ex b/lib/claper/accounts/role.ex new file mode 100644 index 0000000..d039093 --- /dev/null +++ b/lib/claper/accounts/role.ex @@ -0,0 +1,31 @@ +defmodule Claper.Accounts.Role do + use Ecto.Schema + import Ecto.Changeset + + @type t :: %__MODULE__{ + id: integer(), + name: String.t(), + permissions: map(), + inserted_at: NaiveDateTime.t(), + updated_at: NaiveDateTime.t() + } + + schema "roles" do + field :name, :string + field :permissions, :map, default: %{} + + has_many :users, Claper.Accounts.User + + timestamps() + end + + @doc """ + Changeset for creating or updating a role. + """ + def changeset(role, attrs) do + role + |> cast(attrs, [:name, :permissions]) + |> validate_required([:name]) + |> unique_constraint(:name) + end +end diff --git a/lib/claper/accounts/user.ex b/lib/claper/accounts/user.ex index d342307..2262642 100644 --- a/lib/claper/accounts/user.ex +++ b/lib/claper/accounts/user.ex @@ -13,6 +13,8 @@ defmodule Claper.Accounts.User do confirmed_at: NaiveDateTime.t() | nil, locale: String.t() | nil, events: [Claper.Events.Event.t()] | nil, + role: Claper.Accounts.Role.t() | nil, + role_id: integer() | nil, inserted_at: NaiveDateTime.t(), updated_at: NaiveDateTime.t(), deleted_at: NaiveDateTime.t() | nil @@ -30,15 +32,18 @@ defmodule Claper.Accounts.User do has_many :events, Claper.Events.Event has_one :lti_user, Lti13.Users.User + belongs_to :role, Claper.Accounts.Role + has_many :quiz_responses, Claper.Quizzes.QuizResponse timestamps() end def registration_changeset(user, attrs, opts \\ []) do user - |> cast(attrs, [:email, :confirmed_at, :password, :is_randomized_password]) + |> cast(attrs, [:email, :confirmed_at, :password, :is_randomized_password, :role_id]) |> validate_email() |> validate_password(opts) + |> foreign_key_constraint(:role_id) end def preferences_changeset(user, attrs) do @@ -46,6 +51,17 @@ defmodule Claper.Accounts.User do |> cast(attrs, [:locale]) end + @doc """ + A changeset for admin operations on users. + """ + def admin_changeset(user, attrs, opts \\ []) do + user + |> cast(attrs, [:email, :confirmed_at, :password, :role_id]) + |> validate_email() + |> validate_admin_password(opts) + |> foreign_key_constraint(:role_id) + end + @doc """ A changeset for marking a user as deleted. """ @@ -70,6 +86,19 @@ defmodule Claper.Accounts.User do |> maybe_hash_password(opts) end + defp validate_admin_password(changeset, opts) do + password = get_change(changeset, :password) + + # Only validate password if it's provided + if password && password != "" do + changeset + |> validate_length(:password, min: 6, max: 72) + |> maybe_hash_password(opts) + else + changeset + end + end + defp maybe_hash_password(changeset, opts) do hash_password? = Keyword.get(opts, :hash_password, true) password = get_change(changeset, :password) diff --git a/lib/claper/accounts/user_notifier.ex b/lib/claper/accounts/user_notifier.ex index b5f4321..cf8d784 100644 --- a/lib/claper/accounts/user_notifier.ex +++ b/lib/claper/accounts/user_notifier.ex @@ -52,7 +52,7 @@ defmodule Claper.Accounts.UserNotifier do Deliver instructions to update a user email. """ def deliver_update_email_instructions(user, url) do - Claper.Workers.Mailers.new_update_email(user.id, url) |> Oban.insert() + Claper.Workers.Mailers.new_update_email(user.email, url) |> Oban.insert() {:ok, :enqueued} end diff --git a/lib/claper/admin.ex b/lib/claper/admin.ex new file mode 100644 index 0000000..25dd736 --- /dev/null +++ b/lib/claper/admin.ex @@ -0,0 +1,635 @@ +defmodule Claper.Admin do + @moduledoc """ + The Admin context. + Provides functions for admin dashboard statistics and paginated lists of resources. + """ + + import Ecto.Query, warn: false + alias Claper.Repo + alias Claper.Accounts.User + alias Claper.Events.Event + alias Claper.Accounts.Oidc.Provider + + @doc """ + Gets dashboard statistics. + + Returns a map with counts of users, events, and upcoming events. + + ## Examples + + iex> get_dashboard_stats() + %{users_count: 10, events_count: 20, upcoming_events: 5} + + """ + def get_dashboard_stats do + users_count = + User + |> where([u], is_nil(u.deleted_at)) + |> Repo.aggregate(:count, :id) + + events_count = + Event + |> Repo.aggregate(:count, :id) + + _now = NaiveDateTime.utc_now() + + upcoming_events = + Event + |> where([e], is_nil(e.expired_at)) + |> Repo.aggregate(:count, :id) + + %{ + users_count: users_count, + events_count: events_count, + upcoming_events: upcoming_events + } + end + + @doc """ + Gets users over time for analytics charts. + + Returns user registration data grouped by time period. + + ## Parameters + - period: :day, :week, :month (default: :day) + - days_back: number of days to look back (default: 30) + + ## Examples + + iex> get_users_over_time(:day, 7) + %{ + labels: ["2025-01-10", "2025-01-11", ...], + values: [2, 5, 1, 3, ...] + } + """ + def get_users_over_time(period \\ :day, days_back \\ 30) do + end_date = NaiveDateTime.utc_now() + start_date = NaiveDateTime.add(end_date, -(days_back * 24 * 60 * 60), :second) + + # Generate all dates in the range + date_range = generate_date_range(start_date, end_date, period) + + # Get actual user counts per period using raw SQL to avoid parameter conflicts + period_sql_value = period_sql(period) + + sql = """ + SELECT DATE_TRUNC($1, inserted_at) as period, COUNT(id) as count + FROM users + WHERE deleted_at IS NULL + AND inserted_at >= $2 + AND inserted_at <= $3 + GROUP BY DATE_TRUNC($1, inserted_at) + ORDER BY period + """ + + result = Repo.query!(sql, [period_sql_value, start_date, end_date]) + + user_counts = + result.rows + |> Enum.map(fn [period, count] -> + normalized_period = NaiveDateTime.truncate(period, :second) + {normalized_period, count} + end) + |> Enum.into(%{}) + + # Format data for charts + labels = Enum.map(date_range, &format_date_label(&1, period)) + + values = + Enum.map(date_range, fn date -> + Map.get(user_counts, truncate_date(date, period), 0) + end) + + %{ + labels: labels, + values: values + } + end + + @doc """ + Gets events over time for analytics charts. + + Returns event creation data grouped by time period. + + ## Parameters + - period: :day, :week, :month (default: :day) + - days_back: number of days to look back (default: 30) + + ## Examples + + iex> get_events_over_time(:day, 7) + %{ + labels: ["2025-01-10", "2025-01-11", ...], + values: [1, 3, 0, 2, ...] + } + """ + def get_events_over_time(period \\ :day, days_back \\ 30) do + end_date = NaiveDateTime.utc_now() + start_date = NaiveDateTime.add(end_date, -(days_back * 24 * 60 * 60), :second) + + # Generate all dates in the range + date_range = generate_date_range(start_date, end_date, period) + + # Get actual event counts per period using raw SQL to avoid parameter conflicts + period_sql_value = period_sql(period) + + sql = """ + SELECT DATE_TRUNC($1, inserted_at) as period, COUNT(id) as count + FROM events + WHERE inserted_at >= $2 + AND inserted_at <= $3 + GROUP BY DATE_TRUNC($1, inserted_at) + ORDER BY period + """ + + result = Repo.query!(sql, [period_sql_value, start_date, end_date]) + + event_counts = + result.rows + |> Enum.map(fn [period, count] -> + # Normalize the timestamp by removing microseconds + normalized_period = NaiveDateTime.truncate(period, :second) + {normalized_period, count} + end) + |> Enum.into(%{}) + + # Format data for charts + labels = Enum.map(date_range, &format_date_label(&1, period)) + + values = + Enum.map(date_range, fn date -> + Map.get(event_counts, truncate_date(date, period), 0) + end) + + %{ + labels: labels, + values: values + } + end + + @doc """ + Gets growth metrics for dashboard statistics. + + Returns percentage growth for users and events compared to previous period. + """ + def get_growth_metrics do + now = NaiveDateTime.utc_now() + thirty_days_ago = NaiveDateTime.add(now, -(30 * 24 * 60 * 60), :second) + sixty_days_ago = NaiveDateTime.add(now, -(60 * 24 * 60 * 60), :second) + + # Current period (last 30 days) + current_users = + User + |> where([u], is_nil(u.deleted_at)) + |> where([u], u.inserted_at >= ^thirty_days_ago and u.inserted_at <= ^now) + |> Repo.aggregate(:count, :id) + + current_events = + Event + |> where([e], e.inserted_at >= ^thirty_days_ago and e.inserted_at <= ^now) + |> Repo.aggregate(:count, :id) + + # Previous period (30-60 days ago) + previous_users = + User + |> where([u], is_nil(u.deleted_at)) + |> where([u], u.inserted_at >= ^sixty_days_ago and u.inserted_at < ^thirty_days_ago) + |> Repo.aggregate(:count, :id) + + previous_events = + Event + |> where([e], e.inserted_at >= ^sixty_days_ago and e.inserted_at < ^thirty_days_ago) + |> Repo.aggregate(:count, :id) + + %{ + users_growth: calculate_growth_percentage(current_users, previous_users), + events_growth: calculate_growth_percentage(current_events, previous_events) + } + end + + @doc """ + Gets recent activity stats for dashboard. + + Returns counts of recent activities. + """ + def get_activity_stats do + now = NaiveDateTime.utc_now() + twenty_four_hours_ago = NaiveDateTime.add(now, -(24 * 60 * 60), :second) + seven_days_ago = NaiveDateTime.add(now, -(7 * 24 * 60 * 60), :second) + + %{ + users_today: + User + |> where([u], is_nil(u.deleted_at)) + |> where([u], u.inserted_at >= ^twenty_four_hours_ago) + |> Repo.aggregate(:count, :id), + events_today: + Event + |> where([e], e.inserted_at >= ^twenty_four_hours_ago) + |> Repo.aggregate(:count, :id), + users_this_week: + User + |> where([u], is_nil(u.deleted_at)) + |> where([u], u.inserted_at >= ^seven_days_ago) + |> Repo.aggregate(:count, :id), + events_this_week: + Event + |> where([e], e.inserted_at >= ^seven_days_ago) + |> Repo.aggregate(:count, :id) + } + end + + # Private helper functions + + defp generate_date_range(start_date, end_date, period) do + start_date + |> NaiveDateTime.to_date() + |> Date.range(NaiveDateTime.to_date(end_date)) + |> Enum.to_list() + |> case do + dates when period == :day -> + dates + + dates when period == :week -> + dates |> Enum.chunk_every(7) |> Enum.map(&List.first/1) + + dates when period == :month -> + dates |> Enum.group_by(&Date.beginning_of_month/1) |> Map.keys() + end + end + + defp period_sql(period) do + case period do + :day -> "day" + :week -> "week" + :month -> "month" + end + end + + defp format_date_label(date, period) do + case period do + :day -> Date.to_string(date) + :week -> "Week of #{Date.to_string(date)}" + :month -> "#{Date.to_string(date) |> String.slice(0..6)}" + end + end + + defp truncate_date(date, period) do + naive_date = NaiveDateTime.new!(date, ~T[00:00:00]) + + case period do + :day -> + NaiveDateTime.truncate(naive_date, :second) + + :week -> + days_to_subtract = Date.day_of_week(date) - 1 + + date + |> Date.add(-days_to_subtract) + |> NaiveDateTime.new!(~T[00:00:00]) + |> NaiveDateTime.truncate(:second) + + :month -> + date + |> Date.beginning_of_month() + |> NaiveDateTime.new!(~T[00:00:00]) + |> NaiveDateTime.truncate(:second) + end + end + + defp calculate_growth_percentage(current, previous) do + cond do + previous == 0 and current > 0 -> + 100.0 + + previous == 0 and current == 0 -> + 0.0 + + previous > 0 -> + :erlang.float_to_binary(((current - previous) / previous * 100) |> Float.round(1), + decimals: 1 + ) + + true -> + 0.0 + end + end + + @doc """ + Returns a paginated list of users. + + ## Options + + * `:page` - The page number (default: 1) + * `:per_page` - The number of users per page (default: 20) + * `:search` - Search term for filtering users by email + * `:role` - Filter users by role name + + ## Examples + + iex> list_users_paginated(%{page: 1, per_page: 10}) + %{entries: [%User{}, ...], page_number: 1, page_size: 10, total_entries: 20, total_pages: 2} + + """ + def list_users_paginated(params \\ %{}) do + page = Map.get(params, "page", 1) + per_page = Map.get(params, "per_page", 20) + search = Map.get(params, "search", "") + role = Map.get(params, "role", "") + + query = + User + |> where([u], is_nil(u.deleted_at)) + |> preload(:role) + + query = + if search != "" do + query |> where([u], ilike(u.email, ^"%#{search}%")) + else + query + end + + query = + if role != "" do + query |> join(:inner, [u], r in assoc(u, :role), on: r.name == ^role) + else + query + end + + query = query |> order_by([u], desc: u.inserted_at) + + Repo.paginate(query, page: page, page_size: per_page) + end + + @doc """ + Returns a paginated list of events. + + ## Options + + * `:page` - The page number (default: 1) + * `:per_page` - The number of events per page (default: 20) + * `:search` - Search term for filtering events by name + * `:status` - Filter events by status (upcoming, past) + * `:start_date` - Filter events by start date + * `:end_date` - Filter events by end date + * `:creator_id` - Filter events by creator ID + + ## Examples + + iex> list_events_paginated(%{page: 1, per_page: 10}) + %{entries: [%Event{}, ...], page_number: 1, page_size: 10, total_entries: 20, total_pages: 2} + + """ + def list_events_paginated(params \\ %{}) do + page = Map.get(params, "page", 1) + per_page = Map.get(params, "per_page", 20) + search = Map.get(params, "search", "") + status = Map.get(params, "status", "") + start_date = Map.get(params, "start_date", nil) + end_date = Map.get(params, "end_date", nil) + creator_id = Map.get(params, "creator_id", nil) + + query = + Event + |> preload(:user) + + query = + if search != "" do + query |> where([e], ilike(e.name, ^"%#{search}%")) + else + query + end + + query = + case status do + "upcoming" -> + now = NaiveDateTime.utc_now() + query |> where([e], e.started_at > ^now) + + "past" -> + now = NaiveDateTime.utc_now() + query |> where([e], e.started_at <= ^now) + + _ -> + query + end + + query = + if start_date do + query |> where([e], e.started_at >= ^start_date) + else + query + end + + query = + if end_date do + query |> where([e], e.started_at <= ^end_date) + else + query + end + + query = + if creator_id do + query |> where([e], e.user_id == ^creator_id) + else + query + end + + query = query |> order_by([e], desc: e.started_at) + + Repo.paginate(query, page: page, page_size: per_page) + end + + @doc """ + Returns a paginated list of OIDC providers. + + ## Options + + * `:page` - The page number (default: 1) + * `:per_page` - The number of providers per page (default: 20) + * `:search` - Search term for filtering providers by name + + ## Examples + + iex> list_oidc_providers_paginated(%{page: 1, per_page: 10}) + %{entries: [%Provider{}, ...], page_number: 1, page_size: 10, total_entries: 20, total_pages: 2} + + """ + def list_oidc_providers_paginated(params \\ %{}) do + page = Map.get(params, "page", 1) + per_page = Map.get(params, "per_page", 20) + search = Map.get(params, "search", "") + + query = Provider + + query = + if search != "" do + query |> where([p], ilike(p.name, ^"%#{search}%")) + else + query + end + + query = query |> order_by([p], p.name) + + Repo.paginate(query, page: page, page_size: per_page) + end + + @doc """ + Returns a complete list of OIDC providers for export purposes. + + Unlike the paginated version, this returns all providers matching the search criteria. + + ## Options + + * `:search` - Search term for filtering providers by name + + ## Examples + + iex> list_all_oidc_providers(%{search: "Google"}) + [%Provider{}, ...] + + """ + def list_all_oidc_providers(params \\ %{}) do + search = Map.get(params, "search", "") + + query = Provider + + query = + if search != "" do + query |> where([p], ilike(p.name, ^"%#{search}%")) + else + query + end + + query = query |> order_by([p], p.name) + + Repo.all(query) + end + + @doc """ + Returns a complete list of events for export purposes. + + Unlike the paginated version, this returns all events matching the search criteria. + + ## Options + + * `:search` - Search term for filtering events by name + * `:status` - Filter events by status (upcoming, past) + * `:start_date` - Filter events by start date + * `:end_date` - Filter events by end date + * `:creator_id` - Filter events by creator ID + + ## Examples + + iex> list_all_events(%{search: "Conference"}) + [%Event{}, ...] + + """ + def list_all_events(params \\ %{}) do + Event + |> join(:left, [e], u in assoc(e, :user)) + |> preload([e, u], user: u) + |> apply_event_search_filter(Map.get(params, "search", "")) + |> apply_event_status_filter(Map.get(params, "status", "")) + |> apply_event_start_date_filter(Map.get(params, "start_date", nil)) + |> apply_event_end_date_filter(Map.get(params, "end_date", nil)) + |> apply_event_creator_filter(Map.get(params, "creator_id", nil)) + |> order_by([e], desc: e.started_at) + |> Repo.all() + |> Enum.map(fn event -> Map.put(event, :user_email, event.user.email) end) + end + + defp apply_event_search_filter(query, ""), do: query + + defp apply_event_search_filter(query, search) do + search_term = "%#{search}%" + + query + |> where( + [e, u], + ilike(e.name, ^search_term) or ilike(e.code, ^search_term) or + ilike(u.email, ^search_term) + ) + end + + defp apply_event_status_filter(query, "upcoming") do + now = NaiveDateTime.utc_now() + query |> where([e], e.started_at > ^now) + end + + defp apply_event_status_filter(query, "past") do + now = NaiveDateTime.utc_now() + query |> where([e], e.started_at <= ^now) + end + + defp apply_event_status_filter(query, _), do: query + + defp apply_event_start_date_filter(query, nil), do: query + + defp apply_event_start_date_filter(query, start_date) do + query |> where([e], e.started_at >= ^start_date) + end + + defp apply_event_end_date_filter(query, nil), do: query + + defp apply_event_end_date_filter(query, end_date) do + query |> where([e], e.started_at <= ^end_date) + end + + defp apply_event_creator_filter(query, nil), do: query + + defp apply_event_creator_filter(query, creator_id) do + query |> where([e], e.user_id == ^creator_id) + end + + @doc """ + Returns a complete list of users for export purposes. + + Unlike the paginated version, this returns all users matching the search criteria. + + ## Options + + * `:search` - Search term for filtering users by email or name + * `:role` - Filter users by role ID + + ## Examples + + iex> list_all_users(%{search: "admin"}) + [%User{}, ...] + + """ + def list_all_users(params \\ %{}) do + search = Map.get(params, "search", "") + role = Map.get(params, "role", "") + + query = + User + |> where([u], is_nil(u.deleted_at)) + |> preload(:role) + + query = + if search != "" do + query |> where([u], ilike(u.email, ^"%#{search}%") or ilike(u.name, ^"%#{search}%")) + else + query + end + + query = + if role != "" do + query |> where([u], u.role_id == ^role) + else + query + end + + query = query |> order_by([u], u.email) + + # Add a virtual field for role_name to make it accessible in CSV export + Repo.all(query) + |> Enum.map(fn user -> + role_name = if user.role, do: user.role.name, else: "none" + + user + |> Map.put(:role_name, role_name) + end) + end +end diff --git a/lib/claper/embeds/embed.ex b/lib/claper/embeds/embed.ex index 8030588..f05bc9d 100644 --- a/lib/claper/embeds/embed.ex +++ b/lib/claper/embeds/embed.ex @@ -1,7 +1,7 @@ defmodule Claper.Embeds.Embed do use Ecto.Schema import Ecto.Changeset - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext @type t :: %__MODULE__{ id: integer(), @@ -61,7 +61,7 @@ defmodule Claper.Embeds.Embed do |> validate_format(:content, ~r/^https?:\/\/.+$/, message: gettext("Please enter a valid link starting with http:// or https://") ) - |> validate_format(:content, ~r/youtu\.be/, + |> validate_format(:content, ~r/(youtu\.be)|(youtube\.com)/, message: gettext("Please enter a valid %{provider} link", provider: "YouTube") ) diff --git a/lib/claper/events.ex b/lib/claper/events.ex index 131c8fa..b19b550 100644 --- a/lib/claper/events.ex +++ b/lib/claper/events.ex @@ -6,8 +6,8 @@ defmodule Claper.Events do """ import Ecto.Query, warn: false - alias Claper.Repo + alias Claper.{Accounts, Presentations, Repo} alias Claper.Events.{Event, ActivityLeader} @default_page_size 5 @@ -22,7 +22,7 @@ defmodule Claper.Events do """ def list_events(user_id, preload \\ []) do - from(e in Event, where: e.user_id == ^user_id, order_by: [desc: e.inserted_at]) + from(e in Event, where: e.user_id == ^user_id, order_by: [desc: e.id]) |> Repo.all() |> Repo.preload(preload) end @@ -43,7 +43,7 @@ defmodule Claper.Events do query = from(e in Event, where: e.user_id == ^user_id, - order_by: [desc: e.inserted_at] + order_by: [desc: e.id] ) Repo.paginate(query, page: page, page_size: page_size, preload: preload) @@ -61,7 +61,7 @@ defmodule Claper.Events do def list_not_expired_events(user_id, preload \\ []) do from(e in Event, where: e.user_id == ^user_id and is_nil(e.expired_at), - order_by: [desc: e.inserted_at] + order_by: [desc: e.id] ) |> Repo.all() |> Repo.preload(preload) @@ -83,7 +83,7 @@ defmodule Claper.Events do query = from(e in Event, where: e.user_id == ^user_id and is_nil(e.expired_at), - order_by: [desc: e.inserted_at] + order_by: [desc: e.id] ) Repo.paginate(query, page: page, page_size: page_size, preload: preload) @@ -140,12 +140,12 @@ defmodule Claper.Events do """ def list_managed_events_by(email, preload \\ []) do from(a in ActivityLeader, - join: u in Claper.Accounts.User, + join: u in Accounts.User, on: u.email == a.email, join: e in Event, on: e.id == a.event_id, where: a.email == ^email, - order_by: [desc: e.expired_at], + order_by: [desc: e.expired_at, desc: e.id], select: e ) |> Repo.all() @@ -167,12 +167,12 @@ defmodule Claper.Events do query = from(a in ActivityLeader, - join: u in Claper.Accounts.User, + join: u in Accounts.User, on: u.email == a.email, join: e in Event, on: e.id == a.event_id, where: a.email == ^email, - order_by: [desc: e.expired_at], + order_by: [desc: e.expired_at, desc: e.id], select: e ) @@ -181,7 +181,7 @@ defmodule Claper.Events do def count_managed_events_by(email) do from(a in ActivityLeader, - join: u in Claper.Accounts.User, + join: u in Accounts.User, on: u.email == a.email, join: e in Event, on: e.id == a.event_id, @@ -193,8 +193,7 @@ defmodule Claper.Events do def count_expired_events(user_id) do from(e in Event, - where: e.user_id == ^user_id and not is_nil(e.expired_at), - order_by: [desc: e.expired_at] + where: e.user_id == ^user_id and not is_nil(e.expired_at) ) |> Repo.aggregate(:count, :id) end @@ -207,28 +206,42 @@ defmodule Claper.Events do from(e in Event, where: e.user_id == ^user_id and e.inserted_at <= ^DateTime.utc_now() and - e.inserted_at >= ^last_month, - order_by: [desc: e.id] + e.inserted_at >= ^last_month ) |> Repo.aggregate(:count, :id) end @doc """ - Gets a single event. + Gets a single event by serial ID or UUID. Raises `Ecto.NoResultsError` if the Event does not exist. ## Examples + iex> get_event!(123) + %Event{} + iex> get_event!("123e4567-e89b-12d3-a456-426614174000") %Event{} + iex> get_event!(456) + ** (Ecto.NoResultsError) + iex> get_event!("123e4567-e89b-12d3-a456-4266141740111") ** (Ecto.NoResultsError) """ - def get_event!(id, preload \\ []), - do: Repo.get_by!(Event, uuid: id) |> Repo.preload(preload) + def get_event!(id_or_uuid, preload \\ []) + + def get_event!( + <<_::bytes-8, "-", _::bytes-4, "-", _::bytes-4, "-", _::bytes-4, "-", _::bytes-12>> = + uuid, + preload + ), + do: Repo.get_by!(Event, uuid: uuid) |> Repo.preload(preload) + + def get_event!(id, preload), + do: Repo.get!(Event, id) |> Repo.preload(preload) @doc """ Gets a single managed event. @@ -244,17 +257,18 @@ defmodule Claper.Events do ** (Ecto.NoResultsError) """ - def get_managed_event!(current_user, id, preload \\ []) do - event = Repo.get_by!(Event, uuid: id) - - is_leader = - Claper.Events.leaded_by?(current_user.email, event) || event.user_id == current_user.id - - if is_leader do - event |> Repo.preload(preload) - else - raise Ecto.NoResultsError - end + def get_managed_event!(user, uuid, preload \\ []) do + from( + e in Event, + join: u in Accounts.User, + on: e.user_id == u.id, + left_join: a in ActivityLeader, + on: e.id == a.event_id, + where: e.uuid == ^uuid and (u.id == ^user.id or a.email == ^user.email), + select: e + ) + |> Repo.one!() + |> Repo.preload(preload) end @doc """ @@ -304,43 +318,22 @@ defmodule Claper.Events do |> Repo.preload(preload) end - @doc """ - Get a single event with the same code excluding a specific event. - - ## Examples - - iex> get_different_event_with_code("Hello", 123) - %Event{} - - - """ - def get_different_event_with_code(nil, _event_id), do: nil - - def get_different_event_with_code(code, event_id) do - now = DateTime.utc_now() - - from(e in Event, where: e.code == ^code and e.id != ^event_id and e.expired_at > ^now) - |> Repo.one() - end - @doc """ Check if a user is a facilitator of a specific event. ## Examples - iex> leaded_by?("email@example.com", 123) + iex> led_by?("email@example.com", 123) true - """ - def leaded_by?(email, event) do + def led_by?(email, event) do from(a in ActivityLeader, - join: u in Claper.Accounts.User, + join: u in Accounts.User, on: u.email == a.email, join: e in Event, on: e.id == a.event_id, - where: a.email == ^email and e.id == ^event.id, - order_by: [desc: e.expired_at] + where: a.email == ^email and e.id == ^event.id ) |> Repo.exists?() end @@ -363,7 +356,10 @@ defmodule Claper.Events do |> validate_unique_event() |> case do {:ok, event} -> - Repo.insert(event, returning: [:uuid]) + with {:ok, event} <- Repo.insert(event, returning: [:uuid]) do + broadcast_all_users({:created, event}) + {:ok, event} + end {:error, changeset} -> {:error, %{changeset | action: :insert}} @@ -384,6 +380,15 @@ defmodule Claper.Events do end end + defp get_different_event_with_code(nil, _event_id), do: nil + + defp get_different_event_with_code(code, event_id) do + now = DateTime.utc_now() + + from(e in Event, where: e.code == ^code and e.id != ^event_id and e.expired_at > ^now) + |> Repo.one() + end + @doc """ Updates an event. @@ -402,7 +407,25 @@ defmodule Claper.Events do |> validate_unique_event() |> case do {:ok, event} -> - Repo.update(event, returning: [:uuid]) + with {:ok, event} <- Repo.update(event, returning: [:uuid]) do + broadcast_all_users({:updated, event}) + + deleted_leaders = + attrs + |> Map.get("leaders", %{}) + |> Map.values() + |> Enum.filter(fn + %{"delete" => "true"} -> true + _ -> false + end) + + for %{"email" => leader_email} <- deleted_leaders do + leader = Accounts.get_user_by_email(leader_email) + broadcast_user_events(leader.id, {:updated, event}) + end + + {:ok, event} + end {:error, changeset} -> {:error, %{changeset | action: :update}} @@ -424,7 +447,9 @@ defmodule Claper.Events do |> Repo.update() |> case do {:ok, event} -> - broadcast({:ok, event, event.uuid}, :event_terminated) + broadcast_all_users({:updated, event}) + broadcast_event(event.uuid, {:event_terminated, event.uuid}) + {:ok, event} {:error, changeset} -> {:error, %{changeset | action: :update}} @@ -517,7 +542,10 @@ defmodule Claper.Events do end @doc """ - Duplicate an event + Duplicates an event. + + Raises `Ecto.NoResultsError` for invalid `user_id`-`event_uuid` combinations + and returns an error tuple if any part of the transaction fails. ## Examples @@ -527,159 +555,201 @@ defmodule Claper.Events do iex> duplicate(user_id, event_uuid) {:error, %Ecto.Changeset{}} + iex> duplicate(another_user_id, event_uuid) + ** (Ecto.NoResultsError) + """ def duplicate_event(user_id, event_uuid) do - case Ecto.Multi.new() - |> Ecto.Multi.run(:original_event, fn _repo, _changes -> - {:ok, - get_user_event!(user_id, event_uuid, - presentation_file: [ - polls: [:poll_opts], - forms: [], - embeds: [], - quizzes: [:quiz_questions, quiz_questions: :quiz_question_opts], - presentation_state: [] - ] - )} - end) - |> Ecto.Multi.run(:new_event, fn _repo, %{original_event: original_event} -> - new_code = - for _ <- 1..5, - into: "", - do: <> + original = + get_user_event!(user_id, event_uuid, + presentation_file: [ + presentation_state: [], + polls: [:poll_opts], + forms: [], + embeds: [], + quizzes: [quiz_questions: [:quiz_question_opts]] + ] + ) - attrs = - Map.from_struct(original_event) - |> Map.drop([:id, :inserted_at, :updated_at, :presentation_file, :expired_at]) - |> Map.put(:leaders, []) - |> Map.put(:code, "#{new_code}") - |> Map.put(:name, "#{original_event.name} (Copy)") + multi = + Ecto.Multi.new() + |> Ecto.Multi.run(:event, fn _repo, changes -> duplicate_event_attrs(original, changes) end) + |> Ecto.Multi.run(:presentation_file, fn _repo, changes -> + duplicate_presentation_file(original, changes) + end) + |> Ecto.Multi.run(:presentation_state, fn _repo, changes -> + duplicate_presentation_state(original, changes) + end) + |> Ecto.Multi.run(:polls, fn _repo, changes -> duplicate_polls(original, changes) end) + |> Ecto.Multi.run(:forms, fn _repo, changes -> duplicate_forms(original, changes) end) + |> Ecto.Multi.run(:embeds, fn _repo, changes -> duplicate_embeds(original, changes) end) + |> Ecto.Multi.run(:quizzes, fn _repo, changes -> duplicate_quizzes(original, changes) end) - create_event(attrs) - end) - |> Ecto.Multi.run(:new_presentation_file, fn _repo, - %{ - original_event: original_event, - new_event: new_event - } -> - attrs = - Map.from_struct(original_event.presentation_file) - |> Map.drop([:id, :inserted_at, :updated_at, :presentation_state]) - |> Map.put(:event_id, new_event.id) - - Claper.Presentations.create_presentation_file(attrs) - end) - |> Ecto.Multi.run(:new_presentation_state, fn _repo, - %{ - original_event: original_event, - new_presentation_file: - new_presentation_file - } -> - attrs = - Map.from_struct(original_event.presentation_file.presentation_state) - |> Map.drop([:id, :inserted_at, :updated_at]) - |> Map.put(:presentation_file_id, new_presentation_file.id) - |> Map.put(:position, 0) - |> Map.put(:banned, []) - - Claper.Presentations.create_presentation_state(attrs) - end) - |> Ecto.Multi.run(:polls, fn _repo, - %{ - new_presentation_file: new_presentation_file, - original_event: original_event - } -> - {:ok, - Enum.map(original_event.presentation_file.polls, fn poll -> - poll_attrs = - Map.from_struct(poll) - |> Map.drop([:id, :inserted_at, :updated_at]) - |> Map.put(:presentation_file_id, new_presentation_file.id) - |> Map.put( - :poll_opts, - Enum.map(poll.poll_opts, fn opt -> - Map.from_struct(opt) - |> Map.drop([:id, :inserted_at, :updated_at]) - end) - ) - - {:ok, new_poll} = Claper.Polls.create_poll(poll_attrs) - new_poll - end)} - end) - |> Ecto.Multi.run(:forms, fn _repo, - %{ - new_presentation_file: new_presentation_file, - original_event: original_event - } -> - {:ok, - Enum.map(original_event.presentation_file.forms, fn form -> - form_attrs = - Map.from_struct(form) - |> Map.drop([:id, :inserted_at, :updated_at]) - |> Map.put(:presentation_file_id, new_presentation_file.id) - |> Map.put( - :fields, - Enum.map(form.fields, &Map.from_struct(&1)) - ) - - {:ok, new_form} = Claper.Forms.create_form(form_attrs) - new_form - end)} - end) - |> Ecto.Multi.run(:embeds, fn _repo, - %{ - new_presentation_file: new_presentation_file, - original_event: original_event - } -> - {:ok, - Enum.map(original_event.presentation_file.embeds, fn embed -> - embed_attrs = - Map.from_struct(embed) - |> Map.drop([:id, :inserted_at, :updated_at]) - |> Map.put(:presentation_file_id, new_presentation_file.id) - - {:ok, new_embed} = Claper.Embeds.create_embed(embed_attrs) - new_embed - end)} - end) - |> Ecto.Multi.run(:quizzes, fn _repo, - %{ - new_presentation_file: new_presentation_file, - original_event: original_event - } -> - {:ok, - Enum.map(original_event.presentation_file.quizzes, fn quiz -> - quiz_attrs = - Map.from_struct(quiz) - |> Map.drop([:id, :inserted_at, :updated_at]) - |> Map.put(:presentation_file_id, new_presentation_file.id) - |> Map.put( - :quiz_questions, - Enum.map(quiz.quiz_questions, fn question -> - Map.from_struct(question) - |> Map.drop([:id, :inserted_at, :updated_at]) - |> Map.put( - :quiz_question_opts, - Enum.map(question.quiz_question_opts, fn opt -> - Map.from_struct(opt) - |> Map.drop([:id, :inserted_at, :updated_at]) - |> Map.put(:response_count, 0) - end) - ) - end) - ) - - {:ok, new_quiz} = Claper.Quizzes.create_quiz(quiz_attrs) - new_quiz - end)} - end) - |> Repo.transaction() do - {:ok, %{new_event: new_event}} -> {:ok, new_event} - {:error, _failed_operation, failed_value, _changes_so_far} -> {:error, failed_value} + case Repo.transaction(multi) do + {:ok, %{event: event}} -> {:ok, event} + {:error, _operation, value, _changes} -> {:error, value} end end + defp duplicate_event_attrs(original, _changes) do + code = + for _ <- 1..5, + into: "", + do: <> + + attrs = + Map.from_struct(original) + |> Map.drop([:id, :inserted_at, :updated_at, :presentation_file, :expired_at]) + |> Map.put(:leaders, []) + |> Map.put(:code, "#{code}") + |> Map.put(:name, "#{original.name} (Copy)") + + create_event(attrs) + end + + defp duplicate_presentation_file(original, changes) do + case get_in(original.presentation_file) do + %Presentations.PresentationFile{} = presentation_file -> + attrs = + Map.from_struct(presentation_file) + |> Map.drop([:id, :inserted_at, :updated_at, :presentation_state]) + |> Map.put(:event_id, changes.event.id) + + Presentations.create_presentation_file(attrs) + + _ -> + {:ok, nil} + end + end + + defp duplicate_presentation_state(original, changes) do + case get_in(original.presentation_file.presentation_state) do + %Presentations.PresentationState{} = presentation_state -> + attrs = + Map.from_struct(presentation_state) + |> Map.drop([:id, :inserted_at, :updated_at]) + |> Map.put(:presentation_file_id, changes.presentation_file.id) + |> Map.put(:position, 0) + |> Map.put(:banned, []) + + Presentations.create_presentation_state(attrs) + + _ -> + {:ok, nil} + end + end + + defp duplicate_polls(original, changes) do + case get_in(original.presentation_file.polls) do + polls when is_list(polls) -> + polls = + for poll <- polls do + attrs = + Map.from_struct(poll) + |> Map.drop([:id, :inserted_at, :updated_at]) + |> Map.put(:presentation_file_id, changes.presentation_file.id) + |> Map.put( + :poll_opts, + Enum.map(poll.poll_opts, fn opt -> + Map.from_struct(opt) + |> Map.drop([:id, :inserted_at, :updated_at, :vote_count]) + end) + ) + + {:ok, poll} = Claper.Polls.create_poll(attrs) + poll + end + + {:ok, polls} + + _ -> + {:ok, nil} + end + end + + defp duplicate_forms(original, changes) do + case get_in(original.presentation_file.forms) do + forms when is_list(forms) -> + forms = + for form <- forms do + attrs = + Map.from_struct(form) + |> Map.drop([:id, :inserted_at, :updated_at]) + |> Map.put(:presentation_file_id, changes.presentation_file.id) + |> Map.put( + :fields, + Enum.map(form.fields, &Map.from_struct(&1)) + ) + + {:ok, form} = Claper.Forms.create_form(attrs) + form + end + + {:ok, forms} + + _ -> + {:ok, nil} + end + end + + defp duplicate_embeds(original, changes) do + case get_in(original.presentation_file.embeds) do + embeds when is_list(embeds) -> + embeds = + for embed <- embeds do + attrs = + Map.from_struct(embed) + |> Map.drop([:id, :inserted_at, :updated_at]) + |> Map.put(:presentation_file_id, changes.presentation_file.id) + + {:ok, embed} = Claper.Embeds.create_embed(attrs) + embed + end + + {:ok, embeds} + + _ -> + {:ok, nil} + end + end + + defp duplicate_quizzes(original, changes) do + case get_in(original.presentation_file.quizzes) do + quizzes when is_list(quizzes) -> + quizzes = + for quiz <- quizzes do + attrs = + Map.from_struct(quiz) + |> Map.drop([:id, :inserted_at, :updated_at]) + |> Map.put(:presentation_file_id, changes.presentation_file.id) + |> Map.put(:quiz_questions, Enum.map(quiz.quiz_questions, &map_quiz_question/1)) + + {:ok, quiz} = Claper.Quizzes.create_quiz(attrs) + quiz + end + + {:ok, quizzes} + + _ -> + {:ok, nil} + end + end + + defp map_quiz_question(question) do + Map.from_struct(question) + |> Map.drop([:id, :inserted_at, :updated_at]) + |> Map.put( + :quiz_question_opts, + Enum.map(question.quiz_question_opts, &map_quiz_question_opt/1) + ) + end + + defp map_quiz_question_opt(opt) do + Map.from_struct(opt) + |> Map.drop([:id, :inserted_at, :updated_at]) + |> Map.put(:response_count, 0) + end + @doc """ Deletes a event. @@ -693,7 +763,20 @@ defmodule Claper.Events do """ def delete_event(%Event{} = event) do - Repo.delete(event) + leaders = + for %{email: email} <- get_activity_leaders_for_event(event.id) do + Accounts.get_user_by_email(email) + end + + with {:ok, event} <- Repo.delete(event) do + broadcast_user_events(event.user_id, {:deleted, event}) + + for leader <- leaders do + broadcast_user_events(leader.id, {:deleted, event}) + end + + {:ok, event} + end end @doc """ @@ -709,8 +792,6 @@ defmodule Claper.Events do Event.changeset(event, attrs) end - alias Claper.Events.ActivityLeader - @doc """ Creates a activity leader. @@ -756,7 +837,7 @@ defmodule Claper.Events do """ def get_activity_leaders_for_event(event_id) do from(a in ActivityLeader, - left_join: u in Claper.Accounts.User, + left_join: u in Accounts.User, on: u.email == a.email, where: a.event_id == ^event_id, select: %{a | user_id: u.id} @@ -777,13 +858,47 @@ defmodule Claper.Events do ActivityLeader.changeset(activity_leader, attrs) end - defp broadcast({:ok, e, event_uuid}, event) do - Phoenix.PubSub.broadcast( - Claper.PubSub, - "event:#{event_uuid}", - {event, event_uuid} - ) + @doc """ + Subscribes to an event's public `Phoenix.PubSub` topic. - {:ok, e} + The broadcasted messages match the pattern: + + * {:terminated, event_uuid} + + """ + def subscribe_event(event_uuid) when is_binary(event_uuid) do + Phoenix.PubSub.subscribe(Claper.PubSub, "event:#{event_uuid}") + end + + defp broadcast_event(event_uuid, message) when is_binary(event_uuid) do + Phoenix.PubSub.broadcast(Claper.PubSub, "event:#{event_uuid}", message) + end + + @doc """ + Subscribes to a user's events private `Phoenix.PubSub` topic. + + The broadcasted messages match the pattern: + + * {:created, %Event{}} + * {:updated, %Event{}} + * {:deleted, %Event{}} + + """ + def subscribe_user_events(user_id) when is_integer(user_id) do + Phoenix.PubSub.subscribe(Claper.PubSub, "user:#{user_id}:events") + end + + def broadcast_user_events(user_id, message) when is_integer(user_id) do + Phoenix.PubSub.broadcast(Claper.PubSub, "user:#{user_id}:events", message) + end + + defp broadcast_all_users({_type, %Event{} = event} = message, _opts \\ []) do + event = Repo.preload(event, [:leaders]) + broadcast_user_events(event.user_id, message) + + for %{email: leader_email} <- event.leaders do + leader = Accounts.get_user_by_email(leader_email) + broadcast_user_events(leader.id, message) + end end end diff --git a/lib/claper/events/event.ex b/lib/claper/events/event.ex index d557346..d1f3091 100644 --- a/lib/claper/events/event.ex +++ b/lib/claper/events/event.ex @@ -45,11 +45,12 @@ defmodule Claper.Events.Event do :code, :started_at, :expired_at, - :audience_peak + :audience_peak, + :user_id ]) |> cast_assoc(:presentation_file) |> cast_assoc(:leaders) - |> validate_required([:code, :name]) + |> validate_required([:name, :code, :started_at]) end def create_changeset(event, attrs) do @@ -57,7 +58,7 @@ defmodule Claper.Events.Event do |> cast(attrs, [:name, :code, :user_id, :started_at, :expired_at]) |> cast_assoc(:presentation_file) |> cast_assoc(:leaders) - |> validate_required([:code, :started_at]) + |> validate_required([:name, :code, :started_at, :user_id]) |> validate_length(:code, min: 5, max: 10) |> validate_length(:name, min: 5, max: 50) |> downcase_code @@ -74,10 +75,10 @@ defmodule Claper.Events.Event do def update_changeset(event, attrs) do event - |> cast(attrs, [:name, :code, :started_at, :expired_at, :audience_peak]) + |> cast(attrs, [:name, :code, :started_at, :expired_at, :audience_peak, :user_id]) |> cast_assoc(:presentation_file) |> cast_assoc(:leaders) - |> validate_required([:code, :started_at]) + |> validate_required([:name, :code, :started_at, :user_id]) |> validate_length(:code, min: 5, max: 10) |> validate_length(:name, min: 5, max: 50) |> downcase_code @@ -90,8 +91,8 @@ defmodule Claper.Events.Event do change(event, expired_at: expiry) end - def subscribe(event_id) do - Phoenix.PubSub.subscribe(Claper.PubSub, "event:#{event_id}") + def subscribe(event_uuid) do + Phoenix.PubSub.subscribe(Claper.PubSub, "event:#{event_uuid}") end def started?(event) do diff --git a/lib/claper/forms/field.ex b/lib/claper/forms/field.ex index d0b3214..0269e40 100644 --- a/lib/claper/forms/field.ex +++ b/lib/claper/forms/field.ex @@ -4,19 +4,21 @@ defmodule Claper.Forms.Field do @type t :: %__MODULE__{ name: String.t(), - type: String.t() + type: String.t(), + required: boolean() } @primary_key false embedded_schema do field :name, :string field :type, :string + field :required, :boolean, default: true end @doc false def changeset(form, attrs \\ %{}) do form - |> cast(attrs, [:name, :type]) + |> cast(attrs, [:name, :type, :required]) |> validate_required([:name, :type]) end end diff --git a/lib/claper/forms/form_submit.ex b/lib/claper/forms/form_submit.ex index a867fa5..f0c490f 100644 --- a/lib/claper/forms/form_submit.ex +++ b/lib/claper/forms/form_submit.ex @@ -25,6 +25,6 @@ defmodule Claper.Forms.FormSubmit do def changeset(form_submit, attrs) do form_submit |> cast(attrs, [:attendee_identifier, :user_id, :form_id, :response]) - |> validate_required([:form_id]) + |> validate_required([:form_id, :user_id, :response]) end end diff --git a/lib/claper/polls/poll.ex b/lib/claper/polls/poll.ex index f340b53..145cdc5 100644 --- a/lib/claper/polls/poll.ex +++ b/lib/claper/polls/poll.ex @@ -27,7 +27,11 @@ defmodule Claper.Polls.Poll do field :show_results, :boolean belongs_to :presentation_file, Claper.Presentations.PresentationFile - has_many :poll_opts, Claper.Polls.PollOpt, on_replace: :delete + + has_many :poll_opts, Claper.Polls.PollOpt, + preload_order: [asc: :id], + on_replace: :delete + has_many :poll_votes, Claper.Polls.PollVote, on_replace: :delete timestamps() diff --git a/lib/claper/presentations.ex b/lib/claper/presentations.ex index 680661e..31e92dc 100644 --- a/lib/claper/presentations.ex +++ b/lib/claper/presentations.ex @@ -31,6 +31,65 @@ defmodule Claper.Presentations do def get_presentation_files_by_hash(hash) when is_nil(hash), do: [] + @doc """ + Returns a list of JPG slide URLs for a given presentation. + + When a `Claper.Presentations.PresentationFile{}` struct is provided, the + function builds the list of URLs programmatically from the `hash` and + `length` fields. + + When an integer or binary `hash` is provided, it queries the database for the + associated presentation file and builds the list of URLs programmatically + from that. + + When `nil` is provided or when no presentation file is found for the given + `hash`, it returns an empty list. + """ + def get_slide_urls(hash_or_presentation_file) + + def get_slide_urls(nil), do: [] + + def get_slide_urls(hash) when is_integer(hash), do: get_slide_urls(to_string(hash)) + + def get_slide_urls(hash) when is_binary(hash) do + case Repo.get_by(PresentationFile, hash: hash) do + nil -> + [] + + presentation -> + get_slide_urls(hash, presentation.length) + end + end + + def get_slide_urls(%PresentationFile{} = presentation) do + get_slide_urls(presentation.hash, presentation.length) + end + + @doc """ + Returns a list of JPG slide URLs for a given presentation `hash` and + `length`. See also `get_slide_urls/1`. + """ + def get_slide_urls(hash, length) when is_binary(hash) and is_integer(length) do + config = Application.get_env(:claper, :presentations) + + case Keyword.fetch!(config, :storage) do + "local" -> + for index <- 1..length do + "/uploads/#{hash}/#{index}.jpg" + end + + "s3" -> + base_url = Keyword.fetch!(config, :s3_public_url) + + for index <- 1..length do + base_url <> "/presentations/#{hash}/#{index}.jpg" + end + + storage -> + raise "Unrecognised presentations storage value #{storage}" + end + end + @doc """ Creates a presentation_files. diff --git a/lib/claper/presentations/presentation_state.ex b/lib/claper/presentations/presentation_state.ex index 24ff236..e92b8d2 100644 --- a/lib/claper/presentations/presentation_state.ex +++ b/lib/claper/presentations/presentation_state.ex @@ -13,6 +13,7 @@ defmodule Claper.Presentations.PresentationState do message_reaction_enabled: boolean() | nil, banned: [String.t()] | nil, show_only_pinned: boolean() | nil, + show_attendee_count: boolean() | nil, presentation_file_id: integer() | nil, inserted_at: NaiveDateTime.t(), updated_at: NaiveDateTime.t() @@ -28,6 +29,7 @@ defmodule Claper.Presentations.PresentationState do field :message_reaction_enabled, :boolean, default: true field :banned, {:array, :string}, default: [] field :show_only_pinned, :boolean, default: false + field :show_attendee_count, :boolean, default: true belongs_to :presentation_file, Claper.Presentations.PresentationFile @@ -47,6 +49,7 @@ defmodule Claper.Presentations.PresentationState do :chat_enabled, :anonymous_chat_enabled, :show_only_pinned, + :show_attendee_count, :message_reaction_enabled ]) |> validate_required([]) diff --git a/lib/claper/quizzes.ex b/lib/claper/quizzes.ex index d1595bf..8b2c0b0 100644 --- a/lib/claper/quizzes.ex +++ b/lib/claper/quizzes.ex @@ -2,6 +2,8 @@ defmodule Claper.Quizzes do import Ecto.Query, warn: false alias Claper.Repo + alias Claper.Accounts.User + alias Claper.Quizzes.Quiz alias Claper.Quizzes.QuizQuestion alias Claper.Quizzes.QuizQuestionOpt @@ -265,28 +267,62 @@ defmodule Claper.Quizzes do {:ok, quiz} """ - def submit_quiz(user_id, quiz_opts, quiz_id) - when is_number(user_id) and is_list(quiz_opts) do - case Enum.reduce(quiz_opts, Ecto.Multi.new(), fn opt, multi -> - Ecto.Multi.update( - multi, - {:update_quiz_opt, opt.id}, + + # Pattern match on user, from user we create QuizResponse struct + # def submit_quiz(user_id, quiz_opts, quiz_id) + # when is_number(user_id) and is_list(quiz_opts) do + # quiz_opts = Enum.with_index(quiz_opts) + + # case Enum.reduce(quiz_opts, Ecto.Multi.new(), fn {opt, index}, multi -> + # unique_key = "#{opt.id}_#{user_id + index}" + + # multi + # |> Ecto.Multi.update( + # "update_quiz_opt_#{unique_key}", + # QuizQuestionOpt.changeset(opt, %{"response_count" => opt.response_count + 1}) + # ) + # |> Ecto.Multi.insert( + # "insert_quiz_response_#{unique_key}", + # QuizResponse.changeset(%QuizResponse{}, %{ + # user_id: user_id, + # quiz_question_opt_id: opt.id, + # quiz_question_id: opt.quiz_question_id, + # quiz_id: quiz_id + # }) + # ) + # end) + # |> Repo.transact() do + # {:ok, _} -> + # quiz = get_quiz!(quiz_id, [:quiz_questions, quiz_questions: :quiz_question_opts]) + # Lti13.QuizScoreReporter.report_quiz_score(quiz, user_id) + # {:ok, quiz} + # end + # end + + def submit_quiz(%User{} = user, quiz_opts, quiz_id) do + quiz_opts = Enum.with_index(quiz_opts) + + case Enum.reduce(quiz_opts, Ecto.Multi.new(), fn {opt, index}, multi -> + unique_key = "#{opt.id}_#{user.id + index}" + + multi + |> Ecto.Multi.update( + "update_quiz_opt_#{unique_key}", QuizQuestionOpt.changeset(opt, %{"response_count" => opt.response_count + 1}) ) |> Ecto.Multi.insert( - {:insert_quiz_response, opt.id}, - QuizResponse.changeset(%QuizResponse{}, %{ - user_id: user_id, + "insert_quiz_response_#{unique_key}", + Ecto.build_assoc(user, :quiz_responses, %{ quiz_question_opt_id: opt.id, quiz_question_id: opt.quiz_question_id, quiz_id: quiz_id }) ) end) - |> Repo.transaction() do + |> Repo.transact() do {:ok, _} -> quiz = get_quiz!(quiz_id, [:quiz_questions, quiz_questions: :quiz_question_opts]) - Lti13.QuizScoreReporter.report_quiz_score(quiz, user_id) + Lti13.QuizScoreReporter.report_quiz_score(quiz, user.id) {:ok, quiz} end end @@ -294,8 +330,8 @@ defmodule Claper.Quizzes do def submit_quiz(attendee_identifier, quiz_opts, quiz_id) when is_binary(attendee_identifier) and is_list(quiz_opts) do case Enum.reduce(quiz_opts, Ecto.Multi.new(), fn opt, multi -> - Ecto.Multi.update( - multi, + multi + |> Ecto.Multi.update( {:update_quiz_opt, opt.id}, QuizQuestionOpt.changeset(opt, %{"response_count" => opt.response_count + 1}) ) @@ -309,7 +345,7 @@ defmodule Claper.Quizzes do }) ) end) - |> Repo.transaction() do + |> Repo.transact() do {:ok, _} -> quiz = get_quiz!(quiz_id, [:quiz_questions, quiz_questions: :quiz_question_opts]) {:ok, quiz} diff --git a/lib/claper/quizzes/quiz.ex b/lib/claper/quizzes/quiz.ex index 2e46ccb..a0dca68 100644 --- a/lib/claper/quizzes/quiz.ex +++ b/lib/claper/quizzes/quiz.ex @@ -2,6 +2,22 @@ defmodule Claper.Quizzes.Quiz do use Ecto.Schema import Ecto.Changeset + @type t :: %__MODULE__{ + id: integer(), + title: String.t(), + position: integer() | nil, + enabled: boolean(), + show_results: boolean(), + allow_anonymous: boolean(), + lti_line_item_url: String.t() | nil, + lti_resource: Lti13.Resources.Resource.t() | nil, + quiz_responses: [Claper.Quizzes.QuizResponse.t()] | nil, + quiz_questions: [Claper.Quizzes.QuizQuestion.t()] | nil, + presentation_file: Claper.Presentations.PresentationFile.t(), + inserted_at: NaiveDateTime.t(), + updated_at: NaiveDateTime.t() + } + schema "quizzes" do field :title, :string field :position, :integer, default: 0 diff --git a/lib/claper/quizzes/quiz_question.ex b/lib/claper/quizzes/quiz_question.ex index 7ffdd8d..dac101e 100644 --- a/lib/claper/quizzes/quiz_question.ex +++ b/lib/claper/quizzes/quiz_question.ex @@ -2,7 +2,17 @@ defmodule Claper.Quizzes.QuizQuestion do use Ecto.Schema import Ecto.Changeset - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext + + @type t :: %__MODULE__{ + id: integer(), + content: String.t(), + type: String.t(), + quiz: Claper.Quizzes.Quiz.t() | nil, + quiz_question_opts: [Claper.Quizzes.QuizQuestionOpt.t()] | nil, + inserted_at: NaiveDateTime.t(), + updated_at: NaiveDateTime.t() + } schema "quiz_questions" do field :content, :string diff --git a/lib/claper/quizzes/quiz_question_opt.ex b/lib/claper/quizzes/quiz_question_opt.ex index 263fcf4..f36c477 100644 --- a/lib/claper/quizzes/quiz_question_opt.ex +++ b/lib/claper/quizzes/quiz_question_opt.ex @@ -2,6 +2,17 @@ defmodule Claper.Quizzes.QuizQuestionOpt do use Ecto.Schema import Ecto.Changeset + @type t :: %__MODULE__{ + id: integer(), + content: String.t(), + is_correct: boolean(), + response_count: integer(), + percentage: float() | nil, + quiz_question: Claper.Quizzes.QuizQuestion.t() | nil, + inserted_at: NaiveDateTime.t(), + updated_at: NaiveDateTime.t() + } + schema "quiz_question_opts" do field :content, :string field :is_correct, :boolean, default: false diff --git a/lib/claper/quizzes/quiz_response.ex b/lib/claper/quizzes/quiz_response.ex index a1233dc..e8ad88f 100644 --- a/lib/claper/quizzes/quiz_response.ex +++ b/lib/claper/quizzes/quiz_response.ex @@ -2,6 +2,17 @@ defmodule Claper.Quizzes.QuizResponse do use Ecto.Schema import Ecto.Changeset + @type t :: %__MODULE__{ + id: integer(), + attendee_identifier: String.t() | nil, + quiz: Claper.Quizzes.Quiz.t() | nil, + quiz_question: Claper.Quizzes.QuizQuestion.t() | nil, + quiz_question_opt: Claper.Quizzes.QuizQuestionOpt.t() | nil, + user: Claper.Accounts.User.t() | nil, + inserted_at: NaiveDateTime.t(), + updated_at: NaiveDateTime.t() + } + schema "quiz_responses" do field :attendee_identifier, :string @@ -20,8 +31,7 @@ defmodule Claper.Quizzes.QuizResponse do :attendee_identifier, :quiz_id, :quiz_question_id, - :quiz_question_opt_id, - :user_id + :quiz_question_opt_id ]) |> validate_required([:quiz_id, :quiz_question_id, :quiz_question_opt_id]) end diff --git a/lib/claper/release.ex b/lib/claper/release.ex index 4401231..d230ce6 100644 --- a/lib/claper/release.ex +++ b/lib/claper/release.ex @@ -21,7 +21,8 @@ defmodule Claper.Release do for repo <- repos() do {:ok, _, _} = Ecto.Migrator.with_repo(repo, fn _repo -> - Code.eval_file("priv/repo/seeds.exs") + seed_script = Application.app_dir(@app, "priv/repo/seeds.exs") + Code.eval_file(seed_script) end) end end diff --git a/lib/claper/tasks/converter.ex b/lib/claper/tasks/converter.ex index a271cd5..ff8baf7 100644 --- a/lib/claper/tasks/converter.ex +++ b/lib/claper/tasks/converter.ex @@ -4,7 +4,7 @@ defmodule Claper.Tasks.Converter do We use a hash to identify the presentation. A new hash is generated when the conversion is finished and the presentation is being uploaded. """ - alias ExAws.S3 + alias Claper.Events alias Porcelain.Result @doc """ @@ -19,11 +19,7 @@ defmodule Claper.Tasks.Converter do "status" => "progress" }) - Phoenix.PubSub.broadcast( - Claper.PubSub, - "events:#{user_id}", - {:presentation_file_process_done, presentation} - ) + Events.broadcast_user_events(user_id, {:presentation_file_process_done, presentation}) path = Path.join([ @@ -53,11 +49,11 @@ defmodule Claper.Tasks.Converter do ) else stream = - ExAws.S3.list_objects(get_aws_bucket(), prefix: "presentations/#{hash}") + ExAws.S3.list_objects(get_s3_bucket(), prefix: "presentations/#{hash}") |> ExAws.stream!() |> Stream.map(& &1.key) - ExAws.S3.delete_all_objects(get_aws_bucket(), stream) |> ExAws.request() + ExAws.S3.delete_all_objects(get_s3_bucket(), stream) |> ExAws.request() end end @@ -137,9 +133,9 @@ defmodule Claper.Tasks.Converter do IO.puts("Uploads #{f} to presentations/#{new_hash}/#{Path.basename(f)}") f - |> S3.Upload.stream_file() - |> S3.upload( - get_aws_bucket(), + |> ExAws.S3.Upload.stream_file() + |> ExAws.S3.upload( + get_s3_bucket(), "presentations/#{new_hash}/#{Path.basename(f)}", acl: "public-read" ) @@ -167,11 +163,7 @@ defmodule Claper.Tasks.Converter do }) do if get_presentation_storage() != "local", do: File.rm_rf!(path) - Phoenix.PubSub.broadcast( - Claper.PubSub, - "events:#{user_id}", - {:presentation_file_process_done, presentation} - ) + Events.broadcast_user_events(user_id, {:presentation_file_process_done, presentation}) end end @@ -182,11 +174,7 @@ defmodule Claper.Tasks.Converter do }) do File.rm_rf!(path) - Phoenix.PubSub.broadcast( - Claper.PubSub, - "events:#{user_id}", - {:presentation_file_process_done, presentation} - ) + Events.broadcast_user_events(user_id, {:presentation_file_process_done, presentation}) end end @@ -198,8 +186,8 @@ defmodule Claper.Tasks.Converter do Application.get_env(:claper, :storage_dir) end - defp get_aws_bucket do - Application.get_env(:claper, :presentations) |> Keyword.get(:aws_bucket) + defp get_s3_bucket do + Application.get_env(:claper, :presentations) |> Keyword.get(:s3_bucket) end defp get_resolution do diff --git a/lib/claper/workers/mailers.ex b/lib/claper/workers/mailers.ex index d330b17..081eeab 100644 --- a/lib/claper/workers/mailers.ex +++ b/lib/claper/workers/mailers.ex @@ -6,19 +6,25 @@ defmodule Claper.Workers.Mailers do @impl Oban.Worker def perform(%Oban.Job{args: %{"type" => type, "user_id" => user_id, "url" => url}}) - when type in ["confirm", "reset", "update_email"] do + when type in ["confirm", "reset"] do user = Claper.Accounts.get_user!(user_id) email = case type do "confirm" -> UserNotifier.confirm(user, url) "reset" -> UserNotifier.reset(user, url) - "update_email" -> UserNotifier.update_email(user, url) end Mailer.deliver(email) end + def perform(%Oban.Job{ + args: %{"type" => "update_email", "new_email" => new_email, "url" => url} + }) do + email = UserNotifier.update_email(new_email, url) + Mailer.deliver(email) + end + def perform(%Oban.Job{args: %{"type" => "magic", "email" => email, "url" => url}}) do email = UserNotifier.magic(email, url) Mailer.deliver(email) @@ -50,8 +56,8 @@ defmodule Claper.Workers.Mailers do new(%{type: "reset", user_id: user_id, url: url}) end - def new_update_email(user_id, url) do - new(%{type: "update_email", user_id: user_id, url: url}) + def new_update_email(new_email, url) do + new(%{type: "update_email", new_email: new_email, url: url}) end def new_magic_link(email, url) do diff --git a/lib/claper_web.ex b/lib/claper_web.ex index 5ebb91b..bc77c14 100644 --- a/lib/claper_web.ex +++ b/lib/claper_web.ex @@ -24,7 +24,7 @@ defmodule ClaperWeb do use Phoenix.Controller, namespace: ClaperWeb import Plug.Conn - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext unquote(verified_routes()) end @@ -87,7 +87,7 @@ defmodule ClaperWeb do quote do use Phoenix.Channel import Phoenix.View - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext end end @@ -99,7 +99,7 @@ defmodule ClaperWeb do use PhoenixHTMLHelpers # Import LiveView and .heex helpers (live_render, live_patch, <.form>, etc) - import Phoenix.LiveView.Helpers + import Phoenix.Component import ClaperWeb.LiveHelpers alias Phoenix.LiveView.JS @@ -107,7 +107,7 @@ defmodule ClaperWeb do import Phoenix.View import ClaperWeb.ErrorHelpers - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext unquote(verified_routes()) end diff --git a/lib/claper_web/controllers/stat_controller.ex b/lib/claper_web/controllers/stat_controller.ex index 95e0be1..8b4f4bf 100644 --- a/lib/claper_web/controllers/stat_controller.ex +++ b/lib/claper_web/controllers/stat_controller.ex @@ -197,7 +197,7 @@ defmodule ClaperWeb.StatController do # Private functions defp authorize_event_access(user, event) do - if Events.leaded_by?(user.email, event) || event.user_id == user.id do + if Events.led_by?(user.email, event) || event.user_id == user.id do :ok else :unauthorized diff --git a/lib/claper_web/controllers/user_oidc_auth.ex b/lib/claper_web/controllers/user_oidc_auth.ex index e55975e..6cb495d 100644 --- a/lib/claper_web/controllers/user_oidc_auth.ex +++ b/lib/claper_web/controllers/user_oidc_auth.ex @@ -103,7 +103,7 @@ defmodule ClaperWeb.UserOidcAuth do Application.get_env(:claper, ClaperWeb.Endpoint)[:base_url] end - defp opts(pkce_verifier \\ nil) do + defp opts(pkce_verifier) do url = base_url() base_opts = %{ diff --git a/lib/claper_web/gettext.ex b/lib/claper_web/gettext.ex index 47262d4..93b8009 100644 --- a/lib/claper_web/gettext.ex +++ b/lib/claper_web/gettext.ex @@ -5,7 +5,7 @@ defmodule ClaperWeb.Gettext do By using [Gettext](https://hexdocs.pm/gettext), your module gains a set of macros for translations, for example: - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext # Simple translation gettext("Here is the string to translate") @@ -20,5 +20,5 @@ defmodule ClaperWeb.Gettext do See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. """ - use Gettext, otp_app: :claper + use Gettext.Backend, otp_app: :claper end diff --git a/lib/claper_web/helpers/csv_exporter.ex b/lib/claper_web/helpers/csv_exporter.ex new file mode 100644 index 0000000..3a819ce --- /dev/null +++ b/lib/claper_web/helpers/csv_exporter.ex @@ -0,0 +1,169 @@ +defmodule ClaperWeb.Helpers.CSVExporter do + @moduledoc """ + Helper module for exporting data to CSV format. + + This module provides functions to convert collections of data + into CSV format for download in the admin panel. + """ + + @doc """ + Converts a list of records to CSV format. + + ## Parameters + - records: List of records/maps to convert + - headers: List of column headers + - fields: List of fields to include in the CSV + + ## Returns + - CSV formatted string + """ + def to_csv(records, headers, fields) do + records + |> build_rows(fields) + |> add_headers(headers) + |> CSV.encode() + |> Enum.to_list() + |> Enum.join("") + end + + @doc """ + Generates a timestamped filename for CSV exports. + + ## Parameters + - prefix: Prefix for the filename (e.g., "users", "events") + + ## Returns + - String filename with timestamp + """ + def generate_filename(prefix) do + date = DateTime.utc_now() |> Calendar.strftime("%Y%m%d_%H%M%S") + "#{prefix}_export_#{date}.csv" + end + + # Private helper functions + + defp build_rows(records, fields) do + Enum.map(records, fn record -> + Enum.map(fields, fn field -> + format_field_value(Map.get(record, field)) + end) + end) + end + + defp add_headers(rows, headers) do + [headers | rows] + end + + defp format_field_value(value) when is_boolean(value) do + if value, do: "Yes", else: "No" + end + + defp format_field_value(%DateTime{} = dt) do + Calendar.strftime(dt, "%Y-%m-%d %H:%M:%S") + end + + defp format_field_value(%NaiveDateTime{} = dt) do + Calendar.strftime(dt, "%Y-%m-%d %H:%M:%S") + end + + defp format_field_value(nil), do: "" + + defp format_field_value(value), do: to_string(value) + + @doc """ + Exports a list of users to CSV format. + + ## Parameters + - users: List of User structs to export + + ## Returns + - CSV formatted string + """ + def export_users_to_csv(users) do + headers = ["Email", "Name", "Role", "Created At"] + + # Transform users to include role name + users_with_role = + Enum.map(users, fn user -> + role_name = if user.role, do: user.role.name, else: "" + + %{ + email: user.email, + # Users don't have a name field currently + name: "", + role: role_name, + inserted_at: user.inserted_at + } + end) + + fields = [:email, :name, :role, :inserted_at] + + to_csv(users_with_role, headers, fields) + end + + @doc """ + Exports a list of events to CSV format. + + ## Parameters + - events: List of Event structs to export + + ## Returns + - CSV formatted string + """ + def export_events_to_csv(events) do + headers = [ + "Name", + "Description", + "Start Date", + "End Date", + "Status" + ] + + # Transform events to include description and status + events_transformed = + Enum.map(events, fn event -> + status = + cond do + event.expired_at && + NaiveDateTime.compare(event.expired_at, NaiveDateTime.utc_now()) == :lt -> + "completed" + + event.started_at && + NaiveDateTime.compare(event.started_at, NaiveDateTime.utc_now()) == :gt -> + "scheduled" + + true -> + "active" + end + + %{ + name: event.name, + # Events don't have a description field currently + description: "", + start_date: event.started_at, + end_date: event.expired_at, + status: status + } + end) + + fields = [:name, :description, :start_date, :end_date, :status] + + to_csv(events_transformed, headers, fields) + end + + @doc """ + Exports a list of OIDC providers to CSV format. + + ## Parameters + - providers: List of Provider structs to export + + ## Returns + - CSV formatted string + """ + def export_oidc_providers_to_csv(providers) do + headers = ["Name", "Issuer", "Client ID", "Active"] + fields = [:name, :issuer, :client_id, :active] + + to_csv(providers, headers, fields) + end +end diff --git a/lib/claper_web/live/admin_live/dashboard_live.ex b/lib/claper_web/live/admin_live/dashboard_live.ex new file mode 100644 index 0000000..af6e07d --- /dev/null +++ b/lib/claper_web/live/admin_live/dashboard_live.ex @@ -0,0 +1,109 @@ +defmodule ClaperWeb.AdminLive.DashboardLive do + use ClaperWeb, :live_view + + import Ecto.Query, warn: false + alias Claper.Admin + alias Claper.Events.Event + alias Claper.Repo + + @impl true + def mount(_params, session, socket) do + if connected?(socket) do + # Set up periodic updates every 30 seconds + :timer.send_interval(30_000, self(), :update_charts) + end + + with %{"locale" => locale} <- session do + Gettext.put_locale(ClaperWeb.Gettext, locale) + end + + socket = + socket + |> assign(:page_title, gettext("Dashboard")) + |> assign(:selected_period, :day) + |> assign(:days_back, 30) + |> load_dashboard_data() + + {:ok, socket} + end + + @impl true + def handle_params(_params, _url, socket) do + {:noreply, socket} + end + + @impl true + def handle_event("change_period", %{"period" => period}, socket) do + period_atom = String.to_atom(period) + + days_back = + case period_atom do + :day -> 30 + # 12 weeks + :week -> 84 + # 12 months + :month -> 365 + _ -> 30 + end + + socket = + socket + |> assign(:selected_period, period_atom) + |> assign(:days_back, days_back) + |> load_chart_data() + + {:noreply, socket} + end + + @impl true + def handle_event("refresh_data", _params, socket) do + socket = load_dashboard_data(socket) + {:noreply, socket} + end + + @impl true + def handle_info(:update_charts, socket) do + socket = load_chart_data(socket) + {:noreply, socket} + end + + defp load_dashboard_data(socket) do + stats = Admin.get_dashboard_stats() + growth_metrics = Admin.get_growth_metrics() + activity_stats = Admin.get_activity_stats() + + # Get recent events for the dashboard + recent_events = + Event + |> order_by([e], desc: e.started_at) + |> limit(5) + |> preload(:user) + |> Repo.all() + + # Transform stats to match template expectations + transformed_stats = %{ + total_users: stats.users_count, + total_events: stats.events_count, + active_events: stats.upcoming_events + } + + socket + |> assign(:stats, transformed_stats) + |> assign(:growth_metrics, growth_metrics) + |> assign(:activity_stats, activity_stats) + |> assign(:recent_events, recent_events) + |> load_chart_data() + end + + defp load_chart_data(socket) do + period = socket.assigns.selected_period + days_back = socket.assigns.days_back + + users_chart_data = Admin.get_users_over_time(period, days_back) + events_chart_data = Admin.get_events_over_time(period, days_back) + + socket + |> assign(:users_chart_data, users_chart_data) + |> assign(:events_chart_data, events_chart_data) + end +end diff --git a/lib/claper_web/live/admin_live/dashboard_live.html.heex b/lib/claper_web/live/admin_live/dashboard_live.html.heex new file mode 100644 index 0000000..ad22e66 --- /dev/null +++ b/lib/claper_web/live/admin_live/dashboard_live.html.heex @@ -0,0 +1,212 @@ + +
+

{gettext("Dashboard")}

+
+ + +
+ +
+
+
{gettext("Total Users")}
+
{@stats.total_users}
+
+ 0 do + "text-success" + else + "text-error" + end + }> + <%= if @growth_metrics.users_growth >= 0 do %> + ↗︎ + <% else %> + ↘︎ + <% end %> + {@growth_metrics.users_growth}% + + {gettext("vs last month")} +
+
+ +
+
{gettext("Total Events")}
+
{@stats.total_events}
+
+ 0 do + "text-success" + else + "text-error" + end + }> + <%= if @growth_metrics.events_growth >= 0 do %> + ↗︎ + + <% else %> + ↘︎ + <% end %> + {@growth_metrics.events_growth}% + + {gettext("vs last month")} +
+
+ +
+
{gettext("Active Events")}
+
{@stats.active_events}
+
{gettext("Currently running")}
+
+
+ + +
+
+
+

{gettext("User Growth")}

+

{gettext("Last 30 days")}

+
+ + +
+
+
+ +
+
+

{gettext("Event Creation")}

+

{gettext("Last 30 days")}

+
+ + +
+
+
+
+ + +
+
+
+

{gettext("Recent Events")}

+ +
+ + + + + + + + + + + + + + <%= for event <- @recent_events do %> + <% now = NaiveDateTime.utc_now() %> + <% {status_text, status_class} = + cond do + is_nil(event.expired_at) == false -> + {gettext("Completed"), "badge-ghost"} + + NaiveDateTime.compare(event.started_at, now) == :gt -> + {gettext("Scheduled"), "badge-info"} + + true -> + {gettext("Active"), "badge-success"} + end %> + + + + + + + + + + <% end %> + <%= if Enum.empty?(@recent_events) do %> + + + + <% end %> + +
{gettext("Name")}{gettext("Code")}{gettext("Owner")}{gettext("Start Date")}{gettext("Audience Peak")}{gettext("Status")}
+
{event.name}
+
+ {event.code} + {event.user.email}{Calendar.strftime(event.started_at, "%b %d, %Y")} +
{event.audience_peak}
+
+
+ {status_text} +
+
+
+ <.link + navigate={~p"/admin/events/#{event}"} + class="btn btn-link btn-xs" + title={gettext("View event")} + > + + + + + + <.link + navigate={~p"/admin/events/#{event}/edit"} + class="btn btn-link btn-xs text-primary" + title={gettext("Edit event")} + > + + + + +
+
+
+ {gettext("No events found")} +
+
+
+
+
+
+
diff --git a/lib/claper_web/live/admin_live/event_live.ex b/lib/claper_web/live/admin_live/event_live.ex new file mode 100644 index 0000000..cc65890 --- /dev/null +++ b/lib/claper_web/live/admin_live/event_live.ex @@ -0,0 +1,175 @@ +defmodule ClaperWeb.AdminLive.EventLive do + use ClaperWeb, :live_view + + alias Claper.Admin + alias Claper.Events.Event + alias ClaperWeb.Helpers.CSVExporter + + @impl true + def mount(_params, session, socket) do + with %{"locale" => locale} <- session do + Gettext.put_locale(ClaperWeb.Gettext, locale) + end + + {:ok, + socket + |> assign(:page_title, gettext("Events")) + |> assign(:events, list_events()) + |> assign(:search, "") + |> assign(:current_sort, %{field: :na, order: :asc})} + end + + @impl true + def handle_params(params, _url, socket) do + {:noreply, apply_action(socket, socket.assigns.live_action, params)} + end + + defp apply_action(socket, :index, _params) do + socket + |> assign(:page_title, "Events") + |> assign(:event, nil) + end + + defp apply_action(socket, :new, _params) do + socket + |> assign(:page_title, gettext("New event")) + |> assign(:event, %Event{}) + end + + defp apply_action(socket, :edit, %{"id" => id}) do + socket + |> assign(:page_title, gettext("Edit event")) + |> assign(:event, Claper.Events.get_event!(id, [:user])) + end + + defp apply_action(socket, :show, %{"id" => id}) do + socket + |> assign(:page_title, gettext("Event details")) + |> assign(:event, Claper.Events.get_event!(id, [:user])) + end + + @impl true + def handle_event("delete", %{"id" => id}, socket) do + event = Claper.Events.get_event!(id) + {:ok, _} = Claper.Events.delete_event(event) + + {:noreply, + socket + |> put_flash(:info, gettext("Event deleted successfully")) + |> assign(:events, list_events())} + end + + @impl true + def handle_event("search", %{"search" => search}, socket) do + events = search_events(search) + {:noreply, socket |> assign(:search, search) |> assign(:events, events)} + end + + @impl true + def handle_event("sort", %{"field" => field}, socket) do + field = String.to_existing_atom(field) + current_sort = socket.assigns.current_sort + + direction = + if current_sort.field == field && current_sort.order == :asc, do: :desc, else: :asc + + events = sort_events(socket.assigns.events, field, direction) + current_sort = %{field: field, order: direction} + + {:noreply, + socket + |> assign(:events, events) + |> assign(:current_sort, current_sort)} + end + + @impl true + def handle_info({:export_csv_requested, _params}, socket) do + filename = CSVExporter.generate_filename("events") + csv_content = CSVExporter.export_events_to_csv(socket.assigns.events) + + {:noreply, + socket + |> put_flash(:info, gettext("Events exported successfully")) + |> push_event("download_csv", %{filename: filename, content: csv_content})} + end + + @impl true + def handle_info({:table_action, action, event, _event_id}, socket) do + case action do + :view -> + {:noreply, push_navigate(socket, to: ~p"/admin/events/#{event}")} + + :edit -> + {:noreply, push_navigate(socket, to: ~p"/admin/events/#{event}/edit")} + + :delete -> + {:ok, _} = Claper.Events.delete_event(event) + + {:noreply, + socket + |> put_flash(:info, gettext("Event deleted successfully")) + |> assign(:events, list_events())} + end + end + + defp list_events do + Admin.list_all_events() + end + + defp search_events(search) when search == "", do: list_events() + + defp search_events(search) do + Admin.list_all_events(%{"search" => search}) + end + + defp sort_events(events, field, order) do + Enum.sort_by(events, &Map.get(&1, field), order) + end + + def sort_indicator(assigns) do + ~H""" + <%= if @current_sort.field == @field do %> + <%= if @current_sort.order == :asc do %> + + + + <% else %> + + + + <% end %> + <% else %> + + + + <% end %> + """ + end +end diff --git a/lib/claper_web/live/admin_live/event_live.html.heex b/lib/claper_web/live/admin_live/event_live.html.heex new file mode 100644 index 0000000..079752f --- /dev/null +++ b/lib/claper_web/live/admin_live/event_live.html.heex @@ -0,0 +1,367 @@ +<%= case @live_action do %> + <% :index -> %> +
+
+
+

{gettext("Events")}

+
+ <%!-- <.link navigate={~p"/admin/events/new"} class="btn btn-primary btn-sm"> + + + + {gettext("New event")} + --%> +
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ + + + + + + + + + + + + + <%= if Enum.empty?(@events) do %> + + + + <% else %> + <%= for event <- @events do %> + + + + + + + + + + <% end %> + <% end %> + +
+ + + + + {gettext("Owner")} + + + + + + + + {gettext("Actions")} +
+ {gettext("No events found")} +
+ {event.name} + + {event.code} + + {if event.user, do: event.user.email, else: gettext("No owner")} + + {if event.started_at, + do: Calendar.strftime(event.started_at, "%Y-%m-%d %H:%M"), + else: gettext("Not started")} + + {if event.expired_at, + do: Calendar.strftime(event.expired_at, "%Y-%m-%d %H:%M"), + else: gettext("Not expired")} + +
+ {event.audience_peak || 0} +
+
+
+ <.link + navigate={~p"/admin/events/#{event}"} + class="btn btn-link btn-sm" + title={gettext("View event")} + > + + + + + + <.link + navigate={~p"/admin/events/#{event}/edit"} + class="btn btn-link btn-sm text-primary" + title={gettext("Edit event")} + > + + + + + + + + + +
+
+
+
+
+
+
+
+ <% :show -> %> +
+
+
+

{gettext("Event details")}

+
+ <.link navigate={~p"/admin/events"} class="btn btn-outline btn-sm"> + {gettext("Back to events")} + + <.link navigate={~p"/admin/events/#{@event}/edit"} class="btn btn-primary btn-sm"> + {gettext("Edit")} + +
+
+
+ +
+
+
+

{@event.name}

+

#{@event.code}

+
+
+
+
{gettext("Name")}
+
{@event.name}
+
+
+
{gettext("Owner")}
+
+ {if @event.user, do: @event.user.email, else: gettext("No owner")} +
+
+
+
{gettext("Started At")}
+
+ {if @event.started_at, + do: Calendar.strftime(@event.started_at, "%Y-%m-%d %H:%M"), + else: gettext("Not started")} +
+
+
+
{gettext("Expired At")}
+
+ {if @event.expired_at, + do: Calendar.strftime(@event.expired_at, "%Y-%m-%d %H:%M"), + else: gettext("Not expired")} +
+
+
+
{gettext("Audience Peak")}
+
+ {@event.audience_peak || 0} {gettext("attendees")} +
+
+
+
{gettext("Created At")}
+
+ {Calendar.strftime(@event.inserted_at, "%Y-%m-%d %H:%M")} +
+
+
+
{gettext("Last Updated")}
+
+ {Calendar.strftime(@event.updated_at, "%Y-%m-%d %H:%M")} +
+
+
+
+
+
+
+ <% :new -> %> +
+
+
+

{gettext("New event")}

+
+
+ +
+
+
+ <.live_component + module={ClaperWeb.AdminLive.EventLive.FormComponent} + id="event-form" + title={gettext("New event")} + action={:new} + event={@event} + navigate={~p"/admin/events"} + /> +
+
+
+
+ <% :edit -> %> +
+
+
+

{gettext("Edit event")}

+
+
+ +
+
+
+ <.live_component + module={ClaperWeb.AdminLive.EventLive.FormComponent} + id={"event-form-#{@event.id}"} + title={gettext("Edit event")} + action={:edit} + event={@event} + navigate={~p"/admin/events"} + /> +
+
+
+
+<% end %> diff --git a/lib/claper_web/live/admin_live/event_live/form_component.ex b/lib/claper_web/live/admin_live/event_live/form_component.ex new file mode 100644 index 0000000..bcbf1eb --- /dev/null +++ b/lib/claper_web/live/admin_live/event_live/form_component.ex @@ -0,0 +1,160 @@ +defmodule ClaperWeb.AdminLive.EventLive.FormComponent do + use ClaperWeb, :live_component + + alias Claper.Events + alias Claper.Accounts + + @impl true + def render(assigns) do + ~H""" +
+ <.form for={@form} id="event-form" phx-target={@myself} phx-change="validate" phx-submit="save"> +
+ <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="event-name" + form={@form} + field={:name} + type="text" + label={gettext("Name")} + placeholder={gettext("Enter event name")} + required={true} + width_class="sm:col-span-6" + description={gettext("A unique name for this event")} + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="event-code" + form={@form} + field={:code} + type="text" + label={gettext("Code")} + placeholder={gettext("Enter event code")} + required={true} + width_class="sm:col-span-3" + field_class="uppercase" + description={gettext("A unique code for participants to join this event")} + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="event-started-at" + form={@form} + field={:started_at} + type="datetime" + label={gettext("Started At")} + required={true} + width_class="sm:col-span-3" + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="event-expired-at" + form={@form} + field={:expired_at} + type="datetime" + label={gettext("Expired At")} + required={false} + width_class="sm:col-span-3" + description={gettext("When this event expires (optional)")} + /> + + <.live_component + module={ClaperWeb.AdminLive.SearchableSelectComponent} + id="event-user-id" + form={@form} + field={:user_id} + label={gettext("Assigned User")} + options={@user_options} + placeholder={gettext("Search for a user...")} + required={true} + width_class="sm:col-span-6" + description={gettext("The user who owns this event (required)")} + /> +
+ +
+
+ + +
+
+ +
+ """ + end + + @impl true + def update(%{event: event} = assigns, socket) do + changeset = Events.change_event(event) + + user_options = + Accounts.list_users() + |> Enum.map(&{"#{&1.email}", &1.id}) + + {:ok, + socket + |> assign(assigns) + |> assign(:user_options, user_options) + |> assign_form(changeset)} + end + + @impl true + def handle_event("validate", %{"event" => event_params}, socket) do + changeset = + socket.assigns.event + |> Events.change_event(event_params) + |> Map.put(:action, :validate) + + {:noreply, assign_form(socket, changeset)} + end + + def handle_event("save", %{"event" => event_params}, socket) do + save_event(socket, socket.assigns.action, event_params) + end + + def handle_event("cancel", _params, socket) do + {:noreply, push_navigate(socket, to: socket.assigns.navigate)} + end + + defp save_event(socket, :edit, event_params) do + case Events.update_event(socket.assigns.event, event_params) do + {:ok, event} -> + notify_parent({:saved, event}) + + {:noreply, + socket + |> put_flash(:info, gettext("Event updated successfully")) + |> push_navigate(to: socket.assigns.navigate)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp save_event(socket, :new, event_params) do + case Events.create_event(event_params) do + {:ok, event} -> + notify_parent({:saved, event}) + + {:noreply, + socket + |> put_flash(:info, gettext("Event created successfully")) + |> push_navigate(to: socket.assigns.navigate)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp assign_form(socket, %Ecto.Changeset{} = changeset) do + assign(socket, :form, to_form(changeset)) + end + + defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) +end diff --git a/lib/claper_web/live/admin_live/form_field_component.ex b/lib/claper_web/live/admin_live/form_field_component.ex new file mode 100644 index 0000000..9f1c44b --- /dev/null +++ b/lib/claper_web/live/admin_live/form_field_component.ex @@ -0,0 +1,184 @@ +defmodule ClaperWeb.AdminLive.FormFieldComponent do + use ClaperWeb, :live_component + + @impl true + def render(assigns) do + ~H""" +
+
+ + <%= case @type do %> + <% "text" -> %> + {text_input( + @form, + @field, + [ + class: "input w-full " <> @field_class, + placeholder: @placeholder, + required: @required + ] ++ @extra_attrs + )} + <% "email" -> %> + {email_input( + @form, + @field, + [ + class: "input w-full", + placeholder: @placeholder, + required: @required + ] ++ @extra_attrs + )} + <% "password" -> %> +
+ {password_input( + @form, + @field, + [ + class: "input w-full pr-10", + placeholder: @placeholder, + required: @required, + id: "password-field-#{@field}" + ] ++ @extra_attrs + )} + +
+ <% "textarea" -> %> + {textarea( + @form, + @field, + [ + class: "input w-full", + placeholder: @placeholder, + required: @required, + rows: @rows + ] ++ @extra_attrs + )} + <% "select" -> %> + {select( + @form, + @field, + @select_options, + [ + class: "select w-full", + prompt: @prompt || gettext("Select an option"), + required: @required + ] ++ @extra_attrs + )} + <% "checkbox" -> %> +
+ +
+ <% "date" -> %> + {date_input( + @form, + @field, + [ + class: "input input-bordered w-full", + required: @required + ] ++ @extra_attrs + )} + <% "datetime" -> %> + {datetime_local_input( + @form, + @field, + [ + class: "input input-bordered w-full", + required: @required + ] ++ @extra_attrs + )} + <% "file" -> %> +
+ + + {if @selected_file, do: @selected_file, else: gettext("No file chosen")} + +
+ <% _ -> %> + {text_input( + @form, + @field, + [ + class: "input input-bordered w-full", + placeholder: @placeholder, + required: @required + ] ++ @extra_attrs + )} + <% end %> + + +
+
+ """ + end + + @impl true + def mount(socket) do + {:ok, assign(socket, selected_file: nil)} + end + + @impl true + def update(assigns, socket) do + socket = + socket + |> assign(assigns) + |> assign_new(:placeholder, fn -> "" end) + |> assign_new(:required, fn -> false end) + |> assign_new(:description, fn -> nil end) + |> assign_new(:width_class, fn -> nil end) + |> assign_new(:field_class, fn -> "" end) + |> assign_new(:checkbox_label, fn -> nil end) + |> assign_new(:prompt, fn -> nil end) + |> assign_new(:select_options, fn -> [] end) + |> assign_new(:rows, fn -> 3 end) + |> assign_new(:extra_attrs, fn -> [] end) + + {:ok, socket} + end + + @impl true + def handle_event("file_selected", %{"_target" => [_field_name]}, socket) do + {:noreply, assign(socket, selected_file: gettext("File selected"))} + end + + defp toggle_password_visibility(field_id) do + %Phoenix.LiveView.JS{} + |> Phoenix.LiveView.JS.dispatch("toggle-password", to: "##{field_id}") + end +end diff --git a/lib/claper_web/live/admin_live/modal_component.ex b/lib/claper_web/live/admin_live/modal_component.ex new file mode 100644 index 0000000..2fc3003 --- /dev/null +++ b/lib/claper_web/live/admin_live/modal_component.ex @@ -0,0 +1,196 @@ +defmodule ClaperWeb.AdminLive.ModalComponent do + use ClaperWeb, :live_component + alias Phoenix.LiveView.JS + + @impl true + def render(assigns) do + ~H""" + + """ + end + + @impl true + def mount(socket) do + {:ok, assign(socket, show: false)} + end + + @impl true + def update(assigns, socket) do + socket = + socket + |> assign(assigns) + |> assign_new(:show, fn -> false end) + |> assign_new(:icon, fn -> nil end) + |> assign_new(:icon_bg_class, fn -> "bg-red-100" end) + |> assign_new(:icon_text_class, fn -> "text-red-600" end) + |> assign_new(:description, fn -> nil end) + |> assign_new(:content, fn -> [] end) + |> assign_new(:confirm_action, fn -> nil end) + |> assign_new(:confirm_class, fn -> "bg-red-600 hover:bg-red-700 focus:ring-red-500" end) + |> assign_new(:cancel_action, fn -> "Cancel" end) + |> assign_new(:custom_actions, fn -> [] end) + |> assign_new(:size_class, fn -> "sm:max-w-lg sm:w-full" end) + + {:ok, socket} + end + + @impl true + def handle_event("hide", _params, socket) do + send(self(), {:modal_cancelled, socket.assigns.id}) + {:noreply, assign(socket, show: false)} + end + + def handle_event("confirm", _params, socket) do + send(self(), {:modal_confirmed, socket.assigns.id}) + {:noreply, assign(socket, show: false)} + end + + # Public API for controlling the modal + def show_modal(js \\ %JS{}, modal_id) do + js + |> JS.show(to: "##{modal_id}") + |> JS.add_class("animate-fade-in", to: "##{modal_id}") + end + + def hide_modal(js \\ %JS{}, modal_id) do + js + |> JS.add_class("animate-fade-out", to: "##{modal_id}") + |> JS.hide(to: "##{modal_id}", transition: "animate-fade-out", time: 200) + end + + # Preset configurations for common modal types + def delete_modal_config(title, description) do + %{ + icon: "fa-exclamation-triangle", + icon_bg_class: "bg-red-100", + icon_text_class: "text-red-600", + title: title, + description: description, + confirm_action: "Delete", + confirm_class: "bg-red-600 hover:bg-red-700 focus:ring-red-500", + cancel_action: "Cancel" + } + end + + def warning_modal_config(title, description) do + %{ + icon: "fa-exclamation-triangle", + icon_bg_class: "bg-yellow-100", + icon_text_class: "text-yellow-600", + title: title, + description: description, + confirm_action: "Continue", + confirm_class: "bg-yellow-600 hover:bg-yellow-700 focus:ring-yellow-500", + cancel_action: "Cancel" + } + end + + def info_modal_config(title, description) do + %{ + icon: "fa-info-circle", + icon_bg_class: "bg-blue-100", + icon_text_class: "text-blue-600", + title: title, + description: description, + confirm_action: "OK", + confirm_class: "bg-blue-600 hover:bg-blue-700 focus:ring-blue-500", + cancel_action: nil + } + end +end diff --git a/lib/claper_web/live/admin_live/oidc_provider_live.ex b/lib/claper_web/live/admin_live/oidc_provider_live.ex new file mode 100644 index 0000000..71d9b8d --- /dev/null +++ b/lib/claper_web/live/admin_live/oidc_provider_live.ex @@ -0,0 +1,155 @@ +defmodule ClaperWeb.AdminLive.OidcProviderLive do + use ClaperWeb, :live_view + + alias Claper.Accounts.Oidc + alias Claper.Accounts.Oidc.Provider + + @impl true + def mount(_params, session, socket) do + with %{"locale" => locale} <- session do + Gettext.put_locale(ClaperWeb.Gettext, locale) + end + + {:ok, + socket + |> assign(:page_title, gettext("OIDC Providers")) + |> assign(:providers, list_providers()) + |> assign(:search, "") + |> assign(:current_sort, %{field: :na, order: :asc})} + end + + @impl true + def handle_params(params, _url, socket) do + {:noreply, apply_action(socket, socket.assigns.live_action, params)} + end + + defp apply_action(socket, :index, _params) do + socket + |> assign(:page_title, "OIDC Providers") + |> assign(:provider, nil) + end + + defp apply_action(socket, :show, %{"id" => id}) do + socket + |> assign(:page_title, gettext("Provider details")) + |> assign(:provider, Oidc.get_provider!(id)) + end + + defp apply_action(socket, :new, _params) do + socket + |> assign(:page_title, gettext("New provider")) + |> assign(:provider, %Provider{}) + end + + defp apply_action(socket, :edit, %{"id" => id}) do + socket + |> assign(:page_title, gettext("Edit provider")) + |> assign(:provider, Oidc.get_provider!(id)) + end + + @impl true + def handle_event("delete", %{"id" => id}, socket) do + provider = Oidc.get_provider!(id) + {:ok, _} = Oidc.delete_provider(provider) + + {:noreply, + socket + |> put_flash(:info, gettext("Provider deleted successfully")) + |> assign(:providers, list_providers())} + end + + @impl true + def handle_event("search", %{"search" => search}, socket) do + providers = search_providers(search) + {:noreply, socket |> assign(:search, search) |> assign(:providers, providers)} + end + + @impl true + def handle_event("sort", %{"field" => field}, socket) do + %{current_sort: %{field: current_field, order: current_order}} = socket.assigns + + {field, order} = + if current_field == String.to_existing_atom(field) do + {current_field, if(current_order == :asc, do: :desc, else: :asc)} + else + {String.to_existing_atom(field), :asc} + end + + providers = sort_providers(socket.assigns.providers, field, order) + + {:noreply, + socket + |> assign(:providers, providers) + |> assign(:current_sort, %{field: field, order: order})} + end + + @impl true + def handle_info( + {ClaperWeb.AdminLive.OidcProviderLive.FormComponent, {:saved, _provider}}, + socket + ) do + {:noreply, assign(socket, :providers, list_providers())} + end + + defp list_providers do + Oidc.list_providers() + end + + defp search_providers(search) when search == "", do: list_providers() + + defp search_providers(search) do + search_term = "%#{search}%" + Oidc.search_providers(search_term) + end + + defp sort_providers(providers, field, order) do + Enum.sort_by(providers, &Map.get(&1, field), order) + end + + def sort_indicator(assigns) do + ~H""" + <%= if @current_sort.field == @field do %> + <%= if @current_sort.order == :asc do %> + + + + <% else %> + + + + <% end %> + <% else %> + + + + <% end %> + """ + end +end diff --git a/lib/claper_web/live/admin_live/oidc_provider_live.html.heex b/lib/claper_web/live/admin_live/oidc_provider_live.html.heex new file mode 100644 index 0000000..6369326 --- /dev/null +++ b/lib/claper_web/live/admin_live/oidc_provider_live.html.heex @@ -0,0 +1,358 @@ +<%= case @live_action do %> + <% :index -> %> +
+
+
+

{gettext("OIDC Providers")}

+
+ <.link navigate={~p"/admin/oidc_providers/new"} class="btn btn-primary btn-sm"> + + + + {gettext("New provider")} + +
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ + + + + + + + + + + + <%= if Enum.empty?(@providers) do %> + + + + <% else %> + <%= for provider <- @providers do %> + + + + + + + + <% end %> + <% end %> + +
+ + + + + + + + + {gettext("Actions")} +
+ {gettext("No providers found")} +
+ {provider.name} + + {provider.issuer} + + <%= if provider.active do %> + + {gettext("Active")} + + <% else %> + + {gettext("Inactive")} + + <% end %> + + {Calendar.strftime(provider.inserted_at, "%Y-%m-%d %H:%M")} + +
+ <.link + navigate={~p"/admin/oidc_providers/#{provider}"} + class="btn btn-link btn-sm" + title={gettext("View provider")} + > + + + + + + <.link + navigate={~p"/admin/oidc_providers/#{provider}/edit"} + class="btn btn-link btn-sm text-primary" + title={gettext("Edit provider")} + > + + + + + + + + + +
+
+
+
+
+
+
+
+ <% :show -> %> +
+
+
+

{gettext("OIDC Provider details")}

+
+ <.link navigate={~p"/admin/oidc_providers"} class="btn btn-outline btn-sm"> + {gettext("Back to providers")} + + <.link + navigate={~p"/admin/oidc_providers/#{@provider}/edit"} + class="btn btn-primary btn-sm" + > + {gettext("Edit")} + +
+
+
+ +
+
+
+

{@provider.name}

+

{gettext("OIDC Provider")}

+
+
+
+
{gettext("Name")}
+
{@provider.name}
+
+
+
{gettext("Issuer")}
+
+ {@provider.issuer} +
+
+
+
{gettext("Client ID")}
+
+ {@provider.client_id} +
+
+
+
{gettext("Response Type")}
+
+ {@provider.response_type} +
+
+
+
{gettext("Scope")}
+
+ {@provider.scope} +
+
+
+
{gettext("Status")}
+
+ <%= if @provider.active do %> + + {gettext("Active")} + + <% else %> + + {gettext("Inactive")} + + <% end %> +
+
+
+
{gettext("Created At")}
+
+ {Calendar.strftime(@provider.inserted_at, "%Y-%m-%d %H:%M")} +
+
+
+
{gettext("Last Updated")}
+
+ {Calendar.strftime(@provider.updated_at, "%Y-%m-%d %H:%M")} +
+
+
+
+
+
+
+ <% :new -> %> +
+
+
+

{gettext("New provider")}

+
+
+ +
+
+
+ <.live_component + module={ClaperWeb.AdminLive.OidcProviderLive.FormComponent} + id="provider-form" + title={gettext("New provider")} + action={:new} + provider={@provider} + navigate={~p"/admin/oidc_providers"} + /> +
+
+
+
+ <% :edit -> %> +
+
+
+

{gettext("Edit OIDC Provider")}

+
+
+ +
+
+
+ <.live_component + module={ClaperWeb.AdminLive.OidcProviderLive.FormComponent} + id={"provider-form-#{@provider.id}"} + title={gettext("Edit provider")} + action={:edit} + provider={@provider} + navigate={~p"/admin/oidc_providers"} + /> +
+
+
+
+<% end %> diff --git a/lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex b/lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex new file mode 100644 index 0000000..f9b6f63 --- /dev/null +++ b/lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex @@ -0,0 +1,222 @@ +defmodule ClaperWeb.AdminLive.OidcProviderLive.FormComponent do + use ClaperWeb, :live_component + + alias Claper.Accounts.Oidc + + @impl true + def render(assigns) do + ~H""" +
+ <.form + for={@form} + id="provider-form" + phx-target={@myself} + phx-change="validate" + phx-submit="save" + > +
+ <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="name-field" + form={@form} + field={:name} + type="text" + label={gettext("Name")} + placeholder={gettext("Enter provider name")} + required={true} + width_class="sm:col-span-6" + description={gettext("A unique name to identify this OIDC provider")} + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="issuer-field" + form={@form} + field={:issuer} + type="text" + label={gettext("Issuer URL")} + placeholder={gettext("https://example.com")} + required={true} + width_class="sm:col-span-6" + description={gettext("The OIDC issuer URL (must start with http:// or https://)")} + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="client_id-field" + form={@form} + field={:client_id} + type="text" + label={gettext("Client ID")} + placeholder={gettext("Enter client ID")} + required={true} + width_class="sm:col-span-3" + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="client_secret-field" + form={@form} + field={:client_secret} + type="text" + label={gettext("Client Secret")} + placeholder={gettext("Enter client secret")} + required={true} + width_class="sm:col-span-3" + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="redirect_uri-field" + form={@form} + field={:redirect_uri} + type="text" + label={gettext("Redirect URI")} + placeholder={gettext("https://yourapp.com/auth/callback")} + required={true} + width_class="sm:col-span-6" + description={ + gettext("The callback URL for your application (must start with http:// or https://)") + } + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="scope-field" + form={@form} + field={:scope} + type="text" + label={gettext("Scope")} + placeholder={gettext("openid email profile")} + width_class="sm:col-span-3" + description={gettext("OIDC scopes to request (defaults to 'openid email profile')")} + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="response_type-field" + form={@form} + field={:response_type} + type="select" + label={gettext("Response Type")} + select_options={[ + {gettext("Authorization Code"), "code"}, + {gettext("Implicit"), "token"}, + {gettext("Hybrid"), "code token"} + ]} + width_class="sm:col-span-3" + description={gettext("OAuth 2.0 response type (defaults to 'code')")} + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="response_mode-field" + form={@form} + field={:response_mode} + type="select" + label={gettext("Response Mode")} + select_options={[ + {gettext("Query"), "query"}, + {gettext("Fragment"), "fragment"}, + {gettext("Form Post"), "form_post"} + ]} + width_class="sm:col-span-3" + description={ + gettext("How the authorization response should be returned (defaults to 'query')") + } + /> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="active-field" + form={@form} + field={:active} + type="checkbox" + label={gettext("Active")} + checkbox_label={gettext("Enable this OIDC provider")} + width_class="sm:col-span-3" + description={ + gettext("Whether this provider is currently active and available for authentication") + } + /> +
+ +
+
+ + +
+
+ +
+ """ + end + + @impl true + def update(%{provider: provider} = assigns, socket) do + changeset = Oidc.change_provider(provider) + + {:ok, + socket + |> assign(assigns) + |> assign_form(changeset)} + end + + @impl true + def handle_event("validate", %{"provider" => provider_params}, socket) do + changeset = + socket.assigns.provider + |> Oidc.change_provider(provider_params) + |> Map.put(:action, :validate) + + {:noreply, assign_form(socket, changeset)} + end + + def handle_event("save", %{"provider" => provider_params}, socket) do + save_provider(socket, socket.assigns.action, provider_params) + end + + def handle_event("cancel", _params, socket) do + {:noreply, push_navigate(socket, to: socket.assigns.navigate)} + end + + defp save_provider(socket, :edit, provider_params) do + case Oidc.update_provider(socket.assigns.provider, provider_params) do + {:ok, provider} -> + notify_parent({:saved, provider}) + + {:noreply, + socket + |> put_flash(:info, gettext("Provider updated successfully")) + |> push_navigate(to: socket.assigns.navigate)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp save_provider(socket, :new, provider_params) do + case Oidc.create_provider(provider_params) do + {:ok, provider} -> + notify_parent({:saved, provider}) + + {:noreply, + socket + |> put_flash(:info, gettext("Provider created successfully")) + |> push_navigate(to: socket.assigns.navigate)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp assign_form(socket, %Ecto.Changeset{} = changeset) do + assign(socket, :form, to_form(changeset)) + end + + defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) +end diff --git a/lib/claper_web/live/admin_live/search_filter_component.ex b/lib/claper_web/live/admin_live/search_filter_component.ex new file mode 100644 index 0000000..9380f58 --- /dev/null +++ b/lib/claper_web/live/admin_live/search_filter_component.ex @@ -0,0 +1,175 @@ +defmodule ClaperWeb.AdminLive.SearchFilterComponent do + use ClaperWeb, :live_component + + @impl true + def render(assigns) do + ~H""" +
+
+
+
+
+
+ +
+ +
+ + <%= if @filters && length(@filters) > 0 do %> +
+ <%= for filter <- @filters do %> + + <% end %> +
+ <% end %> + + + + <%= if @show_clear and (@search_value || has_active_filters?(@filter_values)) do %> + + <% end %> +
+
+ +
+ <%= if @export_csv_enabled do %> + + <% end %> + + <%= if @new_path do %> + <.link + navigate={@new_path} + class="ml-3 relative inline-flex items-center px-4 py-2 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" + > + + {@new_label || "New"} + + <% end %> + + <%= if @custom_actions do %> + {render_slot(@custom_actions)} + <% end %> +
+
+
+ """ + end + + @impl true + def mount(socket) do + {:ok, assign(socket, search_value: "", filter_values: %{})} + end + + @impl true + def update(assigns, socket) do + socket = + socket + |> assign(assigns) + |> assign_new(:search_placeholder, fn -> "Search..." end) + |> assign_new(:filters, fn -> [] end) + |> assign_new(:filter_values, fn -> %{} end) + |> assign_new(:search_value, fn -> "" end) + |> assign_new(:show_clear, fn -> true end) + |> assign_new(:export_csv_enabled, fn -> false end) + |> assign_new(:new_path, fn -> nil end) + |> assign_new(:new_label, fn -> "New" end) + |> assign_new(:custom_actions, fn -> [] end) + + {:ok, socket} + end + + @impl true + def handle_event("search", %{"search" => search_value}, socket) do + send( + self(), + {:search_filter_changed, %{search: search_value, filters: socket.assigns.filter_values}} + ) + + {:noreply, assign(socket, search_value: search_value)} + end + + def handle_event("search_change", %{"search" => search_value}, socket) do + send( + self(), + {:search_filter_changed, %{search: search_value, filters: socket.assigns.filter_values}} + ) + + {:noreply, assign(socket, search_value: search_value)} + end + + def handle_event("filter_change", %{"filter" => filter_name, "value" => filter_value}, socket) do + filter_values = Map.put(socket.assigns.filter_values, filter_name, filter_value) + + send( + self(), + {:search_filter_changed, %{search: socket.assigns.search_value, filters: filter_values}} + ) + + {:noreply, assign(socket, filter_values: filter_values)} + end + + def handle_event("clear_all", _params, socket) do + send(self(), {:search_filter_changed, %{search: "", filters: %{}}}) + {:noreply, assign(socket, search_value: "", filter_values: %{})} + end + + def handle_event("export_csv", _params, socket) do + send( + self(), + {:export_csv_requested, + %{search: socket.assigns.search_value, filters: socket.assigns.filter_values}} + ) + + {:noreply, socket} + end + + defp has_active_filters?(filter_values) do + Enum.any?(filter_values, fn {_key, value} -> value != nil and value != "" end) + end +end diff --git a/lib/claper_web/live/admin_live/searchable_select_component.ex b/lib/claper_web/live/admin_live/searchable_select_component.ex new file mode 100644 index 0000000..7cfc2c2 --- /dev/null +++ b/lib/claper_web/live/admin_live/searchable_select_component.ex @@ -0,0 +1,170 @@ +defmodule ClaperWeb.AdminLive.SearchableSelectComponent do + use ClaperWeb, :live_component + + @impl true + def render(assigns) do + ~H""" +
+
+ + + + + +
+
+ """ + end + + @impl true + def mount(socket) do + {:ok, + socket + |> assign(:show_dropdown, false) + |> assign(:search_term, "") + |> assign(:filtered_options, []) + |> assign(:selected_value, nil) + |> assign(:display_value, "")} + end + + @impl true + def update(assigns, socket) do + socket = + socket + |> assign(assigns) + |> assign_new(:placeholder, fn -> gettext("Select...") end) + |> assign_new(:required, fn -> false end) + |> assign_new(:description, fn -> nil end) + |> assign_new(:width_class, fn -> nil end) + |> assign_new(:options, fn -> [] end) + |> update_filtered_options() + |> update_display_value() + + {:ok, socket} + end + + @impl true + def handle_event("search", %{"value" => search_term}, socket) do + socket = + socket + |> assign(:search_term, search_term) + |> assign(:show_dropdown, true) + |> update_filtered_options() + + {:noreply, socket} + end + + def handle_event("select_option", %{"value" => value, "label" => label}, socket) do + socket = + socket + |> assign(:selected_value, value) + |> assign(:display_value, label) + |> assign(:show_dropdown, false) + |> assign(:search_term, label) + + {:noreply, socket} + end + + def handle_event("open_dropdown", _params, socket) do + socket = + socket + |> assign(:show_dropdown, true) + |> update_filtered_options() + + {:noreply, socket} + end + + def handle_event("close_dropdown", _params, socket) do + {:noreply, assign(socket, :show_dropdown, false)} + end + + defp update_filtered_options(socket) do + search_term = String.downcase(socket.assigns[:search_term] || "") + + filtered = + if search_term == "" do + socket.assigns.options + else + Enum.filter(socket.assigns.options, fn {label, _value} -> + String.contains?(String.downcase(label), search_term) + end) + end + + assign(socket, :filtered_options, filtered) + end + + defp update_display_value(socket) do + current_value = get_field_value(socket.assigns.form, socket.assigns.field) + display_value = find_display_value(current_value, socket.assigns.options) + + socket + |> assign(:selected_value, current_value) + |> assign(:display_value, display_value) + |> assign(:search_term, display_value) + end + + defp find_display_value(nil, _options), do: "" + + defp find_display_value(current_value, options) do + case Enum.find(options, fn {_label, value} -> + to_string(value) == to_string(current_value) + end) do + {label, _value} -> label + nil -> "" + end + end + + defp get_field_value(form, field) do + Map.get(form.data, field) || Map.get(form.params, to_string(field)) + end +end diff --git a/lib/claper_web/live/admin_live/table_actions_component.ex b/lib/claper_web/live/admin_live/table_actions_component.ex new file mode 100644 index 0000000..4ccd225 --- /dev/null +++ b/lib/claper_web/live/admin_live/table_actions_component.ex @@ -0,0 +1,242 @@ +defmodule ClaperWeb.AdminLive.TableActionsComponent do + use ClaperWeb, :live_component + + @impl true + def render(assigns) do + ~H""" +
+ <%= if @view_enabled do %> + + <% end %> + + <%= if @edit_enabled do %> + + <% end %> + + <%= if @delete_enabled do %> + + <% end %> + + <%= if @duplicate_enabled do %> + + <% end %> + + <%= if @archive_enabled do %> + + <% end %> + + <%= if @toggle_enabled do %> + + <% end %> + + <%= if @dropdown_actions && length(@dropdown_actions) > 0 do %> +
+ + + <%= if @dropdown_open do %> +
+
+ <%= for action <- @dropdown_actions do %> + + <% end %> +
+
+ <% end %> +
+ <% end %> + + <%= if @custom_actions do %> + {render_slot(@custom_actions)} + <% end %> +
+ """ + end + + @impl true + def mount(socket) do + {:ok, assign(socket, dropdown_open: false)} + end + + @impl true + def update(assigns, socket) do + socket = + socket + |> assign(assigns) + |> assign_new(:view_enabled, fn -> false end) + |> assign_new(:edit_enabled, fn -> true end) + |> assign_new(:delete_enabled, fn -> true end) + |> assign_new(:duplicate_enabled, fn -> false end) + |> assign_new(:archive_enabled, fn -> false end) + |> assign_new(:toggle_enabled, fn -> false end) + |> assign_new(:item_archived, fn -> false end) + |> assign_new(:item_active, fn -> true end) + |> assign_new(:delete_confirm_message, fn -> nil end) + |> assign_new(:toggle_active_title, fn -> nil end) + |> assign_new(:toggle_inactive_title, fn -> nil end) + |> assign_new(:dropdown_actions, fn -> [] end) + |> assign_new(:custom_actions, fn -> [] end) + |> assign_new(:dropdown_open, fn -> false end) + + {:ok, socket} + end + + @impl true + def handle_event("view_item", _params, socket) do + send(self(), {:table_action, :view, socket.assigns.item, socket.assigns.item_id}) + {:noreply, socket} + end + + def handle_event("edit_item", _params, socket) do + send(self(), {:table_action, :edit, socket.assigns.item, socket.assigns.item_id}) + {:noreply, socket} + end + + def handle_event("delete_item", _params, socket) do + send(self(), {:table_action, :delete, socket.assigns.item, socket.assigns.item_id}) + {:noreply, socket} + end + + def handle_event("duplicate_item", _params, socket) do + send(self(), {:table_action, :duplicate, socket.assigns.item, socket.assigns.item_id}) + {:noreply, socket} + end + + def handle_event("archive_item", _params, socket) do + action = if socket.assigns.item_archived, do: :unarchive, else: :archive + send(self(), {:table_action, action, socket.assigns.item, socket.assigns.item_id}) + {:noreply, socket} + end + + def handle_event("toggle_item", _params, socket) do + action = if socket.assigns.item_active, do: :deactivate, else: :activate + send(self(), {:table_action, action, socket.assigns.item, socket.assigns.item_id}) + {:noreply, socket} + end + + def handle_event("toggle_dropdown", _params, socket) do + {:noreply, assign(socket, dropdown_open: !socket.assigns.dropdown_open)} + end + + def handle_event("close_dropdown", _params, socket) do + {:noreply, assign(socket, dropdown_open: false)} + end + + def handle_event("dropdown_action", %{"action" => action_key}, socket) do + action = Enum.find(socket.assigns.dropdown_actions, &(&1.key == action_key)) + + if action do + send( + self(), + {:table_action, String.to_atom(action_key), socket.assigns.item, socket.assigns.item_id} + ) + end + + {:noreply, assign(socket, dropdown_open: false)} + end +end diff --git a/lib/claper_web/live/admin_live/table_component.ex b/lib/claper_web/live/admin_live/table_component.ex new file mode 100644 index 0000000..cc4e20b --- /dev/null +++ b/lib/claper_web/live/admin_live/table_component.ex @@ -0,0 +1,282 @@ +defmodule ClaperWeb.AdminLive.TableComponent do + use ClaperWeb, :live_component + + @impl true + def render(assigns) do + ~H""" +
+
+ + + + <%= for {header, _index} <- Enum.with_index(@headers) do %> + + <% end %> + + + + <%= if length(@rows) > 0 do %> + <%= for {row, row_index} <- Enum.with_index(@rows) do %> + + <%= for {cell_content, _cell_index} <- Enum.with_index(get_row_cells(row, @headers, @row_func)) do %> + + <% end %> + + <% end %> + <% else %> + + + + <% end %> + +
+
+ {if is_binary(header), do: header, else: header.label} + <%= if @sortable && header.sortable do %> + <%= case @sort_config do %> + <% %{field: field, direction: :asc} when field == header.field -> %> + + <% %{field: field, direction: :desc} when field == header.field -> %> + + <% _ -> %> + + <% end %> + <% end %> +
+
+ <%= case cell_content do %> + <% {:safe, content} -> %> + {raw(content)} + <% content when is_binary(content) -> %> + {content} + <% content -> %> + {to_string(content)} + <% end %> +
+
+ <%= if @empty_icon do %> + + <% end %> +

+ {@empty_title || "No items found"} +

+

+ {@empty_message || "There are no items to display."} +

+ <%= if @empty_action do %> +
+ {render_slot(@empty_action)} +
+ <% end %> +
+
+
+ + <%= if @pagination do %> +
+
+ <%= if @pagination.page_number > 1 do %> + + <% else %> + + Previous + + <% end %> + + <%= if @pagination.page_number < @pagination.total_pages do %> + + <% else %> + + Next + + <% end %> +
+ + +
+ <% end %> +
+ """ + end + + @impl true + def mount(socket) do + {:ok, assign(socket, sort_config: %{field: nil, direction: :asc})} + end + + @impl true + def update(assigns, socket) do + socket = + socket + |> assign(assigns) + |> assign_new(:sortable, fn -> false end) + |> assign_new(:sort_config, fn -> %{field: nil, direction: :asc} end) + |> assign_new(:row_click_enabled, fn -> false end) + |> assign_new(:empty_title, fn -> nil end) + |> assign_new(:empty_message, fn -> nil end) + |> assign_new(:empty_icon, fn -> nil end) + |> assign_new(:empty_action, fn -> [] end) + |> assign_new(:pagination, fn -> nil end) + |> assign_new(:row_func, fn -> nil end) + + {:ok, socket} + end + + @impl true + def handle_event("sort", %{"field" => field}, socket) do + current_sort = socket.assigns.sort_config + + new_direction = + if current_sort.field == field and current_sort.direction == :asc do + :desc + else + :asc + end + + sort_config = %{field: field, direction: new_direction} + + send(self(), {:table_sort_changed, sort_config}) + {:noreply, assign(socket, sort_config: sort_config)} + end + + def handle_event("paginate", %{"page" => page}, socket) do + page_number = String.to_integer(page) + send(self(), {:table_page_changed, page_number}) + {:noreply, socket} + end + + def handle_event("row_clicked", %{"row-index" => row_index}, socket) do + index = String.to_integer(row_index) + row = Enum.at(socket.assigns.rows, index) + send(self(), {:table_row_clicked, row, index}) + {:noreply, socket} + end + + defp get_row_cells(row, headers, nil) do + # Default behavior: assume row is a list/tuple matching header count + case row do + row when is_list(row) -> row + row when is_tuple(row) -> Tuple.to_list(row) + _ -> List.duplicate("", length(headers)) + end + end + + defp get_row_cells(row, _headers, row_func) when is_function(row_func) do + row_func.(row) + end + + defp get_page_range(pagination) do + start_page = max(1, pagination.page_number - 2) + end_page = min(pagination.total_pages, pagination.page_number + 2) + start_page..end_page + end +end diff --git a/lib/claper_web/live/admin_live/user_live.ex b/lib/claper_web/live/admin_live/user_live.ex new file mode 100644 index 0000000..df6266c --- /dev/null +++ b/lib/claper_web/live/admin_live/user_live.ex @@ -0,0 +1,192 @@ +defmodule ClaperWeb.AdminLive.UserLive do + use ClaperWeb, :live_view + + alias Claper.Admin + alias Claper.Accounts + alias Claper.Accounts.User + alias ClaperWeb.Helpers.CSVExporter + + @impl true + def mount(_params, session, socket) do + with %{"locale" => locale} <- session do + Gettext.put_locale(ClaperWeb.Gettext, locale) + end + + {:ok, + socket + |> assign(:page_title, gettext("Users")) + |> assign(:users, list_users()) + |> assign(:search, "") + |> assign(:current_sort, %{field: :na, order: :asc})} + end + + @impl true + def handle_params(params, _url, socket) do + {:noreply, apply_action(socket, socket.assigns.live_action, params)} + end + + defp apply_action(socket, :index, _params) do + socket + |> assign(:page_title, "Users") + |> assign(:user, nil) + end + + defp apply_action(socket, :new, _params) do + socket + |> assign(:page_title, gettext("New user")) + |> assign(:user, %User{}) + end + + defp apply_action(socket, :edit, %{"id" => id}) do + socket + |> assign(:page_title, gettext("Edit user")) + |> assign(:user, Accounts.get_user!(id) |> Claper.Repo.preload(:role)) + end + + defp apply_action(socket, :show, %{"id" => id}) do + socket + |> assign(:page_title, gettext("User details")) + |> assign(:user, Accounts.get_user!(id) |> Claper.Repo.preload(:role)) + end + + @impl true + def handle_event("delete", %{"id" => id}, socket) do + user = Accounts.get_user!(id) + {:ok, _} = Accounts.delete_user(user) + + {:noreply, + socket + |> put_flash(:info, gettext("User deleted successfully")) + |> assign(:users, list_users())} + end + + @impl true + def handle_event("sort", %{"field" => field}, socket) do + field_atom = String.to_existing_atom(field) + current_sort = socket.assigns.current_sort + + new_direction = + if current_sort.field == field_atom do + if current_sort.order == :asc, do: :desc, else: :asc + else + :asc + end + + users = sort_users(socket.assigns.users, field_atom, new_direction) + current_sort = %{field: field_atom, order: new_direction} + + {:noreply, + socket + |> assign(:users, users) + |> assign(:current_sort, current_sort)} + end + + @impl true + def handle_info({:search_filter_changed, %{search: search, filters: _filters}}, socket) do + users = search_users(search) + {:noreply, socket |> assign(:search, search) |> assign(:users, users)} + end + + @impl true + def handle_info({:export_csv_requested, _params}, socket) do + filename = CSVExporter.generate_filename("users") + csv_content = CSVExporter.export_users_to_csv(socket.assigns.users) + + {:noreply, + socket + |> put_flash(:info, gettext("Users exported successfully")) + |> push_event("download_csv", %{filename: filename, content: csv_content})} + end + + @impl true + def handle_info({:table_sort_changed, sort_config}, socket) do + %{field: field, direction: direction} = sort_config + users = sort_users(socket.assigns.users, field, direction) + current_sort = %{field: field, order: direction} + + {:noreply, + socket + |> assign(:users, users) + |> assign(:current_sort, current_sort)} + end + + @impl true + def handle_info({:table_action, action, user, _user_id}, socket) do + case action do + :view -> + {:noreply, push_navigate(socket, to: ~p"/admin/users/#{user}")} + + :edit -> + {:noreply, push_navigate(socket, to: ~p"/admin/users/#{user}/edit")} + + :delete -> + {:ok, _} = Accounts.delete_user(user) + + {:noreply, + socket + |> put_flash(:info, gettext("User deleted successfully")) + |> assign(:users, list_users())} + end + end + + def list_users do + Admin.list_all_users() + end + + defp search_users(search) when search == "", do: list_users() + + defp search_users(search) do + Admin.list_all_users(%{"search" => search}) + end + + defp sort_users(users, field, order) do + Enum.sort_by(users, &Map.get(&1, field), order) + end + + def sort_indicator(assigns) do + ~H""" + <%= if @current_sort.field == @field do %> + <%= if @current_sort.order == :asc do %> + + + + <% else %> + + + + <% end %> + <% else %> + + + + <% end %> + """ + end +end diff --git a/lib/claper_web/live/admin_live/user_live.html.heex b/lib/claper_web/live/admin_live/user_live.html.heex new file mode 100644 index 0000000..283b05c --- /dev/null +++ b/lib/claper_web/live/admin_live/user_live.html.heex @@ -0,0 +1,348 @@ +<%= case @live_action do %> + <% :index -> %> +
+
+
+

{gettext("Users")}

+
+ <%!-- <.link navigate={~p"/admin/users/new"} class="btn btn-primary btn-sm"> + + + + {gettext("New user")} + --%> +
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ + + + + + + + + + + + <%= if Enum.empty?(@users) do %> + + + + <% else %> + <%= for user <- @users do %> + + + + + + + + <% end %> + <% end %> + +
+ + + + + + + + + {gettext("Actions")} +
+ {gettext("No users found")} +
+ {user.email} + + {if user.role, do: user.role.name, else: gettext("No role")} + + <%= if user.confirmed_at do %> + + {gettext("Confirmed")} + + <% else %> + + {gettext("Unconfirmed")} + + <% end %> + + {Calendar.strftime(user.inserted_at, "%Y-%m-%d %H:%M")} + +
+ <.link + navigate={~p"/admin/users/#{user}"} + class="btn btn-link btn-sm" + title={gettext("View user")} + > + + + + + + <.link + navigate={~p"/admin/users/#{user}/edit"} + class="btn btn-link btn-sm text-primary" + title={gettext("Edit user")} + > + + + + + + + + + +
+
+
+
+
+
+
+
+ <% :show -> %> +
+
+
+

{gettext("User details")}

+
+ <.link navigate={~p"/admin/users"} class="btn btn-outline btn-sm"> + {gettext("Back to users")} + + <.link navigate={~p"/admin/users/#{@user}/edit"} class="btn btn-primary btn-sm"> + {gettext("Edit")} + +
+
+
+ +
+
+
+

{@user.email}

+

{gettext("User Account")}

+
+
+
+
{gettext("Email")}
+
{@user.email}
+
+
+
{gettext("Role")}
+
+ {if @user.role, do: @user.role.name, else: gettext("No role")} +
+
+
+
{gettext("Status")}
+
+ <%= if @user.confirmed_at do %> + + {gettext("Confirmed")} + + <% else %> + + {gettext("Unconfirmed")} + + <% end %> +
+
+
+
{gettext("Created At")}
+
+ {Calendar.strftime(@user.inserted_at, "%Y-%m-%d %H:%M")} +
+
+
+
{gettext("Last Updated")}
+
+ {Calendar.strftime(@user.updated_at, "%Y-%m-%d %H:%M")} +
+
+ <%= if @user.confirmed_at do %> +
+
{gettext("Confirmed At")}
+
+ {Calendar.strftime(@user.confirmed_at, "%Y-%m-%d %H:%M")} +
+
+ <% end %> +
+
+
+
+
+ <% :new -> %> +
+
+
+

{gettext("New user")}

+
+
+ +
+
+
+ <.live_component + module={ClaperWeb.AdminLive.UserLive.FormComponent} + id="user-form" + title={gettext("New user")} + action={:new} + user={@user} + navigate={~p"/admin/users"} + /> +
+
+
+
+ <% :edit -> %> +
+
+
+

{gettext("Edit user")}

+
+
+ +
+
+
+ <.live_component + module={ClaperWeb.AdminLive.UserLive.FormComponent} + id={"user-form-#{@user.id}"} + title={gettext("Edit user")} + action={:edit} + user={@user} + navigate={~p"/admin/users"} + /> +
+
+
+
+<% end %> diff --git a/lib/claper_web/live/admin_live/user_live/form_component.ex b/lib/claper_web/live/admin_live/user_live/form_component.ex new file mode 100644 index 0000000..ae9d08e --- /dev/null +++ b/lib/claper_web/live/admin_live/user_live/form_component.ex @@ -0,0 +1,196 @@ +defmodule ClaperWeb.AdminLive.UserLive.FormComponent do + use ClaperWeb, :live_component + + alias Claper.Accounts + + @impl true + def render(assigns) do + ~H""" +
+ <.form for={@form} id="user-form" phx-target={@myself} phx-change="validate" phx-submit="save"> +
+ <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="user-email" + form={@form} + field={:email} + type="email" + label={gettext("Email")} + placeholder={gettext("Enter user email")} + required={true} + width_class="sm:col-span-6" + description={gettext("User's email address (must be unique)")} + /> + + <%= if @action == :new do %> + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="user-password" + form={@form} + field={:password} + type="password" + label={gettext("Password")} + placeholder={gettext("Enter password")} + required={true} + width_class="sm:col-span-3" + description={gettext("Initial password for the user")} + /> + <% end %> + + <.live_component + module={ClaperWeb.AdminLive.FormFieldComponent} + id="user-role-id" + form={@form} + field={:role_id} + type="select" + label={gettext("Role")} + select_options={@role_options} + required={true} + width_class="sm:col-span-3" + description={gettext("User's access level")} + /> + +
+
+ +
+
+
+ +
+
+ + +
+
+ +
+ """ + end + + @impl true + def update(%{user: user} = assigns, socket) do + # For edit action, ensure we have the current role_id in the changeset + # attrs = + # case assigns.action do + # :edit -> %{"role_id" => user.role_id} + # :new -> %{} + # end + + changeset = Accounts.change_user(user) + + role_options = + Accounts.list_roles() + |> Enum.map(&{String.capitalize(&1.name), &1.id}) + + # Determine if confirmed checkbox should be checked + confirmed_checked = + case assigns.action do + :edit -> !is_nil(user.confirmed_at) + :new -> false + end + + {:ok, + socket + |> assign(assigns) + |> assign(:role_options, role_options) + |> assign(:confirmed_checked, confirmed_checked) + |> assign_form(changeset)} + end + + @impl true + def handle_event("validate", %{"user" => user_params}, socket) do + # Update the confirmed_checked state based on form params + confirmed_checked = Map.get(user_params, "confirmed") == "true" + + # Convert confirmed checkbox to confirmed_at datetime + user_params = maybe_convert_confirmed_field(user_params) + + changeset = + socket.assigns.user + |> Accounts.change_user(user_params) + |> Map.put(:action, :validate) + + {:noreply, + socket + |> assign(:confirmed_checked, confirmed_checked) + |> assign_form(changeset)} + end + + def handle_event("save", %{"user" => user_params}, socket) do + # Convert confirmed checkbox to confirmed_at datetime + user_params = maybe_convert_confirmed_field(user_params) + save_user(socket, socket.assigns.action, user_params) + end + + def handle_event("cancel", _params, socket) do + {:noreply, push_navigate(socket, to: socket.assigns.navigate)} + end + + defp save_user(socket, :edit, user_params) do + case Accounts.update_user(socket.assigns.user, user_params) do + {:ok, user} -> + notify_parent({:saved, user}) + + {:noreply, + socket + |> put_flash(:info, gettext("User updated successfully")) + |> push_navigate(to: socket.assigns.navigate)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp save_user(socket, :new, user_params) do + case Accounts.create_user(user_params) do + {:ok, user} -> + notify_parent({:saved, user}) + + {:noreply, + socket + |> put_flash(:info, gettext("User created successfully")) + |> push_navigate(to: socket.assigns.navigate)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp assign_form(socket, %Ecto.Changeset{} = changeset) do + form = to_form(changeset, as: :user) + assign(socket, :form, form) + end + + defp maybe_convert_confirmed_field(user_params) do + case Map.get(user_params, "confirmed") do + "true" -> + user_params + |> Map.delete("confirmed") + |> Map.put("confirmed_at", NaiveDateTime.utc_now()) + + "false" -> + user_params + |> Map.delete("confirmed") + |> Map.put("confirmed_at", nil) + + _ -> + user_params + end + end + + defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) +end diff --git a/lib/claper_web/live/embed_live/form_component.html.heex b/lib/claper_web/live/embed_live/form_component.html.heex index 2d17912..ec67b28 100644 --- a/lib/claper_web/live/embed_live/form_component.html.heex +++ b/lib/claper_web/live/embed_live/form_component.html.heex @@ -12,8 +12,6 @@ form={f} key={:title} name={gettext("Title")} - labelClass={if @dark, do: "text-white"} - fieldClass={if @dark, do: "bg-gray-700 text-white"} autofocus="true" required="true" /> @@ -24,8 +22,6 @@ key={:provider} name={gettext("Provider")} array={@providers} - labelClass={if @dark, do: "text-white"} - fieldClass={if @dark, do: "bg-gray-700 text-white h-full"} required="true" />
@@ -38,24 +34,22 @@ do: gettext("Iframe code"), else: gettext("Link to the content") } - labelClass={if @dark, do: "text-white"} - fieldClass={if @dark, do: "bg-gray-700 text-white"} autofocus="true" required="true" />
-

<%= gettext("Options") %>

+

{gettext("Options")}

- <%= checkbox(f, :attendee_visibility, class: "h-4 w-5") %> - <%= label( + {checkbox(f, :attendee_visibility, class: "h-4 w-5")} + {label( f, :attendee_visibility, gettext("Attendees can view the web content on their device"), class: "text-sm font-medium" - ) %> + )}
@@ -63,15 +57,15 @@ <%= if @live_action == :edit do %> - <%= link(gettext("Delete"), + {link(gettext("Delete"), to: "#", phx_click: "delete", phx_target: @myself, @@ -80,8 +74,8 @@ confirm: gettext("This will delete the web content, are you sure?") ], class: - "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" - ) %> + "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline bg-linear-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-[200%_200%] bg-position-[0%_0%] hover:bg-position-[100%_100%] transition-all duration-500" + )} <% end %> diff --git a/lib/claper_web/live/event_live/embed_component.ex b/lib/claper_web/live/event_live/embed_component.ex index b73d5bc..e7c0c54 100644 --- a/lib/claper_web/live/event_live/embed_component.ex +++ b/lib/claper_web/live/event_live/embed_component.ex @@ -29,7 +29,7 @@ defmodule ClaperWeb.EventLive.EmbedComponent do d="M14.25 9.75L16.5 12l-2.25 2.25m-4.5 0L7.5 12l2.25-2.25M6 20.25h12A2.25 2.25 0 0020.25 18V6A2.25 2.25 0 0018 3.75H6A2.25 2.25 0 003.75 6v12A2.25 2.25 0 006 20.25z" /> - <%= gettext("See current web content") %> + {gettext("See current web content")} @@ -52,8 +52,8 @@ defmodule ClaperWeb.EventLive.EmbedComponent do -

<%= gettext("Current web content") %>

-

<%= @embed.title %>

+

{gettext("Current web content")}

+

{@embed.title}

<.live_component diff --git a/lib/claper_web/live/event_live/embed_iframe_component.ex b/lib/claper_web/live/event_live/embed_iframe_component.ex index ef53356..d746cca 100644 --- a/lib/claper_web/live/event_live/embed_iframe_component.ex +++ b/lib/claper_web/live/event_live/embed_iframe_component.ex @@ -39,7 +39,7 @@ defmodule ClaperWeb.EventLive.EmbedIframeComponent do > <% "custom" -> %> - <%= raw(@content) %> + {raw(@content)} <% end %>
""" diff --git a/lib/claper_web/live/event_live/event_card_component.ex b/lib/claper_web/live/event_live/event_card_component.ex index 52acac6..a82016f 100644 --- a/lib/claper_web/live/event_live/event_card_component.ex +++ b/lib/claper_web/live/event_live/event_card_component.ex @@ -20,7 +20,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do class="text-lg font-medium text-primary-600 truncate" href={~p"/e/#{@event.code}/manage"} > - <%= @event.name %> + {@event.name}

LTI

-
+
<%= if Event.started?(@event) && !Event.finished?(@event) do %>
- <%= gettext("Live") %> + {gettext("Live")}
<% end %> <%= if !Event.started?(@event) && !Event.finished?(@event) do %>

- <%= gettext("Incoming") %> + {gettext("Incoming")}

<% end %> <%= if Event.finished?(@event) do %>

- <%= gettext("Finished") %> + {gettext("Finished")}

<% end %>
@@ -66,7 +66,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do

- <%= @event.code %> + {@event.code}

- <%= gettext("Starting on") %> + {gettext("Starting on")}

- <%= gettext("Finished on") %> + {gettext("Finished on")}

@@ -106,9 +106,9 @@ defmodule ClaperWeb.EventLive.EventCardComponent do phx-click-away={JS.hide(to: "#dropdown-#{@event.uuid}")} phx-click={JS.toggle(to: "#dropdown-#{@event.uuid}")} phx-target={@myself} - class="flex w-full lg:w-auto pl-3 pr-4 text-white items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-primary-600 bg-primary-500" + class="flex w-full lg:w-auto pl-3 pr-4 text-white items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline hover:bg-primary-600 bg-primary-500" > - <%= gettext("Join") %> + {gettext("Join")} @@ -186,7 +186,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do } phx-value-id={@event.uuid} phx-click="terminate" - class="flex w-full lg:w-auto pl-3 pr-4 text-white items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-red-500 hover:bg-red-600 transition" + class="flex w-full lg:w-auto pl-3 pr-4 text-white items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline bg-red-500 hover:bg-red-600 transition" > - <%= gettext("End") %> + {gettext("End")}
@@ -207,9 +207,9 @@ defmodule ClaperWeb.EventLive.EventCardComponent do phx-click-away={JS.hide(to: "#dropdown-action-#{@event.uuid}")} phx-click={JS.toggle(to: "#dropdown-action-#{@event.uuid}")} phx-target={@myself} - class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200" + class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline hover:bg-gray-300 bg-gray-200" > - <%= gettext("More options") %> + {gettext("More options")} @@ -279,7 +279,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do class="mt-2 flex flex-col space-y-2 sm:space-y-0 justify-between sm:flex-row items-center" > - <%= gettext("Error when processing the file") %> + {gettext("Error when processing the file")}
<%= if not @is_leader do %> @@ -287,9 +287,9 @@ defmodule ClaperWeb.EventLive.EventCardComponent do phx-click-away={JS.hide(to: "#dropdown-action-#{@event.uuid}")} phx-click={JS.toggle(to: "#dropdown-action-#{@event.uuid}")} phx-target={@myself} - class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200" + class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline hover:bg-gray-300 bg-gray-200" > - <%= gettext("More options") %> + {gettext("More options")} @@ -341,7 +341,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do class="flex space-x-1 items-center" > - <%= gettext("Processing your file...") %> + {gettext("Processing your file...")}
<% end %> @@ -356,7 +356,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do > - <%= gettext("View report") %> + {gettext("View report")}
@@ -376,9 +376,9 @@ defmodule ClaperWeb.EventLive.EventCardComponent do phx-click-away={JS.hide(to: "#dropdown-action-#{@event.uuid}")} phx-click={JS.toggle(to: "#dropdown-action-#{@event.uuid}")} phx-target={@myself} - class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200" + class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline hover:bg-gray-300 bg-gray-200" > - <%= gettext("More options") %> + {gettext("More options")} diff --git a/lib/claper_web/live/event_live/event_form_component.html.heex b/lib/claper_web/live/event_live/event_form_component.html.heex index 86edde9..e60981a 100644 --- a/lib/claper_web/live/event_live/event_form_component.html.heex +++ b/lib/claper_web/live/event_live/event_form_component.html.heex @@ -33,13 +33,13 @@ /> - <%= gettext("How it works ?") %> + {gettext("How it works ?")}

- <%= @page_title %> + {@page_title}

@@ -48,30 +48,30 @@ type="submit" form="event-form" phx_disable_with="Loading..." - class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" + class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline bg-linear-to-tl from-primary-500 to-secondary-500 bg-size-[200%_200%] bg-position-[0%_0%] hover:bg-position-[100%_100%] transition-all duration-500" > - <%= case @action do + {case @action do :edit -> gettext("Save") :new -> gettext("Create") - end %> + end} <% else %> -
- <%= case @action do +
+ {case @action do :edit -> gettext("Save") :new -> gettext("Create") - end %> + end}
<% end %> <%= if @action == :edit && !@event.expired_at do %> - <%= link(gettext("Delete"), + {link(gettext("Delete"), to: "#", phx_click: "delete", phx_value_id: @event.uuid, data: [confirm: gettext("Are you sure?")], class: - "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" - ) %> + "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline bg-linear-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-[200%_200%] bg-position-[0%_0%] hover:bg-position-[100%_100%] transition-all duration-500" + )} <% end %>
@@ -85,7 +85,7 @@ data-tg-title={"📄 #{gettext("Presentation file (optional)")}"} >
<%= if @uploads.presentation_file.entries |> Enum.at(0, %{}) |> Map.get(:progress, 0) < 100 do %> @@ -112,22 +112,22 @@ phx-submit="save-file" phx-target={@myself} > - <%= gettext("Upload a file") %> + {gettext("Upload a file")} <.live_file_input upload={@uploads.presentation_file} class="sr-only" /> -

<%= gettext("or drag and drop") %>

+

{gettext("or drag and drop")}

- <%= gettext("PDF, PPT, PPTX up to %{size} MB", size: @max_file_size) %> + {gettext("PDF, PPT, PPTX up to %{size} MB", size: @max_file_size)}

<%= for entry <- @uploads.presentation_file.entries do %> - <%= entry.progress %> + {entry.progress} <%= for err <- upload_errors(@uploads.presentation_file, entry) do %>

- <%= error_to_string(err) %> + {error_to_string(err)}

<% end %> <% end %> @@ -149,9 +149,9 @@ d="M5 13l4 4L19 7" /> -

<%= gettext("Presentation uploaded") %>

+

{gettext("Presentation uploaded")}

-

<%= entry.client_name %>

+

{entry.client_name}

- <%= gettext("Remove") %> + {gettext("Remove")}

<% end %> @@ -170,7 +170,7 @@ <% else %>
<%= if @uploads.presentation_file.entries |> Enum.at(0, %{}) |> Map.get(:progress, 0) < 100 do %> @@ -189,7 +189,7 @@ d="M5 13l4 4L19 7" /> -

<%= gettext("Presentation attached") %>

+

{gettext("Presentation attached")}

<%= for entry <- @uploads.presentation_file.entries do %> - <%= entry.progress %> + {entry.progress} <%= for err <- upload_errors(@uploads.presentation_file, entry) do %>

- <%= error_to_string(err) %> + {error_to_string(err)}

<% end %> <% end %>
<% else %> @@ -235,19 +235,19 @@ d="M5 13l4 4L19 7" /> -

<%= gettext("Presentation replaced") %>

+

{gettext("Presentation replaced")}

<%= for entry <- @uploads.presentation_file.entries do %> -

<%= entry.client_name %>

+

{entry.client_name}

- <%= entry.progress %> + {entry.progress}
<%= for err <- upload_errors(@uploads.presentation_file, entry) do %>

- <%= error_to_string(err) %> + {error_to_string(err)}

<% end %>

@@ -258,7 +258,7 @@ phx-target={@myself} class="text-red-500 text-sm" > - <%= gettext("Remove") %> + {gettext("Remove")}

<% end %> @@ -267,7 +267,7 @@ <%= for entry <- @uploads.presentation_file.entries do %> <%= for err <- upload_errors(@uploads.presentation_file, entry) do %>

- <%= error_to_string(err) %> + {error_to_string(err)}

<% end %> <% end %> @@ -339,7 +339,7 @@ data-tg-order="4" > - <%= gettext("Facilitators can present and manage interactions") %> + {gettext("Facilitators can present and manage interactions")} @@ -381,15 +381,15 @@ key={:email} name="" /> - <%= hidden_input(l, :user_email, value: @current_user.email) %> + {hidden_input(l, :user_email, value: @current_user.email)} <% else %>
@@ -401,9 +401,9 @@ />
- <%= hidden_input(l, :temp_id) %> - <%= hidden_input(l, :event_id, value: @event.id) %> - <%= hidden_input(l, :user_email, value: @current_user.email) %> + {hidden_input(l, :temp_id)} + {hidden_input(l, :event_id, value: @event.id)} + {hidden_input(l, :user_email, value: @current_user.email)} <% end %> diff --git a/lib/claper_web/live/event_live/form_component.ex b/lib/claper_web/live/event_live/form_component.ex index 6cd8dce..2862ad5 100644 --- a/lib/claper_web/live/event_live/form_component.ex +++ b/lib/claper_web/live/event_live/form_component.ex @@ -29,7 +29,7 @@ defmodule ClaperWeb.EventLive.FormComponent do - <%= gettext("See current form") %> + {gettext("See current form")} @@ -48,8 +48,8 @@ defmodule ClaperWeb.EventLive.FormComponent do -

<%= gettext("Current form") %>

-

<%= @form.title %>

+

{gettext("Current form")}

+

{@form.title}

<%= form_for :form_submit, "#", [id: @id, phx_change: "validate", phx_target: @myself, phx_submit: "submit"], fn f -> %>
@@ -63,7 +63,7 @@ defmodule ClaperWeb.EventLive.FormComponent do fieldClass="bg-gray-700 text-white" key={String.to_atom(field.name)} name={field.name} - required="true" + required={field.required} value={ if is_nil(assigns.current_form_submit), do: ~c"", @@ -77,7 +77,7 @@ defmodule ClaperWeb.EventLive.FormComponent do fieldClass="bg-gray-700 text-white" key={String.to_atom(field.name)} name={field.name} - required="true" + required={field.required} value={ if is_nil(assigns.current_form_submit), do: ~c"", @@ -94,7 +94,7 @@ defmodule ClaperWeb.EventLive.FormComponent do type="submit" class="px-3 py-2 text-white font-semibold bg-primary-500 hover:bg-primary-600 rounded-md my-5" > - <%= if is_nil(assigns.current_form_submit), do: gettext("Submit"), else: gettext("Edit") %> + {if is_nil(assigns.current_form_submit), do: gettext("Submit"), else: gettext("Edit")} <%= unless is_nil(assigns.current_form_submit) do %> @@ -111,7 +111,7 @@ defmodule ClaperWeb.EventLive.FormComponent do > - <%= gettext("Saved") %> + {gettext("Saved")}
<% end %> diff --git a/lib/claper_web/live/event_live/index.ex b/lib/claper_web/live/event_live/index.ex index 02c4e13..9e0fdf3 100644 --- a/lib/claper_web/live/event_live/index.ex +++ b/lib/claper_web/live/event_live/index.ex @@ -1,7 +1,7 @@ defmodule ClaperWeb.EventLive.Index do use ClaperWeb, :live_view - alias Claper.Events + alias Claper.{Events, Presentations} alias Claper.Events.Event on_mount(ClaperWeb.UserLiveAuth) @@ -22,7 +22,7 @@ defmodule ClaperWeb.EventLive.Index do }) if connected?(socket) do - Phoenix.PubSub.subscribe(Claper.PubSub, "events:#{socket.assigns.current_user.id}") + Events.subscribe_user_events(socket.assigns.current_user.id) end expired_events_count = Events.count_expired_events(socket.assigns.current_user.id) @@ -50,11 +50,22 @@ defmodule ClaperWeb.EventLive.Index do end @impl true - def handle_info({:presentation_file_process_done, presentation}, socket) do - event = Claper.Events.get_event!(presentation.event.uuid, [:presentation_file]) + def handle_info({type, %Events.Event{}}, socket) + when type in [:created, :updated, :deleted] do + {:noreply, refresh_events(socket)} + end - {:noreply, - socket |> assign(:events, [event | socket.assigns.events]) |> put_flash(:info, nil)} + @impl true + def handle_info({type, %Presentations.PresentationFile{}}, socket) + when type in [:presentation_file_process_done] do + {:noreply, refresh_events(socket)} + end + + @impl true + def handle_info(message, socket) do + IO.puts("Received unknown message `#{inspect(message)}` in #{__MODULE__} #{inspect(self())}") + + {:noreply, socket} end @impl true @@ -245,4 +256,16 @@ defmodule ClaperWeb.EventLive.Index do if(socket.assigns.page == 1, do: events, else: socket.assigns.events ++ events) ) end + + defp refresh_events(socket) do + expired_events_count = Events.count_expired_events(socket.assigns.current_user.id) + invited_events_count = Events.count_managed_events_by(socket.assigns.current_user.email) + + socket + |> assign(:has_expired_events, expired_events_count > 0) + |> assign(:has_invited_events, invited_events_count > 0) + |> assign(:events, []) + |> assign(:page, 1) + |> load_events() + end end diff --git a/lib/claper_web/live/event_live/index.html.heex b/lib/claper_web/live/event_live/index.html.heex index e12315d..e242d37 100644 --- a/lib/claper_web/live/event_live/index.html.heex +++ b/lib/claper_web/live/event_live/index.html.heex @@ -25,7 +25,7 @@ /> - <%= gettext("How it works ?") %> + {gettext("How it works ?")} <%= if @live_action in [:new, :edit] do %> @@ -48,11 +48,11 @@ > -
+
@@ -108,7 +109,7 @@ >

- <%= gettext("My events") %> + {gettext("My events")}

@@ -138,7 +139,7 @@ /> - <%= gettext("Quick event") %> + {gettext("Quick event")} <.link @@ -147,7 +148,7 @@ data-tg-tour={gettext("Welcome to Claper! You can create a new event here.")} data-tg-title={"#{gettext("Your first steps with Claper")} 👋"} href={~p"/events/new"} - class="relative w-full sm:w-auto inline-flex justify-center items-center px-5 py-2 text-lg font-medium rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" + class="relative w-full sm:w-auto inline-flex justify-center items-center px-5 py-2 text-lg font-medium rounded-md text-white bg-linear-to-tl from-primary-500 to-secondary-500 bg-size-[200%_200%] bg-position-[0%_0%] hover:bg-position-[100%_100%] transition-all duration-500" > - <%= gettext("Create event") %> + {gettext("Create event")}
@@ -175,7 +176,7 @@ phx-value-tab="not_expired" class={"#{if @active_tab == "not_expired", do: "bg-primary-100 text-primary-700", else: "text-gray-500 hover:text-gray-700"} px-3 py-2 font-medium rounded-md"} > - <%= gettext("Active") %> + {gettext("Active")} @@ -212,16 +213,16 @@
<% end %> <%= if Enum.count(@events) == 0 do %>
-

<%= gettext("Create your first event") %>

+

{gettext("Create your first event")}

<% end %>
diff --git a/lib/claper_web/live/event_live/join.html.heex b/lib/claper_web/live/event_live/join.html.heex index 0624078..7b51cf0 100644 --- a/lib/claper_web/live/event_live/join.html.heex +++ b/lib/claper_web/live/event_live/join.html.heex @@ -21,21 +21,21 @@ @click.away="open = false" > - <%= gettext("About") %> + {gettext("About")} <%= if @current_user do %> <.link href={~p"/events"} - class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" + class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-linear-to-tl from-primary-500 to-secondary-500 bg-size-[200%_200%] bg-position-[0%_0%] hover:bg-position-[100%_100%] transition-all duration-500" > - <%= gettext("Dashboard") %> + {gettext("Dashboard")} <% else %> <.link href={~p"/users/log_in"} - class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" + class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-linear-to-tl from-primary-500 to-secondary-500 bg-size-[200%_200%] bg-position-[0%_0%] hover:bg-position-[100%_100%] transition-all duration-500" > - <%= gettext("Login") %> + {gettext("Login")} <% end %> @@ -44,21 +44,21 @@ @@ -71,13 +71,13 @@ <%= form_for :event, ~p"/join", ["phx-submit": "join", "phx-hook": "JoinEvent", id: "form"], fn f -> %>
- <%= text_input(f, :code, + {text_input(f, :code, required: true, autofocus: true, id: "input", class: - "transition-all bg-transparent tracking-widest w-full uppercase text-white text-2xl px-3 border-b border-gray-200 focus:border-b-2 pt-5 pl-12 pb-3 outline-none" - ) %> + "transition-all bg-transparent tracking-widest w-full uppercase text-white text-2xl px-3 border-b border-gray-200 focus:border-b-2 pt-5 pl-12 pb-3 outline-hidden" + )} - <%= gettext("Join") %> + {gettext("Join")}
<%= if @last_event do %> <.link href={~p"/e/#{@last_event.code}"}> -
+

- <%= gettext("Return to your last event") %> (<%= @last_event.name %>) + {gettext("Return to your last event")} ({@last_event.name})

diff --git a/lib/claper_web/live/event_live/manage.ex b/lib/claper_web/live/event_live/manage.ex index 6a95a9a..e5c3b80 100644 --- a/lib/claper_web/live/event_live/manage.ex +++ b/lib/claper_web/live/event_live/manage.ex @@ -1,12 +1,8 @@ defmodule ClaperWeb.EventLive.Manage do use ClaperWeb, :live_view + alias Claper.{Embeds, Forms, Polls, Presentations, Quizzes} alias ClaperWeb.Presence - alias Claper.Polls - alias Claper.Forms - alias Claper.Embeds - # Add this line - alias Claper.Quizzes @impl true def mount(%{"code" => code}, session, socket) do @@ -39,6 +35,7 @@ defmodule ClaperWeb.EventLive.Manage do socket = socket + |> assign(:interaction_modal, false) |> assign(:settings_modal, false) |> assign(:attendees_nb, 1) |> assign(:event, event) @@ -74,7 +71,7 @@ defmodule ClaperWeb.EventLive.Manage do end defp leader?(%{assigns: %{current_user: current_user}} = _socket, event) do - Claper.Events.leaded_by?(current_user.email, event) || event.user.id == current_user.id + Claper.Events.led_by?(current_user.email, event) || event.user.id == current_user.id end defp leader?(_socket, _event), do: false @@ -585,6 +582,23 @@ defmodule ClaperWeb.EventLive.Manage do {:noreply, socket |> assign(:state, new_state)} end + @impl true + def handle_event( + "checked", + %{"key" => "show_attendee_count", "value" => value}, + %{assigns: %{event: _event, state: state}} = socket + ) do + {:ok, new_state} = + Claper.Presentations.update_presentation_state( + state, + %{ + :show_attendee_count => value + } + ) + + {:noreply, socket |> assign(:state, new_state)} + end + @impl true def handle_event( "checked", @@ -762,18 +776,26 @@ defmodule ClaperWeb.EventLive.Manage do end @impl true - def handle_params(params, _url, socket) do - {:noreply, apply_action(socket, socket.assigns.live_action, params)} + def handle_event( + "toggle-interaction-modal", + _params, + %{assigns: %{interaction_modal: _interaction_modal = true}} = socket + ) do + {:noreply, socket |> push_navigate(to: ~p"/e/#{socket.assigns.event.code}/manage")} end - def toggle_add_modal(js \\ %JS{}) do - js - |> JS.toggle( - to: "#add-modal", - out: "animate__animated animate__fadeOut", - in: "animate__animated animate__fadeIn" - ) - |> JS.push("maybe-redirect", target: "#add-modal") + @impl true + def handle_event( + "toggle-interaction-modal", + _params, + %{assigns: %{interaction_modal: _interaction_modal}} = socket + ) do + {:noreply, socket |> assign(:interaction_modal, true)} + end + + @impl true + def handle_params(params, _url, socket) do + {:noreply, apply_action(socket, socket.assigns.live_action, params)} end def toggle_settings_modal(js \\ %JS{}) do @@ -802,6 +824,7 @@ defmodule ClaperWeb.EventLive.Manage do socket |> assign(:create, "poll") + |> assign(:interaction_modal, true) |> assign(:create_action, :edit) |> assign(:poll, poll) end @@ -834,6 +857,7 @@ defmodule ClaperWeb.EventLive.Manage do socket |> assign(:create, "form") + |> assign(:interaction_modal, true) |> assign(:create_action, :edit) |> assign(:form, form) end @@ -843,6 +867,7 @@ defmodule ClaperWeb.EventLive.Manage do socket |> assign(:create, "embed") + |> assign(:interaction_modal, true) |> assign(:create_action, :edit) |> assign(:embed, embed) end @@ -873,6 +898,7 @@ defmodule ClaperWeb.EventLive.Manage do socket |> assign(:create, "quiz") + |> assign(:interaction_modal, true) |> assign(:create_action, :edit) |> assign(:quiz, quiz) end diff --git a/lib/claper_web/live/event_live/manage.html.heex b/lib/claper_web/live/event_live/manage.html.heex index d1832cb..573a0e6 100644 --- a/lib/claper_web/live/event_live/manage.html.heex +++ b/lib/claper_web/live/event_live/manage.html.heex @@ -32,7 +32,7 @@ /> - <%= gettext("How it works ?") %> + {gettext("How it works ?")}

-
+
<.live_component @@ -134,22 +134,21 @@
-
@@ -146,7 +146,7 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do <%= if @post.lol_count> 0 do %> - <%= @post.lol_count %> + {@post.lol_count} <% end %>
diff --git a/lib/claper_web/live/event_live/manageable_quiz_component.ex b/lib/claper_web/live/event_live/manageable_quiz_component.ex index 7a8ae47..0a4a953 100644 --- a/lib/claper_web/live/event_live/manageable_quiz_component.ex +++ b/lib/claper_web/live/event_live/manageable_quiz_component.ex @@ -12,13 +12,13 @@ defmodule ClaperWeb.EventLive.ManageableQuizComponent do ~H"""

- <%= @quiz.title %> + {@quiz.title} = 0}> - <%= Enum.at(@quiz.quiz_questions, @current_question_idx).content %> + {Enum.at(@quiz.quiz_questions, @current_question_idx).content}

@@ -26,9 +26,9 @@ defmodule ClaperWeb.EventLive.ManageableQuizComponent do :if={@current_question_idx == -1} class={"#{if @iframe, do: "space-y-5", else: "space-y-8"} flex flex-col text-white text-center"} > -

<%= gettext("Average score") %>:

+

{gettext("Average score")}:

- <%= Claper.Quizzes.calculate_average_score(@quiz.id) %>/<%= length(@quiz.quiz_questions) %> + {Claper.Quizzes.calculate_average_score(@quiz.id)}/{length(@quiz.quiz_questions)}

@@ -38,11 +38,11 @@ defmodule ClaperWeb.EventLive.ManageableQuizComponent do > <%= for {opt, _idx} <- Enum.with_index(Enum.at(@quiz.quiz_questions, @current_question_idx).quiz_question_opts) do %>
-
+
- <%= opt.content %> - <%= opt.percentage %>% (<%= opt.response_count %>) + {opt.content} + {opt.percentage}% ({opt.response_count})
<% end %> diff --git a/lib/claper_web/live/event_live/manager_settings_component.ex b/lib/claper_web/live/event_live/manager_settings_component.ex index 790d384..69677aa 100644 --- a/lib/claper_web/live/event_live/manager_settings_component.ex +++ b/lib/claper_web/live/event_live/manager_settings_component.ex @@ -5,7 +5,7 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do assigns = assigns |> assign_new(:show_shortcut, fn -> true end) ~H""" -
+
- <%= gettext("Interaction") %> + {gettext("Interaction")}
<%= case @current_interaction do %> @@ -59,10 +59,10 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do - <%= gettext("Hide results on presentation") %> + {gettext("Hide results on presentation")} - <%= gettext("Show results on presentation") %> + {gettext("Show results on presentation")} - <%= gettext("Hide results on presentation") %> + {gettext("Hide results on presentation")} - <%= gettext("Show results on presentation") %> + {gettext("Show results on presentation")} - <%= gettext("Review questions") %> + {gettext("Review questions")}
@@ -165,7 +165,7 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do - <%= gettext("Previous") %> + {gettext("Previous")} - <%= gettext("Next") %> + {gettext("Next")}
-
-
-
- - - +
+
+
+
+ + + - <%= gettext("Presentation") %> + {gettext("Presentation")} +
+ +
+ + + + + + + + +
+ + {gettext("Show instructions to join")} + + + {gettext("Hide instructions to join")} + +
+ + q + +
+
+
+ +
+ + + + + + + +
+ {gettext("Show messages")} + {gettext("Hide messages")} +
+ + w + +
+
+
+ +
+ + + + + + + +
+ + {gettext("Show only pinned messages")} + + {gettext("Show all messages")} +
+ + e + +
+
+
+
+ + + + + + + +
+ + {gettext("Show attendee count")} + + + {gettext("Hide attendee count")} + +
+ + r + +
+
+
-
- +
+ + + + + + {gettext("Attendees")} +
+ +
+ + + + + + + +
+ {gettext("Enable messages")} + {gettext("Disable messages")} +
+ + a + +
+
+
+ +
- - - + + + + + + - - - -
- - <%= gettext("Show instructions to join") %> - - - <%= gettext("Hide instructions to join") %> - -
- - q - -
- -
+
+ + {gettext("Allow anonymous messages")} + + + {gettext("Deny anonymous messages")} + +
+ + s + +
+
+
-
- - + - - - - - -
- <%= gettext("Show messages") %> - <%= gettext("Hide messages") %> -
- - w - -
-
-
+ + + + + + -
- - - - - - - -
- - <%= gettext("Show only pinned messages") %> - - <%= gettext("Show all messages") %> -
- - e - -
-
-
-
- -
-
- - - - - - <%= gettext("Attendees") %> -
- -
- - - - - - - -
- <%= gettext("Enable messages") %> - <%= gettext("Disable messages") %> -
- - a - -
-
-
- -
- - - - - - - - -
- - <%= gettext("Allow anonymous messages") %> - - - <%= gettext("Deny anonymous messages") %> - -
- - s - -
-
-
- -
- - - - - - - - -
- - <%= gettext("Enable reactions") %> - - - <%= gettext("Disable reactions") %> - -
- - d - -
-
+
+ + {gettext("Enable reactions")} + + + {gettext("Disable reactions")} + +
+ + d + +
+ +
diff --git a/lib/claper_web/live/event_live/poll_component.ex b/lib/claper_web/live/event_live/poll_component.ex index 4079a5a..fda8e80 100644 --- a/lib/claper_web/live/event_live/poll_component.ex +++ b/lib/claper_web/live/event_live/poll_component.ex @@ -25,7 +25,7 @@ defmodule ClaperWeb.EventLive.PollComponent do d="M16 8v8m-4-5v5m-4-2v2m-2 4h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" /> - <%= gettext("See current poll") %> + {gettext("See current poll")}
@@ -44,12 +44,12 @@ defmodule ClaperWeb.EventLive.PollComponent do
-

<%= gettext("Current poll") %>

-

<%= @poll.title %>

+

{gettext("Current poll")}

+

{@poll.title}

<%= if @poll.multiple do %> -

<%= gettext("Select one or multiple options") %>

+

{gettext("Select one or multiple options")}

<% else %> -

<%= gettext("Select one option") %>

+

{gettext("Select one option")}

<% end %>
@@ -60,7 +60,7 @@ defmodule ClaperWeb.EventLive.PollComponent do <% else %> @@ -93,7 +93,7 @@ defmodule ClaperWeb.EventLive.PollComponent do >
@@ -111,10 +111,10 @@ defmodule ClaperWeb.EventLive.PollComponent do <% end %> <% end %> - <%= opt.content %> + {opt.content}
- <%= opt.percentage %>% (<%= opt.vote_count %>) + {opt.percentage}% ({opt.vote_count}) <% end %> @@ -124,7 +124,7 @@ defmodule ClaperWeb.EventLive.PollComponent do <%= if (length @selected_poll_opt) == 0 || (length @current_poll_vote) > 0 do %> <% else %> <% end %>
diff --git a/lib/claper_web/live/event_live/post_component.ex b/lib/claper_web/live/event_live/post_component.ex index 3d54dc3..34ba6fc 100644 --- a/lib/claper_web/live/event_live/post_component.ex +++ b/lib/claper_web/live/event_live/post_component.ex @@ -25,12 +25,12 @@ defmodule ClaperWeb.EventLive.PostComponent do <%= if @post.name || leader?(@post, @event, @leaders) || pinned?(@post) do %>
<%= if @post.name do %> -

<%= @post.name %>

+

{@post.name}

<% end %> <%= if leader?(@post, @event, @leaders) do %>
- <%= gettext("Host") %> + {gettext("Host")}
<% end %> @@ -56,7 +56,7 @@ defmodule ClaperWeb.EventLive.PostComponent do > - <%= gettext("Pinned") %> + {gettext("Pinned")}
<% end %>
@@ -67,34 +67,34 @@ defmodule ClaperWeb.EventLive.PostComponent do class="hidden absolute right-4 top-7 bg-white rounded-lg px-5 py-2 animate__faster" > - <%= link(gettext("Delete"), + {link(gettext("Delete"), to: "#", phx_click: "delete", phx_value_id: @post.uuid, phx_value_event_id: @event.uuid, data: [confirm: gettext("Are you sure?")] - ) %> + )}
-

<%= ClaperWeb.Helpers.format_body(@post.body) %>

+

{ClaperWeb.Helpers.format_body(@post.body)}

<%= if @post.like_count > 0 do %>
- <%= @post.like_count %> + {@post.like_count}
<% end %> <%= if @post.love_count > 0 do %>
- <%= @post.love_count %> + {@post.love_count}
<% end %> <%= if @post.lol_count > 0 do %>
- <%= @post.lol_count %> + {@post.lol_count}
<% end %>
@@ -104,12 +104,12 @@ defmodule ClaperWeb.EventLive.PostComponent do <%= if @post.name || leader?(@post, @event, @leaders) do %>
<%= if @post.name do %> -

<%= @post.name %>

+

{@post.name}

<% end %> <%= if leader?(@post, @event, @leaders) do %>
- <%= gettext("Host") %> + {gettext("Host")}
<% end %>
@@ -139,13 +139,13 @@ defmodule ClaperWeb.EventLive.PostComponent do class="hidden absolute right-4 top-7 bg-gray-900 rounded-lg px-5 py-2" > - <%= link(gettext("Delete"), + {link(gettext("Delete"), to: "#", phx_click: "delete", phx_value_id: @post.uuid, phx_value_event_id: @event.uuid, data: [confirm: gettext("Are you sure?")] - ) %> + )} <% end %> @@ -172,11 +172,11 @@ defmodule ClaperWeb.EventLive.PostComponent do > - <%= gettext("Pinned") %> + {gettext("Pinned")} <% end %> -

<%= ClaperWeb.Helpers.format_body(@post.body) %>

+

{ClaperWeb.Helpers.format_body(@post.body)}

<%= if @reaction_enabled do %> @@ -189,7 +189,7 @@ defmodule ClaperWeb.EventLive.PostComponent do > <%= if @post.like_count > 0 do %> - <%= @post.like_count %> + {@post.like_count} <% end %> <% else %> @@ -203,7 +203,7 @@ defmodule ClaperWeb.EventLive.PostComponent do <%= if @post.like_count > 0 do %> - <%= @post.like_count %> + {@post.like_count} <% end %> <% end %> @@ -216,7 +216,7 @@ defmodule ClaperWeb.EventLive.PostComponent do > <%= if @post.love_count > 0 do %> - <%= @post.love_count %> + {@post.love_count} <% end %> <% else %> @@ -228,7 +228,7 @@ defmodule ClaperWeb.EventLive.PostComponent do > <%= if @post.love_count > 0 do %> - <%= @post.love_count %> + {@post.love_count} <% end %> <% end %> @@ -241,7 +241,7 @@ defmodule ClaperWeb.EventLive.PostComponent do > <%= if @post.lol_count > 0 do %> - <%= @post.lol_count %> + {@post.lol_count} <% end %> <% else %> @@ -253,7 +253,7 @@ defmodule ClaperWeb.EventLive.PostComponent do > <%= if @post.lol_count > 0 do %> - <%= @post.lol_count %> + {@post.lol_count} <% end %> <% end %> diff --git a/lib/claper_web/live/event_live/presenter.ex b/lib/claper_web/live/event_live/presenter.ex index 93bc610..06fcffc 100644 --- a/lib/claper_web/live/event_live/presenter.ex +++ b/lib/claper_web/live/event_live/presenter.ex @@ -6,6 +6,8 @@ defmodule ClaperWeb.EventLive.Presenter do alias Claper.Polls.Poll alias Claper.Forms.Form alias Claper.Quizzes.Quiz + alias Claper.Presentations + @impl true def mount(%{"code" => code} = params, session, socket) do with %{"locale" => locale} <- session do @@ -70,7 +72,7 @@ defmodule ClaperWeb.EventLive.Presenter do end defp leader?(%{assigns: %{current_user: current_user}} = _socket, event) do - Claper.Events.leaded_by?(current_user.email, event) || event.user.id == current_user.id + Claper.Events.led_by?(current_user.email, event) || event.user.id == current_user.id end defp leader?(_socket, _event), do: false diff --git a/lib/claper_web/live/event_live/presenter.html.heex b/lib/claper_web/live/event_live/presenter.html.heex index 50ba0c1..7fb12c8 100644 --- a/lib/claper_web/live/event_live/presenter.html.heex +++ b/lib/claper_web/live/event_live/presenter.html.heex @@ -23,7 +23,7 @@ >
- <%= gettext("Scan to interact in real-time") %> + {gettext("Scan to interact in real-time")}
- <%= gettext("Or go to %{url} and use the code:", url: @host) %> + {gettext("Or go to %{url} and use the code:", url: @host)} - #<%= String.upcase(@event.code) %> + #{String.upcase(@event.code)}
@@ -46,11 +46,11 @@ <%= if @current_poll do %>

- <%= @current_poll.title %> + {@current_poll.title}

@@ -59,16 +59,16 @@
- <%= opt.content %> + {opt.content}
- <%= opt.percentage %>% (<%= opt.vote_count %>) + {opt.percentage}% ({opt.vote_count})
<% end %> @@ -107,10 +107,10 @@
<%= if post.name do %>

- <%= post.name %> + {post.name}

<% end %> -

<%= post.body %>

+

{post.body}

<%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %>
@@ -120,7 +120,7 @@ src="/images/icons/thumb.svg" class={"#{if @iframe, do: "h-4", else: "h-7"}"} /> - <%= post.like_count %> + {post.like_count} <% end %>
@@ -129,7 +129,7 @@ src="/images/icons/heart.svg" class={"#{if @iframe, do: "h-4", else: "h-7"}"} /> - <%= post.love_count %> + {post.love_count} <% end %>
@@ -138,7 +138,7 @@ src="/images/icons/laugh.svg" class={"#{if @iframe, do: "h-4", else: "h-7"}"} /> - <%= post.lol_count %> + {post.lol_count} <% end %>
@@ -154,10 +154,10 @@
<%= if post.name do %>

- <%= post.name %> + {post.name}

<% end %> -

<%= post.body %>

+

{post.body}

<%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %>
@@ -167,7 +167,7 @@ src="/images/icons/thumb.svg" class={"#{if @iframe, do: "h-4", else: "h-7"}"} /> - <%= post.like_count %> + {post.like_count} <% end %>
@@ -176,7 +176,7 @@ src="/images/icons/heart.svg" class={"#{if @iframe, do: "h-4", else: "h-7"}"} /> - <%= post.love_count %> + {post.love_count} <% end %>
@@ -185,7 +185,7 @@ src="/images/icons/laugh.svg" class={"#{if @iframe, do: "h-4", else: "h-7"}"} /> - <%= post.lol_count %> + {post.lol_count} <% end %>
@@ -197,7 +197,7 @@ <% end %>
0) || (!@current_embed && @event.presentation_file.length == 0), do: "hidden"}"} + class={"gutter-1 row-span-full cursor-col-resize col-2 text-center text-sm leading-3 text-white #{if (!@state.chat_visible && @event.presentation_file.length > 0) || (!@current_embed && @event.presentation_file.length == 0), do: "hidden"}"} style="writing-mode: vertical-rl" > ••• @@ -216,27 +216,17 @@
<% end %>
- <%= for index <- 1..max(1, @event.presentation_file.length) do %> - <%= if @event.presentation_file.length > 0 do %> - <%= if Application.get_env(:claper, :presentations) |> Keyword.get(:storage) == "local" do %> - - <% else %> - Keyword.get(:aws_bucket)}.s3.#{Application.get_env(:ex_aws, :region)}.amazonaws.com/presentations/#{@event.presentation_file.hash}/#{index}.jpg"} - /> - <% end %> - <% end %> - <% end %> +
@@ -244,7 +234,7 @@
- <%= @attendees_nb %> + {@attendees_nb}
diff --git a/lib/claper_web/live/event_live/quiz_component.ex b/lib/claper_web/live/event_live/quiz_component.ex index 0d50032..b5a7d54 100644 --- a/lib/claper_web/live/event_live/quiz_component.ex +++ b/lib/claper_web/live/event_live/quiz_component.ex @@ -38,7 +38,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" /> - <%= gettext("See current quiz") %> + {gettext("See current quiz")} @@ -57,13 +57,13 @@ defmodule ClaperWeb.EventLive.QuizComponent do -

<%= gettext("Current quiz") %>

+

{gettext("Current quiz")}

<%= if is_nil(@current_question) do %> -

<%= @quiz.title %>

+

{@quiz.title}

<% else %> -

<%= @current_question.content %>

+

{@current_question.content}

- <%= @current_quiz_question_idx + 1 %>/<%= length(@quiz.quiz_questions) %> + {@current_quiz_question_idx + 1}/{length(@quiz.quiz_questions)}

<% end %> @@ -81,10 +81,10 @@ defmodule ClaperWeb.EventLive.QuizComponent do
<% end %> - <%= opt.content %> + {opt.content} - <%= opt.percentage %>% (<%= opt.response_count %>) + {opt.percentage}% ({opt.response_count}) <% else %> @@ -93,7 +93,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do phx-value-opt={opt.id} class="bg-gray-500 px-3 py-2 rounded-lg flex justify-between items-center relative text-white" > -
+
<%= if Enum.member?(@selected_quiz_question_opts, opt) do %> @@ -102,7 +102,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do <% end %> - <%= opt.content %> + {opt.content}
<% end %> @@ -110,18 +110,18 @@ defmodule ClaperWeb.EventLive.QuizComponent do <% else %>
<%= if @quiz.show_results do %> -

<%= gettext("Your score") %>

+

{gettext("Your score")}

- <%= elem(@quiz_score, 0) %>/<%= elem(@quiz_score, 1) %> + {elem(@quiz_score, 0)}/{elem(@quiz_score, 1)}

<% else %> -

<%= gettext("Waiting for results...") %>

+

{gettext("Waiting for results...")}

<%= if @current_quiz_question_idx > 0 do %> <% end %> @@ -158,21 +158,21 @@ defmodule ClaperWeb.EventLive.QuizComponent do class={"px-3 py-2 text-white font-medium rounded-md h-full #{if @has_selection, do: "bg-primary-400 hover:bg-primary-500", else: "bg-gray-500 cursor-not-allowed"}"} disabled={not @has_selection} > - <%= gettext("Next") %> + {gettext("Next")} <% else %> <%= if is_nil(@current_user) && !@quiz.allow_anonymous do %>
- <%= gettext("Please sign in to submit your answers") %> + {gettext("Please sign in to submit your answers")}
- <%= link( + {link( gettext("Sign in"), target: "_blank", to: ~p"/users/log_in", class: "inline px-3 py-2 text-white font-medium rounded-md h-full bg-primary-400 hover:bg-primary-500" - ) %> + )}
<% else %> <% end %> <% end %> @@ -195,7 +195,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do > <%= if (@current_quiz_question_idx > 0 && @current_quiz_question_idx <= length(@quiz.quiz_questions) - 1) do %> <% else %>
@@ -206,7 +206,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do phx-click="next-question" class="px-3 py-2 text-white font-medium bg-primary-400 hover:bg-primary-500 rounded-md h-full" > - <%= gettext("Next") %> + {gettext("Next")}
diff --git a/lib/claper_web/live/event_live/show.ex b/lib/claper_web/live/event_live/show.ex index 892b4b2..6b5a512 100644 --- a/lib/claper_web/live/event_live/show.ex +++ b/lib/claper_web/live/event_live/show.ex @@ -109,7 +109,7 @@ defmodule ClaperWeb.EventLive.Show do defp check_leader(%{assigns: %{current_user: current_user} = _assigns} = socket, event) when is_map(current_user) do is_leader = - current_user.id == event.user_id || Claper.Events.leaded_by?(current_user.email, event) + current_user.id == event.user_id || Claper.Events.led_by?(current_user.email, event) socket |> assign(:is_leader, is_leader) end @@ -187,7 +187,7 @@ defmodule ClaperWeb.EventLive.Show do end @impl true - def handle_info({:event_terminated, _event}, socket) do + def handle_info({:event_terminated, _event_uuid}, socket) do {:noreply, socket |> put_flash(:error, gettext("This event has been terminated")) @@ -291,10 +291,6 @@ defmodule ClaperWeb.EventLive.Show do @impl true def handle_info({:form_updated, %Claper.Forms.Form{enabled: true} = form}, socket) do - {:noreply, - socket - |> update(:current_interaction, fn _current_interaction -> nil end)} - {:noreply, socket |> load_current_interaction(form, true)} @@ -328,17 +324,6 @@ defmodule ClaperWeb.EventLive.Show do |> load_current_interaction(quiz, true)} end - @impl true - def handle_info({:quiz_deleted, %Claper.Quizzes.Quiz{enabled: true}}, socket) do - end - - @impl true - def handle_info({:quiz_updated, %Claper.Quizzes.Quiz{enabled: true} = quiz}, socket) do - {:noreply, - socket - |> load_current_interaction(quiz, true)} - end - @impl true def handle_info({:quiz_deleted, %Claper.Quizzes.Quiz{enabled: true}}, socket) do {:noreply, @@ -708,7 +693,7 @@ defmodule ClaperWeb.EventLive.Show do ) when is_map(current_user) do case Claper.Quizzes.submit_quiz( - current_user.id, + current_user, opts, socket.assigns.current_interaction.id ) do diff --git a/lib/claper_web/live/event_live/show.html.heex b/lib/claper_web/live/event_live/show.html.heex index a3bb9b7..4d20185 100644 --- a/lib/claper_web/live/event_live/show.html.heex +++ b/lib/claper_web/live/event_live/show.html.heex @@ -1,10 +1,10 @@ <%= if @started || @is_leader do %> -
+ @@ -35,23 +35,23 @@ >
- <%= @attendees_nb %> + {@attendees_nb}
@@ -162,7 +162,7 @@ <%= if @post_count == 0 && @state.chat_enabled do %>
- <%= gettext("Be the first to react !") %> + {gettext("Be the first to react !")}
<% end %> @@ -205,7 +205,7 @@ - <%= gettext("Anonymous") %> + {gettext("Anonymous")} <% else %> <% end %> @@ -246,13 +246,13 @@ - <%= gettext("Use your name") %> + {gettext("Use your name")}
@@ -275,15 +275,15 @@ backdrop-filter: blur(11.5px); -webkit-backdrop-filter: blur(11.5px);" > - <%= text_input(f, :name, + {text_input(f, :name, class: - "bg-transparent outline-none w-full text-white h-10 placeholder-white resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto", + "bg-transparent outline-hidden w-full text-white h-10 placeholder-white resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto", placeholder: gettext("Enter your name") - ) %> + )}

- <%= error_tag(f, :name) %> + {error_tag(f, :name)}

- <%= submit(gettext("Join"), class: "absolute right-5 top-2 p-2 bg-white rounded-md") %> + {submit(gettext("Join"), class: "absolute right-5 top-2 p-2 bg-white rounded-md")} <% else %> @@ -326,9 +326,9 @@ /> <%= if @nickname && @nickname == "" do %> - <%= gettext("Anonymous") %> + {gettext("Anonymous")} <% else %> - <%= @nickname %> + {@nickname} <% end %> @@ -338,15 +338,15 @@
- <%= textarea(f, :body, + {textarea(f, :body, id: "postFormTA", class: - "bg-transparent outline-none w-full text-white h-10 placeholder-white pt-3 resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto", + "bg-transparent outline-hidden w-full text-white h-10 placeholder-white pt-3 resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto", placeholder: gettext("Ask, comment...") - ) %> + )}
- <%= submit("Save", phx_disable_with: "Saving...", id: "hiddenSubmit", class: "hidden") %> + {submit("Save", phx_disable_with: "Saving...", id: "hiddenSubmit", class: "hidden")} <% end %> <% else %> @@ -361,8 +361,8 @@ -webkit-backdrop-filter: blur(11.5px);" >
-
- <%= gettext("Messages deactivated") %> +
+ {gettext("Messages deactivated")}
@@ -420,7 +420,7 @@
-

<%= @event.name %>

+

{@event.name}

- <%= if @remaining_days < 10, do: "0" %><%= @remaining_days %> + {if @remaining_days < 10, do: "0"}{@remaining_days} - <%= gettext("days") %> + {gettext("days")}
- <%= if @remaining_hours < 10, do: "0" %><%= @remaining_hours %> + {if @remaining_hours < 10, do: "0"}{@remaining_hours} - <%= gettext("hours") %> + {gettext("hours")}
- <%= if @remaining_minutes < 10, do: "0" %><%= @remaining_minutes %> + {if @remaining_minutes < 10, do: "0"}{@remaining_minutes} - <%= gettext("minutes") %> + {gettext("minutes")}
- <%= if @remaining_seconds < 10, do: "0" %><%= @remaining_seconds %> + {if @remaining_seconds < 10, do: "0"}{@remaining_seconds} - <%= gettext("seconds") %> + {gettext("seconds")}

diff --git a/lib/claper_web/live/modal_component.ex b/lib/claper_web/live/modal_component.ex index f61f38a..37b5405 100644 --- a/lib/claper_web/live/modal_component.ex +++ b/lib/claper_web/live/modal_component.ex @@ -15,20 +15,19 @@ defmodule ClaperWeb.ModalComponent do phx-window-keydown={hide_modal()} phx-key="escape" phx-target={@myself} - phx-page-loading >
-
+
@@ -36,16 +35,16 @@ defmodule ClaperWeb.ModalComponent do

- <%= @title %> + {@title}

- <%= @description %> + {@description}

- <%= render_slot(@inner_block) %> + {render_slot(@inner_block)}

@@ -64,6 +63,6 @@ defmodule ClaperWeb.ModalComponent do def hide_modal(js \\ %JS{}) do js |> JS.hide(to: "#modal", transition: "animate__animated animate__fadeOut", time: 300) - |> JS.push("hide", target: "#modal") + |> JS.push("hide", target: "#modal", page_loading: true) end end diff --git a/lib/claper_web/live/poll_live/form_component.html.heex b/lib/claper_web/live/poll_live/form_component.html.heex index 64fe502..d96fb91 100644 --- a/lib/claper_web/live/poll_live/form_component.html.heex +++ b/lib/claper_web/live/poll_live/form_component.html.heex @@ -12,8 +12,6 @@ form={f} key={:title} name={gettext("Title of your poll")} - labelClass={if @dark, do: "text-white"} - fieldClass={if @dark, do: "bg-gray-700 text-white"} autofocus="true" required="true" /> @@ -24,8 +22,6 @@
-

<%= gettext("Options") %>

+

{gettext("Options")}

- <%= checkbox(f, :show_results, class: "h-4 w-4") %> - <%= label( + {checkbox(f, :show_results, class: "h-4 w-4")} + {label( f, :show_results, gettext("Attendees can see the results on their device"), class: "text-sm font-medium" - ) %> + )}
- <%= checkbox(f, :multiple, class: "h-4 w-4") %> - <%= label(f, :multiple, gettext("Multiple answers"), class: "text-sm font-medium") %> + {checkbox(f, :multiple, class: "h-4 w-4")} + {label(f, :multiple, gettext("Multiple answers"), class: "text-sm font-medium")}
<%= if @live_action == :edit do %> - <%= link(gettext("Delete"), + {link(gettext("Delete"), to: "#", phx_click: "delete", phx_target: @myself, @@ -120,8 +116,8 @@ ) ], class: - "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" - ) %> + "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline bg-linear-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-[200%_200%] bg-position-[0%_0%] hover:bg-position-[100%_100%] transition-all duration-500" + )} <% end %>
diff --git a/lib/claper_web/live/quiz_live/quiz_component.html.heex b/lib/claper_web/live/quiz_live/quiz_component.html.heex index 0faf2c0..fa72d83 100644 --- a/lib/claper_web/live/quiz_live/quiz_component.html.heex +++ b/lib/claper_web/live/quiz_live/quiz_component.html.heex @@ -12,8 +12,6 @@ form={f} key={:title} name={gettext("Title")} - labelClass={if @dark, do: "text-white"} - fieldClass={if @dark, do: "bg-gray-700 text-white"} autofocus="true" required="true" /> @@ -33,7 +31,7 @@ if(i == 0, do: "rounded-tl-md") ]} > - <%= i + 1 %> + {i + 1} <% end %> <%= if Ecto.Changeset.get_field(@changeset, :quiz_questions) |> length() < 10 do %> @@ -43,7 +41,7 @@ class="text-xs px-3" phx-target={@myself} > - + <%= gettext("Add Question") %> + + {gettext("Add Question")} <% end %>
@@ -56,8 +54,6 @@

- <%= elem(Keyword.get(q.errors, :quiz_question_opts), 0) %> + {elem(Keyword.get(q.errors, :quiz_question_opts), 0)}

<% end %> @@ -78,8 +74,6 @@
<%= label(class: "mt-6 cursor-pointer flex items-center text-white rounded-md px-2.5 py-2.5 h-full #{if (o.source.changes[:is_correct] != nil && o.source.changes[:is_correct]) || (!Map.has_key?(o.source.changes, :is_correct) && o.source.data.is_correct), do: "bg-green-500", else: "bg-red-500"}") do %> - <%= checkbox(o, :is_correct, class: "hidden") %> + {checkbox(o, :is_correct, class: "hidden")} <%= if (o.source.changes[:is_correct] != nil && o.source.changes[:is_correct]) || (!Map.has_key?(o.source.changes, :is_correct) && o.source.data.is_correct) do %> 1 do %>
- <%= gettext("Delete") %> + {gettext("Delete")}
- + <%= gettext("Add answer") %> + + {gettext("Add answer")} <%= if Ecto.Changeset.get_field(@changeset, :quiz_questions) |> length() > 1 do %>
diff --git a/lib/claper_web/live/stat_live/index.html.heex b/lib/claper_web/live/stat_live/index.html.heex index 765cbfd..045ef74 100644 --- a/lib/claper_web/live/stat_live/index.html.heex +++ b/lib/claper_web/live/stat_live/index.html.heex @@ -2,7 +2,7 @@

- <%= @page_title %> + {@page_title}

- <%= gettext("Unique attendees") %> + {gettext("Unique attendees")}

- <%= @distinct_attendee_count %> + {@distinct_attendee_count} - <%= ngettext("attendee", "attendees", @distinct_attendee_count) %> + {ngettext("attendee", "attendees", @distinct_attendee_count)}

@@ -99,18 +99,18 @@

- <%= gettext("Messages") %> + {gettext("Messages")}

- <%= length(@posts) %> + {length(@posts)} - <%= ngettext( + {ngettext( "from %{count} people", "from %{count} peoples", @distinct_poster_count - ) %> + )}

@@ -136,11 +136,11 @@

- <%= gettext("Engagement rate") %> + {gettext("Engagement rate")}

-

<%= @engagement_rate %>%

+

{@engagement_rate}%

- <%= gettext("Interactions") %> + {gettext("Interactions")}

@@ -177,35 +177,35 @@ phx-value-tab="messages" class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :messages, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"} > - <%= gettext("Messages") %> + {gettext("Messages")}
@@ -219,7 +219,7 @@ <% total = Enum.map(poll.poll_opts, fn e -> e.vote_count end) |> Enum.sum() %>
-

<%= poll.title %>

+

{poll.title}

<%= link to: ~p"/export/polls/#{poll.id}", class: "text-sm text-white bg-primary-500 hover:bg-primary-600 rounded-md px-3 py-1 flex items-center gap-1", method: :post, target: "_blank" do %> - <%= gettext("Export") %> (CSV) + {gettext("Export")} (CSV) <% end %>
@@ -252,14 +252,14 @@ >
- <%= opt.content %> + {opt.content}
- <%= percentage %>% (<%= opt.vote_count %>) + {percentage}% ({opt.vote_count})
<% end %> @@ -269,7 +269,7 @@
<% end %> <% else %> -

<%= gettext("No poll has been created") %>

+

{gettext("No poll has been created")}

<% end %>
<% :forms -> %> @@ -278,7 +278,7 @@ <%= for form <- @event.presentation_file.forms do %>
- <%= form.title %> + {form.title} <%= if length(form.form_submits) > 0 do %> @@ -295,14 +295,14 @@ > - <%= gettext("Export") %> (CSV) + {gettext("Export")} (CSV) <% end %> <% end %>
<%= if length(form.form_submits) == 0 do %>

- <%= gettext("No form submission has been sent") %> + {gettext("No form submission has been sent")}

<% end %> @@ -325,7 +325,7 @@
<%= for res <- fs.response do %> -

<%= elem(res, 0) %>: <%= elem(res, 1) %>

+

{elem(res, 0)}: {elem(res, 1)}

<% end %>
@@ -335,7 +335,7 @@
<% end %> <% else %> -

<%= gettext("No form has been created") %>

+

{gettext("No form has been created")}

<% end %> <% :web_content -> %> @@ -343,7 +343,7 @@ <%= if length(@event.presentation_file.embeds) > 0 do %> <%= for embed <- @event.presentation_file.embeds do %> - <%= embed.title %> + {embed.title}
<.live_component @@ -356,7 +356,7 @@ <% end %> <% else %>

- <%= gettext("No web content has been created") %> + {gettext("No web content has been created")}

<% end %>
@@ -377,13 +377,13 @@ > - <%= gettext("Export") %> (CSV) + {gettext("Export")} (CSV) <% end %> <% end %> <%= if length(@posts) == 0 do %> -

<%= gettext("No messages has been sent") %>

+

{gettext("No messages has been sent")}

<% end %>
@@ -405,7 +405,7 @@
-

<%= quiz.title %>

+

{quiz.title}

<%= link to: ~p"/export/quizzes/#{quiz.id}", class: "text-sm text-white bg-primary-500 hover:bg-primary-600 rounded-md px-3 py-1 flex items-center gap-1", method: :post, target: "_blank" do %> - <%= gettext("Export") %> (CSV) + {gettext("Export")} (CSV) <% end %>

- <%= gettext("Average score") %>: + {gettext("Average score")}: - <%= Claper.Quizzes.calculate_average_score(quiz.id) %>/<%= length( + {Claper.Quizzes.calculate_average_score(quiz.id)}/{length( quiz.quiz_questions - ) %> + )}

- <%= gettext("Total submissions") %>: + {gettext("Total submissions")}: - <%= Claper.Quizzes.get_submission_count(quiz.id) %> + {Claper.Quizzes.get_submission_count(quiz.id)}

@@ -443,7 +443,7 @@ <%= for {question, _idx} <- Enum.with_index(quiz.quiz_questions) do %>

- <%= question.content %> + {question.content}

<%= for opt <- question.quiz_question_opts do %> @@ -457,10 +457,10 @@
<% end %> - <%= opt.content %> + {opt.content}
- <%= opt.percentage %>% (<%= opt.response_count %>) + {opt.percentage}% ({opt.response_count})
@@ -473,7 +473,7 @@ <% end %>
<% else %> -

<%= gettext("No quiz has been created") %>

+

{gettext("No quiz has been created")}

<% end %> <% end %> diff --git a/lib/claper_web/live/user_settings_live/show.html.heex b/lib/claper_web/live/user_settings_live/show.html.heex index e9f59f9..3b21e30 100644 --- a/lib/claper_web/live/user_settings_live/show.html.heex +++ b/lib/claper_web/live/user_settings_live/show.html.heex @@ -2,7 +2,7 @@

- <%= gettext("My account") %> + {gettext("My account")}

@@ -26,7 +26,7 @@ id="update_email" class="mt-5 md:flex md:items-end" > - <%= hidden_input(f, :action, name: "action", value: "update_email") %> + {hidden_input(f, :action, name: "action", value: "update_email")} - <%= submit(gettext("Save"), + {submit(gettext("Save"), phx_disable_with: "Saving...", class: "mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm" - ) %> + )}
@@ -62,7 +62,7 @@ id="update_password" class="mt-5 md:flex md:items-end gap-x-2" > - <%= hidden_input(f, :action, name: "action", value: "update_password") %> + {hidden_input(f, :action, name: "action", value: "update_password")} - <%= submit(gettext("Save"), + {submit(gettext("Save"), phx_disable_with: "Saving...", class: "mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm" - ) %> + )} @@ -104,7 +104,7 @@ id="set_password" class="mt-5 md:flex md:items-end gap-x-2" > - <%= hidden_input(f, :action, name: "action", value: "set_password") %> + {hidden_input(f, :action, name: "action", value: "set_password")} - <%= submit(gettext("Save"), + {submit(gettext("Save"), phx_disable_with: "Saving...", class: "mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm" - ) %> + )} <% end %> -
+

- <%= gettext("Personal informations") %> + {gettext("Personal informations")}

- <%= gettext("Your personal informations to access your account") %> + {gettext("Your personal informations to access your account")}

- <%= gettext("Email address") %> + {gettext("Email address")}
- <%= @current_user.email %> - + {@current_user.email} + <.link patch={~p"/users/settings/edit/email"} class="rounded-md font-medium text-purple-600 hover:text-purple-500" > - <%= gettext("Change") %> + {gettext("Change")}
- <%= gettext("Password") %> + {gettext("Password")}
- ******** - + ******** + <.link patch={~p"/users/settings/edit/password"} class="rounded-md font-medium text-purple-600 hover:text-purple-500" > - <%= gettext("Change") %> + {gettext("Change")}
- <%= gettext("Accounts linked") %> + {gettext("Accounts linked")}
<%= for account <- @oidc_accounts do %>
- - <%= account.provider %> + + {account.provider}
- <%= account.organization %> + {account.organization}
@@ -208,7 +208,7 @@ data-confirm={gettext("Are you sure you want to unlink this account?")} class="font-medium text-red-600 hover:text-red-500" > - <%= gettext("Unlink") %> + {gettext("Unlink")}
@@ -216,17 +216,17 @@ <%= for account <- @lti_accounts do %>
- - LMS #<%= account.registration_id %> + + LMS #{account.registration_id} - +
@@ -238,29 +238,42 @@

- <%= gettext("Preferences") %> + {gettext("Preferences")}

- <%= gettext("Customize your account") %> + {gettext("Customize your account")}

<.form :let={f} for={@preferences_changeset} phx-change="save"> - <%= hidden_input(f, :action, name: "action", value: "update_preferences") %> + {hidden_input(f, :action, name: "action", value: "update_preferences")} Enum.filter(fn {_name, code} -> + code in Application.get_env(:claper, :languages, [ + "en", + "fr", + "es", + "it", + "de" + ]) + end) + } key={:locale} name={gettext("Language")} /> @@ -272,23 +285,23 @@

- <%= gettext("Danger zone") %> + {gettext("Danger zone")}

- <%= gettext("Be careful, these actions are irreversible") %> + {gettext("Be careful, these actions are irreversible")}

- <%= link(gettext("Delete account"), + {link(gettext("Delete account"), to: ~p"/users/register/delete", method: :delete, "data-confirm": gettext("All your events and files will be permanently deleted, are you sure?"), class: - "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" - ) %> + "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-hidden focus:shadow-outline bg-linear-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-[200%_200%] bg-position-[0%_0%] hover:bg-position-[100%_100%] transition-all duration-500" + )}
diff --git a/lib/claper_web/notifiers/leader_notifier.ex b/lib/claper_web/notifiers/leader_notifier.ex index 50fc8aa..5c10b6b 100644 --- a/lib/claper_web/notifiers/leader_notifier.ex +++ b/lib/claper_web/notifiers/leader_notifier.ex @@ -1,6 +1,6 @@ defmodule ClaperWeb.Notifiers.LeaderNotifier do use Phoenix.Swoosh, view: ClaperWeb.LeaderNotifierView, layout: {ClaperWeb.LayoutView, :email} - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext def event_invitation(event_name, email, url) do new() diff --git a/lib/claper_web/notifiers/user_notifier.ex b/lib/claper_web/notifiers/user_notifier.ex index 1c549bb..c256887 100644 --- a/lib/claper_web/notifiers/user_notifier.ex +++ b/lib/claper_web/notifiers/user_notifier.ex @@ -1,6 +1,6 @@ defmodule ClaperWeb.Notifiers.UserNotifier do use Phoenix.Swoosh, view: ClaperWeb.UserNotifierView, layout: {ClaperWeb.LayoutView, :email} - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext def magic(email, url) do new() @@ -24,15 +24,37 @@ defmodule ClaperWeb.Notifiers.UserNotifier do |> render_body("welcome.html", %{email: email}) end - def update_email(user, url) do + def update_email(new_email, url) do + new() + |> to(new_email) + |> from( + {Application.get_env(:claper, :mail) |> Keyword.get(:from_name), + Application.get_env(:claper, :mail) |> Keyword.get(:from)} + ) + |> subject(gettext("Update email instructions")) + |> render_body("change.html", %{url: url}) + end + + def confirm(user, url) do new() |> to(user.email) |> from( {Application.get_env(:claper, :mail) |> Keyword.get(:from_name), Application.get_env(:claper, :mail) |> Keyword.get(:from)} ) - |> subject(gettext("Update email instructions")) - |> render_body("change.html", %{user: user, url: url}) + |> subject(gettext("Confirmation instructions")) + |> render_body("confirm.html", %{user: user, url: url}) + end + + def reset(user, url) do + new() + |> to(user.email) + |> from( + {Application.get_env(:claper, :mail) |> Keyword.get(:from_name), + Application.get_env(:claper, :mail) |> Keyword.get(:from)} + ) + |> subject(gettext("Reset password instructions")) + |> render_body("reset.html", %{user: user, url: url}) end def confirm(user, url) do diff --git a/lib/claper_web/plugs/admin_required_plug.ex b/lib/claper_web/plugs/admin_required_plug.ex new file mode 100644 index 0000000..c338bdb --- /dev/null +++ b/lib/claper_web/plugs/admin_required_plug.ex @@ -0,0 +1,33 @@ +defmodule ClaperWeb.Plugs.AdminRequiredPlug do + @moduledoc """ + Plug to ensure that the current user has admin role. + + This plug should be used after the authentication plug to ensure + that only admin users can access certain routes. + """ + + import Plug.Conn + import Phoenix.Controller + + use Phoenix.VerifiedRoutes, + endpoint: ClaperWeb.Endpoint, + router: ClaperWeb.Router, + statics: ClaperWeb.static_paths() + + alias Claper.Accounts + + def init(opts), do: opts + + def call(conn, _opts) do + user = conn.assigns[:current_user] + + if user && Accounts.user_has_role?(user, "admin") do + conn + else + conn + |> put_flash(:error, "You must be an admin to access this page.") + |> redirect(to: ~p"/events") + |> halt() + end + end +end diff --git a/lib/claper_web/router.ex b/lib/claper_web/router.ex index 7d06ba0..bd049f3 100644 --- a/lib/claper_web/router.ex +++ b/lib/claper_web/router.ex @@ -14,6 +14,10 @@ defmodule ClaperWeb.Router do plug(ClaperWeb.Plugs.Locale) end + pipeline :admin_required do + plug(ClaperWeb.Plugs.AdminRequiredPlug) + end + pipeline :lti do plug(:accepts, ["html", "json"]) plug(:put_root_layout, html: {ClaperWeb.LayoutView, :root}) @@ -165,4 +169,28 @@ defmodule ClaperWeb.Router do delete("/users/log_out", UserSessionController, :delete) end + + # Admin panel routes - LiveView implementation + live_session :admin, root_layout: {ClaperWeb.LayoutView, :admin} do + scope "/admin", ClaperWeb.AdminLive do + pipe_through [:browser, :require_authenticated_user, :admin_required] + + live "/", DashboardLive, :index + + live "/users", UserLive, :index + live "/users/new", UserLive, :new + live "/users/:id/edit", UserLive, :edit + live "/users/:id", UserLive, :show + + live "/events", EventLive, :index + live "/events/new", EventLive, :new + live "/events/:id/edit", EventLive, :edit + live "/events/:id", EventLive, :show + + live "/oidc_providers", OidcProviderLive, :index + live "/oidc_providers/new", OidcProviderLive, :new + live "/oidc_providers/:id/edit", OidcProviderLive, :edit + live "/oidc_providers/:id", OidcProviderLive, :show + end + end end diff --git a/lib/claper_web/templates/error/404.html.heex b/lib/claper_web/templates/error/404.html.heex index a6cfd75..c5e7b50 100644 --- a/lib/claper_web/templates/error/404.html.heex +++ b/lib/claper_web/templates/error/404.html.heex @@ -4,7 +4,7 @@ - <%= csrf_meta_tag() %> + {csrf_meta_tag()} Not found - Claper @@ -28,12 +28,12 @@

- <%= gettext("Oops, page doesn't exist.") %> + {gettext("Oops, page doesn't exist.")}

diff --git a/lib/claper_web/templates/error/500.html.heex b/lib/claper_web/templates/error/500.html.heex index 6162aa6..0315d1b 100644 --- a/lib/claper_web/templates/error/500.html.heex +++ b/lib/claper_web/templates/error/500.html.heex @@ -4,7 +4,7 @@ - <%= csrf_meta_tag() %> + {csrf_meta_tag()} Not found - Claper @@ -28,13 +28,13 @@

- <%= gettext("The site is under maintenance, we'll be back very soon!") %> + {gettext("The site is under maintenance, we'll be back very soon!")}

diff --git a/lib/claper_web/templates/error/csrf_error.html.heex b/lib/claper_web/templates/error/csrf_error.html.heex index bebb46a..7fb1f80 100644 --- a/lib/claper_web/templates/error/csrf_error.html.heex +++ b/lib/claper_web/templates/error/csrf_error.html.heex @@ -2,31 +2,31 @@

- <%= gettext("CSRF Verification Failed") %> + {gettext("CSRF Verification Failed")}

- <%= gettext("A required security token was not found or was invalid.") %> + {gettext("A required security token was not found or was invalid.")}

- <%= gettext("If you're continually seeing this issue, try the following:") %> + {gettext("If you're continually seeing this issue, try the following:")}

    -
  1. <%= gettext("Clear cookies (at least for Claper domain)") %>
  2. -
  3. <%= gettext("Reload the page you're trying to access (don't re-submit data)") %>
  4. -
  5. <%= gettext("Try logging in again") %>
  6. -
  7. <%= gettext("Ensure the URL does not contain an extra \"/\" anywhere") %>
  8. +
  9. {gettext("Clear cookies (at least for Claper domain)")}
  10. +
  11. {gettext("Reload the page you're trying to access (don't re-submit data)")}
  12. +
  13. {gettext("Try logging in again")}
  14. +
  15. {gettext("Ensure the URL does not contain an extra \"/\" anywhere")}

- <%= gettext("If the problem persists, please contact support.") %> + {gettext("If the problem persists, please contact support.")}

- <%= link(gettext("Back to Login"), + {link(gettext("Back to Login"), to: ~p"/users/log_in", class: "text-blue underline font-semibold transition duration-300 ease-in-out" - ) %> + )}
diff --git a/lib/claper_web/templates/layout/_avatar.html.heex b/lib/claper_web/templates/layout/_avatar.html.heex index 917ca9e..83f05de 100644 --- a/lib/claper_web/templates/layout/_avatar.html.heex +++ b/lib/claper_web/templates/layout/_avatar.html.heex @@ -4,9 +4,9 @@ <% else %>
<%= if @user.full_name do %> - <%= with [first | _] <- String.codepoints(@user.full_name), do: String.capitalize(first) %> + {with [first | _] <- String.codepoints(@user.full_name), do: String.capitalize(first)} <% else %> - <%= with [first | _] <- String.codepoints(@user.email), do: String.capitalize(first) %> + {with [first | _] <- String.codepoints(@user.email), do: String.capitalize(first)} <% end %>
<% end %> diff --git a/lib/claper_web/templates/layout/_profile_dropdown.html.heex b/lib/claper_web/templates/layout/_profile_dropdown.html.heex index c20e3c5..c2123f1 100644 --- a/lib/claper_web/templates/layout/_profile_dropdown.html.heex +++ b/lib/claper_web/templates/layout/_profile_dropdown.html.heex @@ -20,7 +20,7 @@ aria-haspopup="true" > Open user menu - +
diff --git a/lib/claper_web/templates/layout/_user_menu.html.heex b/lib/claper_web/templates/layout/_user_menu.html.heex index 925e439..70c9a71 100644 --- a/lib/claper_web/templates/layout/_user_menu.html.heex +++ b/lib/claper_web/templates/layout/_user_menu.html.heex @@ -3,24 +3,31 @@ href={~p"/users/settings"} class="text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100 hover:text-gray-900" > - <%= gettext("My account") %> + {gettext("My account")} + + + {gettext("Admin")} - <%= gettext("Documentation") %> + {gettext("Documentation")}
- <%= link(gettext("Logout"), + {link(gettext("Logout"), to: ~p"/users/log_out", method: :delete, class: "text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100 hover:text-gray-900" - ) %> + )}

- Version <%= Application.spec(:claper, :vsn) %> + Version {Application.spec(:claper, :vsn)}

diff --git a/lib/claper_web/templates/layout/admin.html.heex b/lib/claper_web/templates/layout/admin.html.heex new file mode 100644 index 0000000..5385685 --- /dev/null +++ b/lib/claper_web/templates/layout/admin.html.heex @@ -0,0 +1,316 @@ + + + + + + + {csrf_meta_tag()} + <.live_title suffix=" · Claper Admin"> + {assigns[:page_title] || "Admin Dashboard"} + + + + + + + +
+ + +
+ + + + +
+ +
+ <%= if Phoenix.Flash.get(@flash, :info) do %> +
+ + + + + {Phoenix.Flash.get(@flash, :info)} + +
+ <% end %> + + <%= if Phoenix.Flash.get(@flash, :success) do %> +
+ + + + {Phoenix.Flash.get(@flash, :success)} + +
+ <% end %> + + <%= if Phoenix.Flash.get(@flash, :warning) do %> +
+ + + + {Phoenix.Flash.get(@flash, :warning)} + +
+ <% end %> + + <%= if Phoenix.Flash.get(@flash, :error) do %> +
+ + + + {Phoenix.Flash.get(@flash, :error)} + +
+ <% end %> +
+
+ {@inner_content} +
+
+
+ + +
+ + +
+
+ + + + + diff --git a/lib/claper_web/templates/layout/app.html.heex b/lib/claper_web/templates/layout/app.html.heex index aa07106..5e15891 100644 --- a/lib/claper_web/templates/layout/app.html.heex +++ b/lib/claper_web/templates/layout/app.html.heex @@ -8,4 +8,4 @@ <% end %>
-<%= @inner_content %> +{@inner_content} diff --git a/lib/claper_web/templates/layout/email.html.heex b/lib/claper_web/templates/layout/email.html.heex index 7754e14..1746023 100644 --- a/lib/claper_web/templates/layout/email.html.heex +++ b/lib/claper_web/templates/layout/email.html.heex @@ -58,7 +58,7 @@   - <%= @inner_content %> + {@inner_content} diff --git a/lib/claper_web/templates/layout/live.html.heex b/lib/claper_web/templates/layout/live.html.heex index 3b69ea9..5e15891 100644 --- a/lib/claper_web/templates/layout/live.html.heex +++ b/lib/claper_web/templates/layout/live.html.heex @@ -1,11 +1,11 @@
- <%= if live_flash(@flash, :info) do %> - + <%= if Phoenix.Flash.get(@flash, :info) do %> + <% end %> - <%= if live_flash(@flash, :error) do %> - + <%= if Phoenix.Flash.get(@flash, :error) do %> + <% end %>
-<%= @inner_content %> +{@inner_content} diff --git a/lib/claper_web/templates/layout/root.html.heex b/lib/claper_web/templates/layout/root.html.heex index 9a903ea..71fb97d 100644 --- a/lib/claper_web/templates/layout/root.html.heex +++ b/lib/claper_web/templates/layout/root.html.heex @@ -4,11 +4,16 @@ - <%= csrf_meta_tag() %> - <.live_title suffix=" · Claper" )><%= assigns[:page_title] || "Claper" %> + {csrf_meta_tag()} + <.live_title suffix=" · Claper" )>{assigns[:page_title] || "Claper"} + @@ -17,7 +22,7 @@
- <%= @inner_content %> + {@inner_content}
diff --git a/lib/claper_web/templates/layout/user.html.heex b/lib/claper_web/templates/layout/user.html.heex index 37f0a0b..5106cfe 100644 --- a/lib/claper_web/templates/layout/user.html.heex +++ b/lib/claper_web/templates/layout/user.html.heex @@ -4,8 +4,8 @@ - <%= csrf_meta_tag() %> - <.live_title suffix=" · Claper" )><%= assigns[:page_title] || "Claper" %> + {csrf_meta_tag()} + <.live_title suffix=" · Claper" )>{assigns[:page_title] || "Claper"} @@ -16,9 +16,9 @@
- <%= render("_profile_dropdown.html", user: @current_user, conn: @conn) %> + {render("_profile_dropdown.html", user: @current_user, conn: @conn)}
- <%= @inner_content %> + {@inner_content}
diff --git a/lib/claper_web/templates/leader_notifier/invitation.html.heex b/lib/claper_web/templates/leader_notifier/invitation.html.heex index c6699f5..d821fd8 100644 --- a/lib/claper_web/templates/leader_notifier/invitation.html.heex +++ b/lib/claper_web/templates/leader_notifier/invitation.html.heex @@ -14,25 +14,25 @@

- <%= gettext("You have been invited") %> + {gettext("You have been invited")}

- <%= gettext("Someone invited you to manage the event: %{name}", name: @event_name) %> + {gettext("Someone invited you to manage the event: %{name}", name: @event_name)}

- <%= gettext( + {gettext( "To accept the invitation, please login or create an account with this email: %{email}", email: @leader_email - ) %> + )}

- <%= gettext("Login or create account") %> + {gettext("Login or create account")} @@ -42,11 +42,11 @@

- <%= gettext( + {gettext( "If you’re having trouble with the button above, copy and paste the URL below into your web browser" - ) %>. + )}.

-

<%= @url %>

+

{@url}

diff --git a/lib/claper_web/templates/lti/launch/error.html.heex b/lib/claper_web/templates/lti/launch/error.html.heex index 6732aee..5827f57 100644 --- a/lib/claper_web/templates/lti/launch/error.html.heex +++ b/lib/claper_web/templates/lti/launch/error.html.heex @@ -2,19 +2,19 @@

- <%= gettext("Oops") %> + {gettext("Oops")}

- <%= gettext("You cannot perform this action") %> + {gettext("You cannot perform this action")}

<%= @msg %>
diff --git a/lib/claper_web/templates/lti/registration/new.html.heex b/lib/claper_web/templates/lti/registration/new.html.heex index 4bed03f..11f5b33 100644 --- a/lib/claper_web/templates/lti/registration/new.html.heex +++ b/lib/claper_web/templates/lti/registration/new.html.heex @@ -21,10 +21,10 @@

- <%= gettext("Bring Claper to your LMS") %> + {gettext("Bring Claper to your LMS")}

- <%= gettext("Register your platform") %> + {gettext("Register your platform")}

@@ -35,12 +35,12 @@

- <%= gettext("You must login to continue") %> + {gettext("You must login to continue")}

diff --git a/lib/claper_web/templates/lti/registration/success.html.heex b/lib/claper_web/templates/lti/registration/success.html.heex index e753eca..8a5e65b 100644 --- a/lib/claper_web/templates/lti/registration/success.html.heex +++ b/lib/claper_web/templates/lti/registration/success.html.heex @@ -2,28 +2,28 @@

- <%= gettext("Registration completed") %> + {gettext("Registration completed")}

- <%= gettext("Your next steps") %>: + {gettext("Your next steps")}:

    -
  1. <%= gettext("Activate the tool in your LMS") %>
  2. -
  3. <%= gettext("Configure it to be opened in a new window") %>
  4. +
  5. {gettext("Activate the tool in your LMS")}
  6. +
  7. {gettext("Configure it to be opened in a new window")}
  8. - <%= gettext("Check the permissions to share name and email of users") %> + {gettext("Check the permissions to share name and email of users")}
diff --git a/lib/claper_web/templates/page/user_confirmation/edit.html.heex b/lib/claper_web/templates/page/user_confirmation/edit.html.heex index 16087e6..f776bab 100644 --- a/lib/claper_web/templates/page/user_confirmation/edit.html.heex +++ b/lib/claper_web/templates/page/user_confirmation/edit.html.heex @@ -2,12 +2,12 @@ <.form :let={_f} for={:user} action={~p"/users/confirm/#{@token}"}>
- <%= submit("Confirm my account") %> + {submit("Confirm my account")}

- <%= link("Register", to: ~p"/users/register") %> | <%= link("Log in", + {link("Register", to: ~p"/users/register")} | {link("Log in", to: ~p"/users/log_in" - ) %> + )}

diff --git a/lib/claper_web/templates/page/user_confirmation/new.html.heex b/lib/claper_web/templates/page/user_confirmation/new.html.heex index cf4fbb0..510ca1c 100644 --- a/lib/claper_web/templates/page/user_confirmation/new.html.heex +++ b/lib/claper_web/templates/page/user_confirmation/new.html.heex @@ -1,16 +1,16 @@

Resend confirmation instructions

<.form :let={f} for={:user} action={~p"/users/confirm"}> - <%= label(f, :email) %> - <%= email_input(f, :email, required: true) %> + {label(f, :email)} + {email_input(f, :email, required: true)}
- <%= submit("Resend confirmation instructions") %> + {submit("Resend confirmation instructions")}

- <%= link("Register", to: ~p"/users/register") %> | <%= link("Log in", + {link("Register", to: ~p"/users/register")} | {link("Log in", to: ~p"/users/log_in" - ) %> + )}

diff --git a/lib/claper_web/templates/user_confirmation/new.html.heex b/lib/claper_web/templates/user_confirmation/new.html.heex index 46f92e4..b69d53e 100644 --- a/lib/claper_web/templates/user_confirmation/new.html.heex +++ b/lib/claper_web/templates/user_confirmation/new.html.heex @@ -1,16 +1,16 @@

Resend confirmation instructions

<%= form_for :user, ~p"/users/confirm", fn f -> %> - <%= label(f, :email) %> - <%= email_input(f, :email, required: true) %> + {label(f, :email)} + {email_input(f, :email, required: true)}
- <%= submit("Resend confirmation instructions") %> + {submit("Resend confirmation instructions")}
<% end %>

- <%= link("Register", to: ~p"/users/register") %> | <%= link("Log in", + {link("Register", to: ~p"/users/register")} | {link("Log in", to: ~p"/users/log_in" - ) %> + )}

diff --git a/lib/claper_web/templates/user_notifier/change.html.heex b/lib/claper_web/templates/user_notifier/change.html.heex index 4e5b3f5..1d59672 100644 --- a/lib/claper_web/templates/user_notifier/change.html.heex +++ b/lib/claper_web/templates/user_notifier/change.html.heex @@ -14,22 +14,22 @@

- <%= gettext("Confirm email") %> + {gettext("Confirm email change")}

- <%= gettext("You can change your email by visiting the URL below") %> + {gettext("You can confirm your email change by visiting the URL below")}

- <%= gettext("CONFIRM EMAIL") %> + {gettext("CONFIRM EMAIL")}

- <%= gettext("If you didn't create an account with us, please ignore this.") %> + {gettext("If you didn't request an email change, please ignore this.")}

@@ -39,11 +39,11 @@

- <%= gettext( + {gettext( "If you’re having trouble with the button above, copy and paste the URL below into your web browser" - ) %>. + )}.

-

<%= @url %>

+

{@url}

diff --git a/lib/claper_web/templates/user_notifier/confirm.html.heex b/lib/claper_web/templates/user_notifier/confirm.html.heex index 749a792..49e31a4 100644 --- a/lib/claper_web/templates/user_notifier/confirm.html.heex +++ b/lib/claper_web/templates/user_notifier/confirm.html.heex @@ -14,22 +14,22 @@

- <%= gettext("Confirm account") %> + {gettext("Confirm account")}

- <%= gettext("You can confirm your account by visiting the URL below") %> + {gettext("You can confirm your account by visiting the URL below")}

- <%= gettext("CONFIRM ACCOUNT") %> + {gettext("CONFIRM ACCOUNT")}

- <%= gettext("If you didn't create an account with us, please ignore this.") %> + {gettext("If you didn't create an account with us, please ignore this.")}

@@ -39,11 +39,11 @@

- <%= gettext( + {gettext( "If you’re having trouble with the button above, copy and paste the URL below into your web browser" - ) %>. + )}.

-

<%= @url %>

+

{@url}

diff --git a/lib/claper_web/templates/user_notifier/magic.html.heex b/lib/claper_web/templates/user_notifier/magic.html.heex index 8ead688..7fc359f 100644 --- a/lib/claper_web/templates/user_notifier/magic.html.heex +++ b/lib/claper_web/templates/user_notifier/magic.html.heex @@ -14,22 +14,22 @@

- <%= gettext("Connect to Claper") %> + {gettext("Connect to Claper")}

- <%= gettext("You can log into your account by clicking here.") %> + {gettext("You can log into your account by clicking here.")}

- <%= gettext("ACCESS TO MY ACCOUNT") %> + {gettext("ACCESS TO MY ACCOUNT")}

- <%= gettext("If you didn't create an account with us, please ignore this.") %> + {gettext("If you didn't create an account with us, please ignore this.")}

@@ -39,11 +39,11 @@

- <%= gettext( + {gettext( "If you’re having trouble with the button above, copy and paste the URL below into your web browser" - ) %>. + )}.

-

<%= @url %>

+

{@url}

diff --git a/lib/claper_web/templates/user_notifier/reset.html.heex b/lib/claper_web/templates/user_notifier/reset.html.heex index 4123497..5bb968c 100644 --- a/lib/claper_web/templates/user_notifier/reset.html.heex +++ b/lib/claper_web/templates/user_notifier/reset.html.heex @@ -14,22 +14,22 @@

- <%= gettext("Reset password") %> + {gettext("Reset password")}

- <%= gettext("You can reset your password by visiting the URL below") %> + {gettext("You can reset your password by visiting the URL below")}

- <%= gettext("RESET PASSWORD") %> + {gettext("RESET PASSWORD")}

- <%= gettext("If you didn't create an account with us, please ignore this.") %> + {gettext("If you didn't create an account with us, please ignore this.")}

@@ -39,11 +39,11 @@

- <%= gettext( + {gettext( "If you’re having trouble with the button above, copy and paste the URL below into your web browser" - ) %>. + )}.

-

<%= @url %>

+

{@url}

diff --git a/lib/claper_web/templates/user_notifier/welcome.html.heex b/lib/claper_web/templates/user_notifier/welcome.html.heex index 9f04aaf..14f1906 100644 --- a/lib/claper_web/templates/user_notifier/welcome.html.heex +++ b/lib/claper_web/templates/user_notifier/welcome.html.heex @@ -14,59 +14,59 @@

- <%= gettext("Welcome !") %> + {gettext("Welcome !")}

- <%= gettext( + {gettext( "Congrats! You've taken the first step to improving your presentations. Here are the next steps to create step up your presentations with Claper:" - ) %> + )}

  1. - <%= raw( + {raw( gettext( "Export your current presentation to PDF from your favorite slide presentation software (PowerPoint, etc)" ) - ) %> + )}
  2. - <%= raw( + {raw( gettext( "Click on the create button on your dashboard" ) - ) %> + )}
  3. - <%= raw( + {raw( gettext( "Choose a name for your event, a code for your attendees to join and dates when your attendees could start interacting" ) - ) %> + )}
  4. - <%= raw( + {raw( gettext( "Wait few minutes for your file to be processed" ) - ) %> + )}
  5. - <%= raw( + {raw( gettext( "Click on Present/Customize to add interaction on your slides" ) - ) %> + )}
  6. - <%= raw( + {raw( gettext( "Click Start to open your presentation and move the window on the big screen" ) - ) %> + )}
  7. -
  8. <%= gettext("Enjoy ! ✨") %>
  9. +
  10. {gettext("Enjoy ! ✨")}
diff --git a/lib/claper_web/templates/user_registration/confirm.html.heex b/lib/claper_web/templates/user_registration/confirm.html.heex index eea8f68..9d04dba 100644 --- a/lib/claper_web/templates/user_registration/confirm.html.heex +++ b/lib/claper_web/templates/user_registration/confirm.html.heex @@ -10,23 +10,23 @@

<%= if @conn.query_params["retry"] do %> - <%= gettext("We already sent you an email to login, please retry in 5 minutes.") %> + {gettext("We already sent you an email to login, please retry in 5 minutes.")} <% else %> <%= if @conn.query_params["email"] do %> - <%= gettext("We sent you an email at") <> + {gettext("We sent you an email at") <> " #{@conn.query_params["email"]}" <> - gettext(", click on the provided link to connect (check your spam !)") %> + gettext(", click on the provided link to connect (check your spam !)")} <% else %> - <%= gettext( + {gettext( "We sent you an email, click on the provided link to connect (check your spam !)" - ) %> + )} <% end %> <% end %>

<.link href={~p"/"} class="text-sm text-white underline"> - <%= gettext("back to the home page") %> + {gettext("back to the home page")}
diff --git a/lib/claper_web/templates/user_registration/new.html.heex b/lib/claper_web/templates/user_registration/new.html.heex index 478c954..a913231 100644 --- a/lib/claper_web/templates/user_registration/new.html.heex +++ b/lib/claper_web/templates/user_registration/new.html.heex @@ -9,7 +9,7 @@

- <%= gettext("Join the Claper experience") %> + {gettext("Join the Claper experience")}

@@ -41,9 +41,9 @@
diff --git a/lib/claper_web/templates/user_reset_password/edit.html.heex b/lib/claper_web/templates/user_reset_password/edit.html.heex index 4c59a67..56c11dd 100644 --- a/lib/claper_web/templates/user_reset_password/edit.html.heex +++ b/lib/claper_web/templates/user_reset_password/edit.html.heex @@ -9,7 +9,7 @@

- <%= gettext("Reset your password") %> + {gettext("Reset your password")}

@@ -46,9 +46,9 @@
diff --git a/lib/claper_web/templates/user_reset_password/new.html.heex b/lib/claper_web/templates/user_reset_password/new.html.heex index 41e79db..6a94dad 100644 --- a/lib/claper_web/templates/user_reset_password/new.html.heex +++ b/lib/claper_web/templates/user_reset_password/new.html.heex @@ -9,7 +9,7 @@

- <%= gettext("Reset your password") %> + {gettext("Reset your password")}

@@ -31,9 +31,9 @@
diff --git a/lib/claper_web/templates/user_session/new.html.heex b/lib/claper_web/templates/user_session/new.html.heex index a4830dd..47520ac 100644 --- a/lib/claper_web/templates/user_session/new.html.heex +++ b/lib/claper_web/templates/user_session/new.html.heex @@ -19,10 +19,10 @@

- <%= gettext("It's time to empower your presentations.") %> + {gettext("It's time to empower your presentations.")}

- <%= gettext("Connect to your account") %> + {gettext("Connect to your account")}

@@ -57,9 +57,9 @@
@@ -68,23 +68,23 @@ <%= link( to: ~p"/users/oidc", class: - "w-full flex justify-center items-center gap-x-2 py-2 px-4 rounded-md shadow-sm text-sm font-medium text-white border-2 border-secondary-500 hover:bg-secondary-500 hover:bg-opacity-40" + "w-full flex justify-center items-center gap-x-2 py-2 px-4 rounded-md shadow-sm text-sm font-medium text-white border-2 border-secondary-500 hover:bg-secondary-500/40" ) do %> - <%= gettext("Login with %{provider}", provider: @oidc_provider_name) %> + {gettext("Login with %{provider}", provider: @oidc_provider_name)} <% end %>
- <%= link(gettext("Forgot your password?"), + {link(gettext("Forgot your password?"), to: ~p"/users/reset_password", class: "text-white text-sm text-center" - ) %> + )} <%= if Application.get_env(:claper, :enable_account_creation) do %> - <%= link(gettext("Create account"), + {link(gettext("Create account"), to: ~p"/users/register", class: "text-white text-sm text-center" - ) %> + )} <% end %>
diff --git a/lib/claper_web/validators/admin_form_validator.ex b/lib/claper_web/validators/admin_form_validator.ex new file mode 100644 index 0000000..d4f407c --- /dev/null +++ b/lib/claper_web/validators/admin_form_validator.ex @@ -0,0 +1,122 @@ +defmodule ClaperWeb.Validators.AdminFormValidator do + @moduledoc """ + Provides validation functions for admin panel forms. + + This module contains helper functions to validate input data + for admin forms before processing, providing consistent validation + across the admin panel. + """ + + @doc """ + Validates OIDC provider data. + + Returns {:ok, validated_params} or {:error, errors} + """ + def validate_oidc_provider(params) do + errors = [] + + errors = + if String.trim(params["name"]) == "" do + [{:name, "Name cannot be blank"} | errors] + else + errors + end + + errors = + if valid_url?(params["issuer"]) do + errors + else + [{:issuer, "Issuer must be a valid URL"} | errors] + end + + errors = + if String.trim(params["client_id"]) == "" do + [{:client_id, "Client ID cannot be blank"} | errors] + else + errors + end + + errors = + if String.trim(params["client_secret"]) == "" do + [{:client_secret, "Client Secret cannot be blank"} | errors] + else + errors + end + + if Enum.empty?(errors) do + {:ok, params} + else + {:error, errors} + end + end + + @doc """ + Validates event data. + + Returns {:ok, validated_params} or {:error, errors} + """ + def validate_event(params) do + errors = [] + + errors = + if String.trim(params["name"]) == "" do + [{:name, "Name cannot be blank"} | errors] + else + errors + end + + errors = + if String.trim(params["code"]) == "" do + [{:code, "Code cannot be blank"} | errors] + else + errors + end + + if Enum.empty?(errors) do + {:ok, params} + else + {:error, errors} + end + end + + @doc """ + Validates user data. + + Returns {:ok, validated_params} or {:error, errors} + """ + def validate_user(params) do + errors = [] + + errors = + if String.trim(params["email"]) == "" do + [{:email, "Email cannot be blank"} | errors] + else + if valid_email?(params["email"]) do + errors + else + [{:email, "Email is not valid"} | errors] + end + end + + if Enum.empty?(errors) do + {:ok, params} + else + {:error, errors} + end + end + + # Private helper functions + + defp valid_url?(nil), do: false + + defp valid_url?(url) do + uri = URI.parse(url) + uri.scheme != nil && uri.host != nil && uri.host =~ "." + end + + defp valid_email?(nil), do: false + + defp valid_email?(email) do + Regex.match?(~r/^[^\s]+@[^\s]+\.[^\s]+$/, email) + end +end diff --git a/lib/claper_web/views/admin/shared_view.ex b/lib/claper_web/views/admin/shared_view.ex new file mode 100644 index 0000000..d656617 --- /dev/null +++ b/lib/claper_web/views/admin/shared_view.ex @@ -0,0 +1,3 @@ +defmodule ClaperWeb.Admin.SharedView do + use ClaperWeb, :view +end diff --git a/lib/claper_web/views/components/alert_component.ex b/lib/claper_web/views/components/alert_component.ex index 7ec1115..e949847 100644 --- a/lib/claper_web/views/components/alert_component.ex +++ b/lib/claper_web/views/components/alert_component.ex @@ -15,7 +15,7 @@ defmodule ClaperWeb.Component.Alert do x-transition >
-
+

- <%= @message %> + {@message}

@@ -54,7 +54,7 @@ defmodule ClaperWeb.Component.Alert do x-transition >
-
+

- <%= @message %> + {@message}

diff --git a/lib/claper_web/views/components/input_component.ex b/lib/claper_web/views/components/input_component.ex index 9994328..6fdc869 100644 --- a/lib/claper_web/views/components/input_component.ex +++ b/lib/claper_web/views/components/input_component.ex @@ -3,6 +3,7 @@ defmodule ClaperWeb.Component.Input do Input component for forms """ use ClaperWeb, :view_component + use Gettext, backend: ClaperWeb.Gettext def text(assigns) do assigns = @@ -11,6 +12,10 @@ defmodule ClaperWeb.Component.Input do |> assign_new(:autofocus, fn -> false end) |> assign_new(:placeholder, fn -> false end) |> assign_new(:readonly, fn -> false end) + |> assign_new(:label, fn + %{required: false, name: name} -> ~s/#{name} #{gettext("(optional)")}/ + %{name: name} -> name + end) |> assign_new(:labelClass, fn -> "text-gray-700" end) |> assign_new(:fieldClass, fn -> "bg-white" end) |> assign_new(:value, fn -> input_value(assigns.form, assigns.key) end) @@ -19,9 +24,9 @@ defmodule ClaperWeb.Component.Input do ~H"""
- <%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> + {label(@form, @key, @label, class: "block text-sm font-medium #{@labelClass}")}
- <%= text_input(@form, @key, + {text_input(@form, @key, required: @required, readonly: @readonly, autofocus: @autofocus, @@ -31,11 +36,11 @@ defmodule ClaperWeb.Component.Input do minlength: @minlength, maxlength: @maxlength, class: - "#{@fieldClass} read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3" - ) %> + "#{@fieldClass} read-only:opacity-50 outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3" + )}
<%= if Keyword.has_key?(@form.errors, @key) do %> -

<%= error_tag(@form, @key) %>

+

{error_tag(@form, @key)}

<% end %>
""" @@ -54,9 +59,9 @@ defmodule ClaperWeb.Component.Input do ~H"""
- <%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> + {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
- <%= text_input(@form, @key, + {text_input(@form, @key, required: @required, readonly: @readonly, autofocus: @autofocus, @@ -64,11 +69,11 @@ defmodule ClaperWeb.Component.Input do autocomplete: @key, value: @value, class: - "#{@fieldClass} read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3" - ) %> + "#{@fieldClass} read-only:opacity-50 outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3" + )}
<%= if Keyword.has_key?(@form.errors, @key) do %> -

<%= error_tag(@form, @key) %>

+

{error_tag(@form, @key)}

<% end %>
""" @@ -85,24 +90,41 @@ defmodule ClaperWeb.Component.Input do ~H"""
- <%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> + {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
- <%= select(@form, @key, @array, + {select(@form, @key, @array, required: @required, autofocus: @autofocus, placeholder: @placeholder, autocomplete: @key, class: - "#{@fieldClass} outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3" - ) %> + "#{@fieldClass} outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3" + )}
<%= if Keyword.has_key?(@form.errors, @key) do %> -

<%= error_tag(@form, @key) %>

+

{error_tag(@form, @key)}

<% end %>
""" end + attr :form, Phoenix.HTML.Form, required: true + attr :key, :atom, required: true + attr :label, :string, default: nil + attr :labelClass, :string, default: nil + + def toggle(assigns) do + ~H""" +
+ {@label && + PhoenixHTMLHelpers.Form.label(@form, @key, @label, + class: ["block text-sm font-medium", @labelClass || "text-gray-700"] + )} + {PhoenixHTMLHelpers.Form.checkbox(@form, @key, class: "toggle")} +
+ """ + end + def check(assigns) do assigns = assigns @@ -115,7 +137,7 @@ defmodule ClaperWeb.Component.Input do disabled={@disabled} phx-value-key={@key} type="button" - class="group relative inline-flex h-5 w-10 flex-shrink-0 cursor-pointer items-center justify-center rounded-full" + class="group relative inline-flex h-5 w-10 shrink-0 cursor-pointer items-center justify-center rounded-full" role="switch" aria-checked="false" phx-key={@shortcut} @@ -150,13 +172,13 @@ defmodule ClaperWeb.Component.Input do disabled={@disabled} phx-value-key={@key} type="button" - class={"py-2 px-2 rounded #{if @checked, do: "bg-primary-500 hover:bg-primary-600 text-white", else: "bg-gray-200 hover:bg-gray-300 text-gray-600"} flex justify-between items-center w-full gap-x-2 disabled:opacity-50 disabled:cursor-not-allowed transition ease-in-out duration-300"} + class={"py-2 px-2 rounded-sm #{if @checked, do: "bg-primary-500 hover:bg-primary-600 text-white", else: "bg-gray-200 hover:bg-gray-300 text-gray-600"} flex justify-between items-center w-full gap-x-2 disabled:opacity-50 disabled:cursor-not-allowed transition ease-in-out duration-300"} role="switch" aria-checked="false" phx-key={@shortcut} phx-window-keydown={if @shortcut && not @disabled, do: checked(@checked, @key)} > - <%= render_slot(@inner_block) %> + {render_slot(@inner_block)} """ end @@ -198,17 +220,19 @@ defmodule ClaperWeb.Component.Input do |> assign_new(:autofocus, fn -> false end) |> assign_new(:placeholder, fn -> false end) |> assign_new(:readonly, fn -> false end) + |> assign_new(:labelClass, fn -> "text-gray-700" end) + |> assign_new(:fieldClass, fn -> "bg-white" end) ~H"""
- <%= label(@form, @key, @name, class: "block text-sm font-medium text-gray-700") %> + {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
code - <%= text_input(@form, @key, + {text_input(@form, @key, required: @required, readonly: @readonly, placeholder: @placeholder, @@ -217,11 +241,11 @@ defmodule ClaperWeb.Component.Input do minlength: 5, maxlength: 10, class: - "read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 pr-3 pl-9 uppercase" - ) %> + "#{@fieldClass} read-only:opacity-50 outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 pr-3 pl-9 uppercase" + )}
<%= if Keyword.has_key?(@form.errors, @key) do %> -

<%= error_tag(@form, @key) %>

+

{error_tag(@form, @key)}

<% end %>
""" @@ -234,24 +258,26 @@ defmodule ClaperWeb.Component.Input do |> assign_new(:autofocus, fn -> false end) |> assign_new(:placeholder, fn -> false end) |> assign_new(:readonly, fn -> false end) + |> assign_new(:labelClass, fn -> "text-gray-700" end) + |> assign_new(:fieldClass, fn -> "bg-white" end) ~H"""
- <%= label(@form, @key, @name, class: "block text-sm font-medium text-gray-700") %> + {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
- <%= hidden_input(@form, @key) %> - <%= text_input(@form, :local_date, + {hidden_input(@form, @key)} + {text_input(@form, :local_date, autofocus: @autofocus, placeholder: @placeholder, autocomplete: false, class: - "outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3 read-only:opacity-50" - ) %> + "#{@fieldClass} outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3 read-only:opacity-50" + )}
<%= if Keyword.has_key?(@form.errors, @key) do %> -

<%= error_tag(@form, @key) %>

+

{error_tag(@form, @key)}

<% end %>
@@ -265,15 +291,19 @@ defmodule ClaperWeb.Component.Input do |> assign_new(:autofocus, fn -> false end) |> assign_new(:readonly, fn -> false end) |> assign_new(:placeholder, fn -> false end) + |> assign_new(:label, fn + %{required: false, name: name} -> ~s/#{name} #{gettext("(optional)")}/ + %{name: name} -> name + end) |> assign_new(:labelClass, fn -> "text-gray-700" end) |> assign_new(:fieldClass, fn -> "bg-white" end) |> assign_new(:value, fn -> input_value(assigns.form, assigns.key) end) ~H"""
- <%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> + {label(@form, @key, @label, class: "block text-sm font-medium #{@labelClass}")}
- <%= email_input(@form, @key, + {email_input(@form, @key, required: @required, autofocus: @autofocus, placeholder: @placeholder, @@ -281,13 +311,13 @@ defmodule ClaperWeb.Component.Input do autocomplete: @key, value: @value, class: - "#{@fieldClass} read-only:opacity-50 shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-none rounded-md py-2 px-3", + "#{@fieldClass} read-only:opacity-50 shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-hidden rounded-md py-2 px-3", "x-model": "input", "x-ref": "input" - ) %> + )}
<%= if Keyword.has_key?(@form.errors, @key) do %> -

<%= error_tag(@form, @key) %>

+

{error_tag(@form, @key)}

<% end %>
""" @@ -305,20 +335,20 @@ defmodule ClaperWeb.Component.Input do ~H"""
- <%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> + {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
- <%= password_input(@form, @key, + {password_input(@form, @key, required: @required, autofocus: @autofocus, placeholder: @placeholder, class: - "#{@fieldClass} shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-none rounded-md py-2 px-3", + "#{@fieldClass} shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-hidden rounded-md py-2 px-3", "x-model": "input", "x-ref": "input" - ) %> + )}
<%= if Keyword.has_key?(@form.errors, @key) do %> -

<%= error_tag(@form, @key) %>

+

{error_tag(@form, @key)}

<% end %>
""" diff --git a/lib/claper_web/views/error_helpers.ex b/lib/claper_web/views/error_helpers.ex index c569245..f494420 100644 --- a/lib/claper_web/views/error_helpers.ex +++ b/lib/claper_web/views/error_helpers.ex @@ -3,18 +3,16 @@ defmodule ClaperWeb.ErrorHelpers do Conveniences for translating and building error messages. """ - import Phoenix.HTML.Form use PhoenixHTMLHelpers @doc """ Generates tag for inlined form input errors. """ def error_tag(form, field) do - Enum.map(Keyword.get_values(form.errors, field), fn error -> - content_tag(:span, translate_error(error), - class: "invalid-feedback", - phx_feedback_for: input_name(form, field) - ) + errors = if Phoenix.Component.used_input?(form[field]), do: form[field].errors, else: [] + + Enum.map(errors, fn error -> + content_tag(:span, translate_error(error), class: "invalid-feedback") end) end diff --git a/lib/claper_web/views/layout_view.ex b/lib/claper_web/views/layout_view.ex index 915811a..ef80821 100644 --- a/lib/claper_web/views/layout_view.ex +++ b/lib/claper_web/views/layout_view.ex @@ -24,6 +24,17 @@ defmodule ClaperWeb.LayoutView do end end + def get_section_path(conn) do + section = Enum.at(conn.path_info, 1) + + case section do + "users" -> ~p"/admin/users" + "events" -> ~p"/admin/events" + "oidc_providers" -> ~p"/admin/oidc_providers" + _ -> ~p"/admin" + end + end + def active_link(%Plug.Conn{} = conn, text, opts) do class = [opts[:class], active_class(conn, opts[:to])] diff --git a/lib/claper_web/views/leader_notifier_view.ex b/lib/claper_web/views/leader_notifier_view.ex index 3e97e5c..6c8a45f 100644 --- a/lib/claper_web/views/leader_notifier_view.ex +++ b/lib/claper_web/views/leader_notifier_view.ex @@ -1,5 +1,5 @@ defmodule ClaperWeb.LeaderNotifierView do use Phoenix.View, root: "lib/claper_web/templates" - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext use PhoenixHTMLHelpers end diff --git a/lib/claper_web/views/user_notifier_view.ex b/lib/claper_web/views/user_notifier_view.ex index 1a48574..539ab08 100644 --- a/lib/claper_web/views/user_notifier_view.ex +++ b/lib/claper_web/views/user_notifier_view.ex @@ -1,6 +1,6 @@ defmodule ClaperWeb.UserNotifierView do use Phoenix.View, root: "lib/claper_web/templates" - import ClaperWeb.Gettext + use Gettext, backend: ClaperWeb.Gettext import Phoenix.HTML use PhoenixHTMLHelpers end diff --git a/lib/utils/file_upload.ex b/lib/utils/file_upload.ex deleted file mode 100644 index fd8c4eb..0000000 --- a/lib/utils/file_upload.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule Utils.FileUpload do - import Mogrify - - def upload(type, path, old_path) when is_atom(type) do - remove_old_file(old_path) - - dest = - Path.join([ - :code.priv_dir(:claper), - "static", - "uploads", - Atom.to_string(type), - Path.basename(path) - ]) - - open(path) |> resize_to_fill("100x100") |> save(in_place: true) - File.cp!(path, dest) - "/uploads/#{Atom.to_string(type)}/#{Path.basename(dest)}" - end - - defp remove_old_file(old_path) do - if old_path do - old_file = Path.join([:code.priv_dir(:claper), "static", old_path]) - if File.exists?(old_file), do: File.rm(old_file) - end - end -end diff --git a/lib/utils/simple_s3_upload.ex b/lib/utils/simple_s3_upload.ex deleted file mode 100644 index b7d0af7..0000000 --- a/lib/utils/simple_s3_upload.ex +++ /dev/null @@ -1,127 +0,0 @@ -defmodule SimpleS3Upload do - @moduledoc """ - Dependency-free S3 Form Upload using HTTP POST sigv4 - - https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html - """ - - @doc """ - Signs a form upload. - - The configuration is a map which must contain the following keys: - - * `:region` - The AWS region, such as "us-east-1" - * `:access_key_id` - The AWS access key id - * `:secret_access_key` - The AWS secret access key - - - Returns a map of form fields to be used on the client via the JavaScript `FormData` API. - - ## Options - - * `:key` - The required key of the object to be uploaded. - * `:max_file_size` - The required maximum allowed file size in bytes. - * `:content_type` - The required MIME type of the file to be uploaded. - * `:expires_in` - The required expiration time in milliseconds from now - before the signed upload expires. - - ## Examples - - config = %{ - region: "us-east-1", - access_key_id: System.fetch_env!("AWS_ACCESS_KEY_ID"), - secret_access_key: System.fetch_env!("AWS_SECRET_ACCESS_KEY") - } - - {:ok, fields} = - SimpleS3Upload.sign_form_upload(config, "my-bucket", - key: "public/my-file-name", - content_type: "image/png", - max_file_size: 10_000, - expires_in: :timer.hours(1) - ) - - """ - def sign_form_upload(config, bucket, opts) do - key = Keyword.fetch!(opts, :key) - max_file_size = Keyword.fetch!(opts, :max_file_size) - content_type = Keyword.fetch!(opts, :content_type) - expires_in = Keyword.fetch!(opts, :expires_in) - - expires_at = DateTime.add(DateTime.utc_now(), expires_in, :millisecond) - amz_date = amz_date(expires_at) - credential = credential(config, expires_at) - - encoded_policy = - Base.encode64(""" - { - "expiration": "#{DateTime.to_iso8601(expires_at)}", - "conditions": [ - {"bucket": "#{bucket}"}, - ["eq", "$key", "#{key}"], - {"acl": "public-read"}, - ["eq", "$Content-Type", "#{content_type}"], - ["content-length-range", 0, #{max_file_size}], - {"x-amz-server-side-encryption": "AES256"}, - {"x-amz-credential": "#{credential}"}, - {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, - {"x-amz-date": "#{amz_date}"} - ] - } - """) - - fields = %{ - "key" => key, - "acl" => "public-read", - "content-type" => content_type, - "x-amz-server-side-encryption" => "AES256", - "x-amz-credential" => credential, - "x-amz-algorithm" => "AWS4-HMAC-SHA256", - "x-amz-date" => amz_date, - "policy" => encoded_policy, - "x-amz-signature" => signature(config, expires_at, encoded_policy) - } - - {:ok, fields} - end - - defp amz_date(time) do - time - |> NaiveDateTime.to_iso8601() - |> String.split(".") - |> List.first() - |> String.replace("-", "") - |> String.replace(":", "") - |> Kernel.<>("Z") - end - - defp credential(%{} = config, %DateTime{} = expires_at) do - "#{config.access_key_id}/#{short_date(expires_at)}/#{config.region}/s3/aws4_request" - end - - defp signature(config, %DateTime{} = expires_at, encoded_policy) do - config - |> signing_key(expires_at, "s3") - |> sha256(encoded_policy) - |> Base.encode16(case: :lower) - end - - defp signing_key(%{} = config, %DateTime{} = expires_at, service) when service in ["s3"] do - amz_date = short_date(expires_at) - %{secret_access_key: secret, region: region} = config - - ("AWS4" <> secret) - |> sha256(amz_date) - |> sha256(region) - |> sha256(service) - |> sha256("aws4_request") - end - - defp short_date(%DateTime{} = expires_at) do - expires_at - |> amz_date() - |> String.slice(0..7) - end - - defp sha256(secret, msg), do: :crypto.mac(:hmac, :sha256, secret, msg) -end diff --git a/mix.exs b/mix.exs index 5752f09..dadf816 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Claper.MixProject do use Mix.Project - @version "2.3.2" + @version "2.4.0" def project do [ @@ -76,47 +76,47 @@ defmodule Claper.MixProject do # Type `mix help deps` for examples and options. defp deps do [ - {:ex_aws, "~> 2.2"}, - {:ex_aws_s3, "~> 2.3"}, - {:ex_doc, "~> 0.32", only: :dev, runtime: false}, - {:bcrypt_elixir, "~> 2.0"}, + {:ex_aws, "~> 2.5"}, + {:ex_aws_s3, "~> 2.5"}, + {:ex_doc, "~> 0.38", only: :dev, runtime: false}, + {:bcrypt_elixir, "~> 3.3"}, {:phoenix, "~> 1.7"}, - {:phoenix_ecto, "~> 4.5"}, - {:ecto_sql, "~> 3.11"}, - {:postgrex, ">= 0.0.0"}, - {:phoenix_html, "~> 4.1"}, + {:phoenix_ecto, "~> 4.6"}, + {:ecto_sql, "~> 3.13"}, + {:postgrex, "~> 0.20.0"}, + {:phoenix_html, "~> 4.2"}, {:phoenix_html_helpers, "~> 1.0"}, - {:phoenix_live_reload, "~> 1.5.2", only: :dev}, - {:phoenix_live_view, "~> 0.20.14"}, + {:phoenix_live_reload, "~> 1.6", only: :dev}, + {:phoenix_live_view, "~> 1.0"}, {:phoenix_swoosh, "~> 1.2.1"}, {:phoenix_view, "~> 2.0"}, {:floki, ">= 0.36.1", only: :test}, {:phoenix_live_dashboard, "~> 0.8"}, - {:esbuild, "~> 0.2", runtime: Mix.env() == :dev}, + {:esbuild, "~> 0.10", runtime: Mix.env() == :dev}, {:dart_sass, "~> 0.7", runtime: Mix.env() == :dev}, - {:swoosh, "~> 1.12"}, - {:finch, "~> 0.16"}, - {:telemetry_metrics, "~> 0.6"}, - {:telemetry_poller, "~> 1.0"}, - {:gettext, "~> 0.18"}, - {:jason, "~> 1.2"}, - {:sweet_xml, "~> 0.7.1"}, - {:plug_cowboy, "~> 2.5"}, - {:hashids, "~> 2.0"}, - {:mogrify, "~> 0.9.1"}, - {:libcluster, "~> 3.3"}, + {:swoosh, "~> 1.19"}, + {:finch, "~> 0.19"}, + {:telemetry_metrics, "~> 1.1"}, + {:telemetry_poller, "~> 1.2"}, + {:gettext, "~> 0.26"}, + {:jason, "~> 1.4"}, + {:sweet_xml, "~> 0.7"}, + {:plug_cowboy, "~> 2.7"}, + {:hashids, "~> 2.1"}, + {:libcluster, "~> 3.5"}, {:porcelain, "~> 2.0"}, - {:hackney, "~> 1.18"}, - {:csv, "~> 3.0"}, + {:hackney, "~> 1.24"}, + {:csv, "~> 3.2"}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, - {:joken, "~> 2.6.1"}, + {:joken, "~> 2.6"}, {:jose, "~> 1.11"}, - {:req, "~> 0.5.0"}, + {:req, "~> 0.5"}, {:uuid, "~> 1.1"}, - {:oidcc, "~> 3.2"}, - {:oban, "~> 2.17"}, - {:mua, "~> 0.2.4"}, - {:mail, "~> 0.4.3"} + {:oidcc, "~> 3.5"}, + {:oban, "~> 2.19"}, + {:mua, "~> 0.2"}, + {:mail, "~> 0.5"}, + {:tailwind, "~> 0.3", runtime: Mix.env() == :dev} ] end @@ -133,15 +133,12 @@ defmodule Claper.MixProject do "ecto.reset": ["ecto.drop", "ecto.setup"], test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"], "assets.deploy": [ - "cmd --cd assets npm install && npm run deploy", + "cmd --cd assets npm install", + "tailwind default --minify", + "tailwind admin --minify", "esbuild default --minify", "sass default --no-source-map --style=compressed", "phx.digest" - ], - "assets.deploy.nosass": [ - "cmd --cd assets npm install && npm run deploy", - "esbuild default --minify", - "phx.digest" ] ] end diff --git a/mix.lock b/mix.lock index eab21ec..595e357 100644 --- a/mix.lock +++ b/mix.lock @@ -1,94 +1,94 @@ %{ - "bcrypt_elixir": {:hex, :bcrypt_elixir, "2.3.1", "5114d780459a04f2b4aeef52307de23de961b69e13a5cd98a911e39fda13f420", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "42182d5f46764def15bf9af83739e3bf4ad22661b1c34fc3e88558efced07279"}, + "bcrypt_elixir": {:hex, :bcrypt_elixir, "3.3.2", "d50091e3c9492d73e17fc1e1619a9b09d6a5ef99160eb4d736926fd475a16ca3", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "471be5151874ae7931911057d1467d908955f93554f7a6cd1b7d804cac8cef53"}, "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, - "castore": {:hex, :castore, "1.0.10", "43bbeeac820f16c89f79721af1b3e092399b3a1ecc8df1a472738fd853574911", [:mix], [], "hexpm", "1b0b7ea14d889d9ea21202c43a4fa015eb913021cb535e8ed91946f4b77a8848"}, - "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"}, + "castore": {:hex, :castore, "1.0.14", "4582dd7d630b48cf5e1ca8d3d42494db51e406b7ba704e81fbd401866366896a", [:mix], [], "hexpm", "7bc1b65249d31701393edaaac18ec8398d8974d52c647b7904d01b964137b9f4"}, + "certifi": {:hex, :certifi, "2.15.0", "0e6e882fcdaaa0a5a9f2b3db55b1394dba07e8d6d9bcad08318fb604c6839712", [:rebar3], [], "hexpm", "b147ed22ce71d72eafdad94f055165c1c182f61a2ff49df28bcc71d1d5b94a60"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, - "comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"}, + "comeonin": {:hex, :comeonin, "5.5.1", "5113e5f3800799787de08a6e0db307133850e635d34e9fab23c70b6501669510", [:mix], [], "hexpm", "65aac8f19938145377cee73973f192c5645873dcf550a8a6b18187d17c13ccdb"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"}, + "cowboy": {:hex, :cowboy, "2.13.0", "09d770dd5f6a22cc60c071f432cd7cb87776164527f205c5a6b0f24ff6b38990", [:make, :rebar3], [{:cowlib, ">= 2.14.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "e724d3a70995025d654c1992c7b11dbfea95205c047d86ff9bf1cda92ddc5614"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, - "cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"}, - "credo": {:hex, :credo, "1.7.7", "771445037228f763f9b2afd612b6aa2fd8e28432a95dbbc60d8e03ce71ba4446", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8bc87496c9aaacdc3f90f01b7b0582467b69b4bd2441fe8aae3109d843cc2f2e"}, - "csv": {:hex, :csv, "3.0.5", "3c1455127e92de8845806db89554ad7d45e0212974be41dd9c38a5c881861713", [:mix], [], "hexpm", "cbbe5455c93df5f3f2943e995e28b7a8808361ba34cf3e44267d77a01eaf1609"}, + "cowlib": {:hex, :cowlib, "2.15.0", "3c97a318a933962d1c12b96ab7c1d728267d2c523c25a5b57b0f93392b6e9e25", [:make, :rebar3], [], "hexpm", "4f00c879a64b4fe7c8fcb42a4281925e9ffdb928820b03c3ad325a617e857532"}, + "credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"}, + "csv": {:hex, :csv, "3.2.2", "452f96414b39a176b7c390af6d8b78f15130dc6167fe3b836729131f515d843e", [:mix], [], "hexpm", "cbf256ff74a3fa01d9ec420d07b19c90d410ed9fe5b6d6e1bc7662edf35bc574"}, "dart_sass": {:hex, :dart_sass, "0.7.0", "7979e056cb74fd6843e1c72db763cffc7726a9192a657735b7d24c0d9c26a1ce", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "4a8e70bca41aa00846398abdf5ad8a64d7907a0f7bf40145cd2e40d5971629f2"}, - "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, + "db_connection": {:hex, :db_connection, "2.8.0", "64fd82cfa6d8e25ec6660cea73e92a4cbc6a18b31343910427b702838c4b33b2", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "008399dae5eee1bf5caa6e86d204dcb44242c82b1ed5e22c881f2c34da201b15"}, "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, - "ecto": {:hex, :ecto, "3.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"}, - "ecto_sql": {:hex, :ecto_sql, "3.11.1", "e9abf28ae27ef3916b43545f9578b4750956ccea444853606472089e7d169470", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ce14063ab3514424276e7e360108ad6c2308f6d88164a076aac8a387e1fea634"}, - "elixir_make": {:hex, :elixir_make, "0.7.6", "67716309dc5d43e16b5abbd00c01b8df6a0c2ab54a8f595468035a50189f9169", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5a0569756b0f7873a77687800c164cca6dfc03a09418e6fcf853d78991f49940"}, - "esbuild": {:hex, :esbuild, "0.7.0", "ce3afb13cd2c5fd63e13c0e2d0e0831487a97a7696cfa563707342bb825d122a", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "4ae9f4f237c5ebcb001390b8ada65a12fb2bb04f3fe3d1f1692b7a06fbfe8752"}, - "ex_aws": {:hex, :ex_aws, "2.5.8", "0393cfbc5e4a9e7017845451a015d836a670397100aa4c86901980e2a2c5f7d4", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8f79777b7932168956c8cc3a6db41f5783aa816eb50de356aed3165a71e5f8c3"}, - "ex_aws_s3": {:hex, :ex_aws_s3, "2.4.0", "ce8decb6b523381812798396bc0e3aaa62282e1b40520125d1f4eff4abdff0f4", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "85dda6e27754d94582869d39cba3241d9ea60b6aa4167f9c88e309dc687e56bb"}, - "ex_doc": {:hex, :ex_doc, "0.32.1", "21e40f939515373bcdc9cffe65f3b3543f05015ac6c3d01d991874129d173420", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "5142c9db521f106d61ff33250f779807ed2a88620e472ac95dc7d59c380113da"}, - "expo": {:hex, :expo, "0.5.2", "beba786aab8e3c5431813d7a44b828e7b922bfa431d6bfbada0904535342efe2", [:mix], [], "hexpm", "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"}, - "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, + "ecto": {:hex, :ecto, "3.13.2", "7d0c0863f3fc8d71d17fc3ad3b9424beae13f02712ad84191a826c7169484f01", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "669d9291370513ff56e7b7e7081b7af3283d02e046cf3d403053c557894a0b3e"}, + "ecto_sql": {:hex, :ecto_sql, "3.13.2", "a07d2461d84107b3d037097c822ffdd36ed69d1cf7c0f70e12a3d1decf04e2e1", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.13.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "539274ab0ecf1a0078a6a72ef3465629e4d6018a3028095dc90f60a19c371717"}, + "elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"}, + "esbuild": {:hex, :esbuild, "0.10.0", "b0aa3388a1c23e727c5a3e7427c932d89ee791746b0081bbe56103e9ef3d291f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "468489cda427b974a7cc9f03ace55368a83e1a7be12fba7e30969af78e5f8c70"}, + "ex_aws": {:hex, :ex_aws, "2.5.10", "d3f8ca8959dad6533a2a934dfdf380df1b1bef425feeb215a47a5176dee8736c", [:mix], [{:configparser_ex, "~> 5.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "88fcd9cc1b2e0fcea65106bdaa8340ac56c6e29bf72f46cf7ef174027532d3da"}, + "ex_aws_s3": {:hex, :ex_aws_s3, "2.5.7", "e571424d2f345299753382f3a01b005c422b1a460a8bc3ed47659b3d3ef91e9e", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "858e51241e50181e29aa2bc128fef548873a3a9cd580471f57eda5b64dec937f"}, + "ex_doc": {:hex, :ex_doc, "0.38.2", "504d25eef296b4dec3b8e33e810bc8b5344d565998cd83914ffe1b8503737c02", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "732f2d972e42c116a70802f9898c51b54916e542cc50968ac6980512ec90f42b"}, + "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, + "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, - "floki": {:hex, :floki, "0.36.1", "712b7f2ba19a4d5a47dfe3e74d81876c95bbcbee44fe551f0af3d2a388abb3da", [:mix], [], "hexpm", "21ba57abb8204bcc70c439b423fc0dd9f0286de67dc82773a14b0200ada0995f"}, + "floki": {:hex, :floki, "0.38.0", "62b642386fa3f2f90713f6e231da0fa3256e41ef1089f83b6ceac7a3fd3abf33", [:mix], [], "hexpm", "a5943ee91e93fb2d635b612caf5508e36d37548e84928463ef9dd986f0d1abd9"}, "gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"}, - "gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"}, - "hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~>2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"}, + "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, + "hackney": {:hex, :hackney, "1.24.1", "f5205a125bba6ed4587f9db3cc7c729d11316fa8f215d3e57ed1c067a9703fa9", [:rebar3], [{:certifi, "~> 2.15.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.4", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "f4a7392a0b53d8bbc3eb855bdcc919cd677358e65b2afd3840b5b3690c4c8a39"}, "hashids": {:hex, :hashids, "2.1.0", "aabbcc4f9fa0b460cc6ef629f5bcbc35e7e87b382fee79f9c50be40b86574288", [:mix], [], "hexpm", "172163b1642d415881ef1c6e1f1be12d4e92b0711d5bbbd8854f82a1ce32d60b"}, "honeybadger": {:hex, :honeybadger, "0.18.1", "f61f71147d9e6ce8cdc6114e5df5eed4d2daa32dd15308267a1dacf5fa88b1e9", [:mix], [{:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:hackney, "~> 1.1", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.0.0 and < 2.0.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:plug, ">= 1.0.0 and < 2.0.0", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "693e14b1b7d254dd75f977240c208d6b69cc1cbdd515bdd5b8b1738a1baf5fd5"}, - "hpax": {:hex, :hpax, "1.0.2", "762df951b0c399ff67cc57c3995ec3cf46d696e41f0bba17da0518d94acd4aac", [:mix], [], "hexpm", "2f09b4c1074e0abd846747329eaa26d535be0eb3d189fa69d812bfb8bfefd32f"}, + "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, "httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"}, - "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, + "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, - "joken": {:hex, :joken, "2.6.1", "2ca3d8d7f83bf7196296a3d9b2ecda421a404634bfc618159981a960020480a1", [:mix], [{:jose, "~> 1.11.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "ab26122c400b3d254ce7d86ed066d6afad27e70416df947cdcb01e13a7382e68"}, + "joken": {:hex, :joken, "2.6.2", "5daaf82259ca603af4f0b065475099ada1b2b849ff140ccd37f4b6828ca6892a", [:mix], [{:jose, "~> 1.11.10", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "5134b5b0a6e37494e46dbf9e4dad53808e5e787904b7c73972651b51cce3d72b"}, "jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"}, - "libcluster": {:hex, :libcluster, "3.3.2", "84c6ebfdc72a03805955abfb5ff573f71921a3e299279cc3445445d5af619ad1", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8b691ce8185670fc8f3fc0b7ed59eff66c6889df890d13411f8f1a0e6871d8a5"}, + "libcluster": {:hex, :libcluster, "3.5.0", "5ee4cfde4bdf32b2fef271e33ce3241e89509f4344f6c6a8d4069937484866ba", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebf6561fcedd765a4cd43b4b8c04b1c87f4177b5fb3cbdfe40a780499d72f743"}, "lti_1p3": {:hex, :lti_1p3, "0.6.0", "e896c56b0ae067b768fb5ce2c44db305b6d7bbc213fafd1bbb7da586629c6d9f", [:mix], [{:httpoison, "~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: false]}, {:joken, "~> 2.2.0", [hex: :joken, repo: "hexpm", optional: false]}, {:timex, "~> 3.5", [hex: :timex, repo: "hexpm", optional: false]}, {:uuid, "~> 1.1", [hex: :uuid, repo: "hexpm", optional: false]}], "hexpm", "7c142ae8027913bbaa2267a28f448e734b1c5b2563e2aee2b1481632b84e35b3"}, "lti_1p3_ecto_provider": {:hex, :lti_1p3_ecto_provider, "0.6.0", "7d8f3293b2dd32c243a55b5020ff0e37c5372ba8669bf82944b173d65f22a8e3", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:httpoison, "~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:lti_1p3, "~> 0.6.0", [hex: :lti_1p3, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:timex, "~> 3.5", [hex: :timex, repo: "hexpm", optional: false]}, {:uuid, "~> 1.1", [hex: :uuid, repo: "hexpm", optional: false]}], "hexpm", "b825e745ccd4dfb840bf1217056f535dd1c50ecbe673917c3b17efc4a64246d1"}, - "mail": {:hex, :mail, "0.4.3", "16df84500780980826d9b52059d24c08fdd75c98f178a7a7ea809ea83fb70542", [:mix], [], "hexpm", "164975550b977e47cab431c403b0e90c8ce542036d32c7189b83839d8d7d391b"}, - "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"}, + "mail": {:hex, :mail, "0.5.1", "6383a61620aea24675c96e34b9019dede1bfc9a37ee10ce5a5cafcc7c5e48743", [:mix], [], "hexpm", "595144340b74f23d651ea2b4a72a896819940478d7425dfa302ea3b5c9041ec9"}, + "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, + "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, - "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, - "mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"}, - "mogrify": {:hex, :mogrify, "0.9.2", "b360984adea7dd6a55f18028e6327973c58de7f548fdb86c9859848aa904d5b0", [:mix], [], "hexpm", "c18d10fd70ca20e2585301616c89f6e4f7159d92efc9cc8ee579e00c886f699d"}, + "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, + "mimerl": {:hex, :mimerl, "1.4.0", "3882a5ca67fbbe7117ba8947f27643557adec38fa2307490c4c4207624cb213b", [:rebar3], [], "hexpm", "13af15f9f68c65884ecca3a3891d50a7b57d82152792f3e19d88650aa126b144"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "mua": {:hex, :mua, "0.2.4", "a9172ab0a1ac8732cf2699d739ceac3febcb9b4ffc540260ad2e32c0b6632af9", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "e7e4dacd5ad65f13e3542772e74a159c00bd2d5579e729e9bb72d2c73a266fb7"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, - "oban": {:hex, :oban, "2.18.3", "1608c04f8856c108555c379f2f56bc0759149d35fa9d3b825cb8a6769f8ae926", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "36ca6ca84ef6518f9c2c759ea88efd438a3c81d667ba23b02b062a0aa785475e"}, - "oidcc": {:hex, :oidcc, "3.2.0", "f80a4826a946ce07dc8cbd8212392b4ff436ae3c4b4cd6680fa0d84d0ff2fec1", [:mix, :rebar3], [{:jose, "~> 1.11", [hex: :jose, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.2", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_registry, "~> 0.3.1", [hex: :telemetry_registry, repo: "hexpm", optional: false]}], "hexpm", "38fd9092ab5d5d10c71b8011b019316411afe466bef07ba57f57ec3f919278c3"}, + "oban": {:hex, :oban, "2.19.4", "045adb10db1161dceb75c254782f97cdc6596e7044af456a59decb6d06da73c1", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5fcc6219e6464525b808d97add17896e724131f498444a292071bf8991c99f97"}, + "oidcc": {:hex, :oidcc, "3.5.2", "91b0097a3fee86abb1aabfd80f2f910439688287408d916fed3535724b4fb897", [:mix, :rebar3], [{:igniter, "~> 0.5.50", [hex: :igniter, repo: "hexpm", optional: true]}, {:jose, "~> 1.11", [hex: :jose, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.2", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_registry, "~> 0.3.1", [hex: :telemetry_registry, repo: "hexpm", optional: false]}], "hexpm", "474e7eddbf90ec4c8c50aeefe9a1ffb46ced72e6a11c2bb0c6eece9794821c2a"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, - "phoenix": {:hex, :phoenix, "1.7.11", "1d88fc6b05ab0c735b250932c4e6e33bfa1c186f76dcf623d8dd52f07d6379c7", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "b1ec57f2e40316b306708fe59b92a16b9f6f4bf50ccfa41aa8c7feb79e0ec02a"}, - "phoenix_ecto": {:hex, :phoenix_ecto, "4.5.1", "6fdbc334ea53620e71655664df6f33f670747b3a7a6c4041cdda3e2c32df6257", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ebe43aa580db129e54408e719fb9659b7f9e0d52b965c5be26cdca416ecead28"}, - "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, + "phoenix": {:hex, :phoenix, "1.7.21", "14ca4f1071a5f65121217d6b57ac5712d1857e40a0833aff7a691b7870fc9a3b", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "336dce4f86cba56fed312a7d280bf2282c720abb6074bdb1b61ec8095bdd0bc9"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.5", "c4ef322acd15a574a8b1a08eff0ee0a85e73096b53ce1403b6563709f15e1cea", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "26ec3208eef407f31b748cadd044045c6fd485fbff168e35963d2f9dfff28d4b"}, + "phoenix_html": {:hex, :phoenix_html, "4.2.1", "35279e2a39140068fc03f8874408d58eef734e488fc142153f055c5454fd1c08", [:mix], [], "hexpm", "cff108100ae2715dd959ae8f2a8cef8e20b593f8dfd031c9cba92702cf23e053"}, "phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"}, - "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.3", "7ff51c9b6609470f681fbea20578dede0e548302b0c8bdf338b5a753a4f045bf", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"}, - "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.2", "354460993a480656b71c3887f5565f612b3bdbdd8688c83f9e6f512307067dd4", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "2bb3722f327e14a7aa47b1acf27ed633c8cd27b167e18b8237954b9b4804af39"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.14", "70fa101aa0539e81bed4238777498f6215e9dda3461bdaa067cad6908110c364", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "82f6d006c5264f979ed5eb75593d808bbe39020f20df2e78426f4f2d570e2402"}, + "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.7", "405880012cb4b706f26dd1c6349125bfc903fb9e44d1ea668adaf4e04d4884b7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "3a8625cab39ec261d48a13b7468dc619c0ede099601b084e343968309bd4d7d7"}, + "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.6.0", "2791fac0e2776b640192308cc90c0dbcf67843ad51387ed4ecae2038263d708d", [:mix], [{:file_system, "~> 0.2.10 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b3a1fa036d7eb2f956774eda7a7638cf5123f8f2175aca6d6420a7f95e598e1c"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "1.0.17", "beeb16d83a7d3760f7ad463df94e83b087577665d2acc0bf2987cd7d9778068f", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0 or ~> 1.8.0-rc", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a4ca05c1eb6922c4d07a508a75bfa12c45e5f4d8f77ae83283465f02c53741e1"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.1", "b74ccaa8046fbc388a62134360ee7d9742d5a8ae74063f34eb050279de7a99e1", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "4000eeba3f9d7d1a6bf56d2bd56733d5cadf41a7f0d8ffe5bb67e7d667e204a2"}, "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, - "phoenix_view": {:hex, :phoenix_view, "2.0.3", "4d32c4817fce933693741deeb99ef1392619f942633dde834a5163124813aad3", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "cd34049af41be2c627df99cd4eaa71fc52a328c0c3d8e7d4aa28f880c30e7f64"}, - "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.7.2", "fdadb973799ae691bf9ecad99125b16625b1c6039999da5fe544d99218e662e4", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "245d8a11ee2306094840c000e8816f0cbed69a23fc0ac2bcf8d7835ae019bb2f"}, - "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, + "phoenix_view": {:hex, :phoenix_view, "2.0.4", "b45c9d9cf15b3a1af5fb555c674b525391b6a1fe975f040fb4d913397b31abf4", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "4e992022ce14f31fe57335db27a28154afcc94e9983266835bb3040243eb620b"}, + "plug": {:hex, :plug, "1.18.1", "5067f26f7745b7e31bc3368bc1a2b818b9779faa959b49c934c17730efc911cf", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "57a57db70df2b422b564437d2d33cf8d33cd16339c1edb190cd11b1a3a546cc2"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.7.4", "729c752d17cf364e2b8da5bdb34fb5804f56251e88bb602aff48ae0bd8673d11", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9b85632bd7012615bae0a5d70084deb1b25d2bcbb32cab82d1e9a1e023168aa3"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, "porcelain": {:hex, :porcelain, "2.0.3", "2d77b17d1f21fed875b8c5ecba72a01533db2013bd2e5e62c6d286c029150fdc", [:mix], [], "hexpm", "dc996ab8fadbc09912c787c7ab8673065e50ea1a6245177b0c24569013d23620"}, - "postgrex": {:hex, :postgrex, "0.17.5", "0483d054938a8dc069b21bdd636bf56c487404c241ce6c319c1f43588246b281", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "50b8b11afbb2c4095a3ba675b4f055c416d0f3d7de6633a595fc131a828a67eb"}, - "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, - "req": {:hex, :req, "0.5.8", "50d8d65279d6e343a5e46980ac2a70e97136182950833a1968b371e753f6a662", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "d7fc5898a566477e174f26887821a3c5082b243885520ee4b45555f5d53f40ef"}, + "postgrex": {:hex, :postgrex, "0.20.0", "363ed03ab4757f6bc47942eff7720640795eb557e1935951c1626f0d303a3aed", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "d36ef8b36f323d29505314f704e21a1a038e2dc387c6409ee0cd24144e187c0f"}, + "ranch": {:hex, :ranch, "2.2.0", "25528f82bc8d7c6152c57666ca99ec716510fe0925cb188172f41ce93117b1b0", [:make, :rebar3], [], "hexpm", "fa0b99a1780c80218a4197a59ea8d3bdae32fbff7e88527d7d8a4787eff4f8e7"}, + "req": {:hex, :req, "0.5.14", "521b449fa0bf275e6d034c05f29bec21789a0d6cd6f7a1c326c7bee642bf6e07", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "b7b15692071d556c73432c7797aa7e96b51d1a2db76f746b976edef95c930021"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "stripity_stripe": {:hex, :stripity_stripe, "2.13.0", "b9ea806fcf46e85232b75f2145c34770b17faa44c59cdd13ff493aaa6e84b4a9", [:mix], [{:hackney, "~> 1.15", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}, {:uri_query, "~> 0.1.2", [hex: :uri_query, repo: "hexpm", optional: false]}], "hexpm", "d6931ed9816552320f95428fd997edf15e99a913ca78fc4342d5516b98f42476"}, - "sweet_xml": {:hex, :sweet_xml, "0.7.4", "a8b7e1ce7ecd775c7e8a65d501bc2cd933bff3a9c41ab763f5105688ef485d08", [:mix], [], "hexpm", "e7c4b0bdbf460c928234951def54fe87edf1a170f6896675443279e2dbeba167"}, - "swoosh": {:hex, :swoosh, "1.17.5", "14910d267a2633d4335917b37846e376e2067815601592629366c39845dad145", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "629113d477bc82c4c3bffd15a25e8becc1c7ccc0f0e67743b017caddebb06f04"}, + "sweet_xml": {:hex, :sweet_xml, "0.7.5", "803a563113981aaac202a1dbd39771562d0ad31004ddbfc9b5090bdcd5605277", [:mix], [], "hexpm", "193b28a9b12891cae351d81a0cead165ffe67df1b73fe5866d10629f4faefb12"}, + "swoosh": {:hex, :swoosh, "1.19.3", "02ad4455939f502386e4e1443d4de94c514995fd0e51b3cafffd6bd270ffe81c", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "04a10f8496786b744b84130e3510eb53ca51e769c39511b65023bdf4136b732f"}, + "tailwind": {:hex, :tailwind, "0.3.1", "a89d2835c580748c7a975ad7dd3f2ea5e63216dc16d44f9df492fbd12c094bed", [:mix], [], "hexpm", "98a45febdf4a87bc26682e1171acdedd6317d0919953c353fcd1b4f9f4b676a2"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, - "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"}, - "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.2.0", "ba82e333215aed9dd2096f93bd1d13ae89d249f82760fcada0850ba33bac154b", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7216e21a6c326eb9aa44328028c34e9fd348fb53667ca837be59d0aa2a0156e8"}, "telemetry_registry": {:hex, :telemetry_registry, "0.3.2", "701576890320be6428189bff963e865e8f23e0ff3615eade8f78662be0fc003c", [:mix, :rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7ed191eb1d115a3034af8e1e35e4e63d5348851d556646d46ca3d1b4e16bab9"}, "timex": {:hex, :timex, "3.7.11", "bb95cb4eb1d06e27346325de506bcc6c30f9c6dea40d1ebe390b262fad1862d1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.20", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8b9024f7efbabaf9bd7aa04f65cf8dcd7c9818ca5737677c7b76acbc6a94d1aa"}, "tls_certificate_check": {:hex, :tls_certificate_check, "1.25.0", "702b1835fe718a52310509537392abd067dbe941ebc05fe72409d2b2f8061651", [:rebar3], [{:ssl_verify_fun, "~> 1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "167343ccf50538cf2faf61a3f1460e749b3edf2ecef55516af2b5834362abcb1"}, "tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.1", "a48703a25c170eedadca83b11e88985af08d35f37c6f664d6dcfb106a97782fc", [:rebar3], [], "hexpm", "b3a917854ce3ae233619744ad1e0102e05673136776fb2fa76234f3e03b23642"}, "uri_query": {:hex, :uri_query, "0.1.2", "ae35b83b472f3568c2c159eee3f3ccf585375d8a94fb5382db1ea3589e75c3b4", [:mix], [], "hexpm", "e3bc81816c98502c36498b9b2f239b89c71ce5eadfff7ceb2d6c0a2e6ae2ea0c"}, "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, - "websock_adapter": {:hex, :websock_adapter, "0.5.6", "0437fe56e093fd4ac422de33bf8fc89f7bc1416a3f2d732d8b2c8fd54792fe60", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"}, } diff --git a/phoenix_static_buildpack.config b/phoenix_static_buildpack.config deleted file mode 100644 index 0ce5c5f..0000000 --- a/phoenix_static_buildpack.config +++ /dev/null @@ -1 +0,0 @@ -node_version=14.19.0 diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index a4c5286..98ae3a9 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -8,15 +8,18 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: lib/claper_web/live/event_live/manage.html.heex:1457 -#: lib/claper_web/live/event_live/manage.html.heex:1463 +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 #: lib/claper_web/live/user_settings_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Settings" msgstr "Einstellungen" -#: lib/claper_web/live/event_live/manage.ex:815 -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:34 #: lib/claper_web/templates/user_registration/new.html.heex:29 #: lib/claper_web/templates/user_reset_password/new.html.heex:28 @@ -43,7 +46,10 @@ msgstr "Überprüfen Sie, ob alle Felder korrekt ausgefüllt sind." msgid "Change" msgstr "Ändern" -#: lib/claper_web/live/event_live/event_form_component.html.heex:287 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 #, elixir-autogen, elixir-format msgid "Code" msgstr "Code" @@ -54,7 +60,7 @@ msgstr "Code" msgid "Email address" msgstr "E-Mail Adresse" -#: lib/claper_web/templates/layout/_user_menu.html.heex:16 +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 #, elixir-autogen, elixir-format msgid "Logout" msgstr "Ausloggen" @@ -97,15 +103,18 @@ msgstr "Seien Sie der Erste, der reagiert!" #: lib/claper_web/live/event_live/event_card_component.ex:111 #: lib/claper_web/live/event_live/join.ex:41 #: lib/claper_web/live/event_live/join.html.heex:94 -#: lib/claper_web/live/event_live/manage.html.heex:493 +#: lib/claper_web/live/event_live/manage.html.heex:492 #: lib/claper_web/live/event_live/show.html.heex:286 #, elixir-autogen, elixir-format msgid "Join" msgstr "Teilnehmen" -#: lib/claper_web/live/event_live/index.ex:212 +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 #: lib/claper_web/live/event_live/join.html.heex:31 #: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 #, elixir-autogen, elixir-format msgid "Dashboard" msgstr "Dashboard" @@ -122,7 +131,7 @@ msgid "seconds" msgstr "Sekunden" #: lib/claper_web/live/event_live/event_card_component.ex:60 -#: lib/claper_web/live/event_live/index.html.heex:186 +#: lib/claper_web/live/event_live/index.html.heex:187 #, elixir-autogen, elixir-format msgid "Finished" msgstr "Beendet" @@ -175,47 +184,50 @@ msgstr "Zurück zur Startseite" msgid "Created successfully" msgstr "Erfolgreich erstellt" +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 #: lib/claper_web/live/event_live/event_card_component.ex:250 #: lib/claper_web/live/event_live/event_card_component.ex:330 #: lib/claper_web/live/event_live/form_component.ex:97 -#: lib/claper_web/live/event_live/index.ex:193 +#: lib/claper_web/live/event_live/index.ex:204 #, elixir-autogen, elixir-format msgid "Edit" msgstr "Ändern" -#: lib/claper_web/live/embed_live/form_component.html.heex:69 +#: lib/claper_web/live/embed_live/form_component.html.heex:63 #: lib/claper_web/live/event_live/event_form_component.html.heex:55 #: lib/claper_web/live/event_live/event_form_component.html.heex:62 -#: lib/claper_web/live/event_live/index.ex:202 -#: lib/claper_web/live/event_live/index.html.heex:93 -#: lib/claper_web/live/form_live/form_component.html.heex:98 -#: lib/claper_web/live/poll_live/form_component.html.heex:106 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 #, elixir-autogen, elixir-format msgid "Create" msgstr "Erstellen" -#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#: lib/claper_web/live/embed_live/form_component.html.heex:68 #: lib/claper_web/live/event_live/event_card_component.ex:444 #: lib/claper_web/live/event_live/event_form_component.html.heex:67 -#: lib/claper_web/live/event_live/manage.html.heex:1405 +#: lib/claper_web/live/event_live/manage.html.heex:1397 #: lib/claper_web/live/event_live/manageable_post_component.ex:92 #: lib/claper_web/live/event_live/post_component.ex:70 #: lib/claper_web/live/event_live/post_component.ex:142 -#: lib/claper_web/live/form_live/form_component.html.heex:103 -#: lib/claper_web/live/poll_live/form_component.html.heex:111 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:129 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:199 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 #, elixir-autogen, elixir-format msgid "Delete" msgstr "Löschen" -#: lib/claper_web/live/embed_live/form_component.html.heex:70 +#: lib/claper_web/live/embed_live/form_component.html.heex:64 #: lib/claper_web/live/event_live/event_form_component.html.heex:54 #: lib/claper_web/live/event_live/event_form_component.html.heex:61 -#: lib/claper_web/live/form_live/form_component.html.heex:99 -#: lib/claper_web/live/poll_live/form_component.html.heex:107 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:194 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 #: lib/claper_web/live/user_settings_live/show.html.heex:38 #: lib/claper_web/live/user_settings_live/show.html.heex:80 #: lib/claper_web/live/user_settings_live/show.html.heex:123 @@ -259,12 +271,6 @@ msgstr "Email-Einweisung ändern" msgid "CONFIRM EMAIL" msgstr "E-MAIL BESTÄTIGEN" -#: lib/claper_web/templates/user_notifier/change.html.heex:17 -#, elixir-autogen, elixir-format -msgid "Confirm email" -msgstr "E-Mail bestätigen" - -#: lib/claper_web/templates/user_notifier/change.html.heex:32 #: lib/claper_web/templates/user_notifier/confirm.html.heex:32 #: lib/claper_web/templates/user_notifier/magic.html.heex:32 #: lib/claper_web/templates/user_notifier/reset.html.heex:32 @@ -295,9 +301,9 @@ msgid "Presentation uploaded" msgstr "Präsentation hochgeladen" #: lib/claper_web/live/event_live/event_form_component.html.heex:163 -#: lib/claper_web/live/event_live/event_form_component.html.heex:241 -#: lib/claper_web/live/event_live/event_form_component.html.heex:369 -#: lib/claper_web/live/event_live/event_form_component.html.heex:393 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 #, elixir-autogen, elixir-format msgid "Remove" msgstr "Entfernen" @@ -332,17 +338,17 @@ msgstr "Ihre Datei ist zu groß" msgid "Change file" msgstr "Datei ändern" -#: lib/claper_web/live/event_live/event_form_component.html.heex:228 +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 #, elixir-autogen, elixir-format msgid "Presentation replaced" msgstr "Präsentation ersetzt" -#: lib/claper_web/live/event_live/manage.html.heex:306 +#: lib/claper_web/live/event_live/manage.html.heex:305 #, elixir-autogen, elixir-format msgid "Edit poll" msgstr "Umfrage bearbeiten" -#: lib/claper_web/live/event_live/manage.html.heex:305 +#: lib/claper_web/live/event_live/manage.html.heex:304 #, elixir-autogen, elixir-format msgid "New poll" msgstr "Neue Umfrage" @@ -357,18 +363,18 @@ msgstr "Titel Ihrer Umfrage" msgid "Upload failed" msgstr "Hochladen fehlgeschlagen" -#: lib/claper_web/live/event_live/manage.html.heex:198 +#: lib/claper_web/live/event_live/manage.html.heex:197 #, elixir-autogen, elixir-format msgid "Add poll to know opinion of your public." msgstr "Fügen Sie eine Umfrage hinzu, um die Meinung Ihres Publikums zu erfahren." -#: lib/claper_web/live/event_live/manage.html.heex:195 -#: lib/claper_web/live/event_live/manage.html.heex:786 +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Umfrage" -#: lib/claper_web/live/poll_live/form_component.html.heex:30 +#: lib/claper_web/live/poll_live/form_component.html.heex:26 #, elixir-format, ex-autogen, elixir-autogen msgid "Choice %{count}" msgid_plural "Choice %{count}" @@ -391,18 +397,18 @@ msgstr "Aktuelle Umfrage anzeigen" msgid "Vote" msgstr "Abstimmen" -#: lib/claper_web/live/event_live/event_form_component.html.heex:358 -#: lib/claper_web/live/event_live/event_form_component.html.heex:376 +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 #, elixir-autogen, elixir-format msgid "User email address" msgstr "Benutzer Email-Adresse" -#: lib/claper_web/live/event_live/event_form_component.html.heex:207 +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 #, elixir-autogen, elixir-format msgid "Changing your file will remove all interaction elements like polls associated." msgstr "Wenn Sie Ihre Datei ändern, werden alle damit verbundenen Interaktionselemente wie Umfragen entfernt." -#: lib/claper_web/live/event_live/manage.html.heex:1221 +#: lib/claper_web/live/event_live/manage.html.heex:1213 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "Nachrichten von Teilnehmern werden hier erscheinen." @@ -412,7 +418,7 @@ msgstr "Nachrichten von Teilnehmern werden hier erscheinen." msgid "Processing your file..." msgstr "Verarbeitung der Datei..." -#: lib/claper_web/live/poll_live/form_component.html.heex:118 +#: lib/claper_web/live/poll_live/form_component.html.heex:114 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the poll itself, are you sure?" msgstr "Dadurch werden alle zugehörigen Antworten und die Umfrage selbst gelöscht, sind Sie sicher?" @@ -422,14 +428,14 @@ msgstr "Dadurch werden alle zugehörigen Antworten und die Umfrage selbst gelös msgid "Ask, comment..." msgstr "Fragen, kommentieren..." -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1159 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format msgid "Messages" msgstr "Nachrichten" -#: lib/claper_web/live/event_live/event_form_component.html.heex:341 +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 #, elixir-autogen, elixir-format msgid "Add facilitator" msgstr "Moderator hinzufügen" @@ -444,7 +450,7 @@ msgstr "Hoppla, Seite existiert nicht." msgid "The site is under maintenance, we'll be back very soon!" msgstr "Die Seite wird gerade gewartet, wir sind bald wieder da!" -#: lib/claper_web/live/event_live/event_form_component.html.heex:320 +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 #, elixir-autogen, elixir-format msgid "Facilitators can present and manage interactions" msgstr "Moderatoren können präsentieren und Interaktionen steuern" @@ -458,13 +464,8 @@ msgstr "Moderatoren können präsentieren und Interaktionen steuern" msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" msgstr "Wenn Sie Probleme mit der obigen Schaltfläche haben, kopieren Sie die folgende URL und fügen Sie sie in Ihren Webbrowser ein" -#: lib/claper_web/templates/user_notifier/change.html.heex:22 -#, elixir-autogen, elixir-format -msgid "You can change your email by visiting the URL below" -msgstr "Sie können Ihre E-Mail-Adresse ändern, indem Sie die folgende URL aufrufen" - -#: lib/claper_web/live/event_live/manage.html.heex:759 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "Interaktion hinzufügen" @@ -622,6 +623,7 @@ msgstr "Oder verwenden Sie den Code:" msgid "Create account" msgstr "Benutzerkonto erstellen" +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:161 #: lib/claper_web/templates/user_registration/new.html.heex:37 #: lib/claper_web/templates/user_reset_password/edit.html.heex:34 @@ -657,14 +659,14 @@ msgstr "Aktualisieren Sie Ihr Passwort" msgid "Your password has been updated." msgstr "Dein Passwort wurde aktualisiert." -#: lib/claper_web/live/form_live/form_component.html.heex:30 +#: lib/claper_web/live/form_live/form_component.html.heex:26 #, elixir-autogen, elixir-format msgid "Field %{count}" msgid_plural "Field %{count}" msgstr[0] "Feld %{count}" msgstr[1] "Feld %{count}" -#: lib/claper_web/live/event_live/manage.html.heex:231 +#: lib/claper_web/live/event_live/manage.html.heex:230 #, elixir-autogen, elixir-format msgid "Add form to collect data from your public." msgstr "Fügen Sie ein Formular hinzu, um Daten von Ihrem Publikum zu sammeln." @@ -674,34 +676,41 @@ msgstr "Fügen Sie ein Formular hinzu, um Daten von Ihrem Publikum zu sammeln." msgid "Current form" msgstr "Aktuelles Formular" -#: lib/claper_web/live/event_live/manage.html.heex:327 +#: lib/claper_web/live/event_live/manage.html.heex:326 #, elixir-autogen, elixir-format msgid "Edit form" msgstr "Formular bearbeiten" -#: lib/claper_web/live/event_live/manage.html.heex:228 -#: lib/claper_web/live/event_live/manage.html.heex:830 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 #, elixir-autogen, elixir-format msgid "Form" msgstr "Formular" -#: lib/claper_web/live/event_live/manage.html.heex:1191 +#: lib/claper_web/live/event_live/manage.html.heex:1183 #, elixir-autogen, elixir-format msgid "Form submissions" msgstr "Abgeschickte Formulare" -#: lib/claper_web/live/event_live/manage.html.heex:1390 +#: lib/claper_web/live/event_live/manage.html.heex:1382 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "Formulareinsendungen der Teilnehmer werden hier angezeigt." -#: lib/claper_web/live/event_live/manage.ex:814 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 #, elixir-autogen, elixir-format msgid "Name" msgstr "Name" -#: lib/claper_web/live/event_live/manage.html.heex:326 +#: lib/claper_web/live/event_live/manage.html.heex:325 #, elixir-autogen, elixir-format msgid "New form" msgstr "Neues Formular" @@ -722,17 +731,17 @@ msgstr "Aktuelles Formular anzeigen" msgid "Submit" msgstr "Abschicken" -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #, elixir-autogen, elixir-format msgid "Text" msgstr "Text" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1402 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Dies kann nicht rückgängig gemacht werden. Bestätigen?" -#: lib/claper_web/live/form_live/form_component.html.heex:110 +#: lib/claper_web/live/form_live/form_component.html.heex:105 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the form itself, are you sure?" msgstr "Dadurch werden alle zugehörigen Antworten und das Formular selbst gelöscht. Sind Sie sicher?" @@ -742,7 +751,7 @@ msgstr "Dadurch werden alle zugehörigen Antworten und das Formular selbst gelö msgid "Title of your form" msgstr "Titel Ihres Formulars" -#: lib/claper_web/live/form_live/form_component.html.heex:40 +#: lib/claper_web/live/form_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Type" msgstr "Typ" @@ -757,7 +766,7 @@ msgstr "Wählen Sie eine Option aus" msgid "Select one or multiple options" msgstr "Wählen Sie eine oder mehrere Optionen aus" -#: lib/claper_web/live/poll_live/form_component.html.heex:96 +#: lib/claper_web/live/poll_live/form_component.html.heex:92 #, elixir-autogen, elixir-format msgid "Multiple answers" msgstr "Mehrere Antworten" @@ -767,12 +776,12 @@ msgstr "Mehrere Antworten" msgid "PDF, PPT, PPTX up to %{size} MB" msgstr "PDF, PPT, PPTX bis zu %{size} MB" -#: lib/claper_web/live/event_live/manager_settings_component.ex:426 +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 #, elixir-autogen, elixir-format msgid "Enable messages" msgstr "Nachrichten aktivieren" -#: lib/claper_web/live/event_live/manager_settings_component.ex:304 +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 #, elixir-autogen, elixir-format msgid "Show messages" msgstr "Nachrichten anzeigen" @@ -821,7 +830,7 @@ msgstr "deaktiviert" msgid "Account creation is disabled" msgstr "Kontoerstellung ist deaktiviert" -#: lib/claper_web/live/event_live/manage.html.heex:262 +#: lib/claper_web/live/event_live/manage.html.heex:261 #, elixir-autogen, elixir-format msgid "Add a Youtube video or any web content." msgstr "Fügen Sie ein YouTube-Video oder einen beliebigen Webinhalt hinzu." @@ -872,12 +881,12 @@ msgstr "Link zum Zurücksetzen des Passworts senden" msgid "Current web content" msgstr "Aktuelle Einbettung" -#: lib/claper_web/live/event_live/manage.html.heex:348 +#: lib/claper_web/live/event_live/manage.html.heex:347 #, elixir-autogen, elixir-format msgid "Edit web content" msgstr "Webinhalt bearbeiten" -#: lib/claper_web/live/event_live/manage.html.heex:347 +#: lib/claper_web/live/event_live/manage.html.heex:346 #, elixir-autogen, elixir-format msgid "New web content" msgstr "Neuer Webinhalt" @@ -887,7 +896,7 @@ msgstr "Neuer Webinhalt" msgid "See current web content" msgstr "Aktuelle Webinhalte anzeigen" -#: lib/claper_web/live/embed_live/form_component.html.heex:80 +#: lib/claper_web/live/embed_live/form_component.html.heex:74 #, elixir-autogen, elixir-format, fuzzy msgid "This will delete the web content, are you sure?" msgstr "Dies wird den Webinhalt löschen, sind Sie sicher?" @@ -898,8 +907,8 @@ msgstr "Dies wird den Webinhalt löschen, sind Sie sicher?" msgid "Title" msgstr "Titel" -#: lib/claper_web/live/event_live/manage.html.heex:260 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Webinhalt" @@ -916,17 +925,17 @@ msgstr "Anpinnen" msgid "Pinned" msgstr "Angepinnt" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1175 #, elixir-autogen, elixir-format, fuzzy msgid "Pinned messages" msgstr "Angepinnte Nachrichten" -#: lib/claper_web/live/event_live/manage.html.heex:1344 +#: lib/claper_web/live/event_live/manage.html.heex:1336 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "Angepinnte Beiträge werden hier angezeigt." -#: lib/claper_web/live/event_live/manager_settings_component.ex:359 +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 #, elixir-autogen, elixir-format msgid "Show only pinned messages" msgstr "Nur angepinnte Nachrichten anzeigen" @@ -967,7 +976,7 @@ msgstr "Sie wurden eingeladen, ein Ereignis zu verwalten" msgid "Saved" msgstr "Gespeichert" -#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:301 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "Alle Ihre Veranstaltungen und Dateien werden dauerhaft gelöscht, sind Sie sicher?" @@ -982,22 +991,22 @@ msgstr "Sind Sie sicher, dass Sie diese Veranstaltung beenden möchten? Diese Ak msgid "Attendees room" msgstr "Teilnehmerraum" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:291 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "Seien Sie vorsichtig, diese Aktionen sind unwiderruflich" -#: lib/claper_web/live/user_settings_live/show.html.heex:275 +#: lib/claper_web/live/user_settings_live/show.html.heex:288 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Gefahrenzone" -#: lib/claper_web/live/user_settings_live/show.html.heex:284 +#: lib/claper_web/live/user_settings_live/show.html.heex:297 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "Konto löschen" -#: lib/claper_web/live/event_live/manage.html.heex:566 +#: lib/claper_web/live/event_live/manage.html.heex:565 #, elixir-autogen, elixir-format msgid "Open presentation" msgstr "Präsentation öffnen" @@ -1012,7 +1021,7 @@ msgstr "Bericht ansehen" msgid "Your account has been deleted." msgstr "Ihr Konto wurde gelöscht." -#: lib/claper_web/live/event_live/event_form_component.html.heex:279 +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 #, elixir-autogen, elixir-format, fuzzy msgid "Access code" msgstr "Zugriff" @@ -1022,46 +1031,46 @@ msgstr "Zugriff" msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." msgstr "Animationen in PPT/PPTX-Dateien werden nicht unterstützt, weshalb wir empfehlen, Ihre Präsentation in PDF zu exportieren, um eine korrekte Anzeige zu gewährleisten." -#: lib/claper_web/live/event_live/manage.html.heex:1155 +#: lib/claper_web/live/event_live/manage.html.heex:1147 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "Interaktionen der Teilnehmer" #: lib/claper_web/live/event_live/event_form_component.html.heex:6 -#: lib/claper_web/live/event_live/index.html.heex:106 -#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 #: lib/claper_web/live/event_live/quiz_component.ex:151 #: lib/claper_web/live/event_live/quiz_component.ex:198 #, elixir-autogen, elixir-format msgid "Back" msgstr "Zurück" -#: lib/claper_web/live/event_live/event_form_component.html.heex:314 +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 #, elixir-autogen, elixir-format, fuzzy msgid "Facilitators" msgstr "Moderatoren" #: lib/claper_web/live/event_live/event_form_component.html.heex:7 -#: lib/claper_web/live/event_live/index.html.heex:107 -#: lib/claper_web/live/event_live/manage.html.heex:430 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 #: lib/claper_web/templates/lti/registration/success.html.heex:26 #, elixir-autogen, elixir-format, fuzzy msgid "Finish" msgstr "Abschließen" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." msgstr "Hier finden Sie alle Interaktionen Ihrer Teilnehmer. Sie können Nachrichten, angeheftete Nachrichten und eingereichte Formulare verwalten." -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identifizieren Sie Benutzer anhand ihrer einzigartigen Avatare." #: lib/claper_web/live/event_live/event_form_component.html.heex:5 -#: lib/claper_web/live/event_live/index.html.heex:105 -#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 #: lib/claper_web/live/event_live/manager_settings_component.ex:176 #: lib/claper_web/live/event_live/quiz_component.ex:161 #: lib/claper_web/live/event_live/quiz_component.ex:209 @@ -1074,57 +1083,57 @@ msgstr "Weiter" msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." msgstr "Wählen Sie Ihre Präsentationsdatei aus. Akzeptierte Formate sind PDF, PPT oder PPTX. Stellen Sie sicher, dass die Dateigröße das maximale Limit nicht überschreitet." -#: lib/claper_web/live/event_live/manage.html.heex:546 +#: lib/claper_web/live/event_live/manage.html.heex:545 #, elixir-autogen, elixir-format, fuzzy msgid "Time to launch your presentation!" msgstr "Zeit, Ihre Präsentation zu starten!" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "Use the associated keyboard shortcuts for quick toggling of these settings." msgstr "Verwenden Sie die zugehörigen Tastaturkürzel, um diese Einstellungen schnell umzuschalten." -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." msgstr "Sie können jede Einstellung für die Präsentation (Anzeige auf dem Großbildschirm) und im Raum der Teilnehmer steuern." -#: lib/claper_web/live/event_live/index.html.heex:148 +#: lib/claper_web/live/event_live/index.html.heex:149 #, elixir-autogen, elixir-format msgid "Your first steps with Claper" msgstr "Ihre ersten Schritte mit Claper" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." msgstr "Teilnehmer, die versuchen, vor diesem Datum auf das Veranstaltung zuzugreifen, werden in einen Warteraum geleitet." -#: lib/claper_web/live/event_live/index.html.heex:166 +#: lib/claper_web/live/event_live/index.html.heex:167 #, elixir-autogen, elixir-format, fuzzy msgid "Create event" msgstr "Veranstaltung erstellen" -#: lib/claper_web/live/event_live/index.html.heex:224 +#: lib/claper_web/live/event_live/index.html.heex:225 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first event" msgstr "Erstellen Sie Ihr erstes Veranstaltung" -#: lib/claper_web/live/event_live/event_form_component.html.heex:294 +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 #, elixir-autogen, elixir-format msgid "Event start date" msgstr "Datum des Veranstaltungsbeginns" -#: lib/claper_web/live/event_live/index.html.heex:118 +#: lib/claper_web/live/event_live/index.html.heex:119 #, elixir-autogen, elixir-format msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." msgstr "Wenn Sie keine Zeit haben und nur Interaktionen ohne eine Präsentationsdatei wünschen, können Sie hier eine neue Veranstaltung erstellen." -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format, fuzzy msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." msgstr "Wenn Sie Unterstützung bei der Verwaltung Ihrer Veranstaltung benötigen, können Sie anderen Personen Zugang gewähren. Geben Sie einfach deren E-Mail-Adressen ein. Sobald sie ein Konto mit diesen E-Mail-Adressen registrieren, können sie die Veranstaltung verwalten." -#: lib/claper_web/live/event_live/index.html.heex:123 +#: lib/claper_web/live/event_live/index.html.heex:124 #, elixir-autogen, elixir-format msgid "In a hurry ?" msgstr "Eilig?" @@ -1134,18 +1143,18 @@ msgstr "Eilig?" msgid "Live" msgstr "Live" -#: lib/claper_web/live/event_live/index.html.heex:111 +#: lib/claper_web/live/event_live/index.html.heex:112 #, elixir-autogen, elixir-format msgid "My events" msgstr "Meine Veranstaltungen" -#: lib/claper_web/live/event_live/event_form_component.html.heex:271 -#: lib/claper_web/live/event_live/index.html.heex:86 +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 #, elixir-autogen, elixir-format, fuzzy msgid "Name of your event" msgstr "Name Ihrer Veranstaltung" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format, fuzzy msgid "Note: Facilitators do not have the ability to delete your event." msgstr "Hinweis: Moderatoren können Ihre Veranstaltung nicht löschen." @@ -1155,12 +1164,12 @@ msgstr "Hinweis: Moderatoren können Ihre Veranstaltung nicht löschen." msgid "Presentation file (optional)" msgstr "Präsentationsdatei (optional)" -#: lib/claper_web/live/event_live/index.html.heex:141 +#: lib/claper_web/live/event_live/index.html.heex:142 #, elixir-autogen, elixir-format msgid "Quick event" msgstr "Schnellveranstaltung" -#: lib/claper_web/live/event_live/index.ex:91 +#: lib/claper_web/live/event_live/index.ex:102 #, elixir-autogen, elixir-format msgid "Quick event created successfully" msgstr "Schnellveranstaltung erfolgreich erstellt" @@ -1170,7 +1179,7 @@ msgstr "Schnellveranstaltung erfolgreich erstellt" msgid "Return to your last event" msgstr "Zurück zu Ihrer letzten Veranstaltung" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format, fuzzy msgid "Select the start date for your event. Future dates are permissible." msgstr "Wählen Sie das Startdatum für Ihre Veranstaltung. Zukünftige Daten sind zulässig." @@ -1180,22 +1189,22 @@ msgstr "Wählen Sie das Startdatum für Ihre Veranstaltung. Zukünftige Daten si msgid "Select your presentation (optional)" msgstr "Wählen Sie Ihre Präsentation aus (optional)" -#: lib/claper_web/live/event_live/event_form_component.html.heex:280 +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 #, elixir-autogen, elixir-format, fuzzy msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." msgstr "Dieser Code wird von Ihren Teilnehmern verwendet, um auf die Veranstaltung zuzugreifen. Sie haben die Möglichkeit, einen benutzerdefinierten Code zu erstellen." -#: lib/claper_web/live/event_live/show.ex:192 +#: lib/claper_web/live/event_live/show.ex:193 #, elixir-autogen, elixir-format msgid "This event has been terminated" msgstr "Diese Veranstaltung wurde beendet" -#: lib/claper_web/live/event_live/index.html.heex:147 +#: lib/claper_web/live/event_live/index.html.heex:148 #, elixir-autogen, elixir-format, fuzzy msgid "Welcome to Claper! You can create a new event here." msgstr "Willkommen bei Claper! Hier können Sie eine neue Veranstaltung erstellen." -#: lib/claper_web/live/event_live/event_form_component.html.heex:304 +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 #, elixir-autogen, elixir-format, fuzzy msgid "When your event will start?" msgstr "Wann beginnt Ihre Veranstaltung?" @@ -1205,8 +1214,8 @@ msgstr "Wann beginnt Ihre Veranstaltung?" msgid "Create your next presentation with" msgstr "Erstellen Sie Ihre nächste Präsentation mit" -#: lib/claper_web/live/event_live/manage.ex:27 -#: lib/claper_web/live/event_live/presenter.ex:24 +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:25 #, elixir-autogen, elixir-format msgid "Event doesn't exist" @@ -1217,7 +1226,7 @@ msgstr "Veranstaltung existiert nicht" msgid "Customize your account" msgstr "Passen Sie Ihr Konto an" -#: lib/claper_web/live/user_settings_live/show.html.heex:265 +#: lib/claper_web/live/user_settings_live/show.html.heex:278 #, elixir-autogen, elixir-format msgid "Language" msgstr "Sprache" @@ -1237,22 +1246,22 @@ msgstr "Ihre Einstellungen wurden aktualisiert." msgid "Question" msgstr "Frage" -#: lib/claper_web/live/event_live/manage.html.heex:1175 +#: lib/claper_web/live/event_live/manage.html.heex:1167 #, elixir-autogen, elixir-format msgid "Questions" msgstr "Fragen" -#: lib/claper_web/live/event_live/manage.html.heex:1262 +#: lib/claper_web/live/event_live/manage.html.heex:1254 #, elixir-autogen, elixir-format msgid "Questions will appear here." msgstr "Fragen werden hier erscheinen." -#: lib/claper_web/live/event_live/manage.html.heex:1304 +#: lib/claper_web/live/event_live/manage.html.heex:1296 #, elixir-autogen, elixir-format msgid "Sort by date" msgstr "Nach Datum sortieren" -#: lib/claper_web/live/event_live/manage.html.heex:1283 +#: lib/claper_web/live/event_live/manage.html.heex:1275 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Nach Beliebtheit sortieren" @@ -1262,7 +1271,8 @@ msgstr "Nach Beliebtheit sortieren" msgid "Event manager" msgstr "Veranstaltungsmanager" -#: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Dokumentation" @@ -1278,7 +1288,7 @@ msgstr "Mein Konto" msgid "Your personal informations to access your account" msgstr "Ihre persnlichen Informationen zum Zugreifen auf Ihr Konto" -#: lib/claper_web/live/event_live/manager_settings_component.ex:533 +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 #, elixir-autogen, elixir-format, fuzzy msgid "Enable reactions" msgstr "Reaktionen aktivieren" @@ -1334,43 +1344,43 @@ msgid "Add Claper" msgstr "Claper hinzufügen" #: lib/claper_web/live/event_live/manage.html.heex:123 -#: lib/claper_web/live/event_live/manage.html.heex:539 +#: lib/claper_web/live/event_live/manage.html.heex:538 #, elixir-autogen, elixir-format msgid "Close preview" msgstr "Vorschau schließen" -#: lib/claper_web/live/event_live/manage.html.heex:743 +#: lib/claper_web/live/event_live/manage.html.heex:734 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first interaction." msgstr "Erstellen Sie Ihre erste Interaktion." -#: lib/claper_web/live/event_live/manage.html.heex:1101 +#: lib/claper_web/live/event_live/manage.html.heex:1093 #, elixir-autogen, elixir-format, fuzzy msgid "Disable" msgstr "Deaktivieren" -#: lib/claper_web/live/event_live/manage.html.heex:1118 +#: lib/claper_web/live/event_live/manage.html.heex:1110 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Aktivieren" -#: lib/claper_web/live/event_live/manager_settings_component.ex:443 +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 #, elixir-autogen, elixir-format, fuzzy msgid "Enable messages to change this option" msgstr "Aktivieren Sie Nachrichten, um diese Option zu ändern" #: lib/claper_web/live/event_live/manage.html.heex:122 -#: lib/claper_web/live/event_live/manage.html.heex:538 +#: lib/claper_web/live/event_live/manage.html.heex:537 #, elixir-autogen, elixir-format msgid "Open preview" msgstr "Vorschau öffnen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:321 +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 #, elixir-autogen, elixir-format msgid "Show messages to change this option" msgstr "Nachrichten anzeigen, um diese Option zu ändern" -#: lib/claper_web/live/event_live/manage.html.heex:740 +#: lib/claper_web/live/event_live/manage.html.heex:731 #, elixir-autogen, elixir-format msgid "This slide does not have any interactions." msgstr "Diese Folie hat keine Interaktionen." @@ -1397,7 +1407,7 @@ msgstr "Anmelden mit %{provider}" msgid "The account has been unlinked." msgstr "Das Konto wurde getrennt." -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "This section contains all your interactions." msgstr "Dieser Abschnitt enthält alle Ihre Interaktionen." @@ -1408,12 +1418,12 @@ msgstr "Dieser Abschnitt enthält alle Ihre Interaktionen." msgid "Unlink" msgstr "Trennen" -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "You can add interactions to your presentation slides." msgstr "Sie können Ihren Präsentationsfolien Interaktionen hinzufügen." -#: lib/claper_web/live/event_live/manage.html.heex:715 +#: lib/claper_web/live/event_live/manage.html.heex:706 #, elixir-autogen, elixir-format msgid "Your interactions" msgstr "Ihre Interaktionen" @@ -1438,12 +1448,12 @@ msgstr "Legen Sie ein neues Passwort für Ihr Konto fest, bevor Sie es trennen." msgid "Your password has been set, you can now unlink your account." msgstr "Ihr Passwort wurde festgelegt. Sie können jetzt Ihr Konto trennen." -#: lib/claper_web/live/embed_live/form_component.html.heex:38 +#: lib/claper_web/live/embed_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Iframe code" msgstr "Iframe-Code" -#: lib/claper_web/live/embed_live/form_component.html.heex:39 +#: lib/claper_web/live/embed_live/form_component.html.heex:35 #, elixir-autogen, elixir-format msgid "Link to the content" msgstr "Link zum Inhalt" @@ -1469,24 +1479,24 @@ msgstr "Bitte geben Sie einen gültigen Link ein, der mit http:// oder https:// msgid "Please enter valid HTML content with an iframe tag" msgstr "Bitte geben Sie gültigen HTML-Inhalt mit einem iframe-Tag ein" -#: lib/claper_web/live/embed_live/form_component.html.heex:25 +#: lib/claper_web/live/embed_live/form_component.html.heex:23 #, elixir-autogen, elixir-format msgid "Provider" msgstr "Anbieter" -#: lib/claper_web/live/poll_live/form_component.html.heex:89 +#: lib/claper_web/live/poll_live/form_component.html.heex:85 #, elixir-autogen, elixir-format msgid "Attendees can see the results on their device" msgstr "Teilnehmer können die Ergebnisse auf ihrem Gerät sehen" -#: lib/claper_web/live/embed_live/form_component.html.heex:56 +#: lib/claper_web/live/embed_live/form_component.html.heex:50 #, elixir-autogen, elixir-format msgid "Attendees can view the web content on their device" msgstr "Teilnehmer können die Webinhalte auf ihrem Gerät anzeigen" -#: lib/claper_web/live/embed_live/form_component.html.heex:49 -#: lib/claper_web/live/poll_live/form_component.html.heex:82 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:172 +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 #, elixir-autogen, elixir-format msgid "Options" msgstr "Optionen" @@ -1554,12 +1564,12 @@ msgstr "Beenden" msgid "More options" msgstr "Weitere Optionen" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "No" msgstr "Nein" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Ja" @@ -1609,32 +1619,32 @@ msgstr "Sie können Ihr Passwort zurücksetzen, indem Sie die folgende URL besuc msgid "back to the home page" msgstr "zurück zur Startseite" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:46 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 #, elixir-autogen, elixir-format, fuzzy msgid "Add Question" msgstr "Frage hinzufügen" -#: lib/claper_web/live/event_live/manage.html.heex:294 +#: lib/claper_web/live/event_live/manage.html.heex:293 #, elixir-autogen, elixir-format msgid "Add a quiz to test knowledge." msgstr "Fügen Sie ein Quiz hinzu, um Wissen zu testen." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 #, elixir-autogen, elixir-format msgid "Add answer" msgstr "Antwort hinzufügen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous messages" msgstr "Anonyme Nachrichten erlauben" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:84 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 #, elixir-autogen, elixir-format msgid "Answer %{index}" msgstr "Antwort %{index}" -#: lib/claper_web/live/event_live/manager_settings_component.ex:390 +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees" msgstr "Teilnehmer" @@ -1650,32 +1660,32 @@ msgstr "Durchschnittliche Punktzahl" msgid "Current quiz" msgstr "Aktuelles Quiz" -#: lib/claper_web/live/event_live/manager_settings_component.ex:485 +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 #, elixir-autogen, elixir-format, fuzzy msgid "Deny anonymous messages" msgstr "Anonyme Nachrichten verweigern" -#: lib/claper_web/live/event_live/manager_settings_component.ex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 #, elixir-autogen, elixir-format, fuzzy msgid "Disable messages" msgstr "Nachrichten deaktivieren" -#: lib/claper_web/live/event_live/manager_settings_component.ex:536 +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 #, elixir-autogen, elixir-format, fuzzy msgid "Disable reactions" msgstr "Reaktionen deaktivieren" -#: lib/claper_web/live/event_live/manage.html.heex:369 +#: lib/claper_web/live/event_live/manage.html.heex:368 #, elixir-autogen, elixir-format, fuzzy msgid "Edit quiz" msgstr "Quiz bearbeiten" -#: lib/claper_web/live/event_live/manager_settings_component.ex:258 +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 #, elixir-autogen, elixir-format msgid "Hide instructions to join" msgstr "Beitrittsanweisungen ausblenden" -#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 #, elixir-autogen, elixir-format, fuzzy msgid "Hide messages" msgstr "Nachrichten ausblenden" @@ -1698,12 +1708,12 @@ msgstr "Wie funktioniert es?" msgid "Interaction" msgstr "Interaktion" -#: lib/claper_web/live/event_live/manage.html.heex:368 +#: lib/claper_web/live/event_live/manage.html.heex:367 #, elixir-autogen, elixir-format msgid "New quiz" msgstr "Neues Quiz" -#: lib/claper_web/live/event_live/manager_settings_component.ex:217 +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 #, elixir-autogen, elixir-format, fuzzy msgid "Presentation" msgstr "Präsentation" @@ -1713,13 +1723,13 @@ msgstr "Präsentation" msgid "Previous" msgstr "Vorherige" -#: lib/claper_web/live/event_live/manage.html.heex:292 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Quiz" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:158 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 #, elixir-autogen, elixir-format msgid "Remove question" msgstr "Frage entfernen" @@ -1734,17 +1744,17 @@ msgstr "Überprüfen Sie die Fragen" msgid "See current quiz" msgstr "Aktuelles Quiz anzeigen" -#: lib/claper_web/live/event_live/manage.html.heex:388 +#: lib/claper_web/live/event_live/manage.html.heex:387 #, elixir-autogen, elixir-format, fuzzy msgid "Select presentation" msgstr "Präsentation auswählen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:361 +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 #, elixir-autogen, elixir-format, fuzzy msgid "Show all messages" msgstr "Alle Nachrichten anzeigen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:255 +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 #, elixir-autogen, elixir-format, fuzzy msgid "Show instructions to join" msgstr "Beitrittsanweisungen anzeigen" @@ -1760,7 +1770,7 @@ msgstr "Ergebnisse anzeigen" msgid "Show results on presentation" msgstr "Ergebnisse in der Präsentation anzeigen" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:206 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 #, elixir-autogen, elixir-format, fuzzy msgid "This will delete all responses associated and the quiz itself, are you sure?" msgstr "Dadurch werden alle zugehörigen Antworten und das Quiz selbst gelöscht. Sind Sie sicher?" @@ -1770,7 +1780,7 @@ msgstr "Dadurch werden alle zugehörigen Antworten und das Quiz selbst gelöscht msgid "Waiting for results..." msgstr "Warten auf Ergebnisse..." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:62 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 #, elixir-autogen, elixir-format msgid "Your question" msgstr "Ihre Frage" @@ -1788,7 +1798,7 @@ msgstr "Ihre Punktzahl" msgid "Export" msgstr "Exportieren" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:218 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 #, elixir-autogen, elixir-format msgid "Export to QTI (XML)" msgstr "Als QTI (XML) exportieren" @@ -1848,17 +1858,21 @@ msgstr "Einzigartige Teilnehmer" msgid "Web Content" msgstr "Webinhalt" -#: lib/claper_web/live/event_live/index.html.heex:178 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 #, elixir-autogen, elixir-format msgid "Active" msgstr "Aktiv" -#: lib/claper_web/live/event_live/index.html.heex:217 +#: lib/claper_web/live/event_live/index.html.heex:218 #, elixir-autogen, elixir-format msgid "Load more" msgstr "Mehr laden" -#: lib/claper_web/live/event_live/index.html.heex:194 +#: lib/claper_web/live/event_live/index.html.heex:195 #, elixir-autogen, elixir-format msgid "Shared with you" msgstr "Mit Ihnen geteilt" @@ -1868,17 +1882,17 @@ msgstr "Mit Ihnen geteilt" msgid "You must login to continue" msgstr "Sie müssen sich anmelden, um fortzufahren" -#: lib/claper/quizzes/quiz_question.ex:41 +#: lib/claper/quizzes/quiz_question.ex:51 #, elixir-autogen, elixir-format msgid "must have at least one correct answer" msgstr "muss mindestens eine richtige Antwort haben" -#: lib/claper_web/live/event_live/manage.html.heex:548 +#: lib/claper_web/live/event_live/manage.html.heex:547 #, elixir-autogen, elixir-format msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." msgstr "Klicken Sie hier, um das Präsentationsfenster zu zeigen. Drucken Sie F im Präsentationsfenster, um den Vollbildmodus zu aktivieren." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:179 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous submissions" msgstr "Anonyme Einreichungen erlauben" @@ -1897,3 +1911,771 @@ msgstr "Anmelden" #, elixir-autogen, elixir-format msgid "Total submissions" msgstr "Gesamtanzahl der Einreichungen" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "Ein eindeutiger Code für Teilnehmer, um diesem Event beizutreten" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "Ein eindeutiger Name für dieses Event" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "Ein eindeutiger Name zur Identifikation dieses OIDC-Anbieters" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "Konto ist bestätigt und aktiv" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format, fuzzy +msgid "Actions" +msgstr "Optionen" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Active Events" +msgstr "Aktiv" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this event?" +msgstr "Sind Sie sicher, dass Sie dieses Event löschen möchten?" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this provider?" +msgstr "Sind Sie sicher, dass Sie diesen Anbieter löschen möchten?" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this user?" +msgstr "Sind Sie sicher, dass Sie diesen Benutzer löschen möchten?" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "Zugewiesener Benutzer" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format, fuzzy +msgid "Audience Peak" +msgstr "Max. Zuschauer" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "Autorisierungscode" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "Abbrechen" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format, fuzzy +msgid "Choose file" +msgstr "Datei ändern" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "Client-ID" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "Client-Secret" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "Abgeschlossen" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirmed" +msgstr "Bestätigt" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "Bestätigt am" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create Event" +msgstr "Veranstaltung erstellen" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "Anbieter erstellen" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create User" +msgstr "Erstellen" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created" +msgstr "Erstellen" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created At" +msgstr "Erstellen" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Currently running" +msgstr "Aktuelles Quiz" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete event" +msgstr "Löschen" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "Anbieter löschen" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete user" +msgstr "Löschen" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "OIDC-Anbieter bearbeiten" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "Event bearbeiten" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "Anbieter bearbeiten" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit user" +msgstr "Ändern" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "Diesen OIDC-Anbieter aktivieren" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "Client-ID eingeben" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "Client-Secret eingeben" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "Event-Code eingeben" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "Event-Name eingeben" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enter password" +msgstr "Aktuelles Passwort" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "Anbieter-Name eingeben" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "Benutzer-E-Mail eingeben" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "Event-Erstellung" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "Event erfolgreich erstellt" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "Event erfolgreich gelöscht" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "Event-Details" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "Event erfolgreich aktualisiert" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format, fuzzy +msgid "Events" +msgstr "Veranstaltung" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "Events erfolgreich exportiert" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "Abgelaufen am" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "Datei ausgewählt" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format, fuzzy +msgid "Form Post" +msgstr "Formulare" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "Fragment" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "Wie die Autorisierungsantwort zurückgegeben werden soll (Standard ist 'query')" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "Hybrid" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "Implizit" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format, fuzzy +msgid "Inactive" +msgstr "Aktiv" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "Anfangspasswort für den Benutzer" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "Aussteller" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "Aussteller-URL" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "Letzte 30 Tage" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "Zuletzt aktualisiert" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "Neues Event" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "Keine Events gefunden" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "Keine Datei ausgewählt" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "Kein Besitzer" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "Keine Rolle" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "Keine Benutzer gefunden" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "Nicht abgelaufen" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "Nicht gestartet" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "OAuth 2.0 Antworttyp (Standard ist 'code')" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Provider" +msgstr "Anbieter" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "OIDC-Anbieter-Details" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Providers" +msgstr "Anbieter" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "OIDC-Bereiche, die angefordert werden sollen (Standard ist 'openid email profile')" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "Besitzer" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "Anbieter erfolgreich erstellt" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider updated successfully" +msgstr "Anbieter erfolgreich aktualisiert" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "Query" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "Aktuelle Events" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "Umleitungs-URI" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "Antwortmodus" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "Antworttyp" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "Rolle" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "Speichern..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "Geplant" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "Bereich" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "Events suchen..." + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "Nach einem Benutzer suchen..." + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "Anbieter suchen..." + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "Benutzer suchen..." + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select an option" +msgstr "Wählen Sie eine Option aus" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "Auswählen..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "Startdatum" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "Gestartet am" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "Status" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "Die OIDC-Aussteller-URL (muss mit http:// oder https:// beginnen)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "Die Callback-URL für Ihre Anwendung (muss mit http:// oder https:// beginnen)" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "Der Benutzer, der dieses Event besitzt (erforderlich)" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "Events insgesamt" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "Benutzer insgesamt" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "Unbestätigt" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "Event aktualisieren" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "Anbieter aktualisieren" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "Benutzer aktualisieren" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "Benutzerkonto" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "Benutzerwachstum" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "Benutzer erfolgreich erstellt" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Benutzer erfolgreich gelöscht" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "Benutzer-Details" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format, fuzzy +msgid "User updated successfully" +msgstr "Benutzer erfolgreich aktualisiert" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "Zugriffsebene des Benutzers" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "E-Mail-Adresse des Benutzers (muss eindeutig sein)" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "Benutzer" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "Benutzer erfolgreich exportiert" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "Event anzeigen" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format, fuzzy +msgid "View provider" +msgstr "Bericht ansehen" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "Benutzer anzeigen" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "Wann dieses Event abläuft (optional)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "Ob dieser Anbieter derzeit aktiv und für die Authentifizierung verfügbar ist" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format, fuzzy +msgid "attendees" +msgstr "Teilnehmer" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "https://example.com" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "https://yourapp.com/auth/callback" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "openid email profile" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "vs. letzter Monat" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to events" +msgstr "Zurück zu Events" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to providers" +msgstr "Zurück zu Anbietern" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to users" +msgstr "Zurück zu Benutzern" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format, fuzzy +msgid "New provider" +msgstr "Neuer Anbieter" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format, fuzzy +msgid "New user" +msgstr "Neuer Benutzer" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format, fuzzy +msgid "No providers found" +msgstr "Keine Anbieter gefunden" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "Anbieter erfolgreich gelöscht" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Anbieter" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "Admin" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "Zurück zur App" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirm email change" +msgstr "E-Mail bestätigen" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format, fuzzy +msgid "If you didn't request an email change, please ignore this." +msgstr "Wenn Sie kein Konto bei uns erstellt haben, ignorieren Sie dies bitte." + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "You can confirm your email change by visiting the URL below" +msgstr "Sie können Ihre E-Mail-Adresse ändern, indem Sie die folgende URL aufrufen" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "Teilnehmerzahl ausblenden" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show attendee count" +msgstr "Teilnehmerzahl anzeigen" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "Erforderlich" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "(optional)" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index d9f633e..08e38f4 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -10,15 +10,18 @@ msgid "" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1457 -#: lib/claper_web/live/event_live/manage.html.heex:1463 +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 #: lib/claper_web/live/user_settings_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Settings" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:815 -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:34 #: lib/claper_web/templates/user_registration/new.html.heex:29 #: lib/claper_web/templates/user_reset_password/new.html.heex:28 @@ -45,7 +48,10 @@ msgstr "" msgid "Change" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:287 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 #, elixir-autogen, elixir-format msgid "Code" msgstr "" @@ -56,7 +62,7 @@ msgstr "" msgid "Email address" msgstr "" -#: lib/claper_web/templates/layout/_user_menu.html.heex:16 +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 #, elixir-autogen, elixir-format msgid "Logout" msgstr "" @@ -99,15 +105,18 @@ msgstr "" #: lib/claper_web/live/event_live/event_card_component.ex:111 #: lib/claper_web/live/event_live/join.ex:41 #: lib/claper_web/live/event_live/join.html.heex:94 -#: lib/claper_web/live/event_live/manage.html.heex:493 +#: lib/claper_web/live/event_live/manage.html.heex:492 #: lib/claper_web/live/event_live/show.html.heex:286 #, elixir-autogen, elixir-format msgid "Join" msgstr "" -#: lib/claper_web/live/event_live/index.ex:212 +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 #: lib/claper_web/live/event_live/join.html.heex:31 #: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 #, elixir-autogen, elixir-format msgid "Dashboard" msgstr "" @@ -124,7 +133,7 @@ msgid "seconds" msgstr "" #: lib/claper_web/live/event_live/event_card_component.ex:60 -#: lib/claper_web/live/event_live/index.html.heex:186 +#: lib/claper_web/live/event_live/index.html.heex:187 #, elixir-autogen, elixir-format msgid "Finished" msgstr "" @@ -177,47 +186,50 @@ msgstr "" msgid "Created successfully" msgstr "" +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 #: lib/claper_web/live/event_live/event_card_component.ex:250 #: lib/claper_web/live/event_live/event_card_component.ex:330 #: lib/claper_web/live/event_live/form_component.ex:97 -#: lib/claper_web/live/event_live/index.ex:193 +#: lib/claper_web/live/event_live/index.ex:204 #, elixir-autogen, elixir-format msgid "Edit" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:69 +#: lib/claper_web/live/embed_live/form_component.html.heex:63 #: lib/claper_web/live/event_live/event_form_component.html.heex:55 #: lib/claper_web/live/event_live/event_form_component.html.heex:62 -#: lib/claper_web/live/event_live/index.ex:202 -#: lib/claper_web/live/event_live/index.html.heex:93 -#: lib/claper_web/live/form_live/form_component.html.heex:98 -#: lib/claper_web/live/poll_live/form_component.html.heex:106 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 #, elixir-autogen, elixir-format msgid "Create" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#: lib/claper_web/live/embed_live/form_component.html.heex:68 #: lib/claper_web/live/event_live/event_card_component.ex:444 #: lib/claper_web/live/event_live/event_form_component.html.heex:67 -#: lib/claper_web/live/event_live/manage.html.heex:1405 +#: lib/claper_web/live/event_live/manage.html.heex:1397 #: lib/claper_web/live/event_live/manageable_post_component.ex:92 #: lib/claper_web/live/event_live/post_component.ex:70 #: lib/claper_web/live/event_live/post_component.ex:142 -#: lib/claper_web/live/form_live/form_component.html.heex:103 -#: lib/claper_web/live/poll_live/form_component.html.heex:111 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:129 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:199 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 #, elixir-autogen, elixir-format msgid "Delete" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:70 +#: lib/claper_web/live/embed_live/form_component.html.heex:64 #: lib/claper_web/live/event_live/event_form_component.html.heex:54 #: lib/claper_web/live/event_live/event_form_component.html.heex:61 -#: lib/claper_web/live/form_live/form_component.html.heex:99 -#: lib/claper_web/live/poll_live/form_component.html.heex:107 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:194 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 #: lib/claper_web/live/user_settings_live/show.html.heex:38 #: lib/claper_web/live/user_settings_live/show.html.heex:80 #: lib/claper_web/live/user_settings_live/show.html.heex:123 @@ -261,12 +273,6 @@ msgstr "" msgid "CONFIRM EMAIL" msgstr "" -#: lib/claper_web/templates/user_notifier/change.html.heex:17 -#, elixir-autogen, elixir-format -msgid "Confirm email" -msgstr "" - -#: lib/claper_web/templates/user_notifier/change.html.heex:32 #: lib/claper_web/templates/user_notifier/confirm.html.heex:32 #: lib/claper_web/templates/user_notifier/magic.html.heex:32 #: lib/claper_web/templates/user_notifier/reset.html.heex:32 @@ -297,9 +303,9 @@ msgid "Presentation uploaded" msgstr "" #: lib/claper_web/live/event_live/event_form_component.html.heex:163 -#: lib/claper_web/live/event_live/event_form_component.html.heex:241 -#: lib/claper_web/live/event_live/event_form_component.html.heex:369 -#: lib/claper_web/live/event_live/event_form_component.html.heex:393 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 #, elixir-autogen, elixir-format msgid "Remove" msgstr "" @@ -334,17 +340,17 @@ msgstr "" msgid "Change file" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:228 +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 #, elixir-autogen, elixir-format msgid "Presentation replaced" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:306 +#: lib/claper_web/live/event_live/manage.html.heex:305 #, elixir-autogen, elixir-format msgid "Edit poll" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:305 +#: lib/claper_web/live/event_live/manage.html.heex:304 #, elixir-autogen, elixir-format msgid "New poll" msgstr "" @@ -359,18 +365,18 @@ msgstr "" msgid "Upload failed" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:198 +#: lib/claper_web/live/event_live/manage.html.heex:197 #, elixir-autogen, elixir-format msgid "Add poll to know opinion of your public." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:195 -#: lib/claper_web/live/event_live/manage.html.heex:786 +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 #, elixir-autogen, elixir-format msgid "Poll" msgstr "" -#: lib/claper_web/live/poll_live/form_component.html.heex:30 +#: lib/claper_web/live/poll_live/form_component.html.heex:26 #, elixir-format, ex-autogen, elixir-autogen msgid "Choice %{count}" msgid_plural "Choice %{count}" @@ -393,18 +399,18 @@ msgstr "" msgid "Vote" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:358 -#: lib/claper_web/live/event_live/event_form_component.html.heex:376 +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 #, elixir-autogen, elixir-format msgid "User email address" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:207 +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 #, elixir-autogen, elixir-format msgid "Changing your file will remove all interaction elements like polls associated." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1221 +#: lib/claper_web/live/event_live/manage.html.heex:1213 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "" @@ -414,7 +420,7 @@ msgstr "" msgid "Processing your file..." msgstr "" -#: lib/claper_web/live/poll_live/form_component.html.heex:118 +#: lib/claper_web/live/poll_live/form_component.html.heex:114 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the poll itself, are you sure?" msgstr "" @@ -424,14 +430,14 @@ msgstr "" msgid "Ask, comment..." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1159 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format msgid "Messages" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:341 +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 #, elixir-autogen, elixir-format msgid "Add facilitator" msgstr "" @@ -446,7 +452,7 @@ msgstr "" msgid "The site is under maintenance, we'll be back very soon!" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:320 +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 #, elixir-autogen, elixir-format msgid "Facilitators can present and manage interactions" msgstr "" @@ -460,13 +466,8 @@ msgstr "" msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" msgstr "" -#: lib/claper_web/templates/user_notifier/change.html.heex:22 -#, elixir-autogen, elixir-format -msgid "You can change your email by visiting the URL below" -msgstr "" - -#: lib/claper_web/live/event_live/manage.html.heex:759 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "" @@ -624,6 +625,7 @@ msgstr "" msgid "Create account" msgstr "" +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:161 #: lib/claper_web/templates/user_registration/new.html.heex:37 #: lib/claper_web/templates/user_reset_password/edit.html.heex:34 @@ -659,14 +661,14 @@ msgstr "" msgid "Your password has been updated." msgstr "" -#: lib/claper_web/live/form_live/form_component.html.heex:30 +#: lib/claper_web/live/form_live/form_component.html.heex:26 #, elixir-autogen, elixir-format msgid "Field %{count}" msgid_plural "Field %{count}" msgstr[0] "" msgstr[1] "" -#: lib/claper_web/live/event_live/manage.html.heex:231 +#: lib/claper_web/live/event_live/manage.html.heex:230 #, elixir-autogen, elixir-format msgid "Add form to collect data from your public." msgstr "" @@ -676,34 +678,41 @@ msgstr "" msgid "Current form" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:327 +#: lib/claper_web/live/event_live/manage.html.heex:326 #, elixir-autogen, elixir-format msgid "Edit form" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:228 -#: lib/claper_web/live/event_live/manage.html.heex:830 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 #, elixir-autogen, elixir-format msgid "Form" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1191 +#: lib/claper_web/live/event_live/manage.html.heex:1183 #, elixir-autogen, elixir-format msgid "Form submissions" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1390 +#: lib/claper_web/live/event_live/manage.html.heex:1382 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "" -#: lib/claper_web/live/event_live/manage.ex:814 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 #, elixir-autogen, elixir-format msgid "Name" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:326 +#: lib/claper_web/live/event_live/manage.html.heex:325 #, elixir-autogen, elixir-format msgid "New form" msgstr "" @@ -724,17 +733,17 @@ msgstr "" msgid "Submit" msgstr "" -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #, elixir-autogen, elixir-format msgid "Text" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1402 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "" -#: lib/claper_web/live/form_live/form_component.html.heex:110 +#: lib/claper_web/live/form_live/form_component.html.heex:105 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the form itself, are you sure?" msgstr "" @@ -744,7 +753,7 @@ msgstr "" msgid "Title of your form" msgstr "" -#: lib/claper_web/live/form_live/form_component.html.heex:40 +#: lib/claper_web/live/form_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Type" msgstr "" @@ -759,7 +768,7 @@ msgstr "" msgid "Select one or multiple options" msgstr "" -#: lib/claper_web/live/poll_live/form_component.html.heex:96 +#: lib/claper_web/live/poll_live/form_component.html.heex:92 #, elixir-autogen, elixir-format msgid "Multiple answers" msgstr "" @@ -769,12 +778,12 @@ msgstr "" msgid "PDF, PPT, PPTX up to %{size} MB" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:426 +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 #, elixir-autogen, elixir-format msgid "Enable messages" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:304 +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 #, elixir-autogen, elixir-format msgid "Show messages" msgstr "" @@ -823,7 +832,7 @@ msgstr "" msgid "Account creation is disabled" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:262 +#: lib/claper_web/live/event_live/manage.html.heex:261 #, elixir-autogen, elixir-format msgid "Add a Youtube video or any web content." msgstr "" @@ -874,12 +883,12 @@ msgstr "" msgid "Current web content" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:348 +#: lib/claper_web/live/event_live/manage.html.heex:347 #, elixir-autogen, elixir-format msgid "Edit web content" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:347 +#: lib/claper_web/live/event_live/manage.html.heex:346 #, elixir-autogen, elixir-format msgid "New web content" msgstr "" @@ -889,7 +898,7 @@ msgstr "" msgid "See current web content" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:80 +#: lib/claper_web/live/embed_live/form_component.html.heex:74 #, elixir-autogen, elixir-format msgid "This will delete the web content, are you sure?" msgstr "" @@ -900,8 +909,8 @@ msgstr "" msgid "Title" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:260 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 #, elixir-autogen, elixir-format msgid "Web content" msgstr "" @@ -918,17 +927,17 @@ msgstr "" msgid "Pinned" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1175 #, elixir-autogen, elixir-format msgid "Pinned messages" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1344 +#: lib/claper_web/live/event_live/manage.html.heex:1336 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:359 +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 #, elixir-autogen, elixir-format msgid "Show only pinned messages" msgstr "" @@ -969,7 +978,7 @@ msgstr "" msgid "Saved" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:301 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "" @@ -984,22 +993,22 @@ msgstr "" msgid "Attendees room" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:291 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:275 +#: lib/claper_web/live/user_settings_live/show.html.heex:288 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:284 +#: lib/claper_web/live/user_settings_live/show.html.heex:297 #, elixir-autogen, elixir-format msgid "Delete account" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:566 +#: lib/claper_web/live/event_live/manage.html.heex:565 #, elixir-autogen, elixir-format msgid "Open presentation" msgstr "" @@ -1014,7 +1023,7 @@ msgstr "" msgid "Your account has been deleted." msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:279 +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 #, elixir-autogen, elixir-format msgid "Access code" msgstr "" @@ -1024,46 +1033,46 @@ msgstr "" msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1155 +#: lib/claper_web/live/event_live/manage.html.heex:1147 #, elixir-autogen, elixir-format msgid "Attendees interactions" msgstr "" #: lib/claper_web/live/event_live/event_form_component.html.heex:6 -#: lib/claper_web/live/event_live/index.html.heex:106 -#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 #: lib/claper_web/live/event_live/quiz_component.ex:151 #: lib/claper_web/live/event_live/quiz_component.ex:198 #, elixir-autogen, elixir-format msgid "Back" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:314 +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 #, elixir-autogen, elixir-format msgid "Facilitators" msgstr "" #: lib/claper_web/live/event_live/event_form_component.html.heex:7 -#: lib/claper_web/live/event_live/index.html.heex:107 -#: lib/claper_web/live/event_live/manage.html.heex:430 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 #: lib/claper_web/templates/lti/registration/success.html.heex:26 #, elixir-autogen, elixir-format msgid "Finish" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "" #: lib/claper_web/live/event_live/event_form_component.html.heex:5 -#: lib/claper_web/live/event_live/index.html.heex:105 -#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 #: lib/claper_web/live/event_live/manager_settings_component.ex:176 #: lib/claper_web/live/event_live/quiz_component.ex:161 #: lib/claper_web/live/event_live/quiz_component.ex:209 @@ -1076,57 +1085,57 @@ msgstr "" msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:546 +#: lib/claper_web/live/event_live/manage.html.heex:545 #, elixir-autogen, elixir-format msgid "Time to launch your presentation!" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "Use the associated keyboard shortcuts for quick toggling of these settings." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:148 +#: lib/claper_web/live/event_live/index.html.heex:149 #, elixir-autogen, elixir-format msgid "Your first steps with Claper" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:166 +#: lib/claper_web/live/event_live/index.html.heex:167 #, elixir-autogen, elixir-format msgid "Create event" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:224 +#: lib/claper_web/live/event_live/index.html.heex:225 #, elixir-autogen, elixir-format msgid "Create your first event" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:294 +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 #, elixir-autogen, elixir-format msgid "Event start date" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:118 +#: lib/claper_web/live/event_live/index.html.heex:119 #, elixir-autogen, elixir-format msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:123 +#: lib/claper_web/live/event_live/index.html.heex:124 #, elixir-autogen, elixir-format msgid "In a hurry ?" msgstr "" @@ -1136,18 +1145,18 @@ msgstr "" msgid "Live" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:111 +#: lib/claper_web/live/event_live/index.html.heex:112 #, elixir-autogen, elixir-format msgid "My events" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:271 -#: lib/claper_web/live/event_live/index.html.heex:86 +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 #, elixir-autogen, elixir-format msgid "Name of your event" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format msgid "Note: Facilitators do not have the ability to delete your event." msgstr "" @@ -1157,12 +1166,12 @@ msgstr "" msgid "Presentation file (optional)" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:141 +#: lib/claper_web/live/event_live/index.html.heex:142 #, elixir-autogen, elixir-format msgid "Quick event" msgstr "" -#: lib/claper_web/live/event_live/index.ex:91 +#: lib/claper_web/live/event_live/index.ex:102 #, elixir-autogen, elixir-format msgid "Quick event created successfully" msgstr "" @@ -1172,7 +1181,7 @@ msgstr "" msgid "Return to your last event" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format msgid "Select the start date for your event. Future dates are permissible." msgstr "" @@ -1182,22 +1191,22 @@ msgstr "" msgid "Select your presentation (optional)" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:280 +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 #, elixir-autogen, elixir-format msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." msgstr "" -#: lib/claper_web/live/event_live/show.ex:192 +#: lib/claper_web/live/event_live/show.ex:193 #, elixir-autogen, elixir-format msgid "This event has been terminated" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:147 +#: lib/claper_web/live/event_live/index.html.heex:148 #, elixir-autogen, elixir-format msgid "Welcome to Claper! You can create a new event here." msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:304 +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 #, elixir-autogen, elixir-format msgid "When your event will start?" msgstr "" @@ -1207,8 +1216,8 @@ msgstr "" msgid "Create your next presentation with" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:27 -#: lib/claper_web/live/event_live/presenter.ex:24 +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:25 #, elixir-autogen, elixir-format msgid "Event doesn't exist" @@ -1219,7 +1228,7 @@ msgstr "" msgid "Customize your account" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:265 +#: lib/claper_web/live/user_settings_live/show.html.heex:278 #, elixir-autogen, elixir-format msgid "Language" msgstr "" @@ -1239,22 +1248,22 @@ msgstr "" msgid "Question" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1175 +#: lib/claper_web/live/event_live/manage.html.heex:1167 #, elixir-autogen, elixir-format msgid "Questions" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1262 +#: lib/claper_web/live/event_live/manage.html.heex:1254 #, elixir-autogen, elixir-format msgid "Questions will appear here." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1304 +#: lib/claper_web/live/event_live/manage.html.heex:1296 #, elixir-autogen, elixir-format msgid "Sort by date" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1283 +#: lib/claper_web/live/event_live/manage.html.heex:1275 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "" @@ -1264,7 +1273,8 @@ msgstr "" msgid "Event manager" msgstr "" -#: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "" @@ -1280,7 +1290,7 @@ msgstr "" msgid "Your personal informations to access your account" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:533 +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 #, elixir-autogen, elixir-format msgid "Enable reactions" msgstr "" @@ -1336,43 +1346,43 @@ msgid "Add Claper" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:123 -#: lib/claper_web/live/event_live/manage.html.heex:539 +#: lib/claper_web/live/event_live/manage.html.heex:538 #, elixir-autogen, elixir-format msgid "Close preview" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:743 +#: lib/claper_web/live/event_live/manage.html.heex:734 #, elixir-autogen, elixir-format msgid "Create your first interaction." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1101 +#: lib/claper_web/live/event_live/manage.html.heex:1093 #, elixir-autogen, elixir-format msgid "Disable" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1118 +#: lib/claper_web/live/event_live/manage.html.heex:1110 #, elixir-autogen, elixir-format msgid "Enable" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:443 +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 #, elixir-autogen, elixir-format msgid "Enable messages to change this option" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:122 -#: lib/claper_web/live/event_live/manage.html.heex:538 +#: lib/claper_web/live/event_live/manage.html.heex:537 #, elixir-autogen, elixir-format msgid "Open preview" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:321 +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 #, elixir-autogen, elixir-format msgid "Show messages to change this option" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:740 +#: lib/claper_web/live/event_live/manage.html.heex:731 #, elixir-autogen, elixir-format msgid "This slide does not have any interactions." msgstr "" @@ -1399,7 +1409,7 @@ msgstr "" msgid "The account has been unlinked." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "This section contains all your interactions." msgstr "" @@ -1410,12 +1420,12 @@ msgstr "" msgid "Unlink" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "You can add interactions to your presentation slides." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:715 +#: lib/claper_web/live/event_live/manage.html.heex:706 #, elixir-autogen, elixir-format msgid "Your interactions" msgstr "" @@ -1440,12 +1450,12 @@ msgstr "" msgid "Your password has been set, you can now unlink your account." msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:38 +#: lib/claper_web/live/embed_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Iframe code" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:39 +#: lib/claper_web/live/embed_live/form_component.html.heex:35 #, elixir-autogen, elixir-format msgid "Link to the content" msgstr "" @@ -1471,24 +1481,24 @@ msgstr "" msgid "Please enter valid HTML content with an iframe tag" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:25 +#: lib/claper_web/live/embed_live/form_component.html.heex:23 #, elixir-autogen, elixir-format msgid "Provider" msgstr "" -#: lib/claper_web/live/poll_live/form_component.html.heex:89 +#: lib/claper_web/live/poll_live/form_component.html.heex:85 #, elixir-autogen, elixir-format msgid "Attendees can see the results on their device" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:56 +#: lib/claper_web/live/embed_live/form_component.html.heex:50 #, elixir-autogen, elixir-format msgid "Attendees can view the web content on their device" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:49 -#: lib/claper_web/live/poll_live/form_component.html.heex:82 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:172 +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 #, elixir-autogen, elixir-format msgid "Options" msgstr "" @@ -1556,12 +1566,12 @@ msgstr "" msgid "More options" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "No" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "Yes" msgstr "" @@ -1611,32 +1621,32 @@ msgstr "" msgid "back to the home page" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:46 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 #, elixir-autogen, elixir-format msgid "Add Question" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:294 +#: lib/claper_web/live/event_live/manage.html.heex:293 #, elixir-autogen, elixir-format msgid "Add a quiz to test knowledge." msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 #, elixir-autogen, elixir-format msgid "Add answer" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 #, elixir-autogen, elixir-format msgid "Allow anonymous messages" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:84 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 #, elixir-autogen, elixir-format msgid "Answer %{index}" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:390 +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 #, elixir-autogen, elixir-format msgid "Attendees" msgstr "" @@ -1652,32 +1662,32 @@ msgstr "" msgid "Current quiz" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:485 +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 #, elixir-autogen, elixir-format msgid "Deny anonymous messages" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 #, elixir-autogen, elixir-format msgid "Disable messages" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:536 +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 #, elixir-autogen, elixir-format msgid "Disable reactions" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:369 +#: lib/claper_web/live/event_live/manage.html.heex:368 #, elixir-autogen, elixir-format msgid "Edit quiz" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:258 +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 #, elixir-autogen, elixir-format msgid "Hide instructions to join" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 #, elixir-autogen, elixir-format msgid "Hide messages" msgstr "" @@ -1700,12 +1710,12 @@ msgstr "" msgid "Interaction" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:368 +#: lib/claper_web/live/event_live/manage.html.heex:367 #, elixir-autogen, elixir-format msgid "New quiz" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:217 +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 #, elixir-autogen, elixir-format msgid "Presentation" msgstr "" @@ -1715,13 +1725,13 @@ msgstr "" msgid "Previous" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:292 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:158 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 #, elixir-autogen, elixir-format msgid "Remove question" msgstr "" @@ -1736,17 +1746,17 @@ msgstr "" msgid "See current quiz" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:388 +#: lib/claper_web/live/event_live/manage.html.heex:387 #, elixir-autogen, elixir-format msgid "Select presentation" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:361 +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 #, elixir-autogen, elixir-format msgid "Show all messages" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:255 +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 #, elixir-autogen, elixir-format msgid "Show instructions to join" msgstr "" @@ -1762,7 +1772,7 @@ msgstr "" msgid "Show results on presentation" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:206 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the quiz itself, are you sure?" msgstr "" @@ -1772,7 +1782,7 @@ msgstr "" msgid "Waiting for results..." msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:62 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 #, elixir-autogen, elixir-format msgid "Your question" msgstr "" @@ -1790,7 +1800,7 @@ msgstr "" msgid "Export" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:218 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 #, elixir-autogen, elixir-format msgid "Export to QTI (XML)" msgstr "" @@ -1850,17 +1860,21 @@ msgstr "" msgid "Web Content" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:178 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 #, elixir-autogen, elixir-format msgid "Active" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:217 +#: lib/claper_web/live/event_live/index.html.heex:218 #, elixir-autogen, elixir-format msgid "Load more" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:194 +#: lib/claper_web/live/event_live/index.html.heex:195 #, elixir-autogen, elixir-format msgid "Shared with you" msgstr "" @@ -1870,17 +1884,17 @@ msgstr "" msgid "You must login to continue" msgstr "" -#: lib/claper/quizzes/quiz_question.ex:41 +#: lib/claper/quizzes/quiz_question.ex:51 #, elixir-autogen, elixir-format msgid "must have at least one correct answer" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:548 +#: lib/claper_web/live/event_live/manage.html.heex:547 #, elixir-autogen, elixir-format msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:179 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 #, elixir-autogen, elixir-format msgid "Allow anonymous submissions" msgstr "" @@ -1899,3 +1913,771 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Total submissions" msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format +msgid "Actions" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Active Events" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to delete this event?" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to delete this provider?" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to delete this user?" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format +msgid "Audience Peak" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format +msgid "Choose file" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format +msgid "Confirmed" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Create Event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Create User" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format +msgid "Created" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format +msgid "Created At" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format +msgid "Currently running" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format +msgid "Delete event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format +msgid "Delete user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter password" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format +msgid "Events" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format +msgid "Form Post" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format +msgid "Inactive" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "OIDC Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format +msgid "OIDC Providers" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format +msgid "Provider updated successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format +msgid "Select an option" +msgstr "" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "User updated successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format +msgid "View provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format +msgid "attendees" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format +msgid "Back to events" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "Back to providers" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format +msgid "Back to users" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format +msgid "New provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format +msgid "New user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format +msgid "No providers found" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format +msgid "Provider deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format +msgid "Provider details" +msgstr "" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Confirm email change" +msgstr "" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format +msgid "If you didn't request an email change, please ignore this." +msgstr "" + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format +msgid "You can confirm your email change by visiting the URL below" +msgstr "" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format +msgid "Show attendee count" +msgstr "" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index ec7431c..49ce3b1 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -8,15 +8,18 @@ msgstr "" "Language: en\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: lib/claper_web/live/event_live/manage.html.heex:1457 -#: lib/claper_web/live/event_live/manage.html.heex:1463 +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 #: lib/claper_web/live/user_settings_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Settings" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:815 -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:34 #: lib/claper_web/templates/user_registration/new.html.heex:29 #: lib/claper_web/templates/user_reset_password/new.html.heex:28 @@ -43,7 +46,10 @@ msgstr "" msgid "Change" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:287 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 #, elixir-autogen, elixir-format msgid "Code" msgstr "" @@ -54,7 +60,7 @@ msgstr "" msgid "Email address" msgstr "" -#: lib/claper_web/templates/layout/_user_menu.html.heex:16 +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 #, elixir-autogen, elixir-format msgid "Logout" msgstr "" @@ -97,15 +103,18 @@ msgstr "" #: lib/claper_web/live/event_live/event_card_component.ex:111 #: lib/claper_web/live/event_live/join.ex:41 #: lib/claper_web/live/event_live/join.html.heex:94 -#: lib/claper_web/live/event_live/manage.html.heex:493 +#: lib/claper_web/live/event_live/manage.html.heex:492 #: lib/claper_web/live/event_live/show.html.heex:286 #, elixir-autogen, elixir-format msgid "Join" msgstr "" -#: lib/claper_web/live/event_live/index.ex:212 +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 #: lib/claper_web/live/event_live/join.html.heex:31 #: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 #, elixir-autogen, elixir-format msgid "Dashboard" msgstr "" @@ -122,7 +131,7 @@ msgid "seconds" msgstr "" #: lib/claper_web/live/event_live/event_card_component.ex:60 -#: lib/claper_web/live/event_live/index.html.heex:186 +#: lib/claper_web/live/event_live/index.html.heex:187 #, elixir-autogen, elixir-format msgid "Finished" msgstr "" @@ -175,47 +184,50 @@ msgstr "" msgid "Created successfully" msgstr "" +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 #: lib/claper_web/live/event_live/event_card_component.ex:250 #: lib/claper_web/live/event_live/event_card_component.ex:330 #: lib/claper_web/live/event_live/form_component.ex:97 -#: lib/claper_web/live/event_live/index.ex:193 +#: lib/claper_web/live/event_live/index.ex:204 #, elixir-autogen, elixir-format msgid "Edit" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:69 +#: lib/claper_web/live/embed_live/form_component.html.heex:63 #: lib/claper_web/live/event_live/event_form_component.html.heex:55 #: lib/claper_web/live/event_live/event_form_component.html.heex:62 -#: lib/claper_web/live/event_live/index.ex:202 -#: lib/claper_web/live/event_live/index.html.heex:93 -#: lib/claper_web/live/form_live/form_component.html.heex:98 -#: lib/claper_web/live/poll_live/form_component.html.heex:106 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 #, elixir-autogen, elixir-format msgid "Create" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#: lib/claper_web/live/embed_live/form_component.html.heex:68 #: lib/claper_web/live/event_live/event_card_component.ex:444 #: lib/claper_web/live/event_live/event_form_component.html.heex:67 -#: lib/claper_web/live/event_live/manage.html.heex:1405 +#: lib/claper_web/live/event_live/manage.html.heex:1397 #: lib/claper_web/live/event_live/manageable_post_component.ex:92 #: lib/claper_web/live/event_live/post_component.ex:70 #: lib/claper_web/live/event_live/post_component.ex:142 -#: lib/claper_web/live/form_live/form_component.html.heex:103 -#: lib/claper_web/live/poll_live/form_component.html.heex:111 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:129 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:199 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 #, elixir-autogen, elixir-format msgid "Delete" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:70 +#: lib/claper_web/live/embed_live/form_component.html.heex:64 #: lib/claper_web/live/event_live/event_form_component.html.heex:54 #: lib/claper_web/live/event_live/event_form_component.html.heex:61 -#: lib/claper_web/live/form_live/form_component.html.heex:99 -#: lib/claper_web/live/poll_live/form_component.html.heex:107 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:194 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 #: lib/claper_web/live/user_settings_live/show.html.heex:38 #: lib/claper_web/live/user_settings_live/show.html.heex:80 #: lib/claper_web/live/user_settings_live/show.html.heex:123 @@ -259,12 +271,6 @@ msgstr "" msgid "CONFIRM EMAIL" msgstr "" -#: lib/claper_web/templates/user_notifier/change.html.heex:17 -#, elixir-autogen, elixir-format -msgid "Confirm email" -msgstr "" - -#: lib/claper_web/templates/user_notifier/change.html.heex:32 #: lib/claper_web/templates/user_notifier/confirm.html.heex:32 #: lib/claper_web/templates/user_notifier/magic.html.heex:32 #: lib/claper_web/templates/user_notifier/reset.html.heex:32 @@ -295,9 +301,9 @@ msgid "Presentation uploaded" msgstr "" #: lib/claper_web/live/event_live/event_form_component.html.heex:163 -#: lib/claper_web/live/event_live/event_form_component.html.heex:241 -#: lib/claper_web/live/event_live/event_form_component.html.heex:369 -#: lib/claper_web/live/event_live/event_form_component.html.heex:393 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 #, elixir-autogen, elixir-format msgid "Remove" msgstr "" @@ -332,17 +338,17 @@ msgstr "" msgid "Change file" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:228 +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 #, elixir-autogen, elixir-format msgid "Presentation replaced" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:306 +#: lib/claper_web/live/event_live/manage.html.heex:305 #, elixir-autogen, elixir-format msgid "Edit poll" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:305 +#: lib/claper_web/live/event_live/manage.html.heex:304 #, elixir-autogen, elixir-format msgid "New poll" msgstr "" @@ -357,18 +363,18 @@ msgstr "" msgid "Upload failed" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:198 +#: lib/claper_web/live/event_live/manage.html.heex:197 #, elixir-autogen, elixir-format msgid "Add poll to know opinion of your public." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:195 -#: lib/claper_web/live/event_live/manage.html.heex:786 +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 #, elixir-autogen, elixir-format msgid "Poll" msgstr "" -#: lib/claper_web/live/poll_live/form_component.html.heex:30 +#: lib/claper_web/live/poll_live/form_component.html.heex:26 #, elixir-format, ex-autogen, elixir-autogen msgid "Choice %{count}" msgid_plural "Choice %{count}" @@ -391,18 +397,18 @@ msgstr "" msgid "Vote" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:358 -#: lib/claper_web/live/event_live/event_form_component.html.heex:376 +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 #, elixir-autogen, elixir-format msgid "User email address" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:207 +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 #, elixir-autogen, elixir-format msgid "Changing your file will remove all interaction elements like polls associated." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1221 +#: lib/claper_web/live/event_live/manage.html.heex:1213 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "" @@ -412,7 +418,7 @@ msgstr "" msgid "Processing your file..." msgstr "" -#: lib/claper_web/live/poll_live/form_component.html.heex:118 +#: lib/claper_web/live/poll_live/form_component.html.heex:114 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the poll itself, are you sure?" msgstr "" @@ -422,14 +428,14 @@ msgstr "" msgid "Ask, comment..." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1159 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format msgid "Messages" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:341 +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 #, elixir-autogen, elixir-format msgid "Add facilitator" msgstr "" @@ -444,7 +450,7 @@ msgstr "" msgid "The site is under maintenance, we'll be back very soon!" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:320 +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 #, elixir-autogen, elixir-format msgid "Facilitators can present and manage interactions" msgstr "" @@ -458,13 +464,8 @@ msgstr "" msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" msgstr "" -#: lib/claper_web/templates/user_notifier/change.html.heex:22 -#, elixir-autogen, elixir-format -msgid "You can change your email by visiting the URL below" -msgstr "" - -#: lib/claper_web/live/event_live/manage.html.heex:759 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "" @@ -622,6 +623,7 @@ msgstr "" msgid "Create account" msgstr "" +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:161 #: lib/claper_web/templates/user_registration/new.html.heex:37 #: lib/claper_web/templates/user_reset_password/edit.html.heex:34 @@ -657,14 +659,14 @@ msgstr "" msgid "Your password has been updated." msgstr "" -#: lib/claper_web/live/form_live/form_component.html.heex:30 +#: lib/claper_web/live/form_live/form_component.html.heex:26 #, elixir-autogen, elixir-format msgid "Field %{count}" msgid_plural "Field %{count}" msgstr[0] "" msgstr[1] "" -#: lib/claper_web/live/event_live/manage.html.heex:231 +#: lib/claper_web/live/event_live/manage.html.heex:230 #, elixir-autogen, elixir-format msgid "Add form to collect data from your public." msgstr "" @@ -674,34 +676,41 @@ msgstr "" msgid "Current form" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:327 +#: lib/claper_web/live/event_live/manage.html.heex:326 #, elixir-autogen, elixir-format msgid "Edit form" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:228 -#: lib/claper_web/live/event_live/manage.html.heex:830 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 #, elixir-autogen, elixir-format msgid "Form" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1191 +#: lib/claper_web/live/event_live/manage.html.heex:1183 #, elixir-autogen, elixir-format msgid "Form submissions" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1390 +#: lib/claper_web/live/event_live/manage.html.heex:1382 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "" -#: lib/claper_web/live/event_live/manage.ex:814 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 #, elixir-autogen, elixir-format msgid "Name" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:326 +#: lib/claper_web/live/event_live/manage.html.heex:325 #, elixir-autogen, elixir-format msgid "New form" msgstr "" @@ -722,17 +731,17 @@ msgstr "" msgid "Submit" msgstr "" -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #, elixir-autogen, elixir-format msgid "Text" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1402 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "" -#: lib/claper_web/live/form_live/form_component.html.heex:110 +#: lib/claper_web/live/form_live/form_component.html.heex:105 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the form itself, are you sure?" msgstr "" @@ -742,7 +751,7 @@ msgstr "" msgid "Title of your form" msgstr "" -#: lib/claper_web/live/form_live/form_component.html.heex:40 +#: lib/claper_web/live/form_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Type" msgstr "" @@ -757,7 +766,7 @@ msgstr "" msgid "Select one or multiple options" msgstr "" -#: lib/claper_web/live/poll_live/form_component.html.heex:96 +#: lib/claper_web/live/poll_live/form_component.html.heex:92 #, elixir-autogen, elixir-format msgid "Multiple answers" msgstr "" @@ -767,12 +776,12 @@ msgstr "" msgid "PDF, PPT, PPTX up to %{size} MB" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:426 +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 #, elixir-autogen, elixir-format msgid "Enable messages" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:304 +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 #, elixir-autogen, elixir-format msgid "Show messages" msgstr "" @@ -821,7 +830,7 @@ msgstr "" msgid "Account creation is disabled" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:262 +#: lib/claper_web/live/event_live/manage.html.heex:261 #, elixir-autogen, elixir-format msgid "Add a Youtube video or any web content." msgstr "" @@ -872,12 +881,12 @@ msgstr "" msgid "Current web content" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:348 +#: lib/claper_web/live/event_live/manage.html.heex:347 #, elixir-autogen, elixir-format msgid "Edit web content" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:347 +#: lib/claper_web/live/event_live/manage.html.heex:346 #, elixir-autogen, elixir-format msgid "New web content" msgstr "" @@ -887,7 +896,7 @@ msgstr "" msgid "See current web content" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:80 +#: lib/claper_web/live/embed_live/form_component.html.heex:74 #, elixir-autogen, elixir-format msgid "This will delete the web content, are you sure?" msgstr "" @@ -898,8 +907,8 @@ msgstr "" msgid "Title" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:260 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 #, elixir-autogen, elixir-format msgid "Web content" msgstr "" @@ -916,17 +925,17 @@ msgstr "" msgid "Pinned" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1175 #, elixir-autogen, elixir-format msgid "Pinned messages" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1344 +#: lib/claper_web/live/event_live/manage.html.heex:1336 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:359 +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 #, elixir-autogen, elixir-format msgid "Show only pinned messages" msgstr "" @@ -967,7 +976,7 @@ msgstr "" msgid "Saved" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:301 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "" @@ -982,22 +991,22 @@ msgstr "" msgid "Attendees room" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:291 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:275 +#: lib/claper_web/live/user_settings_live/show.html.heex:288 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:284 +#: lib/claper_web/live/user_settings_live/show.html.heex:297 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:566 +#: lib/claper_web/live/event_live/manage.html.heex:565 #, elixir-autogen, elixir-format msgid "Open presentation" msgstr "" @@ -1012,7 +1021,7 @@ msgstr "" msgid "Your account has been deleted." msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:279 +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 #, elixir-autogen, elixir-format, fuzzy msgid "Access code" msgstr "" @@ -1022,46 +1031,46 @@ msgstr "" msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1155 +#: lib/claper_web/live/event_live/manage.html.heex:1147 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "" #: lib/claper_web/live/event_live/event_form_component.html.heex:6 -#: lib/claper_web/live/event_live/index.html.heex:106 -#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 #: lib/claper_web/live/event_live/quiz_component.ex:151 #: lib/claper_web/live/event_live/quiz_component.ex:198 #, elixir-autogen, elixir-format msgid "Back" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:314 +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 #, elixir-autogen, elixir-format, fuzzy msgid "Facilitators" msgstr "" #: lib/claper_web/live/event_live/event_form_component.html.heex:7 -#: lib/claper_web/live/event_live/index.html.heex:107 -#: lib/claper_web/live/event_live/manage.html.heex:430 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 #: lib/claper_web/templates/lti/registration/success.html.heex:26 #, elixir-autogen, elixir-format, fuzzy msgid "Finish" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "" #: lib/claper_web/live/event_live/event_form_component.html.heex:5 -#: lib/claper_web/live/event_live/index.html.heex:105 -#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 #: lib/claper_web/live/event_live/manager_settings_component.ex:176 #: lib/claper_web/live/event_live/quiz_component.ex:161 #: lib/claper_web/live/event_live/quiz_component.ex:209 @@ -1074,57 +1083,57 @@ msgstr "" msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:546 +#: lib/claper_web/live/event_live/manage.html.heex:545 #, elixir-autogen, elixir-format, fuzzy msgid "Time to launch your presentation!" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "Use the associated keyboard shortcuts for quick toggling of these settings." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:148 +#: lib/claper_web/live/event_live/index.html.heex:149 #, elixir-autogen, elixir-format msgid "Your first steps with Claper" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:166 +#: lib/claper_web/live/event_live/index.html.heex:167 #, elixir-autogen, elixir-format, fuzzy msgid "Create event" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:224 +#: lib/claper_web/live/event_live/index.html.heex:225 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first event" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:294 +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 #, elixir-autogen, elixir-format msgid "Event start date" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:118 +#: lib/claper_web/live/event_live/index.html.heex:119 #, elixir-autogen, elixir-format msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format, fuzzy msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:123 +#: lib/claper_web/live/event_live/index.html.heex:124 #, elixir-autogen, elixir-format msgid "In a hurry ?" msgstr "" @@ -1134,18 +1143,18 @@ msgstr "" msgid "Live" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:111 +#: lib/claper_web/live/event_live/index.html.heex:112 #, elixir-autogen, elixir-format msgid "My events" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:271 -#: lib/claper_web/live/event_live/index.html.heex:86 +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 #, elixir-autogen, elixir-format, fuzzy msgid "Name of your event" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format, fuzzy msgid "Note: Facilitators do not have the ability to delete your event." msgstr "" @@ -1155,12 +1164,12 @@ msgstr "" msgid "Presentation file (optional)" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:141 +#: lib/claper_web/live/event_live/index.html.heex:142 #, elixir-autogen, elixir-format msgid "Quick event" msgstr "" -#: lib/claper_web/live/event_live/index.ex:91 +#: lib/claper_web/live/event_live/index.ex:102 #, elixir-autogen, elixir-format msgid "Quick event created successfully" msgstr "" @@ -1170,7 +1179,7 @@ msgstr "" msgid "Return to your last event" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format, fuzzy msgid "Select the start date for your event. Future dates are permissible." msgstr "" @@ -1180,22 +1189,22 @@ msgstr "" msgid "Select your presentation (optional)" msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:280 +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 #, elixir-autogen, elixir-format, fuzzy msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." msgstr "" -#: lib/claper_web/live/event_live/show.ex:192 +#: lib/claper_web/live/event_live/show.ex:193 #, elixir-autogen, elixir-format msgid "This event has been terminated" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:147 +#: lib/claper_web/live/event_live/index.html.heex:148 #, elixir-autogen, elixir-format, fuzzy msgid "Welcome to Claper! You can create a new event here." msgstr "" -#: lib/claper_web/live/event_live/event_form_component.html.heex:304 +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 #, elixir-autogen, elixir-format, fuzzy msgid "When your event will start?" msgstr "" @@ -1205,8 +1214,8 @@ msgstr "" msgid "Create your next presentation with" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:27 -#: lib/claper_web/live/event_live/presenter.ex:24 +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:25 #, elixir-autogen, elixir-format msgid "Event doesn't exist" @@ -1217,7 +1226,7 @@ msgstr "" msgid "Customize your account" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:265 +#: lib/claper_web/live/user_settings_live/show.html.heex:278 #, elixir-autogen, elixir-format msgid "Language" msgstr "" @@ -1237,22 +1246,22 @@ msgstr "" msgid "Question" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1175 +#: lib/claper_web/live/event_live/manage.html.heex:1167 #, elixir-autogen, elixir-format msgid "Questions" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1262 +#: lib/claper_web/live/event_live/manage.html.heex:1254 #, elixir-autogen, elixir-format msgid "Questions will appear here." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1304 +#: lib/claper_web/live/event_live/manage.html.heex:1296 #, elixir-autogen, elixir-format msgid "Sort by date" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1283 +#: lib/claper_web/live/event_live/manage.html.heex:1275 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "" @@ -1262,7 +1271,8 @@ msgstr "" msgid "Event manager" msgstr "" -#: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "" @@ -1278,7 +1288,7 @@ msgstr "" msgid "Your personal informations to access your account" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:533 +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 #, elixir-autogen, elixir-format, fuzzy msgid "Enable reactions" msgstr "" @@ -1334,43 +1344,43 @@ msgid "Add Claper" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:123 -#: lib/claper_web/live/event_live/manage.html.heex:539 +#: lib/claper_web/live/event_live/manage.html.heex:538 #, elixir-autogen, elixir-format msgid "Close preview" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:743 +#: lib/claper_web/live/event_live/manage.html.heex:734 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first interaction." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1101 +#: lib/claper_web/live/event_live/manage.html.heex:1093 #, elixir-autogen, elixir-format, fuzzy msgid "Disable" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1118 +#: lib/claper_web/live/event_live/manage.html.heex:1110 #, elixir-autogen, elixir-format msgid "Enable" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:443 +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 #, elixir-autogen, elixir-format, fuzzy msgid "Enable messages to change this option" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:122 -#: lib/claper_web/live/event_live/manage.html.heex:538 +#: lib/claper_web/live/event_live/manage.html.heex:537 #, elixir-autogen, elixir-format msgid "Open preview" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:321 +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 #, elixir-autogen, elixir-format msgid "Show messages to change this option" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:740 +#: lib/claper_web/live/event_live/manage.html.heex:731 #, elixir-autogen, elixir-format msgid "This slide does not have any interactions." msgstr "" @@ -1397,7 +1407,7 @@ msgstr "" msgid "The account has been unlinked." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "This section contains all your interactions." msgstr "" @@ -1408,12 +1418,12 @@ msgstr "" msgid "Unlink" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "You can add interactions to your presentation slides." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:715 +#: lib/claper_web/live/event_live/manage.html.heex:706 #, elixir-autogen, elixir-format msgid "Your interactions" msgstr "" @@ -1438,12 +1448,12 @@ msgstr "" msgid "Your password has been set, you can now unlink your account." msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:38 +#: lib/claper_web/live/embed_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Iframe code" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:39 +#: lib/claper_web/live/embed_live/form_component.html.heex:35 #, elixir-autogen, elixir-format msgid "Link to the content" msgstr "" @@ -1469,24 +1479,24 @@ msgstr "" msgid "Please enter valid HTML content with an iframe tag" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:25 +#: lib/claper_web/live/embed_live/form_component.html.heex:23 #, elixir-autogen, elixir-format msgid "Provider" msgstr "" -#: lib/claper_web/live/poll_live/form_component.html.heex:89 +#: lib/claper_web/live/poll_live/form_component.html.heex:85 #, elixir-autogen, elixir-format msgid "Attendees can see the results on their device" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:56 +#: lib/claper_web/live/embed_live/form_component.html.heex:50 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees can view the web content on their device" msgstr "" -#: lib/claper_web/live/embed_live/form_component.html.heex:49 -#: lib/claper_web/live/poll_live/form_component.html.heex:82 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:172 +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 #, elixir-autogen, elixir-format msgid "Options" msgstr "" @@ -1554,12 +1564,12 @@ msgstr "" msgid "More options" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "No" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "Yes" msgstr "" @@ -1609,32 +1619,32 @@ msgstr "" msgid "back to the home page" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:46 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 #, elixir-autogen, elixir-format, fuzzy msgid "Add Question" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:294 +#: lib/claper_web/live/event_live/manage.html.heex:293 #, elixir-autogen, elixir-format msgid "Add a quiz to test knowledge." msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 #, elixir-autogen, elixir-format msgid "Add answer" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous messages" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:84 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 #, elixir-autogen, elixir-format msgid "Answer %{index}" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:390 +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees" msgstr "" @@ -1650,32 +1660,32 @@ msgstr "" msgid "Current quiz" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:485 +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 #, elixir-autogen, elixir-format, fuzzy msgid "Deny anonymous messages" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 #, elixir-autogen, elixir-format, fuzzy msgid "Disable messages" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:536 +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 #, elixir-autogen, elixir-format, fuzzy msgid "Disable reactions" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:369 +#: lib/claper_web/live/event_live/manage.html.heex:368 #, elixir-autogen, elixir-format, fuzzy msgid "Edit quiz" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:258 +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 #, elixir-autogen, elixir-format msgid "Hide instructions to join" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 #, elixir-autogen, elixir-format, fuzzy msgid "Hide messages" msgstr "" @@ -1698,12 +1708,12 @@ msgstr "" msgid "Interaction" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:368 +#: lib/claper_web/live/event_live/manage.html.heex:367 #, elixir-autogen, elixir-format msgid "New quiz" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:217 +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 #, elixir-autogen, elixir-format, fuzzy msgid "Presentation" msgstr "" @@ -1713,13 +1723,13 @@ msgstr "" msgid "Previous" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:292 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:158 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 #, elixir-autogen, elixir-format msgid "Remove question" msgstr "" @@ -1734,17 +1744,17 @@ msgstr "" msgid "See current quiz" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:388 +#: lib/claper_web/live/event_live/manage.html.heex:387 #, elixir-autogen, elixir-format, fuzzy msgid "Select presentation" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:361 +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 #, elixir-autogen, elixir-format, fuzzy msgid "Show all messages" msgstr "" -#: lib/claper_web/live/event_live/manager_settings_component.ex:255 +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 #, elixir-autogen, elixir-format, fuzzy msgid "Show instructions to join" msgstr "" @@ -1760,7 +1770,7 @@ msgstr "" msgid "Show results on presentation" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:206 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 #, elixir-autogen, elixir-format, fuzzy msgid "This will delete all responses associated and the quiz itself, are you sure?" msgstr "" @@ -1770,7 +1780,7 @@ msgstr "" msgid "Waiting for results..." msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:62 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 #, elixir-autogen, elixir-format msgid "Your question" msgstr "" @@ -1788,7 +1798,7 @@ msgstr "" msgid "Export" msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:218 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 #, elixir-autogen, elixir-format msgid "Export to QTI (XML)" msgstr "" @@ -1848,17 +1858,21 @@ msgstr "" msgid "Web Content" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:178 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 #, elixir-autogen, elixir-format msgid "Active" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:217 +#: lib/claper_web/live/event_live/index.html.heex:218 #, elixir-autogen, elixir-format msgid "Load more" msgstr "" -#: lib/claper_web/live/event_live/index.html.heex:194 +#: lib/claper_web/live/event_live/index.html.heex:195 #, elixir-autogen, elixir-format msgid "Shared with you" msgstr "" @@ -1868,17 +1882,17 @@ msgstr "" msgid "You must login to continue" msgstr "" -#: lib/claper/quizzes/quiz_question.ex:41 +#: lib/claper/quizzes/quiz_question.ex:51 #, elixir-autogen, elixir-format msgid "must have at least one correct answer" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:548 +#: lib/claper_web/live/event_live/manage.html.heex:547 #, elixir-autogen, elixir-format msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." msgstr "" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:179 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous submissions" msgstr "" @@ -1897,3 +1911,771 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Total submissions" msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format, fuzzy +msgid "Actions" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Active Events" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this event?" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this provider?" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this user?" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format, fuzzy +msgid "Audience Peak" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format, fuzzy +msgid "Choose file" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirmed" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create Event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create User" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created At" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Currently running" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enter password" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format, fuzzy +msgid "Events" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format, fuzzy +msgid "Form Post" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format, fuzzy +msgid "Inactive" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Providers" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider updated successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select an option" +msgstr "" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format, fuzzy +msgid "User updated successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format, fuzzy +msgid "View provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format, fuzzy +msgid "attendees" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to events" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to providers" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to users" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format, fuzzy +msgid "New provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format, fuzzy +msgid "New user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format, fuzzy +msgid "No providers found" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirm email change" +msgstr "" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format, fuzzy +msgid "If you didn't request an email change, please ignore this." +msgstr "" + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "You can confirm your email change by visiting the URL below" +msgstr "" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show attendee count" +msgstr "" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po index 178d439..db4b4c7 100644 --- a/priv/gettext/es/LC_MESSAGES/default.po +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -8,15 +8,18 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: lib/claper_web/live/event_live/manage.html.heex:1457 -#: lib/claper_web/live/event_live/manage.html.heex:1463 +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 #: lib/claper_web/live/user_settings_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Settings" msgstr "Configuración" -#: lib/claper_web/live/event_live/manage.ex:815 -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:34 #: lib/claper_web/templates/user_registration/new.html.heex:29 #: lib/claper_web/templates/user_reset_password/new.html.heex:28 @@ -43,7 +46,10 @@ msgstr "Uy, comprueba que todos los campos estén correctamente rellenados." msgid "Change" msgstr "Cambiar" -#: lib/claper_web/live/event_live/event_form_component.html.heex:287 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 #, elixir-autogen, elixir-format msgid "Code" msgstr "Código" @@ -54,7 +60,7 @@ msgstr "Código" msgid "Email address" msgstr "Dirección email" -#: lib/claper_web/templates/layout/_user_menu.html.heex:16 +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 #, elixir-autogen, elixir-format msgid "Logout" msgstr "Salir" @@ -97,15 +103,18 @@ msgstr "¡Sé el primero en reaccionar!" #: lib/claper_web/live/event_live/event_card_component.ex:111 #: lib/claper_web/live/event_live/join.ex:41 #: lib/claper_web/live/event_live/join.html.heex:94 -#: lib/claper_web/live/event_live/manage.html.heex:493 +#: lib/claper_web/live/event_live/manage.html.heex:492 #: lib/claper_web/live/event_live/show.html.heex:286 #, elixir-autogen, elixir-format msgid "Join" msgstr "Unirse" -#: lib/claper_web/live/event_live/index.ex:212 +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 #: lib/claper_web/live/event_live/join.html.heex:31 #: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 #, elixir-autogen, elixir-format msgid "Dashboard" msgstr "Panel" @@ -122,7 +131,7 @@ msgid "seconds" msgstr "segundos" #: lib/claper_web/live/event_live/event_card_component.ex:60 -#: lib/claper_web/live/event_live/index.html.heex:186 +#: lib/claper_web/live/event_live/index.html.heex:187 #, elixir-autogen, elixir-format msgid "Finished" msgstr "Finalizado" @@ -175,47 +184,50 @@ msgstr "Volver a principal" msgid "Created successfully" msgstr "Creado exitosamente" +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 #: lib/claper_web/live/event_live/event_card_component.ex:250 #: lib/claper_web/live/event_live/event_card_component.ex:330 #: lib/claper_web/live/event_live/form_component.ex:97 -#: lib/claper_web/live/event_live/index.ex:193 +#: lib/claper_web/live/event_live/index.ex:204 #, elixir-autogen, elixir-format msgid "Edit" msgstr "Editar" -#: lib/claper_web/live/embed_live/form_component.html.heex:69 +#: lib/claper_web/live/embed_live/form_component.html.heex:63 #: lib/claper_web/live/event_live/event_form_component.html.heex:55 #: lib/claper_web/live/event_live/event_form_component.html.heex:62 -#: lib/claper_web/live/event_live/index.ex:202 -#: lib/claper_web/live/event_live/index.html.heex:93 -#: lib/claper_web/live/form_live/form_component.html.heex:98 -#: lib/claper_web/live/poll_live/form_component.html.heex:106 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 #, elixir-autogen, elixir-format msgid "Create" msgstr "Crear" -#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#: lib/claper_web/live/embed_live/form_component.html.heex:68 #: lib/claper_web/live/event_live/event_card_component.ex:444 #: lib/claper_web/live/event_live/event_form_component.html.heex:67 -#: lib/claper_web/live/event_live/manage.html.heex:1405 +#: lib/claper_web/live/event_live/manage.html.heex:1397 #: lib/claper_web/live/event_live/manageable_post_component.ex:92 #: lib/claper_web/live/event_live/post_component.ex:70 #: lib/claper_web/live/event_live/post_component.ex:142 -#: lib/claper_web/live/form_live/form_component.html.heex:103 -#: lib/claper_web/live/poll_live/form_component.html.heex:111 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:129 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:199 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 #, elixir-autogen, elixir-format msgid "Delete" msgstr "Borrar" -#: lib/claper_web/live/embed_live/form_component.html.heex:70 +#: lib/claper_web/live/embed_live/form_component.html.heex:64 #: lib/claper_web/live/event_live/event_form_component.html.heex:54 #: lib/claper_web/live/event_live/event_form_component.html.heex:61 -#: lib/claper_web/live/form_live/form_component.html.heex:99 -#: lib/claper_web/live/poll_live/form_component.html.heex:107 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:194 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 #: lib/claper_web/live/user_settings_live/show.html.heex:38 #: lib/claper_web/live/user_settings_live/show.html.heex:80 #: lib/claper_web/live/user_settings_live/show.html.heex:123 @@ -259,12 +271,6 @@ msgstr "Instrucciones de actualización de correo" msgid "CONFIRM EMAIL" msgstr "CONFIRMAR EMAIL" -#: lib/claper_web/templates/user_notifier/change.html.heex:17 -#, elixir-autogen, elixir-format -msgid "Confirm email" -msgstr "Confirmar email" - -#: lib/claper_web/templates/user_notifier/change.html.heex:32 #: lib/claper_web/templates/user_notifier/confirm.html.heex:32 #: lib/claper_web/templates/user_notifier/magic.html.heex:32 #: lib/claper_web/templates/user_notifier/reset.html.heex:32 @@ -295,9 +301,9 @@ msgid "Presentation uploaded" msgstr "Presentación subida" #: lib/claper_web/live/event_live/event_form_component.html.heex:163 -#: lib/claper_web/live/event_live/event_form_component.html.heex:241 -#: lib/claper_web/live/event_live/event_form_component.html.heex:369 -#: lib/claper_web/live/event_live/event_form_component.html.heex:393 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 #, elixir-autogen, elixir-format msgid "Remove" msgstr "Borrar" @@ -332,17 +338,17 @@ msgstr "Tu fichero es demasiado grande" msgid "Change file" msgstr "Cambiar fichero" -#: lib/claper_web/live/event_live/event_form_component.html.heex:228 +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 #, elixir-autogen, elixir-format msgid "Presentation replaced" msgstr "Presentación sustituida" -#: lib/claper_web/live/event_live/manage.html.heex:306 +#: lib/claper_web/live/event_live/manage.html.heex:305 #, elixir-autogen, elixir-format msgid "Edit poll" msgstr "Editar votación" -#: lib/claper_web/live/event_live/manage.html.heex:305 +#: lib/claper_web/live/event_live/manage.html.heex:304 #, elixir-autogen, elixir-format msgid "New poll" msgstr "Nueva votación" @@ -357,18 +363,18 @@ msgstr "Título de tu votación" msgid "Upload failed" msgstr "Subida fallida" -#: lib/claper_web/live/event_live/manage.html.heex:198 +#: lib/claper_web/live/event_live/manage.html.heex:197 #, elixir-autogen, elixir-format msgid "Add poll to know opinion of your public." msgstr "Añadir una votación para conocer la opinión del público." -#: lib/claper_web/live/event_live/manage.html.heex:195 -#: lib/claper_web/live/event_live/manage.html.heex:786 +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Votación" -#: lib/claper_web/live/poll_live/form_component.html.heex:30 +#: lib/claper_web/live/poll_live/form_component.html.heex:26 #, elixir-format, ex-autogen, elixir-autogen msgid "Choice %{count}" msgid_plural "Choice %{count}" @@ -391,18 +397,18 @@ msgstr "Ver la votación actual" msgid "Vote" msgstr "Votar" -#: lib/claper_web/live/event_live/event_form_component.html.heex:358 -#: lib/claper_web/live/event_live/event_form_component.html.heex:376 +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 #, elixir-autogen, elixir-format msgid "User email address" msgstr "Dirección email del usuario" -#: lib/claper_web/live/event_live/event_form_component.html.heex:207 +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 #, elixir-autogen, elixir-format msgid "Changing your file will remove all interaction elements like polls associated." msgstr "Hacer cambios en tu fichero borrará todos los elementos de interacción asociados, incluyendo votaciones" -#: lib/claper_web/live/event_live/manage.html.heex:1221 +#: lib/claper_web/live/event_live/manage.html.heex:1213 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "Los mensajes de los asistentes aparecerán aquí." @@ -412,7 +418,7 @@ msgstr "Los mensajes de los asistentes aparecerán aquí." msgid "Processing your file..." msgstr "Procesando tu fichero..." -#: lib/claper_web/live/poll_live/form_component.html.heex:118 +#: lib/claper_web/live/poll_live/form_component.html.heex:114 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the poll itself, are you sure?" msgstr "Esto borrará todas las respuestas asociadas y la propia votación, ¿estás seguro/a?" @@ -422,14 +428,14 @@ msgstr "Esto borrará todas las respuestas asociadas y la propia votación, ¿es msgid "Ask, comment..." msgstr "Pregunta, deja comentarios..." -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1159 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format msgid "Messages" msgstr "Mensajes" -#: lib/claper_web/live/event_live/event_form_component.html.heex:341 +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 #, elixir-autogen, elixir-format msgid "Add facilitator" msgstr "Añadir colaborador" @@ -444,7 +450,7 @@ msgstr "Uy, la página no existe." msgid "The site is under maintenance, we'll be back very soon!" msgstr "El sitio está en mantenimiento, ¡volveremos muy pronto!" -#: lib/claper_web/live/event_live/event_form_component.html.heex:320 +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 #, elixir-autogen, elixir-format msgid "Facilitators can present and manage interactions" msgstr "Los colaboradores pueden presentar y gestionar las interacciones" @@ -458,13 +464,8 @@ msgstr "Los colaboradores pueden presentar y gestionar las interacciones" msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" msgstr "Si tienes problemas con el botón superior, copia y pega la URL de debajo en tu navegador" -#: lib/claper_web/templates/user_notifier/change.html.heex:22 -#, elixir-autogen, elixir-format -msgid "You can change your email by visiting the URL below" -msgstr "Puedes cambiar tu correo visitando la URL de debajo" - -#: lib/claper_web/live/event_live/manage.html.heex:759 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "Añadir interacción" @@ -496,7 +497,7 @@ msgstr ", pulsa en el enlace proporcionado para conectar (¡comprueba tu bandeja #: lib/claper_web/templates/user_notifier/welcome.html.heex:29 #, elixir-autogen, elixir-format msgid "Export your current presentation to PDF from your favorite slide presentation software (PowerPoint, etc)" -msgstr "" +msgstr "Exporta tu presentación actual a PDF desde tu software de presentación favorito (PowerPoint, etc)" #: lib/claper_web/templates/user_notifier/welcome.html.heex:50 #, elixir-autogen, elixir-format @@ -591,7 +592,7 @@ msgstr "Nivel de participación" #: lib/claper_web/live/event_live/event_card_component.ex:282 #, elixir-autogen, elixir-format msgid "Error when processing the file" -msgstr "" +msgstr "Error al procesar el archivo" #: lib/claper_web/live/event_live/join.html.heex:24 #: lib/claper_web/live/event_live/join.html.heex:47 @@ -622,6 +623,7 @@ msgstr "O usa el código:" msgid "Create account" msgstr "Crear cuenta" +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:161 #: lib/claper_web/templates/user_registration/new.html.heex:37 #: lib/claper_web/templates/user_reset_password/edit.html.heex:34 @@ -657,14 +659,14 @@ msgstr "Actualizar tu contraseña" msgid "Your password has been updated." msgstr "Tu contraseña ha sido actualizada." -#: lib/claper_web/live/form_live/form_component.html.heex:30 +#: lib/claper_web/live/form_live/form_component.html.heex:26 #, elixir-autogen, elixir-format msgid "Field %{count}" msgid_plural "Field %{count}" msgstr[0] "Campo %{count}" msgstr[1] "Campos %{count}" -#: lib/claper_web/live/event_live/manage.html.heex:231 +#: lib/claper_web/live/event_live/manage.html.heex:230 #, elixir-autogen, elixir-format msgid "Add form to collect data from your public." msgstr "Añadir formulario para recopilar datos del público." @@ -674,34 +676,41 @@ msgstr "Añadir formulario para recopilar datos del público." msgid "Current form" msgstr "Formulario actual" -#: lib/claper_web/live/event_live/manage.html.heex:327 +#: lib/claper_web/live/event_live/manage.html.heex:326 #, elixir-autogen, elixir-format msgid "Edit form" msgstr "Editar formulario" -#: lib/claper_web/live/event_live/manage.html.heex:228 -#: lib/claper_web/live/event_live/manage.html.heex:830 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 #, elixir-autogen, elixir-format msgid "Form" msgstr "Formulario" -#: lib/claper_web/live/event_live/manage.html.heex:1191 +#: lib/claper_web/live/event_live/manage.html.heex:1183 #, elixir-autogen, elixir-format msgid "Form submissions" msgstr "Envíos de formulario" -#: lib/claper_web/live/event_live/manage.html.heex:1390 +#: lib/claper_web/live/event_live/manage.html.heex:1382 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "Los envíos de formulario de los asistentes aparecerán aquí." -#: lib/claper_web/live/event_live/manage.ex:814 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nombre" -#: lib/claper_web/live/event_live/manage.html.heex:326 +#: lib/claper_web/live/event_live/manage.html.heex:325 #, elixir-autogen, elixir-format msgid "New form" msgstr "Nuevo formulario" @@ -722,17 +731,17 @@ msgstr "Ver formulario actual" msgid "Submit" msgstr "Enviar" -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #, elixir-autogen, elixir-format msgid "Text" msgstr "Texto" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1402 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Esto no se puede deshacer, ¿estás seguro/a?" -#: lib/claper_web/live/form_live/form_component.html.heex:110 +#: lib/claper_web/live/form_live/form_component.html.heex:105 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the form itself, are you sure?" msgstr "Esto borrará todas las respuestas asociadas al formulario, ¿estás seguro/a?" @@ -742,7 +751,7 @@ msgstr "Esto borrará todas las respuestas asociadas al formulario, ¿estás seg msgid "Title of your form" msgstr "Título de tu formulario" -#: lib/claper_web/live/form_live/form_component.html.heex:40 +#: lib/claper_web/live/form_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Type" msgstr "Tipo" @@ -757,7 +766,7 @@ msgstr "Seleccione una opción" msgid "Select one or multiple options" msgstr "Seleccione una o varias opciones" -#: lib/claper_web/live/poll_live/form_component.html.heex:96 +#: lib/claper_web/live/poll_live/form_component.html.heex:92 #, elixir-autogen, elixir-format msgid "Multiple answers" msgstr "Respuestas múltiples" @@ -767,12 +776,12 @@ msgstr "Respuestas múltiples" msgid "PDF, PPT, PPTX up to %{size} MB" msgstr "PDF, PPT, PPTX de hasta %{size} MB" -#: lib/claper_web/live/event_live/manager_settings_component.ex:426 +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 #, elixir-autogen, elixir-format msgid "Enable messages" msgstr "Activar mensajes" -#: lib/claper_web/live/event_live/manager_settings_component.ex:304 +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 #, elixir-autogen, elixir-format msgid "Show messages" msgstr "Mostrar mensajes" @@ -821,7 +830,7 @@ msgstr "desactivada" msgid "Account creation is disabled" msgstr "La creación de cuentas está desactivada" -#: lib/claper_web/live/event_live/manage.html.heex:262 +#: lib/claper_web/live/event_live/manage.html.heex:261 #, elixir-autogen, elixir-format msgid "Add a Youtube video or any web content." msgstr "Agregar vídeo de Youtube o cualquier contenido web." @@ -872,12 +881,12 @@ msgstr "Enviar enlace para restablecer contraseña" msgid "Current web content" msgstr "Contenido actual" -#: lib/claper_web/live/event_live/manage.html.heex:348 +#: lib/claper_web/live/event_live/manage.html.heex:347 #, elixir-autogen, elixir-format msgid "Edit web content" msgstr "Editar contenido web" -#: lib/claper_web/live/event_live/manage.html.heex:347 +#: lib/claper_web/live/event_live/manage.html.heex:346 #, elixir-autogen, elixir-format msgid "New web content" msgstr "Nuevo contenido web" @@ -887,7 +896,7 @@ msgstr "Nuevo contenido web" msgid "See current web content" msgstr "Ver contenido web actual" -#: lib/claper_web/live/embed_live/form_component.html.heex:80 +#: lib/claper_web/live/embed_live/form_component.html.heex:74 #, elixir-autogen, elixir-format msgid "This will delete the web content, are you sure?" msgstr "Esto borrará el contenido web, ¿estás seguro/a?" @@ -898,8 +907,8 @@ msgstr "Esto borrará el contenido web, ¿estás seguro/a?" msgid "Title" msgstr "Título" -#: lib/claper_web/live/event_live/manage.html.heex:260 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Contenido" @@ -916,17 +925,17 @@ msgstr "Anclar" msgid "Pinned" msgstr "Anclado" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1175 #, elixir-autogen, elixir-format msgid "Pinned messages" msgstr "Mensajes anclados" -#: lib/claper_web/live/event_live/manage.html.heex:1344 +#: lib/claper_web/live/event_live/manage.html.heex:1336 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "Los mensajes anclados aparecerán aquí." -#: lib/claper_web/live/event_live/manager_settings_component.ex:359 +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 #, elixir-autogen, elixir-format msgid "Show only pinned messages" msgstr "Mostrar sólo mensajes anclados" @@ -967,7 +976,7 @@ msgstr "Has sido invitado/a a gestionar un evento" msgid "Saved" msgstr "Guardado" -#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:301 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "Todos tus eventos y ficheros serán borrados para siempre, ¿estás seguro/a?" @@ -982,22 +991,22 @@ msgstr "¿Estás seguro de que quieres finalizar este evento? Esta acción no pu msgid "Attendees room" msgstr "Sala de asistentes" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:291 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "Ten cuidado, estas acciones son irreversibles" -#: lib/claper_web/live/user_settings_live/show.html.heex:275 +#: lib/claper_web/live/user_settings_live/show.html.heex:288 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Zona de peligro" -#: lib/claper_web/live/user_settings_live/show.html.heex:284 +#: lib/claper_web/live/user_settings_live/show.html.heex:297 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "Borrar cuenta" -#: lib/claper_web/live/event_live/manage.html.heex:566 +#: lib/claper_web/live/event_live/manage.html.heex:565 #, elixir-autogen, elixir-format msgid "Open presentation" msgstr "Abrir presentación" @@ -1012,7 +1021,7 @@ msgstr "Informe de visualización" msgid "Your account has been deleted." msgstr "Tu cuenta ha sido borrada" -#: lib/claper_web/live/event_live/event_form_component.html.heex:279 +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 #, elixir-autogen, elixir-format, fuzzy msgid "Access code" msgstr "Código de acceso" @@ -1022,46 +1031,46 @@ msgstr "Código de acceso" msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." msgstr "No se soportan las animaciones de los ficheros PPT/PPTX, por lo que te recomendamos exportar tus presentaciones a formato PDF para tener la seguridad de que se mostrarán correctamente." -#: lib/claper_web/live/event_live/manage.html.heex:1155 +#: lib/claper_web/live/event_live/manage.html.heex:1147 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "Interacciones de asistentes" #: lib/claper_web/live/event_live/event_form_component.html.heex:6 -#: lib/claper_web/live/event_live/index.html.heex:106 -#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 #: lib/claper_web/live/event_live/quiz_component.ex:151 #: lib/claper_web/live/event_live/quiz_component.ex:198 #, elixir-autogen, elixir-format msgid "Back" msgstr "Atrás" -#: lib/claper_web/live/event_live/event_form_component.html.heex:314 +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 #, elixir-autogen, elixir-format, fuzzy msgid "Facilitators" msgstr "Colaboradores" #: lib/claper_web/live/event_live/event_form_component.html.heex:7 -#: lib/claper_web/live/event_live/index.html.heex:107 -#: lib/claper_web/live/event_live/manage.html.heex:430 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 #: lib/claper_web/templates/lti/registration/success.html.heex:26 #, elixir-autogen, elixir-format, fuzzy msgid "Finish" msgstr "Finalizar" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." msgstr "Aquí encontrarás todas las interacciones de tus asistentes. Puedes gestionar mensajes, mensajes anclados y formularios enviados." -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identificar usuarios por sus avatares únicos." #: lib/claper_web/live/event_live/event_form_component.html.heex:5 -#: lib/claper_web/live/event_live/index.html.heex:105 -#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 #: lib/claper_web/live/event_live/manager_settings_component.ex:176 #: lib/claper_web/live/event_live/quiz_component.ex:161 #: lib/claper_web/live/event_live/quiz_component.ex:209 @@ -1074,57 +1083,57 @@ msgstr "Siguiente" msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." msgstr "Selecciona tu fichero de presentación. Los formatos aceptados son PDF, PPT, o PPTX. Asegúrate de que el tamaño del fichero no excede el límite máximo." -#: lib/claper_web/live/event_live/manage.html.heex:546 +#: lib/claper_web/live/event_live/manage.html.heex:545 #, elixir-autogen, elixir-format, fuzzy msgid "Time to launch your presentation!" msgstr "¡Es el momento de lanzar tu presentación!" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "Use the associated keyboard shortcuts for quick toggling of these settings." msgstr "Usa los atajos de teclado asociados para conmutar estos ajustes." -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." msgstr "Puedes controlar cada ajuste para la presentación (lo que se muestra en la pantalla grande) y en la sala de asistentes." -#: lib/claper_web/live/event_live/index.html.heex:148 +#: lib/claper_web/live/event_live/index.html.heex:149 #, elixir-autogen, elixir-format msgid "Your first steps with Claper" msgstr "Tus primeros pasos con Claper" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." msgstr "Los asistentes que intenten acceder al evento antes de esta fecha serán dirigidos a una sala de espera." -#: lib/claper_web/live/event_live/index.html.heex:166 +#: lib/claper_web/live/event_live/index.html.heex:167 #, elixir-autogen, elixir-format, fuzzy msgid "Create event" msgstr "Crear evento" -#: lib/claper_web/live/event_live/index.html.heex:224 +#: lib/claper_web/live/event_live/index.html.heex:225 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first event" msgstr "Crear tu primer evento" -#: lib/claper_web/live/event_live/event_form_component.html.heex:294 +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 #, elixir-autogen, elixir-format msgid "Event start date" msgstr "Fecha de inicio del evento" -#: lib/claper_web/live/event_live/index.html.heex:118 +#: lib/claper_web/live/event_live/index.html.heex:119 #, elixir-autogen, elixir-format msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." msgstr "Si no tienes tiempo y sólo quieres interactuar sin ningún fichero de presentación, puedes crear un evento nuevo aquí." -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format, fuzzy msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." msgstr "Si necesitas ayuda para gestionar tu evento, puedes conceder acceso a otros. Simplemente, introduce su dirección de correo; una vez que registren una cuenta con esos correos, serán capaces de gestionar el evento." -#: lib/claper_web/live/event_live/index.html.heex:123 +#: lib/claper_web/live/event_live/index.html.heex:124 #, elixir-autogen, elixir-format msgid "In a hurry ?" msgstr "¿ Tienes prisa ?" @@ -1134,18 +1143,18 @@ msgstr "¿ Tienes prisa ?" msgid "Live" msgstr "En vivo" -#: lib/claper_web/live/event_live/index.html.heex:111 +#: lib/claper_web/live/event_live/index.html.heex:112 #, elixir-autogen, elixir-format msgid "My events" msgstr "Mis eventos" -#: lib/claper_web/live/event_live/event_form_component.html.heex:271 -#: lib/claper_web/live/event_live/index.html.heex:86 +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 #, elixir-autogen, elixir-format, fuzzy msgid "Name of your event" msgstr "Nombre de tu evento" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format, fuzzy msgid "Note: Facilitators do not have the ability to delete your event." msgstr "Nota: Los colaboradores no tienen capacidad para borrar tu evento." @@ -1155,12 +1164,12 @@ msgstr "Nota: Los colaboradores no tienen capacidad para borrar tu evento." msgid "Presentation file (optional)" msgstr "Fichero de presentación (opcional)" -#: lib/claper_web/live/event_live/index.html.heex:141 +#: lib/claper_web/live/event_live/index.html.heex:142 #, elixir-autogen, elixir-format msgid "Quick event" msgstr "Evento rápido" -#: lib/claper_web/live/event_live/index.ex:91 +#: lib/claper_web/live/event_live/index.ex:102 #, elixir-autogen, elixir-format msgid "Quick event created successfully" msgstr "Evento rápido creado con éxito" @@ -1170,7 +1179,7 @@ msgstr "Evento rápido creado con éxito" msgid "Return to your last event" msgstr "Volver a tu último evento" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format, fuzzy msgid "Select the start date for your event. Future dates are permissible." msgstr "Selecciona la fecha de inicio de tu evento. Se permiten fechas futuras." @@ -1180,22 +1189,22 @@ msgstr "Selecciona la fecha de inicio de tu evento. Se permiten fechas futuras." msgid "Select your presentation (optional)" msgstr "Selecciona tu presentación (opcional)" -#: lib/claper_web/live/event_live/event_form_component.html.heex:280 +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 #, elixir-autogen, elixir-format, fuzzy msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." msgstr "Este código será usado por tus asistentes para acceder al evento. Tienes la opción de crear un código personalizado." -#: lib/claper_web/live/event_live/show.ex:192 +#: lib/claper_web/live/event_live/show.ex:193 #, elixir-autogen, elixir-format msgid "This event has been terminated" msgstr "Este evento ha sido terminado" -#: lib/claper_web/live/event_live/index.html.heex:147 +#: lib/claper_web/live/event_live/index.html.heex:148 #, elixir-autogen, elixir-format, fuzzy msgid "Welcome to Claper! You can create a new event here." msgstr "¡Bienvenido/a a Claper! Aquí puedes crear un nuevo evento." -#: lib/claper_web/live/event_live/event_form_component.html.heex:304 +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 #, elixir-autogen, elixir-format, fuzzy msgid "When your event will start?" msgstr "¿Cuándo empezará tu evento?" @@ -1205,8 +1214,8 @@ msgstr "¿Cuándo empezará tu evento?" msgid "Create your next presentation with" msgstr "Crea tu siguiente presentación con" -#: lib/claper_web/live/event_live/manage.ex:27 -#: lib/claper_web/live/event_live/presenter.ex:24 +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:25 #, elixir-autogen, elixir-format msgid "Event doesn't exist" @@ -1217,7 +1226,7 @@ msgstr "El evento no existe" msgid "Customize your account" msgstr "Personaliza tu cuenta" -#: lib/claper_web/live/user_settings_live/show.html.heex:265 +#: lib/claper_web/live/user_settings_live/show.html.heex:278 #, elixir-autogen, elixir-format msgid "Language" msgstr "Idioma" @@ -1237,22 +1246,22 @@ msgstr "Tus preferencias han sido actualizadas." msgid "Question" msgstr "Pregunta" -#: lib/claper_web/live/event_live/manage.html.heex:1175 +#: lib/claper_web/live/event_live/manage.html.heex:1167 #, elixir-autogen, elixir-format msgid "Questions" msgstr "Preguntas" -#: lib/claper_web/live/event_live/manage.html.heex:1262 +#: lib/claper_web/live/event_live/manage.html.heex:1254 #, elixir-autogen, elixir-format msgid "Questions will appear here." msgstr "Las preguntas aparecerán aquí." -#: lib/claper_web/live/event_live/manage.html.heex:1304 +#: lib/claper_web/live/event_live/manage.html.heex:1296 #, elixir-autogen, elixir-format msgid "Sort by date" msgstr "Ordenar por fecha" -#: lib/claper_web/live/event_live/manage.html.heex:1283 +#: lib/claper_web/live/event_live/manage.html.heex:1275 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Ordenar por popularidad" @@ -1262,7 +1271,8 @@ msgstr "Ordenar por popularidad" msgid "Event manager" msgstr "Gestor de evento" -#: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Documentación" @@ -1278,7 +1288,7 @@ msgstr "Mi cuenta" msgid "Your personal informations to access your account" msgstr "Tus información personal para acceder a tu cuenta" -#: lib/claper_web/live/event_live/manager_settings_component.ex:533 +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 #, elixir-autogen, elixir-format, fuzzy msgid "Enable reactions" msgstr "Activar reacciones" @@ -1334,43 +1344,43 @@ msgid "Add Claper" msgstr "Agregar Claper" #: lib/claper_web/live/event_live/manage.html.heex:123 -#: lib/claper_web/live/event_live/manage.html.heex:539 +#: lib/claper_web/live/event_live/manage.html.heex:538 #, elixir-autogen, elixir-format msgid "Close preview" msgstr "Cerrar vista previa" -#: lib/claper_web/live/event_live/manage.html.heex:743 +#: lib/claper_web/live/event_live/manage.html.heex:734 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first interaction." msgstr "Crea tu primera interacción." -#: lib/claper_web/live/event_live/manage.html.heex:1101 +#: lib/claper_web/live/event_live/manage.html.heex:1093 #, elixir-autogen, elixir-format, fuzzy msgid "Disable" msgstr "Desactivar" -#: lib/claper_web/live/event_live/manage.html.heex:1118 +#: lib/claper_web/live/event_live/manage.html.heex:1110 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Activar" -#: lib/claper_web/live/event_live/manager_settings_component.ex:443 +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 #, elixir-autogen, elixir-format, fuzzy msgid "Enable messages to change this option" msgstr "Activar mensajes para cambiar esta opción" #: lib/claper_web/live/event_live/manage.html.heex:122 -#: lib/claper_web/live/event_live/manage.html.heex:538 +#: lib/claper_web/live/event_live/manage.html.heex:537 #, elixir-autogen, elixir-format msgid "Open preview" msgstr "Abrir vista previa" -#: lib/claper_web/live/event_live/manager_settings_component.ex:321 +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 #, elixir-autogen, elixir-format msgid "Show messages to change this option" msgstr "Mostrar mensajes para cambiar esta opción" -#: lib/claper_web/live/event_live/manage.html.heex:740 +#: lib/claper_web/live/event_live/manage.html.heex:731 #, elixir-autogen, elixir-format msgid "This slide does not have any interactions." msgstr "Esta diapositiva no tiene interacciones." @@ -1397,7 +1407,7 @@ msgstr "Iniciar sesión con %{provider}" msgid "The account has been unlinked." msgstr "La cuenta ha sido desvinculada." -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "This section contains all your interactions." msgstr "Esta sección contiene todas tus interacciones." @@ -1408,12 +1418,12 @@ msgstr "Esta sección contiene todas tus interacciones." msgid "Unlink" msgstr "Desvincular" -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "You can add interactions to your presentation slides." msgstr "Puedes añadir interacciones a tus diapositivas de presentación." -#: lib/claper_web/live/event_live/manage.html.heex:715 +#: lib/claper_web/live/event_live/manage.html.heex:706 #, elixir-autogen, elixir-format msgid "Your interactions" msgstr "Tus interacciones" @@ -1438,12 +1448,12 @@ msgstr "Establece una nueva contraseña para tu cuenta antes de desvincularla." msgid "Your password has been set, you can now unlink your account." msgstr "Tu contraseña ha sido establecida, ahora puedes desvincular tu cuenta." -#: lib/claper_web/live/embed_live/form_component.html.heex:38 +#: lib/claper_web/live/embed_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Iframe code" msgstr "Código Iframe" -#: lib/claper_web/live/embed_live/form_component.html.heex:39 +#: lib/claper_web/live/embed_live/form_component.html.heex:35 #, elixir-autogen, elixir-format msgid "Link to the content" msgstr "Enlace al contenido" @@ -1469,24 +1479,24 @@ msgstr "Por favor, introduce un enlace válido que comience con http:// o https: msgid "Please enter valid HTML content with an iframe tag" msgstr "Por favor, introduce contenido HTML válido con una etiqueta iframe" -#: lib/claper_web/live/embed_live/form_component.html.heex:25 +#: lib/claper_web/live/embed_live/form_component.html.heex:23 #, elixir-autogen, elixir-format msgid "Provider" msgstr "Proveedor" -#: lib/claper_web/live/poll_live/form_component.html.heex:89 +#: lib/claper_web/live/poll_live/form_component.html.heex:85 #, elixir-autogen, elixir-format msgid "Attendees can see the results on their device" msgstr "Los asistentes pueden ver los resultados en su dispositivo" -#: lib/claper_web/live/embed_live/form_component.html.heex:56 +#: lib/claper_web/live/embed_live/form_component.html.heex:50 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees can view the web content on their device" msgstr "Los asistentes pueden ver el contenido web en su dispositivo" -#: lib/claper_web/live/embed_live/form_component.html.heex:49 -#: lib/claper_web/live/poll_live/form_component.html.heex:82 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:172 +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 #, elixir-autogen, elixir-format msgid "Options" msgstr "Opciones" @@ -1554,12 +1564,12 @@ msgstr "Finalizar" msgid "More options" msgstr "Más opciones" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "No" msgstr "No" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Sí" @@ -1609,32 +1619,32 @@ msgstr "Puedes restablecer tu contraseña visitando la URL de abajo" msgid "back to the home page" msgstr "volver a la página de inicio" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:46 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 #, elixir-autogen, elixir-format, fuzzy msgid "Add Question" msgstr "Añadir Pregunta" -#: lib/claper_web/live/event_live/manage.html.heex:294 +#: lib/claper_web/live/event_live/manage.html.heex:293 #, elixir-autogen, elixir-format msgid "Add a quiz to test knowledge." msgstr "Añadir un cuestionario para evaluar conocimientos." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 #, elixir-autogen, elixir-format msgid "Add answer" msgstr "Añadir respuesta" -#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous messages" msgstr "Permitir mensajes anónimos" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:84 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 #, elixir-autogen, elixir-format msgid "Answer %{index}" msgstr "Respuesta %{index}" -#: lib/claper_web/live/event_live/manager_settings_component.ex:390 +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees" msgstr "Asistentes" @@ -1650,32 +1660,32 @@ msgstr "Puntuación media" msgid "Current quiz" msgstr "Cuestionario actual" -#: lib/claper_web/live/event_live/manager_settings_component.ex:485 +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 #, elixir-autogen, elixir-format, fuzzy msgid "Deny anonymous messages" msgstr "Denegar mensajes anónimos" -#: lib/claper_web/live/event_live/manager_settings_component.ex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 #, elixir-autogen, elixir-format, fuzzy msgid "Disable messages" msgstr "Desactivar mensajes" -#: lib/claper_web/live/event_live/manager_settings_component.ex:536 +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 #, elixir-autogen, elixir-format, fuzzy msgid "Disable reactions" msgstr "Desactivar reacciones" -#: lib/claper_web/live/event_live/manage.html.heex:369 +#: lib/claper_web/live/event_live/manage.html.heex:368 #, elixir-autogen, elixir-format, fuzzy msgid "Edit quiz" msgstr "Editar cuestionario" -#: lib/claper_web/live/event_live/manager_settings_component.ex:258 +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 #, elixir-autogen, elixir-format msgid "Hide instructions to join" msgstr "Ocultar instrucciones para unirse" -#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 #, elixir-autogen, elixir-format, fuzzy msgid "Hide messages" msgstr "Ocultar mensajes" @@ -1698,12 +1708,12 @@ msgstr "¿Cómo funciona?" msgid "Interaction" msgstr "Interacción" -#: lib/claper_web/live/event_live/manage.html.heex:368 +#: lib/claper_web/live/event_live/manage.html.heex:367 #, elixir-autogen, elixir-format msgid "New quiz" msgstr "Nuevo cuestionario" -#: lib/claper_web/live/event_live/manager_settings_component.ex:217 +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 #, elixir-autogen, elixir-format, fuzzy msgid "Presentation" msgstr "Presentación" @@ -1713,13 +1723,13 @@ msgstr "Presentación" msgid "Previous" msgstr "Anterior" -#: lib/claper_web/live/event_live/manage.html.heex:292 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Cuestionario" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:158 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 #, elixir-autogen, elixir-format msgid "Remove question" msgstr "Eliminar pregunta" @@ -1734,17 +1744,17 @@ msgstr "Revise las preguntas" msgid "See current quiz" msgstr "Ver cuestionario actual" -#: lib/claper_web/live/event_live/manage.html.heex:388 +#: lib/claper_web/live/event_live/manage.html.heex:387 #, elixir-autogen, elixir-format, fuzzy msgid "Select presentation" msgstr "Seleccionar presentación" -#: lib/claper_web/live/event_live/manager_settings_component.ex:361 +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 #, elixir-autogen, elixir-format, fuzzy msgid "Show all messages" msgstr "Mostrar todos los mensajes" -#: lib/claper_web/live/event_live/manager_settings_component.ex:255 +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 #, elixir-autogen, elixir-format, fuzzy msgid "Show instructions to join" msgstr "Mostrar instrucciones para unirse" @@ -1760,7 +1770,7 @@ msgstr "Mostrar resultados" msgid "Show results on presentation" msgstr "Mostrar resultados en la presentación" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:206 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 #, elixir-autogen, elixir-format, fuzzy msgid "This will delete all responses associated and the quiz itself, are you sure?" msgstr "Esto eliminará todas las respuestas asociadas y el cuestionario en sí, ¿estás seguro?" @@ -1770,7 +1780,7 @@ msgstr "Esto eliminará todas las respuestas asociadas y el cuestionario en sí, msgid "Waiting for results..." msgstr "Esperando resultados..." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:62 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 #, elixir-autogen, elixir-format msgid "Your question" msgstr "Tu pregunta" @@ -1788,7 +1798,7 @@ msgstr "Tu puntuación" msgid "Export" msgstr "Exportar" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:218 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 #, elixir-autogen, elixir-format msgid "Export to QTI (XML)" msgstr "Exportar a QTI (XML)" @@ -1848,17 +1858,21 @@ msgstr "Asistentes únicos" msgid "Web Content" msgstr "Contenido web" -#: lib/claper_web/live/event_live/index.html.heex:178 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 #, elixir-autogen, elixir-format msgid "Active" msgstr "Activo" -#: lib/claper_web/live/event_live/index.html.heex:217 +#: lib/claper_web/live/event_live/index.html.heex:218 #, elixir-autogen, elixir-format msgid "Load more" msgstr "Cargar más" -#: lib/claper_web/live/event_live/index.html.heex:194 +#: lib/claper_web/live/event_live/index.html.heex:195 #, elixir-autogen, elixir-format msgid "Shared with you" msgstr "Compartido contigo" @@ -1868,17 +1882,17 @@ msgstr "Compartido contigo" msgid "You must login to continue" msgstr "Debes iniciar sesión para continuar" -#: lib/claper/quizzes/quiz_question.ex:41 +#: lib/claper/quizzes/quiz_question.ex:51 #, elixir-autogen, elixir-format msgid "must have at least one correct answer" msgstr "debe tener al menos una respuesta correcta" -#: lib/claper_web/live/event_live/manage.html.heex:548 +#: lib/claper_web/live/event_live/manage.html.heex:547 #, elixir-autogen, elixir-format msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." msgstr "Pulsa aqui para abrir la ventana de presentación. Pulsa F en la ventana de presentación para activar el modo pantalla completa." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:179 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous submissions" msgstr "Permitir envíos anónimos" @@ -1897,3 +1911,771 @@ msgstr "Iniciar sesión" #, elixir-autogen, elixir-format msgid "Total submissions" msgstr "Total de envíos" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "Un código único para que los participantes se unan a este evento" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "Un nombre único para este evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "Un nombre único para identificar este proveedor OIDC" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "La cuenta está confirmada y activa" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format, fuzzy +msgid "Actions" +msgstr "Opciones" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Active Events" +msgstr "Activo" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this event?" +msgstr "¿Estás seguro de que quieres desvincular esta cuenta?" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this provider?" +msgstr "¿Estás seguro de que quieres desvincular esta cuenta?" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this user?" +msgstr "¿Estás seguro de que quieres desvincular esta cuenta?" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "Usuario Asignado" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format, fuzzy +msgid "Audience Peak" +msgstr "Pico de audiencia" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "Código de Autorización" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "Cancelar" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format, fuzzy +msgid "Choose file" +msgstr "Cambiar fichero" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "ID de Cliente" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "Secreto de Cliente" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "Completado" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirmed" +msgstr "Confirmar email" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "Confirmado el" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create Event" +msgstr "Crear evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "Crear Proveedor" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create User" +msgstr "Crear" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created" +msgstr "Crear" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created At" +msgstr "Crear" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Currently running" +msgstr "Cuestionario actual" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete event" +msgstr "Borrar" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "Eliminar proveedor" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete user" +msgstr "Borrar" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "Editar Proveedor OIDC" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "Editar evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "Editar proveedor" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit user" +msgstr "Editar" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "Activar este proveedor OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "Ingresa el ID de cliente" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "Ingresa el secreto de cliente" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "Ingresa el código del evento" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "Ingresa el nombre del evento" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enter password" +msgstr "Contraseña actual" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "Ingresa el nombre del proveedor" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "Ingresa el email del usuario" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "Creación de Eventos" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "Evento creado exitosamente" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "Evento eliminado exitosamente" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "Detalles del evento" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "Evento actualizado exitosamente" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format, fuzzy +msgid "Events" +msgstr "Evento" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "Eventos exportados exitosamente" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "Expira el" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "Archivo seleccionado" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format, fuzzy +msgid "Form Post" +msgstr "Formularios" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "Fragmento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "Cómo debe devolverse la respuesta de autorización (por defecto 'query')" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "Híbrido" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "Implícito" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format, fuzzy +msgid "Inactive" +msgstr "Activo" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "Contraseña inicial para el usuario" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "Emisor" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "URL del Emisor" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "Últimos 30 días" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "Última Actualización" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "Nuevo evento" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "No se encontraron eventos" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "Ningún archivo seleccionado" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "Sin propietario" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "Sin rol" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "No se encontraron usuarios" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "No expirado" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "No iniciado" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "Tipo de respuesta OAuth 2.0 (por defecto 'code')" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Provider" +msgstr "Proveedor" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "Detalles del Proveedor OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Providers" +msgstr "Proveedor" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "Alcances OIDC a solicitar (por defecto 'openid email profile')" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "Propietario" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "Proveedor creado exitosamente" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider updated successfully" +msgstr "Contraseña actualizada con éxito." + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "Consulta" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "Eventos Recientes" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "URI de Redirección" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "Modo de Respuesta" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "Tipo de Respuesta" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "Rol" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "Guardando..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "Programado" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "Alcance" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "Buscar eventos..." + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "Buscar un usuario..." + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "Buscar proveedores..." + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "Buscar usuarios..." + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select an option" +msgstr "Seleccione una opción" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "Seleccionar..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "Fecha de Inicio" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "Iniciado el" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "Estado" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "La URL del emisor OIDC (debe comenzar con http:// o https://)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "La URL de callback para tu aplicación (debe comenzar con http:// o https://)" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "El usuario propietario de este evento (requerido)" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "Total de Eventos" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "Total de Usuarios" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "Sin confirmar" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "Actualizar Evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "Actualizar Proveedor" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "Actualizar Usuario" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "Cuenta de Usuario" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "Crecimiento de Usuarios" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "Usuario creado exitosamente" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Usuario eliminado exitosamente" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "Detalles del usuario" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format, fuzzy +msgid "User updated successfully" +msgstr "Contraseña actualizada con éxito." + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "Nivel de acceso del usuario" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "Dirección de email del usuario (debe ser única)" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "Usuarios" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "Usuarios exportados exitosamente" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "Ver evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format, fuzzy +msgid "View provider" +msgstr "Informe de visualización" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "Ver usuario" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "Cuándo expira este evento (opcional)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "Si este proveedor está activo y disponible para autenticación" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format, fuzzy +msgid "attendees" +msgstr "asistente" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "https://example.com" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "https://yourapp.com/auth/callback" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "openid email profile" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "vs mes anterior" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to events" +msgstr "Volver a eventos" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to providers" +msgstr "Volver a proveedores" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to users" +msgstr "Volver a usuarios" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format, fuzzy +msgid "New provider" +msgstr "Nuevo proveedor" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format, fuzzy +msgid "New user" +msgstr "Nuevo usuario" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format, fuzzy +msgid "No providers found" +msgstr "No se encontraron proveedores" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "Proveedor eliminado exitosamente" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Proveedor" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "Admin" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "Volver a la aplicación" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirm email change" +msgstr "Confirmar email" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format, fuzzy +msgid "If you didn't request an email change, please ignore this." +msgstr "Si no has creado una cuenta con nosotros, por favor ignora ésto." + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "You can confirm your email change by visiting the URL below" +msgstr "Puedes cambiar tu correo visitando la URL de debajo" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "Ocultar número de asistentes" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show attendee count" +msgstr "Mostrar número de asistentes" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "Obligatorio" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "(opcional)" diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po index ebedd40..da8c14f 100644 --- a/priv/gettext/fr/LC_MESSAGES/default.po +++ b/priv/gettext/fr/LC_MESSAGES/default.po @@ -8,15 +8,18 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -#: lib/claper_web/live/event_live/manage.html.heex:1457 -#: lib/claper_web/live/event_live/manage.html.heex:1463 +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 #: lib/claper_web/live/user_settings_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Settings" msgstr "Paramètres" -#: lib/claper_web/live/event_live/manage.ex:815 -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:34 #: lib/claper_web/templates/user_registration/new.html.heex:29 #: lib/claper_web/templates/user_reset_password/new.html.heex:28 @@ -43,7 +46,10 @@ msgstr "Oups, vérifiez que tous les champs sont remplis correctement." msgid "Change" msgstr "Changer" -#: lib/claper_web/live/event_live/event_form_component.html.heex:287 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 #, elixir-autogen, elixir-format msgid "Code" msgstr "Code" @@ -54,7 +60,7 @@ msgstr "Code" msgid "Email address" msgstr "Adresse email" -#: lib/claper_web/templates/layout/_user_menu.html.heex:16 +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 #, elixir-autogen, elixir-format msgid "Logout" msgstr "Déconnexion" @@ -97,15 +103,18 @@ msgstr "Soyez le premier à réagir !" #: lib/claper_web/live/event_live/event_card_component.ex:111 #: lib/claper_web/live/event_live/join.ex:41 #: lib/claper_web/live/event_live/join.html.heex:94 -#: lib/claper_web/live/event_live/manage.html.heex:493 +#: lib/claper_web/live/event_live/manage.html.heex:492 #: lib/claper_web/live/event_live/show.html.heex:286 #, elixir-autogen, elixir-format msgid "Join" msgstr "Rejoindre" -#: lib/claper_web/live/event_live/index.ex:212 +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 #: lib/claper_web/live/event_live/join.html.heex:31 #: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 #, elixir-autogen, elixir-format msgid "Dashboard" msgstr "Tableau de bord" @@ -122,7 +131,7 @@ msgid "seconds" msgstr "secondes" #: lib/claper_web/live/event_live/event_card_component.ex:60 -#: lib/claper_web/live/event_live/index.html.heex:186 +#: lib/claper_web/live/event_live/index.html.heex:187 #, elixir-autogen, elixir-format msgid "Finished" msgstr "Terminé" @@ -173,49 +182,52 @@ msgstr "Retourner à l'accueil" #: lib/claper_web/live/event_live/event_form_component.ex:248 #, elixir-autogen, elixir-format msgid "Created successfully" -msgstr "Mis à jour avec succès" +msgstr "Créé avec succès" +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 #: lib/claper_web/live/event_live/event_card_component.ex:250 #: lib/claper_web/live/event_live/event_card_component.ex:330 #: lib/claper_web/live/event_live/form_component.ex:97 -#: lib/claper_web/live/event_live/index.ex:193 +#: lib/claper_web/live/event_live/index.ex:204 #, elixir-autogen, elixir-format msgid "Edit" msgstr "Modifier" -#: lib/claper_web/live/embed_live/form_component.html.heex:69 +#: lib/claper_web/live/embed_live/form_component.html.heex:63 #: lib/claper_web/live/event_live/event_form_component.html.heex:55 #: lib/claper_web/live/event_live/event_form_component.html.heex:62 -#: lib/claper_web/live/event_live/index.ex:202 -#: lib/claper_web/live/event_live/index.html.heex:93 -#: lib/claper_web/live/form_live/form_component.html.heex:98 -#: lib/claper_web/live/poll_live/form_component.html.heex:106 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 #, elixir-autogen, elixir-format msgid "Create" msgstr "Créer" -#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#: lib/claper_web/live/embed_live/form_component.html.heex:68 #: lib/claper_web/live/event_live/event_card_component.ex:444 #: lib/claper_web/live/event_live/event_form_component.html.heex:67 -#: lib/claper_web/live/event_live/manage.html.heex:1405 +#: lib/claper_web/live/event_live/manage.html.heex:1397 #: lib/claper_web/live/event_live/manageable_post_component.ex:92 #: lib/claper_web/live/event_live/post_component.ex:70 #: lib/claper_web/live/event_live/post_component.ex:142 -#: lib/claper_web/live/form_live/form_component.html.heex:103 -#: lib/claper_web/live/poll_live/form_component.html.heex:111 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:129 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:199 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 #, elixir-autogen, elixir-format msgid "Delete" msgstr "Supprimer" -#: lib/claper_web/live/embed_live/form_component.html.heex:70 +#: lib/claper_web/live/embed_live/form_component.html.heex:64 #: lib/claper_web/live/event_live/event_form_component.html.heex:54 #: lib/claper_web/live/event_live/event_form_component.html.heex:61 -#: lib/claper_web/live/form_live/form_component.html.heex:99 -#: lib/claper_web/live/poll_live/form_component.html.heex:107 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:194 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 #: lib/claper_web/live/user_settings_live/show.html.heex:38 #: lib/claper_web/live/user_settings_live/show.html.heex:80 #: lib/claper_web/live/user_settings_live/show.html.heex:123 @@ -259,12 +271,6 @@ msgstr "Instructions de modification d'email" msgid "CONFIRM EMAIL" msgstr "CONFIRMER L'EMAIL" -#: lib/claper_web/templates/user_notifier/change.html.heex:17 -#, elixir-autogen, elixir-format -msgid "Confirm email" -msgstr "Confirmer l'email" - -#: lib/claper_web/templates/user_notifier/change.html.heex:32 #: lib/claper_web/templates/user_notifier/confirm.html.heex:32 #: lib/claper_web/templates/user_notifier/magic.html.heex:32 #: lib/claper_web/templates/user_notifier/reset.html.heex:32 @@ -295,9 +301,9 @@ msgid "Presentation uploaded" msgstr "Présentation chargée" #: lib/claper_web/live/event_live/event_form_component.html.heex:163 -#: lib/claper_web/live/event_live/event_form_component.html.heex:241 -#: lib/claper_web/live/event_live/event_form_component.html.heex:369 -#: lib/claper_web/live/event_live/event_form_component.html.heex:393 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 #, elixir-autogen, elixir-format msgid "Remove" msgstr "Supprimer" @@ -332,17 +338,17 @@ msgstr "Votre fichier est trop volumineux" msgid "Change file" msgstr "Changer le fichier" -#: lib/claper_web/live/event_live/event_form_component.html.heex:228 +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 #, elixir-autogen, elixir-format msgid "Presentation replaced" msgstr "Présentation remplacée" -#: lib/claper_web/live/event_live/manage.html.heex:306 +#: lib/claper_web/live/event_live/manage.html.heex:305 #, elixir-autogen, elixir-format msgid "Edit poll" msgstr "Modifier le sondage" -#: lib/claper_web/live/event_live/manage.html.heex:305 +#: lib/claper_web/live/event_live/manage.html.heex:304 #, elixir-autogen, elixir-format msgid "New poll" msgstr "Nouveau sondage" @@ -357,18 +363,18 @@ msgstr "Titre de votre sondage" msgid "Upload failed" msgstr "Échec du chargement" -#: lib/claper_web/live/event_live/manage.html.heex:198 +#: lib/claper_web/live/event_live/manage.html.heex:197 #, elixir-autogen, elixir-format msgid "Add poll to know opinion of your public." msgstr "Ajoutez un sondage pour connaître l'opinion de votre public." -#: lib/claper_web/live/event_live/manage.html.heex:195 -#: lib/claper_web/live/event_live/manage.html.heex:786 +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Sondage" -#: lib/claper_web/live/poll_live/form_component.html.heex:30 +#: lib/claper_web/live/poll_live/form_component.html.heex:26 #, elixir-format, ex-autogen, elixir-autogen msgid "Choice %{count}" msgid_plural "Choice %{count}" @@ -392,18 +398,18 @@ msgstr "Voir le sondage actuel" msgid "Vote" msgstr "Voter" -#: lib/claper_web/live/event_live/event_form_component.html.heex:358 -#: lib/claper_web/live/event_live/event_form_component.html.heex:376 +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 #, elixir-autogen, elixir-format msgid "User email address" msgstr "Adresse email" -#: lib/claper_web/live/event_live/event_form_component.html.heex:207 +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 #, elixir-autogen, elixir-format msgid "Changing your file will remove all interaction elements like polls associated." msgstr "La modification de votre fichier supprimera tous les éléments d'interaction comme les sondages associés." -#: lib/claper_web/live/event_live/manage.html.heex:1221 +#: lib/claper_web/live/event_live/manage.html.heex:1213 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "Les messages des participants apparaîtront ici." @@ -413,7 +419,7 @@ msgstr "Les messages des participants apparaîtront ici." msgid "Processing your file..." msgstr "Traitement de votre fichier..." -#: lib/claper_web/live/poll_live/form_component.html.heex:118 +#: lib/claper_web/live/poll_live/form_component.html.heex:114 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the poll itself, are you sure?" msgstr "Cela supprimera toutes les réponses associées et le sondage lui-même, êtes-vous sûr ?" @@ -423,14 +429,14 @@ msgstr "Cela supprimera toutes les réponses associées et le sondage lui-même, msgid "Ask, comment..." msgstr "Questionnez, commentez..." -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1159 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format msgid "Messages" msgstr "Messages" -#: lib/claper_web/live/event_live/event_form_component.html.heex:341 +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 #, elixir-autogen, elixir-format msgid "Add facilitator" msgstr "Ajouter un animateur" @@ -445,7 +451,7 @@ msgstr "Oups, la page n'existe pas." msgid "The site is under maintenance, we'll be back very soon!" msgstr "Le site est en cours de maintenance, nous serons de retour très bientôt !" -#: lib/claper_web/live/event_live/event_form_component.html.heex:320 +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 #, elixir-autogen, elixir-format, fuzzy msgid "Facilitators can present and manage interactions" msgstr "Les animateurs peuvent présenter et gérer les interactions" @@ -459,13 +465,8 @@ msgstr "Les animateurs peuvent présenter et gérer les interactions" msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" msgstr "Si vous rencontrez des difficultés avec le bouton ci-dessus, copiez et collez l'URL ci-dessous dans votre navigateur web" -#: lib/claper_web/templates/user_notifier/change.html.heex:22 -#, elixir-autogen, elixir-format, fuzzy -msgid "You can change your email by visiting the URL below" -msgstr "Vous pouvez modifier votre email en visitant l'URL ci-dessous" - -#: lib/claper_web/live/event_live/manage.html.heex:759 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 #, elixir-autogen, elixir-format, fuzzy msgid "Add interaction" msgstr "Ajouter une interaction" @@ -625,6 +626,7 @@ msgstr "Ou utilisez le code:" msgid "Create account" msgstr "Créer un compte" +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:161 #: lib/claper_web/templates/user_registration/new.html.heex:37 #: lib/claper_web/templates/user_reset_password/edit.html.heex:34 @@ -660,7 +662,7 @@ msgstr "Changer votre email" msgid "Your password has been updated." msgstr "Votre mot de passe a été mis à jour." -#: lib/claper_web/live/form_live/form_component.html.heex:30 +#: lib/claper_web/live/form_live/form_component.html.heex:26 #, elixir-autogen, elixir-format, fuzzy msgid "Field %{count}" msgid_plural "Field %{count}" @@ -668,7 +670,7 @@ msgstr[0] "Champ %{count}" msgstr[1] "Champ %{count}" msgstr[2] "Champ %{count}" -#: lib/claper_web/live/event_live/manage.html.heex:231 +#: lib/claper_web/live/event_live/manage.html.heex:230 #, elixir-autogen, elixir-format msgid "Add form to collect data from your public." msgstr "Ajoutez un formulaire pour recueillir les données de votre public." @@ -678,34 +680,41 @@ msgstr "Ajoutez un formulaire pour recueillir les données de votre public." msgid "Current form" msgstr "Formulaire actuel" -#: lib/claper_web/live/event_live/manage.html.heex:327 +#: lib/claper_web/live/event_live/manage.html.heex:326 #, elixir-autogen, elixir-format, fuzzy msgid "Edit form" msgstr "Modifier" -#: lib/claper_web/live/event_live/manage.html.heex:228 -#: lib/claper_web/live/event_live/manage.html.heex:830 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 #, elixir-autogen, elixir-format msgid "Form" msgstr "Formulaire" -#: lib/claper_web/live/event_live/manage.html.heex:1191 +#: lib/claper_web/live/event_live/manage.html.heex:1183 #, elixir-autogen, elixir-format msgid "Form submissions" msgstr "Soumissions de formulaire" -#: lib/claper_web/live/event_live/manage.html.heex:1390 +#: lib/claper_web/live/event_live/manage.html.heex:1382 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "Les formulaires soumis par les participants apparaîtront ici." -#: lib/claper_web/live/event_live/manage.ex:814 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nom" -#: lib/claper_web/live/event_live/manage.html.heex:326 +#: lib/claper_web/live/event_live/manage.html.heex:325 #, elixir-autogen, elixir-format msgid "New form" msgstr "Nouveau formulaire" @@ -726,17 +735,17 @@ msgstr "Voir le formulaire actuel" msgid "Submit" msgstr "Soumettre" -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #, elixir-autogen, elixir-format msgid "Text" msgstr "Texte" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1402 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Cela ne peut pas être annulé, confirmez-vous ?" -#: lib/claper_web/live/form_live/form_component.html.heex:110 +#: lib/claper_web/live/form_live/form_component.html.heex:105 #, elixir-autogen, elixir-format, fuzzy msgid "This will delete all responses associated and the form itself, are you sure?" msgstr "Cela supprimera toutes les réponses associées et le sondage lui-même, êtes-vous sûr ?" @@ -746,7 +755,7 @@ msgstr "Cela supprimera toutes les réponses associées et le sondage lui-même, msgid "Title of your form" msgstr "Titre de votre formulaire" -#: lib/claper_web/live/form_live/form_component.html.heex:40 +#: lib/claper_web/live/form_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Type" msgstr "Type" @@ -761,7 +770,7 @@ msgstr "Sélectionnez une option" msgid "Select one or multiple options" msgstr "Sélectionner une ou plusieurs options" -#: lib/claper_web/live/poll_live/form_component.html.heex:96 +#: lib/claper_web/live/poll_live/form_component.html.heex:92 #, elixir-autogen, elixir-format msgid "Multiple answers" msgstr "Réponses multiples" @@ -771,12 +780,12 @@ msgstr "Réponses multiples" msgid "PDF, PPT, PPTX up to %{size} MB" msgstr "PDF, PPT, PPTX jusqu'à %{size} MB" -#: lib/claper_web/live/event_live/manager_settings_component.ex:426 +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 #, elixir-autogen, elixir-format msgid "Enable messages" msgstr "Activer messages" -#: lib/claper_web/live/event_live/manager_settings_component.ex:304 +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 #, elixir-autogen, elixir-format msgid "Show messages" msgstr "Afficher messages" @@ -825,7 +834,7 @@ msgstr "désactivé" msgid "Account creation is disabled" msgstr "La création de compte est désactivée" -#: lib/claper_web/live/event_live/manage.html.heex:262 +#: lib/claper_web/live/event_live/manage.html.heex:261 #, elixir-autogen, elixir-format msgid "Add a Youtube video or any web content." msgstr "Ajoutez une vidéo Youtube ou tout autre contenu web." @@ -876,12 +885,12 @@ msgstr "Envoyer le lien pour réinitialiser le mot de passe" msgid "Current web content" msgstr "Contenu web actuel" -#: lib/claper_web/live/event_live/manage.html.heex:348 +#: lib/claper_web/live/event_live/manage.html.heex:347 #, elixir-autogen, elixir-format msgid "Edit web content" msgstr "Modifier le contenu web" -#: lib/claper_web/live/event_live/manage.html.heex:347 +#: lib/claper_web/live/event_live/manage.html.heex:346 #, elixir-autogen, elixir-format msgid "New web content" msgstr "Nouveau contenu web" @@ -891,7 +900,7 @@ msgstr "Nouveau contenu web" msgid "See current web content" msgstr "Voir le contenu web actuel" -#: lib/claper_web/live/embed_live/form_component.html.heex:80 +#: lib/claper_web/live/embed_live/form_component.html.heex:74 #, elixir-autogen, elixir-format, fuzzy msgid "This will delete the web content, are you sure?" msgstr "Cela supprimera le contenu web, êtes-vous sûr?" @@ -902,8 +911,8 @@ msgstr "Cela supprimera le contenu web, êtes-vous sûr?" msgid "Title" msgstr "Titre" -#: lib/claper_web/live/event_live/manage.html.heex:260 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Contenu web" @@ -920,17 +929,17 @@ msgstr "Épingler" msgid "Pinned" msgstr "Épinglé" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1175 #, elixir-autogen, elixir-format, fuzzy msgid "Pinned messages" msgstr "Messages épinglés" -#: lib/claper_web/live/event_live/manage.html.heex:1344 +#: lib/claper_web/live/event_live/manage.html.heex:1336 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "Les messages épinglés apparaîtront ici." -#: lib/claper_web/live/event_live/manager_settings_component.ex:359 +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 #, elixir-autogen, elixir-format msgid "Show only pinned messages" msgstr "Afficher uniquement les messages épinglés" @@ -971,7 +980,7 @@ msgstr "Vous avez été invité à gérer un événement" msgid "Saved" msgstr "Enregistré" -#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:301 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "Tous vos événements et fichiers seront définitivement supprimés, êtes-vous sûr ?" @@ -986,22 +995,22 @@ msgstr "Êtes-vous sûr de vouloir terminer cet événement ? Cette action est i msgid "Attendees room" msgstr "Salle des participants" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:291 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "Soyez prudent, ces actions sont irréversibles" -#: lib/claper_web/live/user_settings_live/show.html.heex:275 +#: lib/claper_web/live/user_settings_live/show.html.heex:288 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Zone de danger" -#: lib/claper_web/live/user_settings_live/show.html.heex:284 +#: lib/claper_web/live/user_settings_live/show.html.heex:297 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "Supprimer le compte" -#: lib/claper_web/live/event_live/manage.html.heex:566 +#: lib/claper_web/live/event_live/manage.html.heex:565 #, elixir-autogen, elixir-format msgid "Open presentation" msgstr "Ouvrir la présentation" @@ -1016,7 +1025,7 @@ msgstr "Voir le rapport" msgid "Your account has been deleted." msgstr "Votre compte a été supprimé." -#: lib/claper_web/live/event_live/event_form_component.html.heex:279 +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 #, elixir-autogen, elixir-format, fuzzy msgid "Access code" msgstr "Code d'accès" @@ -1026,46 +1035,46 @@ msgstr "Code d'accès" msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." msgstr "Les animations dans les fichiers PPT/PPTX ne sont pas prises en charge, c'est pourquoi nous recommandons d'exporter votre présentation en PDF pour garantir un affichage correct." -#: lib/claper_web/live/event_live/manage.html.heex:1155 +#: lib/claper_web/live/event_live/manage.html.heex:1147 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "Interactions des participants" #: lib/claper_web/live/event_live/event_form_component.html.heex:6 -#: lib/claper_web/live/event_live/index.html.heex:106 -#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 #: lib/claper_web/live/event_live/quiz_component.ex:151 #: lib/claper_web/live/event_live/quiz_component.ex:198 #, elixir-autogen, elixir-format msgid "Back" msgstr "Retour" -#: lib/claper_web/live/event_live/event_form_component.html.heex:314 +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 #, elixir-autogen, elixir-format, fuzzy msgid "Facilitators" msgstr "Animateurs" #: lib/claper_web/live/event_live/event_form_component.html.heex:7 -#: lib/claper_web/live/event_live/index.html.heex:107 -#: lib/claper_web/live/event_live/manage.html.heex:430 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 #: lib/claper_web/templates/lti/registration/success.html.heex:26 #, elixir-autogen, elixir-format, fuzzy msgid "Finish" msgstr "Terminer" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." msgstr "Ici, vous trouverez toutes les interactions de vos participants. Vous pouvez gérer les messages, les messages épinglés et les formulaires soumis." -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identifiez les utilisateurs par leurs avatars uniques." #: lib/claper_web/live/event_live/event_form_component.html.heex:5 -#: lib/claper_web/live/event_live/index.html.heex:105 -#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 #: lib/claper_web/live/event_live/manager_settings_component.ex:176 #: lib/claper_web/live/event_live/quiz_component.ex:161 #: lib/claper_web/live/event_live/quiz_component.ex:209 @@ -1078,57 +1087,57 @@ msgstr "Suivant" msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." msgstr "Sélectionnez votre fichier de présentation. Les formats acceptés sont PDF, PPT ou PPTX. Assurez-vous que la taille du fichier ne dépasse pas la limite maximale." -#: lib/claper_web/live/event_live/manage.html.heex:546 +#: lib/claper_web/live/event_live/manage.html.heex:545 #, elixir-autogen, elixir-format msgid "Time to launch your presentation!" msgstr "Il est temps de lancer votre présentation !" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "Use the associated keyboard shortcuts for quick toggling of these settings." msgstr "Utilisez les raccourcis clavier associés pour basculer rapidement entre ces paramètres." -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." msgstr "Vous pouvez contrôler chaque paramètre pour la présentation (affichage sur le grand écran) et dans la salle des participants." -#: lib/claper_web/live/event_live/index.html.heex:148 +#: lib/claper_web/live/event_live/index.html.heex:149 #, elixir-autogen, elixir-format msgid "Your first steps with Claper" msgstr "Vos premiers pas avec Claper" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." msgstr "Les participants qui tentent d'accéder à l'événement avant cette date seront dirigés vers une salle d'attente." -#: lib/claper_web/live/event_live/index.html.heex:166 +#: lib/claper_web/live/event_live/index.html.heex:167 #, elixir-autogen, elixir-format msgid "Create event" msgstr "Créer un événement" -#: lib/claper_web/live/event_live/index.html.heex:224 +#: lib/claper_web/live/event_live/index.html.heex:225 #, elixir-autogen, elixir-format msgid "Create your first event" msgstr "Créez votre premier événement" -#: lib/claper_web/live/event_live/event_form_component.html.heex:294 +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 #, elixir-autogen, elixir-format msgid "Event start date" msgstr "Date de début de l'événement" -#: lib/claper_web/live/event_live/index.html.heex:118 +#: lib/claper_web/live/event_live/index.html.heex:119 #, elixir-autogen, elixir-format msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." msgstr "Si vous n'avez pas le temps et que vous voulez simplement des interactions sans fichier de présentation, vous pouvez créer un nouvel événement ici." -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." msgstr "Si vous avez besoin d'aide pour gérer votre événement, vous pouvez accorder l'accès à d'autres personnes. Entrez simplement leurs adresses e-mail ; une fois qu'ils auront créé un compte avec ces e-mails, ils pourront gérer l'événement." -#: lib/claper_web/live/event_live/index.html.heex:123 +#: lib/claper_web/live/event_live/index.html.heex:124 #, elixir-autogen, elixir-format msgid "In a hurry ?" msgstr "Pressé ?" @@ -1138,18 +1147,18 @@ msgstr "Pressé ?" msgid "Live" msgstr "En direct" -#: lib/claper_web/live/event_live/index.html.heex:111 +#: lib/claper_web/live/event_live/index.html.heex:112 #, elixir-autogen, elixir-format msgid "My events" msgstr "Mes événements" -#: lib/claper_web/live/event_live/event_form_component.html.heex:271 -#: lib/claper_web/live/event_live/index.html.heex:86 +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 #, elixir-autogen, elixir-format msgid "Name of your event" msgstr "Nom de votre événement" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format msgid "Note: Facilitators do not have the ability to delete your event." msgstr "Remarque : Les animateurs n'ont pas la possibilité de supprimer votre événement." @@ -1159,12 +1168,12 @@ msgstr "Remarque : Les animateurs n'ont pas la possibilité de supprimer votre msgid "Presentation file (optional)" msgstr "Fichier de présentation (facultatif)" -#: lib/claper_web/live/event_live/index.html.heex:141 +#: lib/claper_web/live/event_live/index.html.heex:142 #, elixir-autogen, elixir-format msgid "Quick event" msgstr "Événement rapide" -#: lib/claper_web/live/event_live/index.ex:91 +#: lib/claper_web/live/event_live/index.ex:102 #, elixir-autogen, elixir-format msgid "Quick event created successfully" msgstr "Événement rapide créé avec succès" @@ -1174,7 +1183,7 @@ msgstr "Événement rapide créé avec succès" msgid "Return to your last event" msgstr "Retourner à votre dernier événement" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format msgid "Select the start date for your event. Future dates are permissible." msgstr "Sélectionnez la date de début de votre événement. Les dates futures sont autorisées." @@ -1184,22 +1193,22 @@ msgstr "Sélectionnez la date de début de votre événement. Les dates futures msgid "Select your presentation (optional)" msgstr "Sélectionnez votre présentation (facultatif)" -#: lib/claper_web/live/event_live/event_form_component.html.heex:280 +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 #, elixir-autogen, elixir-format msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." msgstr "Ce code sera utilisé par vos participants pour accéder à l'événement. Vous avez la possibilité de créer un code personnalisé." -#: lib/claper_web/live/event_live/show.ex:192 +#: lib/claper_web/live/event_live/show.ex:193 #, elixir-autogen, elixir-format msgid "This event has been terminated" msgstr "Cet événement viens d'être terminé" -#: lib/claper_web/live/event_live/index.html.heex:147 +#: lib/claper_web/live/event_live/index.html.heex:148 #, elixir-autogen, elixir-format msgid "Welcome to Claper! You can create a new event here." msgstr "Bienvenue sur Claper ! Vous pouvez créer un nouvel événement ici." -#: lib/claper_web/live/event_live/event_form_component.html.heex:304 +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 #, elixir-autogen, elixir-format msgid "When your event will start?" msgstr "Quand votre événement commencera-t-il ?" @@ -1209,8 +1218,8 @@ msgstr "Quand votre événement commencera-t-il ?" msgid "Create your next presentation with" msgstr "Créez votre prochaine présentation avec" -#: lib/claper_web/live/event_live/manage.ex:27 -#: lib/claper_web/live/event_live/presenter.ex:24 +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:25 #, elixir-autogen, elixir-format msgid "Event doesn't exist" @@ -1221,7 +1230,7 @@ msgstr "L'événement n'existe pas" msgid "Customize your account" msgstr "Personnalisez votre compte" -#: lib/claper_web/live/user_settings_live/show.html.heex:265 +#: lib/claper_web/live/user_settings_live/show.html.heex:278 #, elixir-autogen, elixir-format msgid "Language" msgstr "Langue" @@ -1241,22 +1250,22 @@ msgstr "Vos préférences ont été mises à jour." msgid "Question" msgstr "Question" -#: lib/claper_web/live/event_live/manage.html.heex:1175 +#: lib/claper_web/live/event_live/manage.html.heex:1167 #, elixir-autogen, elixir-format msgid "Questions" msgstr "Questions" -#: lib/claper_web/live/event_live/manage.html.heex:1262 +#: lib/claper_web/live/event_live/manage.html.heex:1254 #, elixir-autogen, elixir-format msgid "Questions will appear here." msgstr "Les questions apparaîtront ici." -#: lib/claper_web/live/event_live/manage.html.heex:1304 +#: lib/claper_web/live/event_live/manage.html.heex:1296 #, elixir-autogen, elixir-format msgid "Sort by date" msgstr "Trier par date" -#: lib/claper_web/live/event_live/manage.html.heex:1283 +#: lib/claper_web/live/event_live/manage.html.heex:1275 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Trier par popularité" @@ -1266,7 +1275,8 @@ msgstr "Trier par popularité" msgid "Event manager" msgstr "Gestionnaire d'événement" -#: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Documentation" @@ -1282,7 +1292,7 @@ msgstr "Mon compte" msgid "Your personal informations to access your account" msgstr "Vos informations personnelles pour accéder à votre compte" -#: lib/claper_web/live/event_live/manager_settings_component.ex:533 +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 #, elixir-autogen, elixir-format, fuzzy msgid "Enable reactions" msgstr "Activer les réactions" @@ -1338,43 +1348,43 @@ msgid "Add Claper" msgstr "Ajouter Claper" #: lib/claper_web/live/event_live/manage.html.heex:123 -#: lib/claper_web/live/event_live/manage.html.heex:539 +#: lib/claper_web/live/event_live/manage.html.heex:538 #, elixir-autogen, elixir-format msgid "Close preview" msgstr "Fermer l'aperçu" -#: lib/claper_web/live/event_live/manage.html.heex:743 +#: lib/claper_web/live/event_live/manage.html.heex:734 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first interaction." msgstr "Créez votre première interaction." -#: lib/claper_web/live/event_live/manage.html.heex:1101 +#: lib/claper_web/live/event_live/manage.html.heex:1093 #, elixir-autogen, elixir-format, fuzzy msgid "Disable" msgstr "Désactiver" -#: lib/claper_web/live/event_live/manage.html.heex:1118 +#: lib/claper_web/live/event_live/manage.html.heex:1110 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Activer" -#: lib/claper_web/live/event_live/manager_settings_component.ex:443 +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 #, elixir-autogen, elixir-format, fuzzy msgid "Enable messages to change this option" msgstr "Activer les messages pour modifier cette option" #: lib/claper_web/live/event_live/manage.html.heex:122 -#: lib/claper_web/live/event_live/manage.html.heex:538 +#: lib/claper_web/live/event_live/manage.html.heex:537 #, elixir-autogen, elixir-format msgid "Open preview" msgstr "Ouvrir l'aperçu" -#: lib/claper_web/live/event_live/manager_settings_component.ex:321 +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 #, elixir-autogen, elixir-format msgid "Show messages to change this option" msgstr "Afficher les messages pour modifier cette option" -#: lib/claper_web/live/event_live/manage.html.heex:740 +#: lib/claper_web/live/event_live/manage.html.heex:731 #, elixir-autogen, elixir-format msgid "This slide does not have any interactions." msgstr "Cette diapositive n'a pas d'interactions." @@ -1401,7 +1411,7 @@ msgstr "Se connecter avec %{provider}" msgid "The account has been unlinked." msgstr "Le compte a été délié." -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "This section contains all your interactions." msgstr "Cette section contient toutes vos interactions." @@ -1412,12 +1422,12 @@ msgstr "Cette section contient toutes vos interactions." msgid "Unlink" msgstr "Délier" -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "You can add interactions to your presentation slides." msgstr "Vous pouvez ajouter des interactions à vos diapositives de présentation." -#: lib/claper_web/live/event_live/manage.html.heex:715 +#: lib/claper_web/live/event_live/manage.html.heex:706 #, elixir-autogen, elixir-format msgid "Your interactions" msgstr "Vos interactions" @@ -1442,12 +1452,12 @@ msgstr "Définissez un nouveau mot de passe pour votre compte avant de le délie msgid "Your password has been set, you can now unlink your account." msgstr "Votre mot de passe a été défini, vous pouvez maintenant délier votre compte." -#: lib/claper_web/live/embed_live/form_component.html.heex:38 +#: lib/claper_web/live/embed_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Iframe code" msgstr "Code Iframe" -#: lib/claper_web/live/embed_live/form_component.html.heex:39 +#: lib/claper_web/live/embed_live/form_component.html.heex:35 #, elixir-autogen, elixir-format msgid "Link to the content" msgstr "Lien vers le contenu" @@ -1473,24 +1483,24 @@ msgstr "Veuillez entrer un lien valide commençant par http:// ou https://" msgid "Please enter valid HTML content with an iframe tag" msgstr "Veuillez entrer un contenu HTML valide avec une balise iframe" -#: lib/claper_web/live/embed_live/form_component.html.heex:25 +#: lib/claper_web/live/embed_live/form_component.html.heex:23 #, elixir-autogen, elixir-format msgid "Provider" msgstr "Fournisseur" -#: lib/claper_web/live/poll_live/form_component.html.heex:89 +#: lib/claper_web/live/poll_live/form_component.html.heex:85 #, elixir-autogen, elixir-format msgid "Attendees can see the results on their device" msgstr "Les participants peuvent voir les résultats sur leur appareil" -#: lib/claper_web/live/embed_live/form_component.html.heex:56 +#: lib/claper_web/live/embed_live/form_component.html.heex:50 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees can view the web content on their device" msgstr "Les participants peuvent voir le contenu web sur leur appareil" -#: lib/claper_web/live/embed_live/form_component.html.heex:49 -#: lib/claper_web/live/poll_live/form_component.html.heex:82 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:172 +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 #, elixir-autogen, elixir-format msgid "Options" msgstr "Options" @@ -1558,12 +1568,12 @@ msgstr "Terminer" msgid "More options" msgstr "Plus d'options" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "No" msgstr "Non" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Oui" @@ -1613,32 +1623,32 @@ msgstr "Vous pouvez réinitialiser votre mot de passe en visitant l'URL ci-desso msgid "back to the home page" msgstr "retour à la page d'accueil" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:46 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 #, elixir-autogen, elixir-format, fuzzy msgid "Add Question" msgstr "Ajouter une question" -#: lib/claper_web/live/event_live/manage.html.heex:294 +#: lib/claper_web/live/event_live/manage.html.heex:293 #, elixir-autogen, elixir-format msgid "Add a quiz to test knowledge." msgstr "Ajouter un quiz pour tester les connaissances." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 #, elixir-autogen, elixir-format msgid "Add answer" msgstr "Ajouter une réponse" -#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous messages" msgstr "Autoriser les messages anonymes" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:84 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 #, elixir-autogen, elixir-format msgid "Answer %{index}" msgstr "Réponse %{index}" -#: lib/claper_web/live/event_live/manager_settings_component.ex:390 +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees" msgstr "Participants" @@ -1654,32 +1664,32 @@ msgstr "Score moyen" msgid "Current quiz" msgstr "Quiz actuel" -#: lib/claper_web/live/event_live/manager_settings_component.ex:485 +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 #, elixir-autogen, elixir-format, fuzzy msgid "Deny anonymous messages" msgstr "Refuser les messages anonymes" -#: lib/claper_web/live/event_live/manager_settings_component.ex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 #, elixir-autogen, elixir-format, fuzzy msgid "Disable messages" msgstr "Désactiver les messages" -#: lib/claper_web/live/event_live/manager_settings_component.ex:536 +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 #, elixir-autogen, elixir-format, fuzzy msgid "Disable reactions" msgstr "Désactiver les réactions" -#: lib/claper_web/live/event_live/manage.html.heex:369 +#: lib/claper_web/live/event_live/manage.html.heex:368 #, elixir-autogen, elixir-format, fuzzy msgid "Edit quiz" msgstr "Modifier le quiz" -#: lib/claper_web/live/event_live/manager_settings_component.ex:258 +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 #, elixir-autogen, elixir-format msgid "Hide instructions to join" msgstr "Masquer les instructions pour rejoindre" -#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 #, elixir-autogen, elixir-format, fuzzy msgid "Hide messages" msgstr "Masquer les messages" @@ -1702,12 +1712,12 @@ msgstr "Comment ça marche ?" msgid "Interaction" msgstr "Interaction" -#: lib/claper_web/live/event_live/manage.html.heex:368 +#: lib/claper_web/live/event_live/manage.html.heex:367 #, elixir-autogen, elixir-format msgid "New quiz" msgstr "Nouveau quiz" -#: lib/claper_web/live/event_live/manager_settings_component.ex:217 +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 #, elixir-autogen, elixir-format, fuzzy msgid "Presentation" msgstr "Présentation" @@ -1717,13 +1727,13 @@ msgstr "Présentation" msgid "Previous" msgstr "Précédent" -#: lib/claper_web/live/event_live/manage.html.heex:292 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Quiz" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:158 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 #, elixir-autogen, elixir-format msgid "Remove question" msgstr "Supprimer la question" @@ -1738,17 +1748,17 @@ msgstr "Passez en revue les questions" msgid "See current quiz" msgstr "Voir le quiz actuel" -#: lib/claper_web/live/event_live/manage.html.heex:388 +#: lib/claper_web/live/event_live/manage.html.heex:387 #, elixir-autogen, elixir-format, fuzzy msgid "Select presentation" msgstr "Sélectionner la présentation" -#: lib/claper_web/live/event_live/manager_settings_component.ex:361 +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 #, elixir-autogen, elixir-format, fuzzy msgid "Show all messages" msgstr "Afficher tous les messages" -#: lib/claper_web/live/event_live/manager_settings_component.ex:255 +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 #, elixir-autogen, elixir-format, fuzzy msgid "Show instructions to join" msgstr "Afficher les instructions pour rejoindre" @@ -1764,7 +1774,7 @@ msgstr "Afficher les résultats" msgid "Show results on presentation" msgstr "Afficher les résultats sur la présentation" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:206 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 #, elixir-autogen, elixir-format, fuzzy msgid "This will delete all responses associated and the quiz itself, are you sure?" msgstr "Cela supprimera toutes les réponses associées et le quiz lui-même, êtes-vous sûr ?" @@ -1774,7 +1784,7 @@ msgstr "Cela supprimera toutes les réponses associées et le quiz lui-même, ê msgid "Waiting for results..." msgstr "En attente des résultats..." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:62 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 #, elixir-autogen, elixir-format msgid "Your question" msgstr "Votre question" @@ -1792,7 +1802,7 @@ msgstr "Votre score" msgid "Export" msgstr "Exporter" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:218 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 #, elixir-autogen, elixir-format msgid "Export to QTI (XML)" msgstr "Exporter en QTI (XML)" @@ -1852,17 +1862,21 @@ msgstr "Participants uniques" msgid "Web Content" msgstr "Contenu web" -#: lib/claper_web/live/event_live/index.html.heex:178 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 #, elixir-autogen, elixir-format msgid "Active" msgstr "Actif" -#: lib/claper_web/live/event_live/index.html.heex:217 +#: lib/claper_web/live/event_live/index.html.heex:218 #, elixir-autogen, elixir-format msgid "Load more" msgstr "Charger plus" -#: lib/claper_web/live/event_live/index.html.heex:194 +#: lib/claper_web/live/event_live/index.html.heex:195 #, elixir-autogen, elixir-format msgid "Shared with you" msgstr "Partagé avec vous" @@ -1872,17 +1886,17 @@ msgstr "Partagé avec vous" msgid "You must login to continue" msgstr "Vous devez vous connecter pour continuer" -#: lib/claper/quizzes/quiz_question.ex:41 +#: lib/claper/quizzes/quiz_question.ex:51 #, elixir-autogen, elixir-format msgid "must have at least one correct answer" msgstr "doit avoir au moins une bonne réponse" -#: lib/claper_web/live/event_live/manage.html.heex:548 +#: lib/claper_web/live/event_live/manage.html.heex:547 #, elixir-autogen, elixir-format msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." msgstr "Cliquez ici pour ouvrir la fenêtre de présentation. Appuyez sur F dans la fenêtre de présentation pour activer le plein ecran." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:179 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous submissions" msgstr "Autoriser les soumissions anonymes" @@ -1901,3 +1915,771 @@ msgstr "Se connecter" #, elixir-autogen, elixir-format msgid "Total submissions" msgstr "Total des soumissions" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "Un code unique pour que les participants rejoignent cet événement" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "Un nom unique pour cet événement" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "Un nom unique pour identifier ce fournisseur OIDC" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "Le compte est confirmé et actif" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format +msgid "Actions" +msgstr "Actions" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Active Events" +msgstr "Événements actifs" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to delete this event?" +msgstr "Êtes-vous sûr de vouloir supprimer cet événement ?" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to delete this provider?" +msgstr "Êtes-vous sûr de vouloir supprimer ce fournisseur ?" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to delete this user?" +msgstr "Êtes-vous sûr de vouloir supprimer cet utilisateur ?" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "Utilisateur assigné" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format +msgid "Audience Peak" +msgstr "Pic d'audience" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "Code d'autorisation" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "Annuler" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format +msgid "Choose file" +msgstr "Choisir un fichier" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "ID Client" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "Secret Client" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "Terminé" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format +msgid "Confirmed" +msgstr "Confirmé" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "Confirmé le" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Create Event" +msgstr "Créer un événement" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "Créer un fournisseur" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Create User" +msgstr "Créer un utilisateur" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format +msgid "Created" +msgstr "Créé" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format +msgid "Created At" +msgstr "Créé le" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format +msgid "Currently running" +msgstr "Actuellement en cours" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format +msgid "Delete event" +msgstr "Supprimer l'événement" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "Supprimer le fournisseur" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format +msgid "Delete user" +msgstr "Supprimer l'utilisateur" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "Modifier le fournisseur OIDC" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "Modifier l'événement" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "Modifier le fournisseur" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit user" +msgstr "Modifier l'utilisateur" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "Activer ce fournisseur OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "Saisir l'ID client" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "Saisir le secret client" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "Saisir le code de l'événement" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "Saisir le nom de l'événement" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter password" +msgstr "Saisir le mot de passe" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "Saisir le nom du fournisseur" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "Saisir l'email de l'utilisateur" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "Création d'événement" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "Événement créé avec succès" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "Événement supprimé avec succès" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "Détails de l'événement" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "Événement mis à jour avec succès" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format +msgid "Events" +msgstr "Événements" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "Événements exportés avec succès" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "Expiré le" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "Fichier sélectionné" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format +msgid "Form Post" +msgstr "Form Post" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "Fragment" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "Comment la réponse d'autorisation doit être retournée (par défaut 'query')" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "Hybride" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "Implicite" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format +msgid "Inactive" +msgstr "Inactif" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "Mot de passe initial pour l'utilisateur" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "Émetteur" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "URL de l'émetteur" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "30 derniers jours" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "Dernière mise à jour" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "Nouvel événement" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "Aucun événement trouvé" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "Aucun fichier choisi" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "Aucun propriétaire" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "Aucun rôle" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "Aucun utilisateur trouvé" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "Non expiré" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "Non démarré" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "Type de réponse OAuth 2.0 (par défaut 'code')" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "OIDC Provider" +msgstr "Fournisseur OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "Détails du fournisseur OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format +msgid "OIDC Providers" +msgstr "Fournisseurs OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "Portées OIDC à demander (par défaut 'openid email profile')" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "Propriétaire" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "Fournisseur créé avec succès" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format +msgid "Provider updated successfully" +msgstr "Fournisseur mis à jour avec succès" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "Query" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "Événements récents" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "URI de redirection" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "Mode de réponse" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "Type de réponse" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "Rôle" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "Enregistrement..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "Planifié" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "Portée" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "Rechercher des événements..." + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "Rechercher un utilisateur..." + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "Rechercher des fournisseurs..." + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "Rechercher des utilisateurs..." + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format +msgid "Select an option" +msgstr "Sélectionner une option" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "Sélectionner..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "Date de début" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "Démarré le" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "Statut" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "L'URL de l'émetteur OIDC (doit commencer par http:// ou https://)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "L'URL de rappel pour votre application (doit commencer par http:// ou https://)" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "L'utilisateur qui possède cet événement (requis)" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "Total des événements" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "Total des utilisateurs" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "Non confirmé" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "Mettre à jour l'événement" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "Mettre à jour le fournisseur" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "Mettre à jour l'utilisateur" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "Compte utilisateur" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "Croissance des utilisateurs" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "Utilisateur créé avec succès" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Utilisateur supprimé avec succès" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "Détails de l'utilisateur" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "User updated successfully" +msgstr "Utilisateur mis à jour avec succès" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "Niveau d'accès de l'utilisateur" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "Adresse email de l'utilisateur (doit être unique)" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "Utilisateurs" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "Utilisateurs exportés avec succès" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "Voir l'événement" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format +msgid "View provider" +msgstr "Voir le fournisseur" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "Voir l'utilisateur" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "Quand cet événement expire (optionnel)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "Si ce fournisseur est actuellement actif et disponible pour l'authentification" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format +msgid "attendees" +msgstr "participants" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "https://exemple.com" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "https://votreapp.com/auth/callback" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "openid email profile" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "vs mois dernier" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format +msgid "Back to events" +msgstr "Retour aux événements" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "Back to providers" +msgstr "Retour aux fournisseurs" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format +msgid "Back to users" +msgstr "Retour aux utilisateurs" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format +msgid "New provider" +msgstr "Nouveau fournisseur" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format +msgid "New user" +msgstr "Nouvel utilisateur" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format +msgid "No providers found" +msgstr "Aucun fournisseur trouvé" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format +msgid "Provider deleted successfully" +msgstr "Fournisseur supprimé avec succès" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format +msgid "Provider details" +msgstr "Détails du fournisseur" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "Admin" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "Retour à l'app" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirm email change" +msgstr "Confirmer l'email" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format, fuzzy +msgid "If you didn't request an email change, please ignore this." +msgstr "Si vous n'avez pas créé de compte chez nous, veuillez ignorer ceci." + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "You can confirm your email change by visiting the URL below" +msgstr "Vous pouvez modifier votre email en visitant l'URL ci-dessous" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "Masquer nombre de participants" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show attendee count" +msgstr "Afficher le nombre de participants" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "Obligatoire" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "(facultatif)" diff --git a/priv/gettext/hu/LC_MESSAGES/default.po b/priv/gettext/hu/LC_MESSAGES/default.po new file mode 100644 index 0000000..4eb1a2f --- /dev/null +++ b/priv/gettext/hu/LC_MESSAGES/default.po @@ -0,0 +1,2681 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: POEditor.com\n" +"Project-Id-Version: Claper\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 +#: lib/claper_web/live/user_settings_live/show.ex:77 +#, elixir-autogen, elixir-format +msgid "Settings" +msgstr "Beállítások" + +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 +#: lib/claper_web/live/user_settings_live/show.html.heex:34 +#: lib/claper_web/templates/user_registration/new.html.heex:29 +#: lib/claper_web/templates/user_reset_password/new.html.heex:28 +#: lib/claper_web/templates/user_session/new.html.heex:42 +#, elixir-autogen, elixir-format +msgid "Email" +msgstr "E-mail" + +#: lib/claper_web/templates/user_registration/new.html.heex:12 +#, elixir-autogen, elixir-format +msgid "Join the Claper experience" +msgstr "Csatlakozzon a Claper-élményhez" + +#: lib/claper_web/templates/user_registration/new.html.heex:19 +#: lib/claper_web/templates/user_reset_password/edit.html.heex:25 +#: lib/claper_web/templates/user_reset_password/new.html.heex:19 +#, elixir-autogen, elixir-format +msgid "Oops, check that all fields are filled in correctly." +msgstr "Ellenőrizze, hogy minden mező helyesen lett-e kitöltve." + +#: lib/claper_web/live/user_settings_live/show.html.heex:155 +#: lib/claper_web/live/user_settings_live/show.html.heex:170 +#, elixir-autogen, elixir-format +msgid "Change" +msgstr "Módosítás" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 +#, elixir-autogen, elixir-format +msgid "Code" +msgstr "Kód" + +#: lib/claper_web/live/user_settings_live/show.html.heex:146 +#: lib/claper_web/templates/user_session/new.html.heex:40 +#, elixir-autogen, elixir-format +msgid "Email address" +msgstr "E-mail cím" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 +#, elixir-autogen, elixir-format +msgid "Logout" +msgstr "Kijelentkezés" + +#: lib/claper_web/live/user_settings_live/show.html.heex:136 +#, elixir-autogen, elixir-format +msgid "Personal informations" +msgstr "Személyes adatok" + +#: lib/claper_web/templates/user_registration/confirm.html.heex:13 +#, elixir-autogen, elixir-format +msgid "We already sent you an email to login, please retry in 5 minutes." +msgstr "Már küldtünk egy e-mailt a bejelentkezéshez, próbálja újra 5 perc múlva." + +#: lib/claper_web/templates/user_registration/confirm.html.heex:16 +#, elixir-autogen, elixir-format +msgid "We sent you an email at" +msgstr "Küldtünk egy e-mailt erre a címre:" + +#: lib/claper_web/live/event_live/show.html.heex:437 +#, elixir-autogen, elixir-format +msgid "days" +msgstr "nap" + +#: lib/claper_web/live/event_live/show.html.heex:443 +#, elixir-autogen, elixir-format +msgid "hours" +msgstr "óra" + +#: lib/claper_web/live/event_live/show.html.heex:449 +#, elixir-autogen, elixir-format +msgid "minutes" +msgstr "perc" + +#: lib/claper_web/live/event_live/show.html.heex:165 +#, elixir-autogen, elixir-format +msgid "Be the first to react !" +msgstr "Reagáljon elsőként!" + +#: lib/claper_web/live/event_live/event_card_component.ex:111 +#: lib/claper_web/live/event_live/join.ex:41 +#: lib/claper_web/live/event_live/join.html.heex:94 +#: lib/claper_web/live/event_live/manage.html.heex:492 +#: lib/claper_web/live/event_live/show.html.heex:286 +#, elixir-autogen, elixir-format +msgid "Join" +msgstr "Csatlakozás" + +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 +#: lib/claper_web/live/event_live/join.html.heex:31 +#: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 +#, elixir-autogen, elixir-format +msgid "Dashboard" +msgstr "Kezdőlap" + +#: lib/claper_web/live/event_live/post_component.ex:33 +#: lib/claper_web/live/event_live/post_component.ex:112 +#, elixir-autogen, elixir-format +msgid "Host" +msgstr "Host" + +#: lib/claper_web/live/event_live/show.html.heex:455 +#, elixir-autogen, elixir-format +msgid "seconds" +msgstr "másodperc" + +#: lib/claper_web/live/event_live/event_card_component.ex:60 +#: lib/claper_web/live/event_live/index.html.heex:187 +#, elixir-autogen, elixir-format +msgid "Finished" +msgstr "Befejezve" + +#: lib/claper_web/live/event_live/event_card_component.ex:90 +#, elixir-autogen, elixir-format +msgid "Finished on" +msgstr "Vége ekkor: " + +#: lib/claper_web/live/event_live/event_card_component.ex:55 +#, elixir-autogen, elixir-format +msgid "Incoming" +msgstr "Bejövő" + +#: lib/claper_web/live/event_live/show.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Leave" +msgstr "Kilépés" + +#: lib/claper_web/live/event_live/presenter.html.heex:26 +#: lib/claper_web/live/event_live/show.html.heex:464 +#, elixir-autogen, elixir-format +msgid "Scan to interact in real-time" +msgstr "Szkennelje be, hogy valós időben csatlakozhasson." + +#: lib/claper_web/live/event_live/event_card_component.ex:86 +#, elixir-autogen, elixir-format +msgid "Starting on" +msgstr "Kezdés: " + +#: lib/claper_web/live/event_live/event_form_component.ex:268 +#, elixir-autogen, elixir-format +msgid "Updated successfully" +msgstr "Sikeresen frissítve" + +#: lib/claper_web/templates/user_session/new.html.heex:22 +#, elixir-autogen, elixir-format +msgid "It's time to empower your presentations." +msgstr "Itt az idő, hogy új szintre emelje prezentációit." + +#: lib/claper_web/templates/error/404.html.heex:36 +#: lib/claper_web/templates/error/500.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Return to home" +msgstr "Vissza a kezdőlapra" + +#: lib/claper_web/live/event_live/event_form_component.ex:212 +#: lib/claper_web/live/event_live/event_form_component.ex:248 +#, elixir-autogen, elixir-format +msgid "Created successfully" +msgstr "Sikeresen létrehozva" + +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 +#: lib/claper_web/live/event_live/event_card_component.ex:250 +#: lib/claper_web/live/event_live/event_card_component.ex:330 +#: lib/claper_web/live/event_live/form_component.ex:97 +#: lib/claper_web/live/event_live/index.ex:204 +#, elixir-autogen, elixir-format +msgid "Edit" +msgstr "Szerkesztés" + +#: lib/claper_web/live/embed_live/form_component.html.heex:63 +#: lib/claper_web/live/event_live/event_form_component.html.heex:55 +#: lib/claper_web/live/event_live/event_form_component.html.heex:62 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 +#, elixir-autogen, elixir-format +msgid "Create" +msgstr "Létrehozás" + +#: lib/claper_web/live/embed_live/form_component.html.heex:68 +#: lib/claper_web/live/event_live/event_card_component.ex:444 +#: lib/claper_web/live/event_live/event_form_component.html.heex:67 +#: lib/claper_web/live/event_live/manage.html.heex:1397 +#: lib/claper_web/live/event_live/manageable_post_component.ex:92 +#: lib/claper_web/live/event_live/post_component.ex:70 +#: lib/claper_web/live/event_live/post_component.ex:142 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#, elixir-autogen, elixir-format +msgid "Delete" +msgstr "Törlés" + +#: lib/claper_web/live/embed_live/form_component.html.heex:64 +#: lib/claper_web/live/event_live/event_form_component.html.heex:54 +#: lib/claper_web/live/event_live/event_form_component.html.heex:61 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 +#: lib/claper_web/live/user_settings_live/show.html.heex:38 +#: lib/claper_web/live/user_settings_live/show.html.heex:80 +#: lib/claper_web/live/user_settings_live/show.html.heex:123 +#, elixir-autogen, elixir-format +msgid "Save" +msgstr "Mentés" + +#: lib/claper_web/live/user_settings_live/show.ex:137 +#, elixir-autogen, elixir-format +msgid "A link to confirm your email change has been sent to the new address." +msgstr "Az e-mail változtatást megerősítő linket elküldtük az új e-mail címre." + +#: lib/claper_web/live/user_settings_live/show.ex:53 +#, elixir-autogen, elixir-format +msgid "Change the email address you want associated with your account." +msgstr "Fiók e-mail címének módosítása." + +#: lib/claper_web/live/user_settings_live/show.ex:50 +#, elixir-autogen, elixir-format +msgid "Update your email" +msgstr "E-mail megváltoztatása" + +#: lib/claper_web/notifiers/user_notifier.ex:12 +#: lib/claper_web/templates/user_notifier/magic.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Connect to Claper" +msgstr "Csatlakozás a Claperhez" + +#: lib/claper_web/templates/user_notifier/magic.html.heex:29 +#, elixir-autogen, elixir-format +msgid "ACCESS TO MY ACCOUNT" +msgstr "Hozzáférés a fiókomhoz" + +#: lib/claper_web/notifiers/user_notifier.ex:34 +#, elixir-autogen, elixir-format +msgid "Update email instructions" +msgstr "E-mail frissítése" + +#: lib/claper_web/templates/user_notifier/change.html.heex:29 +#, elixir-autogen, elixir-format +msgid "CONFIRM EMAIL" +msgstr "E-MAIL MEGERŐSÍTÉSE" + +#: lib/claper_web/templates/user_notifier/confirm.html.heex:32 +#: lib/claper_web/templates/user_notifier/magic.html.heex:32 +#: lib/claper_web/templates/user_notifier/reset.html.heex:32 +#, elixir-autogen, elixir-format +msgid "If you didn't create an account with us, please ignore this." +msgstr "Amennyiben nem regisztrált fiókot nálunk, kérjük, hagyja ezt az üzenetet figyelmen kívül." + +#: lib/claper_web/templates/user_notifier/magic.html.heex:22 +#, elixir-autogen, elixir-format +msgid "You can log into your account by clicking here." +msgstr "Ide kattintva jelentkezhet be a fiókjába." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:71 +#: lib/claper_web/live/event_live/post_component.ex:75 +#: lib/claper_web/live/event_live/post_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Are you sure?" +msgstr "Biztos benne?" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:192 +#, elixir-autogen, elixir-format +msgid "Presentation attached" +msgstr "Prezentáció csatolva" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:152 +#, elixir-autogen, elixir-format +msgid "Presentation uploaded" +msgstr "Prezentáció feltöltve" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:163 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 +#, elixir-autogen, elixir-format +msgid "Remove" +msgstr "Eltávolítás" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:173 +#, elixir-autogen, elixir-format +msgid "Select your presentation" +msgstr "Válassza ki a prezentációt" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:115 +#, elixir-autogen, elixir-format +msgid "Upload a file" +msgstr "Töltsön fel egy fájlt" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:119 +#, elixir-autogen, elixir-format +msgid "or drag and drop" +msgstr "vagy húzza ide" + +#: lib/claper_web/live/event_live/event_form_component.ex:322 +#, elixir-autogen, elixir-format +msgid "You have selected an incorrect file type" +msgstr "Helytelen fájltípus" + +#: lib/claper_web/live/event_live/event_form_component.ex:321 +#, elixir-autogen, elixir-format +msgid "Your file is too large" +msgstr "Túl nagy fájl" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:202 +#, elixir-autogen, elixir-format +msgid "Change file" +msgstr "Fájl megváltoztatása" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 +#, elixir-autogen, elixir-format +msgid "Presentation replaced" +msgstr "Prezentáció lecserélve" + +#: lib/claper_web/live/event_live/manage.html.heex:305 +#, elixir-autogen, elixir-format +msgid "Edit poll" +msgstr "Szavazás szerkesztése" + +#: lib/claper_web/live/event_live/manage.html.heex:304 +#, elixir-autogen, elixir-format +msgid "New poll" +msgstr "Új szavazás" + +#: lib/claper_web/live/poll_live/form_component.html.heex:14 +#, elixir-autogen, elixir-format +msgid "Title of your poll" +msgstr "A szavazás címe" + +#: lib/claper_web/live/event_live/event_form_component.ex:323 +#, elixir-autogen, elixir-format +msgid "Upload failed" +msgstr "Hiba a feltöltéskor" + +#: lib/claper_web/live/event_live/manage.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Add poll to know opinion of your public." +msgstr "Adjon hozzá egy szavazást, hogy megismerje a közönség véleményét." + +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 +#, elixir-autogen, elixir-format +msgid "Poll" +msgstr "Szavazás" + +#: lib/claper_web/live/poll_live/form_component.html.heex:26 +#, elixir-format, ex-autogen, elixir-autogen +msgid "Choice %{count}" +msgid_plural "Choice %{count}" +msgstr[0] "%{count} lehetőség" +msgstr[1] "" + +#: lib/claper_web/live/event_live/poll_component.ex:47 +#, elixir-autogen, elixir-format +msgid "Current poll" +msgstr "Jelenlegi szavazás" + +#: lib/claper_web/live/event_live/poll_component.ex:28 +#, elixir-autogen, elixir-format +msgid "See current poll" +msgstr "Jelenlegi szavazás megtekintése" + +#: lib/claper_web/live/event_live/poll_component.ex:127 +#: lib/claper_web/live/event_live/poll_component.ex:135 +#, elixir-autogen, elixir-format +msgid "Vote" +msgstr "Szavazás" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 +#, elixir-autogen, elixir-format +msgid "User email address" +msgstr "A felhasználó e-mail címe" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 +#, elixir-autogen, elixir-format +msgid "Changing your file will remove all interaction elements like polls associated." +msgstr "A fájl lecserélése magával vonja az összes hozzákapcsolt interakció (pl. szavazás) törlését." + +#: lib/claper_web/live/event_live/manage.html.heex:1213 +#, elixir-autogen, elixir-format +msgid "Messages from attendees will appear here." +msgstr "A résztvevők üzenetei itt fognak megjelenni." + +#: lib/claper_web/live/event_live/event_card_component.ex:344 +#, elixir-autogen, elixir-format +msgid "Processing your file..." +msgstr "Fájl feldolgozása..." + +#: lib/claper_web/live/poll_live/form_component.html.heex:114 +#, elixir-autogen, elixir-format +msgid "This will delete all responses associated and the poll itself, are you sure?" +msgstr "Ez a szavazással együtt törli az összes beérkezett választ is. Biztos benne?" + +#: lib/claper_web/live/event_live/show.html.heex:345 +#, elixir-autogen, elixir-format +msgid "Ask, comment..." +msgstr "Kérdezzen, kommenteljen..." + +#: lib/claper_web/live/event_live/manage.html.heex:1159 +#: lib/claper_web/live/stat_live/index.html.heex:102 +#: lib/claper_web/live/stat_live/index.html.heex:180 +#, elixir-autogen, elixir-format +msgid "Messages" +msgstr "Üzenetek" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 +#, elixir-autogen, elixir-format +msgid "Add facilitator" +msgstr "Facilitátor hozzáadása" + +#: lib/claper_web/templates/error/404.html.heex:31 +#, elixir-autogen, elixir-format +msgid "Oops, page doesn't exist." +msgstr "Az oldal nem található." + +#: lib/claper_web/templates/error/500.html.heex:31 +#, elixir-autogen, elixir-format +msgid "The site is under maintenance, we'll be back very soon!" +msgstr "Karbantartás alatt. Próbálja újra később." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 +#, elixir-autogen, elixir-format +msgid "Facilitators can present and manage interactions" +msgstr "A facilitátorok kezelhetik és vezethetik az interakciókat" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:45 +#: lib/claper_web/templates/user_notifier/change.html.heex:42 +#: lib/claper_web/templates/user_notifier/confirm.html.heex:42 +#: lib/claper_web/templates/user_notifier/magic.html.heex:42 +#: lib/claper_web/templates/user_notifier/reset.html.heex:42 +#, elixir-autogen, elixir-format +msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" +msgstr "Ha a fenti gomb nem működik, másolja be az alábbi címet a böngészőbe" + +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 +#, elixir-autogen, elixir-format +msgid "Add interaction" +msgstr "Interakció hozzáadása" + +#: lib/claper_web/live/event_live/manageable_post_component.ex:54 +#: lib/claper_web/live/event_live/manageable_post_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Blocking this user will delete all his messages and he will not be able to join again, confirm ?" +msgstr "Ezen felhasználó blokkolásával az üzenetei törlődnek, és nem fog tudni újra csatlakozni. Biztos benne?" + +#: lib/claper_web/live/event_live/show.ex:51 +#: lib/claper_web/live/event_live/show.ex:206 +#: lib/claper_web/live/event_live/show.ex:221 +#, elixir-autogen, elixir-format +msgid "You have been banned from this event" +msgstr "Ki van tiltva erről az eseményről" + +#: lib/claper_web/live/event_live/manageable_post_component.ex:48 +#: lib/claper_web/live/event_live/manageable_post_component.ex:77 +#, elixir-autogen, elixir-format +msgid "Ban" +msgstr "Kitiltás" + +#: lib/claper_web/templates/user_registration/confirm.html.heex:18 +#, elixir-autogen, elixir-format +msgid ", click on the provided link to connect (check your spam !)" +msgstr ", kattintson a kapott linkre a kapcsolódáshoz, és ellenőrizze a spam mappát." + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:29 +#, elixir-autogen, elixir-format +msgid "Export your current presentation to PDF from your favorite slide presentation software (PowerPoint, etc)" +msgstr "Exportálja a jelenlegi prezentációt PDF formátumba kedvenc prezentációs szoftveréből (PowerPoint, stb)" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:50 +#, elixir-autogen, elixir-format +msgid "Wait few minutes for your file to be processed" +msgstr "Várjon néhány percet a fájlfeldolgozás befejezéséhez" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:43 +#, elixir-autogen, elixir-format +msgid "Choose a name for your event, a code for your attendees to join and dates when your attendees could start interacting" +msgstr "Válasszon egy nevet az eseménynek, egy csatlakozási kódot és kezdési dátumot" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:64 +#, elixir-autogen, elixir-format +msgid "Click Start to open your presentation and move the window on the big screen" +msgstr "Kattintson a Start gombra a prezentáció megnyitásához és kivetítéséhez" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:57 +#, elixir-autogen, elixir-format +msgid "Click on Present/Customize to add interaction on your slides" +msgstr "Kattintson a Prezentálás/személyre szabás gombra, hogy interakciókat adhasson a diákhoz" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:22 +#, elixir-autogen, elixir-format +msgid "Congrats! You've taken the first step to improving your presentations. Here are the next steps to create step up your presentations with Claper:" +msgstr "Gratulálunk! Megtette az első lépést a prezentációja fejlesztésében. Itt vannak a következő lépések, amivel javíthatja a prezentációját a Claperben:" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:69 +#, elixir-autogen, elixir-format +msgid "Enjoy ! ✨" +msgstr "Jó szórakozást! ✨" + +#: lib/claper_web/templates/user_registration/confirm.html.heex:20 +#, elixir-autogen, elixir-format +msgid "We sent you an email, click on the provided link to connect (check your spam !)" +msgstr "Küldtünk egy e-mailt, kattintson a kapott linkre a csatlakozáshoz (vagy ellenőrizze a spam mappát)" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Welcome !" +msgstr "Üdvözöljük!" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:36 +#, elixir-autogen, elixir-format +msgid "Click on the create button on your dashboard" +msgstr "Kattintson a létrehozás gombra a kezdőlapon" + +#: lib/claper_web/notifiers/user_notifier.ex:23 +#, elixir-autogen, elixir-format +msgid "Next steps to boost your presentations" +msgstr "A következő lépések, hogy új szintre emelje prezentációját" + +#: lib/claper_web/live/stat_live/index.html.heex:109 +#, elixir-autogen, elixir-format +msgid "from %{count} people" +msgid_plural "from %{count} peoples" +msgstr[0] "%{count} embertől" +msgstr[1] "" + +#: lib/claper_web/live/stat_live/index.html.heex:15 +#, elixir-autogen, elixir-format +msgid "Event" +msgstr "Esemény" + +#: lib/claper_web/live/stat_live/index.html.heex:386 +#, elixir-autogen, elixir-format +msgid "No messages has been sent" +msgstr "Nincsenek küldött üzenetek" + +#: lib/claper_web/live/event_live/event_card_component.ex:426 +#, elixir-autogen, elixir-format +msgid "This will delete all data related to your event, this cannot be undone. Confirm ?" +msgstr "Az esemény minden adata törlődni fog, a visszaállítás nem lehetséges. Folytatja?" + +#: lib/claper_web/live/stat_live/index.html.heex:45 +#: lib/claper_web/live/stat_live/index.html.heex:77 +#, elixir-autogen, elixir-format +msgid "attendee" +msgid_plural "attendees" +msgstr[0] "résztvevő" +msgstr[1] "résztvevők" + +#: lib/claper_web/live/stat_live/index.html.heex:38 +#, elixir-autogen, elixir-format +msgid "Audience peak" +msgstr "Részvételi csúcs" + +#: lib/claper_web/live/stat_live/index.html.heex:139 +#, elixir-autogen, elixir-format +msgid "Engagement rate" +msgstr "Aktivitási arány" + +#: lib/claper_web/live/event_live/event_card_component.ex:282 +#, elixir-autogen, elixir-format +msgid "Error when processing the file" +msgstr "Hiba a fájl feldolgozásakor" + +#: lib/claper_web/live/event_live/join.html.heex:24 +#: lib/claper_web/live/event_live/join.html.heex:47 +#, elixir-autogen, elixir-format +msgid "About" +msgstr "Rólunk" + +#: lib/claper_web/live/event_live/join.html.heex:38 +#: lib/claper_web/live/event_live/join.html.heex:61 +#: lib/claper_web/templates/user_session/new.html.heex:62 +#, elixir-autogen, elixir-format +msgid "Login" +msgstr "Bejelentkezés" + +#: lib/claper_web/templates/user_session/new.html.heex:25 +#, elixir-autogen, elixir-format +msgid "Connect to your account" +msgstr "Lépjen be a fiókjába" + +#: lib/claper_web/live/event_live/show.html.heex:473 +#, elixir-autogen, elixir-format +msgid "Or use the code:" +msgstr "Vagy használja a kódot:" + +#: lib/claper_web/templates/user_registration/new.html.heex:46 +#: lib/claper_web/templates/user_session/new.html.heex:84 +#, elixir-autogen, elixir-format +msgid "Create account" +msgstr "Regisztráció" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 +#: lib/claper_web/live/user_settings_live/show.html.heex:161 +#: lib/claper_web/templates/user_registration/new.html.heex:37 +#: lib/claper_web/templates/user_reset_password/edit.html.heex:34 +#: lib/claper_web/templates/user_session/new.html.heex:50 +#: lib/claper_web/templates/user_session/new.html.heex:52 +#, elixir-autogen, elixir-format +msgid "Password" +msgstr "Jelszó" + +#: lib/claper_web/live/user_settings_live/show.ex:62 +#, elixir-autogen, elixir-format +msgid "Change the password used to access your account." +msgstr "Jelszó megváltoztatása." + +#: lib/claper_web/live/user_settings_live/show.html.heex:70 +#, elixir-autogen, elixir-format +msgid "Current password" +msgstr "Jelenlegi jelszó" + +#: lib/claper_web/live/user_settings_live/show.html.heex:76 +#: lib/claper_web/live/user_settings_live/show.html.heex:112 +#, elixir-autogen, elixir-format +msgid "New password" +msgstr "Új jelszó" + +#: lib/claper_web/live/user_settings_live/show.ex:59 +#, elixir-autogen, elixir-format +msgid "Update your password" +msgstr "Változtassa meg jelszavát" + +#: lib/claper_web/live/user_settings_live/show.ex:159 +#, elixir-autogen, elixir-format +msgid "Your password has been updated." +msgstr "A jelszó megváltozott." + +#: lib/claper_web/live/form_live/form_component.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Field %{count}" +msgid_plural "Field %{count}" +msgstr[0] "Mező %{count}" +msgstr[1] "Mező %{count}" + +#: lib/claper_web/live/event_live/manage.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Add form to collect data from your public." +msgstr "Adjon hozzá egy űrlapot, hogy adatokat gyűjthessen a közönségtől." + +#: lib/claper_web/live/event_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Current form" +msgstr "Jelenlegi űrlap" + +#: lib/claper_web/live/event_live/manage.html.heex:326 +#, elixir-autogen, elixir-format +msgid "Edit form" +msgstr "Űrlap szerkesztése" + +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 +#, elixir-autogen, elixir-format +msgid "Form" +msgstr "Űrlap" + +#: lib/claper_web/live/event_live/manage.html.heex:1183 +#, elixir-autogen, elixir-format +msgid "Form submissions" +msgstr "Beküldött űrlapok" + +#: lib/claper_web/live/event_live/manage.html.heex:1382 +#, elixir-autogen, elixir-format +msgid "Form submissions from attendees will appear here." +msgstr "A résztvevők által beküldött űrlapok itt fognak megjelenni." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 +#, elixir-autogen, elixir-format +msgid "Name" +msgstr "Név" + +#: lib/claper_web/live/event_live/manage.html.heex:325 +#, elixir-autogen, elixir-format +msgid "New form" +msgstr "Új űrlap" + +#: lib/claper_web/live/stat_live/index.html.heex:305 +#, elixir-autogen, elixir-format +msgid "No form submission has been sent" +msgstr "Nincsenek beküldött űrlapok." + +#: lib/claper_web/live/event_live/form_component.ex:32 +#, elixir-autogen, elixir-format +msgid "See current form" +msgstr "Jelenlegi űrlap megtekintése" + +#: lib/claper_web/live/event_live/form_component.ex:97 +#: lib/claper_web/live/event_live/quiz_component.ex:183 +#, elixir-autogen, elixir-format +msgid "Submit" +msgstr "Küldés" + +#: lib/claper_web/live/form_live/form_component.html.heex:32 +#, elixir-autogen, elixir-format +msgid "Text" +msgstr "Szöveg" + +#: lib/claper_web/live/event_live/manage.html.heex:1402 +#, elixir-autogen, elixir-format +msgid "This cannot be undone, confirm ?" +msgstr "A műveletet nem lehet visszavonni. Folytatja?" + +#: lib/claper_web/live/form_live/form_component.html.heex:105 +#, elixir-autogen, elixir-format +msgid "This will delete all responses associated and the form itself, are you sure?" +msgstr "Az űrlap és minden hozzá tartozó válasz törlődni fog. Folytatja?" + +#: lib/claper_web/live/form_live/form_component.html.heex:14 +#, elixir-autogen, elixir-format +msgid "Title of your form" +msgstr "Az űrlap címe" + +#: lib/claper_web/live/form_live/form_component.html.heex:34 +#, elixir-autogen, elixir-format +msgid "Type" +msgstr "Típus" + +#: lib/claper_web/live/event_live/poll_component.ex:52 +#, elixir-autogen, elixir-format +msgid "Select one option" +msgstr "Válasszon egy opciót" + +#: lib/claper_web/live/event_live/poll_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Select one or multiple options" +msgstr "Válasszon egy vagy több opciót" + +#: lib/claper_web/live/poll_live/form_component.html.heex:92 +#, elixir-autogen, elixir-format +msgid "Multiple answers" +msgstr "Több válaszlehetőség" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:122 +#, elixir-autogen, elixir-format +msgid "PDF, PPT, PPTX up to %{size} MB" +msgstr "PDF, PPT, PPTX %{size} MB maximum méretig" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#, elixir-autogen, elixir-format +msgid "Enable messages" +msgstr "Üzenetek engedélyezése" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#, elixir-autogen, elixir-format +msgid "Show messages" +msgstr "Üzenetek mutatása" + +#: lib/claper_web/live/event_live/show.html.heex:365 +#, elixir-autogen, elixir-format +msgid "Messages deactivated" +msgstr "Üzenetek letiltva." + +#: lib/claper_web/live/event_live/show.html.heex:208 +#: lib/claper_web/live/event_live/show.html.heex:229 +#: lib/claper_web/live/event_live/show.html.heex:329 +#, elixir-autogen, elixir-format +msgid "Anonymous" +msgstr "Névtelen" + +#: lib/claper_web/live/event_live/show.html.heex:255 +#: lib/claper_web/templates/lti/launch/error.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Close" +msgstr "Bezárás" + +#: lib/claper_web/live/event_live/show.html.heex:236 +#: lib/claper_web/live/event_live/show.html.heex:281 +#, elixir-autogen, elixir-format +msgid "Enter your name" +msgstr "Írja be a nevét" + +#: lib/claper_web/live/event_live/presenter.html.heex:38 +#, elixir-autogen, elixir-format +msgid "Or go to %{url} and use the code:" +msgstr "Vagy látogassa meg a következő linket: %{url} és használja a következő kódot:" + +#: lib/claper_web/live/event_live/show.html.heex:249 +#, elixir-autogen, elixir-format +msgid "Use your name" +msgstr "Használja a nevét" + +#: lib/claper_web/live/event_live/show.html.heex:229 +#, elixir-autogen, elixir-format +msgid "disabled" +msgstr "letiltva" + +#: lib/claper_web/controllers/user_registration_controller.ex:14 +#, elixir-autogen, elixir-format +msgid "Account creation is disabled" +msgstr "A regisztráció le van tiltva" + +#: lib/claper_web/live/event_live/manage.html.heex:261 +#, elixir-autogen, elixir-format +msgid "Add a Youtube video or any web content." +msgstr "Adjon hozzá egy Youtube videót vagy más internetes tartalmat." + +#: lib/claper_web/templates/user_reset_password/edit.html.heex:51 +#, elixir-autogen, elixir-format +msgid "Confirm new password" +msgstr "Új jelszó megerősítése" + +#: lib/claper_web/templates/user_session/new.html.heex:79 +#, elixir-autogen, elixir-format +msgid "Forgot your password?" +msgstr "Elfelejtette a jelszavát?" + +#: lib/claper_web/controllers/user_reset_password_controller.ex:26 +#, elixir-autogen, elixir-format +msgid "If your email is in our system, you'll receive instructions to reset your password shortly." +msgstr "Amennyiben az e-mail címe regisztrálva van rendszerünkben, hamarosan küldünk egy e-mailt a jelszó visszaállításához." + +#: lib/claper_web/templates/user_reset_password/edit.html.heex:42 +#, elixir-autogen, elixir-format +msgid "Password confirmation" +msgstr "Jelszó megerősítése" + +#: lib/claper_web/controllers/user_reset_password_controller.ex:44 +#, elixir-autogen, elixir-format +msgid "Password updated successfully." +msgstr "A jelszó sikeresen megváltoztatva." + +#: lib/claper_web/controllers/user_reset_password_controller.ex:59 +#, elixir-autogen, elixir-format +msgid "Reset password link is invalid or it has expired." +msgstr "A jelszó-visszaállítási link helytelen vagy lejárt." + +#: lib/claper_web/templates/user_reset_password/edit.html.heex:12 +#: lib/claper_web/templates/user_reset_password/new.html.heex:12 +#, elixir-autogen, elixir-format +msgid "Reset your password" +msgstr "Jelszó visszaállítása" + +#: lib/claper_web/templates/user_reset_password/new.html.heex:36 +#, elixir-autogen, elixir-format +msgid "Send link to reset password" +msgstr "Jelszó-visszaállítási link küldése" + +#: lib/claper_web/live/event_live/embed_component.ex:55 +#, elixir-autogen, elixir-format +msgid "Current web content" +msgstr "Jelenlegi internetes tartalom" + +#: lib/claper_web/live/event_live/manage.html.heex:347 +#, elixir-autogen, elixir-format +msgid "Edit web content" +msgstr "Internetes tartalom szerkesztése" + +#: lib/claper_web/live/event_live/manage.html.heex:346 +#, elixir-autogen, elixir-format +msgid "New web content" +msgstr "Új internetes tartalom" + +#: lib/claper_web/live/event_live/embed_component.ex:32 +#, elixir-autogen, elixir-format +msgid "See current web content" +msgstr "Jelenlegi internetes tartalom megtekintése" + +#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#, elixir-autogen, elixir-format +msgid "This will delete the web content, are you sure?" +msgstr "Az internetes tartalom törlődni fog. Folytatja?" + +#: lib/claper_web/live/embed_live/form_component.html.heex:14 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:14 +#, elixir-autogen, elixir-format +msgid "Title" +msgstr "Cím" + +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 +#, elixir-autogen, elixir-format +msgid "Web content" +msgstr "Internetes tartalom" + +#: lib/claper_web/live/event_live/manageable_post_component.ex:38 +#: lib/claper_web/live/event_live/manageable_post_component.ex:67 +#, elixir-autogen, elixir-format +msgid "Pin" +msgstr "Kitűzés" + +#: lib/claper_web/live/event_live/post_component.ex:59 +#: lib/claper_web/live/event_live/post_component.ex:175 +#, elixir-autogen, elixir-format +msgid "Pinned" +msgstr "Kitűzve" + +#: lib/claper_web/live/event_live/manage.html.heex:1175 +#, elixir-autogen, elixir-format +msgid "Pinned messages" +msgstr "Kitűzött üzenetek" + +#: lib/claper_web/live/event_live/manage.html.heex:1336 +#, elixir-autogen, elixir-format +msgid "Pinned messages will appear here." +msgstr "A kitűzött üzenetek itt fognak megjelenni." + +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 +#, elixir-autogen, elixir-format +msgid "Show only pinned messages" +msgstr "Csak a kitűzött üzenetek mutatása" + +#: lib/claper_web/live/event_live/manageable_post_component.ex:36 +#: lib/claper_web/live/event_live/manageable_post_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Unpin" +msgstr "Kitűzés megszüntetése" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:35 +#, elixir-autogen, elixir-format +msgid "Login or create account" +msgstr "Bejelentkezés vagy regisztráció" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:22 +#, elixir-autogen, elixir-format +msgid "Someone invited you to manage the event: %{name}" +msgstr "%{name} meghívott az esemény kezelésére." + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:25 +#, elixir-autogen, elixir-format +msgid "To accept the invitation, please login or create an account with this email: %{email}" +msgstr "A meghívás elfogadásához jelentkezzen be, vagy hozzon létre egy fiókot a %{email} e-mail címmel" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:17 +#, elixir-autogen, elixir-format +msgid "You have been invited" +msgstr "Ön meghívást kapott" + +#: lib/claper_web/notifiers/leader_notifier.ex:12 +#, elixir-autogen, elixir-format +msgid "You have been invited to manage an event" +msgstr "Meghívást kapott egy esemény kezelésére" + +#: lib/claper_web/live/event_live/form_component.ex:114 +#, elixir-autogen, elixir-format, fuzzy +msgid "Saved" +msgstr "Elmentve" + +#: lib/claper_web/live/user_settings_live/show.html.heex:301 +#, elixir-autogen, elixir-format +msgid "All your events and files will be permanently deleted, are you sure?" +msgstr "Minden a fiókhoz tartozó esemény és fájl törlődni fog. Folytatja?" + +#: lib/claper_web/live/event_live/event_card_component.ex:183 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to terminate this event? This action cannot be undone." +msgstr "Biztosan lezárja az eseményt? A művelet nem vonható vissza." + +#: lib/claper_web/live/event_live/event_card_component.ex:175 +#, elixir-autogen, elixir-format +msgid "Attendees room" +msgstr "Résztvevők szobája" + +#: lib/claper_web/live/user_settings_live/show.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Be careful, these actions are irreversible" +msgstr "Figyelem, a művelet nem visszafordítható." + +#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#, elixir-autogen, elixir-format +msgid "Danger zone" +msgstr "Veszély" + +#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete account" +msgstr "Fiók törlése" + +#: lib/claper_web/live/event_live/manage.html.heex:565 +#, elixir-autogen, elixir-format +msgid "Open presentation" +msgstr "Prezentáció megnyitása" + +#: lib/claper_web/live/event_live/event_card_component.ex:370 +#, elixir-autogen, elixir-format +msgid "View report" +msgstr "Jelentés megtekintése" + +#: lib/claper_web/controllers/user_registration_controller.ex:50 +#, elixir-autogen, elixir-format +msgid "Your account has been deleted." +msgstr "Fiókja törlésre került." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 +#, elixir-autogen, elixir-format, fuzzy +msgid "Access code" +msgstr "Hozzáférési kód" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:84 +#, elixir-autogen, elixir-format +msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." +msgstr "A PPT/PPTX fájlokban található animációk nem támogatottak, ezért kérjük, exportálja a prezentációt PDF formátumba a helyes megjelenítéshez." + +#: lib/claper_web/live/event_live/manage.html.heex:1147 +#, elixir-autogen, elixir-format, fuzzy +msgid "Attendees interactions" +msgstr "Résztvevők interakciói" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:6 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/quiz_component.ex:151 +#: lib/claper_web/live/event_live/quiz_component.ex:198 +#, elixir-autogen, elixir-format +msgid "Back" +msgstr "Vissza" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 +#, elixir-autogen, elixir-format, fuzzy +msgid "Facilitators" +msgstr "Facilitátorok" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:7 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/templates/lti/registration/success.html.heex:26 +#, elixir-autogen, elixir-format, fuzzy +msgid "Finish" +msgstr "Befejezés" + +#: lib/claper_web/live/event_live/manage.html.heex:1149 +#, elixir-autogen, elixir-format +msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." +msgstr "Itt találhatóak majd a résztvevők interakciói. Lehetőség van az üzenetek kitűzésére, illetve az üzenetek és a beérkező űrlapok kezelésére." + +#: lib/claper_web/live/event_live/manage.html.heex:1149 +#, elixir-autogen, elixir-format +msgid "Identify users by their unique avatars." +msgstr "Azonosítsa a felhasználókat egyedi profilképeik alapján." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:5 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:176 +#: lib/claper_web/live/event_live/quiz_component.ex:161 +#: lib/claper_web/live/event_live/quiz_component.ex:209 +#, elixir-autogen, elixir-format, fuzzy +msgid "Next" +msgstr "Következő" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:84 +#, elixir-autogen, elixir-format +msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." +msgstr "Válassza ki a prezentációt. Engedélyezett fájlformátumok: PDF, PPT, PPTX. Figyeljen arra, hogy a fájl mérete ne haladja meg a maximálisan feltölthető fájlméretet." + +#: lib/claper_web/live/event_live/manage.html.heex:545 +#, elixir-autogen, elixir-format, fuzzy +msgid "Time to launch your presentation!" +msgstr "Itt az idő a prezentáció elindítására!" + +#: lib/claper_web/live/event_live/manage.html.heex:1451 +#, elixir-autogen, elixir-format +msgid "Use the associated keyboard shortcuts for quick toggling of these settings." +msgstr "Használja a kapcsolódó billentyűparancsokat a beállítások gyors váltogatásához." + +#: lib/claper_web/live/event_live/manage.html.heex:1451 +#, elixir-autogen, elixir-format +msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." +msgstr "Lehetősége van a beállításokat a prezentációs képernyőn és a résztvevői szobában egyenként állítani." + +#: lib/claper_web/live/event_live/index.html.heex:149 +#, elixir-autogen, elixir-format +msgid "Your first steps with Claper" +msgstr "Első lépések a Claper-rel" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 +#, elixir-autogen, elixir-format, fuzzy +msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." +msgstr "Az eseményt a kezdési dátum előtt megnyitó résztvevők egy várószobába kerülnek átirányításra." + +#: lib/claper_web/live/event_live/index.html.heex:167 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create event" +msgstr "Esemény létrehozása" + +#: lib/claper_web/live/event_live/index.html.heex:225 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create your first event" +msgstr "Hozza létre első eseményét" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 +#, elixir-autogen, elixir-format +msgid "Event start date" +msgstr "Kezdési dátum" + +#: lib/claper_web/live/event_live/index.html.heex:119 +#, elixir-autogen, elixir-format +msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." +msgstr "Amennyiben nincs elég ideje, és prezentáció nélküli interakciókat szeretne készíteni, hozzon létre egy új eseményt itt." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 +#, elixir-autogen, elixir-format, fuzzy +msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." +msgstr "Ha segítségre van szüksége az esemény kezelésében, adjon hozzáférést más felhasználóknak. Adja meg a meghívni kívánt személyek e-mail címeit. A megadott címmel való regisztráció után automatikusan kezelni tudják az eseményt." + +#: lib/claper_web/live/event_live/index.html.heex:124 +#, elixir-autogen, elixir-format +msgid "In a hurry ?" +msgstr "Kevés az ideje?" + +#: lib/claper_web/live/event_live/event_card_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Live" +msgstr "Élő" + +#: lib/claper_web/live/event_live/index.html.heex:112 +#, elixir-autogen, elixir-format +msgid "My events" +msgstr "Eseményeim" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 +#, elixir-autogen, elixir-format, fuzzy +msgid "Name of your event" +msgstr "Az esemény neve" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 +#, elixir-autogen, elixir-format, fuzzy +msgid "Note: Facilitators do not have the ability to delete your event." +msgstr "Megjegyzés: A facilitátorok nem tudják törölni az eseményt." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:85 +#, elixir-autogen, elixir-format, fuzzy +msgid "Presentation file (optional)" +msgstr "Prezentáció (opcionális)" + +#: lib/claper_web/live/event_live/index.html.heex:142 +#, elixir-autogen, elixir-format +msgid "Quick event" +msgstr "Gyors esemény" + +#: lib/claper_web/live/event_live/index.ex:102 +#, elixir-autogen, elixir-format +msgid "Quick event created successfully" +msgstr "Gyors esemény sikeresen létrehozva" + +#: lib/claper_web/live/event_live/join.html.heex:104 +#, elixir-autogen, elixir-format, fuzzy +msgid "Return to your last event" +msgstr "Vissza az utolsó eseményre" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select the start date for your event. Future dates are permissible." +msgstr "Válassza ki az esemény kezdési dátumát. Csak jövőbeni dátumok engedélyezettek." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:88 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select your presentation (optional)" +msgstr "Válassza ki a prezentációt (opcionális)" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 +#, elixir-autogen, elixir-format, fuzzy +msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." +msgstr "A résztvevők ezt a kódot fogják használni a csatlakozáshoz. Lehetőség van egyéni kódot is létrehozni." + +#: lib/claper_web/live/event_live/show.ex:193 +#, elixir-autogen, elixir-format +msgid "This event has been terminated" +msgstr "Az esemény befejeződött" + +#: lib/claper_web/live/event_live/index.html.heex:148 +#, elixir-autogen, elixir-format, fuzzy +msgid "Welcome to Claper! You can create a new event here." +msgstr "Üdvözli a Claper! Hozzon létre egy új eseményt." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 +#, elixir-autogen, elixir-format, fuzzy +msgid "When your event will start?" +msgstr "Mikor kezdődik az esemény?" + +#: lib/claper_web/live/event_live/show.html.heex:38 +#, elixir-autogen, elixir-format +msgid "Create your next presentation with" +msgstr "Hozza létre következő prezentációját ezzel:" + +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 +#: lib/claper_web/live/event_live/show.ex:25 +#, elixir-autogen, elixir-format +msgid "Event doesn't exist" +msgstr "Az esemény nem található" + +#: lib/claper_web/live/user_settings_live/show.html.heex:244 +#, elixir-autogen, elixir-format +msgid "Customize your account" +msgstr "Fiók testreszabása" + +#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#, elixir-autogen, elixir-format +msgid "Language" +msgstr "Nyelv" + +#: lib/claper_web/live/user_settings_live/show.html.heex:241 +#, elixir-autogen, elixir-format +msgid "Preferences" +msgstr "Beállítások" + +#: lib/claper_web/live/user_settings_live/show.ex:180 +#, elixir-autogen, elixir-format +msgid "Your preferences have been updated." +msgstr "Beállítások frissítve." + +#: lib/claper_web/live/event_live/manageable_post_component.ex:29 +#, elixir-autogen, elixir-format +msgid "Question" +msgstr "Kérdés" + +#: lib/claper_web/live/event_live/manage.html.heex:1167 +#, elixir-autogen, elixir-format +msgid "Questions" +msgstr "Kérdések" + +#: lib/claper_web/live/event_live/manage.html.heex:1254 +#, elixir-autogen, elixir-format +msgid "Questions will appear here." +msgstr "A kérdések itt fognak megjelenni." + +#: lib/claper_web/live/event_live/manage.html.heex:1296 +#, elixir-autogen, elixir-format +msgid "Sort by date" +msgstr "Rendezés dátum szerint" + +#: lib/claper_web/live/event_live/manage.html.heex:1275 +#, elixir-autogen, elixir-format +msgid "Sort by popularity" +msgstr "Rendezés népszerűség szerint" + +#: lib/claper_web/live/event_live/event_card_component.ex:152 +#, elixir-autogen, elixir-format +msgid "Event manager" +msgstr "Eseménykezelő" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 +#, elixir-autogen, elixir-format +msgid "Documentation" +msgstr "Dokumentáció" + +#: lib/claper_web/live/user_settings_live/show.html.heex:5 +#: lib/claper_web/templates/layout/_user_menu.html.heex:6 +#, elixir-autogen, elixir-format +msgid "My account" +msgstr "Fiókom" + +#: lib/claper_web/live/user_settings_live/show.html.heex:139 +#, elixir-autogen, elixir-format, fuzzy +msgid "Your personal informations to access your account" +msgstr "Személyes adatok a fiókhoz való hozzáféréshez" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enable reactions" +msgstr "Reakciók engedélyezése" + +#: lib/claper_web/templates/lti/registration/success.html.heex:14 +#, elixir-autogen, elixir-format +msgid "Activate the tool in your LMS" +msgstr "Aktiválja az eszközt az LMS rendszerben" + +#: lib/claper_web/templates/lti/registration/new.html.heex:24 +#, elixir-autogen, elixir-format +msgid "Bring Claper to your LMS" +msgstr "Integrálja a Clapert az LMS rendszerével" + +#: lib/claper_web/templates/lti/registration/success.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Check the permissions to share name and email of users" +msgstr "Ellenőrizze az engedélyeket a felhasználók nevének és e-mail címének megosztásához" + +#: lib/claper_web/templates/lti/registration/success.html.heex:15 +#, elixir-autogen, elixir-format +msgid "Configure it to be opened in a new window" +msgstr "Állítsa be, hogy új ablakban nyíljon meg" + +#: lib/claper_web/templates/lti/launch/error.html.heex:5 +#, elixir-autogen, elixir-format +msgid "Oops" +msgstr "Hiba" + +#: lib/claper_web/templates/lti/registration/new.html.heex:27 +#, elixir-autogen, elixir-format +msgid "Register your platform" +msgstr "Regisztrálja rendszerét" + +#: lib/claper_web/templates/lti/registration/success.html.heex:5 +#, elixir-autogen, elixir-format +msgid "Registration completed" +msgstr "Sikeres regisztráció" + +#: lib/claper_web/templates/lti/launch/error.html.heex:9 +#, elixir-autogen, elixir-format +msgid "You cannot perform this action" +msgstr "Nem végezheti el a kért műveletet" + +#: lib/claper_web/templates/lti/registration/success.html.heex:10 +#, elixir-autogen, elixir-format +msgid "Your next steps" +msgstr "Következő lépések" + +#: lib/claper_web/templates/lti/registration/new.html.heex:40 +#, elixir-autogen, elixir-format +msgid "Add Claper" +msgstr "A Claper hozzáadása" + +#: lib/claper_web/live/event_live/manage.html.heex:123 +#: lib/claper_web/live/event_live/manage.html.heex:538 +#, elixir-autogen, elixir-format +msgid "Close preview" +msgstr "Előnézet bezárása" + +#: lib/claper_web/live/event_live/manage.html.heex:734 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create your first interaction." +msgstr "Készítse el első interakcióját." + +#: lib/claper_web/live/event_live/manage.html.heex:1093 +#, elixir-autogen, elixir-format, fuzzy +msgid "Disable" +msgstr "Letiltás" + +#: lib/claper_web/live/event_live/manage.html.heex:1110 +#, elixir-autogen, elixir-format +msgid "Enable" +msgstr "Engedélyezés" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enable messages to change this option" +msgstr "Engedélyezze az üzeneteket ezen beállítás megváltoztatásához" + +#: lib/claper_web/live/event_live/manage.html.heex:122 +#: lib/claper_web/live/event_live/manage.html.heex:537 +#, elixir-autogen, elixir-format +msgid "Open preview" +msgstr "Előnézet megnyitása" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 +#, elixir-autogen, elixir-format +msgid "Show messages to change this option" +msgstr "Jelenítse meg az üzeneteket a beállítás megváltoztatásához" + +#: lib/claper_web/live/event_live/manage.html.heex:731 +#, elixir-autogen, elixir-format +msgid "This slide does not have any interactions." +msgstr "Nincsenek interakciók ezen a dián." + +#: lib/claper_web/live/user_settings_live/show.html.heex:176 +#, elixir-autogen, elixir-format +msgid "Accounts linked" +msgstr "Hozzákapcsolt fiókok" + +#: lib/claper_web/live/user_settings_live/show.html.heex:208 +#: lib/claper_web/live/user_settings_live/show.html.heex:226 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to unlink this account?" +msgstr "Biztos benne hogy leválasztja ezt a fiókot?" + +#: lib/claper_web/templates/user_session/new.html.heex:74 +#, elixir-autogen, elixir-format +msgid "Login with %{provider}" +msgstr "Bejelentkezés ezzel: %{provider}" + +#: lib/claper_web/live/user_settings_live/show.ex:101 +#: lib/claper_web/live/user_settings_live/show.ex:115 +#, elixir-autogen, elixir-format +msgid "The account has been unlinked." +msgstr "A fiók sikeresen leválasztva." + +#: lib/claper_web/live/event_live/manage.html.heex:707 +#, elixir-autogen, elixir-format +msgid "This section contains all your interactions." +msgstr "Itt látható az összes interakció." + +#: lib/claper_web/live/user_settings_live/show.html.heex:211 +#: lib/claper_web/live/user_settings_live/show.html.heex:229 +#, elixir-autogen, elixir-format, fuzzy +msgid "Unlink" +msgstr "Leválasztás" + +#: lib/claper_web/live/event_live/manage.html.heex:707 +#, elixir-autogen, elixir-format +msgid "You can add interactions to your presentation slides." +msgstr "Interakciókat adhat a diáihoz." + +#: lib/claper_web/live/event_live/manage.html.heex:706 +#, elixir-autogen, elixir-format +msgid "Your interactions" +msgstr "Interakciók" + +#: lib/claper_web/live/user_settings_live/show.html.heex:119 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirm password" +msgstr "Jelszó megerősítése" + +#: lib/claper_web/live/user_settings_live/show.ex:68 +#, elixir-autogen, elixir-format +msgid "Set a new password" +msgstr "Új jelszó" + +#: lib/claper_web/live/user_settings_live/show.ex:71 +#, elixir-autogen, elixir-format +msgid "Set a new password for your account before unlinking it." +msgstr "Adjon meg egy új jelszót a fiók leválasztása előtt." + +#: lib/claper_web/live/user_settings_live/show.ex:204 +#, elixir-autogen, elixir-format +msgid "Your password has been set, you can now unlink your account." +msgstr "Jelszó beállítva, most már leválaszthatja a fiókot." + +#: lib/claper_web/live/embed_live/form_component.html.heex:34 +#, elixir-autogen, elixir-format +msgid "Iframe code" +msgstr "Iframe kód" + +#: lib/claper_web/live/embed_live/form_component.html.heex:35 +#, elixir-autogen, elixir-format +msgid "Link to the content" +msgstr "Link a tartalomhoz" + +#: lib/claper/embeds/embed.ex:65 +#: lib/claper/embeds/embed.ex:74 +#: lib/claper/embeds/embed.ex:83 +#: lib/claper/embeds/embed.ex:92 +#, elixir-autogen, elixir-format +msgid "Please enter a valid %{provider} link" +msgstr "Adjon meg egy érvényes linket a következőhöz: %{provider}" + +#: lib/claper/embeds/embed.ex:62 +#: lib/claper/embeds/embed.ex:71 +#: lib/claper/embeds/embed.ex:80 +#: lib/claper/embeds/embed.ex:89 +#, elixir-autogen, elixir-format +msgid "Please enter a valid link starting with http:// or https://" +msgstr "Adjon meg egy http:// vagy https:// előtaggal kezdődő érvényes linket" + +#: lib/claper/embeds/embed.ex:98 +#, elixir-autogen, elixir-format +msgid "Please enter valid HTML content with an iframe tag" +msgstr "Adjon meg érvényes HTML tartalmat iframe taggel" + +#: lib/claper_web/live/embed_live/form_component.html.heex:23 +#, elixir-autogen, elixir-format +msgid "Provider" +msgstr "Szolgáltató" + +#: lib/claper_web/live/poll_live/form_component.html.heex:85 +#, elixir-autogen, elixir-format +msgid "Attendees can see the results on their device" +msgstr "A résztvevők az eszközükön megtekinthetik az eredményeket" + +#: lib/claper_web/live/embed_live/form_component.html.heex:50 +#, elixir-autogen, elixir-format, fuzzy +msgid "Attendees can view the web content on their device" +msgstr "A résztvevük az eszközükön megtekinthetik a webes tartalmat" + +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 +#, elixir-autogen, elixir-format +msgid "Options" +msgstr "Beállítások" + +#: lib/claper_web/live/event_live/event_card_component.ex:268 +#: lib/claper_web/live/event_live/event_card_component.ex:418 +#, elixir-autogen, elixir-format +msgid "Duplicate" +msgstr "Másolat" + +#: lib/claper_web/templates/error/csrf_error.html.heex:8 +#, elixir-autogen, elixir-format +msgid "A required security token was not found or was invalid." +msgstr "A szükséges biztonsági token nem található vagy érvénytelen." + +#: lib/claper_web/templates/error/csrf_error.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Back to Login" +msgstr "Vissza a bejelentkezéshez" + +#: lib/claper_web/templates/error/csrf_error.html.heex:5 +#, elixir-autogen, elixir-format +msgid "CSRF Verification Failed" +msgstr "CSRF ellenőrzés sikertelen" + +#: lib/claper_web/templates/error/csrf_error.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Clear cookies (at least for Claper domain)" +msgstr "Törölje a sütiket (legalább a Claper domainre vonatkozókat)" + +#: lib/claper_web/templates/error/csrf_error.html.heex:20 +#, elixir-autogen, elixir-format +msgid "Ensure the URL does not contain an extra \"/\" anywhere" +msgstr "Győződjön meg róla, hogy a megadott URL cím nem tartalmaz felesleges \"/\" karaktereket" + +#: lib/claper_web/templates/error/csrf_error.html.heex:23 +#, elixir-autogen, elixir-format +msgid "If the problem persists, please contact support." +msgstr "Amennyiben a probléma továbbra is fennáll, vegye fel a kapcsolatot az üzemeltetőkkel." + +#: lib/claper_web/templates/error/csrf_error.html.heex:14 +#, elixir-autogen, elixir-format +msgid "If you're continually seeing this issue, try the following:" +msgstr "Amennyiben ez a probléma gyakran előfordul, próbálja meg a következőt:" + +#: lib/claper_web/templates/error/csrf_error.html.heex:18 +#, elixir-autogen, elixir-format +msgid "Reload the page you're trying to access (don't re-submit data)" +msgstr "Töltse újra az elérni kívánt oldalt, de ne küldje újra az adatokat." + +#: lib/claper_web/templates/error/csrf_error.html.heex:19 +#, elixir-autogen, elixir-format +msgid "Try logging in again" +msgstr "Jelentkezzen be újra" + +#: lib/claper_web/live/event_live/event_card_component.ex:201 +#, elixir-autogen, elixir-format +msgid "End" +msgstr "Befejezés" + +#: lib/claper_web/live/event_live/event_card_component.ex:212 +#: lib/claper_web/live/event_live/event_card_component.ex:292 +#: lib/claper_web/live/event_live/event_card_component.ex:381 +#, elixir-autogen, elixir-format +msgid "More options" +msgstr "További lehetőségek" + +#: lib/claper_web/live/event_live/manage.ex:818 +#, elixir-autogen, elixir-format +msgid "No" +msgstr "Nem" + +#: lib/claper_web/live/event_live/manage.ex:818 +#, elixir-autogen, elixir-format +msgid "Yes" +msgstr "Igen" + +#: lib/claper_web/templates/user_notifier/confirm.html.heex:29 +#, elixir-autogen, elixir-format +msgid "CONFIRM ACCOUNT" +msgstr "FIÓK MEGERŐSÍTÉSE" + +#: lib/claper_web/templates/user_notifier/confirm.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Confirm account" +msgstr "Fiók megerősítése" + +#: lib/claper_web/notifiers/user_notifier.ex:45 +#, elixir-autogen, elixir-format +msgid "Confirmation instructions" +msgstr "A megerősítés lépései" + +#: lib/claper_web/templates/user_notifier/reset.html.heex:29 +#, elixir-autogen, elixir-format +msgid "RESET PASSWORD" +msgstr "JELSZÓ VISSZAÁLLÍTÁSA" + +#: lib/claper_web/templates/user_notifier/reset.html.heex:17 +#, elixir-autogen, elixir-format, fuzzy +msgid "Reset password" +msgstr "Jelszó visszaállítása" + +#: lib/claper_web/notifiers/user_notifier.ex:56 +#, elixir-autogen, elixir-format +msgid "Reset password instructions" +msgstr "Jelszó-visszaállítás lépései" + +#: lib/claper_web/templates/user_notifier/confirm.html.heex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "You can confirm your account by visiting the URL below" +msgstr "Erősítse meg fiókját az alábbi linkre kattintva" + +#: lib/claper_web/templates/user_notifier/reset.html.heex:22 +#, elixir-autogen, elixir-format +msgid "You can reset your password by visiting the URL below" +msgstr "A jelszó visszaállításához kattintson az alábbi linkre" + +#: lib/claper_web/templates/user_registration/confirm.html.heex:29 +#, elixir-autogen, elixir-format +msgid "back to the home page" +msgstr "Vissza a főoldalra" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 +#, elixir-autogen, elixir-format, fuzzy +msgid "Add Question" +msgstr "Kérdés hozzáadása" + +#: lib/claper_web/live/event_live/manage.html.heex:293 +#, elixir-autogen, elixir-format +msgid "Add a quiz to test knowledge." +msgstr "Kvíz hozzáadása a tudás felméréséhez" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 +#, elixir-autogen, elixir-format +msgid "Add answer" +msgstr "Válasz hozzáadása" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 +#, elixir-autogen, elixir-format, fuzzy +msgid "Allow anonymous messages" +msgstr "Névtelen üzenetek engedélyezése" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 +#, elixir-autogen, elixir-format +msgid "Answer %{index}" +msgstr "%{index}. válasz" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 +#, elixir-autogen, elixir-format, fuzzy +msgid "Attendees" +msgstr "Résztvevők" + +#: lib/claper_web/live/event_live/manageable_quiz_component.ex:29 +#: lib/claper_web/live/stat_live/index.html.heex:426 +#, elixir-autogen, elixir-format, fuzzy +msgid "Average score" +msgstr "Átlag" + +#: lib/claper_web/live/event_live/quiz_component.ex:60 +#, elixir-autogen, elixir-format +msgid "Current quiz" +msgstr "Jelenlegi kvíz" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 +#, elixir-autogen, elixir-format, fuzzy +msgid "Deny anonymous messages" +msgstr "Névtelen üzenetek tiltása" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 +#, elixir-autogen, elixir-format, fuzzy +msgid "Disable messages" +msgstr "Üzenetek tiltása" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 +#, elixir-autogen, elixir-format, fuzzy +msgid "Disable reactions" +msgstr "Reakciók tiltása" + +#: lib/claper_web/live/event_live/manage.html.heex:368 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit quiz" +msgstr "Kvíz szerkesztése" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 +#, elixir-autogen, elixir-format +msgid "Hide instructions to join" +msgstr "Csatlakozási információk elrejtése" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 +#, elixir-autogen, elixir-format, fuzzy +msgid "Hide messages" +msgstr "Üzenetek elrejtése" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:62 +#: lib/claper_web/live/event_live/manager_settings_component.ex:112 +#, elixir-autogen, elixir-format, fuzzy +msgid "Hide results on presentation" +msgstr "Eredmények eltüntetése a prezentációról" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:36 +#: lib/claper_web/live/event_live/index.html.heex:28 +#: lib/claper_web/live/event_live/manage.html.heex:35 +#, elixir-autogen, elixir-format +msgid "How it works ?" +msgstr "Hogyan működik ?" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "Interaction" +msgstr "Interakció" + +#: lib/claper_web/live/event_live/manage.html.heex:367 +#, elixir-autogen, elixir-format +msgid "New quiz" +msgstr "Új kvíz" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 +#, elixir-autogen, elixir-format, fuzzy +msgid "Presentation" +msgstr "Prezentáció" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:168 +#, elixir-autogen, elixir-format +msgid "Previous" +msgstr "Előző" + +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 +#, elixir-autogen, elixir-format +msgid "Quiz" +msgstr "Kvíz" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#, elixir-autogen, elixir-format +msgid "Remove question" +msgstr "Kérdés eltávolítása" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:144 +#, elixir-autogen, elixir-format +msgid "Review questions" +msgstr "Kérdések áttekintése" + +#: lib/claper_web/live/event_live/quiz_component.ex:41 +#, elixir-autogen, elixir-format, fuzzy +msgid "See current quiz" +msgstr "Jelenlegi kvíz megtekintése" + +#: lib/claper_web/live/event_live/manage.html.heex:387 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select presentation" +msgstr "Prezentáció kiválasztása" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show all messages" +msgstr "Minden üzenet megjelenítése" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show instructions to join" +msgstr "Csatlakozási információk mutatása" + +#: lib/claper_web/live/event_live/quiz_component.ex:121 +#, elixir-autogen, elixir-format +msgid "Show results" +msgstr "Eredmények mutatása" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:65 +#: lib/claper_web/live/event_live/manager_settings_component.ex:115 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show results on presentation" +msgstr "Eredmények megjelenítése a prezentáción" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 +#, elixir-autogen, elixir-format, fuzzy +msgid "This will delete all responses associated and the quiz itself, are you sure?" +msgstr "A kvíz és a hozzátartozó válaszok törlődni fognak. Biztos benne?" + +#: lib/claper_web/live/event_live/quiz_component.ex:124 +#, elixir-autogen, elixir-format +msgid "Waiting for results..." +msgstr "Várakozás az eredményekre..." + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 +#, elixir-autogen, elixir-format +msgid "Your question" +msgstr "Az Ön kérdése" + +#: lib/claper_web/live/event_live/quiz_component.ex:113 +#, elixir-autogen, elixir-format +msgid "Your score" +msgstr "Az ön pontszáma" + +#: lib/claper_web/live/stat_live/index.html.heex:236 +#: lib/claper_web/live/stat_live/index.html.heex:298 +#: lib/claper_web/live/stat_live/index.html.heex:380 +#: lib/claper_web/live/stat_live/index.html.heex:422 +#, elixir-autogen, elixir-format +msgid "Export" +msgstr "Exportálás" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 +#, elixir-autogen, elixir-format +msgid "Export to QTI (XML)" +msgstr "Exportálás QTI (XML) formátumba" + +#: lib/claper_web/live/stat_live/index.html.heex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Forms" +msgstr "Űrlapok" + +#: lib/claper_web/live/stat_live/index.html.heex:170 +#, elixir-autogen, elixir-format, fuzzy +msgid "Interactions" +msgstr "Interakciók" + +#: lib/claper_web/live/stat_live/index.html.heex:338 +#, elixir-autogen, elixir-format +msgid "No form has been created" +msgstr "Nincsenek űrlapok" + +#: lib/claper_web/live/stat_live/index.html.heex:272 +#, elixir-autogen, elixir-format +msgid "No poll has been created" +msgstr "Nincsenek szavazások" + +#: lib/claper_web/live/stat_live/index.html.heex:476 +#, elixir-autogen, elixir-format +msgid "No quiz has been created" +msgstr "Nincsenek kvízek" + +#: lib/claper_web/live/stat_live/index.html.heex:359 +#, elixir-autogen, elixir-format +msgid "No web content has been created" +msgstr "Nincsenek webes tartalmak" + +#: lib/claper_web/live/stat_live/index.html.heex:187 +#, elixir-autogen, elixir-format, fuzzy +msgid "Polls" +msgstr "Szavazások" + +#: lib/claper_web/live/stat_live/index.html.heex:208 +#, elixir-autogen, elixir-format, fuzzy +msgid "Quizzes" +msgstr "Kvízek" + +#: lib/claper_web/live/stat_live/index.ex:62 +#, elixir-autogen, elixir-format +msgid "Report" +msgstr "Jelentés" + +#: lib/claper_web/live/stat_live/index.html.heex:70 +#, elixir-autogen, elixir-format +msgid "Unique attendees" +msgstr "Egyedi résztvevők" + +#: lib/claper_web/live/stat_live/index.html.heex:201 +#, elixir-autogen, elixir-format, fuzzy +msgid "Web Content" +msgstr "Webes Tartalom" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 +#, elixir-autogen, elixir-format +msgid "Active" +msgstr "Aktív" + +#: lib/claper_web/live/event_live/index.html.heex:218 +#, elixir-autogen, elixir-format +msgid "Load more" +msgstr "Több betöltése" + +#: lib/claper_web/live/event_live/index.html.heex:195 +#, elixir-autogen, elixir-format +msgid "Shared with you" +msgstr "Önnel megosztva" + +#: lib/claper_web/templates/lti/registration/new.html.heex:43 +#, elixir-autogen, elixir-format +msgid "You must login to continue" +msgstr "Jelentkezzen be a folytatáshoz" + +#: lib/claper/quizzes/quiz_question.ex:51 +#, elixir-autogen, elixir-format +msgid "must have at least one correct answer" +msgstr "legalább egy helyes válasz szükséges" + +#: lib/claper_web/live/event_live/manage.html.heex:547 +#, elixir-autogen, elixir-format +msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." +msgstr "Kattintson ide a prezentáció ablakának megnyitásához. Nyomja le a F billentyűt a teljes képernyő bekapcsolásához." + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 +#, elixir-autogen, elixir-format, fuzzy +msgid "Allow anonymous submissions" +msgstr "Névtelen beküldés engedélyezése" + +#: lib/claper_web/live/event_live/quiz_component.ex:167 +#, elixir-autogen, elixir-format +msgid "Please sign in to submit your answers" +msgstr "Jelentkezzen be a válaszok beküldéséhez" + +#: lib/claper_web/live/event_live/quiz_component.ex:170 +#, elixir-autogen, elixir-format +msgid "Sign in" +msgstr "Bejelentkezés" + +#: lib/claper_web/live/stat_live/index.html.heex:435 +#, elixir-autogen, elixir-format +msgid "Total submissions" +msgstr "Összes beküldés" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format, fuzzy +msgid "Actions" +msgstr "Beállítások" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Active Events" +msgstr "Aktív" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this event?" +msgstr "Biztos benne hogy leválasztja ezt a fiókot?" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this provider?" +msgstr "Biztos benne hogy leválasztja ezt a fiókot?" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this user?" +msgstr "Biztos benne hogy leválasztja ezt a fiókot?" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format, fuzzy +msgid "Audience Peak" +msgstr "Részvételi csúcs" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format, fuzzy +msgid "Choose file" +msgstr "Fájl megváltoztatása" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format +msgid "Confirmed" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create Event" +msgstr "Esemény létrehozása" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create User" +msgstr "Létrehozás" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created" +msgstr "Létrehozás" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created At" +msgstr "Létrehozás" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Currently running" +msgstr "Jelenlegi kvíz" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete event" +msgstr "Törlés" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete user" +msgstr "Törlés" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit user" +msgstr "Szerkesztés" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enter password" +msgstr "Jelenlegi jelszó" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format, fuzzy +msgid "Events" +msgstr "Esemény" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format, fuzzy +msgid "Form Post" +msgstr "Űrlapok" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format, fuzzy +msgid "Inactive" +msgstr "Aktív" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Provider" +msgstr "Szolgáltató" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Providers" +msgstr "Szolgáltató" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider updated successfully" +msgstr "A jelszó sikeresen megváltoztatva." + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select an option" +msgstr "Válasszon egy opciót" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format, fuzzy +msgid "User updated successfully" +msgstr "A jelszó sikeresen megváltoztatva." + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format, fuzzy +msgid "View provider" +msgstr "Jelentés megtekintése" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format, fuzzy +msgid "attendees" +msgstr "résztvevő" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format +msgid "Back to events" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "Back to providers" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format +msgid "Back to users" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format +msgid "New provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format +msgid "New user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format +msgid "No providers found" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format +msgid "Provider deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Szolgáltató" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirm email change" +msgstr "E-mail megerősítése" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format, fuzzy +msgid "If you didn't request an email change, please ignore this." +msgstr "Amennyiben nem regisztrált fiókot nálunk, kérjük, hagyja ezt az üzenetet figyelmen kívül." + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "You can confirm your email change by visiting the URL below" +msgstr "Az e-mail megváltoztatásához kattintson az alábbi linkre:" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "Résztvevők számának elrejtése" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show attendee count" +msgstr "Résztvevők számának megjelenítése" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "Kötelező" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "(opcionális)" diff --git a/priv/gettext/hu/LC_MESSAGES/errors.po b/priv/gettext/hu/LC_MESSAGES/errors.po new file mode 100644 index 0000000..04f7625 --- /dev/null +++ b/priv/gettext/hu/LC_MESSAGES/errors.po @@ -0,0 +1,97 @@ +## `msgid`s in this file come from POT (.pot) files. +## +## Do not add, change, or remove `msgid`s manually here as +## they're tied to the ones in the corresponding POT file +## (with the same domain). +## +## Use `mix gettext.extract --merge` or `mix gettext.merge` +## to merge POT files into PO files. +msgid "" +msgstr "" +"Language: en\n" + +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "nem lehet üres" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "már foglalt" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "érvénytelen" + +## From Ecto.Changeset.validate_acceptance/3 +msgid "must be accepted" +msgstr "el kell fogadni" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "formátuma érvénytelen" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "érvénytelen bejegyzést tartalmaz" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "foglalt" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "nem egyezik meg a megerősítéssel" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "még mindig ehhez a bejegyzéshez tartozik" + +msgid "are still associated with this entry" +msgstr "még mindig ehhez a bejegyzéshez tartoznak" + +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "%{count} karakternek kell lennie" +msgstr[1] "%{count} karakternek kell lennie" + +## From Ecto.Changeset.validate_length/3 +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "%{count} elemnek kell lennie" +msgstr[1] "%{count} elemnek kell lennie" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "Legalább %{count} karakternek kell lennie" +msgstr[1] "Legalább %{count} karakternek kell lennie" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "legalább %{count} elem lehet" +msgstr[1] "legalább %{count} elem lehet" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "legfeljebb %{count} karakter lehet" +msgstr[1] "legfeljebb %{count} karakter lehet" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "legfeljebb %{count} elem lehet" +msgstr[1] "legfeljebb %{count} elem lehet" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "kisebbnek kell lennie ennél: %{number}" + +msgid "must be greater than %{number}" +msgstr "nagyobbnak kell lennie ennél: %{number}" + +msgid "must be less than or equal to %{number}" +msgstr "kisebbnek vagy egyenlőnek kell lennie ezzel: %{number}" + +msgid "must be greater than or equal to %{number}" +msgstr "nagyobbnak vagy egyenlőnek kell lennie ezzel: %{number}" + +msgid "must be equal to %{number}" +msgstr "egyenlőnek kell lennie ezzel: %{number}" diff --git a/priv/gettext/it/LC_MESSAGES/default.po b/priv/gettext/it/LC_MESSAGES/default.po index c19b49d..da913c4 100644 --- a/priv/gettext/it/LC_MESSAGES/default.po +++ b/priv/gettext/it/LC_MESSAGES/default.po @@ -9,15 +9,18 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" -#: lib/claper_web/live/event_live/manage.html.heex:1462 -#: lib/claper_web/live/event_live/manage.html.heex:1468 +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 #: lib/claper_web/live/user_settings_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Settings" msgstr "Impostazioni" -#: lib/claper_web/live/event_live/manage.ex:808 -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:34 #: lib/claper_web/templates/user_registration/new.html.heex:29 #: lib/claper_web/templates/user_reset_password/new.html.heex:28 @@ -44,7 +47,10 @@ msgstr "Ops, controlla che tutti i campi siano compilati correttamente." msgid "Change" msgstr "Cambia" -#: lib/claper_web/live/event_live/event_form_component.html.heex:287 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 #, elixir-autogen, elixir-format msgid "Code" msgstr "Codice" @@ -55,7 +61,7 @@ msgstr "Codice" msgid "Email address" msgstr "Indirizzo email" -#: lib/claper_web/templates/layout/_user_menu.html.heex:16 +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 #, elixir-autogen, elixir-format msgid "Logout" msgstr "Esci" @@ -98,15 +104,18 @@ msgstr "Reagisci per primo !" #: lib/claper_web/live/event_live/event_card_component.ex:111 #: lib/claper_web/live/event_live/join.ex:41 #: lib/claper_web/live/event_live/join.html.heex:94 -#: lib/claper_web/live/event_live/manage.html.heex:493 +#: lib/claper_web/live/event_live/manage.html.heex:492 #: lib/claper_web/live/event_live/show.html.heex:286 #, elixir-autogen, elixir-format msgid "Join" msgstr "Partecipa" -#: lib/claper_web/live/event_live/index.ex:212 +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 #: lib/claper_web/live/event_live/join.html.heex:31 #: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 #, elixir-autogen, elixir-format msgid "Dashboard" msgstr "Cruscotto" @@ -123,7 +132,7 @@ msgid "seconds" msgstr "secondi" #: lib/claper_web/live/event_live/event_card_component.ex:60 -#: lib/claper_web/live/event_live/index.html.heex:186 +#: lib/claper_web/live/event_live/index.html.heex:187 #, elixir-autogen, elixir-format msgid "Finished" msgstr "Terminato" @@ -176,47 +185,50 @@ msgstr "Ritorna alla home" msgid "Created successfully" msgstr "Creato correttamente" +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 #: lib/claper_web/live/event_live/event_card_component.ex:250 #: lib/claper_web/live/event_live/event_card_component.ex:330 #: lib/claper_web/live/event_live/form_component.ex:97 -#: lib/claper_web/live/event_live/index.ex:193 +#: lib/claper_web/live/event_live/index.ex:204 #, elixir-autogen, elixir-format msgid "Edit" msgstr "Modifica" -#: lib/claper_web/live/embed_live/form_component.html.heex:69 +#: lib/claper_web/live/embed_live/form_component.html.heex:63 #: lib/claper_web/live/event_live/event_form_component.html.heex:55 #: lib/claper_web/live/event_live/event_form_component.html.heex:62 -#: lib/claper_web/live/event_live/index.ex:202 -#: lib/claper_web/live/event_live/index.html.heex:93 -#: lib/claper_web/live/form_live/form_component.html.heex:98 -#: lib/claper_web/live/poll_live/form_component.html.heex:106 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 #, elixir-autogen, elixir-format msgid "Create" msgstr "Crea" -#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#: lib/claper_web/live/embed_live/form_component.html.heex:68 #: lib/claper_web/live/event_live/event_card_component.ex:444 #: lib/claper_web/live/event_live/event_form_component.html.heex:67 -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1397 #: lib/claper_web/live/event_live/manageable_post_component.ex:92 #: lib/claper_web/live/event_live/post_component.ex:70 #: lib/claper_web/live/event_live/post_component.ex:142 -#: lib/claper_web/live/form_live/form_component.html.heex:103 -#: lib/claper_web/live/poll_live/form_component.html.heex:111 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:129 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:199 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 #, elixir-autogen, elixir-format msgid "Delete" msgstr "Elimina" -#: lib/claper_web/live/embed_live/form_component.html.heex:70 +#: lib/claper_web/live/embed_live/form_component.html.heex:64 #: lib/claper_web/live/event_live/event_form_component.html.heex:54 #: lib/claper_web/live/event_live/event_form_component.html.heex:61 -#: lib/claper_web/live/form_live/form_component.html.heex:99 -#: lib/claper_web/live/poll_live/form_component.html.heex:107 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:194 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 #: lib/claper_web/live/user_settings_live/show.html.heex:38 #: lib/claper_web/live/user_settings_live/show.html.heex:80 #: lib/claper_web/live/user_settings_live/show.html.heex:123 @@ -260,12 +272,6 @@ msgstr "Aggiorna le istruzioni via email" msgid "CONFIRM EMAIL" msgstr "CONFERMA EMAIL" -#: lib/claper_web/templates/user_notifier/change.html.heex:17 -#, elixir-autogen, elixir-format -msgid "Confirm email" -msgstr "Conferma email" - -#: lib/claper_web/templates/user_notifier/change.html.heex:32 #: lib/claper_web/templates/user_notifier/confirm.html.heex:32 #: lib/claper_web/templates/user_notifier/magic.html.heex:32 #: lib/claper_web/templates/user_notifier/reset.html.heex:32 @@ -296,9 +302,9 @@ msgid "Presentation uploaded" msgstr "Presentazione caricata" #: lib/claper_web/live/event_live/event_form_component.html.heex:163 -#: lib/claper_web/live/event_live/event_form_component.html.heex:241 -#: lib/claper_web/live/event_live/event_form_component.html.heex:369 -#: lib/claper_web/live/event_live/event_form_component.html.heex:393 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 #, elixir-autogen, elixir-format msgid "Remove" msgstr "Rimuovi" @@ -333,17 +339,17 @@ msgstr "Il tuo file è troppo grande" msgid "Change file" msgstr "Cambia file" -#: lib/claper_web/live/event_live/event_form_component.html.heex:228 +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 #, elixir-autogen, elixir-format msgid "Presentation replaced" msgstr "Presentazione sostituita" -#: lib/claper_web/live/event_live/manage.html.heex:306 +#: lib/claper_web/live/event_live/manage.html.heex:305 #, elixir-autogen, elixir-format msgid "Edit poll" msgstr "Modifica sondaggio" -#: lib/claper_web/live/event_live/manage.html.heex:305 +#: lib/claper_web/live/event_live/manage.html.heex:304 #, elixir-autogen, elixir-format msgid "New poll" msgstr "Nuovo sondaggio" @@ -358,18 +364,18 @@ msgstr "Titolo del tuo sondaggio" msgid "Upload failed" msgstr "Caricamento non riuscito" -#: lib/claper_web/live/event_live/manage.html.heex:198 +#: lib/claper_web/live/event_live/manage.html.heex:197 #, elixir-autogen, elixir-format msgid "Add poll to know opinion of your public." msgstr "Aggiungi un sondaggio per conoscere l'opinione del tuo pubblico." -#: lib/claper_web/live/event_live/manage.html.heex:195 -#: lib/claper_web/live/event_live/manage.html.heex:791 +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Sondaggio" -#: lib/claper_web/live/poll_live/form_component.html.heex:30 +#: lib/claper_web/live/poll_live/form_component.html.heex:26 #, elixir-format, ex-autogen, elixir-autogen msgid "Choice %{count}" msgid_plural "Choice %{count}" @@ -392,18 +398,18 @@ msgstr "Vedi sondaggio attuale" msgid "Vote" msgstr "Vota" -#: lib/claper_web/live/event_live/event_form_component.html.heex:358 -#: lib/claper_web/live/event_live/event_form_component.html.heex:376 +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 #, elixir-autogen, elixir-format msgid "User email address" msgstr "Indirizzo email utente" -#: lib/claper_web/live/event_live/event_form_component.html.heex:207 +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 #, elixir-autogen, elixir-format msgid "Changing your file will remove all interaction elements like polls associated." msgstr "La modifica del file rimuoverà tutti gli elementi di interazione associati, come i sondaggi." -#: lib/claper_web/live/event_live/manage.html.heex:1226 +#: lib/claper_web/live/event_live/manage.html.heex:1213 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "I messaggi delle persone partecipanti appariranno qui." @@ -413,29 +419,24 @@ msgstr "I messaggi delle persone partecipanti appariranno qui." msgid "Processing your file..." msgstr "Elaborazione del file in corso..." -#: lib/claper_web/live/poll_live/form_component.html.heex:118 +#: lib/claper_web/live/poll_live/form_component.html.heex:114 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the poll itself, are you sure?" msgstr "Verranno eliminate tutte le risposte associate e il sondaggio stesso. Sei sicuro?" -#: lib/claper_web/live/event_live/manage.html.heex:507 -#, elixir-autogen, elixir-format -msgid "Press F in the presentation window to enable fullscreen" -msgstr "Premi F nella finestra di presentazione per abilitare la modalità a schermo intero" - #: lib/claper_web/live/event_live/show.html.heex:345 #, elixir-autogen, elixir-format msgid "Ask, comment..." msgstr "Chiedi, commenta..." -#: lib/claper_web/live/event_live/manage.html.heex:1172 +#: lib/claper_web/live/event_live/manage.html.heex:1159 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format msgid "Messages" msgstr "Messaggi" -#: lib/claper_web/live/event_live/event_form_component.html.heex:341 +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 #, elixir-autogen, elixir-format msgid "Add facilitator" msgstr "Aggiungi aiutante" @@ -450,7 +451,7 @@ msgstr "Ops, la pagina non esiste." msgid "The site is under maintenance, we'll be back very soon!" msgstr "Il sito è in manutenzione, torneremo presto!" -#: lib/claper_web/live/event_live/event_form_component.html.heex:320 +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 #, elixir-autogen, elixir-format msgid "Facilitators can present and manage interactions" msgstr "Gli aiutanti possono presentare e gestire le interazioni" @@ -464,13 +465,8 @@ msgstr "Gli aiutanti possono presentare e gestire le interazioni" msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" msgstr "Se riscontri problemi con il pulsante sopra, copia e incolla l'URL sottostante nel tuo browser web" -#: lib/claper_web/templates/user_notifier/change.html.heex:22 -#, elixir-autogen, elixir-format -msgid "You can change your email by visiting the URL below" -msgstr "Puoi modificare la tua email visitando l'URL sottostante" - -#: lib/claper_web/live/event_live/manage.html.heex:764 -#: lib/claper_web/live/event_live/manage.html.heex:1137 +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "Aggiungi interazione" @@ -628,6 +624,7 @@ msgstr "Oppure usa il codice:" msgid "Create account" msgstr "Crea utenza" +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:161 #: lib/claper_web/templates/user_registration/new.html.heex:37 #: lib/claper_web/templates/user_reset_password/edit.html.heex:34 @@ -663,14 +660,14 @@ msgstr "Aggiorna la tua password" msgid "Your password has been updated." msgstr "La tua password è stata aggiornata." -#: lib/claper_web/live/form_live/form_component.html.heex:30 +#: lib/claper_web/live/form_live/form_component.html.heex:26 #, elixir-autogen, elixir-format msgid "Field %{count}" msgid_plural "Field %{count}" msgstr[0] "Campo %{count}" msgstr[1] "Campi %{count}" -#: lib/claper_web/live/event_live/manage.html.heex:231 +#: lib/claper_web/live/event_live/manage.html.heex:230 #, elixir-autogen, elixir-format msgid "Add form to collect data from your public." msgstr "Aggiungi un modulo per raccogliere dati dal tuo pubblico." @@ -680,34 +677,41 @@ msgstr "Aggiungi un modulo per raccogliere dati dal tuo pubblico." msgid "Current form" msgstr "Modulo corrente" -#: lib/claper_web/live/event_live/manage.html.heex:327 +#: lib/claper_web/live/event_live/manage.html.heex:326 #, elixir-autogen, elixir-format msgid "Edit form" msgstr "Modifica modulo" -#: lib/claper_web/live/event_live/manage.html.heex:228 -#: lib/claper_web/live/event_live/manage.html.heex:835 -#: lib/claper_web/live/event_live/manage.html.heex:1422 +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 #, elixir-autogen, elixir-format msgid "Form" msgstr "Modulo" -#: lib/claper_web/live/event_live/manage.html.heex:1196 +#: lib/claper_web/live/event_live/manage.html.heex:1183 #, elixir-autogen, elixir-format msgid "Form submissions" msgstr "Invio di moduli" -#: lib/claper_web/live/event_live/manage.html.heex:1395 +#: lib/claper_web/live/event_live/manage.html.heex:1382 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "I moduli compilati dai partecipanti appariranno qui." -#: lib/claper_web/live/event_live/manage.ex:807 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nome" -#: lib/claper_web/live/event_live/manage.html.heex:326 +#: lib/claper_web/live/event_live/manage.html.heex:325 #, elixir-autogen, elixir-format msgid "New form" msgstr "Nuovo modulo" @@ -728,17 +732,17 @@ msgstr "Vedi il modulo corrente" msgid "Submit" msgstr "Invia" -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #, elixir-autogen, elixir-format msgid "Text" msgstr "Testo" -#: lib/claper_web/live/event_live/manage.html.heex:1415 +#: lib/claper_web/live/event_live/manage.html.heex:1402 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Questa operazione non può essere annullata, confermi ?" -#: lib/claper_web/live/form_live/form_component.html.heex:110 +#: lib/claper_web/live/form_live/form_component.html.heex:105 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the form itself, are you sure?" msgstr "Verranno eliminate tutte le risposte associate e il modulo stesso. Sei sicuro?" @@ -748,7 +752,7 @@ msgstr "Verranno eliminate tutte le risposte associate e il modulo stesso. Sei s msgid "Title of your form" msgstr "Titolo del tuo modulo" -#: lib/claper_web/live/form_live/form_component.html.heex:40 +#: lib/claper_web/live/form_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Type" msgstr "Tipo" @@ -763,7 +767,7 @@ msgstr "Seleziona un'opzione" msgid "Select one or multiple options" msgstr "Seleziona una o più opzioni" -#: lib/claper_web/live/poll_live/form_component.html.heex:96 +#: lib/claper_web/live/poll_live/form_component.html.heex:92 #, elixir-autogen, elixir-format msgid "Multiple answers" msgstr "Risposte multiple" @@ -773,12 +777,12 @@ msgstr "Risposte multiple" msgid "PDF, PPT, PPTX up to %{size} MB" msgstr "PDF, PPT, PPTX fino a %{size} MB" -#: lib/claper_web/live/event_live/manager_settings_component.ex:426 +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 #, elixir-autogen, elixir-format msgid "Enable messages" msgstr "Abilita messaggi" -#: lib/claper_web/live/event_live/manager_settings_component.ex:304 +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 #, elixir-autogen, elixir-format msgid "Show messages" msgstr "Mostra messaggi" @@ -827,7 +831,7 @@ msgstr "disabilitato" msgid "Account creation is disabled" msgstr "La creazione dell'utenza è disabilitata" -#: lib/claper_web/live/event_live/manage.html.heex:262 +#: lib/claper_web/live/event_live/manage.html.heex:261 #, elixir-autogen, elixir-format msgid "Add a Youtube video or any web content." msgstr "Aggiungi un video di Youtube o qualsiasi contenuto web." @@ -878,12 +882,12 @@ msgstr "Invia il link per reimpostare la password" msgid "Current web content" msgstr "Contenuto web attuale" -#: lib/claper_web/live/event_live/manage.html.heex:348 +#: lib/claper_web/live/event_live/manage.html.heex:347 #, elixir-autogen, elixir-format msgid "Edit web content" msgstr "Modifica contenuto web" -#: lib/claper_web/live/event_live/manage.html.heex:347 +#: lib/claper_web/live/event_live/manage.html.heex:346 #, elixir-autogen, elixir-format msgid "New web content" msgstr "Nuovo contenuto web" @@ -893,7 +897,7 @@ msgstr "Nuovo contenuto web" msgid "See current web content" msgstr "Vedi contenuto web corrente" -#: lib/claper_web/live/embed_live/form_component.html.heex:80 +#: lib/claper_web/live/embed_live/form_component.html.heex:74 #, elixir-autogen, elixir-format msgid "This will delete the web content, are you sure?" msgstr "Questo eliminerà il contenuto web, sei sicuro?" @@ -904,8 +908,8 @@ msgstr "Questo eliminerà il contenuto web, sei sicuro?" msgid "Title" msgstr "Titolo" -#: lib/claper_web/live/event_live/manage.html.heex:260 -#: lib/claper_web/live/event_live/manage.html.heex:879 +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Contenuto web" @@ -922,17 +926,17 @@ msgstr "Appunta" msgid "Pinned" msgstr "Appuntato" -#: lib/claper_web/live/event_live/manage.html.heex:1188 +#: lib/claper_web/live/event_live/manage.html.heex:1175 #, elixir-autogen, elixir-format msgid "Pinned messages" msgstr "Messaggi appuntati" -#: lib/claper_web/live/event_live/manage.html.heex:1349 +#: lib/claper_web/live/event_live/manage.html.heex:1336 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "I messaggi appuntati verranno visualizzati qui." -#: lib/claper_web/live/event_live/manager_settings_component.ex:359 +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 #, elixir-autogen, elixir-format msgid "Show only pinned messages" msgstr "Mostra solo i messaggi appuntati" @@ -973,7 +977,7 @@ msgstr "Sei stato invitato a gestire un evento" msgid "Saved" msgstr "Salvato" -#: lib/claper_web/live/user_settings_live/show.html.heex:286 +#: lib/claper_web/live/user_settings_live/show.html.heex:301 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "Tutti i tuoi eventi e file verranno eliminati definitivamente, sei sicuro?" @@ -988,22 +992,22 @@ msgstr "Vuoi davvero terminare questo evento? Questa azione non può essere annu msgid "Attendees room" msgstr "Sala partecipanti" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:291 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "Attenzione, queste azioni sono irreversibili" -#: lib/claper_web/live/user_settings_live/show.html.heex:275 +#: lib/claper_web/live/user_settings_live/show.html.heex:288 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Zona pericolosa" -#: lib/claper_web/live/user_settings_live/show.html.heex:291 +#: lib/claper_web/live/user_settings_live/show.html.heex:297 #, elixir-autogen, elixir-format msgid "Delete account" msgstr "Elimina utenza" -#: lib/claper_web/live/event_live/manage.html.heex:571 +#: lib/claper_web/live/event_live/manage.html.heex:565 #, elixir-autogen, elixir-format msgid "Open presentation" msgstr "Apri presentazione" @@ -1013,12 +1017,12 @@ msgstr "Apri presentazione" msgid "View report" msgstr "Vedi report" -#: lib/claper_web/live/user_settings_live/show.ex:219 +#: lib/claper_web/controllers/user_registration_controller.ex:50 #, elixir-autogen, elixir-format msgid "Your account has been deleted." msgstr "La tua utenza è stata eliminata." -#: lib/claper_web/live/event_live/event_form_component.html.heex:279 +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 #, elixir-autogen, elixir-format msgid "Access code" msgstr "Codice di accesso" @@ -1028,51 +1032,46 @@ msgstr "Codice di accesso" msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." msgstr "Le animazioni nei file PPT/PPTX non sono supportate, motivo per cui consigliamo di esportare la presentazione in PDF per garantirne la corretta visualizzazione." -#: lib/claper_web/live/event_live/manage.html.heex:1160 +#: lib/claper_web/live/event_live/manage.html.heex:1147 #, elixir-autogen, elixir-format msgid "Attendees interactions" msgstr "Interazioni con i partecipanti" #: lib/claper_web/live/event_live/event_form_component.html.heex:6 -#: lib/claper_web/live/event_live/index.html.heex:106 -#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 #: lib/claper_web/live/event_live/quiz_component.ex:151 #: lib/claper_web/live/event_live/quiz_component.ex:198 #, elixir-autogen, elixir-format msgid "Back" msgstr "Indietro" -#: lib/claper_web/live/event_live/manage.html.heex:553 -#, elixir-autogen, elixir-format -msgid "Click here to open the presentation window." -msgstr "Fare clic qui per aprire la finestra della presentazione." - -#: lib/claper_web/live/event_live/event_form_component.html.heex:314 +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 #, elixir-autogen, elixir-format msgid "Facilitators" msgstr "Aiutanti" #: lib/claper_web/live/event_live/event_form_component.html.heex:7 -#: lib/claper_web/live/event_live/index.html.heex:107 -#: lib/claper_web/live/event_live/manage.html.heex:430 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 #: lib/claper_web/templates/lti/registration/success.html.heex:26 #, elixir-autogen, elixir-format msgid "Finish" msgstr "Terminato" -#: lib/claper_web/live/event_live/manage.html.heex:1162 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." msgstr "Qui troverai tutte le interazioni dei tuoi partecipanti. Puoi gestire messaggi, messaggi appuntati e moduli compilati." -#: lib/claper_web/live/event_live/manage.html.heex:1162 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identifica gli utenti tramite i loro avatar unici." #: lib/claper_web/live/event_live/event_form_component.html.heex:5 -#: lib/claper_web/live/event_live/index.html.heex:105 -#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 #: lib/claper_web/live/event_live/manager_settings_component.ex:176 #: lib/claper_web/live/event_live/quiz_component.ex:161 #: lib/claper_web/live/event_live/quiz_component.ex:209 @@ -1085,57 +1084,57 @@ msgstr "Prossimo" msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." msgstr "Seleziona il file della tua presentazione. I formati accettati sono PDF, PPT o PPTX. Assicurati che la dimensione del file non superi il limite massimo." -#: lib/claper_web/live/event_live/manage.html.heex:551 +#: lib/claper_web/live/event_live/manage.html.heex:545 #, elixir-autogen, elixir-format msgid "Time to launch your presentation!" msgstr "È il momento di lanciare la tua presentazione!" -#: lib/claper_web/live/event_live/manage.html.heex:1464 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "Use the associated keyboard shortcuts for quick toggling of these settings." msgstr "Per attivare/disattivare rapidamente queste impostazioni, utilizzare le scorciatoie da tastiera associate." -#: lib/claper_web/live/event_live/manage.html.heex:1464 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." msgstr "È possibile controllare ogni impostazione della presentazione (visualizzata sul grande schermo) e della sala dei partecipanti." -#: lib/claper_web/live/event_live/index.html.heex:148 +#: lib/claper_web/live/event_live/index.html.heex:149 #, elixir-autogen, elixir-format msgid "Your first steps with Claper" msgstr "I tuoi primi passi con Claper" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." msgstr "I partecipanti che tenteranno di accedere all'evento prima di tale data verranno indirizzati a una sala d'attesa." -#: lib/claper_web/live/event_live/index.html.heex:166 +#: lib/claper_web/live/event_live/index.html.heex:167 #, elixir-autogen, elixir-format msgid "Create event" msgstr "Crea evento" -#: lib/claper_web/live/event_live/index.html.heex:224 +#: lib/claper_web/live/event_live/index.html.heex:225 #, elixir-autogen, elixir-format msgid "Create your first event" msgstr "Crea il tuo primo evento" -#: lib/claper_web/live/event_live/event_form_component.html.heex:294 +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 #, elixir-autogen, elixir-format msgid "Event start date" msgstr "Data di inizio dell'evento" -#: lib/claper_web/live/event_live/index.html.heex:118 +#: lib/claper_web/live/event_live/index.html.heex:119 #, elixir-autogen, elixir-format msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." msgstr "Se non hai tempo e vuoi solo interagire senza un file di presentazione, puoi creare un nuovo evento qui." -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." msgstr "Se hai bisogno di assistenza nella gestione del tuo evento, puoi concedere l'accesso ad altre persone. Inserisci semplicemente i loro indirizzi email; una volta che avranno registrato un'utenza con queste email, saranno in grado di gestire l'evento." -#: lib/claper_web/live/event_live/index.html.heex:123 +#: lib/claper_web/live/event_live/index.html.heex:124 #, elixir-autogen, elixir-format msgid "In a hurry ?" msgstr "Hai fretta ?" @@ -1145,18 +1144,18 @@ msgstr "Hai fretta ?" msgid "Live" msgstr "Dal vivo" -#: lib/claper_web/live/event_live/index.html.heex:111 +#: lib/claper_web/live/event_live/index.html.heex:112 #, elixir-autogen, elixir-format msgid "My events" msgstr "I miei eventi" -#: lib/claper_web/live/event_live/event_form_component.html.heex:271 -#: lib/claper_web/live/event_live/index.html.heex:86 +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 #, elixir-autogen, elixir-format msgid "Name of your event" msgstr "Nome del tuo evento" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format msgid "Note: Facilitators do not have the ability to delete your event." msgstr "Nota: gli aiutanti non hanno la possibilità di eliminare il tuo evento." @@ -1166,12 +1165,12 @@ msgstr "Nota: gli aiutanti non hanno la possibilità di eliminare il tuo evento. msgid "Presentation file (optional)" msgstr "File di presentazione (facoltativo)" -#: lib/claper_web/live/event_live/index.html.heex:141 +#: lib/claper_web/live/event_live/index.html.heex:142 #, elixir-autogen, elixir-format msgid "Quick event" msgstr "Evento veloce" -#: lib/claper_web/live/event_live/index.ex:91 +#: lib/claper_web/live/event_live/index.ex:102 #, elixir-autogen, elixir-format msgid "Quick event created successfully" msgstr "Evento veloce creato correttamente" @@ -1181,7 +1180,7 @@ msgstr "Evento veloce creato correttamente" msgid "Return to your last event" msgstr "Torna al tuo ultimo evento" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format msgid "Select the start date for your event. Future dates are permissible." msgstr "Seleziona la data di inizio del tuo evento. Sono ammesse date future." @@ -1191,7 +1190,7 @@ msgstr "Seleziona la data di inizio del tuo evento. Sono ammesse date future." msgid "Select your presentation (optional)" msgstr "Seleziona la tua presentazione (facoltativo)" -#: lib/claper_web/live/event_live/event_form_component.html.heex:280 +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 #, elixir-autogen, elixir-format msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." msgstr "Questo codice verrà utilizzato dai tuoi partecipanti per accedere all'evento. Hai la possibilità di creare un codice personalizzato." @@ -1201,12 +1200,12 @@ msgstr "Questo codice verrà utilizzato dai tuoi partecipanti per accedere all'e msgid "This event has been terminated" msgstr "Questo evento è stato terminato" -#: lib/claper_web/live/event_live/index.html.heex:147 +#: lib/claper_web/live/event_live/index.html.heex:148 #, elixir-autogen, elixir-format msgid "Welcome to Claper! You can create a new event here." msgstr "Benvenuto in Claper! Qui puoi creare un nuovo evento." -#: lib/claper_web/live/event_live/event_form_component.html.heex:304 +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 #, elixir-autogen, elixir-format msgid "When your event will start?" msgstr "Quando inizierà il tuo evento?" @@ -1216,8 +1215,8 @@ msgstr "Quando inizierà il tuo evento?" msgid "Create your next presentation with" msgstr "Crea la tua prossima presentazione con" -#: lib/claper_web/live/event_live/manage.ex:27 -#: lib/claper_web/live/event_live/presenter.ex:24 +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:25 #, elixir-autogen, elixir-format msgid "Event doesn't exist" @@ -1228,7 +1227,7 @@ msgstr "L'evento non esiste" msgid "Customize your account" msgstr "Personalizza la tua utenza" -#: lib/claper_web/live/user_settings_live/show.html.heex:265 +#: lib/claper_web/live/user_settings_live/show.html.heex:278 #, elixir-autogen, elixir-format msgid "Language" msgstr "Lingua" @@ -1248,22 +1247,22 @@ msgstr "Le tue preferenze sono state aggiornate." msgid "Question" msgstr "Domanda" -#: lib/claper_web/live/event_live/manage.html.heex:1180 +#: lib/claper_web/live/event_live/manage.html.heex:1167 #, elixir-autogen, elixir-format msgid "Questions" msgstr "Domande" -#: lib/claper_web/live/event_live/manage.html.heex:1267 +#: lib/claper_web/live/event_live/manage.html.heex:1254 #, elixir-autogen, elixir-format msgid "Questions will appear here." msgstr "Le domande appariranno qui." -#: lib/claper_web/live/event_live/manage.html.heex:1309 +#: lib/claper_web/live/event_live/manage.html.heex:1296 #, elixir-autogen, elixir-format msgid "Sort by date" msgstr "Ordina per data" -#: lib/claper_web/live/event_live/manage.html.heex:1288 +#: lib/claper_web/live/event_live/manage.html.heex:1275 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Ordina per popolarità" @@ -1273,7 +1272,8 @@ msgstr "Ordina per popolarità" msgid "Event manager" msgstr "Responsabile eventi" -#: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Documentazione" @@ -1289,7 +1289,7 @@ msgstr "La mia utenza" msgid "Your personal informations to access your account" msgstr "I tuoi dati personali per accedere alla tua utenza" -#: lib/claper_web/live/event_live/manager_settings_component.ex:533 +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 #, elixir-autogen, elixir-format msgid "Enable reactions" msgstr "Abilita reazioni" @@ -1345,43 +1345,43 @@ msgid "Add Claper" msgstr "Aggiungi Claper" #: lib/claper_web/live/event_live/manage.html.heex:123 -#: lib/claper_web/live/event_live/manage.html.heex:544 +#: lib/claper_web/live/event_live/manage.html.heex:538 #, elixir-autogen, elixir-format msgid "Close preview" msgstr "Chiudi anteprima" -#: lib/claper_web/live/event_live/manage.html.heex:748 +#: lib/claper_web/live/event_live/manage.html.heex:734 #, elixir-autogen, elixir-format msgid "Create your first interaction." msgstr "Crea la tua prima interazione." -#: lib/claper_web/live/event_live/manage.html.heex:1106 +#: lib/claper_web/live/event_live/manage.html.heex:1093 #, elixir-autogen, elixir-format msgid "Disable" msgstr "Disabilita" -#: lib/claper_web/live/event_live/manage.html.heex:1123 +#: lib/claper_web/live/event_live/manage.html.heex:1110 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Abilita" -#: lib/claper_web/live/event_live/manager_settings_component.ex:443 +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 #, elixir-autogen, elixir-format msgid "Enable messages to change this option" msgstr "Abilita i messaggi per modificare questa opzione" #: lib/claper_web/live/event_live/manage.html.heex:122 -#: lib/claper_web/live/event_live/manage.html.heex:543 +#: lib/claper_web/live/event_live/manage.html.heex:537 #, elixir-autogen, elixir-format msgid "Open preview" msgstr "Apri anteprima" -#: lib/claper_web/live/event_live/manager_settings_component.ex:321 +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 #, elixir-autogen, elixir-format msgid "Show messages to change this option" msgstr "Mostra messaggi per modificare questa opzione" -#: lib/claper_web/live/event_live/manage.html.heex:745 +#: lib/claper_web/live/event_live/manage.html.heex:731 #, elixir-autogen, elixir-format msgid "This slide does not have any interactions." msgstr "Questa diapositiva non ha interazioni." @@ -1408,7 +1408,7 @@ msgstr "Accedi con %{provider}" msgid "The account has been unlinked." msgstr "L'utenza è stata scollegata." -#: lib/claper_web/live/event_live/manage.html.heex:721 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "This section contains all your interactions." msgstr "Questa sezione contiene tutte le tue interazioni." @@ -1419,12 +1419,12 @@ msgstr "Questa sezione contiene tutte le tue interazioni." msgid "Unlink" msgstr "Scollega" -#: lib/claper_web/live/event_live/manage.html.heex:721 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "You can add interactions to your presentation slides." msgstr "Puoi aggiungere interazioni alle diapositive della tua presentazione." -#: lib/claper_web/live/event_live/manage.html.heex:720 +#: lib/claper_web/live/event_live/manage.html.heex:706 #, elixir-autogen, elixir-format msgid "Your interactions" msgstr "Le tue interazioni" @@ -1449,12 +1449,12 @@ msgstr "Imposta una nuova password per la tua utenza prima di scollegarla." msgid "Your password has been set, you can now unlink your account." msgstr "La tua password è stata impostata, ora puoi scollegare la tua utenza." -#: lib/claper_web/live/embed_live/form_component.html.heex:38 +#: lib/claper_web/live/embed_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Iframe code" msgstr "Codice per iframe" -#: lib/claper_web/live/embed_live/form_component.html.heex:39 +#: lib/claper_web/live/embed_live/form_component.html.heex:35 #, elixir-autogen, elixir-format msgid "Link to the content" msgstr "Collegamento al contenuto" @@ -1480,24 +1480,24 @@ msgstr "Inserisci un collegamento valido che inizia con http:// o https://" msgid "Please enter valid HTML content with an iframe tag" msgstr "Inserisci un contenuto HTML valido con un tag iframe" -#: lib/claper_web/live/embed_live/form_component.html.heex:25 +#: lib/claper_web/live/embed_live/form_component.html.heex:23 #, elixir-autogen, elixir-format msgid "Provider" msgstr "Provider" -#: lib/claper_web/live/poll_live/form_component.html.heex:89 +#: lib/claper_web/live/poll_live/form_component.html.heex:85 #, elixir-autogen, elixir-format msgid "Attendees can see the results on their device" msgstr "I partecipanti possono vedere i risultati sul loro dispositivo" -#: lib/claper_web/live/embed_live/form_component.html.heex:56 +#: lib/claper_web/live/embed_live/form_component.html.heex:50 #, elixir-autogen, elixir-format msgid "Attendees can view the web content on their device" msgstr "I partecipanti possono visualizzare il contenuto web sul proprio dispositivo" -#: lib/claper_web/live/embed_live/form_component.html.heex:49 -#: lib/claper_web/live/poll_live/form_component.html.heex:82 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:172 +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 #, elixir-autogen, elixir-format msgid "Options" msgstr "Opzioni" @@ -1565,12 +1565,12 @@ msgstr "Fine" msgid "More options" msgstr "Altre opzioni" -#: lib/claper_web/live/event_live/manage.ex:789 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "No" msgstr "No" -#: lib/claper_web/live/event_live/manage.ex:789 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Sì" @@ -1620,32 +1620,32 @@ msgstr "Puoi reimpostare la tua password visitando l'URL sottostante" msgid "back to the home page" msgstr "torna alla pagina iniziale" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:46 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 #, elixir-autogen, elixir-format msgid "Add Question" msgstr "Aggiungi Domanda" -#: lib/claper_web/live/event_live/manage.html.heex:294 +#: lib/claper_web/live/event_live/manage.html.heex:293 #, elixir-autogen, elixir-format msgid "Add a quiz to test knowledge." msgstr "Aggiungi un quiz per testare le conoscenze." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 #, elixir-autogen, elixir-format msgid "Add answer" msgstr "Aggiungi risposta" -#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 #, elixir-autogen, elixir-format msgid "Allow anonymous messages" msgstr "Consenti messaggi anonimi" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:84 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 #, elixir-autogen, elixir-format msgid "Answer %{index}" msgstr "Risposta %{index}" -#: lib/claper_web/live/event_live/manager_settings_component.ex:390 +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees" msgstr "Partecipanti" @@ -1661,32 +1661,32 @@ msgstr "Punteggio medio" msgid "Current quiz" msgstr "Quiz attuale" -#: lib/claper_web/live/event_live/manager_settings_component.ex:485 +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 #, elixir-autogen, elixir-format msgid "Deny anonymous messages" msgstr "Rifiuta messaggi anonimi" -#: lib/claper_web/live/event_live/manager_settings_component.ex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 #, elixir-autogen, elixir-format msgid "Disable messages" msgstr "Disabilita messaggi" -#: lib/claper_web/live/event_live/manager_settings_component.ex:536 +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 #, elixir-autogen, elixir-format msgid "Disable reactions" msgstr "Disabilita reazioni" -#: lib/claper_web/live/event_live/manage.html.heex:369 +#: lib/claper_web/live/event_live/manage.html.heex:368 #, elixir-autogen, elixir-format msgid "Edit quiz" msgstr "Modifica quiz" -#: lib/claper_web/live/event_live/manager_settings_component.ex:258 +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 #, elixir-autogen, elixir-format msgid "Hide instructions to join" msgstr "Nascondi istruzioni per partecipare" -#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 #, elixir-autogen, elixir-format msgid "Hide messages" msgstr "Nascondi messaggi" @@ -1709,12 +1709,12 @@ msgstr "Come funziona ?" msgid "Interaction" msgstr "Interazione" -#: lib/claper_web/live/event_live/manage.html.heex:368 +#: lib/claper_web/live/event_live/manage.html.heex:367 #, elixir-autogen, elixir-format msgid "New quiz" msgstr "Nuovo quiz" -#: lib/claper_web/live/event_live/manager_settings_component.ex:217 +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 #, elixir-autogen, elixir-format, fuzzy msgid "Presentation" msgstr "Presentazione" @@ -1724,13 +1724,13 @@ msgstr "Presentazione" msgid "Previous" msgstr "Precedente" -#: lib/claper_web/live/event_live/manage.html.heex:292 -#: lib/claper_web/live/event_live/manage.html.heex:925 +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Quiz" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:158 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 #, elixir-autogen, elixir-format msgid "Remove question" msgstr "Rimuovi domanda" @@ -1745,17 +1745,17 @@ msgstr "Passa in rassegna le domande" msgid "See current quiz" msgstr "Vedi quiz attuale" -#: lib/claper_web/live/event_live/manage.html.heex:388 +#: lib/claper_web/live/event_live/manage.html.heex:387 #, elixir-autogen, elixir-format msgid "Select presentation" msgstr "Seleziona presentazione" -#: lib/claper_web/live/event_live/manager_settings_component.ex:361 +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 #, elixir-autogen, elixir-format msgid "Show all messages" msgstr "Mostra tutti i messaggi" -#: lib/claper_web/live/event_live/manager_settings_component.ex:255 +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 #, elixir-autogen, elixir-format msgid "Show instructions to join" msgstr "Mostra istruzioni per partecipare" @@ -1771,7 +1771,7 @@ msgstr "Mostra risultati" msgid "Show results on presentation" msgstr "Mostra risultati sulla presentazione" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:206 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the quiz itself, are you sure?" msgstr "Questo eliminerà tutte le risposte associate e il quiz stesso, sei sicuro?" @@ -1781,7 +1781,7 @@ msgstr "Questo eliminerà tutte le risposte associate e il quiz stesso, sei sicu msgid "Waiting for results..." msgstr "In attesa dei risultati..." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:62 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 #, elixir-autogen, elixir-format msgid "Your question" msgstr "La tua domanda" @@ -1799,7 +1799,7 @@ msgstr "Il tuo punteggio" msgid "Export" msgstr "Esporta" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:218 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 #, elixir-autogen, elixir-format msgid "Export to QTI (XML)" msgstr "Esporta in QTI (XML)" @@ -1859,17 +1859,21 @@ msgstr "Partecipanti unici" msgid "Web Content" msgstr "Contenuto Web" -#: lib/claper_web/live/event_live/index.html.heex:178 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 #, elixir-autogen, elixir-format msgid "Active" msgstr "Attivo" -#: lib/claper_web/live/event_live/index.html.heex:217 +#: lib/claper_web/live/event_live/index.html.heex:218 #, elixir-autogen, elixir-format msgid "Load more" msgstr "Carica altro" -#: lib/claper_web/live/event_live/index.html.heex:194 +#: lib/claper_web/live/event_live/index.html.heex:195 #, elixir-autogen, elixir-format msgid "Shared with you" msgstr "Condiviso con te" @@ -1879,17 +1883,17 @@ msgstr "Condiviso con te" msgid "You must login to continue" msgstr "Devi accedere per continuare" -#: lib/claper/quizzes/quiz_question.ex:41 +#: lib/claper/quizzes/quiz_question.ex:51 #, elixir-autogen, elixir-format msgid "must have at least one correct answer" msgstr "deve avere almeno una risposta corretta" -#: lib/claper_web/live/event_live/manage.html.heex:548 +#: lib/claper_web/live/event_live/manage.html.heex:547 #, elixir-autogen, elixir-format msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." msgstr "Clicca qui per aprire la finestra di presentazione. Premi F nella finestra di presentazione per abilitare la modalità a schermo intero." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:179 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 #, elixir-autogen, elixir-format msgid "Allow anonymous submissions" msgstr "Consenti invii anonimi" @@ -1908,3 +1912,771 @@ msgstr "Accedi" #, elixir-autogen, elixir-format msgid "Total submissions" msgstr "Risposte totali" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "Un codice unico per far partecipare i partecipanti a questo evento" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "Un nome unico per questo evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "Un nome unico per identificare questo provider OIDC" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "L'account è confermato e attivo" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format, fuzzy +msgid "Actions" +msgstr "Azioni" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Active Events" +msgstr "Eventi attivi" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this event?" +msgstr "Sei sicuro di voler eliminare questo evento?" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this provider?" +msgstr "Sei sicuro di voler eliminare questo provider?" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this user?" +msgstr "Sei sicuro di voler eliminare questo utente?" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "Utente assegnato" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format, fuzzy +msgid "Audience Peak" +msgstr "Picco di pubblico" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "Codice di autorizzazione" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "Annulla" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format, fuzzy +msgid "Choose file" +msgstr "Scegli file" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "ID Cliente" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "Segreto Cliente" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "Completato" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirmed" +msgstr "Confermato" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "Confermato il" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create Event" +msgstr "Crea evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "Crea provider" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create User" +msgstr "Crea utente" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created" +msgstr "Creato" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created At" +msgstr "Creato il" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Currently running" +msgstr "Attualmente in corso" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete event" +msgstr "Elimina evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "Elimina provider" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete user" +msgstr "Elimina utente" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "Modifica provider OIDC" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "Modifica evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "Modifica provider" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit user" +msgstr "Modifica utente" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "Abilita questo provider OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "Inserisci ID cliente" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "Inserisci segreto cliente" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "Inserisci codice evento" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "Inserisci nome evento" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enter password" +msgstr "Inserisci password" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "Inserisci nome provider" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "Inserisci email utente" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "Creazione eventi" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "Evento creato con successo" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "Evento eliminato con successo" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "Dettagli evento" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "Evento aggiornato con successo" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format, fuzzy +msgid "Events" +msgstr "Eventi" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "Eventi esportati con successo" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "Scade il" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "File selezionato" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format, fuzzy +msgid "Form Post" +msgstr "Form Post" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "Frammento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "Come dovrebbe essere restituita la risposta di autorizzazione (predefinito: 'query')" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "Ibrido" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "Implicito" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format, fuzzy +msgid "Inactive" +msgstr "Inattivo" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "Password iniziale per l'utente" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "Emittente" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "URL emittente" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "Ultimi 30 giorni" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "Ultimo aggiornamento" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "Nuovo evento" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "Nessun evento trovato" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "Nessun file scelto" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "Nessun proprietario" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "Nessun ruolo" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "Nessun utente trovato" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "Non scaduto" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "Non iniziato" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "Tipo di risposta OAuth 2.0 (predefinito: 'code')" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Provider" +msgstr "Provider OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "Dettagli provider OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Providers" +msgstr "Provider OIDC" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "Ambiti OIDC da richiedere (predefinito: 'openid email profile')" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "Proprietario" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "Provider creato con successo" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider updated successfully" +msgstr "Provider aggiornato con successo" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "Query" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "Eventi recenti" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "URI di reindirizzamento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "Modalità di risposta" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "Tipo di risposta" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "Ruolo" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "Salvataggio in corso..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "Programmato" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "Ambito" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "Cerca eventi..." + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "Cerca un utente..." + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "Cerca provider..." + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "Cerca utenti..." + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select an option" +msgstr "Seleziona un'opzione" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "Seleziona..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "Data di inizio" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "Iniziato il" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "Stato" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "L'URL dell'emittente OIDC (deve iniziare con http:// o https://)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "L'URL di callback per la tua applicazione (deve iniziare con http:// o https://)" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "L'utente proprietario di questo evento (obbligatorio)" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "Eventi totali" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "Utenti totali" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "Non confermato" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "Aggiorna evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "Aggiorna provider" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "Aggiorna utente" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "Account utente" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "Crescita utenti" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "Utente creato con successo" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Utente eliminato con successo" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "Dettagli utente" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format, fuzzy +msgid "User updated successfully" +msgstr "Utente aggiornato con successo" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "Livello di accesso dell'utente" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "Indirizzo email dell'utente (deve essere unico)" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "Utenti" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "Utenti esportati con successo" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "Visualizza evento" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format, fuzzy +msgid "View provider" +msgstr "Visualizza provider" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "Visualizza utente" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "Quando scade questo evento (opzionale)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "Se questo provider è attualmente attivo e disponibile per l'autenticazione" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format, fuzzy +msgid "attendees" +msgstr "partecipanti" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "https://example.com" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "https://yourapp.com/auth/callback" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "openid email profile" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "vs mese scorso" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to events" +msgstr "Torna agli eventi" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to providers" +msgstr "Torna ai provider" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to users" +msgstr "Torna agli utenti" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format, fuzzy +msgid "New provider" +msgstr "Nuovo provider" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format, fuzzy +msgid "New user" +msgstr "Nuovo utente" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format, fuzzy +msgid "No providers found" +msgstr "Nessun provider trovato" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "Provider eliminato con successo" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Dettagli provider" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "Admin" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "Torna all'app" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Confirm email change" +msgstr "Conferma la modifica dell'email" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format +msgid "If you didn't request an email change, please ignore this." +msgstr "Se non hai richiesto una modifica dell'indirizzo email, ignora questo messaggio." + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format +msgid "You can confirm your email change by visiting the URL below" +msgstr "Puoi confermare la modifica dell'indirizzo email visitando l'URL sottostante" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "Nascondi numero dei partecipanti" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show attendee count" +msgstr "Mostra numero dei partecipanti" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "Obbligatorio" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "(facoltativo)" diff --git a/priv/gettext/lv/LC_MESSAGES/default.po b/priv/gettext/lv/LC_MESSAGES/default.po new file mode 100644 index 0000000..5c9f9b3 --- /dev/null +++ b/priv/gettext/lv/LC_MESSAGES/default.po @@ -0,0 +1,2685 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: POEditor.com\n" +"Project-Id-Version: claper\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==0 || n%100>=11 && n%100<=19) ? 0 : ((n%10==1 && n%100 != 11) ? 1 : 2);\n" + +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 +#: lib/claper_web/live/user_settings_live/show.ex:77 +#, elixir-autogen, elixir-format +msgid "Settings" +msgstr "Iestatījumi" + +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 +#: lib/claper_web/live/user_settings_live/show.html.heex:34 +#: lib/claper_web/templates/user_registration/new.html.heex:29 +#: lib/claper_web/templates/user_reset_password/new.html.heex:28 +#: lib/claper_web/templates/user_session/new.html.heex:42 +#, elixir-autogen, elixir-format +msgid "Email" +msgstr "E-pasts" + +#: lib/claper_web/templates/user_registration/new.html.heex:12 +#, elixir-autogen, elixir-format +msgid "Join the Claper experience" +msgstr "Pievienojieties Claper pieredzei" + +#: lib/claper_web/templates/user_registration/new.html.heex:19 +#: lib/claper_web/templates/user_reset_password/edit.html.heex:25 +#: lib/claper_web/templates/user_reset_password/new.html.heex:19 +#, elixir-autogen, elixir-format +msgid "Oops, check that all fields are filled in correctly." +msgstr "Ups, pārbaudiet, vai visi lauki ir aizpildīti pareizi." + +#: lib/claper_web/live/user_settings_live/show.html.heex:155 +#: lib/claper_web/live/user_settings_live/show.html.heex:170 +#, elixir-autogen, elixir-format +msgid "Change" +msgstr "Mainīt" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 +#, elixir-autogen, elixir-format +msgid "Code" +msgstr "Kods" + +#: lib/claper_web/live/user_settings_live/show.html.heex:146 +#: lib/claper_web/templates/user_session/new.html.heex:40 +#, elixir-autogen, elixir-format +msgid "Email address" +msgstr "E-pasta adrese" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 +#, elixir-autogen, elixir-format +msgid "Logout" +msgstr "Izrakstīties" + +#: lib/claper_web/live/user_settings_live/show.html.heex:136 +#, elixir-autogen, elixir-format +msgid "Personal informations" +msgstr "Personīgā informācija" + +#: lib/claper_web/templates/user_registration/confirm.html.heex:13 +#, elixir-autogen, elixir-format +msgid "We already sent you an email to login, please retry in 5 minutes." +msgstr "Mēs jau nosūtījām jums e-pastu, lai pieteiktos. Lūdzu, mēģiniet vēlreiz pēc 5 minūtēm." + +#: lib/claper_web/templates/user_registration/confirm.html.heex:16 +#, elixir-autogen, elixir-format +msgid "We sent you an email at" +msgstr "Mēs nosūtījām jums e-pastu uz adresi" + +#: lib/claper_web/live/event_live/show.html.heex:437 +#, elixir-autogen, elixir-format +msgid "days" +msgstr "dienas" + +#: lib/claper_web/live/event_live/show.html.heex:443 +#, elixir-autogen, elixir-format +msgid "hours" +msgstr "stundas" + +#: lib/claper_web/live/event_live/show.html.heex:449 +#, elixir-autogen, elixir-format +msgid "minutes" +msgstr "minūtes" + +#: lib/claper_web/live/event_live/show.html.heex:165 +#, elixir-autogen, elixir-format +msgid "Be the first to react !" +msgstr "Esi pirmais, kas noreaģē!" + +#: lib/claper_web/live/event_live/event_card_component.ex:111 +#: lib/claper_web/live/event_live/join.ex:41 +#: lib/claper_web/live/event_live/join.html.heex:94 +#: lib/claper_web/live/event_live/manage.html.heex:492 +#: lib/claper_web/live/event_live/show.html.heex:286 +#, elixir-autogen, elixir-format +msgid "Join" +msgstr "Pievienoties" + +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 +#: lib/claper_web/live/event_live/join.html.heex:31 +#: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 +#, elixir-autogen, elixir-format +msgid "Dashboard" +msgstr "Vadības panelis" + +#: lib/claper_web/live/event_live/post_component.ex:33 +#: lib/claper_web/live/event_live/post_component.ex:112 +#, elixir-autogen, elixir-format +msgid "Host" +msgstr "Organizators" + +#: lib/claper_web/live/event_live/show.html.heex:455 +#, elixir-autogen, elixir-format +msgid "seconds" +msgstr "sekundes" + +#: lib/claper_web/live/event_live/event_card_component.ex:60 +#: lib/claper_web/live/event_live/index.html.heex:187 +#, elixir-autogen, elixir-format +msgid "Finished" +msgstr "Pabeigts" + +#: lib/claper_web/live/event_live/event_card_component.ex:90 +#, elixir-autogen, elixir-format +msgid "Finished on" +msgstr "Pabeigts" + +#: lib/claper_web/live/event_live/event_card_component.ex:55 +#, elixir-autogen, elixir-format +msgid "Incoming" +msgstr "Drīzumā" + +#: lib/claper_web/live/event_live/show.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Leave" +msgstr "Pamest" + +#: lib/claper_web/live/event_live/presenter.html.heex:26 +#: lib/claper_web/live/event_live/show.html.heex:464 +#, elixir-autogen, elixir-format +msgid "Scan to interact in real-time" +msgstr "Noskenējiet, lai mijiedarbotos reāllaikā" + +#: lib/claper_web/live/event_live/event_card_component.ex:86 +#, elixir-autogen, elixir-format +msgid "Starting on" +msgstr "Sākot no" + +#: lib/claper_web/live/event_live/event_form_component.ex:268 +#, elixir-autogen, elixir-format +msgid "Updated successfully" +msgstr "Veiksmīgi atjaunināts" + +#: lib/claper_web/templates/user_session/new.html.heex:22 +#, elixir-autogen, elixir-format +msgid "It's time to empower your presentations." +msgstr "Ir pienācis laiks uzlabot jūsu prezentācijas." + +#: lib/claper_web/templates/error/404.html.heex:36 +#: lib/claper_web/templates/error/500.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Return to home" +msgstr "Atgriezties uz sākumlapu" + +#: lib/claper_web/live/event_live/event_form_component.ex:212 +#: lib/claper_web/live/event_live/event_form_component.ex:248 +#, elixir-autogen, elixir-format +msgid "Created successfully" +msgstr "Veiksmīgi izveidots" + +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 +#: lib/claper_web/live/event_live/event_card_component.ex:250 +#: lib/claper_web/live/event_live/event_card_component.ex:330 +#: lib/claper_web/live/event_live/form_component.ex:97 +#: lib/claper_web/live/event_live/index.ex:204 +#, elixir-autogen, elixir-format +msgid "Edit" +msgstr "Rediģēt" + +#: lib/claper_web/live/embed_live/form_component.html.heex:63 +#: lib/claper_web/live/event_live/event_form_component.html.heex:55 +#: lib/claper_web/live/event_live/event_form_component.html.heex:62 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 +#, elixir-autogen, elixir-format +msgid "Create" +msgstr "Izveidot" + +#: lib/claper_web/live/embed_live/form_component.html.heex:68 +#: lib/claper_web/live/event_live/event_card_component.ex:444 +#: lib/claper_web/live/event_live/event_form_component.html.heex:67 +#: lib/claper_web/live/event_live/manage.html.heex:1397 +#: lib/claper_web/live/event_live/manageable_post_component.ex:92 +#: lib/claper_web/live/event_live/post_component.ex:70 +#: lib/claper_web/live/event_live/post_component.ex:142 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#, elixir-autogen, elixir-format +msgid "Delete" +msgstr "Dzēst" + +#: lib/claper_web/live/embed_live/form_component.html.heex:64 +#: lib/claper_web/live/event_live/event_form_component.html.heex:54 +#: lib/claper_web/live/event_live/event_form_component.html.heex:61 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 +#: lib/claper_web/live/user_settings_live/show.html.heex:38 +#: lib/claper_web/live/user_settings_live/show.html.heex:80 +#: lib/claper_web/live/user_settings_live/show.html.heex:123 +#, elixir-autogen, elixir-format +msgid "Save" +msgstr "Saglabāt" + +#: lib/claper_web/live/user_settings_live/show.ex:137 +#, elixir-autogen, elixir-format +msgid "A link to confirm your email change has been sent to the new address." +msgstr "Uz jauno adresi ir nosūtīta saite, lai apstiprinātu e-pasta maiņu." + +#: lib/claper_web/live/user_settings_live/show.ex:53 +#, elixir-autogen, elixir-format +msgid "Change the email address you want associated with your account." +msgstr "Mainiet e-pasta adresi, kuru vēlaties saistīt ar savu kontu." + +#: lib/claper_web/live/user_settings_live/show.ex:50 +#, elixir-autogen, elixir-format +msgid "Update your email" +msgstr "Atjauniniet savu e-pasta adresi" + +#: lib/claper_web/notifiers/user_notifier.ex:12 +#: lib/claper_web/templates/user_notifier/magic.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Connect to Claper" +msgstr "Pieslēdzieties Claper" + +#: lib/claper_web/templates/user_notifier/magic.html.heex:29 +#, elixir-autogen, elixir-format +msgid "ACCESS TO MY ACCOUNT" +msgstr "PIEKĻUVE MANAM KONTAM" + +#: lib/claper_web/notifiers/user_notifier.ex:34 +#, elixir-autogen, elixir-format +msgid "Update email instructions" +msgstr "E-pasta adreses maiņas instrukcijas" + +#: lib/claper_web/templates/user_notifier/change.html.heex:29 +#, elixir-autogen, elixir-format +msgid "CONFIRM EMAIL" +msgstr "APSTIPRINĀT E-PASTU" + +#: lib/claper_web/templates/user_notifier/confirm.html.heex:32 +#: lib/claper_web/templates/user_notifier/magic.html.heex:32 +#: lib/claper_web/templates/user_notifier/reset.html.heex:32 +#, elixir-autogen, elixir-format +msgid "If you didn't create an account with us, please ignore this." +msgstr "Ja neesat izveidojuši mūsu kontu, lūdzu, ignorējiet šo informāciju." + +#: lib/claper_web/templates/user_notifier/magic.html.heex:22 +#, elixir-autogen, elixir-format +msgid "You can log into your account by clicking here." +msgstr "Varat pieteikties savā kontā, noklikšķinot šeit." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:71 +#: lib/claper_web/live/event_live/post_component.ex:75 +#: lib/claper_web/live/event_live/post_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Are you sure?" +msgstr "Vai esat pārliecināti?" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:192 +#, elixir-autogen, elixir-format +msgid "Presentation attached" +msgstr "Prezentācija ir pievienota" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:152 +#, elixir-autogen, elixir-format +msgid "Presentation uploaded" +msgstr "Prezentācija ir augšupielādēta" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:163 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 +#, elixir-autogen, elixir-format +msgid "Remove" +msgstr "Noņemt" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:173 +#, elixir-autogen, elixir-format +msgid "Select your presentation" +msgstr "Izvēlieties savu prezentāciju" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:115 +#, elixir-autogen, elixir-format +msgid "Upload a file" +msgstr "Failu augšupielāde" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:119 +#, elixir-autogen, elixir-format +msgid "or drag and drop" +msgstr "vai velciet un nometiet" + +#: lib/claper_web/live/event_live/event_form_component.ex:322 +#, elixir-autogen, elixir-format +msgid "You have selected an incorrect file type" +msgstr "Jūs esat izvēlējies nepareizu faila tipu" + +#: lib/claper_web/live/event_live/event_form_component.ex:321 +#, elixir-autogen, elixir-format +msgid "Your file is too large" +msgstr "Jūsu fails ir pārāk liels" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:202 +#, elixir-autogen, elixir-format +msgid "Change file" +msgstr "Mainīt failu" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 +#, elixir-autogen, elixir-format +msgid "Presentation replaced" +msgstr "Prezentācija aizstāta" + +#: lib/claper_web/live/event_live/manage.html.heex:305 +#, elixir-autogen, elixir-format +msgid "Edit poll" +msgstr "Rediģēt aptauju" + +#: lib/claper_web/live/event_live/manage.html.heex:304 +#, elixir-autogen, elixir-format +msgid "New poll" +msgstr "Jauna aptauja" + +#: lib/claper_web/live/poll_live/form_component.html.heex:14 +#, elixir-autogen, elixir-format +msgid "Title of your poll" +msgstr "Jūsu aptaujas nosaukums" + +#: lib/claper_web/live/event_live/event_form_component.ex:323 +#, elixir-autogen, elixir-format +msgid "Upload failed" +msgstr "Neizdevās augšupielādēt" + +#: lib/claper_web/live/event_live/manage.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Add poll to know opinion of your public." +msgstr "Pievienojiet aptauju, lai uzzinātu auditorijas viedokli." + +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 +#, elixir-autogen, elixir-format +msgid "Poll" +msgstr "Aptauja" + +#: lib/claper_web/live/poll_live/form_component.html.heex:26 +#, elixir-format, ex-autogen, elixir-autogen +msgid "Choice %{count}" +msgid_plural "Choice %{count}" +msgstr[0] "Izvēle %{count}" +msgstr[1] "Izvēle %{count}" +msgstr[2] "Izvēle %{count}" + +#: lib/claper_web/live/event_live/poll_component.ex:47 +#, elixir-autogen, elixir-format +msgid "Current poll" +msgstr "Pašreizējā aptauja" + +#: lib/claper_web/live/event_live/poll_component.ex:28 +#, elixir-autogen, elixir-format +msgid "See current poll" +msgstr "Skatīt pašreizējo aptauju" + +#: lib/claper_web/live/event_live/poll_component.ex:127 +#: lib/claper_web/live/event_live/poll_component.ex:135 +#, elixir-autogen, elixir-format +msgid "Vote" +msgstr "Balsot" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 +#, elixir-autogen, elixir-format +msgid "User email address" +msgstr "Lietotāja e-pasta adrese" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 +#, elixir-autogen, elixir-format +msgid "Changing your file will remove all interaction elements like polls associated." +msgstr "Mainot failu, tiks noņemti visi mijiedarbības elementi, piemēram, aptaujas." + +#: lib/claper_web/live/event_live/manage.html.heex:1213 +#, elixir-autogen, elixir-format +msgid "Messages from attendees will appear here." +msgstr "Dalībnieku ziņojumi parādīsies šeit." + +#: lib/claper_web/live/event_live/event_card_component.ex:344 +#, elixir-autogen, elixir-format +msgid "Processing your file..." +msgstr "Jūsu faila apstrāde..." + +#: lib/claper_web/live/poll_live/form_component.html.heex:114 +#, elixir-autogen, elixir-format +msgid "This will delete all responses associated and the poll itself, are you sure?" +msgstr "Tas izdzēsīs visas saistītās atbildes un pašu aptauju, vai esat pārliecināti?" + +#: lib/claper_web/live/event_live/show.html.heex:345 +#, elixir-autogen, elixir-format +msgid "Ask, comment..." +msgstr "Jautājiet, komentējiet..." + +#: lib/claper_web/live/event_live/manage.html.heex:1159 +#: lib/claper_web/live/stat_live/index.html.heex:102 +#: lib/claper_web/live/stat_live/index.html.heex:180 +#, elixir-autogen, elixir-format +msgid "Messages" +msgstr "Ziņojumi" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 +#, elixir-autogen, elixir-format +msgid "Add facilitator" +msgstr "Pievienot moderatoru" + +#: lib/claper_web/templates/error/404.html.heex:31 +#, elixir-autogen, elixir-format +msgid "Oops, page doesn't exist." +msgstr "Ups, lapa neeksistē." + +#: lib/claper_web/templates/error/500.html.heex:31 +#, elixir-autogen, elixir-format +msgid "The site is under maintenance, we'll be back very soon!" +msgstr "Vietne tiek uzturēta, mēs atgriezīsimies ļoti drīz!" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 +#, elixir-autogen, elixir-format +msgid "Facilitators can present and manage interactions" +msgstr "Moderatori var prezentēt un vadīt mijiedarbību" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:45 +#: lib/claper_web/templates/user_notifier/change.html.heex:42 +#: lib/claper_web/templates/user_notifier/confirm.html.heex:42 +#: lib/claper_web/templates/user_notifier/magic.html.heex:42 +#: lib/claper_web/templates/user_notifier/reset.html.heex:42 +#, elixir-autogen, elixir-format +msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" +msgstr "Ja jums rodas problēmas ar iepriekš norādīto pogu, nokopējiet un ielīmējiet tīmekļa pārlūkprogrammā tālāk norādīto URL adresi" + +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 +#, elixir-autogen, elixir-format +msgid "Add interaction" +msgstr "Pievienot mijiedarbību" + +#: lib/claper_web/live/event_live/manageable_post_component.ex:54 +#: lib/claper_web/live/event_live/manageable_post_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Blocking this user will delete all his messages and he will not be able to join again, confirm ?" +msgstr "Bloķējot šo lietotāju, tiks dzēsti visi lietotāja ziņojumi un viņš vairs nevarēs pievienoties, apstipriniet?" + +#: lib/claper_web/live/event_live/show.ex:51 +#: lib/claper_web/live/event_live/show.ex:206 +#: lib/claper_web/live/event_live/show.ex:221 +#, elixir-autogen, elixir-format +msgid "You have been banned from this event" +msgstr "Jums ir aizliegts piedalīties šajā pasākumā" + +#: lib/claper_web/live/event_live/manageable_post_component.ex:48 +#: lib/claper_web/live/event_live/manageable_post_component.ex:77 +#, elixir-autogen, elixir-format +msgid "Ban" +msgstr "Bloķēt" + +#: lib/claper_web/templates/user_registration/confirm.html.heex:18 +#, elixir-autogen, elixir-format +msgid ", click on the provided link to connect (check your spam !)" +msgstr ", noklikšķiniet uz norādītās saites, lai pieslēgtos (pārbaudiet savu surogātpastu!)" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:29 +#, elixir-autogen, elixir-format +msgid "Export your current presentation to PDF from your favorite slide presentation software (PowerPoint, etc)" +msgstr "Eksportējiet savu pašreizējo prezentāciju uz PDF no savas iecienītākās prezentāciju programmatūras (PowerPoint utt.)" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:50 +#, elixir-autogen, elixir-format +msgid "Wait few minutes for your file to be processed" +msgstr "Gaidiet dažas minūtes, lai jūsu fails tiktu apstrādāts" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:43 +#, elixir-autogen, elixir-format +msgid "Choose a name for your event, a code for your attendees to join and dates when your attendees could start interacting" +msgstr "Izvēlieties nosaukumu savam pasākumam, kodu, ar kuru dalībnieki var pievienoties, un datumus, kad dalībnieki var sākt mijiedarboties" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:64 +#, elixir-autogen, elixir-format +msgid "Click Start to open your presentation and move the window on the big screen" +msgstr "Noklikšķiniet uz Start, lai atvērtu prezentāciju un pārvietotu logu uz lielā ekrāna" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:57 +#, elixir-autogen, elixir-format +msgid "Click on Present/Customize to add interaction on your slides" +msgstr "Noklikšķiniet uz Prezentēt/Pielāgot, lai pievienotu mijiedarbību diapozitīviem" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:22 +#, elixir-autogen, elixir-format +msgid "Congrats! You've taken the first step to improving your presentations. Here are the next steps to create step up your presentations with Claper:" +msgstr "Apsveicam! Jūs esat spēruši pirmo soli, lai uzlabotu savas prezentācijas. Šeit ir nākamie soļi, lai ar Claper uzlabotu savas prezentācijas:" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:69 +#, elixir-autogen, elixir-format +msgid "Enjoy ! ✨" +msgstr "Izbaudiet! ✨" + +#: lib/claper_web/templates/user_registration/confirm.html.heex:20 +#, elixir-autogen, elixir-format +msgid "We sent you an email, click on the provided link to connect (check your spam !)" +msgstr "Mēs nosūtījām jums e-pastu, noklikšķiniet uz norādītās saites, lai pieslēgtos (pārbaudiet savu surogātpastu!)" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Welcome !" +msgstr "Laipni lūdzam!" + +#: lib/claper_web/templates/user_notifier/welcome.html.heex:36 +#, elixir-autogen, elixir-format +msgid "Click on the create button on your dashboard" +msgstr "Noklikšķiniet uz Izveidot pogas vadības panelī" + +#: lib/claper_web/notifiers/user_notifier.ex:23 +#, elixir-autogen, elixir-format +msgid "Next steps to boost your presentations" +msgstr "Nākamie soļi, lai uzlabotu prezentāciju kvalitāti" + +#: lib/claper_web/live/stat_live/index.html.heex:109 +#, elixir-autogen, elixir-format +msgid "from %{count} people" +msgid_plural "from %{count} peoples" +msgstr[0] "no %{count} cilvēku" +msgstr[1] "no %{count} cilvēka" +msgstr[2] "no %{count} cilvēku" + +#: lib/claper_web/live/stat_live/index.html.heex:15 +#, elixir-autogen, elixir-format +msgid "Event" +msgstr "Pasākums" + +#: lib/claper_web/live/stat_live/index.html.heex:386 +#, elixir-autogen, elixir-format +msgid "No messages has been sent" +msgstr "Nav nosūtīts neviens ziņojums" + +#: lib/claper_web/live/event_live/event_card_component.ex:426 +#, elixir-autogen, elixir-format +msgid "This will delete all data related to your event, this cannot be undone. Confirm ?" +msgstr "Tādējādi tiks dzēsti visi ar jūsu notikumu saistītie dati, un to nevar atcelt. Apstiprināt?" + +#: lib/claper_web/live/stat_live/index.html.heex:45 +#: lib/claper_web/live/stat_live/index.html.heex:77 +#, elixir-autogen, elixir-format +msgid "attendee" +msgid_plural "attendees" +msgstr[0] "dalībnieku" +msgstr[1] "dalībnieks" +msgstr[2] "dalībnieki" + +#: lib/claper_web/live/stat_live/index.html.heex:38 +#, elixir-autogen, elixir-format +msgid "Audience peak" +msgstr "Auditorijas maksimums" + +#: lib/claper_web/live/stat_live/index.html.heex:139 +#, elixir-autogen, elixir-format +msgid "Engagement rate" +msgstr "Iesaistīšanās līmenis" + +#: lib/claper_web/live/event_live/event_card_component.ex:282 +#, elixir-autogen, elixir-format +msgid "Error when processing the file" +msgstr "Kļūda apstrādājot failu" + +#: lib/claper_web/live/event_live/join.html.heex:24 +#: lib/claper_web/live/event_live/join.html.heex:47 +#, elixir-autogen, elixir-format +msgid "About" +msgstr "Par" + +#: lib/claper_web/live/event_live/join.html.heex:38 +#: lib/claper_web/live/event_live/join.html.heex:61 +#: lib/claper_web/templates/user_session/new.html.heex:62 +#, elixir-autogen, elixir-format +msgid "Login" +msgstr "Pieteikšanās" + +#: lib/claper_web/templates/user_session/new.html.heex:25 +#, elixir-autogen, elixir-format +msgid "Connect to your account" +msgstr "Pieslēdzieties savam kontam" + +#: lib/claper_web/live/event_live/show.html.heex:473 +#, elixir-autogen, elixir-format +msgid "Or use the code:" +msgstr "Vai arī izmantojiet kodu:" + +#: lib/claper_web/templates/user_registration/new.html.heex:46 +#: lib/claper_web/templates/user_session/new.html.heex:84 +#, elixir-autogen, elixir-format +msgid "Create account" +msgstr "Izveidot kontu" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 +#: lib/claper_web/live/user_settings_live/show.html.heex:161 +#: lib/claper_web/templates/user_registration/new.html.heex:37 +#: lib/claper_web/templates/user_reset_password/edit.html.heex:34 +#: lib/claper_web/templates/user_session/new.html.heex:50 +#: lib/claper_web/templates/user_session/new.html.heex:52 +#, elixir-autogen, elixir-format +msgid "Password" +msgstr "Parole" + +#: lib/claper_web/live/user_settings_live/show.ex:62 +#, elixir-autogen, elixir-format +msgid "Change the password used to access your account." +msgstr "Mainiet paroli, kas tiek izmantota, lai piekļūtu jūsu kontam." + +#: lib/claper_web/live/user_settings_live/show.html.heex:70 +#, elixir-autogen, elixir-format +msgid "Current password" +msgstr "Pašreizējā parole" + +#: lib/claper_web/live/user_settings_live/show.html.heex:76 +#: lib/claper_web/live/user_settings_live/show.html.heex:112 +#, elixir-autogen, elixir-format +msgid "New password" +msgstr "Jauna parole" + +#: lib/claper_web/live/user_settings_live/show.ex:59 +#, elixir-autogen, elixir-format +msgid "Update your password" +msgstr "Atjaunināt paroli" + +#: lib/claper_web/live/user_settings_live/show.ex:159 +#, elixir-autogen, elixir-format +msgid "Your password has been updated." +msgstr "Jūsu parole ir atjaunināta." + +#: lib/claper_web/live/form_live/form_component.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Field %{count}" +msgid_plural "Field %{count}" +msgstr[0] "Lauks %{count}" +msgstr[1] "Lauks %{count}" +msgstr[2] "Lauks %{count}" + +#: lib/claper_web/live/event_live/manage.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Add form to collect data from your public." +msgstr "Pievienojiet veidlapu, lai savāktu datus no auditorijas." + +#: lib/claper_web/live/event_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Current form" +msgstr "Pašreizējā forma" + +#: lib/claper_web/live/event_live/manage.html.heex:326 +#, elixir-autogen, elixir-format +msgid "Edit form" +msgstr "Rediģēt veidlapu" + +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 +#, elixir-autogen, elixir-format +msgid "Form" +msgstr "Veidlapa" + +#: lib/claper_web/live/event_live/manage.html.heex:1183 +#, elixir-autogen, elixir-format +msgid "Form submissions" +msgstr "Veidlapu iesniegumi" + +#: lib/claper_web/live/event_live/manage.html.heex:1382 +#, elixir-autogen, elixir-format +msgid "Form submissions from attendees will appear here." +msgstr "Dalībnieku iesniegtās veidlapas parādīsies šeit." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 +#, elixir-autogen, elixir-format +msgid "Name" +msgstr "Nosaukums" + +#: lib/claper_web/live/event_live/manage.html.heex:325 +#, elixir-autogen, elixir-format +msgid "New form" +msgstr "Jauna veidlapa" + +#: lib/claper_web/live/stat_live/index.html.heex:305 +#, elixir-autogen, elixir-format +msgid "No form submission has been sent" +msgstr "Nav nosūtīts neviens veidlapas iesniegums" + +#: lib/claper_web/live/event_live/form_component.ex:32 +#, elixir-autogen, elixir-format +msgid "See current form" +msgstr "Skatīt pašreizējo veidlapu" + +#: lib/claper_web/live/event_live/form_component.ex:97 +#: lib/claper_web/live/event_live/quiz_component.ex:183 +#, elixir-autogen, elixir-format +msgid "Submit" +msgstr "Iesniegt" + +#: lib/claper_web/live/form_live/form_component.html.heex:32 +#, elixir-autogen, elixir-format +msgid "Text" +msgstr "Teksts" + +#: lib/claper_web/live/event_live/manage.html.heex:1402 +#, elixir-autogen, elixir-format +msgid "This cannot be undone, confirm ?" +msgstr "Šo darbību nevar atsaukt, apstiprināt?" + +#: lib/claper_web/live/form_live/form_component.html.heex:105 +#, elixir-autogen, elixir-format +msgid "This will delete all responses associated and the form itself, are you sure?" +msgstr "Tas izdzēsīs visas saistītās atbildes un pašu veidlapu, vai esat pārliecināti?" + +#: lib/claper_web/live/form_live/form_component.html.heex:14 +#, elixir-autogen, elixir-format +msgid "Title of your form" +msgstr "Jūsu veidlapas nosaukums" + +#: lib/claper_web/live/form_live/form_component.html.heex:34 +#, elixir-autogen, elixir-format +msgid "Type" +msgstr "Tips" + +#: lib/claper_web/live/event_live/poll_component.ex:52 +#, elixir-autogen, elixir-format +msgid "Select one option" +msgstr "Izvēlieties vienu iespēju" + +#: lib/claper_web/live/event_live/poll_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Select one or multiple options" +msgstr "Izvēlieties vienu vai vairākas opcijas" + +#: lib/claper_web/live/poll_live/form_component.html.heex:92 +#, elixir-autogen, elixir-format +msgid "Multiple answers" +msgstr "Vairākas atbildes" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:122 +#, elixir-autogen, elixir-format +msgid "PDF, PPT, PPTX up to %{size} MB" +msgstr "PDF, PPT, PPTX līdz %{size} MB" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#, elixir-autogen, elixir-format +msgid "Enable messages" +msgstr "Iespējot ziņojumus" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#, elixir-autogen, elixir-format +msgid "Show messages" +msgstr "Rādīt ziņojumus" + +#: lib/claper_web/live/event_live/show.html.heex:365 +#, elixir-autogen, elixir-format +msgid "Messages deactivated" +msgstr "Ziņojumi atspējoti" + +#: lib/claper_web/live/event_live/show.html.heex:208 +#: lib/claper_web/live/event_live/show.html.heex:229 +#: lib/claper_web/live/event_live/show.html.heex:329 +#, elixir-autogen, elixir-format +msgid "Anonymous" +msgstr "Anonīms" + +#: lib/claper_web/live/event_live/show.html.heex:255 +#: lib/claper_web/templates/lti/launch/error.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Close" +msgstr "Aizvērt" + +#: lib/claper_web/live/event_live/show.html.heex:236 +#: lib/claper_web/live/event_live/show.html.heex:281 +#, elixir-autogen, elixir-format +msgid "Enter your name" +msgstr "Ievadiet savu vārdu" + +#: lib/claper_web/live/event_live/presenter.html.heex:38 +#, elixir-autogen, elixir-format +msgid "Or go to %{url} and use the code:" +msgstr "Vai arī dodieties uz %{url} un izmantojiet kodu:" + +#: lib/claper_web/live/event_live/show.html.heex:249 +#, elixir-autogen, elixir-format +msgid "Use your name" +msgstr "Izmantojiet savu vārdu" + +#: lib/claper_web/live/event_live/show.html.heex:229 +#, elixir-autogen, elixir-format +msgid "disabled" +msgstr "atspējots" + +#: lib/claper_web/controllers/user_registration_controller.ex:14 +#, elixir-autogen, elixir-format +msgid "Account creation is disabled" +msgstr "Konta izveide ir atspējota" + +#: lib/claper_web/live/event_live/manage.html.heex:261 +#, elixir-autogen, elixir-format +msgid "Add a Youtube video or any web content." +msgstr "Pievienojiet Youtube videoklipu vai jebkuru tīmekļa saturu." + +#: lib/claper_web/templates/user_reset_password/edit.html.heex:51 +#, elixir-autogen, elixir-format +msgid "Confirm new password" +msgstr "Jaunās paroles apstiprināšana" + +#: lib/claper_web/templates/user_session/new.html.heex:79 +#, elixir-autogen, elixir-format +msgid "Forgot your password?" +msgstr "Aizmirsāt paroli?" + +#: lib/claper_web/controllers/user_reset_password_controller.ex:26 +#, elixir-autogen, elixir-format +msgid "If your email is in our system, you'll receive instructions to reset your password shortly." +msgstr "Ja jūsu e-pasta adrese ir mūsu sistēmā, drīz saņemsiet norādījumus par paroles atiestatīšanu." + +#: lib/claper_web/templates/user_reset_password/edit.html.heex:42 +#, elixir-autogen, elixir-format +msgid "Password confirmation" +msgstr "Paroles apstiprināšana" + +#: lib/claper_web/controllers/user_reset_password_controller.ex:44 +#, elixir-autogen, elixir-format +msgid "Password updated successfully." +msgstr "Parole veiksmīgi atjaunināta." + +#: lib/claper_web/controllers/user_reset_password_controller.ex:59 +#, elixir-autogen, elixir-format +msgid "Reset password link is invalid or it has expired." +msgstr "Paroles atiestatīšanas saite ir nederīga vai tās derīguma termiņš ir beidzies." + +#: lib/claper_web/templates/user_reset_password/edit.html.heex:12 +#: lib/claper_web/templates/user_reset_password/new.html.heex:12 +#, elixir-autogen, elixir-format +msgid "Reset your password" +msgstr "Paroles atiestatīšana" + +#: lib/claper_web/templates/user_reset_password/new.html.heex:36 +#, elixir-autogen, elixir-format +msgid "Send link to reset password" +msgstr "Nosūtīt saiti, lai atiestatītu paroli" + +#: lib/claper_web/live/event_live/embed_component.ex:55 +#, elixir-autogen, elixir-format +msgid "Current web content" +msgstr "Pašreizējais tīmekļa saturs" + +#: lib/claper_web/live/event_live/manage.html.heex:347 +#, elixir-autogen, elixir-format +msgid "Edit web content" +msgstr "Tīmekļa satura rediģēšana" + +#: lib/claper_web/live/event_live/manage.html.heex:346 +#, elixir-autogen, elixir-format +msgid "New web content" +msgstr "Jauns tīmekļa saturs" + +#: lib/claper_web/live/event_live/embed_component.ex:32 +#, elixir-autogen, elixir-format +msgid "See current web content" +msgstr "Skatiet pašreizējo tīmekļa saturu" + +#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#, elixir-autogen, elixir-format +msgid "This will delete the web content, are you sure?" +msgstr "Tas izdzēsīs tīmekļa saturu, vai esat pārliecināti?" + +#: lib/claper_web/live/embed_live/form_component.html.heex:14 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:14 +#, elixir-autogen, elixir-format +msgid "Title" +msgstr "Nosaukums" + +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 +#, elixir-autogen, elixir-format +msgid "Web content" +msgstr "Tīmekļa saturs" + +#: lib/claper_web/live/event_live/manageable_post_component.ex:38 +#: lib/claper_web/live/event_live/manageable_post_component.ex:67 +#, elixir-autogen, elixir-format +msgid "Pin" +msgstr "Piespraust" + +#: lib/claper_web/live/event_live/post_component.ex:59 +#: lib/claper_web/live/event_live/post_component.ex:175 +#, elixir-autogen, elixir-format +msgid "Pinned" +msgstr "Piesprausts" + +#: lib/claper_web/live/event_live/manage.html.heex:1175 +#, elixir-autogen, elixir-format +msgid "Pinned messages" +msgstr "Piespraustie ziņojumi" + +#: lib/claper_web/live/event_live/manage.html.heex:1336 +#, elixir-autogen, elixir-format +msgid "Pinned messages will appear here." +msgstr "Šeit tiks rādīti piespraustie ziņojumi." + +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 +#, elixir-autogen, elixir-format +msgid "Show only pinned messages" +msgstr "Rādīt tikai piespraustos ziņojumus" + +#: lib/claper_web/live/event_live/manageable_post_component.ex:36 +#: lib/claper_web/live/event_live/manageable_post_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Unpin" +msgstr "Atspraust" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:35 +#, elixir-autogen, elixir-format +msgid "Login or create account" +msgstr "Pieslēdzieties vai izveidojiet kontu" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:22 +#, elixir-autogen, elixir-format +msgid "Someone invited you to manage the event: %{name}" +msgstr "Kāds jūs uzaicināja vadīt pasākumu: %{name}" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:25 +#, elixir-autogen, elixir-format +msgid "To accept the invitation, please login or create an account with this email: %{email}" +msgstr "Lai pieņemtu ielūgumu, lūdzu, piesakieties vai izveidojiet kontu, izmantojot šo e-pasta adresi: %{email}" + +#: lib/claper_web/templates/leader_notifier/invitation.html.heex:17 +#, elixir-autogen, elixir-format +msgid "You have been invited" +msgstr "Jūs esat uzaicināti" + +#: lib/claper_web/notifiers/leader_notifier.ex:12 +#, elixir-autogen, elixir-format +msgid "You have been invited to manage an event" +msgstr "Jūs esat uzaicināti vadīt pasākumu" + +#: lib/claper_web/live/event_live/form_component.ex:114 +#, elixir-autogen, elixir-format +msgid "Saved" +msgstr "Saglabāts" + +#: lib/claper_web/live/user_settings_live/show.html.heex:301 +#, elixir-autogen, elixir-format +msgid "All your events and files will be permanently deleted, are you sure?" +msgstr "Visi jūsu notikumi un faili tiks neatgriezeniski dzēsti, vai esat pārliecināti?" + +#: lib/claper_web/live/event_live/event_card_component.ex:183 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to terminate this event? This action cannot be undone." +msgstr "Vai esat pārliecināti, ka vēlaties pārtraukt šo notikumu? Šo darbību nevar atcelt." + +#: lib/claper_web/live/event_live/event_card_component.ex:175 +#, elixir-autogen, elixir-format +msgid "Attendees room" +msgstr "Dalībnieku telpa" + +#: lib/claper_web/live/user_settings_live/show.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Be careful, these actions are irreversible" +msgstr "Esiet uzmanīgi, šīs darbības ir neatgriezeniskas" + +#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#, elixir-autogen, elixir-format +msgid "Danger zone" +msgstr "Bīstamā zona" + +#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#, elixir-autogen, elixir-format +msgid "Delete account" +msgstr "Dzēst kontu" + +#: lib/claper_web/live/event_live/manage.html.heex:565 +#, elixir-autogen, elixir-format +msgid "Open presentation" +msgstr "Atvērt prezentāciju" + +#: lib/claper_web/live/event_live/event_card_component.ex:370 +#, elixir-autogen, elixir-format +msgid "View report" +msgstr "Apskatīt ziņojumu" + +#: lib/claper_web/controllers/user_registration_controller.ex:50 +#, elixir-autogen, elixir-format +msgid "Your account has been deleted." +msgstr "Jūsu konts ir dzēsts." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 +#, elixir-autogen, elixir-format +msgid "Access code" +msgstr "Piekļuves kods" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:84 +#, elixir-autogen, elixir-format +msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." +msgstr "Animācijas PPT/PPTX failos netiek atbalstītas, tāpēc mēs iesakām eksportēt prezentāciju PDF formātā, lai nodrošinātu tās pareizu rādīšanu." + +#: lib/claper_web/live/event_live/manage.html.heex:1147 +#, elixir-autogen, elixir-format +msgid "Attendees interactions" +msgstr "Dalībnieku mijiedarbība" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:6 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/quiz_component.ex:151 +#: lib/claper_web/live/event_live/quiz_component.ex:198 +#, elixir-autogen, elixir-format +msgid "Back" +msgstr "Atpakaļ" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 +#, elixir-autogen, elixir-format +msgid "Facilitators" +msgstr "Moderatori" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:7 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/templates/lti/registration/success.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Finish" +msgstr "Beigt" + +#: lib/claper_web/live/event_live/manage.html.heex:1149 +#, elixir-autogen, elixir-format +msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." +msgstr "Šeit atradīsiet visas dalībnieku mijiedarbības. Varat pārvaldīt ziņojumus, piespraustos ziņojumus un iesniegtās veidlapas." + +#: lib/claper_web/live/event_live/manage.html.heex:1149 +#, elixir-autogen, elixir-format +msgid "Identify users by their unique avatars." +msgstr "Identificēt lietotājus pēc viņu unikālajiem avatariem." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:5 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:176 +#: lib/claper_web/live/event_live/quiz_component.ex:161 +#: lib/claper_web/live/event_live/quiz_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Next" +msgstr "Nākamais" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:84 +#, elixir-autogen, elixir-format +msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." +msgstr "Izvēlieties prezentācijas failu. Pieņemamie formāti ir PDF, PPT vai PPTX. Pārliecinieties, ka faila lielums nepārsniedz maksimālo ierobežojumu." + +#: lib/claper_web/live/event_live/manage.html.heex:545 +#, elixir-autogen, elixir-format +msgid "Time to launch your presentation!" +msgstr "Laiks uzsākt prezentāciju!" + +#: lib/claper_web/live/event_live/manage.html.heex:1451 +#, elixir-autogen, elixir-format +msgid "Use the associated keyboard shortcuts for quick toggling of these settings." +msgstr "Lai ātri pārslēgtu šos iestatījumus, izmantojiet saistītās tastatūras īsceļus." + +#: lib/claper_web/live/event_live/manage.html.heex:1451 +#, elixir-autogen, elixir-format +msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." +msgstr "Varat kontrolēt katru iestatījumu gan prezentācijai (rādīšanai uz lielā ekrāna), gan dalībnieka istabai." + +#: lib/claper_web/live/event_live/index.html.heex:149 +#, elixir-autogen, elixir-format +msgid "Your first steps with Claper" +msgstr "Jūsu pirmie soļi ar Claper" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 +#, elixir-autogen, elixir-format +msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." +msgstr "Apmeklētāji, kas mēģinās iekļūt pasākumā pirms šī datuma, tiks novirzīti uz uzgaidāmo telpu." + +#: lib/claper_web/live/event_live/index.html.heex:167 +#, elixir-autogen, elixir-format +msgid "Create event" +msgstr "Izveidot notikumu" + +#: lib/claper_web/live/event_live/index.html.heex:225 +#, elixir-autogen, elixir-format +msgid "Create your first event" +msgstr "Izveidojiet savu pirmo notikumu" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 +#, elixir-autogen, elixir-format +msgid "Event start date" +msgstr "Pasākuma sākuma datums" + +#: lib/claper_web/live/event_live/index.html.heex:119 +#, elixir-autogen, elixir-format +msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." +msgstr "Ja jums nav laika un vēlaties mijiedarbību bez prezentācijas faila, varat šeit izveidot jaunu notikumu." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 +#, elixir-autogen, elixir-format +msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." +msgstr "Ja jums ir nepieciešama palīdzība pasākuma pārvaldībā, varat piešķirt piekļuvi citiem. Vienkārši ievadiet viņu e-pasta adreses; kad viņi reģistrēs kontu ar šiem e-pastiem, viņi varēs pārvaldīt pasākumu." + +#: lib/claper_web/live/event_live/index.html.heex:124 +#, elixir-autogen, elixir-format +msgid "In a hurry ?" +msgstr "Steidzaties?" + +#: lib/claper_web/live/event_live/event_card_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Live" +msgstr "Tiešraide" + +#: lib/claper_web/live/event_live/index.html.heex:112 +#, elixir-autogen, elixir-format +msgid "My events" +msgstr "Mani pasākumi" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 +#, elixir-autogen, elixir-format +msgid "Name of your event" +msgstr "Jūsu pasākuma nosaukums" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 +#, elixir-autogen, elixir-format +msgid "Note: Facilitators do not have the ability to delete your event." +msgstr "Piezīme: moderatoriem nav iespējas dzēst jūsu pasākumu." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:85 +#, elixir-autogen, elixir-format +msgid "Presentation file (optional)" +msgstr "Prezentācijas fails (pēc izvēles)" + +#: lib/claper_web/live/event_live/index.html.heex:142 +#, elixir-autogen, elixir-format +msgid "Quick event" +msgstr "Ātrs notikums" + +#: lib/claper_web/live/event_live/index.ex:102 +#, elixir-autogen, elixir-format +msgid "Quick event created successfully" +msgstr "Veiksmīgi izveidots ātrais notikums" + +#: lib/claper_web/live/event_live/join.html.heex:104 +#, elixir-autogen, elixir-format +msgid "Return to your last event" +msgstr "Atgriezties pie pēdējā notikuma" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 +#, elixir-autogen, elixir-format +msgid "Select the start date for your event. Future dates are permissible." +msgstr "Izvēlieties pasākuma sākuma datumu. Ir pieļaujami arī turpmākie datumi." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:88 +#, elixir-autogen, elixir-format +msgid "Select your presentation (optional)" +msgstr "Izvēlieties savu prezentāciju (pēc izvēles)" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 +#, elixir-autogen, elixir-format +msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." +msgstr "Šo kodu dalībnieki izmantos, lai piekļūtu pasākumam. Jums ir iespēja izveidot pielāgotu kodu." + +#: lib/claper_web/live/event_live/show.ex:193 +#, elixir-autogen, elixir-format +msgid "This event has been terminated" +msgstr "Šis notikums ir pārtraukts" + +#: lib/claper_web/live/event_live/index.html.heex:148 +#, elixir-autogen, elixir-format +msgid "Welcome to Claper! You can create a new event here." +msgstr "Laipni lūdzam Claper! Šeit varat izveidot jaunu notikumu." + +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 +#, elixir-autogen, elixir-format +msgid "When your event will start?" +msgstr "Kad sāksies jūsu pasākums?" + +#: lib/claper_web/live/event_live/show.html.heex:38 +#, elixir-autogen, elixir-format +msgid "Create your next presentation with" +msgstr "Izveidojiet nākamo prezentāciju, izmantojot" + +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 +#: lib/claper_web/live/event_live/show.ex:25 +#, elixir-autogen, elixir-format +msgid "Event doesn't exist" +msgstr "Notikums neeksistē" + +#: lib/claper_web/live/user_settings_live/show.html.heex:244 +#, elixir-autogen, elixir-format +msgid "Customize your account" +msgstr "Pielāgojiet savu kontu" + +#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#, elixir-autogen, elixir-format +msgid "Language" +msgstr "Valoda" + +#: lib/claper_web/live/user_settings_live/show.html.heex:241 +#, elixir-autogen, elixir-format +msgid "Preferences" +msgstr "Iestatījumi" + +#: lib/claper_web/live/user_settings_live/show.ex:180 +#, elixir-autogen, elixir-format +msgid "Your preferences have been updated." +msgstr "Jūsu iestatījumi ir atjaunināti." + +#: lib/claper_web/live/event_live/manageable_post_component.ex:29 +#, elixir-autogen, elixir-format +msgid "Question" +msgstr "Jautājums" + +#: lib/claper_web/live/event_live/manage.html.heex:1167 +#, elixir-autogen, elixir-format +msgid "Questions" +msgstr "Jautājumi" + +#: lib/claper_web/live/event_live/manage.html.heex:1254 +#, elixir-autogen, elixir-format +msgid "Questions will appear here." +msgstr "Jautājumi būs redzami šeit." + +#: lib/claper_web/live/event_live/manage.html.heex:1296 +#, elixir-autogen, elixir-format +msgid "Sort by date" +msgstr "Atlasīt pēc datuma" + +#: lib/claper_web/live/event_live/manage.html.heex:1275 +#, elixir-autogen, elixir-format +msgid "Sort by popularity" +msgstr "Atlasīt pēc popularitātes" + +#: lib/claper_web/live/event_live/event_card_component.ex:152 +#, elixir-autogen, elixir-format +msgid "Event manager" +msgstr "Pasākumu vadītājs" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 +#, elixir-autogen, elixir-format +msgid "Documentation" +msgstr "Dokumentācija" + +#: lib/claper_web/live/user_settings_live/show.html.heex:5 +#: lib/claper_web/templates/layout/_user_menu.html.heex:6 +#, elixir-autogen, elixir-format +msgid "My account" +msgstr "Mans konts" + +#: lib/claper_web/live/user_settings_live/show.html.heex:139 +#, elixir-autogen, elixir-format +msgid "Your personal informations to access your account" +msgstr "Jūsu personiskā informācija, lai piekļūtu savam kontam" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 +#, elixir-autogen, elixir-format +msgid "Enable reactions" +msgstr "Iespējot reakcijas" + +#: lib/claper_web/templates/lti/registration/success.html.heex:14 +#, elixir-autogen, elixir-format +msgid "Activate the tool in your LMS" +msgstr "Aktivizējiet rīku savā LMS" + +#: lib/claper_web/templates/lti/registration/new.html.heex:24 +#, elixir-autogen, elixir-format +msgid "Bring Claper to your LMS" +msgstr "Pievienojiet Claper savai LMS" + +#: lib/claper_web/templates/lti/registration/success.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Check the permissions to share name and email of users" +msgstr "Pārbaudiet lietotāju vārda un e-pasta kopīgošanas atļaujas" + +#: lib/claper_web/templates/lti/registration/success.html.heex:15 +#, elixir-autogen, elixir-format +msgid "Configure it to be opened in a new window" +msgstr "Konfigurējiet, lai tas tiktu atvērts jaunā logā" + +#: lib/claper_web/templates/lti/launch/error.html.heex:5 +#, elixir-autogen, elixir-format +msgid "Oops" +msgstr "Ups" + +#: lib/claper_web/templates/lti/registration/new.html.heex:27 +#, elixir-autogen, elixir-format +msgid "Register your platform" +msgstr "Reģistrējiet savu platformu" + +#: lib/claper_web/templates/lti/registration/success.html.heex:5 +#, elixir-autogen, elixir-format +msgid "Registration completed" +msgstr "Reģistrācija pabeigta" + +#: lib/claper_web/templates/lti/launch/error.html.heex:9 +#, elixir-autogen, elixir-format +msgid "You cannot perform this action" +msgstr "Šo darbību nevar veikt" + +#: lib/claper_web/templates/lti/registration/success.html.heex:10 +#, elixir-autogen, elixir-format +msgid "Your next steps" +msgstr "Nākamie soļi" + +#: lib/claper_web/templates/lti/registration/new.html.heex:40 +#, elixir-autogen, elixir-format +msgid "Add Claper" +msgstr "Pievienot Claper" + +#: lib/claper_web/live/event_live/manage.html.heex:123 +#: lib/claper_web/live/event_live/manage.html.heex:538 +#, elixir-autogen, elixir-format +msgid "Close preview" +msgstr "Aizvērt priekšskatījumu" + +#: lib/claper_web/live/event_live/manage.html.heex:734 +#, elixir-autogen, elixir-format +msgid "Create your first interaction." +msgstr "Izveidojiet pirmo mijiedarbību." + +#: lib/claper_web/live/event_live/manage.html.heex:1093 +#, elixir-autogen, elixir-format +msgid "Disable" +msgstr "Atspējot" + +#: lib/claper_web/live/event_live/manage.html.heex:1110 +#, elixir-autogen, elixir-format +msgid "Enable" +msgstr "Iespējot" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 +#, elixir-autogen, elixir-format +msgid "Enable messages to change this option" +msgstr "Iespējiet ziņojumus, lai mainītu šo opciju" + +#: lib/claper_web/live/event_live/manage.html.heex:122 +#: lib/claper_web/live/event_live/manage.html.heex:537 +#, elixir-autogen, elixir-format +msgid "Open preview" +msgstr "Atvērt priekšskatījumu" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 +#, elixir-autogen, elixir-format +msgid "Show messages to change this option" +msgstr "Rādīt ziņojumus, lai mainītu šo opciju" + +#: lib/claper_web/live/event_live/manage.html.heex:731 +#, elixir-autogen, elixir-format +msgid "This slide does not have any interactions." +msgstr "Šim slaidam nav mijiedarbības." + +#: lib/claper_web/live/user_settings_live/show.html.heex:176 +#, elixir-autogen, elixir-format +msgid "Accounts linked" +msgstr "Saistītie konti" + +#: lib/claper_web/live/user_settings_live/show.html.heex:208 +#: lib/claper_web/live/user_settings_live/show.html.heex:226 +#, elixir-autogen, elixir-format +msgid "Are you sure you want to unlink this account?" +msgstr "Vai esat pārliecināti, ka vēlaties atcelt šī konta sasaisti?" + +#: lib/claper_web/templates/user_session/new.html.heex:74 +#, elixir-autogen, elixir-format +msgid "Login with %{provider}" +msgstr "Pieteikšanās ar %{provider}" + +#: lib/claper_web/live/user_settings_live/show.ex:101 +#: lib/claper_web/live/user_settings_live/show.ex:115 +#, elixir-autogen, elixir-format +msgid "The account has been unlinked." +msgstr "Konts ir atsaistīts." + +#: lib/claper_web/live/event_live/manage.html.heex:707 +#, elixir-autogen, elixir-format +msgid "This section contains all your interactions." +msgstr "Šajā sadaļā ir iekļautas visas jūsu mijiedarbības." + +#: lib/claper_web/live/user_settings_live/show.html.heex:211 +#: lib/claper_web/live/user_settings_live/show.html.heex:229 +#, elixir-autogen, elixir-format +msgid "Unlink" +msgstr "Atsaistīt" + +#: lib/claper_web/live/event_live/manage.html.heex:707 +#, elixir-autogen, elixir-format +msgid "You can add interactions to your presentation slides." +msgstr "Prezentācijas slaidiem varat pievienot mijiedarbību." + +#: lib/claper_web/live/event_live/manage.html.heex:706 +#, elixir-autogen, elixir-format +msgid "Your interactions" +msgstr "Jūsu mijiedarbība" + +#: lib/claper_web/live/user_settings_live/show.html.heex:119 +#, elixir-autogen, elixir-format +msgid "Confirm password" +msgstr "Paroles apstiprināšana" + +#: lib/claper_web/live/user_settings_live/show.ex:68 +#, elixir-autogen, elixir-format +msgid "Set a new password" +msgstr "Jaunas paroles iestatīšana" + +#: lib/claper_web/live/user_settings_live/show.ex:71 +#, elixir-autogen, elixir-format +msgid "Set a new password for your account before unlinking it." +msgstr "Pirms konta atsaistīšanas iestatiet jaunu paroli." + +#: lib/claper_web/live/user_settings_live/show.ex:204 +#, elixir-autogen, elixir-format +msgid "Your password has been set, you can now unlink your account." +msgstr "Jūsu parole ir iestatīta, tagad varat atsaistīt kontu." + +#: lib/claper_web/live/embed_live/form_component.html.heex:34 +#, elixir-autogen, elixir-format +msgid "Iframe code" +msgstr "Iframe kods" + +#: lib/claper_web/live/embed_live/form_component.html.heex:35 +#, elixir-autogen, elixir-format +msgid "Link to the content" +msgstr "Saite uz saturu" + +#: lib/claper/embeds/embed.ex:65 +#: lib/claper/embeds/embed.ex:74 +#: lib/claper/embeds/embed.ex:83 +#: lib/claper/embeds/embed.ex:92 +#, elixir-autogen, elixir-format +msgid "Please enter a valid %{provider} link" +msgstr "Lūdzu, ievadiet derīgu %{provider} saiti" + +#: lib/claper/embeds/embed.ex:62 +#: lib/claper/embeds/embed.ex:71 +#: lib/claper/embeds/embed.ex:80 +#: lib/claper/embeds/embed.ex:89 +#, elixir-autogen, elixir-format +msgid "Please enter a valid link starting with http:// or https://" +msgstr "Lūdzu, ievadiet derīgu saiti, kas sākas ar http:// vai https://" + +#: lib/claper/embeds/embed.ex:98 +#, elixir-autogen, elixir-format +msgid "Please enter valid HTML content with an iframe tag" +msgstr "Lūdzu, ievadiet derīgu HTML saturu ar iframe tagu" + +#: lib/claper_web/live/embed_live/form_component.html.heex:23 +#, elixir-autogen, elixir-format +msgid "Provider" +msgstr "Nodrošinātājs" + +#: lib/claper_web/live/poll_live/form_component.html.heex:85 +#, elixir-autogen, elixir-format +msgid "Attendees can see the results on their device" +msgstr "Dalībnieki var redzēt rezultātus savā ierīcē" + +#: lib/claper_web/live/embed_live/form_component.html.heex:50 +#, elixir-autogen, elixir-format +msgid "Attendees can view the web content on their device" +msgstr "Apmeklētāji var skatīt tīmekļa saturu savā ierīcē" + +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 +#, elixir-autogen, elixir-format +msgid "Options" +msgstr "Iespējas" + +#: lib/claper_web/live/event_live/event_card_component.ex:268 +#: lib/claper_web/live/event_live/event_card_component.ex:418 +#, elixir-autogen, elixir-format +msgid "Duplicate" +msgstr "Dublēt" + +#: lib/claper_web/templates/error/csrf_error.html.heex:8 +#, elixir-autogen, elixir-format +msgid "A required security token was not found or was invalid." +msgstr "Nepieciešamais drošības žetons netika atrasts vai bija nederīgs." + +#: lib/claper_web/templates/error/csrf_error.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Back to Login" +msgstr "Atgriezties pie pieteikšanās" + +#: lib/claper_web/templates/error/csrf_error.html.heex:5 +#, elixir-autogen, elixir-format +msgid "CSRF Verification Failed" +msgstr "CSRF verifikācija neizdevās" + +#: lib/claper_web/templates/error/csrf_error.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Clear cookies (at least for Claper domain)" +msgstr "Notīriet sīkfailus (vismaz Claper domēnam)" + +#: lib/claper_web/templates/error/csrf_error.html.heex:20 +#, elixir-autogen, elixir-format +msgid "Ensure the URL does not contain an extra \"/\" anywhere" +msgstr "Pārliecinieties, ka URL adresē nav papildu \"/\"" + +#: lib/claper_web/templates/error/csrf_error.html.heex:23 +#, elixir-autogen, elixir-format +msgid "If the problem persists, please contact support." +msgstr "Ja problēma saglabājas, sazinieties ar atbalsta dienestu." + +#: lib/claper_web/templates/error/csrf_error.html.heex:14 +#, elixir-autogen, elixir-format +msgid "If you're continually seeing this issue, try the following:" +msgstr "Ja šī problēma atkārtojas, izmēģiniet šādu darbību:" + +#: lib/claper_web/templates/error/csrf_error.html.heex:18 +#, elixir-autogen, elixir-format +msgid "Reload the page you're trying to access (don't re-submit data)" +msgstr "Atkārtoti ielādējiet lapu, kurai mēģināt piekļūt (neveiciet atkārtotu datu nosūtīšanu)" + +#: lib/claper_web/templates/error/csrf_error.html.heex:19 +#, elixir-autogen, elixir-format +msgid "Try logging in again" +msgstr "Mēģiniet vēlreiz pieteikties" + +#: lib/claper_web/live/event_live/event_card_component.ex:201 +#, elixir-autogen, elixir-format +msgid "End" +msgstr "Izbeigt" + +#: lib/claper_web/live/event_live/event_card_component.ex:212 +#: lib/claper_web/live/event_live/event_card_component.ex:292 +#: lib/claper_web/live/event_live/event_card_component.ex:381 +#, elixir-autogen, elixir-format +msgid "More options" +msgstr "Vairāk iespēju" + +#: lib/claper_web/live/event_live/manage.ex:818 +#, elixir-autogen, elixir-format +msgid "No" +msgstr "Nē" + +#: lib/claper_web/live/event_live/manage.ex:818 +#, elixir-autogen, elixir-format +msgid "Yes" +msgstr "Jā" + +#: lib/claper_web/templates/user_notifier/confirm.html.heex:29 +#, elixir-autogen, elixir-format +msgid "CONFIRM ACCOUNT" +msgstr "APSTIPRINĀT KONTU" + +#: lib/claper_web/templates/user_notifier/confirm.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Confirm account" +msgstr "Apstiprināt kontu" + +#: lib/claper_web/notifiers/user_notifier.ex:45 +#, elixir-autogen, elixir-format +msgid "Confirmation instructions" +msgstr "Apstiprināšanas norādījumi" + +#: lib/claper_web/templates/user_notifier/reset.html.heex:29 +#, elixir-autogen, elixir-format +msgid "RESET PASSWORD" +msgstr "PAROLES ATIESTATĪŠANA" + +#: lib/claper_web/templates/user_notifier/reset.html.heex:17 +#, elixir-autogen, elixir-format +msgid "Reset password" +msgstr "Paroles atiestatīšana" + +#: lib/claper_web/notifiers/user_notifier.ex:56 +#, elixir-autogen, elixir-format +msgid "Reset password instructions" +msgstr "Paroles atiestatīšanas instrukcijas" + +#: lib/claper_web/templates/user_notifier/confirm.html.heex:22 +#, elixir-autogen, elixir-format +msgid "You can confirm your account by visiting the URL below" +msgstr "Varat apstiprināt savu kontu, apmeklējot tālāk norādīto URL adresi" + +#: lib/claper_web/templates/user_notifier/reset.html.heex:22 +#, elixir-autogen, elixir-format +msgid "You can reset your password by visiting the URL below" +msgstr "Savu paroli varat atiestatīt, apmeklējot tālāk norādīto URL adresi" + +#: lib/claper_web/templates/user_registration/confirm.html.heex:29 +#, elixir-autogen, elixir-format +msgid "back to the home page" +msgstr "atpakaļ uz sākumlapu" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 +#, elixir-autogen, elixir-format +msgid "Add Question" +msgstr "Pievienot jautājumu" + +#: lib/claper_web/live/event_live/manage.html.heex:293 +#, elixir-autogen, elixir-format +msgid "Add a quiz to test knowledge." +msgstr "Pievienojiet viktorīnu, lai pārbaudītu zināšanas." + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 +#, elixir-autogen, elixir-format +msgid "Add answer" +msgstr "Pievienot atbildi" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 +#, elixir-autogen, elixir-format +msgid "Allow anonymous messages" +msgstr "Atļaut anonīmus ziņojumus" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 +#, elixir-autogen, elixir-format +msgid "Answer %{index}" +msgstr "Atbilde %{index}" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 +#, elixir-autogen, elixir-format +msgid "Attendees" +msgstr "Dalībnieki" + +#: lib/claper_web/live/event_live/manageable_quiz_component.ex:29 +#: lib/claper_web/live/stat_live/index.html.heex:426 +#, elixir-autogen, elixir-format +msgid "Average score" +msgstr "Vidējais rezultāts" + +#: lib/claper_web/live/event_live/quiz_component.ex:60 +#, elixir-autogen, elixir-format +msgid "Current quiz" +msgstr "Pašreizējā viktorīna" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 +#, elixir-autogen, elixir-format +msgid "Deny anonymous messages" +msgstr "Aizliegt anonīmus ziņojumus" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 +#, elixir-autogen, elixir-format +msgid "Disable messages" +msgstr "Izslēgt ziņojumus" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 +#, elixir-autogen, elixir-format +msgid "Disable reactions" +msgstr "Izslēgt reakcijas" + +#: lib/claper_web/live/event_live/manage.html.heex:368 +#, elixir-autogen, elixir-format +msgid "Edit quiz" +msgstr "Rediģēt viktorīnu" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 +#, elixir-autogen, elixir-format +msgid "Hide instructions to join" +msgstr "Paslēpt pievienošanās instrukcijas" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 +#, elixir-autogen, elixir-format +msgid "Hide messages" +msgstr "Slēpt ziņojumus" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:62 +#: lib/claper_web/live/event_live/manager_settings_component.ex:112 +#, elixir-autogen, elixir-format +msgid "Hide results on presentation" +msgstr "Paslēpt rezultātus prezentācijā" + +#: lib/claper_web/live/event_live/event_form_component.html.heex:36 +#: lib/claper_web/live/event_live/index.html.heex:28 +#: lib/claper_web/live/event_live/manage.html.heex:35 +#, elixir-autogen, elixir-format +msgid "How it works ?" +msgstr "Kā tas darbojas?" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:22 +#, elixir-autogen, elixir-format +msgid "Interaction" +msgstr "Mijiedarbība" + +#: lib/claper_web/live/event_live/manage.html.heex:367 +#, elixir-autogen, elixir-format +msgid "New quiz" +msgstr "Jauna viktorīna" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 +#, elixir-autogen, elixir-format +msgid "Presentation" +msgstr "Prezentācija" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:168 +#, elixir-autogen, elixir-format +msgid "Previous" +msgstr "Iepriekšējais" + +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 +#, elixir-autogen, elixir-format +msgid "Quiz" +msgstr "Viktorīna" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#, elixir-autogen, elixir-format +msgid "Remove question" +msgstr "Noņemt jautājumu" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:144 +#, elixir-autogen, elixir-format +msgid "Review questions" +msgstr "Pārskata jautājumi" + +#: lib/claper_web/live/event_live/quiz_component.ex:41 +#, elixir-autogen, elixir-format +msgid "See current quiz" +msgstr "Skatīt pašreizējo viktorīnu" + +#: lib/claper_web/live/event_live/manage.html.heex:387 +#, elixir-autogen, elixir-format +msgid "Select presentation" +msgstr "Izvēlieties prezentāciju" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 +#, elixir-autogen, elixir-format +msgid "Show all messages" +msgstr "Rādīt visus ziņojumus" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 +#, elixir-autogen, elixir-format +msgid "Show instructions to join" +msgstr "Rādīt pievienošanās instrukcijas" + +#: lib/claper_web/live/event_live/quiz_component.ex:121 +#, elixir-autogen, elixir-format +msgid "Show results" +msgstr "Rādīt rezultātus" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:65 +#: lib/claper_web/live/event_live/manager_settings_component.ex:115 +#, elixir-autogen, elixir-format +msgid "Show results on presentation" +msgstr "Rādīt rezultātus prezentācijā" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 +#, elixir-autogen, elixir-format +msgid "This will delete all responses associated and the quiz itself, are you sure?" +msgstr "Tas izdzēsīs visas saistītās atbildes un pašu viktorīnu, vai esat pārliecināti?" + +#: lib/claper_web/live/event_live/quiz_component.ex:124 +#, elixir-autogen, elixir-format +msgid "Waiting for results..." +msgstr "Gaidām rezultātus..." + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 +#, elixir-autogen, elixir-format +msgid "Your question" +msgstr "Jūsu jautājums" + +#: lib/claper_web/live/event_live/quiz_component.ex:113 +#, elixir-autogen, elixir-format +msgid "Your score" +msgstr "Jūsu rezultāts" + +#: lib/claper_web/live/stat_live/index.html.heex:236 +#: lib/claper_web/live/stat_live/index.html.heex:298 +#: lib/claper_web/live/stat_live/index.html.heex:380 +#: lib/claper_web/live/stat_live/index.html.heex:422 +#, elixir-autogen, elixir-format +msgid "Export" +msgstr "Eksportēt" + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 +#, elixir-autogen, elixir-format +msgid "Export to QTI (XML)" +msgstr "Eksportēšana uz QTI (XML)" + +#: lib/claper_web/live/stat_live/index.html.heex:194 +#, elixir-autogen, elixir-format +msgid "Forms" +msgstr "Veidlapas" + +#: lib/claper_web/live/stat_live/index.html.heex:170 +#, elixir-autogen, elixir-format +msgid "Interactions" +msgstr "Mijiedarbība" + +#: lib/claper_web/live/stat_live/index.html.heex:338 +#, elixir-autogen, elixir-format +msgid "No form has been created" +msgstr "Nav izveidota neviena veidlapa" + +#: lib/claper_web/live/stat_live/index.html.heex:272 +#, elixir-autogen, elixir-format +msgid "No poll has been created" +msgstr "Nav izveidota neviena aptauja" + +#: lib/claper_web/live/stat_live/index.html.heex:476 +#, elixir-autogen, elixir-format +msgid "No quiz has been created" +msgstr "Nav izveidota viktorīna" + +#: lib/claper_web/live/stat_live/index.html.heex:359 +#, elixir-autogen, elixir-format +msgid "No web content has been created" +msgstr "Tīmekļa saturs nav izveidots" + +#: lib/claper_web/live/stat_live/index.html.heex:187 +#, elixir-autogen, elixir-format +msgid "Polls" +msgstr "Aptaujas" + +#: lib/claper_web/live/stat_live/index.html.heex:208 +#, elixir-autogen, elixir-format +msgid "Quizzes" +msgstr "Viktorīnas" + +#: lib/claper_web/live/stat_live/index.ex:62 +#, elixir-autogen, elixir-format +msgid "Report" +msgstr "Ziņojums" + +#: lib/claper_web/live/stat_live/index.html.heex:70 +#, elixir-autogen, elixir-format +msgid "Unique attendees" +msgstr "Unikālie apmeklētāji" + +#: lib/claper_web/live/stat_live/index.html.heex:201 +#, elixir-autogen, elixir-format +msgid "Web Content" +msgstr "Tīmekļa saturs" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 +#, elixir-autogen, elixir-format +msgid "Active" +msgstr "Aktīvs" + +#: lib/claper_web/live/event_live/index.html.heex:218 +#, elixir-autogen, elixir-format +msgid "Load more" +msgstr "Ielādēt vairāk" + +#: lib/claper_web/live/event_live/index.html.heex:195 +#, elixir-autogen, elixir-format +msgid "Shared with you" +msgstr "Kopīgots ar jums" + +#: lib/claper_web/templates/lti/registration/new.html.heex:43 +#, elixir-autogen, elixir-format +msgid "You must login to continue" +msgstr "Jums ir jāpiesakās, lai turpinātu" + +#: lib/claper/quizzes/quiz_question.ex:51 +#, elixir-autogen, elixir-format +msgid "must have at least one correct answer" +msgstr "jābūt vismaz vienai pareizai atbildei" + +#: lib/claper_web/live/event_live/manage.html.heex:547 +#, elixir-autogen, elixir-format +msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." +msgstr "Noklikšķiniet šeit, lai atvērtu prezentācijas logu. Prezentācijas logā nospiediet F, lai iespējotu pilnekrāna režīmu." + +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 +#, elixir-autogen, elixir-format +msgid "Allow anonymous submissions" +msgstr "Atļaut anonīmus iesniegumus" + +#: lib/claper_web/live/event_live/quiz_component.ex:167 +#, elixir-autogen, elixir-format +msgid "Please sign in to submit your answers" +msgstr "Lūdzu, pierakstieties, lai iesniegtu savas atbildes" + +#: lib/claper_web/live/event_live/quiz_component.ex:170 +#, elixir-autogen, elixir-format +msgid "Sign in" +msgstr "Pierakstīties" + +#: lib/claper_web/live/stat_live/index.html.heex:435 +#, elixir-autogen, elixir-format +msgid "Total submissions" +msgstr "Kopējais iesniegto pieteikumu skaits" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format, fuzzy +msgid "Actions" +msgstr "Iespējas" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Active Events" +msgstr "Aktīvs" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this event?" +msgstr "Vai esat pārliecināti, ka vēlaties atcelt šī konta sasaisti?" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this provider?" +msgstr "Vai esat pārliecināti, ka vēlaties atcelt šī konta sasaisti?" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this user?" +msgstr "Vai esat pārliecināti, ka vēlaties atcelt šī konta sasaisti?" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format, fuzzy +msgid "Audience Peak" +msgstr "Auditorijas maksimums" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format, fuzzy +msgid "Choose file" +msgstr "Mainīt failu" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format +msgid "Confirmed" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create Event" +msgstr "Izveidot notikumu" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create User" +msgstr "Izveidot" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created" +msgstr "Izveidot" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created At" +msgstr "Izveidot" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Currently running" +msgstr "Pašreizējā viktorīna" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete event" +msgstr "Dzēst" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete user" +msgstr "Dzēst" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit user" +msgstr "Rediģēt" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enter password" +msgstr "Pašreizējā parole" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format, fuzzy +msgid "Events" +msgstr "Pasākums" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format, fuzzy +msgid "Form Post" +msgstr "Veidlapas" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format, fuzzy +msgid "Inactive" +msgstr "Aktīvs" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Provider" +msgstr "Nodrošinātājs" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Providers" +msgstr "Nodrošinātājs" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider updated successfully" +msgstr "Parole veiksmīgi atjaunināta." + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "" + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select an option" +msgstr "Izvēlieties vienu iespēju" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format, fuzzy +msgid "User updated successfully" +msgstr "Parole veiksmīgi atjaunināta." + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format, fuzzy +msgid "View provider" +msgstr "Apskatīt ziņojumu" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format, fuzzy +msgid "attendees" +msgstr "dalībnieku" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format +msgid "Back to events" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "Back to providers" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format +msgid "Back to users" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format +msgid "New provider" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format +msgid "New user" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format +msgid "No providers found" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format +msgid "Provider deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Nodrošinātājs" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirm email change" +msgstr "Apstiprināt e-pastu" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format, fuzzy +msgid "If you didn't request an email change, please ignore this." +msgstr "Ja neesat izveidojuši mūsu kontu, lūdzu, ignorējiet šo informāciju." + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "You can confirm your email change by visiting the URL below" +msgstr "Savu e-pasta adresi varat mainīt, apmeklējot tālāk norādīto URL adresi" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "Slēpt dalībnieku skaitu" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show attendee count" +msgstr "Rādīt dalībnieku skaitu" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "Obligāti aizpildāms" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "(pēc izvēles)" diff --git a/priv/gettext/lv/LC_MESSAGES/errors.po b/priv/gettext/lv/LC_MESSAGES/errors.po new file mode 100644 index 0000000..2efc0fc --- /dev/null +++ b/priv/gettext/lv/LC_MESSAGES/errors.po @@ -0,0 +1,90 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: POEditor.com\n" +"Project-Id-Version: Claper\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==0 || n%100>=11 && n%100<=19) ? 0 : ((n%10==1 && n%100 != 11) ? 1 : 2);\n" + +msgid "can't be blank" +msgstr "nedrīkst būt tukšs" + +msgid "has already been taken" +msgstr "jau ir aizņemts" + +msgid "is invalid" +msgstr "ir nederīgs" + +msgid "must be accepted" +msgstr "jābūt pieņemtam" + +msgid "has invalid format" +msgstr "ir nederīgs formāts" + +msgid "has an invalid entry" +msgstr "ir nederīgs ieraksts" + +msgid "is reserved" +msgstr "ir rezervēts" + +msgid "does not match confirmation" +msgstr "neatbilst apstiprinājumam" + +msgid "is still associated with this entry" +msgstr "joprojām ir saistīts ar šo ierakstu" + +msgid "are still associated with this entry" +msgstr "joprojām ir saistīti ar šo ierakstu" + +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "jābūt %{count} rakstzīmju" +msgstr[1] "jābūt %{count} rakstzīmei" +msgstr[2] "jābūt %{count} rakstzīmēm" + +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "jābūt %{count} vienību" +msgstr[1] "jābūt %{count} vienībai" +msgstr[2] "jābūt %{count} vienībām" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "jābūt vismaz %{count} rakstzīmju" +msgstr[1] "jābūt vismaz %{count} rakstzīmei" +msgstr[2] "jābūt vismaz %{count} rakstzīmēm" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "jābūt vismaz %{count} vienību" +msgstr[1] "jābūt vismaz %{count} vienībai" +msgstr[2] "jābūt vismaz %{count} vienībām" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "jābūt ne vairāk kā %{count} rakstzīmju" +msgstr[1] "jābūt ne vairāk kā %{count} rakstzīmei" +msgstr[2] "jābūt ne vairāk kā %{count} rakstzīmēm" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "jābūt ne vairāk kā %{count} vienību" +msgstr[1] "jābūt ne vairāk kā %{count} vienībai" +msgstr[2] "jābūt ne vairāk kā %{count} vienībām" + +msgid "must be less than %{number}" +msgstr "jābūt mazākam par %{number}" + +msgid "must be greater than %{number}" +msgstr "jābūt lielākam par %{number}" + +msgid "must be less than or equal to %{number}" +msgstr "jābūt mazākam vai vienādam ar %{number}" + +msgid "must be greater than or equal to %{number}" +msgstr "jābūt lielākam vai vienādam ar %{number}" + +msgid "must be equal to %{number}" +msgstr "jābūt vienādam ar %{number}" diff --git a/priv/gettext/nl/LC_MESSAGES/default.po b/priv/gettext/nl/LC_MESSAGES/default.po index 110960d..4a59930 100644 --- a/priv/gettext/nl/LC_MESSAGES/default.po +++ b/priv/gettext/nl/LC_MESSAGES/default.po @@ -8,15 +8,18 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: lib/claper_web/live/event_live/manage.html.heex:1457 -#: lib/claper_web/live/event_live/manage.html.heex:1463 +#: lib/claper_web/live/event_live/manage.html.heex:1449 +#: lib/claper_web/live/event_live/manage.html.heex:1455 #: lib/claper_web/live/user_settings_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Settings" msgstr "Instellingen" -#: lib/claper_web/live/event_live/manage.ex:815 -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:74 +#: lib/claper_web/live/admin_live/user_live.html.heex:254 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:18 +#: lib/claper_web/live/event_live/manage.ex:838 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:34 #: lib/claper_web/templates/user_registration/new.html.heex:29 #: lib/claper_web/templates/user_reset_password/new.html.heex:28 @@ -43,7 +46,10 @@ msgstr "Oeps, controleer of alle velden correct zijn ingevuld." msgid "Change" msgstr "Aanpassen" -#: lib/claper_web/live/event_live/event_form_component.html.heex:287 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:83 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:32 +#: lib/claper_web/live/event_live/event_form_component.html.heex:309 #, elixir-autogen, elixir-format msgid "Code" msgstr "Code" @@ -54,7 +60,7 @@ msgstr "Code" msgid "Email address" msgstr "E-mailadres" -#: lib/claper_web/templates/layout/_user_menu.html.heex:16 +#: lib/claper_web/templates/layout/_user_menu.html.heex:23 #, elixir-autogen, elixir-format msgid "Logout" msgstr "Uitloggen" @@ -97,15 +103,18 @@ msgstr "Wees de eerste die reageert!" #: lib/claper_web/live/event_live/event_card_component.ex:111 #: lib/claper_web/live/event_live/join.ex:41 #: lib/claper_web/live/event_live/join.html.heex:94 -#: lib/claper_web/live/event_live/manage.html.heex:493 +#: lib/claper_web/live/event_live/manage.html.heex:492 #: lib/claper_web/live/event_live/show.html.heex:286 #, elixir-autogen, elixir-format msgid "Join" msgstr "Meedoen" -#: lib/claper_web/live/event_live/index.ex:212 +#: lib/claper_web/live/admin_live/dashboard_live.ex:22 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:3 +#: lib/claper_web/live/event_live/index.ex:223 #: lib/claper_web/live/event_live/join.html.heex:31 #: lib/claper_web/live/event_live/join.html.heex:54 +#: lib/claper_web/templates/layout/admin.html.heex:198 #, elixir-autogen, elixir-format msgid "Dashboard" msgstr "Dashboard" @@ -122,7 +131,7 @@ msgid "seconds" msgstr "seconden" #: lib/claper_web/live/event_live/event_card_component.ex:60 -#: lib/claper_web/live/event_live/index.html.heex:186 +#: lib/claper_web/live/event_live/index.html.heex:187 #, elixir-autogen, elixir-format msgid "Finished" msgstr "Afgerond" @@ -175,47 +184,50 @@ msgstr "Terug" msgid "Created successfully" msgstr "Succesvol aangemaakt" +#: lib/claper_web/live/admin_live/event_live.html.heex:259 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:240 +#: lib/claper_web/live/admin_live/user_live.html.heex:240 #: lib/claper_web/live/event_live/event_card_component.ex:250 #: lib/claper_web/live/event_live/event_card_component.ex:330 #: lib/claper_web/live/event_live/form_component.ex:97 -#: lib/claper_web/live/event_live/index.ex:193 +#: lib/claper_web/live/event_live/index.ex:204 #, elixir-autogen, elixir-format msgid "Edit" msgstr "Bewerken" -#: lib/claper_web/live/embed_live/form_component.html.heex:69 +#: lib/claper_web/live/embed_live/form_component.html.heex:63 #: lib/claper_web/live/event_live/event_form_component.html.heex:55 #: lib/claper_web/live/event_live/event_form_component.html.heex:62 -#: lib/claper_web/live/event_live/index.ex:202 -#: lib/claper_web/live/event_live/index.html.heex:93 -#: lib/claper_web/live/form_live/form_component.html.heex:98 -#: lib/claper_web/live/poll_live/form_component.html.heex:106 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 +#: lib/claper_web/live/event_live/index.ex:213 +#: lib/claper_web/live/event_live/index.html.heex:94 +#: lib/claper_web/live/form_live/form_component.html.heex:93 +#: lib/claper_web/live/poll_live/form_component.html.heex:102 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:187 #, elixir-autogen, elixir-format msgid "Create" msgstr "Aanmaken" -#: lib/claper_web/live/embed_live/form_component.html.heex:74 +#: lib/claper_web/live/embed_live/form_component.html.heex:68 #: lib/claper_web/live/event_live/event_card_component.ex:444 #: lib/claper_web/live/event_live/event_form_component.html.heex:67 -#: lib/claper_web/live/event_live/manage.html.heex:1405 +#: lib/claper_web/live/event_live/manage.html.heex:1397 #: lib/claper_web/live/event_live/manageable_post_component.ex:92 #: lib/claper_web/live/event_live/post_component.ex:70 #: lib/claper_web/live/event_live/post_component.ex:142 -#: lib/claper_web/live/form_live/form_component.html.heex:103 -#: lib/claper_web/live/poll_live/form_component.html.heex:111 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:129 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:199 +#: lib/claper_web/live/form_live/form_component.html.heex:98 +#: lib/claper_web/live/poll_live/form_component.html.heex:107 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:123 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:193 #, elixir-autogen, elixir-format msgid "Delete" msgstr "Verwijderen" -#: lib/claper_web/live/embed_live/form_component.html.heex:70 +#: lib/claper_web/live/embed_live/form_component.html.heex:64 #: lib/claper_web/live/event_live/event_form_component.html.heex:54 #: lib/claper_web/live/event_live/event_form_component.html.heex:61 -#: lib/claper_web/live/form_live/form_component.html.heex:99 -#: lib/claper_web/live/poll_live/form_component.html.heex:107 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:194 +#: lib/claper_web/live/form_live/form_component.html.heex:94 +#: lib/claper_web/live/poll_live/form_component.html.heex:103 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:188 #: lib/claper_web/live/user_settings_live/show.html.heex:38 #: lib/claper_web/live/user_settings_live/show.html.heex:80 #: lib/claper_web/live/user_settings_live/show.html.heex:123 @@ -259,12 +271,6 @@ msgstr "E-mailinstructies bijwerken" msgid "CONFIRM EMAIL" msgstr "BEVESTIG E-MAIL" -#: lib/claper_web/templates/user_notifier/change.html.heex:17 -#, elixir-autogen, elixir-format -msgid "Confirm email" -msgstr "Bevestig e-mail" - -#: lib/claper_web/templates/user_notifier/change.html.heex:32 #: lib/claper_web/templates/user_notifier/confirm.html.heex:32 #: lib/claper_web/templates/user_notifier/magic.html.heex:32 #: lib/claper_web/templates/user_notifier/reset.html.heex:32 @@ -295,9 +301,9 @@ msgid "Presentation uploaded" msgstr "Presentatie geupload" #: lib/claper_web/live/event_live/event_form_component.html.heex:163 -#: lib/claper_web/live/event_live/event_form_component.html.heex:241 -#: lib/claper_web/live/event_live/event_form_component.html.heex:369 -#: lib/claper_web/live/event_live/event_form_component.html.heex:393 +#: lib/claper_web/live/event_live/event_form_component.html.heex:261 +#: lib/claper_web/live/event_live/event_form_component.html.heex:391 +#: lib/claper_web/live/event_live/event_form_component.html.heex:415 #, elixir-autogen, elixir-format msgid "Remove" msgstr "Verwijderen" @@ -332,17 +338,17 @@ msgstr "Het bestand is te groot" msgid "Change file" msgstr "Bestand aanpassen" -#: lib/claper_web/live/event_live/event_form_component.html.heex:228 +#: lib/claper_web/live/event_live/event_form_component.html.heex:238 #, elixir-autogen, elixir-format msgid "Presentation replaced" msgstr "Presentatie vervangen" -#: lib/claper_web/live/event_live/manage.html.heex:306 +#: lib/claper_web/live/event_live/manage.html.heex:305 #, elixir-autogen, elixir-format msgid "Edit poll" msgstr "Peiling bewerken" -#: lib/claper_web/live/event_live/manage.html.heex:305 +#: lib/claper_web/live/event_live/manage.html.heex:304 #, elixir-autogen, elixir-format msgid "New poll" msgstr "Nieuwe peiling" @@ -357,18 +363,18 @@ msgstr "Titel van de peiling" msgid "Upload failed" msgstr "Uploaden mislukt" -#: lib/claper_web/live/event_live/manage.html.heex:198 +#: lib/claper_web/live/event_live/manage.html.heex:197 #, elixir-autogen, elixir-format msgid "Add poll to know opinion of your public." msgstr "Voeg een peiling toe om achter de mening van het publiek te komen." -#: lib/claper_web/live/event_live/manage.html.heex:195 -#: lib/claper_web/live/event_live/manage.html.heex:786 +#: lib/claper_web/live/event_live/manage.html.heex:194 +#: lib/claper_web/live/event_live/manage.html.heex:780 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Peiling" -#: lib/claper_web/live/poll_live/form_component.html.heex:30 +#: lib/claper_web/live/poll_live/form_component.html.heex:26 #, elixir-format, ex-autogen, elixir-autogen msgid "Choice %{count}" msgid_plural "Choice %{count}" @@ -391,18 +397,18 @@ msgstr "Bekijk huidige peiling" msgid "Vote" msgstr "Stemmen" -#: lib/claper_web/live/event_live/event_form_component.html.heex:358 -#: lib/claper_web/live/event_live/event_form_component.html.heex:376 +#: lib/claper_web/live/event_live/event_form_component.html.heex:380 +#: lib/claper_web/live/event_live/event_form_component.html.heex:398 #, elixir-autogen, elixir-format msgid "User email address" msgstr "E-mailadres van gebruiker" -#: lib/claper_web/live/event_live/event_form_component.html.heex:207 +#: lib/claper_web/live/event_live/event_form_component.html.heex:217 #, elixir-autogen, elixir-format msgid "Changing your file will remove all interaction elements like polls associated." msgstr "Als je het bestand wijzigt, worden alle bijbehorende interactie-elementen, zoals peilingen, verwijderd." -#: lib/claper_web/live/event_live/manage.html.heex:1221 +#: lib/claper_web/live/event_live/manage.html.heex:1213 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "Hier verschijnen berichten van deelnemers." @@ -412,7 +418,7 @@ msgstr "Hier verschijnen berichten van deelnemers." msgid "Processing your file..." msgstr "Bestand verwerken..." -#: lib/claper_web/live/poll_live/form_component.html.heex:118 +#: lib/claper_web/live/poll_live/form_component.html.heex:114 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the poll itself, are you sure?" msgstr "Hierdoor worden alle bijbehorende reacties en de peiling verwijderd. Weet je het zeker?" @@ -422,14 +428,14 @@ msgstr "Hierdoor worden alle bijbehorende reacties en de peiling verwijderd. Wee msgid "Ask, comment..." msgstr "Vraag, reageer..." -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1159 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format msgid "Messages" msgstr "Berichten" -#: lib/claper_web/live/event_live/event_form_component.html.heex:341 +#: lib/claper_web/live/event_live/event_form_component.html.heex:363 #, elixir-autogen, elixir-format msgid "Add facilitator" msgstr "Facilitator toevoegen" @@ -444,7 +450,7 @@ msgstr "Oeps, pagina bestaat niet." msgid "The site is under maintenance, we'll be back very soon!" msgstr "Er wordt aan de site gewerkt, we komen snel terug!" -#: lib/claper_web/live/event_live/event_form_component.html.heex:320 +#: lib/claper_web/live/event_live/event_form_component.html.heex:342 #, elixir-autogen, elixir-format msgid "Facilitators can present and manage interactions" msgstr "Facilitators kunnen interacties presenteren en beheren" @@ -458,13 +464,8 @@ msgstr "Facilitators kunnen interacties presenteren en beheren" msgid "If you’re having trouble with the button above, copy and paste the URL below into your web browser" msgstr "Als je problemen ondervindt met de bovenstaande knop, kopieer en plak dan de onderstaande URL in de webbrowser" -#: lib/claper_web/templates/user_notifier/change.html.heex:22 -#, elixir-autogen, elixir-format -msgid "You can change your email by visiting the URL below" -msgstr "Je kunt het e-mailadres wijzigen door naar de onderstaande URL te gaan" - -#: lib/claper_web/live/event_live/manage.html.heex:759 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:750 +#: lib/claper_web/live/event_live/manage.html.heex:1124 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "Voeg interactie toe" @@ -622,6 +623,7 @@ msgstr "Of gebruik de code:" msgid "Create account" msgstr "Account aanmaken" +#: lib/claper_web/live/admin_live/user_live/form_component.ex:32 #: lib/claper_web/live/user_settings_live/show.html.heex:161 #: lib/claper_web/templates/user_registration/new.html.heex:37 #: lib/claper_web/templates/user_reset_password/edit.html.heex:34 @@ -657,14 +659,14 @@ msgstr "Update jouw wachtwoord" msgid "Your password has been updated." msgstr "Het wachtwoord is bijgewerkt." -#: lib/claper_web/live/form_live/form_component.html.heex:30 +#: lib/claper_web/live/form_live/form_component.html.heex:26 #, elixir-autogen, elixir-format msgid "Field %{count}" msgid_plural "Field %{count}" msgstr[0] "Veld %{count}" msgstr[1] "Velden %{count}" -#: lib/claper_web/live/event_live/manage.html.heex:231 +#: lib/claper_web/live/event_live/manage.html.heex:230 #, elixir-autogen, elixir-format msgid "Add form to collect data from your public." msgstr "Voeg een formulier toe om gegevens van het publiek te verzamelen." @@ -674,34 +676,41 @@ msgstr "Voeg een formulier toe om gegevens van het publiek te verzamelen." msgid "Current form" msgstr "Huidig formulier" -#: lib/claper_web/live/event_live/manage.html.heex:327 +#: lib/claper_web/live/event_live/manage.html.heex:326 #, elixir-autogen, elixir-format msgid "Edit form" msgstr "Formulier bewerken" -#: lib/claper_web/live/event_live/manage.html.heex:228 -#: lib/claper_web/live/event_live/manage.html.heex:830 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:227 +#: lib/claper_web/live/event_live/manage.html.heex:824 +#: lib/claper_web/live/event_live/manage.html.heex:1409 #, elixir-autogen, elixir-format msgid "Form" msgstr "Formulier" -#: lib/claper_web/live/event_live/manage.html.heex:1191 +#: lib/claper_web/live/event_live/manage.html.heex:1183 #, elixir-autogen, elixir-format msgid "Form submissions" msgstr "Formulierinzendingen" -#: lib/claper_web/live/event_live/manage.html.heex:1390 +#: lib/claper_web/live/event_live/manage.html.heex:1382 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "Formulierinzendingen van deelnemers worden hier weergegeven." -#: lib/claper_web/live/event_live/manage.ex:814 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:106 +#: lib/claper_web/live/admin_live/event_live.html.heex:74 +#: lib/claper_web/live/admin_live/event_live.html.heex:273 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:19 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:254 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24 +#: lib/claper_web/live/event_live/manage.ex:837 #, elixir-autogen, elixir-format msgid "Name" msgstr "Naam" -#: lib/claper_web/live/event_live/manage.html.heex:326 +#: lib/claper_web/live/event_live/manage.html.heex:325 #, elixir-autogen, elixir-format msgid "New form" msgstr "Nieuw formulier" @@ -722,17 +731,17 @@ msgstr "Bekijk huidig formulier" msgid "Submit" msgstr "Indienen" -#: lib/claper_web/live/form_live/form_component.html.heex:37 +#: lib/claper_web/live/form_live/form_component.html.heex:32 #, elixir-autogen, elixir-format msgid "Text" msgstr "Tekst" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1402 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Dit kan niet ongedaan worden gemaakt. Bevestigen ?" -#: lib/claper_web/live/form_live/form_component.html.heex:110 +#: lib/claper_web/live/form_live/form_component.html.heex:105 #, elixir-autogen, elixir-format msgid "This will delete all responses associated and the form itself, are you sure?" msgstr "Hiermee worden alle bijbehorende reacties en het formulier zelf verwijderd. Weet je het zeker?" @@ -742,7 +751,7 @@ msgstr "Hiermee worden alle bijbehorende reacties en het formulier zelf verwijde msgid "Title of your form" msgstr "Titel van uw formulier" -#: lib/claper_web/live/form_live/form_component.html.heex:40 +#: lib/claper_web/live/form_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Type" msgstr "Type" @@ -757,7 +766,7 @@ msgstr "Selecteer een optie" msgid "Select one or multiple options" msgstr "Selecteer een of meerdere opties" -#: lib/claper_web/live/poll_live/form_component.html.heex:96 +#: lib/claper_web/live/poll_live/form_component.html.heex:92 #, elixir-autogen, elixir-format msgid "Multiple answers" msgstr "Meerdere antwoorden" @@ -767,12 +776,12 @@ msgstr "Meerdere antwoorden" msgid "PDF, PPT, PPTX up to %{size} MB" msgstr "PDF, PPT, PPTX tot %{size} MB" -#: lib/claper_web/live/event_live/manager_settings_component.ex:426 +#: lib/claper_web/live/event_live/manager_settings_component.ex:482 #, elixir-autogen, elixir-format msgid "Enable messages" msgstr "Schakel berichten in" -#: lib/claper_web/live/event_live/manager_settings_component.ex:304 +#: lib/claper_web/live/event_live/manager_settings_component.ex:305 #, elixir-autogen, elixir-format msgid "Show messages" msgstr "Toon berichten" @@ -821,7 +830,7 @@ msgstr "uitgeschakeld" msgid "Account creation is disabled" msgstr "Het aanmaken van een account is uitgeschakeld" -#: lib/claper_web/live/event_live/manage.html.heex:262 +#: lib/claper_web/live/event_live/manage.html.heex:261 #, elixir-autogen, elixir-format msgid "Add a Youtube video or any web content." msgstr "Voeg een YouTube-video of andere webinhoud toe." @@ -872,12 +881,12 @@ msgstr "Link verzenden om wachtwoord opnieuw in te stellen" msgid "Current web content" msgstr "Huidige webinhoud" -#: lib/claper_web/live/event_live/manage.html.heex:348 +#: lib/claper_web/live/event_live/manage.html.heex:347 #, elixir-autogen, elixir-format msgid "Edit web content" msgstr "Webinhoud bewerken" -#: lib/claper_web/live/event_live/manage.html.heex:347 +#: lib/claper_web/live/event_live/manage.html.heex:346 #, elixir-autogen, elixir-format msgid "New web content" msgstr "Nieuwe webinhoud" @@ -887,7 +896,7 @@ msgstr "Nieuwe webinhoud" msgid "See current web content" msgstr "Bekijk huidige webinhoud" -#: lib/claper_web/live/embed_live/form_component.html.heex:80 +#: lib/claper_web/live/embed_live/form_component.html.heex:74 #, elixir-autogen, elixir-format msgid "This will delete the web content, are you sure?" msgstr "Hiermee wordt de webinhoud verwijderd. Weet je het zeker?" @@ -898,8 +907,8 @@ msgstr "Hiermee wordt de webinhoud verwijderd. Weet je het zeker?" msgid "Title" msgstr "Titel" -#: lib/claper_web/live/event_live/manage.html.heex:260 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:259 +#: lib/claper_web/live/event_live/manage.html.heex:866 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Webinhoud" @@ -916,17 +925,17 @@ msgstr "Vastzetten" msgid "Pinned" msgstr "Vastgezet" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1175 #, elixir-autogen, elixir-format msgid "Pinned messages" msgstr "Vastgezette berichten" -#: lib/claper_web/live/event_live/manage.html.heex:1344 +#: lib/claper_web/live/event_live/manage.html.heex:1336 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "Hier verschijnen vastgezette berichten." -#: lib/claper_web/live/event_live/manager_settings_component.ex:359 +#: lib/claper_web/live/event_live/manager_settings_component.ex:360 #, elixir-autogen, elixir-format msgid "Show only pinned messages" msgstr "Toon alleen vastgezette berichten" @@ -967,7 +976,7 @@ msgstr "Je bent uitgenodigd om een evenement te beheren" msgid "Saved" msgstr "Opgeslagen" -#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:301 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "Al jouw evenementen en bestanden worden definitief verwijderd. Weet je dat zeker?" @@ -982,22 +991,22 @@ msgstr "Weet je zeker dat je dit evenement wil stoppen? Deze actie kan niet onge msgid "Attendees room" msgstr "Deelnemers ruimte" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:291 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "Wees voorzichtig, deze acties zijn onomkeerbaar" -#: lib/claper_web/live/user_settings_live/show.html.heex:275 +#: lib/claper_web/live/user_settings_live/show.html.heex:288 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Gevarenzone" -#: lib/claper_web/live/user_settings_live/show.html.heex:284 +#: lib/claper_web/live/user_settings_live/show.html.heex:297 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "Account verwijderen" -#: lib/claper_web/live/event_live/manage.html.heex:566 +#: lib/claper_web/live/event_live/manage.html.heex:565 #, elixir-autogen, elixir-format msgid "Open presentation" msgstr "Presentatie openen" @@ -1012,7 +1021,7 @@ msgstr "Bekijk rapport" msgid "Your account has been deleted." msgstr "Je account is verwijderd." -#: lib/claper_web/live/event_live/event_form_component.html.heex:279 +#: lib/claper_web/live/event_live/event_form_component.html.heex:301 #, elixir-autogen, elixir-format, fuzzy msgid "Access code" msgstr "Toegangscode" @@ -1022,46 +1031,46 @@ msgstr "Toegangscode" msgid "Animations in PPT/PPTX files are not supported, which is why we recommend exporting your presentation to PDF to ensure it displays correctly." msgstr "Animaties in PPT/PPTX-bestanden worden niet ondersteund. Daarom raden wij je aan de presentatie naar PDF te exporteren om er zeker van te zijn dat deze correct wordt weergegeven." -#: lib/claper_web/live/event_live/manage.html.heex:1155 +#: lib/claper_web/live/event_live/manage.html.heex:1147 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "Interacties van deelnemers" #: lib/claper_web/live/event_live/event_form_component.html.heex:6 -#: lib/claper_web/live/event_live/index.html.heex:106 -#: lib/claper_web/live/event_live/manage.html.heex:429 +#: lib/claper_web/live/event_live/index.html.heex:107 +#: lib/claper_web/live/event_live/manage.html.heex:428 #: lib/claper_web/live/event_live/quiz_component.ex:151 #: lib/claper_web/live/event_live/quiz_component.ex:198 #, elixir-autogen, elixir-format msgid "Back" msgstr "Terug" -#: lib/claper_web/live/event_live/event_form_component.html.heex:314 +#: lib/claper_web/live/event_live/event_form_component.html.heex:336 #, elixir-autogen, elixir-format, fuzzy msgid "Facilitators" msgstr "Facilitators" #: lib/claper_web/live/event_live/event_form_component.html.heex:7 -#: lib/claper_web/live/event_live/index.html.heex:107 -#: lib/claper_web/live/event_live/manage.html.heex:430 +#: lib/claper_web/live/event_live/index.html.heex:108 +#: lib/claper_web/live/event_live/manage.html.heex:429 #: lib/claper_web/templates/lti/registration/success.html.heex:26 #, elixir-autogen, elixir-format, fuzzy msgid "Finish" msgstr "Finish" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Here you'll find all interactions from your attendees. You can manage messages, pinned messages, and submitted forms." msgstr "Hier vind je alle interacties van je bezoekers. Je kunt berichten, vastgezette berichten en verzonden formulieren beheren." -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1149 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identificeer gebruikers aan de hand van hun unieke avatars." #: lib/claper_web/live/event_live/event_form_component.html.heex:5 -#: lib/claper_web/live/event_live/index.html.heex:105 -#: lib/claper_web/live/event_live/manage.html.heex:428 +#: lib/claper_web/live/event_live/index.html.heex:106 +#: lib/claper_web/live/event_live/manage.html.heex:427 #: lib/claper_web/live/event_live/manager_settings_component.ex:176 #: lib/claper_web/live/event_live/quiz_component.ex:161 #: lib/claper_web/live/event_live/quiz_component.ex:209 @@ -1074,57 +1083,57 @@ msgstr "Volgende" msgid "Select your presentation file. Accepted formats are PDF, PPT, or PPTX. Ensure the file size does not exceed the maximum limit." msgstr "Selecteer het Presentatie. Geaccepteerde formaten zijn PDF, PPT of PPTX. Zorg ervoor dat de bestandsgrootte de maximale limiet niet overschrijdt." -#: lib/claper_web/live/event_live/manage.html.heex:546 +#: lib/claper_web/live/event_live/manage.html.heex:545 #, elixir-autogen, elixir-format, fuzzy msgid "Time to launch your presentation!" msgstr "Tijd om je presentatie te starten!" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "Use the associated keyboard shortcuts for quick toggling of these settings." msgstr "Gebruik de bijbehorende sneltoetsen om snel tussen deze instellingen te schakelen." -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1451 #, elixir-autogen, elixir-format msgid "You can control each setting for the presentation (showing on the big screen) and on the attendee's room." msgstr "Je kunt elke instelling voor de presentatie (weergave op het grote scherm) en in de ruimte van de deelnemer beheren." -#: lib/claper_web/live/event_live/index.html.heex:148 +#: lib/claper_web/live/event_live/index.html.heex:149 #, elixir-autogen, elixir-format msgid "Your first steps with Claper" msgstr "Je eerste stappen met Claper" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees attempting to access the event prior to this date will be directed to a waiting room." msgstr "Bezoekers die voor deze datum proberen toegang te krijgen tot het evenement, worden doorverwezen naar een wachtkamer." -#: lib/claper_web/live/event_live/index.html.heex:166 +#: lib/claper_web/live/event_live/index.html.heex:167 #, elixir-autogen, elixir-format, fuzzy msgid "Create event" msgstr "Evenement aanmaken" -#: lib/claper_web/live/event_live/index.html.heex:224 +#: lib/claper_web/live/event_live/index.html.heex:225 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first event" msgstr "Maak je eerste evenement aan" -#: lib/claper_web/live/event_live/event_form_component.html.heex:294 +#: lib/claper_web/live/event_live/event_form_component.html.heex:316 #, elixir-autogen, elixir-format msgid "Event start date" msgstr "Startdatum evenement" -#: lib/claper_web/live/event_live/index.html.heex:118 +#: lib/claper_web/live/event_live/index.html.heex:119 #, elixir-autogen, elixir-format msgid "If you don't have time and just want interactions without a presentation file, you can create a new event here." msgstr "Als je geen tijd heeft en alleen interacties wilt zonder een Presentatie, kun je hier een nieuw evenement aanmaken." -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format, fuzzy msgid "If you require assistance in managing your event, you can grant access to others. Simply enter their email addresses; once they register an account with these emails, they will be able to manage the event." msgstr "Als je hulp nodig hebt bij het beheren van uw evenement, kunt je anderen toegang verlenen. Voer eenvoudig hun e-mailadressen in; zodra ze een account registreren met deze e-mails, kunnen ze het evenement beheren." -#: lib/claper_web/live/event_live/index.html.heex:123 +#: lib/claper_web/live/event_live/index.html.heex:124 #, elixir-autogen, elixir-format msgid "In a hurry ?" msgstr "Heb je haast ?" @@ -1134,18 +1143,18 @@ msgstr "Heb je haast ?" msgid "Live" msgstr "Live" -#: lib/claper_web/live/event_live/index.html.heex:111 +#: lib/claper_web/live/event_live/index.html.heex:112 #, elixir-autogen, elixir-format msgid "My events" msgstr "Mijn evenementen" -#: lib/claper_web/live/event_live/event_form_component.html.heex:271 -#: lib/claper_web/live/event_live/index.html.heex:86 +#: lib/claper_web/live/event_live/event_form_component.html.heex:291 +#: lib/claper_web/live/event_live/index.html.heex:83 #, elixir-autogen, elixir-format, fuzzy msgid "Name of your event" msgstr "Naam van je evenement" -#: lib/claper_web/live/event_live/event_form_component.html.heex:315 +#: lib/claper_web/live/event_live/event_form_component.html.heex:337 #, elixir-autogen, elixir-format, fuzzy msgid "Note: Facilitators do not have the ability to delete your event." msgstr "Let op: Facilitators hebben niet de mogelijkheid om je evenement te verwijderen." @@ -1155,12 +1164,12 @@ msgstr "Let op: Facilitators hebben niet de mogelijkheid om je evenement te verw msgid "Presentation file (optional)" msgstr "Presentatie (optioneel)" -#: lib/claper_web/live/event_live/index.html.heex:141 +#: lib/claper_web/live/event_live/index.html.heex:142 #, elixir-autogen, elixir-format msgid "Quick event" msgstr "Snel evenement" -#: lib/claper_web/live/event_live/index.ex:91 +#: lib/claper_web/live/event_live/index.ex:102 #, elixir-autogen, elixir-format msgid "Quick event created successfully" msgstr "Snel evenement succesvol aangemaakt" @@ -1170,7 +1179,7 @@ msgstr "Snel evenement succesvol aangemaakt" msgid "Return to your last event" msgstr "Keer terug naar je laatste evenement" -#: lib/claper_web/live/event_live/event_form_component.html.heex:295 +#: lib/claper_web/live/event_live/event_form_component.html.heex:317 #, elixir-autogen, elixir-format, fuzzy msgid "Select the start date for your event. Future dates are permissible." msgstr "Selecteer de startdatum voor het evenement. Toekomstige data zijn toegestaan." @@ -1180,22 +1189,22 @@ msgstr "Selecteer de startdatum voor het evenement. Toekomstige data zijn toeges msgid "Select your presentation (optional)" msgstr "Selecteer de presentatie (optioneel)" -#: lib/claper_web/live/event_live/event_form_component.html.heex:280 +#: lib/claper_web/live/event_live/event_form_component.html.heex:302 #, elixir-autogen, elixir-format, fuzzy msgid "This code will be used by your attendees to access the event. You have the option to create a custom code." msgstr "Deze code wordt door je bezoekers gebruikt om toegang te krijgen tot het evenement. Je hebt de mogelijkheid om een aangepaste code aan te maken." -#: lib/claper_web/live/event_live/show.ex:192 +#: lib/claper_web/live/event_live/show.ex:193 #, elixir-autogen, elixir-format msgid "This event has been terminated" msgstr "Dit evenement is gestopt" -#: lib/claper_web/live/event_live/index.html.heex:147 +#: lib/claper_web/live/event_live/index.html.heex:148 #, elixir-autogen, elixir-format, fuzzy msgid "Welcome to Claper! You can create a new event here." msgstr "Welkom bij Claper! Hier kun je een nieuw evenement aanmaken." -#: lib/claper_web/live/event_live/event_form_component.html.heex:304 +#: lib/claper_web/live/event_live/event_form_component.html.heex:326 #, elixir-autogen, elixir-format, fuzzy msgid "When your event will start?" msgstr "Wanneer begint het evenement?" @@ -1205,8 +1214,8 @@ msgstr "Wanneer begint het evenement?" msgid "Create your next presentation with" msgstr "Maak je volgende presentatie met" -#: lib/claper_web/live/event_live/manage.ex:27 -#: lib/claper_web/live/event_live/presenter.ex:24 +#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:25 #, elixir-autogen, elixir-format msgid "Event doesn't exist" @@ -1217,7 +1226,7 @@ msgstr "Evenement bestaat niet" msgid "Customize your account" msgstr "Pas je account aan" -#: lib/claper_web/live/user_settings_live/show.html.heex:265 +#: lib/claper_web/live/user_settings_live/show.html.heex:278 #, elixir-autogen, elixir-format msgid "Language" msgstr "Taal" @@ -1237,22 +1246,22 @@ msgstr "Je voorkeuren zijn bijgewerkt." msgid "Question" msgstr "Vraag" -#: lib/claper_web/live/event_live/manage.html.heex:1175 +#: lib/claper_web/live/event_live/manage.html.heex:1167 #, elixir-autogen, elixir-format msgid "Questions" msgstr "Vragen" -#: lib/claper_web/live/event_live/manage.html.heex:1262 +#: lib/claper_web/live/event_live/manage.html.heex:1254 #, elixir-autogen, elixir-format msgid "Questions will appear here." msgstr "Vragen zullen hier verschijnen" -#: lib/claper_web/live/event_live/manage.html.heex:1304 +#: lib/claper_web/live/event_live/manage.html.heex:1296 #, elixir-autogen, elixir-format msgid "Sort by date" msgstr "Sorteren op datum" -#: lib/claper_web/live/event_live/manage.html.heex:1283 +#: lib/claper_web/live/event_live/manage.html.heex:1275 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Sorteer op populariteit" @@ -1262,7 +1271,8 @@ msgstr "Sorteer op populariteit" msgid "Event manager" msgstr "Evenementmanager" -#: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/_user_menu.html.heex:19 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Documentatie" @@ -1278,7 +1288,7 @@ msgstr "Mijn account" msgid "Your personal informations to access your account" msgstr "Je persoonlijke gegevens om toegang te krijgen tot je account" -#: lib/claper_web/live/event_live/manager_settings_component.ex:533 +#: lib/claper_web/live/event_live/manager_settings_component.ex:589 #, elixir-autogen, elixir-format, fuzzy msgid "Enable reactions" msgstr "Schakel reacties in" @@ -1334,43 +1344,43 @@ msgid "Add Claper" msgstr "Voeg Claper toe" #: lib/claper_web/live/event_live/manage.html.heex:123 -#: lib/claper_web/live/event_live/manage.html.heex:539 +#: lib/claper_web/live/event_live/manage.html.heex:538 #, elixir-autogen, elixir-format msgid "Close preview" msgstr "Voorvertoning sluiten" -#: lib/claper_web/live/event_live/manage.html.heex:743 +#: lib/claper_web/live/event_live/manage.html.heex:734 #, elixir-autogen, elixir-format, fuzzy msgid "Create your first interaction." msgstr "Maak je eerste interactie aan" -#: lib/claper_web/live/event_live/manage.html.heex:1101 +#: lib/claper_web/live/event_live/manage.html.heex:1093 #, elixir-autogen, elixir-format, fuzzy msgid "Disable" msgstr "Uitschakelen" -#: lib/claper_web/live/event_live/manage.html.heex:1118 +#: lib/claper_web/live/event_live/manage.html.heex:1110 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Inschakelen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:443 +#: lib/claper_web/live/event_live/manager_settings_component.ex:499 #, elixir-autogen, elixir-format, fuzzy msgid "Enable messages to change this option" msgstr "Schakel berichten in om deze optie te wijzigen" #: lib/claper_web/live/event_live/manage.html.heex:122 -#: lib/claper_web/live/event_live/manage.html.heex:538 +#: lib/claper_web/live/event_live/manage.html.heex:537 #, elixir-autogen, elixir-format msgid "Open preview" msgstr "Voorvertoning openen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:321 +#: lib/claper_web/live/event_live/manager_settings_component.ex:322 #, elixir-autogen, elixir-format msgid "Show messages to change this option" msgstr "Toon berichten om deze optie te wijzigen" -#: lib/claper_web/live/event_live/manage.html.heex:740 +#: lib/claper_web/live/event_live/manage.html.heex:731 #, elixir-autogen, elixir-format msgid "This slide does not have any interactions." msgstr "Deze dia heeft geen interacties." @@ -1397,7 +1407,7 @@ msgstr "Inloggen met %{provider}" msgid "The account has been unlinked." msgstr "Het account is ontkoppeld." -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "This section contains all your interactions." msgstr "Deze sectie bevat al uw interacties." @@ -1408,12 +1418,12 @@ msgstr "Deze sectie bevat al uw interacties." msgid "Unlink" msgstr "Losmaken" -#: lib/claper_web/live/event_live/manage.html.heex:716 +#: lib/claper_web/live/event_live/manage.html.heex:707 #, elixir-autogen, elixir-format msgid "You can add interactions to your presentation slides." msgstr "U kunt interacties toevoegen aan uw presentatiedia's." -#: lib/claper_web/live/event_live/manage.html.heex:715 +#: lib/claper_web/live/event_live/manage.html.heex:706 #, elixir-autogen, elixir-format msgid "Your interactions" msgstr "Uw interacties" @@ -1438,12 +1448,12 @@ msgstr "Stel een nieuw wachtwoord in voor uw account voordat u het ontkoppelt." msgid "Your password has been set, you can now unlink your account." msgstr "Uw wachtwoord is ingesteld, u kunt nu uw account ontkoppelen." -#: lib/claper_web/live/embed_live/form_component.html.heex:38 +#: lib/claper_web/live/embed_live/form_component.html.heex:34 #, elixir-autogen, elixir-format msgid "Iframe code" msgstr "Iframe-code" -#: lib/claper_web/live/embed_live/form_component.html.heex:39 +#: lib/claper_web/live/embed_live/form_component.html.heex:35 #, elixir-autogen, elixir-format msgid "Link to the content" msgstr "Link naar de inhoud" @@ -1469,24 +1479,24 @@ msgstr "Voer een geldige link in die begint met http:// of https://" msgid "Please enter valid HTML content with an iframe tag" msgstr "Voer geldige HTML-inhoud in met een iframe-tag" -#: lib/claper_web/live/embed_live/form_component.html.heex:25 +#: lib/claper_web/live/embed_live/form_component.html.heex:23 #, elixir-autogen, elixir-format msgid "Provider" msgstr "Aanbieder" -#: lib/claper_web/live/poll_live/form_component.html.heex:89 +#: lib/claper_web/live/poll_live/form_component.html.heex:85 #, elixir-autogen, elixir-format msgid "Attendees can see the results on their device" msgstr "Deelnemers kunnen de resultaten op hun apparaat zien" -#: lib/claper_web/live/embed_live/form_component.html.heex:56 +#: lib/claper_web/live/embed_live/form_component.html.heex:50 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees can view the web content on their device" msgstr "Deelnemers kunnen de webinhoud op hun apparaat bekijken" -#: lib/claper_web/live/embed_live/form_component.html.heex:49 -#: lib/claper_web/live/poll_live/form_component.html.heex:82 -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:172 +#: lib/claper_web/live/embed_live/form_component.html.heex:43 +#: lib/claper_web/live/poll_live/form_component.html.heex:78 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:166 #, elixir-autogen, elixir-format msgid "Options" msgstr "Opties" @@ -1554,12 +1564,12 @@ msgstr "Beëindigen" msgid "More options" msgstr "Meer opties" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "No" msgstr "Nee" -#: lib/claper_web/live/event_live/manage.ex:796 +#: lib/claper_web/live/event_live/manage.ex:818 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Ja" @@ -1609,32 +1619,32 @@ msgstr "Je kunt je wachtwoord opnieuw instellen door de onderstaande URL te bezo msgid "back to the home page" msgstr "terug naar de startpagina" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:46 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:44 #, elixir-autogen, elixir-format, fuzzy msgid "Add Question" msgstr "Vraag toevoegen" -#: lib/claper_web/live/event_live/manage.html.heex:294 +#: lib/claper_web/live/event_live/manage.html.heex:293 #, elixir-autogen, elixir-format msgid "Add a quiz to test knowledge." msgstr "Voeg een quiz toe om kennis te testen." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:146 #, elixir-autogen, elixir-format msgid "Add answer" msgstr "Antwoord toevoegen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:482 +#: lib/claper_web/live/event_live/manager_settings_component.ex:538 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous messages" msgstr "Anonieme berichten toestaan" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:84 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:78 #, elixir-autogen, elixir-format msgid "Answer %{index}" msgstr "Antwoord %{index}" -#: lib/claper_web/live/event_live/manager_settings_component.ex:390 +#: lib/claper_web/live/event_live/manager_settings_component.ex:446 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees" msgstr "Deelnemers" @@ -1650,32 +1660,32 @@ msgstr "Gemiddelde score" msgid "Current quiz" msgstr "Huidige quiz" -#: lib/claper_web/live/event_live/manager_settings_component.ex:485 +#: lib/claper_web/live/event_live/manager_settings_component.ex:541 #, elixir-autogen, elixir-format, fuzzy msgid "Deny anonymous messages" msgstr "Anonieme berichten weigeren" -#: lib/claper_web/live/event_live/manager_settings_component.ex:427 +#: lib/claper_web/live/event_live/manager_settings_component.ex:483 #, elixir-autogen, elixir-format, fuzzy msgid "Disable messages" msgstr "Berichten uitschakelen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:536 +#: lib/claper_web/live/event_live/manager_settings_component.ex:592 #, elixir-autogen, elixir-format, fuzzy msgid "Disable reactions" msgstr "Reacties uitschakelen" -#: lib/claper_web/live/event_live/manage.html.heex:369 +#: lib/claper_web/live/event_live/manage.html.heex:368 #, elixir-autogen, elixir-format, fuzzy msgid "Edit quiz" msgstr "Quiz bewerken" -#: lib/claper_web/live/event_live/manager_settings_component.ex:258 +#: lib/claper_web/live/event_live/manager_settings_component.ex:259 #, elixir-autogen, elixir-format msgid "Hide instructions to join" msgstr "Instructies om deel te nemen verbergen" -#: lib/claper_web/live/event_live/manager_settings_component.ex:305 +#: lib/claper_web/live/event_live/manager_settings_component.ex:306 #, elixir-autogen, elixir-format, fuzzy msgid "Hide messages" msgstr "Berichten verbergen" @@ -1698,12 +1708,12 @@ msgstr "Hoe werkt het?" msgid "Interaction" msgstr "Interactie" -#: lib/claper_web/live/event_live/manage.html.heex:368 +#: lib/claper_web/live/event_live/manage.html.heex:367 #, elixir-autogen, elixir-format msgid "New quiz" msgstr "Nieuwe quiz" -#: lib/claper_web/live/event_live/manager_settings_component.ex:217 +#: lib/claper_web/live/event_live/manager_settings_component.ex:218 #, elixir-autogen, elixir-format, fuzzy msgid "Presentation" msgstr "Presentatie" @@ -1713,13 +1723,13 @@ msgstr "Presentatie" msgid "Previous" msgstr "Vorige" -#: lib/claper_web/live/event_live/manage.html.heex:292 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:291 +#: lib/claper_web/live/event_live/manage.html.heex:912 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Quiz" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:158 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:152 #, elixir-autogen, elixir-format msgid "Remove question" msgstr "Vraag verwijderen" @@ -1734,17 +1744,17 @@ msgstr "Neem de vragen door" msgid "See current quiz" msgstr "Bekijk huidige quiz" -#: lib/claper_web/live/event_live/manage.html.heex:388 +#: lib/claper_web/live/event_live/manage.html.heex:387 #, elixir-autogen, elixir-format, fuzzy msgid "Select presentation" msgstr "Selecteer presentatie" -#: lib/claper_web/live/event_live/manager_settings_component.ex:361 +#: lib/claper_web/live/event_live/manager_settings_component.ex:362 #, elixir-autogen, elixir-format, fuzzy msgid "Show all messages" msgstr "Toon alle berichten" -#: lib/claper_web/live/event_live/manager_settings_component.ex:255 +#: lib/claper_web/live/event_live/manager_settings_component.ex:256 #, elixir-autogen, elixir-format, fuzzy msgid "Show instructions to join" msgstr "Toon instructies om deel te nemen" @@ -1760,7 +1770,7 @@ msgstr "Toon resultaten" msgid "Show results on presentation" msgstr "Toon resultaten in presentatie" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:206 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:200 #, elixir-autogen, elixir-format, fuzzy msgid "This will delete all responses associated and the quiz itself, are you sure?" msgstr "Dit zal alle bijbehorende antwoorden en de quiz zelf verwijderen. Weet je het zeker?" @@ -1770,7 +1780,7 @@ msgstr "Dit zal alle bijbehorende antwoorden en de quiz zelf verwijderen. Weet j msgid "Waiting for results..." msgstr "Wachten op resultaten..." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:62 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:58 #, elixir-autogen, elixir-format msgid "Your question" msgstr "Jouw vraag" @@ -1788,7 +1798,7 @@ msgstr "Jouw score" msgid "Export" msgstr "Exporteren" -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:218 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:212 #, elixir-autogen, elixir-format msgid "Export to QTI (XML)" msgstr "Exporteren naar QTI (XML)" @@ -1848,17 +1858,21 @@ msgstr "Unieke deelnemers" msgid "Web Content" msgstr "Webinhoud" -#: lib/claper_web/live/event_live/index.html.heex:178 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:127 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:131 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:286 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:135 +#: lib/claper_web/live/event_live/index.html.heex:179 #, elixir-autogen, elixir-format msgid "Active" msgstr "Actief" -#: lib/claper_web/live/event_live/index.html.heex:217 +#: lib/claper_web/live/event_live/index.html.heex:218 #, elixir-autogen, elixir-format msgid "Load more" msgstr "Meer laden" -#: lib/claper_web/live/event_live/index.html.heex:194 +#: lib/claper_web/live/event_live/index.html.heex:195 #, elixir-autogen, elixir-format msgid "Shared with you" msgstr "Gedeeld met jou" @@ -1868,17 +1882,17 @@ msgstr "Gedeeld met jou" msgid "You must login to continue" msgstr "Je moet inloggen om door te gaan" -#: lib/claper/quizzes/quiz_question.ex:41 +#: lib/claper/quizzes/quiz_question.ex:51 #, elixir-autogen, elixir-format msgid "must have at least one correct answer" msgstr "moet minimaal een correcte antwoord hebben" -#: lib/claper_web/live/event_live/manage.html.heex:548 +#: lib/claper_web/live/event_live/manage.html.heex:547 #, elixir-autogen, elixir-format msgid "Click here to open the presentation window. Press F in the presentation window to enable fullscreen." msgstr "Klik hier om de presentatievenster te openen. Druk F in de presentatievenster om de volledig schermmodus te activeren." -#: lib/claper_web/live/quiz_live/quiz_component.html.heex:179 +#: lib/claper_web/live/quiz_live/quiz_component.html.heex:173 #, elixir-autogen, elixir-format, fuzzy msgid "Allow anonymous submissions" msgstr "Anonieme inzendingen toestaan" @@ -1897,3 +1911,771 @@ msgstr "Inloggen" #, elixir-autogen, elixir-format msgid "Total submissions" msgstr "Totaal aantal inzendingen" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "A unique code for participants to join this event" +msgstr "Een unieke code voor deelnemers om aan dit evenement deel te nemen" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:23 +#, elixir-autogen, elixir-format +msgid "A unique name for this event" +msgstr "Een unieke naam voor dit evenement" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "A unique name to identify this OIDC provider" +msgstr "Een unieke naam om deze OIDC-aanbieder te identificeren" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Account is confirmed and active" +msgstr "Account is bevestigd en actief" + +#: lib/claper_web/live/admin_live/event_live.html.heex:126 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:108 +#: lib/claper_web/live/admin_live/user_live.html.heex:111 +#, elixir-autogen, elixir-format, fuzzy +msgid "Actions" +msgstr "Opties" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Active Events" +msgstr "Actieve evenementen" + +#: lib/claper_web/live/admin_live/event_live.html.heex:216 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this event?" +msgstr "Weet u zeker dat u dit evenement wilt verwijderen?" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this provider?" +msgstr "Weet u zeker dat u deze aanbieder wilt verwijderen?" + +#: lib/claper_web/live/admin_live/user_live.html.heex:197 +#, elixir-autogen, elixir-format, fuzzy +msgid "Are you sure you want to delete this user?" +msgstr "Weet u zeker dat u deze gebruiker wilt verwijderen?" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:68 +#, elixir-autogen, elixir-format +msgid "Assigned User" +msgstr "Toegewezen gebruiker" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:110 +#: lib/claper_web/live/admin_live/event_live.html.heex:119 +#: lib/claper_web/live/admin_live/event_live.html.heex:299 +#, elixir-autogen, elixir-format, fuzzy +msgid "Audience Peak" +msgstr "Publiekspiek" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:103 +#, elixir-autogen, elixir-format +msgid "Authorization Code" +msgstr "Autorisatiecode" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:80 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:147 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:72 +#, elixir-autogen, elixir-format +msgid "Cancel" +msgstr "Annuleren" + +#: lib/claper_web/live/admin_live/form_field_component.ex:112 +#, elixir-autogen, elixir-format, fuzzy +msgid "Choose file" +msgstr "Bestand kiezen" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:264 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "Client ID" +msgstr "Client-ID" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:62 +#, elixir-autogen, elixir-format +msgid "Client Secret" +msgstr "Client-geheim" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:121 +#, elixir-autogen, elixir-format +msgid "Completed" +msgstr "Voltooid" + +#: lib/claper_web/live/admin_live/user_live.html.heex:134 +#: lib/claper_web/live/admin_live/user_live.html.heex:268 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirmed" +msgstr "Bevestigd" + +#: lib/claper_web/live/admin_live/user_live.html.heex:291 +#, elixir-autogen, elixir-format +msgid "Confirmed At" +msgstr "Bevestigd op" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create Event" +msgstr "Evenement aanmaken" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Create Provider" +msgstr "Aanbieder aanmaken" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format, fuzzy +msgid "Create User" +msgstr "Gebruiker aanmaken" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:101 +#: lib/claper_web/live/admin_live/user_live.html.heex:104 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created" +msgstr "Aangemaakt" + +#: lib/claper_web/live/admin_live/event_live.html.heex:305 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:296 +#: lib/claper_web/live/admin_live/user_live.html.heex:278 +#, elixir-autogen, elixir-format, fuzzy +msgid "Created At" +msgstr "Aangemaakt op" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Currently running" +msgstr "Momenteel actief" + +#: lib/claper_web/live/admin_live/event_live.html.heex:219 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete event" +msgstr "Evenement verwijderen" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:197 +#, elixir-autogen, elixir-format +msgid "Delete provider" +msgstr "Aanbieder verwijderen" + +#: lib/claper_web/live/admin_live/user_live.html.heex:200 +#, elixir-autogen, elixir-format, fuzzy +msgid "Delete user" +msgstr "Gebruiker verwijderen" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:339 +#, elixir-autogen, elixir-format +msgid "Edit OIDC Provider" +msgstr "OIDC-aanbieder bewerken" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:176 +#: lib/claper_web/live/admin_live/event_live.ex:41 +#: lib/claper_web/live/admin_live/event_live.html.heex:194 +#: lib/claper_web/live/admin_live/event_live.html.heex:348 +#: lib/claper_web/live/admin_live/event_live.html.heex:358 +#, elixir-autogen, elixir-format +msgid "Edit event" +msgstr "Evenement bewerken" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:46 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:172 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:349 +#, elixir-autogen, elixir-format +msgid "Edit provider" +msgstr "Aanbieder bewerken" + +#: lib/claper_web/live/admin_live/user_live.ex:42 +#: lib/claper_web/live/admin_live/user_live.html.heex:175 +#: lib/claper_web/live/admin_live/user_live.html.heex:329 +#: lib/claper_web/live/admin_live/user_live.html.heex:339 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit user" +msgstr "Gebruiker bewerken" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:136 +#, elixir-autogen, elixir-format +msgid "Enable this OIDC provider" +msgstr "Deze OIDC-aanbieder inschakelen" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:51 +#, elixir-autogen, elixir-format +msgid "Enter client ID" +msgstr "Voer client-ID in" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Enter client secret" +msgstr "Voer client-geheim in" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:33 +#, elixir-autogen, elixir-format +msgid "Enter event code" +msgstr "Voer evenementcode in" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:20 +#, elixir-autogen, elixir-format +msgid "Enter event name" +msgstr "Voer evenementnaam in" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:33 +#, elixir-autogen, elixir-format, fuzzy +msgid "Enter password" +msgstr "Voer wachtwoord in" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Enter provider name" +msgstr "Voer aanbieder naam in" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:19 +#, elixir-autogen, elixir-format +msgid "Enter user email" +msgstr "Voer gebruiker e-mail in" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:81 +#, elixir-autogen, elixir-format +msgid "Event Creation" +msgstr "Evenement aanmaken" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:147 +#, elixir-autogen, elixir-format +msgid "Event created successfully" +msgstr "Evenement succesvol aangemaakt" + +#: lib/claper_web/live/admin_live/event_live.ex:58 +#: lib/claper_web/live/admin_live/event_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Event deleted successfully" +msgstr "Evenement succesvol verwijderd" + +#: lib/claper_web/live/admin_live/event_live.ex:47 +#: lib/claper_web/live/admin_live/event_live.html.heex:253 +#, elixir-autogen, elixir-format +msgid "Event details" +msgstr "Evenement details" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:132 +#, elixir-autogen, elixir-format +msgid "Event updated successfully" +msgstr "Evenement succesvol bijgewerkt" + +#: lib/claper_web/live/admin_live/event_live.ex:16 +#: lib/claper_web/live/admin_live/event_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:214 +#, elixir-autogen, elixir-format, fuzzy +msgid "Events" +msgstr "Evenementen" + +#: lib/claper_web/live/admin_live/event_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Events exported successfully" +msgstr "Evenementen succesvol geëxporteerd" + +#: lib/claper_web/live/admin_live/event_live.html.heex:107 +#: lib/claper_web/live/admin_live/event_live.html.heex:291 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:57 +#, elixir-autogen, elixir-format +msgid "Expired At" +msgstr "Verloopt op" + +#: lib/claper_web/live/admin_live/form_field_component.ex:177 +#, elixir-autogen, elixir-format +msgid "File selected" +msgstr "Bestand geselecteerd" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:121 +#, elixir-autogen, elixir-format, fuzzy +msgid "Form Post" +msgstr "Form Post" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:120 +#, elixir-autogen, elixir-format +msgid "Fragment" +msgstr "Fragment" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:125 +#, elixir-autogen, elixir-format +msgid "How the authorization response should be returned (defaults to 'query')" +msgstr "Hoe de autorisatie reactie moet worden geretourneerd (standaard 'query')" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:105 +#, elixir-autogen, elixir-format +msgid "Hybrid" +msgstr "Hybride" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:104 +#, elixir-autogen, elixir-format +msgid "Implicit" +msgstr "Impliciet" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:135 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:290 +#, elixir-autogen, elixir-format, fuzzy +msgid "Inactive" +msgstr "Inactief" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:36 +#, elixir-autogen, elixir-format +msgid "Initial password for the user" +msgstr "Initieel wachtwoord voor de gebruiker" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:83 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:258 +#, elixir-autogen, elixir-format +msgid "Issuer" +msgstr "Uitgever" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:37 +#, elixir-autogen, elixir-format +msgid "Issuer URL" +msgstr "Uitgever URL" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:66 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:82 +#, elixir-autogen, elixir-format +msgid "Last 30 days" +msgstr "Laatste 30 dagen" + +#: lib/claper_web/live/admin_live/event_live.html.heex:311 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:302 +#: lib/claper_web/live/admin_live/user_live.html.heex:284 +#, elixir-autogen, elixir-format +msgid "Last Updated" +msgstr "Laatst bijgewerkt" + +#: lib/claper_web/live/admin_live/event_live.ex:35 +#: lib/claper_web/live/admin_live/event_live.html.heex:325 +#: lib/claper_web/live/admin_live/event_live.html.heex:335 +#, elixir-autogen, elixir-format +msgid "New event" +msgstr "Nieuw evenement" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:201 +#: lib/claper_web/live/admin_live/event_live.html.heex:134 +#, elixir-autogen, elixir-format +msgid "No events found" +msgstr "Geen evenementen gevonden" + +#: lib/claper_web/live/admin_live/form_field_component.ex:125 +#, elixir-autogen, elixir-format +msgid "No file chosen" +msgstr "Geen bestand gekozen" + +#: lib/claper_web/live/admin_live/event_live.html.heex:147 +#: lib/claper_web/live/admin_live/event_live.html.heex:279 +#, elixir-autogen, elixir-format +msgid "No owner" +msgstr "Geen eigenaar" + +#: lib/claper_web/live/admin_live/user_live.html.heex:129 +#: lib/claper_web/live/admin_live/user_live.html.heex:260 +#, elixir-autogen, elixir-format +msgid "No role" +msgstr "Geen rol" + +#: lib/claper_web/live/admin_live/user_live.html.heex:119 +#, elixir-autogen, elixir-format +msgid "No users found" +msgstr "Geen gebruikers gevonden" + +#: lib/claper_web/live/admin_live/event_live.html.heex:157 +#: lib/claper_web/live/admin_live/event_live.html.heex:295 +#, elixir-autogen, elixir-format +msgid "Not expired" +msgstr "Niet verlopen" + +#: lib/claper_web/live/admin_live/event_live.html.heex:152 +#: lib/claper_web/live/admin_live/event_live.html.heex:287 +#, elixir-autogen, elixir-format +msgid "Not started" +msgstr "Niet gestart" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:108 +#, elixir-autogen, elixir-format +msgid "OAuth 2.0 response type (defaults to 'code')" +msgstr "OAuth 2.0 reactie type (standaard 'code')" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:250 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Provider" +msgstr "OIDC-aanbieder" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:231 +#, elixir-autogen, elixir-format +msgid "OIDC Provider details" +msgstr "OIDC-aanbieder details" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:15 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:6 +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC Providers" +msgstr "OIDC-aanbieders" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:92 +#, elixir-autogen, elixir-format +msgid "OIDC scopes to request (defaults to 'openid email profile')" +msgstr "OIDC scopes om aan te vragen (standaard 'openid email profile')" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:108 +#: lib/claper_web/live/admin_live/event_live.html.heex:87 +#: lib/claper_web/live/admin_live/event_live.html.heex:277 +#, elixir-autogen, elixir-format +msgid "Owner" +msgstr "Eigenaar" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:209 +#, elixir-autogen, elixir-format +msgid "Provider created successfully" +msgstr "Aanbieder succesvol aangemaakt" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:194 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider updated successfully" +msgstr "Aanbieder succesvol bijgewerkt" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:119 +#, elixir-autogen, elixir-format +msgid "Query" +msgstr "Query" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:100 +#, elixir-autogen, elixir-format +msgid "Recent Events" +msgstr "Recente evenementen" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Redirect URI" +msgstr "Redirect URI" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:117 +#, elixir-autogen, elixir-format +msgid "Response Mode" +msgstr "Reactiemodus" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:270 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:101 +#, elixir-autogen, elixir-format +msgid "Response Type" +msgstr "Reactietype" + +#: lib/claper_web/live/admin_live/user_live.html.heex:83 +#: lib/claper_web/live/admin_live/user_live.html.heex:258 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Role" +msgstr "Rol" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:82 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:149 +#: lib/claper_web/live/admin_live/user_live/form_component.ex:74 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "Opslaan..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:124 +#, elixir-autogen, elixir-format +msgid "Scheduled" +msgstr "Gepland" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:276 +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:89 +#, elixir-autogen, elixir-format +msgid "Scope" +msgstr "Scope" + +#: lib/claper_web/live/admin_live/event_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search events..." +msgstr "Zoek evenementen..." + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:70 +#, elixir-autogen, elixir-format +msgid "Search for a user..." +msgstr "Zoek naar een gebruiker..." + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search providers..." +msgstr "Zoek aanbieders..." + +#: lib/claper_web/live/admin_live/user_live.html.heex:55 +#, elixir-autogen, elixir-format +msgid "Search users..." +msgstr "Zoek gebruikers..." + +#: lib/claper_web/live/admin_live/form_field_component.ex:71 +#, elixir-autogen, elixir-format, fuzzy +msgid "Select an option" +msgstr "Selecteer een optie" + +#: lib/claper_web/live/admin_live/searchable_select_component.ex:85 +#, elixir-autogen, elixir-format +msgid "Select..." +msgstr "Selecteer..." + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:109 +#, elixir-autogen, elixir-format +msgid "Start Date" +msgstr "Startdatum" + +#: lib/claper_web/live/admin_live/event_live.html.heex:95 +#: lib/claper_web/live/admin_live/event_live.html.heex:283 +#: lib/claper_web/live/admin_live/event_live/form_component.ex:46 +#, elixir-autogen, elixir-format +msgid "Started At" +msgstr "Gestart op" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:111 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:92 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:282 +#: lib/claper_web/live/admin_live/user_live.html.heex:92 +#: lib/claper_web/live/admin_live/user_live.html.heex:264 +#, elixir-autogen, elixir-format +msgid "Status" +msgstr "Status" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:41 +#, elixir-autogen, elixir-format +msgid "The OIDC issuer URL (must start with http:// or https://)" +msgstr "De OIDC-uitgever URL (moet beginnen met http:// of https://)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:79 +#, elixir-autogen, elixir-format +msgid "The callback URL for your application (must start with http:// or https://)" +msgstr "De callback URL voor uw applicatie (moet beginnen met http:// of https://)" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:73 +#, elixir-autogen, elixir-format +msgid "The user who owns this event (required)" +msgstr "De gebruiker die eigenaar is van dit evenement (verplicht)" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Total Events" +msgstr "Totaal evenementen" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:11 +#, elixir-autogen, elixir-format +msgid "Total Users" +msgstr "Totaal gebruikers" + +#: lib/claper_web/live/admin_live/user_live.html.heex:138 +#: lib/claper_web/live/admin_live/user_live.html.heex:272 +#, elixir-autogen, elixir-format +msgid "Unconfirmed" +msgstr "Niet bevestigd" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:83 +#, elixir-autogen, elixir-format +msgid "Update Event" +msgstr "Evenement bijwerken" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:150 +#, elixir-autogen, elixir-format +msgid "Update Provider" +msgstr "Aanbieder bijwerken" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "Update User" +msgstr "Gebruiker bijwerken" + +#: lib/claper_web/live/admin_live/user_live.html.heex:250 +#, elixir-autogen, elixir-format +msgid "User Account" +msgstr "Gebruikersaccount" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:65 +#, elixir-autogen, elixir-format +msgid "User Growth" +msgstr "Gebruikersgroei" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:165 +#, elixir-autogen, elixir-format +msgid "User created successfully" +msgstr "Gebruiker succesvol aangemaakt" + +#: lib/claper_web/live/admin_live/user_live.ex:59 +#: lib/claper_web/live/admin_live/user_live.ex:127 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Gebruiker succesvol verwijderd" + +#: lib/claper_web/live/admin_live/user_live.ex:48 +#: lib/claper_web/live/admin_live/user_live.html.heex:234 +#, elixir-autogen, elixir-format +msgid "User details" +msgstr "Gebruiker details" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:150 +#, elixir-autogen, elixir-format, fuzzy +msgid "User updated successfully" +msgstr "Gebruiker succesvol bijgewerkt" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:50 +#, elixir-autogen, elixir-format +msgid "User's access level" +msgstr "Toegangsniveau van gebruiker" + +#: lib/claper_web/live/admin_live/user_live/form_component.ex:22 +#, elixir-autogen, elixir-format +msgid "User's email address (must be unique)" +msgstr "E-mailadres van gebruiker (moet uniek zijn)" + +#: lib/claper_web/live/admin_live/user_live.ex:17 +#: lib/claper_web/live/admin_live/user_live.html.heex:6 +#: lib/claper_web/templates/layout/admin.html.heex:230 +#, elixir-autogen, elixir-format +msgid "Users" +msgstr "Gebruikers" + +#: lib/claper_web/live/admin_live/user_live.ex:97 +#, elixir-autogen, elixir-format +msgid "Users exported successfully" +msgstr "Gebruikers succesvol geëxporteerd" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:151 +#: lib/claper_web/live/admin_live/event_live.html.heex:169 +#, elixir-autogen, elixir-format +msgid "View event" +msgstr "Evenement bekijken" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:147 +#, elixir-autogen, elixir-format, fuzzy +msgid "View provider" +msgstr "Aanbieder bekijken" + +#: lib/claper_web/live/admin_live/user_live.html.heex:150 +#, elixir-autogen, elixir-format +msgid "View user" +msgstr "Gebruiker bekijken" + +#: lib/claper_web/live/admin_live/event_live/form_component.ex:60 +#, elixir-autogen, elixir-format +msgid "When this event expires (optional)" +msgstr "Wanneer dit evenement verloopt (optioneel)" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:139 +#, elixir-autogen, elixir-format +msgid "Whether this provider is currently active and available for authentication" +msgstr "Of deze aanbieder momenteel actief is en beschikbaar voor authenticatie" + +#: lib/claper_web/live/admin_live/event_live.html.heex:301 +#, elixir-autogen, elixir-format, fuzzy +msgid "attendees" +msgstr "deelnemers" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:38 +#, elixir-autogen, elixir-format +msgid "https://example.com" +msgstr "https://example.com" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:75 +#, elixir-autogen, elixir-format +msgid "https://yourapp.com/auth/callback" +msgstr "https://yourapp.com/auth/callback" + +#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:90 +#, elixir-autogen, elixir-format +msgid "openid email profile" +msgstr "openid email profile" + +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:28 +#: lib/claper_web/live/admin_live/dashboard_live.html.heex:50 +#, elixir-autogen, elixir-format +msgid "vs last month" +msgstr "vs vorige maand" + +#: lib/claper_web/live/admin_live/event_live.html.heex:256 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to events" +msgstr "Terug naar evenementen" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to providers" +msgstr "Terug naar aanbieders" + +#: lib/claper_web/live/admin_live/user_live.html.heex:237 +#, elixir-autogen, elixir-format, fuzzy +msgid "Back to users" +msgstr "Terug naar gebruikers" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:40 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:23 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:316 +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:326 +#, elixir-autogen, elixir-format, fuzzy +msgid "New provider" +msgstr "Nieuwe aanbieder" + +#: lib/claper_web/live/admin_live/user_live.ex:36 +#: lib/claper_web/live/admin_live/user_live.html.heex:306 +#: lib/claper_web/live/admin_live/user_live.html.heex:316 +#, elixir-autogen, elixir-format, fuzzy +msgid "New user" +msgstr "Nieuwe gebruiker" + +#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:116 +#, elixir-autogen, elixir-format, fuzzy +msgid "No providers found" +msgstr "Geen aanbieders gevonden" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:57 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "Aanbieder succesvol verwijderd" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:34 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Aanbieder details" + +#: lib/claper_web/templates/layout/_user_menu.html.heex:13 +#: lib/claper_web/templates/layout/admin.html.heex:44 +#: lib/claper_web/templates/layout/admin.html.heex:182 +#, elixir-autogen, elixir-format +msgid "Admin" +msgstr "Admin" + +#: lib/claper_web/templates/layout/admin.html.heex:285 +#, elixir-autogen, elixir-format +msgid "Back to app" +msgstr "Terug naar app" + +#: lib/claper_web/templates/user_notifier/change.html.heex:17 +#, elixir-autogen, elixir-format, fuzzy +msgid "Confirm email change" +msgstr "Bevestig e-mail" + +#: lib/claper_web/templates/user_notifier/change.html.heex:32 +#, elixir-autogen, elixir-format, fuzzy +msgid "If you didn't request an email change, please ignore this." +msgstr "Als je geen account bij ons hebt aangemaakt, kun je dit negeren." + +#: lib/claper_web/templates/user_notifier/change.html.heex:22 +#, elixir-autogen, elixir-format, fuzzy +msgid "You can confirm your email change by visiting the URL below" +msgstr "Je kunt het e-mailadres wijzigen door naar de onderstaande URL te gaan" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:416 +#, elixir-autogen, elixir-format +msgid "Hide attendee count" +msgstr "Aantal deelnemers verbergen" + +#: lib/claper_web/live/event_live/manager_settings_component.ex:413 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show attendee count" +msgstr "Aantal deelnemers weergeven" + +#: lib/claper_web/live/form_live/form_component.html.heex:37 +#, elixir-autogen, elixir-format +msgid "Required" +msgstr "Verplicht" + +#: lib/claper_web/views/components/input_component.ex:16 +#: lib/claper_web/views/components/input_component.ex:295 +#, elixir-autogen, elixir-format +msgid "(optional)" +msgstr "(optioneel)" diff --git a/priv/repo/migrations/20250711135508_create_roles.exs b/priv/repo/migrations/20250711135508_create_roles.exs new file mode 100644 index 0000000..c71b1be --- /dev/null +++ b/priv/repo/migrations/20250711135508_create_roles.exs @@ -0,0 +1,14 @@ +defmodule Claper.Repo.Migrations.CreateRoles do + use Ecto.Migration + + def change do + create table(:roles) do + add :name, :string, null: false + add :permissions, :map, default: %{} + + timestamps() + end + + create unique_index(:roles, [:name]) + end +end diff --git a/priv/repo/migrations/20250711135909_add_role_id_to_users.exs b/priv/repo/migrations/20250711135909_add_role_id_to_users.exs new file mode 100644 index 0000000..cdc490f --- /dev/null +++ b/priv/repo/migrations/20250711135909_add_role_id_to_users.exs @@ -0,0 +1,11 @@ +defmodule Claper.Repo.Migrations.AddRoleIdToUsers do + use Ecto.Migration + + def change do + alter table(:users) do + add :role_id, references(:roles, on_delete: :nilify_all), null: true + end + + create index(:users, [:role_id]) + end +end diff --git a/priv/repo/migrations/20250711164053_create_oidc_providers.exs b/priv/repo/migrations/20250711164053_create_oidc_providers.exs new file mode 100644 index 0000000..ac78786 --- /dev/null +++ b/priv/repo/migrations/20250711164053_create_oidc_providers.exs @@ -0,0 +1,22 @@ +defmodule Claper.Repo.Migrations.CreateOidcProviders do + use Ecto.Migration + + def change do + create table(:oidc_providers) do + add :name, :string, null: false + add :issuer, :string, null: false + add :client_id, :string, null: false + add :client_secret, :string, null: false + add :redirect_uri, :string, null: false + add :response_type, :string, default: "code" + add :response_mode, :string + add :scope, :string, default: "openid email profile" + add :active, :boolean, default: true + + timestamps() + end + + create index(:oidc_providers, [:name]) + create unique_index(:oidc_providers, [:issuer]) + end +end diff --git a/priv/repo/migrations/20251020162958_add_show_attendee_count_presentation_state.exs b/priv/repo/migrations/20251020162958_add_show_attendee_count_presentation_state.exs new file mode 100644 index 0000000..d170ea9 --- /dev/null +++ b/priv/repo/migrations/20251020162958_add_show_attendee_count_presentation_state.exs @@ -0,0 +1,9 @@ +defmodule Claper.Repo.Migrations.AddShowAttendeeCountPresentationState do + use Ecto.Migration + + def change do + alter table(:presentation_states) do + add :show_attendee_count, :boolean, default: true + end + end +end diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index 6f5248c..fb29d07 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -10,6 +10,26 @@ # We recommend using the bang functions (`insert!`, `update!` # and so on) as they will fail if something goes wrong. +# Create roles if they don't exist +alias Claper.Accounts.Role +alias Claper.Repo + +# Create admin role if it doesn't exist +if !Repo.get_by(Role, name: "admin") do + %Role{name: "admin", permissions: %{"all" => true}} + |> Repo.insert!() + + IO.puts("Created admin role") +end + +# Create user role if it doesn't exist +if !Repo.get_by(Role, name: "user") do + %Role{name: "user", permissions: %{}} + |> Repo.insert!() + + IO.puts("Created user role") +end + # create a default active lti_1p3 jwk if !Claper.Repo.get_by(Lti13.Jwks.Jwk, id: 1) do %{private_key: private_key} = Lti13.Jwks.Utils.KeyGenerator.generate_key_pair() @@ -22,3 +42,29 @@ if !Claper.Repo.get_by(Lti13.Jwks.Jwk, id: 1) do active: true }) end + +# Create default admin user if no users exist +alias Claper.Accounts +alias Claper.Accounts.User + +if Repo.aggregate(User, :count, :id) == 0 do + admin_role = Repo.get_by(Role, name: "admin") + + if admin_role do + {:ok, admin_user} = + Accounts.register_user(%{ + email: "admin@claper.co", + password: "claper", + confirmed_at: NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) + }) + + Accounts.assign_role(admin_user, admin_role) + + IO.puts("Created default admin user:") + IO.puts(" Email: admin@claper.co") + IO.puts(" Password: claper") + IO.puts(" IMPORTANT: Please change this password after first login!") + else + IO.puts("Warning: Admin role not found, skipping default admin user creation") + end +end diff --git a/priv/static/fonts/Montserrat/Montserrat-Italic-VariableFont_wght.ttf b/priv/static/fonts/Montserrat/Montserrat-Italic-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9f89c9de7aaa3365980727eced97964f274053d0 GIT binary patch literal 701156 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

$1N5GI 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 xag?rRH1r8neV-_uP%v&bShz|o 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 z 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%0DZ9hB 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 E|G+A8RR910 literal 0 HcmV?d00001 diff --git a/reset-db.sh b/reset-db.sh deleted file mode 100755 index b7cba8e..0000000 --- a/reset-db.sh +++ /dev/null @@ -1,6 +0,0 @@ -docker stop claper-db -docker rm claper-db -docker run -p 5432:5432 -e POSTGRES_PASSWORD=claper -e POSTGRES_USER=claper -e POSTGRES_DB=claper --name claper-db -d postgres:15 -sleep 5 -mix ecto.migrate -mix run priv/repo/seeds.exs \ No newline at end of file diff --git a/test/claper/accounts/role_test.exs b/test/claper/accounts/role_test.exs new file mode 100644 index 0000000..ccda407 --- /dev/null +++ b/test/claper/accounts/role_test.exs @@ -0,0 +1,133 @@ +defmodule Claper.Accounts.RoleTest do + use Claper.DataCase + + alias Claper.Accounts + alias Claper.Accounts.{User, Role} + alias Claper.Repo + + describe "roles" do + setup do + # Ensure admin and user roles exist + {:ok, _admin_role} = Accounts.create_role(%{name: "admin"}) + {:ok, _user_role} = Accounts.create_role(%{name: "user"}) + :ok + end + + test "list_roles/0 returns all roles" do + roles = Accounts.list_roles() + assert length(roles) == 2 + assert Enum.any?(roles, fn r -> r.name == "admin" end) + assert Enum.any?(roles, fn r -> r.name == "user" end) + end + + test "get_role!/1 returns the role with given id" do + role = Repo.get_by(Role, name: "admin") + assert Accounts.get_role!(role.id).name == "admin" + end + + test "get_role_by_name/1 returns the role with given name" do + assert Accounts.get_role_by_name("admin").name == "admin" + assert Accounts.get_role_by_name("user").name == "user" + assert Accounts.get_role_by_name("nonexistent") == nil + end + + test "create_role/1 with valid data creates a role" do + assert {:ok, %Role{} = role} = Accounts.create_role(%{name: "moderator"}) + assert role.name == "moderator" + end + + test "create_role/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Accounts.create_role(%{name: nil}) + end + end + + describe "user role management" do + setup do + # Ensure admin and user roles exist + {:ok, admin_role} = Accounts.create_role(%{name: "admin"}) + {:ok, user_role} = Accounts.create_role(%{name: "user"}) + + # Create a test user + {:ok, user} = Accounts.create_user(%{email: "test@example.com", password: "Password123!"}) + + %{user: user, admin_role: admin_role, user_role: user_role} + end + + test "assign_role/2 assigns a role to a user", %{user: user, admin_role: admin_role} do + assert {:ok, updated_user} = Accounts.assign_role(user, admin_role) + assert updated_user.role_id == admin_role.id + + # Verify through a fresh database query + fresh_user = Repo.get(User, user.id) |> Repo.preload(:role) + assert fresh_user.role.name == "admin" + end + + test "get_user_role/1 returns the role of a user", %{user: user, user_role: user_role} do + # Assign a role first + {:ok, user} = Accounts.assign_role(user, user_role) + + # Test getting the role + role = Accounts.get_user_role(user) + assert role.id == user_role.id + assert role.name == "user" + end + + test "list_users_by_role/1 returns users with a specific role", %{ + user: user, + admin_role: admin_role + } do + # Create another user with a different role + {:ok, user2} = + Accounts.create_user(%{email: "another@example.com", password: "Password123!"}) + + {:ok, _} = Accounts.assign_role(user, admin_role) + + # Get users with admin role + admin_users = Accounts.list_users_by_role("admin") + assert length(admin_users) == 1 + assert hd(admin_users).id == user.id + + # Verify user2 is not in the list + assert user2.id not in Enum.map(admin_users, & &1.id) + end + + test "user_has_role?/2 checks if a user has a specific role", %{ + user: user, + admin_role: admin_role + } do + # Initially user has no role + refute Accounts.user_has_role?(user, "admin") + + # Assign admin role + {:ok, user} = Accounts.assign_role(user, admin_role) + + # Now user should have admin role + assert Accounts.user_has_role?(user, "admin") + refute Accounts.user_has_role?(user, "user") + end + + test "promote_to_admin/1 promotes a user to admin", %{user: user} do + # Initially user should not be admin + refute Accounts.user_has_role?(user, "admin") + + # Promote to admin + {:ok, user} = Accounts.promote_to_admin(user) + + # Verify promotion + assert Accounts.user_has_role?(user, "admin") + end + + test "demote_from_admin/1 demotes a user from admin", %{user: user} do + # First promote to admin + {:ok, user} = Accounts.promote_to_admin(user) + assert Accounts.user_has_role?(user, "admin") + + # Then demote + {:ok, user} = Accounts.demote_from_admin(user) + + # Verify demotion + refute Accounts.user_has_role?(user, "admin") + assert Accounts.user_has_role?(user, "user") + end + end +end diff --git a/test/claper/embeds_test.exs b/test/claper/embeds_test.exs index d6fde8c..c026bf7 100644 --- a/test/claper/embeds_test.exs +++ b/test/claper/embeds_test.exs @@ -75,15 +75,17 @@ defmodule Claper.EmbedsTest do "https://youtu.be/dQw4w9WgXcQ?si=g1A6ZegIXzcrisSw" end - test "create_embed/1 with invalid data creates a youtube embed" do + test "create_embed/1 with invalid youtube URL returns error" do presentation_file = presentation_file_fixture() attrs = %{ title: "some title", - content: "https://youtube.com/dQw4w9WgXcQ?si=g1A6ZegIXzcrisSw", + # Wrong provider URL for youtube + content: "https://vimeo.com/123456", provider: "youtube", presentation_file_id: presentation_file.id, - position: 0 + position: 0, + attendee_visibility: false } assert {:error, %Ecto.Changeset{}} = Embeds.create_embed(attrs) diff --git a/test/claper/events_test.exs b/test/claper/events_test.exs index a8c19f4..736053c 100644 --- a/test/claper/events_test.exs +++ b/test/claper/events_test.exs @@ -2,6 +2,7 @@ defmodule Claper.EventsTest do use Claper.DataCase alias Claper.Events + alias Claper.Events.{Event, ActivityLeader} import Claper.{ EventsFixtures, @@ -12,70 +13,423 @@ defmodule Claper.EventsTest do EmbedsFixtures } - describe "events" do - alias Claper.Events.Event + setup_all do + sandbox_owner_pid = Ecto.Adapters.SQL.Sandbox.start_owner!(Claper.Repo, shared: true) + on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(sandbox_owner_pid) end) - @invalid_attrs %{name: nil, code: nil} + alice = user_fixture(%{email: "alice@example.com"}) + bob = user_fixture(%{email: "bob@example.com"}) + carol = user_fixture(%{email: "carol@example.com"}) - test "list_events/1 returns all events of a user" do - event = event_fixture() - assert Events.list_events(event.user_id) == [event] + now = NaiveDateTime.utc_now() + + alice_active_events = + for _ <- 1..12 do + event_fixture(%{user: alice}) + end + + alice_expired_events = [] + + bob_active_events = [] + + bob_expired_events = + for i <- 1..12 do + event_fixture(%{user: bob, expired_at: NaiveDateTime.add(now, i - 1, :hour)}) + end + + carol_active_events = + for _ <- 1..6 do + event = + event_fixture(%{user: carol}) + + activity_leader_fixture(%{event: event, user: alice}) + event + end + + carol_expired_events = + for i <- 1..6 do + event = + event_fixture(%{user: carol, expired_at: NaiveDateTime.add(now, i - 1, :hour)}) + + activity_leader_fixture(%{event: event, user: bob}) + event + end + + [ + sandbox_owner_pid: sandbox_owner_pid, + alice: alice, + alice_active_events: alice_active_events, + alice_expired_events: alice_expired_events, + alice_events: alice_active_events ++ alice_expired_events, + bob: bob, + bob_active_events: bob_active_events, + bob_expired_events: bob_expired_events, + bob_events: bob_active_events ++ bob_expired_events, + carol: carol, + carol_active_events: carol_active_events, + carol_expired_events: carol_expired_events, + carol_events: carol_active_events ++ carol_expired_events + ] + end + + describe "listing events" do + test "list_events/2 lists all events of a user but not others", context do + assert Events.list_events(context.alice.id) == list(context.alice_events) + assert Events.list_events(context.bob.id) == list(context.bob_events) + assert Events.list_events(context.carol.id) == list(context.carol_events) end - test "list_events/1 doesn't returns events of other users" do - event = event_fixture() + test "paginate_events/3 paginates all events of a user but not others", context do + assert Events.paginate_events(context.alice.id) == + paginate(context.alice_events) - event2 = event_fixture() + params = %{"page" => 2} - assert Events.list_events(event.user_id) == [event] - assert Events.list_events(event.user_id) != [event2] + assert Events.paginate_events(context.alice.id, params) == + paginate(context.alice_events, params) + + assert Events.paginate_events(context.bob.id) == + paginate(context.bob_events) + + params = %{"page" => 2, "page_size" => 12} + + assert Events.paginate_events(context.bob.id, params) == + paginate(context.bob_events, params) end - test "get_event!/2 returns the event with given id" do + test "list_not_expired_events/2 lists all active events for a user but not others", + context do + assert Events.list_not_expired_events(context.alice.id) == + list(context.alice_active_events) + + assert Events.list_not_expired_events(context.bob.id) == + list(context.bob_active_events) + + assert Events.list_not_expired_events(context.carol.id) == + list(context.carol_active_events) + end + + test "paginate_not_expired_events/3 paginates all active events for a user but not others", + context do + assert Events.paginate_not_expired_events(context.alice.id) == + paginate(context.alice_active_events) + + assert Events.paginate_not_expired_events(context.bob.id) == + paginate(context.bob_active_events) + + params = %{"page" => 2, "page_size" => 10} + + assert Events.paginate_not_expired_events(context.carol.id, params) == + paginate(context.carol_active_events, params) + end + + test "list_expired_events/2 lists all expired events for a user but not others", context do + assert Events.list_expired_events(context.alice.id) == + Enum.reverse(context.alice_expired_events) + + assert Events.list_expired_events(context.bob.id) == + Enum.reverse(context.bob_expired_events) + + assert Events.list_expired_events(context.carol.id) == + Enum.reverse(context.carol_expired_events) + end + + test "paginate_expired_events/3 lists all expired events for a user but not others", + context do + assert Events.paginate_expired_events(context.alice.id) == + paginate(context.alice_expired_events) + + assert Events.paginate_expired_events(context.bob.id) == + paginate(context.bob_expired_events) + + params = %{"page" => 2, "page_size" => 10} + + assert Events.paginate_expired_events(context.bob.id, params) == + paginate(context.bob_expired_events, params) + + assert Events.paginate_expired_events(context.carol.id) == + paginate(context.carol_expired_events) + end + + test "list_managed_events_by/2 lists all managed events by user but not others", context do + assert Events.list_managed_events_by(context.alice.email) == + list(context.carol_active_events) + + assert Events.list_managed_events_by(context.bob.email) == + list(context.carol_expired_events) + + assert Events.list_managed_events_by(context.carol.email) == [] + end + + test "paginate_managed_events_by/3 paginates all managed events by user but not others", + context do + assert Events.paginate_managed_events_by(context.alice.email) == + paginate(context.carol_active_events) + + assert Events.paginate_managed_events_by(context.bob.email) == + paginate(context.carol_expired_events) + + assert Events.paginate_managed_events_by(context.carol.email) == {[], 0, 0} + end + end + + describe "counting events" do + test "count_managed_events_by/1 counts all managed events by user", context do + assert Events.count_managed_events_by(context.alice.email) == + Enum.count(context.carol_active_events) + + assert Events.count_managed_events_by(context.bob.email) == + Enum.count(context.carol_expired_events) + + assert Events.count_managed_events_by(context.carol.email) == 0 + end + + test "count_expired_events/1 counts all expired events for user", context do + assert Events.count_expired_events(context.alice.id) == + Enum.count(context.alice_expired_events) + + assert Events.count_expired_events(context.bob.id) == Enum.count(context.bob_expired_events) + + assert Events.count_expired_events(context.carol.id) == + Enum.count(context.carol_expired_events) + end + + test "count_events_month/1 counts all events for user created in the last 30 days", + context do + assert Events.count_events_month(context.alice.id) == + Enum.count(context.alice_active_events) + Enum.count(context.alice_expired_events) + + assert Events.count_events_month(context.bob.id) == + Enum.count(context.bob_active_events) + Enum.count(context.bob_expired_events) + + assert Events.count_events_month(context.carol.id) == + Enum.count(context.carol_active_events) + Enum.count(context.carol_expired_events) + end + end + + describe "getting events" do + test "get_event!/2 gets event by serial ID and UUID" do event = event_fixture() + assert Events.get_event!(event.id) == event + assert Events.get_event!(to_string(event.id)) == event assert Events.get_event!(event.uuid) == event end - test "get_user_event!/3 with invalid user raises exception" do - event = event_fixture() - event2 = event_fixture() + test "get_managed_event!/3 gets event managed by owner and leader, raises if neither", + context do + event = Enum.at(context.carol_active_events, 0) + assert Events.get_managed_event!(context.alice, event.uuid) == event + assert Events.get_managed_event!(context.carol, event.uuid) == event assert_raise Ecto.NoResultsError, fn -> - Events.get_user_event!(event.user_id, event2.uuid) == event + Events.get_managed_event!(context.bob, event.uuid) end end + test "get_managed_event!/3 works for the owner of an event with no leaders", + context do + event = Enum.at(context.alice_active_events, 0) + assert Events.get_managed_event!(context.alice, event.uuid) == event + end + + test "get_user_event!/3 gets event by owner, raises if not", context do + event = Enum.at(context.alice_active_events, 0) + assert Events.get_user_event!(context.alice.id, event.uuid) == event + + assert_raise Ecto.NoResultsError, fn -> + Events.get_user_event!(context.bob.id, event.uuid) + end + end + + test "get_event_with_code!/2 gets non-expired event by code, raises if not found", context do + active_event = Enum.at(context.carol_active_events, 0) + expired_event = Enum.at(context.carol_expired_events, 0) + + assert Events.get_event_with_code!(active_event.code) == active_event + + assert_raise Ecto.NoResultsError, fn -> + Events.get_event_with_code!(expired_event.code) + end + + assert_raise Ecto.NoResultsError, fn -> + Events.get_event_with_code!("ABC123") + end + end + + test "get_event_with_code/2 gets non-expired event by code, returns nil if not found", + context do + active_event = Enum.at(context.carol_active_events, 0) + expired_event = Enum.at(context.carol_expired_events, 0) + + assert Events.get_event_with_code(active_event.code) == active_event + assert Events.get_event_with_code(expired_event.code) == nil + assert Events.get_event_with_code("ABC123") == nil + end + end + + describe "writing events" do test "create_event/1 with valid data creates a event" do user = user_fixture() - valid_attrs = %{ + attrs = %{ name: "some name", code: "12345", user_id: user.id, - started_at: NaiveDateTime.utc_now(), - expired_at: NaiveDateTime.add(NaiveDateTime.utc_now(), 7200, :second) + started_at: + NaiveDateTime.utc_now(:second) + |> NaiveDateTime.truncate(:second), + expired_at: + NaiveDateTime.add(NaiveDateTime.utc_now(), 2, :hour) + |> NaiveDateTime.truncate(:second) } - assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) - assert event.name == "some name" - end + assert {:ok, %Event{} = event} = Events.create_event(attrs) - test "create_event/1 with too short code returns error changeset" do - user = user_fixture() - - valid_attrs = %{ - name: "some name", - code: "code", - user_id: user.id, - started_at: NaiveDateTime.utc_now(), - expired_at: NaiveDateTime.add(NaiveDateTime.utc_now(), 7200, :second) - } - - assert {:error, %Ecto.Changeset{}} = Events.create_event(valid_attrs) + assert event.name == attrs.name + assert event.code == attrs.code + assert event.user_id == attrs.user_id + assert event.started_at == attrs.started_at + assert attrs.expired_at == event.expired_at end test "create_event/1 with invalid data returns error changeset" do - assert {:error, %Ecto.Changeset{}} = Events.create_event(@invalid_attrs) + user = user_fixture() + + attrs = %{ + name: "some name", + code: "12345", + user_id: user.id, + started_at: + NaiveDateTime.utc_now(:second) + |> NaiveDateTime.truncate(:second), + expired_at: + NaiveDateTime.add(NaiveDateTime.utc_now(), 2, :hour) + |> NaiveDateTime.truncate(:second) + } + + too_short_code = "tiny" + + assert {:error, %Ecto.Changeset{}} = Events.create_event(Map.delete(attrs, :name)) + assert {:error, %Ecto.Changeset{}} = Events.create_event(Map.delete(attrs, :code)) + assert {:error, %Ecto.Changeset{}} = Events.create_event(Map.delete(attrs, :user_id)) + assert {:error, %Ecto.Changeset{}} = Events.create_event(Map.delete(attrs, :started_at)) + + assert {:error, %Ecto.Changeset{}} = + Events.create_event(Map.merge(attrs, %{code: too_short_code})) + end + + test "duplicate_event/2 duplicates an event without presentation association" do + original = event_fixture() + {:ok, duplicate} = Events.duplicate_event(original.user_id, original.uuid) + + assert duplicate.name == "#{original.name} (Copy)" + assert duplicate.id != original.id + assert duplicate.code != original.code + end + + test "duplicate_event/2 duplicates an event with presentation associations" do + original = event_fixture() + presentation_file = presentation_file_fixture(%{event: original}) + presentation_state = presentation_state_fixture(%{presentation_file: presentation_file}) + + poll = + poll_fixture(%{ + presentation_file_id: presentation_file.id, + poll_opts: [ + %{content: "some option 1", vote_count: 1}, + %{content: "some option 2", vote_count: 2} + ] + }) + + poll_fixture(%{presentation_file_id: presentation_file.id}) + + form = form_fixture(%{presentation_file_id: presentation_file.id}) + form_fixture(%{presentation_file_id: presentation_file.id}) + embed = embed_fixture(%{presentation_file_id: presentation_file.id}) + embed_fixture(%{presentation_file_id: presentation_file.id}) + + duplicate = + Events.duplicate_event(original.user_id, original.uuid) + |> then(fn {:ok, duplicate} -> + duplicate + |> Repo.preload( + presentation_file: [:embeds, :forms, :presentation_state, polls: [:poll_opts]] + ) + end) + + # Event + assert duplicate.id != original.id + assert duplicate.uuid != original.uuid + assert duplicate.code != original.code + assert duplicate.name == "#{original.name} (Copy)" + assert duplicate.user_id == original.user_id + + # Presentation file + assert duplicate.presentation_file.id != presentation_file.id + assert duplicate.presentation_file.hash == presentation_file.hash + assert duplicate.presentation_file.length == presentation_file.length + assert duplicate.presentation_file.event_id != presentation_file.event_id + assert duplicate.presentation_file.event_id == duplicate.id + + # Presentation state + duplicate_state = duplicate.presentation_file.presentation_state + assert duplicate_state.id != presentation_state.id + assert duplicate_state.presentation_file_id != presentation_state.presentation_file_id + assert duplicate_state.presentation_file_id == duplicate.presentation_file.id + + # Polls + [duplicate_poll, _] = duplicate.presentation_file.polls + assert duplicate_poll.id != poll.id + assert duplicate_poll.presentation_file_id != poll.presentation_file_id + assert duplicate_poll.presentation_file_id == duplicate.presentation_file.id + assert duplicate_poll.title == poll.title + assert duplicate_poll.position == poll.position + + # Poll options + [o1, o2] = poll.poll_opts + [do1, do2] = duplicate_poll.poll_opts + + assert do1.id != o1.id + assert do1.poll_id != o1.poll_id + assert do1.poll_id == duplicate_poll.id + assert do1.content == o1.content + assert do1.vote_count == 0 + + assert do2.id != o2.id + assert do2.poll_id != o2.poll_id + assert do2.poll_id == duplicate_poll.id + assert do2.content == o2.content + assert do2.vote_count == 0 + + # Forms + [duplicate_form, _] = duplicate.presentation_file.forms + assert duplicate_form.id != form.id + assert duplicate_form.presentation_file_id != form.presentation_file_id + assert duplicate_form.presentation_file_id == duplicate.presentation_file.id + assert duplicate_form.enabled == form.enabled + assert duplicate_form.fields == form.fields + assert duplicate_form.position == form.position + assert duplicate_form.title == form.title + + # Embeds + [duplicate_embed, _] = duplicate.presentation_file.embeds + assert duplicate_embed.id != embed.id + assert duplicate_embed.presentation_file_id != embed.presentation_file_id + assert duplicate_embed.presentation_file_id == duplicate.presentation_file.id + assert(duplicate_embed.attendee_visibility == embed.attendee_visibility) + assert duplicate_embed.content == embed.content + assert duplicate_embed.enabled == embed.enabled + assert duplicate_embed.position == embed.position + assert duplicate_embed.provider == embed.provider + assert duplicate_embed.title == embed.title + end + + test "duplicate_event/2 raises when an invalid user-event is supplied", context do + original = Enum.at(context.alice_active_events, 0) + + assert_raise Ecto.NoResultsError, fn -> + Events.duplicate_event(context.bob.id, original.uuid) + end end test "update_event/2 with valid data updates the event" do @@ -88,10 +442,102 @@ defmodule Claper.EventsTest do test "update_event/2 with invalid data returns error changeset" do event = event_fixture() - assert {:error, %Ecto.Changeset{}} = Events.update_event(event, @invalid_attrs) + + assert {:error, %Ecto.Changeset{}} = Events.update_event(event, %{name: nil}) + assert {:error, %Ecto.Changeset{}} = Events.update_event(event, %{code: nil}) + assert {:error, %Ecto.Changeset{}} = Events.update_event(event, %{code: "tiny"}) + assert {:error, %Ecto.Changeset{}} = Events.update_event(event, %{user_id: nil}) + assert {:error, %Ecto.Changeset{}} = Events.update_event(event, %{started_at: nil}) + assert event == Events.get_event!(event.uuid) end + test "change_event/1 returns a event changeset" do + event = event_fixture() + assert %Ecto.Changeset{} = Events.change_event(event) + end + + test "terminate_event/1 terminates an event and broadcasts it" do + event = event_fixture() + assert event.expired_at == nil + + Phoenix.PubSub.subscribe(Claper.PubSub, "event:#{event.uuid}") + {:ok, event} = Events.terminate_event(event) + + assert NaiveDateTime.diff(NaiveDateTime.utc_now(), event.expired_at) |> abs() < 1 + assert_received {:event_terminated, uuid} + assert uuid == event.uuid + end + + test "delete_event/1 deletes the event" do + event = event_fixture() + + assert {:ok, %Event{}} = Events.delete_event(event) + assert_raise Ecto.NoResultsError, fn -> Events.get_event!(event.uuid) end + end + end + + describe "leading events" do + test "led_by?/2", context do + assert Events.led_by?(context.alice.email, Enum.at(context.carol_active_events, 0)) == true + assert Events.led_by?(context.bob.email, Enum.at(context.carol_active_events, 0)) == false + end + + test "create_activity_leader/1 with valid data creates an activity leader" do + attrs = %{ + email: "dan@example.com" + } + + {:ok, leader = %ActivityLeader{}} = Events.create_activity_leader(attrs) + assert leader.email == attrs.email + + event = event_fixture() + + attrs = %{ + email: "dan@example.com", + event_id: event.id + } + + {:ok, leader = %ActivityLeader{}} = Events.create_activity_leader(attrs) + assert leader.email == attrs.email + assert leader.event_id == attrs.event_id + end + + test "create_activity_leader/1 with invalid data returns error changeset" do + {:error, %Ecto.Changeset{}} = Events.create_activity_leader(%{}) + end + + test "create_activity_leader/1 disallows event owner as leader" do + user = user_fixture() + event = event_fixture(%{user: user}) + + attrs = %{ + email: user.email, + event_id: event.id, + user_email: user.email + } + + {:error, %Ecto.Changeset{}} = Events.create_activity_leader(attrs) + end + + test "get_activity_leader!/1 gets activity leader by ID" do + leader = activity_leader_fixture() + assert Events.get_activity_leader!(leader.id) == leader + end + + test "get_activity_leaders_for_event/1 gets activity leaders for event by ID", context do + event = Enum.at(context.carol_active_events, 0) + [leader] = Events.get_activity_leaders_for_event(event.id) + assert leader.user_id == context.alice.id + end + + test "change_activity_leader/2 returns an activity leader changeset" do + leader = activity_leader_fixture() + assert %Ecto.Changeset{} = Events.change_activity_leader(leader) + end + end + + describe "importing events" do test "import/3 transfer all interactions from an event to another" do user = user_fixture() from_event = event_fixture(%{user: user, name: "from event"}) @@ -121,48 +567,20 @@ defmodule Claper.EventsTest do Events.import(user.id, from_event.uuid, to_event.uuid) end end + end - test "duplicate_event/2 duplicates an event" do - user = user_fixture() - original_event = event_fixture(%{user: user, name: "Original Event"}) - presentation_file = presentation_file_fixture(%{event: original_event}) - presentation_state_fixture(%{presentation_file: presentation_file}) - poll_fixture(%{presentation_file_id: presentation_file.id}) - form_fixture(%{presentation_file_id: presentation_file.id}) - embed_fixture(%{presentation_file_id: presentation_file.id}) + defp list(events), do: Enum.reverse(events) - assert {:ok, duplicated_event} = Events.duplicate_event(user.id, original_event.uuid) + defp paginate(events, params \\ %{}) do + page = Map.get(params, "page", 1) + page_size = Map.get(params, "page_size", 5) + start_index = (page - 1) * page_size + event_count = length(events) - assert duplicated_event.id != original_event.id - assert duplicated_event.user_id == original_event.user_id - assert duplicated_event.name == "Original Event (Copy)" - assert duplicated_event.code != original_event.code - assert duplicated_event.uuid != original_event.uuid - - # Check if the presentation file was duplicated - duplicated_presentation_file = - Claper.Events.get_event!(duplicated_event.uuid, [:presentation_file]).presentation_file - - assert duplicated_presentation_file.id != presentation_file.id - assert duplicated_presentation_file.hash == presentation_file.hash - assert duplicated_presentation_file.length == presentation_file.length - - # Check if polls, forms, and embeds were duplicated - assert length(Claper.Polls.list_polls(duplicated_presentation_file.id)) == 1 - assert length(Claper.Forms.list_forms(duplicated_presentation_file.id)) == 1 - assert length(Claper.Embeds.list_embeds(duplicated_presentation_file.id)) == 1 - end - - test "delete_event/1 deletes the event" do - event = event_fixture() - - assert {:ok, %Event{}} = Events.delete_event(event) - assert_raise Ecto.NoResultsError, fn -> Events.get_event!(event.uuid) end - end - - test "change_event/1 returns a event changeset" do - event = event_fixture() - assert %Ecto.Changeset{} = Events.change_event(event) - end + { + events |> Enum.reverse() |> Enum.slice(start_index, page_size), + event_count, + ceil(event_count / page_size) + } end end diff --git a/test/claper/forms_test.exs b/test/claper/forms_test.exs index abbb41b..5a299b2 100644 --- a/test/claper/forms_test.exs +++ b/test/claper/forms_test.exs @@ -51,13 +51,15 @@ defmodule Claper.FormsTest do presentation_file_id: presentation_file.id, position: 0, fields: [ - %{name: "some option 1", type: "text"}, + %{name: "some option 1", type: "text", required: false}, %{name: "some option 2", type: "email"} ] } assert {:ok, %Form{} = form} = Forms.create_form(valid_attrs) assert form.title == "some title" + assert Enum.at(form.fields, 0) |> Map.fetch!(:required) == false + assert Enum.at(form.fields, 1) |> Map.fetch!(:required) == true end test "create_form/1 with invalid data returns error changeset" do diff --git a/test/claper/quizzes_test.exs b/test/claper/quizzes_test.exs index 6a8300c..0ee044b 100644 --- a/test/claper/quizzes_test.exs +++ b/test/claper/quizzes_test.exs @@ -113,14 +113,14 @@ defmodule Claper.QuizzesTest do assert length(new_question.quiz_question_opts) == 2 end - test "submit_quiz/3 with user_id records responses and updates counts" do + test "submit_quiz/3 with user records responses and updates counts" do quiz = quiz_fixture() user = user_fixture() question = List.first(quiz.quiz_questions) option = List.first(question.quiz_question_opts) assert {:ok, updated_quiz} = - Quizzes.submit_quiz(user.id, [option], quiz.id) + Quizzes.submit_quiz(user, [option], quiz.id) updated_option = updated_quiz.quiz_questions @@ -151,7 +151,7 @@ defmodule Claper.QuizzesTest do correct_option = Enum.find(question.quiz_question_opts, & &1.is_correct) # Submit correct answer - {:ok, _} = Quizzes.submit_quiz(user.id, [correct_option], quiz.id) + {:ok, _} = Quizzes.submit_quiz(user, [correct_option], quiz.id) assert {1, 1} = Quizzes.calculate_user_score(user.id, quiz.id) end diff --git a/test/claper_web/helpers/csv_exporter_test.exs b/test/claper_web/helpers/csv_exporter_test.exs new file mode 100644 index 0000000..25e9191 --- /dev/null +++ b/test/claper_web/helpers/csv_exporter_test.exs @@ -0,0 +1,219 @@ +defmodule ClaperWeb.Helpers.CSVExporterTest do + use Claper.DataCase + + alias ClaperWeb.Helpers.CSVExporter + alias Claper.Accounts.User + alias Claper.Events.Event + alias Claper.Accounts.Oidc.Provider + alias Claper.Accounts.Role + alias Claper.Repo + + describe "export_users_to_csv/1" do + setup do + # Create roles + {:ok, user_role} = Repo.insert(%Role{name: "user"}) + {:ok, admin_role} = Repo.insert(%Role{name: "admin"}) + + # Create users + {:ok, user1} = + Repo.insert(%User{ + email: "user1@example.com", + uuid: Ecto.UUID.generate(), + role_id: user_role.id, + inserted_at: ~N[2023-01-01 10:00:00], + hashed_password: "hashed_password", + is_randomized_password: false + }) + + {:ok, user2} = + Repo.insert(%User{ + email: "admin@example.com", + uuid: Ecto.UUID.generate(), + role_id: admin_role.id, + inserted_at: ~N[2023-01-02 10:00:00], + hashed_password: "hashed_password", + is_randomized_password: false + }) + + %{users: [user1, user2], user_role: user_role, admin_role: admin_role} + end + + test "exports users to CSV format", %{users: users} do + users = Repo.preload(users, :role) + csv = CSVExporter.export_users_to_csv(users) + + # CSV should have a header row and two data rows + lines = String.split(csv, "\r\n", trim: true) + assert length(lines) == 3 + + # Check header + header = List.first(lines) + assert header =~ "Email" + assert header =~ "Name" + assert header =~ "Role" + assert header =~ "Created At" + + # Check data rows + assert Enum.at(lines, 1) =~ "user1@example.com" + assert Enum.at(lines, 1) =~ "user" + + assert Enum.at(lines, 2) =~ "admin@example.com" + assert Enum.at(lines, 2) =~ "admin" + end + + test "handles empty user list" do + csv = CSVExporter.export_users_to_csv([]) + + # CSV should only have a header row + lines = String.split(csv, "\r\n", trim: true) + assert length(lines) == 1 + + # Check header + header = List.first(lines) + assert header =~ "Email" + assert header =~ "Name" + assert header =~ "Role" + end + end + + describe "export_events_to_csv/1" do + setup do + # Create events + {:ok, event1} = + Repo.insert(%Event{ + name: "Event One", + uuid: Ecto.UUID.generate(), + code: "event1", + started_at: ~N[2023-01-01 10:00:00], + expired_at: ~N[2023-01-01 12:00:00], + audience_peak: 10, + inserted_at: ~N[2023-01-01 09:00:00] + }) + + {:ok, event2} = + Repo.insert(%Event{ + name: "Event Two", + uuid: Ecto.UUID.generate(), + code: "event2", + started_at: ~N[2023-01-02 10:00:00], + expired_at: ~N[2023-01-02 12:00:00], + audience_peak: 20, + inserted_at: ~N[2023-01-01 09:30:00] + }) + + %{events: [event1, event2]} + end + + test "exports events to CSV format", %{events: events} do + csv = CSVExporter.export_events_to_csv(events) + + # CSV should have a header row and two data rows + lines = String.split(csv, "\r\n", trim: true) + assert length(lines) == 3 + + # Check header + header = List.first(lines) + assert header =~ "Name" + assert header =~ "Description" + assert header =~ "Start Date" + assert header =~ "End Date" + assert header =~ "Status" + + # Check data rows contain event names + assert Enum.at(lines, 1) =~ "Event One" + assert Enum.at(lines, 2) =~ "Event Two" + end + + test "handles empty event list" do + csv = CSVExporter.export_events_to_csv([]) + + # CSV should only have a header row + lines = String.split(csv, "\r\n", trim: true) + assert length(lines) == 1 + + # Check header + header = List.first(lines) + assert header =~ "Name" + assert header =~ "Description" + assert header =~ "Start Date" + end + end + + describe "export_oidc_providers_to_csv/1" do + setup do + # Create providers + {:ok, provider1} = + Repo.insert(%Provider{ + name: "Provider One", + issuer: "https://example1.com", + client_id: "client1", + client_secret: "secret1", + redirect_uri: "https://app.example.com/callback1", + scope: "openid email", + active: true, + inserted_at: ~N[2023-01-01 09:00:00] + }) + + {:ok, provider2} = + Repo.insert(%Provider{ + name: "Provider Two", + issuer: "https://example2.com", + client_id: "client2", + client_secret: "secret2", + redirect_uri: "https://app.example.com/callback2", + scope: "openid profile", + active: false, + inserted_at: ~N[2023-01-01 09:30:00] + }) + + %{providers: [provider1, provider2]} + end + + test "exports providers to CSV format", %{providers: providers} do + csv = CSVExporter.export_oidc_providers_to_csv(providers) + + # CSV should have a header row and two data rows + lines = String.split(csv, "\r\n", trim: true) + assert length(lines) == 3 + + # Check header + header = List.first(lines) + assert header =~ "Name" + assert header =~ "Issuer" + assert header =~ "Client ID" + assert header =~ "Active" + + # Client secret should not be included for security + refute header =~ "Client Secret" + + # Check data rows + assert Enum.at(lines, 1) =~ "Provider One" + assert Enum.at(lines, 1) =~ "https://example1.com" + assert Enum.at(lines, 1) =~ "client1" + assert Enum.at(lines, 1) =~ "Yes" + + assert Enum.at(lines, 2) =~ "Provider Two" + assert Enum.at(lines, 2) =~ "https://example2.com" + assert Enum.at(lines, 2) =~ "client2" + assert Enum.at(lines, 2) =~ "No" + + # Client secrets should not be included in the CSV + refute csv =~ "secret1" + refute csv =~ "secret2" + end + + test "handles empty provider list" do + csv = CSVExporter.export_oidc_providers_to_csv([]) + + # CSV should only have a header row + lines = String.split(csv, "\r\n", trim: true) + assert length(lines) == 1 + + # Check header + header = List.first(lines) + assert header =~ "Name" + assert header =~ "Issuer" + assert header =~ "Client ID" + end + end +end diff --git a/test/support/data_case.ex b/test/support/data_case.ex index 433d6c5..dad6a9b 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -28,9 +28,13 @@ defmodule Claper.DataCase do end end - setup tags do - pid = Ecto.Adapters.SQL.Sandbox.start_owner!(Claper.Repo, shared: not tags[:async]) - on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end) + setup context do + # Don't check out a connection if a setup_all did so already + if context[:sandbox_owner_pid] == nil do + pid = Ecto.Adapters.SQL.Sandbox.start_owner!(Claper.Repo, shared: not context[:async]) + on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end) + end + :ok end diff --git a/test/support/fixtures/events_fixtures.ex b/test/support/fixtures/events_fixtures.ex index b8deb2d..33a11a1 100644 --- a/test/support/fixtures/events_fixtures.ex +++ b/test/support/fixtures/events_fixtures.ex @@ -9,7 +9,27 @@ defmodule Claper.EventsFixtures do require Claper.UtilFixture @doc """ - Generate a event. + Generate an activity leader. + """ + def activity_leader_fixture(attrs \\ %{}, preload \\ []) do + assoc = %{ + event: attrs[:event] || event_fixture(), + user: attrs[:user] || user_fixture() + } + + {:ok, activity_leader} = + attrs + |> Enum.into(%{ + email: assoc.user.email, + event_id: assoc.event.id + }) + |> Claper.Events.create_activity_leader() + + Claper.UtilFixture.merge_preload(activity_leader, preload, assoc) + end + + @doc """ + Generate an event. """ def event_fixture(attrs \\ %{}, preload \\ []) do assoc = %{user: attrs[:user] || user_fixture()} diff --git a/with_env.sh b/with_env.sh new file mode 100755 index 0000000..5c6fd4a --- /dev/null +++ b/with_env.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -a + +# Default environment file +env_file=".env" + +# Parse command-line arguments +while [[ "$#" -gt 0 ]]; do + case "$1" in + --env) + env_file="$2" + shift 2 # Skip the next argument as it's the value for --env + ;; + *) + break # Exit the loop if an unrecognized option is found + ;; + esac +done + +source "$env_file" +set +a + +# Remaining arguments are treated as the command to run +args=("$@") + +# Check if no command is provided +if [ ${#args[@]} -eq 0 ]; then + echo "Usage: $0 [--env path/to/env] " + echo "Example: $0 mix phx.server" + echo "Example: $0 --env path/to/env mix phx.server" + exit 1 +fi + +# Execute the command +"${args[@]}"