From 5853bc34d87f9aedf7714d38e71240a537748eb0 Mon Sep 17 00:00:00 2001 From: Alexandre Lion Date: Thu, 20 Nov 2025 10:44:06 +0100 Subject: [PATCH] Add admin panel and user roles (#189) --- .gitignore | 7 +- CHANGELOG.md | 12 +- CLAUDE.md | 112 +++ assets/css/admin.css | 63 ++ assets/css/app.css | 16 +- assets/css/modern.css | 152 ++++ assets/css/theme.css | 3 +- assets/js/admin-charts.js | 207 +++++ assets/js/app.js | 69 ++ assets/js/hooks.js | 197 ++++ assets/package-lock.json | 66 ++ assets/package.json | 3 + config/config.exs | 7 + config/dev.exs | 1 + dev.sh | 14 - 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 | 30 +- lib/claper/admin.ex | 635 +++++++++++++ lib/claper/embeds/embed.ex | 2 +- lib/claper/events.ex | 439 +++++---- lib/claper/events/event.ex | 11 +- lib/claper/quizzes/quiz.ex | 16 + lib/claper/quizzes/quiz_question.ex | 10 + lib/claper/quizzes/quiz_question_opt.ex | 11 + lib/claper/quizzes/quiz_response.ex | 11 + lib/claper/release.ex | 3 +- lib/claper_web/controllers/stat_controller.ex | 2 +- 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 ++++ lib/claper_web/live/event_live/manage.ex | 2 +- lib/claper_web/live/event_live/presenter.ex | 2 +- lib/claper_web/live/event_live/show.ex | 2 +- lib/claper_web/plugs/admin_required_plug.ex | 33 + lib/claper_web/router.ex | 28 + .../templates/layout/_user_menu.html.heex | 7 + .../templates/layout/admin.html.heex | 316 +++++++ .../validators/admin_form_validator.ex | 122 +++ lib/claper_web/views/admin/shared_view.ex | 3 + lib/claper_web/views/layout_view.ex | 11 + mix.exs | 1 + priv/gettext/de/LC_MESSAGES/default.po | 834 ++++++++++++++++- priv/gettext/default.pot | 833 ++++++++++++++++- priv/gettext/en/LC_MESSAGES/default.po | 834 ++++++++++++++++- priv/gettext/es/LC_MESSAGES/default.po | 838 +++++++++++++++++- priv/gettext/fr/LC_MESSAGES/default.po | 836 ++++++++++++++++- priv/gettext/it/LC_MESSAGES/default.po | 834 ++++++++++++++++- priv/gettext/nl/LC_MESSAGES/default.po | 834 ++++++++++++++++- .../20250711135508_create_roles.exs | 14 + .../20250711135909_add_role_id_to_users.exs | 11 + .../20250711164053_create_oidc_providers.exs | 22 + priv/repo/seeds.exs | 46 + .../Montserrat-Italic-VariableFont_wght.ttf | Bin 0 -> 701156 bytes .../Montserrat-VariableFont_wght.ttf | Bin 0 -> 688600 bytes test/claper/accounts/role_test.exs | 133 +++ test/claper/embeds_test.exs | 8 +- test/claper/events_test.exs | 564 ++++++++++-- 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 + 80 files changed, 13473 insertions(+), 603 deletions(-) create mode 100644 CLAUDE.md create mode 100644 assets/css/admin.css create mode 100644 assets/css/modern.css create mode 100644 assets/js/admin-charts.js create mode 100644 assets/js/hooks.js delete mode 100755 dev.sh 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 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/static/fonts/Montserrat/Montserrat-Italic-VariableFont_wght.ttf create mode 100644 priv/static/fonts/Montserrat/Montserrat-VariableFont_wght.ttf 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/.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 99e20a8..b92989a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,12 @@ ### 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 Latvian language support (@possible-im) -- Add Hungarian language support (@bpisch) +- Add hideable presenter attendee count (#183 #155) +- Add Hungarian translation (#161) +- Add Latvian translation (#163) ### Fixes and improvements @@ -15,7 +18,10 @@ - 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) (@ChayanDass) +- Fix settings scroll for small screen (#168) +- Fix duplicate key quiz when duplicate (#182) +- Fix email change confirmation (#172) +- Fix italian translation (#179) ### v.2.3.2 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/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 5e24308..92da708 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -2,7 +2,7 @@ @import 'animate.css/animate.min.css'; @import 'tailwindcss'; -@import './theme.css'; +@import './theme.css' layer(theme); @layer base { *, @@ -302,6 +302,20 @@ 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, var(--color-secondary-500), var(--color-secondary-600), var(--color-primary-400), var(--color-primary-400)); background-size: 400% 400%; 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 index dc8f31a..10987a5 100644 --- a/assets/css/theme.css +++ b/assets/css/theme.css @@ -1,4 +1,4 @@ -/* Theme variables based on tailwind.config.js */ + @theme { /* Primary Colors (water-blue) */ --color-primary-50: #E3F2FD; @@ -75,6 +75,7 @@ /* 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); 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 4f31905..d277ff0 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -25,7 +25,9 @@ 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; // Get supported locales from backend configuration or fallback to default list @@ -304,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) { @@ -616,6 +631,60 @@ Hooks.Dropdown = { }, }; +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); + }); + }, + + 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 Uploaders = {}; Uploaders.S3 = function (entries, onViewError) { 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 dbc1de5..86b08f2 100644 --- a/assets/package-lock.json +++ b/assets/package-lock.json @@ -9,6 +9,8 @@ "@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", @@ -22,6 +24,7 @@ "devDependencies": { "@tailwindcss/postcss": "^4.1.11", "alpinejs": "^3.13.8", + "daisyui": "^5.0.47", "esbuild": "^0.25.5", "postcss": "^8.4.38", "tailwindcss": "^4.1.11" @@ -560,6 +563,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "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", "resolved": "https://registry.npmjs.org/@sjmc11/tourguidejs/-/tourguidejs-0.0.16.tgz", @@ -921,6 +930,28 @@ "node": ">=8" } }, + "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": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "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/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -954,6 +985,16 @@ "node": ">=18" } }, + "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/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -1881,6 +1922,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@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", "resolved": "https://registry.npmjs.org/@sjmc11/tourguidejs/-/tourguidejs-0.0.16.tgz", @@ -2094,6 +2140,20 @@ "fill-range": "^7.1.1" } }, + "chart.js": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "requires": { + "@kurkle/color": "^0.3.0" + } + }, + "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", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -2115,6 +2175,12 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true }, + "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", diff --git a/assets/package.json b/assets/package.json index e944006..6911815 100644 --- a/assets/package.json +++ b/assets/package.json @@ -5,6 +5,7 @@ "devDependencies": { "@tailwindcss/postcss": "^4.1.11", "alpinejs": "^3.13.8", + "daisyui": "^5.0.47", "esbuild": "^0.25.5", "postcss": "^8.4.38", "tailwindcss": "^4.1.11" @@ -14,6 +15,8 @@ "@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/config/config.exs b/config/config.exs index 2a1dcbf..51120c3 100644 --- a/config/config.exs +++ b/config/config.exs @@ -44,6 +44,13 @@ config :tailwind, --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) diff --git a/config/dev.exs b/config/dev.exs index 3c68d69..41198be 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -14,6 +14,7 @@ config :claper, ClaperWeb.Endpoint, # 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, 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/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 5c08bfd..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,6 +32,7 @@ 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() @@ -37,9 +40,10 @@ defmodule Claper.Accounts.User do 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 @@ -47,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. """ @@ -71,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/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 d42661c..f05bc9d 100644 --- a/lib/claper/embeds/embed.ex +++ b/lib/claper/embeds/embed.ex @@ -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..74fbdf9 100644 --- a/lib/claper/events.ex +++ b/lib/claper/events.ex @@ -8,7 +8,9 @@ defmodule Claper.Events do import Ecto.Query, warn: false alias Claper.Repo + alias Claper.Accounts.User alias Claper.Events.{Event, ActivityLeader} + alias Claper.Presentations @default_page_size 5 @@ -22,7 +24,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 +45,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 +63,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 +85,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) @@ -145,7 +147,7 @@ defmodule Claper.Events do 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() @@ -172,7 +174,7 @@ defmodule Claper.Events do 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 ) @@ -193,8 +195,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 +208,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 +259,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( + a in ActivityLeader, + join: e in Event, + on: e.id == a.event_id, + join: u in User, + on: e.user_id == u.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 +320,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, 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 @@ -384,6 +379,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. @@ -517,7 +521,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 +534,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) + + Claper.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, []) + + Claper.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. diff --git a/lib/claper/events/event.ex b/lib/claper/events/event.ex index daf32c5..4ea9994 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([:name, :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 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 5162aaf..dac101e 100644 --- a/lib/claper/quizzes/quiz_question.ex +++ b/lib/claper/quizzes/quiz_question.ex @@ -4,6 +4,16 @@ defmodule Claper.Quizzes.QuizQuestion do 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 field :type, :string, default: "qcm" 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 9055e21..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 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_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/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/event_live/manage.ex b/lib/claper_web/live/event_live/manage.ex index b9ed708..b6dd0f7 100644 --- a/lib/claper_web/live/event_live/manage.ex +++ b/lib/claper_web/live/event_live/manage.ex @@ -74,7 +74,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 diff --git a/lib/claper_web/live/event_live/presenter.ex b/lib/claper_web/live/event_live/presenter.ex index 93bc610..dbfb96b 100644 --- a/lib/claper_web/live/event_live/presenter.ex +++ b/lib/claper_web/live/event_live/presenter.ex @@ -70,7 +70,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/show.ex b/lib/claper_web/live/event_live/show.ex index 26b5b38..e36bd95 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 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/layout/_user_menu.html.heex b/lib/claper_web/templates/layout/_user_menu.html.heex index 7053d56..70c9a71 100644 --- a/lib/claper_web/templates/layout/_user_menu.html.heex +++ b/lib/claper_web/templates/layout/_user_menu.html.heex @@ -5,6 +5,13 @@ > {gettext("My account")} + + {gettext("Admin")} + + + + + + + {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/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/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/mix.exs b/mix.exs index 884a540..c90adab 100644 --- a/mix.exs +++ b/mix.exs @@ -136,6 +136,7 @@ defmodule Claper.MixProject do "assets.deploy": [ "cmd --cd assets npm install", "tailwind default --minify", + "tailwind admin --minify", "esbuild default --minify", "sass default --no-source-map --style=compressed", "phx.digest" diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 872b256..e731b58 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -8,14 +8,17 @@ 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:1454 +#: lib/claper_web/live/event_live/manage.html.heex:1460 #: 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:841 +#: 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:825 #: 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 @@ -43,6 +46,9 @@ msgstr "Überprüfen Sie, ob alle Felder korrekt ausgefüllt sind." msgid "Change" msgstr "Ändern" +#: 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" @@ -103,9 +109,12 @@ msgstr "Seien Sie der Erste, der reagiert!" msgid "Join" msgstr "Teilnehmen" +#: 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:212 #: 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" @@ -175,6 +184,9 @@ 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 @@ -198,7 +210,7 @@ msgstr "Erstellen" #: 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:1402 #: 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 @@ -357,7 +369,7 @@ 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:194 -#: lib/claper_web/live/event_live/manage.html.heex:788 +#: lib/claper_web/live/event_live/manage.html.heex:785 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Umfrage" @@ -396,7 +408,7 @@ msgstr "Benutzer Email-Adresse" 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:1218 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "Nachrichten von Teilnehmern werden hier erscheinen." @@ -416,7 +428,7 @@ 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:1164 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format @@ -453,7 +465,7 @@ msgid "If you’re having trouble with the button above, copy and paste the URL 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/live/event_live/manage.html.heex:758 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:1129 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "Interaktion hinzufügen" @@ -611,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 @@ -669,23 +682,30 @@ msgid "Edit form" msgstr "Formular bearbeiten" #: lib/claper_web/live/event_live/manage.html.heex:227 -#: lib/claper_web/live/event_live/manage.html.heex:832 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:829 +#: lib/claper_web/live/event_live/manage.html.heex:1414 #, 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:1188 #, 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:1387 #, 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:840 +#: 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:824 #, elixir-autogen, elixir-format msgid "Name" msgstr "Name" @@ -716,7 +736,7 @@ msgstr "Abschicken" msgid "Text" msgstr "Text" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1407 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Dies kann nicht rückgängig gemacht werden. Bestätigen?" @@ -888,7 +908,7 @@ msgid "Title" msgstr "Titel" #: lib/claper_web/live/event_live/manage.html.heex:259 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:871 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Webinhalt" @@ -905,12 +925,12 @@ 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:1180 #, 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:1341 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "Angepinnte Beiträge werden hier angezeigt." @@ -956,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:301 +#: lib/claper_web/live/user_settings_live/show.html.heex:293 #, 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?" @@ -971,17 +991,17 @@ 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:291 +#: lib/claper_web/live/user_settings_live/show.html.heex:283 #, 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:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:280 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Gefahrenzone" -#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#: lib/claper_web/live/user_settings_live/show.html.heex:289 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "Konto löschen" @@ -1011,7 +1031,7 @@ 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:1152 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "Interaktionen der Teilnehmer" @@ -1038,12 +1058,12 @@ msgstr "Moderatoren" msgid "Finish" msgstr "Abschließen" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1154 #, 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:1154 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identifizieren Sie Benutzer anhand ihrer einzigartigen Avatare." @@ -1068,12 +1088,12 @@ msgstr "Wählen Sie Ihre Präsentationsdatei aus. Akzeptierte Formate sind PDF, 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:1456 #, 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:1456 #, 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." @@ -1206,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:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:270 #, elixir-autogen, elixir-format msgid "Language" msgstr "Sprache" @@ -1226,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:1172 #, 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:1259 #, 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:1301 #, 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:1280 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Nach Beliebtheit sortieren" @@ -1252,6 +1272,7 @@ msgid "Event manager" msgstr "Veranstaltungsmanager" #: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Dokumentation" @@ -1333,12 +1354,12 @@ msgstr "Vorschau schließen" 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:1098 #, 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:1115 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Aktivieren" @@ -1543,12 +1564,12 @@ msgstr "Beenden" msgid "More options" msgstr "Weitere Optionen" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "No" msgstr "Nein" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Ja" @@ -1703,7 +1724,7 @@ msgid "Previous" msgstr "Vorherige" #: lib/claper_web/live/event_live/manage.html.heex:291 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:917 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Quiz" @@ -1837,6 +1858,10 @@ msgstr "Einzigartige Teilnehmer" msgid "Web Content" msgstr "Webinhalt" +#: 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" @@ -1857,7 +1882,7 @@ 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" @@ -1887,6 +1912,741 @@ msgstr "Anmelden" 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:48 +#: 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:43 +#: 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:75 +#, 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:23 +#: 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 +#: lib/claper_web/templates/layout/admin.html.heex:246 +#, 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:60 +#: lib/claper_web/live/admin_live/user_live.ex:128 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Benutzer erfolgreich gelöscht" + +#: lib/claper_web/live/admin_live/user_live.ex:49 +#: 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:18 +#: 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:98 +#, 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:42 +#: 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:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:23 +#: 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:65 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "Anbieter erfolgreich gelöscht" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:36 +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:54 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Anbieter" + +#: 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" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 1d28e05..df98553 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -10,14 +10,17 @@ 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:1454 +#: lib/claper_web/live/event_live/manage.html.heex:1460 #: 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:841 +#: 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:825 #: 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 @@ -45,6 +48,9 @@ msgstr "" msgid "Change" msgstr "" +#: 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" @@ -105,9 +111,12 @@ msgstr "" msgid "Join" msgstr "" +#: 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:212 #: 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 "" @@ -177,6 +186,9 @@ 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 @@ -200,7 +212,7 @@ msgstr "" #: 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:1402 #: 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 @@ -359,7 +371,7 @@ msgid "Add poll to know opinion of your public." msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:194 -#: lib/claper_web/live/event_live/manage.html.heex:788 +#: lib/claper_web/live/event_live/manage.html.heex:785 #, elixir-autogen, elixir-format msgid "Poll" msgstr "" @@ -398,7 +410,7 @@ msgstr "" 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:1218 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "" @@ -418,7 +430,7 @@ msgstr "" msgid "Ask, comment..." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1164 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format @@ -455,7 +467,7 @@ msgid "If you’re having trouble with the button above, copy and paste the URL msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:758 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:1129 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "" @@ -613,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 @@ -671,23 +684,30 @@ msgid "Edit form" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:227 -#: lib/claper_web/live/event_live/manage.html.heex:832 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:829 +#: lib/claper_web/live/event_live/manage.html.heex:1414 #, 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:1188 #, 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:1387 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "" -#: lib/claper_web/live/event_live/manage.ex:840 +#: 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:824 #, elixir-autogen, elixir-format msgid "Name" msgstr "" @@ -718,7 +738,7 @@ msgstr "" msgid "Text" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1407 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "" @@ -890,7 +910,7 @@ msgid "Title" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:259 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:871 #, elixir-autogen, elixir-format msgid "Web content" msgstr "" @@ -907,12 +927,12 @@ msgstr "" msgid "Pinned" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1180 #, 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:1341 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "" @@ -958,7 +978,7 @@ msgstr "" msgid "Saved" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:301 +#: lib/claper_web/live/user_settings_live/show.html.heex:293 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "" @@ -973,17 +993,17 @@ msgstr "" msgid "Attendees room" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:291 +#: lib/claper_web/live/user_settings_live/show.html.heex:283 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:280 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#: lib/claper_web/live/user_settings_live/show.html.heex:289 #, elixir-autogen, elixir-format msgid "Delete account" msgstr "" @@ -1013,7 +1033,7 @@ 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:1152 #, elixir-autogen, elixir-format msgid "Attendees interactions" msgstr "" @@ -1040,12 +1060,12 @@ msgstr "" msgid "Finish" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1154 #, 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:1154 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "" @@ -1070,12 +1090,12 @@ msgstr "" 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:1456 #, 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:1456 #, 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 "" @@ -1208,7 +1228,7 @@ msgstr "" msgid "Customize your account" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:270 #, elixir-autogen, elixir-format msgid "Language" msgstr "" @@ -1228,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:1172 #, 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:1259 #, 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:1301 #, 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:1280 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "" @@ -1254,6 +1274,7 @@ msgid "Event manager" msgstr "" #: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "" @@ -1335,12 +1356,12 @@ msgstr "" 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:1098 #, 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:1115 #, elixir-autogen, elixir-format msgid "Enable" msgstr "" @@ -1545,12 +1566,12 @@ msgstr "" msgid "More options" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "No" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "Yes" msgstr "" @@ -1705,7 +1726,7 @@ msgid "Previous" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:291 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:917 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "" @@ -1839,6 +1860,10 @@ msgstr "" msgid "Web Content" msgstr "" +#: 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" @@ -1859,7 +1884,7 @@ 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 "" @@ -1889,6 +1914,740 @@ msgstr "" 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:48 +#: 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:43 +#: 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:75 +#, 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:23 +#: 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 +#: lib/claper_web/templates/layout/admin.html.heex:246 +#, 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:60 +#: lib/claper_web/live/admin_live/user_live.ex:128 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:49 +#: 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:18 +#: 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:98 +#, 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:42 +#: 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:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:23 +#: 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:65 +#, elixir-autogen, elixir-format +msgid "Provider deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:36 +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:54 +#, elixir-autogen, elixir-format +msgid "Provider details" +msgstr "" + +#: 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" + #: lib/claper_web/templates/user_notifier/change.html.heex:17 #, elixir-autogen, elixir-format msgid "Confirm email change" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 4da17fa..ce15514 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -8,14 +8,17 @@ 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:1454 +#: lib/claper_web/live/event_live/manage.html.heex:1460 #: 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:841 +#: 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:825 #: 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 @@ -43,6 +46,9 @@ msgstr "" msgid "Change" msgstr "" +#: 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" @@ -103,9 +109,12 @@ msgstr "" msgid "Join" msgstr "" +#: 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:212 #: 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 "" @@ -175,6 +184,9 @@ 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 @@ -198,7 +210,7 @@ msgstr "" #: 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:1402 #: 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 @@ -357,7 +369,7 @@ msgid "Add poll to know opinion of your public." msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:194 -#: lib/claper_web/live/event_live/manage.html.heex:788 +#: lib/claper_web/live/event_live/manage.html.heex:785 #, elixir-autogen, elixir-format msgid "Poll" msgstr "" @@ -396,7 +408,7 @@ msgstr "" 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:1218 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "" @@ -416,7 +428,7 @@ msgstr "" msgid "Ask, comment..." msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1164 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format @@ -453,7 +465,7 @@ msgid "If you’re having trouble with the button above, copy and paste the URL msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:758 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:1129 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "" @@ -611,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 @@ -669,23 +682,30 @@ msgid "Edit form" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:227 -#: lib/claper_web/live/event_live/manage.html.heex:832 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:829 +#: lib/claper_web/live/event_live/manage.html.heex:1414 #, 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:1188 #, 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:1387 #, elixir-autogen, elixir-format msgid "Form submissions from attendees will appear here." msgstr "" -#: lib/claper_web/live/event_live/manage.ex:840 +#: 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:824 #, elixir-autogen, elixir-format msgid "Name" msgstr "" @@ -716,7 +736,7 @@ msgstr "" msgid "Text" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1407 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "" @@ -888,7 +908,7 @@ msgid "Title" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:259 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:871 #, elixir-autogen, elixir-format msgid "Web content" msgstr "" @@ -905,12 +925,12 @@ msgstr "" msgid "Pinned" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1180 #, 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:1341 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "" @@ -956,7 +976,7 @@ msgstr "" msgid "Saved" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:301 +#: lib/claper_web/live/user_settings_live/show.html.heex:293 #, elixir-autogen, elixir-format msgid "All your events and files will be permanently deleted, are you sure?" msgstr "" @@ -971,17 +991,17 @@ msgstr "" msgid "Attendees room" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:291 +#: lib/claper_web/live/user_settings_live/show.html.heex:283 #, elixir-autogen, elixir-format msgid "Be careful, these actions are irreversible" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:280 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#: lib/claper_web/live/user_settings_live/show.html.heex:289 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "" @@ -1011,7 +1031,7 @@ 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:1152 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "" @@ -1038,12 +1058,12 @@ msgstr "" msgid "Finish" msgstr "" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1154 #, 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:1154 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "" @@ -1068,12 +1088,12 @@ msgstr "" 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:1456 #, 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:1456 #, 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 "" @@ -1206,7 +1226,7 @@ msgstr "" msgid "Customize your account" msgstr "" -#: lib/claper_web/live/user_settings_live/show.html.heex:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:270 #, elixir-autogen, elixir-format msgid "Language" msgstr "" @@ -1226,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:1172 #, 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:1259 #, 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:1301 #, 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:1280 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "" @@ -1252,6 +1272,7 @@ msgid "Event manager" msgstr "" #: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "" @@ -1333,12 +1354,12 @@ msgstr "" 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:1098 #, 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:1115 #, elixir-autogen, elixir-format msgid "Enable" msgstr "" @@ -1543,12 +1564,12 @@ msgstr "" msgid "More options" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "No" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "Yes" msgstr "" @@ -1703,7 +1724,7 @@ msgid "Previous" msgstr "" #: lib/claper_web/live/event_live/manage.html.heex:291 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:917 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "" @@ -1837,6 +1858,10 @@ msgstr "" msgid "Web Content" msgstr "" +#: 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" @@ -1857,7 +1882,7 @@ 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 "" @@ -1887,6 +1912,741 @@ msgstr "" 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:48 +#: 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:43 +#: 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:75 +#, 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:23 +#: 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 +#: lib/claper_web/templates/layout/admin.html.heex:246 +#, 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:60 +#: lib/claper_web/live/admin_live/user_live.ex:128 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/user_live.ex:49 +#: 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:18 +#: 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:98 +#, 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:42 +#: 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:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:23 +#: 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:65 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:36 +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:54 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "" + +#: 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" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po index b4f52eb..a909f67 100644 --- a/priv/gettext/es/LC_MESSAGES/default.po +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -8,14 +8,17 @@ 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:1454 +#: lib/claper_web/live/event_live/manage.html.heex:1460 #: 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:841 +#: 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:825 #: 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 @@ -43,6 +46,9 @@ msgstr "Uy, comprueba que todos los campos estén correctamente rellenados." msgid "Change" msgstr "Cambiar" +#: 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" @@ -103,9 +109,12 @@ msgstr "¡Sé el primero en reaccionar!" msgid "Join" msgstr "Unirse" +#: 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:212 #: 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" @@ -175,6 +184,9 @@ 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 @@ -198,7 +210,7 @@ msgstr "Crear" #: 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:1402 #: 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 @@ -357,7 +369,7 @@ 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:194 -#: lib/claper_web/live/event_live/manage.html.heex:788 +#: lib/claper_web/live/event_live/manage.html.heex:785 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Votación" @@ -396,7 +408,7 @@ msgstr "Dirección email del usuario" 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:1218 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "Los mensajes de los asistentes aparecerán aquí." @@ -416,7 +428,7 @@ 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:1164 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format @@ -453,7 +465,7 @@ msgid "If you’re having trouble with the button above, copy and paste the URL msgstr "Si tienes problemas con el botón superior, copia y pega la URL de debajo en tu navegador" #: lib/claper_web/live/event_live/manage.html.heex:758 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:1129 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "Añadir interacción" @@ -485,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 @@ -580,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 @@ -611,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 @@ -669,23 +682,30 @@ msgid "Edit form" msgstr "Editar formulario" #: lib/claper_web/live/event_live/manage.html.heex:227 -#: lib/claper_web/live/event_live/manage.html.heex:832 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:829 +#: lib/claper_web/live/event_live/manage.html.heex:1414 #, 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:1188 #, 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:1387 #, 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:840 +#: 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:824 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nombre" @@ -716,7 +736,7 @@ msgstr "Enviar" msgid "Text" msgstr "Texto" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1407 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Esto no se puede deshacer, ¿estás seguro/a?" @@ -888,7 +908,7 @@ msgid "Title" msgstr "Título" #: lib/claper_web/live/event_live/manage.html.heex:259 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:871 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Contenido" @@ -905,12 +925,12 @@ 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:1180 #, 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:1341 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "Los mensajes anclados aparecerán aquí." @@ -956,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:301 +#: lib/claper_web/live/user_settings_live/show.html.heex:293 #, 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?" @@ -971,17 +991,17 @@ 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:291 +#: lib/claper_web/live/user_settings_live/show.html.heex:283 #, 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:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:280 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Zona de peligro" -#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#: lib/claper_web/live/user_settings_live/show.html.heex:289 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "Borrar cuenta" @@ -1011,7 +1031,7 @@ 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:1152 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "Interacciones de asistentes" @@ -1038,12 +1058,12 @@ msgstr "Colaboradores" msgid "Finish" msgstr "Finalizar" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1154 #, 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:1154 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identificar usuarios por sus avatares únicos." @@ -1068,12 +1088,12 @@ msgstr "Selecciona tu fichero de presentación. Los formatos aceptados son PDF, 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:1456 #, 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:1456 #, 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." @@ -1206,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:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:270 #, elixir-autogen, elixir-format msgid "Language" msgstr "Idioma" @@ -1226,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:1172 #, 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:1259 #, 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:1301 #, 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:1280 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Ordenar por popularidad" @@ -1252,6 +1272,7 @@ msgid "Event manager" msgstr "Gestor de evento" #: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Documentación" @@ -1333,12 +1354,12 @@ msgstr "Cerrar vista previa" 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:1098 #, 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:1115 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Activar" @@ -1543,12 +1564,12 @@ msgstr "Finalizar" msgid "More options" msgstr "Más opciones" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "No" msgstr "No" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Sí" @@ -1703,7 +1724,7 @@ msgid "Previous" msgstr "Anterior" #: lib/claper_web/live/event_live/manage.html.heex:291 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:917 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Cuestionario" @@ -1837,6 +1858,10 @@ msgstr "Asistentes únicos" msgid "Web Content" msgstr "Contenido web" +#: 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" @@ -1857,7 +1882,7 @@ 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" @@ -1887,6 +1912,741 @@ msgstr "Iniciar sesión" 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:48 +#: 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:43 +#: 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:75 +#, 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:23 +#: 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 +#: lib/claper_web/templates/layout/admin.html.heex:246 +#, 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:60 +#: lib/claper_web/live/admin_live/user_live.ex:128 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Usuario eliminado exitosamente" + +#: lib/claper_web/live/admin_live/user_live.ex:49 +#: 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:18 +#: 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:98 +#, 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:42 +#: 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:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:23 +#: 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:65 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "Proveedor eliminado exitosamente" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:36 +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:54 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Proveedor" + +#: 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" diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po index 57dd75d..ffb508c 100644 --- a/priv/gettext/fr/LC_MESSAGES/default.po +++ b/priv/gettext/fr/LC_MESSAGES/default.po @@ -8,14 +8,17 @@ 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:1454 +#: lib/claper_web/live/event_live/manage.html.heex:1460 #: 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:841 +#: 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:825 #: 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 @@ -43,6 +46,9 @@ msgstr "Oups, vérifiez que tous les champs sont remplis correctement." msgid "Change" msgstr "Changer" +#: 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" @@ -103,9 +109,12 @@ msgstr "Soyez le premier à réagir !" msgid "Join" msgstr "Rejoindre" +#: 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:212 #: 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" @@ -173,8 +182,11 @@ 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 @@ -198,7 +210,7 @@ msgstr "Créer" #: 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:1402 #: 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 @@ -357,7 +369,7 @@ 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:194 -#: lib/claper_web/live/event_live/manage.html.heex:788 +#: lib/claper_web/live/event_live/manage.html.heex:785 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Sondage" @@ -397,7 +409,7 @@ msgstr "Adresse email" 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:1218 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "Les messages des participants apparaîtront ici." @@ -417,7 +429,7 @@ 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:1164 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format @@ -454,7 +466,7 @@ msgid "If you’re having trouble with the button above, copy and paste the URL 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/live/event_live/manage.html.heex:758 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:1129 #, elixir-autogen, elixir-format, fuzzy msgid "Add interaction" msgstr "Ajouter une interaction" @@ -614,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 @@ -673,23 +686,30 @@ msgid "Edit form" msgstr "Modifier" #: lib/claper_web/live/event_live/manage.html.heex:227 -#: lib/claper_web/live/event_live/manage.html.heex:832 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:829 +#: lib/claper_web/live/event_live/manage.html.heex:1414 #, 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:1188 #, 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:1387 #, 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:840 +#: 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:824 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nom" @@ -720,7 +740,7 @@ msgstr "Soumettre" msgid "Text" msgstr "Texte" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1407 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Cela ne peut pas être annulé, confirmez-vous ?" @@ -892,7 +912,7 @@ msgid "Title" msgstr "Titre" #: lib/claper_web/live/event_live/manage.html.heex:259 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:871 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Contenu web" @@ -909,12 +929,12 @@ 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:1180 #, 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:1341 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "Les messages épinglés apparaîtront ici." @@ -960,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:301 +#: lib/claper_web/live/user_settings_live/show.html.heex:293 #, 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 ?" @@ -975,17 +995,17 @@ 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:291 +#: lib/claper_web/live/user_settings_live/show.html.heex:283 #, 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:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:280 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Zone de danger" -#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#: lib/claper_web/live/user_settings_live/show.html.heex:289 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "Supprimer le compte" @@ -1015,7 +1035,7 @@ 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:1152 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "Interactions des participants" @@ -1042,12 +1062,12 @@ msgstr "Animateurs" msgid "Finish" msgstr "Terminer" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1154 #, 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:1154 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identifiez les utilisateurs par leurs avatars uniques." @@ -1072,12 +1092,12 @@ msgstr "Sélectionnez votre fichier de présentation. Les formats acceptés sont 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:1456 #, 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:1456 #, 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." @@ -1210,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:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:270 #, elixir-autogen, elixir-format msgid "Language" msgstr "Langue" @@ -1230,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:1172 #, 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:1259 #, 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:1301 #, 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:1280 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Trier par popularité" @@ -1256,6 +1276,7 @@ msgid "Event manager" msgstr "Gestionnaire d'événement" #: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Documentation" @@ -1337,12 +1358,12 @@ msgstr "Fermer l'aperçu" 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:1098 #, 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:1115 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Activer" @@ -1547,12 +1568,12 @@ msgstr "Terminer" msgid "More options" msgstr "Plus d'options" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "No" msgstr "Non" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Oui" @@ -1707,7 +1728,7 @@ msgid "Previous" msgstr "Précédent" #: lib/claper_web/live/event_live/manage.html.heex:291 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:917 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Quiz" @@ -1841,6 +1862,10 @@ msgstr "Participants uniques" msgid "Web Content" msgstr "Contenu web" +#: 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" @@ -1861,7 +1886,7 @@ 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" @@ -1891,6 +1916,741 @@ msgstr "Se connecter" 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:48 +#: 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:43 +#: 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:75 +#, 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:23 +#: 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 +#: lib/claper_web/templates/layout/admin.html.heex:246 +#, 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:60 +#: lib/claper_web/live/admin_live/user_live.ex:128 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Utilisateur supprimé avec succès" + +#: lib/claper_web/live/admin_live/user_live.ex:49 +#: 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:18 +#: 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:98 +#, 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:42 +#: 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:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:23 +#: 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:65 +#, elixir-autogen, elixir-format +msgid "Provider deleted successfully" +msgstr "Fournisseur supprimé avec succès" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:36 +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:54 +#, elixir-autogen, elixir-format +msgid "Provider details" +msgstr "Détails du fournisseur" + +#: 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" diff --git a/priv/gettext/it/LC_MESSAGES/default.po b/priv/gettext/it/LC_MESSAGES/default.po index 7773727..e514b73 100644 --- a/priv/gettext/it/LC_MESSAGES/default.po +++ b/priv/gettext/it/LC_MESSAGES/default.po @@ -9,14 +9,17 @@ 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:1457 -#: lib/claper_web/live/event_live/manage.html.heex:1463 +#: lib/claper_web/live/event_live/manage.html.heex:1454 +#: lib/claper_web/live/event_live/manage.html.heex:1460 #: 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:841 +#: 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:825 #: 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 @@ -44,6 +47,9 @@ msgstr "Ops, controlla che tutti i campi siano compilati correttamente." msgid "Change" msgstr "Cambia" +#: 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" @@ -104,9 +110,12 @@ msgstr "Reagisci per primo !" msgid "Join" msgstr "Partecipa" +#: 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:212 #: 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" @@ -176,6 +185,9 @@ 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 @@ -199,7 +211,7 @@ msgstr "Crea" #: 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:1402 #: 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 @@ -358,7 +370,7 @@ 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:194 -#: lib/claper_web/live/event_live/manage.html.heex:788 +#: lib/claper_web/live/event_live/manage.html.heex:785 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Sondaggio" @@ -397,7 +409,7 @@ msgstr "Indirizzo email utente" 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:1221 +#: lib/claper_web/live/event_live/manage.html.heex:1218 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "I messaggi delle persone partecipanti appariranno qui." @@ -417,7 +429,7 @@ msgstr "Verranno eliminate tutte le risposte associate e il sondaggio stesso. Se msgid "Ask, comment..." msgstr "Chiedi, commenta..." -#: lib/claper_web/live/event_live/manage.html.heex:1167 +#: lib/claper_web/live/event_live/manage.html.heex:1164 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format @@ -454,7 +466,7 @@ msgid "If you’re having trouble with the button above, copy and paste the URL msgstr "Se riscontri problemi con il pulsante sopra, copia e incolla l'URL sottostante nel tuo browser web" #: lib/claper_web/live/event_live/manage.html.heex:758 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:1129 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "Aggiungi interazione" @@ -612,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 @@ -670,23 +683,30 @@ msgid "Edit form" msgstr "Modifica modulo" #: lib/claper_web/live/event_live/manage.html.heex:227 -#: lib/claper_web/live/event_live/manage.html.heex:832 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:829 +#: lib/claper_web/live/event_live/manage.html.heex:1414 #, elixir-autogen, elixir-format msgid "Form" msgstr "Modulo" -#: lib/claper_web/live/event_live/manage.html.heex:1191 +#: lib/claper_web/live/event_live/manage.html.heex:1188 #, elixir-autogen, elixir-format msgid "Form submissions" msgstr "Invio di moduli" -#: lib/claper_web/live/event_live/manage.html.heex:1390 +#: lib/claper_web/live/event_live/manage.html.heex:1387 #, 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:840 +#: 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:824 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nome" @@ -717,7 +737,7 @@ msgstr "Invia" msgid "Text" msgstr "Testo" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1407 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Questa operazione non può essere annullata, confermi ?" @@ -889,7 +909,7 @@ msgid "Title" msgstr "Titolo" #: lib/claper_web/live/event_live/manage.html.heex:259 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:871 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Contenuto web" @@ -906,12 +926,12 @@ msgstr "Appunta" msgid "Pinned" msgstr "Appuntato" -#: lib/claper_web/live/event_live/manage.html.heex:1183 +#: lib/claper_web/live/event_live/manage.html.heex:1180 #, elixir-autogen, elixir-format msgid "Pinned messages" msgstr "Messaggi appuntati" -#: lib/claper_web/live/event_live/manage.html.heex:1344 +#: lib/claper_web/live/event_live/manage.html.heex:1341 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "I messaggi appuntati verranno visualizzati qui." @@ -957,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:301 +#: lib/claper_web/live/user_settings_live/show.html.heex:293 #, 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?" @@ -972,17 +992,17 @@ 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:291 +#: lib/claper_web/live/user_settings_live/show.html.heex:283 #, 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:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:280 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Zona pericolosa" -#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#: lib/claper_web/live/user_settings_live/show.html.heex:289 #, elixir-autogen, elixir-format msgid "Delete account" msgstr "Elimina utenza" @@ -1012,7 +1032,7 @@ 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:1155 +#: lib/claper_web/live/event_live/manage.html.heex:1152 #, elixir-autogen, elixir-format msgid "Attendees interactions" msgstr "Interazioni con i partecipanti" @@ -1039,12 +1059,12 @@ msgstr "Aiutanti" msgid "Finish" msgstr "Terminato" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1154 #, 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:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1154 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identifica gli utenti tramite i loro avatar unici." @@ -1069,12 +1089,12 @@ msgstr "Seleziona il file della tua presentazione. I formati accettati sono PDF, msgid "Time to launch your presentation!" msgstr "È il momento di lanciare la tua presentazione!" -#: lib/claper_web/live/event_live/manage.html.heex:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1456 #, 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:1459 +#: lib/claper_web/live/event_live/manage.html.heex:1456 #, 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." @@ -1207,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:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:270 #, elixir-autogen, elixir-format msgid "Language" msgstr "Lingua" @@ -1227,22 +1247,22 @@ msgstr "Le tue preferenze sono state aggiornate." msgid "Question" msgstr "Domanda" -#: lib/claper_web/live/event_live/manage.html.heex:1175 +#: lib/claper_web/live/event_live/manage.html.heex:1172 #, elixir-autogen, elixir-format msgid "Questions" msgstr "Domande" -#: lib/claper_web/live/event_live/manage.html.heex:1262 +#: lib/claper_web/live/event_live/manage.html.heex:1259 #, elixir-autogen, elixir-format msgid "Questions will appear here." msgstr "Le domande appariranno qui." -#: lib/claper_web/live/event_live/manage.html.heex:1304 +#: lib/claper_web/live/event_live/manage.html.heex:1301 #, elixir-autogen, elixir-format msgid "Sort by date" msgstr "Ordina per data" -#: lib/claper_web/live/event_live/manage.html.heex:1283 +#: lib/claper_web/live/event_live/manage.html.heex:1280 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Ordina per popolarità" @@ -1253,6 +1273,7 @@ msgid "Event manager" msgstr "Responsabile eventi" #: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Documentazione" @@ -1334,12 +1355,12 @@ msgstr "Chiudi anteprima" msgid "Create your first interaction." msgstr "Crea la tua prima interazione." -#: lib/claper_web/live/event_live/manage.html.heex:1101 +#: lib/claper_web/live/event_live/manage.html.heex:1098 #, elixir-autogen, elixir-format msgid "Disable" msgstr "Disabilita" -#: lib/claper_web/live/event_live/manage.html.heex:1118 +#: lib/claper_web/live/event_live/manage.html.heex:1115 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Abilita" @@ -1544,12 +1565,12 @@ msgstr "Fine" msgid "More options" msgstr "Altre opzioni" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "No" msgstr "No" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Sì" @@ -1704,7 +1725,7 @@ msgid "Previous" msgstr "Precedente" #: lib/claper_web/live/event_live/manage.html.heex:291 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:917 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Quiz" @@ -1838,6 +1859,10 @@ msgstr "Partecipanti unici" msgid "Web Content" msgstr "Contenuto Web" +#: 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" @@ -1858,7 +1883,7 @@ 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" @@ -1888,6 +1913,741 @@ msgstr "Accedi" 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:48 +#: 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:43 +#: 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:75 +#, 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:23 +#: 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 +#: lib/claper_web/templates/layout/admin.html.heex:246 +#, 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:60 +#: lib/claper_web/live/admin_live/user_live.ex:128 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Utente eliminato con successo" + +#: lib/claper_web/live/admin_live/user_live.ex:49 +#: 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:18 +#: 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:98 +#, 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:42 +#: 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:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:23 +#: 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:65 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "Provider eliminato con successo" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:36 +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:54 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Dettagli provider" + +#: 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 msgid "Confirm email change" msgstr "Conferma la modifica dell'email" diff --git a/priv/gettext/nl/LC_MESSAGES/default.po b/priv/gettext/nl/LC_MESSAGES/default.po index 41706c6..99da27b 100644 --- a/priv/gettext/nl/LC_MESSAGES/default.po +++ b/priv/gettext/nl/LC_MESSAGES/default.po @@ -8,14 +8,17 @@ 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:1454 +#: lib/claper_web/live/event_live/manage.html.heex:1460 #: 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:841 +#: 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:825 #: 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 @@ -43,6 +46,9 @@ msgstr "Oeps, controleer of alle velden correct zijn ingevuld." msgid "Change" msgstr "Aanpassen" +#: 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" @@ -103,9 +109,12 @@ msgstr "Wees de eerste die reageert!" msgid "Join" msgstr "Meedoen" +#: 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:212 #: 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" @@ -175,6 +184,9 @@ 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 @@ -198,7 +210,7 @@ msgstr "Aanmaken" #: 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:1402 #: 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 @@ -357,7 +369,7 @@ 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:194 -#: lib/claper_web/live/event_live/manage.html.heex:788 +#: lib/claper_web/live/event_live/manage.html.heex:785 #, elixir-autogen, elixir-format msgid "Poll" msgstr "Peiling" @@ -396,7 +408,7 @@ msgstr "E-mailadres van gebruiker" 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:1218 #, elixir-autogen, elixir-format msgid "Messages from attendees will appear here." msgstr "Hier verschijnen berichten van deelnemers." @@ -416,7 +428,7 @@ 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:1164 #: lib/claper_web/live/stat_live/index.html.heex:102 #: lib/claper_web/live/stat_live/index.html.heex:180 #, elixir-autogen, elixir-format @@ -453,7 +465,7 @@ msgid "If you’re having trouble with the button above, copy and paste the URL msgstr "Als je problemen ondervindt met de bovenstaande knop, kopieer en plak dan de onderstaande URL in de webbrowser" #: lib/claper_web/live/event_live/manage.html.heex:758 -#: lib/claper_web/live/event_live/manage.html.heex:1132 +#: lib/claper_web/live/event_live/manage.html.heex:1129 #, elixir-autogen, elixir-format msgid "Add interaction" msgstr "Voeg interactie toe" @@ -611,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 @@ -669,23 +682,30 @@ msgid "Edit form" msgstr "Formulier bewerken" #: lib/claper_web/live/event_live/manage.html.heex:227 -#: lib/claper_web/live/event_live/manage.html.heex:832 -#: lib/claper_web/live/event_live/manage.html.heex:1417 +#: lib/claper_web/live/event_live/manage.html.heex:829 +#: lib/claper_web/live/event_live/manage.html.heex:1414 #, 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:1188 #, 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:1387 #, 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:840 +#: 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:824 #, elixir-autogen, elixir-format msgid "Name" msgstr "Naam" @@ -716,7 +736,7 @@ msgstr "Indienen" msgid "Text" msgstr "Tekst" -#: lib/claper_web/live/event_live/manage.html.heex:1410 +#: lib/claper_web/live/event_live/manage.html.heex:1407 #, elixir-autogen, elixir-format msgid "This cannot be undone, confirm ?" msgstr "Dit kan niet ongedaan worden gemaakt. Bevestigen ?" @@ -888,7 +908,7 @@ msgid "Title" msgstr "Titel" #: lib/claper_web/live/event_live/manage.html.heex:259 -#: lib/claper_web/live/event_live/manage.html.heex:874 +#: lib/claper_web/live/event_live/manage.html.heex:871 #, elixir-autogen, elixir-format msgid "Web content" msgstr "Webinhoud" @@ -905,12 +925,12 @@ 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:1180 #, 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:1341 #, elixir-autogen, elixir-format msgid "Pinned messages will appear here." msgstr "Hier verschijnen vastgezette berichten." @@ -956,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:301 +#: lib/claper_web/live/user_settings_live/show.html.heex:293 #, 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?" @@ -971,17 +991,17 @@ 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:291 +#: lib/claper_web/live/user_settings_live/show.html.heex:283 #, 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:288 +#: lib/claper_web/live/user_settings_live/show.html.heex:280 #, elixir-autogen, elixir-format msgid "Danger zone" msgstr "Gevarenzone" -#: lib/claper_web/live/user_settings_live/show.html.heex:297 +#: lib/claper_web/live/user_settings_live/show.html.heex:289 #, elixir-autogen, elixir-format, fuzzy msgid "Delete account" msgstr "Account verwijderen" @@ -1011,7 +1031,7 @@ 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:1152 #, elixir-autogen, elixir-format, fuzzy msgid "Attendees interactions" msgstr "Interacties van deelnemers" @@ -1038,12 +1058,12 @@ msgstr "Facilitators" msgid "Finish" msgstr "Finish" -#: lib/claper_web/live/event_live/manage.html.heex:1157 +#: lib/claper_web/live/event_live/manage.html.heex:1154 #, 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:1154 #, elixir-autogen, elixir-format msgid "Identify users by their unique avatars." msgstr "Identificeer gebruikers aan de hand van hun unieke avatars." @@ -1068,12 +1088,12 @@ msgstr "Selecteer het Presentatie. Geaccepteerde formaten zijn PDF, PPT of PPTX. 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:1456 #, 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:1456 #, 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." @@ -1206,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:278 +#: lib/claper_web/live/user_settings_live/show.html.heex:270 #, elixir-autogen, elixir-format msgid "Language" msgstr "Taal" @@ -1226,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:1172 #, 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:1259 #, 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:1301 #, 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:1280 #, elixir-autogen, elixir-format msgid "Sort by popularity" msgstr "Sorteer op populariteit" @@ -1252,6 +1272,7 @@ msgid "Event manager" msgstr "Evenementmanager" #: lib/claper_web/templates/layout/_user_menu.html.heex:12 +#: lib/claper_web/templates/layout/admin.html.heex:262 #, elixir-autogen, elixir-format msgid "Documentation" msgstr "Documentatie" @@ -1333,12 +1354,12 @@ msgstr "Voorvertoning sluiten" 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:1098 #, 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:1115 #, elixir-autogen, elixir-format msgid "Enable" msgstr "Inschakelen" @@ -1543,12 +1564,12 @@ msgstr "Beëindigen" msgid "More options" msgstr "Meer opties" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "No" msgstr "Nee" -#: lib/claper_web/live/event_live/manage.ex:821 +#: lib/claper_web/live/event_live/manage.ex:805 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Ja" @@ -1703,7 +1724,7 @@ msgid "Previous" msgstr "Vorige" #: lib/claper_web/live/event_live/manage.html.heex:291 -#: lib/claper_web/live/event_live/manage.html.heex:920 +#: lib/claper_web/live/event_live/manage.html.heex:917 #, elixir-autogen, elixir-format msgid "Quiz" msgstr "Quiz" @@ -1837,6 +1858,10 @@ msgstr "Unieke deelnemers" msgid "Web Content" msgstr "Webinhoud" +#: 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" @@ -1857,7 +1882,7 @@ 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" @@ -1887,6 +1912,741 @@ msgstr "Inloggen" 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:48 +#: 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:43 +#: 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:75 +#, 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:23 +#: 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 +#: lib/claper_web/templates/layout/admin.html.heex:246 +#, 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:60 +#: lib/claper_web/live/admin_live/user_live.ex:128 +#, elixir-autogen, elixir-format +msgid "User deleted successfully" +msgstr "Gebruiker succesvol verwijderd" + +#: lib/claper_web/live/admin_live/user_live.ex:49 +#: 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:18 +#: 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:98 +#, 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:42 +#: 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:37 +#: lib/claper_web/live/admin_live/user_live.html.heex:23 +#: 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:65 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider deleted successfully" +msgstr "Aanbieder succesvol verwijderd" + +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:36 +#: lib/claper_web/live/admin_live/oidc_provider_live.ex:54 +#, elixir-autogen, elixir-format, fuzzy +msgid "Provider details" +msgstr "Aanbieder details" + +#: 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" 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/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/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..4847494 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,417 @@ 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_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 +436,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 +561,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_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[@]}"