mirror of
https://github.com/ClaperCo/Claper.git
synced 2025-12-16 20:07:59 +01:00
Merge branch 'dev'
This commit is contained in:
2
.tool-versions
Normal file
2
.tool-versions
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
erlang 26.1.2
|
||||||
|
elixir 1.15.7-otp-26
|
||||||
13
CHANGELOG.md
13
CHANGELOG.md
@@ -1,3 +1,16 @@
|
|||||||
|
## v1.7.0
|
||||||
|
|
||||||
|
- Add keyboard shortcuts to control settings (#64) (@Dhanus3133)
|
||||||
|
- Add embed (Youtube or any web content) as an interraction (#72) (@Dhanus3133)
|
||||||
|
- Add pinned messages (#62) (@haruncurak)
|
||||||
|
- Add reset password feature
|
||||||
|
- Add indication when a form is saved
|
||||||
|
- Add Postmark adapter
|
||||||
|
- Add the ability to send mail to facilitators invited to manage an event
|
||||||
|
- Allow navigation within presenter window (#63) (@railsmechanic)
|
||||||
|
- Change default avatar style
|
||||||
|
- Security updates
|
||||||
|
|
||||||
## v1.6.0
|
## v1.6.0
|
||||||
- Improve QR code readability
|
- Improve QR code readability
|
||||||
- Add ARM Docker image
|
- Add ARM Docker image
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ Don't forget to give the project a star! Thanks again!
|
|||||||
2. Create your Feature Branch (`git checkout -b feature/amazing_feature`)
|
2. Create your Feature Branch (`git checkout -b feature/amazing_feature`)
|
||||||
3. Commit your Changes (`git commit -m 'Add some amazing feature'`)
|
3. Commit your Changes (`git commit -m 'Add some amazing feature'`)
|
||||||
4. Push to the Branch (`git push origin feature/amazing_feature`)
|
4. Push to the Branch (`git push origin feature/amazing_feature`)
|
||||||
5. Open a Pull Request
|
5. Open a Pull Request on `dev` branch
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|
||||||
You can contribute to the translations of this project by joining the POEditor project [here](https://poeditor.com/join/project/HbRyvyt3TT).
|
You can contribute to the translations by editing or addind PO files in `/priv/gettext/`
|
||||||
@@ -99,7 +99,7 @@ RUN mkdir /home/nobody && chown nobody /home/nobody
|
|||||||
|
|
||||||
WORKDIR "/app"
|
WORKDIR "/app"
|
||||||
RUN mkdir /app/uploads
|
RUN mkdir /app/uploads
|
||||||
RUN chown nobody /app
|
RUN chown -R nobody /app
|
||||||
|
|
||||||
# Only copy the final release from the build stage
|
# Only copy the final release from the build stage
|
||||||
COPY --from=builder --chown=nobody:root /app/_build/prod/rel/claper ./
|
COPY --from=builder --chown=nobody:root /app/_build/prod/rel/claper ./
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ RUN mkdir /home/nobody && chown nobody /home/nobody
|
|||||||
|
|
||||||
WORKDIR "/app"
|
WORKDIR "/app"
|
||||||
RUN mkdir /app/uploads
|
RUN mkdir /app/uploads
|
||||||
RUN chown nobody /app -R
|
RUN chown -R nobody /app -R
|
||||||
|
|
||||||
# Only copy the final release from the build stage
|
# Only copy the final release from the build stage
|
||||||
COPY --from=builder --chown=nobody:root /app/_build/prod/rel/claper ./
|
COPY --from=builder --chown=nobody:root /app/_build/prod/rel/claper ./
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -113,9 +113,21 @@ A Docker Compose [reference file](https://github.com/ClaperCo/Claper/blob/main/d
|
|||||||
```sh
|
```sh
|
||||||
git clone https://github.com/ClaperCo/Claper.git
|
git clone https://github.com/ClaperCo/Claper.git
|
||||||
cd Claper
|
cd Claper
|
||||||
docker-compose up
|
docker compose up
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Using Docker Compose for Dev
|
||||||
|
|
||||||
|
To easy check new features, it is possible to directly build the Docker image from the source code and run the container with the [docker-compose-dev.yml](https://github.com/ClaperCo/Claper/blob/main/docker-compose-dev.yml) file.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://github.com/ClaperCo/Claper.git
|
||||||
|
cd Claper
|
||||||
|
docker compose -f docker-compose-dev.yml up
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
<!-- CONTRIBUTING -->
|
<!-- CONTRIBUTING -->
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
@@ -139,7 +151,7 @@ Distributed under the GPLv3 License. See `LICENSE.txt` for more information.
|
|||||||
<!-- CONTACT -->
|
<!-- CONTACT -->
|
||||||
## Contact
|
## Contact
|
||||||
|
|
||||||
[](https://twitter.com/alxlion_)
|
[](https://x.com/alxlion_)
|
||||||
|
|
||||||
Project Link: [https://github.com/ClaperCo/Claper](https://github.com/ClaperCo/Claper)
|
Project Link: [https://github.com/ClaperCo/Claper](https://github.com/ClaperCo/Claper)
|
||||||
|
|
||||||
|
|||||||
@@ -328,8 +328,6 @@ Hooks.QRCode = {
|
|||||||
width: this.el.dataset.dynamic ? document.documentElement.clientWidth * .25 : 240,
|
width: this.el.dataset.dynamic ? document.documentElement.clientWidth * .25 : 240,
|
||||||
height: this.el.dataset.dynamic ? document.documentElement.clientWidth * .25 : 240,
|
height: this.el.dataset.dynamic ? document.documentElement.clientWidth * .25 : 240,
|
||||||
margin: 0,
|
margin: 0,
|
||||||
image:
|
|
||||||
"/images/logo.png",
|
|
||||||
data: url,
|
data: url,
|
||||||
cornersSquareOptions: {
|
cornersSquareOptions: {
|
||||||
type: "square"
|
type: "square"
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ export class Manager {
|
|||||||
document.getElementById("slide-preview-" + data.current_page).scrollIntoView({
|
document.getElementById("slide-preview-" + data.current_page).scrollIntoView({
|
||||||
block: 'center',
|
block: 'center',
|
||||||
behavior: 'smooth'
|
behavior: 'smooth'
|
||||||
});
|
});
|
||||||
}, data.timeout ? data.timeout : 0)
|
}, data.timeout ? data.timeout : 0)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
window.addEventListener('keydown', (e) => {
|
window.addEventListener('keydown', (e) => {
|
||||||
|
|
||||||
if (e.target.tagName.toLowerCase() != "input") {
|
if ((e.target.tagName || '').toLowerCase() != "input") {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
|
||||||
switch (e.key) {
|
switch (e.key) {
|
||||||
@@ -41,7 +41,7 @@ export class Manager {
|
|||||||
case 'ArrowDown':
|
case 'ArrowDown':
|
||||||
this.nextPage()
|
this.nextPage()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -54,25 +54,25 @@ export class Manager {
|
|||||||
document.getElementById("slide-preview-" + this.currentPage).scrollIntoView({
|
document.getElementById("slide-preview-" + this.currentPage).scrollIntoView({
|
||||||
block: 'center',
|
block: 'center',
|
||||||
behavior: 'smooth'
|
behavior: 'smooth'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nextPage() {
|
nextPage() {
|
||||||
if(this.currentPage == this.maxPage - 1)
|
if (this.currentPage == this.maxPage - 1)
|
||||||
return;
|
|
||||||
|
|
||||||
this.currentPage += 1;
|
|
||||||
this.context.pushEventTo(this.context.el, "current-page", {"page": this.currentPage.toString()});
|
|
||||||
}
|
|
||||||
|
|
||||||
prevPage() {
|
|
||||||
if(this.currentPage == 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
this.currentPage += 1;
|
||||||
|
this.context.pushEventTo(this.context.el, "current-page", { "page": this.currentPage.toString() });
|
||||||
|
}
|
||||||
|
|
||||||
|
prevPage() {
|
||||||
|
if (this.currentPage == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
this.currentPage -= 1;
|
this.currentPage -= 1;
|
||||||
this.context.pushEventTo(this.context.el, "current-page", {"page": this.currentPage.toString()});
|
this.context.pushEventTo(this.context.el, "current-page", { "page": this.currentPage.toString() });
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ export class Presenter {
|
|||||||
slideBy: 'page',
|
slideBy: 'page',
|
||||||
center: true,
|
center: true,
|
||||||
autoplay: false,
|
autoplay: false,
|
||||||
controls: false,
|
controls: false,
|
||||||
swipeAngle: false,
|
swipeAngle: false,
|
||||||
startIndex: this.currentPage,
|
startIndex: this.currentPage,
|
||||||
loop: false,
|
loop: false,
|
||||||
nav: false
|
nav: false
|
||||||
});
|
});
|
||||||
|
|
||||||
this.context.handleEvent('page', data => {
|
this.context.handleEvent('page', data => {
|
||||||
@@ -35,12 +35,19 @@ export class Presenter {
|
|||||||
if (data.value) {
|
if (data.value) {
|
||||||
document.getElementById("post-list").classList.remove("animate__animated", "animate__fadeOutLeft")
|
document.getElementById("post-list").classList.remove("animate__animated", "animate__fadeOutLeft")
|
||||||
document.getElementById("post-list").classList.add("animate__animated", "animate__fadeInLeft")
|
document.getElementById("post-list").classList.add("animate__animated", "animate__fadeInLeft")
|
||||||
|
|
||||||
|
document.getElementById("pinned-post-list").classList.remove("animate__animated", "animate__fadeOutLeft")
|
||||||
|
document.getElementById("pinned-post-list").classList.add("animate__animated", "animate__fadeInLeft")
|
||||||
} else {
|
} else {
|
||||||
document.getElementById("post-list").classList.remove("animate__animated", "animate__fadeInLeft")
|
document.getElementById("post-list").classList.remove("animate__animated", "animate__fadeInLeft")
|
||||||
document.getElementById("post-list").classList.add("animate__animated", "animate__fadeOutLeft")
|
document.getElementById("post-list").classList.add("animate__animated", "animate__fadeOutLeft")
|
||||||
|
|
||||||
|
document.getElementById("pinned-post-list").classList.remove("animate__animated", "animate__fadeInLeft")
|
||||||
|
document.getElementById("pinned-post-list").classList.add("animate__animated", "animate__fadeOutLeft")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
this.context.handleEvent('poll-visible', data => {
|
this.context.handleEvent('poll-visible', data => {
|
||||||
if (data.value) {
|
if (data.value) {
|
||||||
document.getElementById("poll").classList.remove("animate__animated", "animate__fadeOut")
|
document.getElementById("poll").classList.remove("animate__animated", "animate__fadeOut")
|
||||||
@@ -69,37 +76,49 @@ export class Presenter {
|
|||||||
case 'f': // F
|
case 'f': // F
|
||||||
this.fullscreen()
|
this.fullscreen()
|
||||||
break
|
break
|
||||||
}
|
case 'ArrowUp':
|
||||||
|
window.opener.dispatchEvent(new KeyboardEvent('keydown', { 'key': 'ArrowUp' }));
|
||||||
|
break
|
||||||
|
case 'ArrowLeft':
|
||||||
|
window.opener.dispatchEvent(new KeyboardEvent('keydown', { 'key': 'ArrowLeft' }));
|
||||||
|
break
|
||||||
|
case 'ArrowRight':
|
||||||
|
window.opener.dispatchEvent(new KeyboardEvent('keydown', { 'key': 'ArrowRight' }));
|
||||||
|
break
|
||||||
|
case 'ArrowDown':
|
||||||
|
window.opener.dispatchEvent(new KeyboardEvent('keydown', { 'key': 'ArrowDown' }));
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fullscreen() {
|
fullscreen() {
|
||||||
|
|
||||||
var docEl = document.getElementById("presenter")
|
var docEl = document.getElementById("presenter")
|
||||||
|
|
||||||
try {
|
try {
|
||||||
docEl.webkitRequestFullscreen()
|
docEl.webkitRequestFullscreen()
|
||||||
.then(function() {
|
.then(function () {
|
||||||
})
|
})
|
||||||
.catch(function(error) {
|
.catch(function (error) {
|
||||||
|
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
docEl.requestFullscreen()
|
docEl.requestFullscreen()
|
||||||
.then(function() {
|
.then(function () {
|
||||||
})
|
})
|
||||||
.catch(function(error) {
|
.catch(function (error) {
|
||||||
});
|
});
|
||||||
|
|
||||||
docEl.mozRequestFullScreen()
|
docEl.mozRequestFullScreen()
|
||||||
.then(function() {
|
.then(function () {
|
||||||
})
|
})
|
||||||
.catch(function(error) {
|
.catch(function (error) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
6997
assets/package-lock.json
generated
6997
assets/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -3,13 +3,12 @@
|
|||||||
"deploy": "NODE_ENV=production tailwindcss --postcss --minify --input=css/app.css --output=../priv/static/assets/app.css"
|
"deploy": "NODE_ENV=production tailwindcss --postcss --minify --input=css/app.css --output=../priv/static/assets/app.css"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"alpinejs": "^3.4.2",
|
"alpinejs": "^3.13.1",
|
||||||
"autoprefixer": "^10.3.7",
|
"autoprefixer": "^10.4.15",
|
||||||
"cpx": "^1.5.0",
|
"esbuild": "^0.14.54",
|
||||||
"esbuild": "^0.14.14",
|
"flatpickr": "^4.6.13",
|
||||||
"flatpickr": "^4.6.9",
|
"postcss": "^8.4.29",
|
||||||
"postcss": "^8.3.9",
|
"postcss-import": "^15.1.0",
|
||||||
"postcss-import": "^14.0.2",
|
|
||||||
"tailwindcss": "^3.3.3"
|
"tailwindcss": "^3.3.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -80,27 +80,25 @@ const colors = {
|
|||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
mode: 'jit',
|
mode: 'jit',
|
||||||
purge: {
|
content: [
|
||||||
content: [
|
'./js/**/*.js',
|
||||||
'./js/**/*.js',
|
'../lib/*_web/**/*.*ex'
|
||||||
'../lib/*_web/**/*.*ex'
|
],
|
||||||
],
|
safelist: [
|
||||||
safelist: [
|
'-top-1.5',
|
||||||
'-top-1.5',
|
'top-1',
|
||||||
'top-1',
|
'left-3',
|
||||||
'left-3',
|
'top-6',
|
||||||
'top-6',
|
'h-5',
|
||||||
'h-5',
|
'left-2.5',
|
||||||
'left-2.5',
|
'top-3',
|
||||||
'top-3',
|
'h-7',
|
||||||
'h-7',
|
'bg-secondary-600',
|
||||||
'bg-secondary-600',
|
'text-white',
|
||||||
'text-white',
|
'bg-white',
|
||||||
'bg-white',
|
'text-gray-600'
|
||||||
'text-gray-600'
|
],
|
||||||
]
|
darkMode: 'media',
|
||||||
},
|
|
||||||
darkMode: false, // or 'media' or 'class'
|
|
||||||
theme: {
|
theme: {
|
||||||
extend: {
|
extend: {
|
||||||
backgroundSize: {
|
backgroundSize: {
|
||||||
|
|||||||
1876
assets/yarn.lock
1876
assets/yarn.lock
File diff suppressed because it is too large
Load Diff
@@ -20,18 +20,6 @@ config :claper, ClaperWeb.Gettext,
|
|||||||
default_locale: "en",
|
default_locale: "en",
|
||||||
locales: ~w(fr en de)
|
locales: ~w(fr en de)
|
||||||
|
|
||||||
# Configures the mailer
|
|
||||||
#
|
|
||||||
# By default it uses the "Local" adapter which stores the emails
|
|
||||||
# locally. You can see the emails in your browser, at "/dev/mailbox".
|
|
||||||
#
|
|
||||||
# For production it's recommended to configure a different adapter
|
|
||||||
# at the `config/runtime.exs`.
|
|
||||||
config :claper, Claper.Mailer, adapter: Swoosh.Adapters.Local
|
|
||||||
|
|
||||||
# Swoosh API client is needed for adapters other than SMTP.
|
|
||||||
config :swoosh, :api_client, false
|
|
||||||
|
|
||||||
config :dart_sass,
|
config :dart_sass,
|
||||||
version: "1.58.0",
|
version: "1.58.0",
|
||||||
default: [
|
default: [
|
||||||
|
|||||||
@@ -110,18 +110,32 @@ config :claper, ClaperWeb.MailboxGuard,
|
|||||||
get_var_from_path_or_env(config_dir, "ENABLE_MAILBOX_ROUTE", "false")
|
get_var_from_path_or_env(config_dir, "ENABLE_MAILBOX_ROUTE", "false")
|
||||||
|> String.to_existing_atom()
|
|> String.to_existing_atom()
|
||||||
|
|
||||||
if mail_transport == "smtp" do
|
case mail_transport do
|
||||||
config :claper, Claper.Mailer,
|
"smtp" ->
|
||||||
adapter: Swoosh.Adapters.SMTP,
|
config :claper, Claper.Mailer,
|
||||||
relay: smtp_relay,
|
adapter: Swoosh.Adapters.SMTP,
|
||||||
username: smtp_username,
|
relay: smtp_relay,
|
||||||
password: smtp_password,
|
username: smtp_username,
|
||||||
ssl: smtp_ssl,
|
password: smtp_password,
|
||||||
# always, never, if_available
|
ssl: smtp_ssl,
|
||||||
tls: smtp_tls,
|
# always, never, if_available
|
||||||
# always, never, if_available
|
tls: smtp_tls,
|
||||||
auth: smtp_auth,
|
# always, never, if_available
|
||||||
port: smtp_port
|
auth: smtp_auth,
|
||||||
|
port: smtp_port
|
||||||
|
|
||||||
|
config :swoosh, :api_client, false
|
||||||
|
|
||||||
|
"postmark" ->
|
||||||
|
config :claper, Claper.Mailer,
|
||||||
|
adapter: Swoosh.Adapters.Postmark,
|
||||||
|
api_key: get_var_from_path_or_env(config_dir, "POSTMARK_API_KEY", nil)
|
||||||
|
|
||||||
|
config :swoosh, :api_client, Swoosh.ApiClient.Hackney
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
config :claper, Claper.Mailer, adapter: Swoosh.Adapters.Local
|
||||||
|
config :swoosh, :api_client, false
|
||||||
end
|
end
|
||||||
|
|
||||||
config :ex_aws,
|
config :ex_aws,
|
||||||
|
|||||||
38
docker-compose-dev.yml
Normal file
38
docker-compose-dev.yml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
version: "3.0"
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: postgres:9
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
|
volumes:
|
||||||
|
- postgres-data:/var/lib/postgresql/data
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: claper
|
||||||
|
POSTGRES_USER: claper
|
||||||
|
POSTGRES_DB: claper
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U claper"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
app:
|
||||||
|
build: .
|
||||||
|
user: 0:0
|
||||||
|
ports:
|
||||||
|
- 4000:4000
|
||||||
|
volumes:
|
||||||
|
- uploads:/app/uploads
|
||||||
|
environment:
|
||||||
|
DATABASE_URL: postgres://claper:claper@db:5432/claper
|
||||||
|
SECRET_KEY_BASE: 0LZiQBLw4WvqPlz4cz8RsHJlxNiSqM9B48y4ChyJ5v1oA0L/TPIqRjQNdPZN3iEG
|
||||||
|
MAIL_TRANSPORT: local
|
||||||
|
ENDPOINT_PORT: 4000
|
||||||
|
PRESENTATION_STORAGE: local
|
||||||
|
MAX_FILE_SIZE_MB: 15
|
||||||
|
ENABLE_ACCOUNT_CREATION: true
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
volumes:
|
||||||
|
postgres-data:
|
||||||
|
uploads:
|
||||||
@@ -10,8 +10,14 @@ services:
|
|||||||
POSTGRES_PASSWORD: claper
|
POSTGRES_PASSWORD: claper
|
||||||
POSTGRES_USER: claper
|
POSTGRES_USER: claper
|
||||||
POSTGRES_DB: claper
|
POSTGRES_DB: claper
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U claper"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
app:
|
app:
|
||||||
image: ghcr.io/claperco/claper:latest
|
image: ghcr.io/claperco/claper:latest
|
||||||
|
user: 0:0
|
||||||
ports:
|
ports:
|
||||||
- 4000:4000
|
- 4000:4000
|
||||||
volumes:
|
volumes:
|
||||||
@@ -25,6 +31,7 @@ services:
|
|||||||
MAX_FILE_SIZE_MB: 15
|
MAX_FILE_SIZE_MB: 15
|
||||||
ENABLE_ACCOUNT_CREATION: true
|
ENABLE_ACCOUNT_CREATION: true
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
db:
|
||||||
|
condition: service_healthy
|
||||||
volumes:
|
volumes:
|
||||||
uploads:
|
uploads:
|
||||||
@@ -19,7 +19,7 @@ AWS_REGION | - | - | _only for s3_ | The region where the bucket is located
|
|||||||
|
|
||||||
Variable | Values | Default | Required | Description
|
Variable | Values | Default | Required | Description
|
||||||
--- | --- | --- | --- | ---
|
--- | --- | --- | --- | ---
|
||||||
MAIL_TRANSPORT | local, smtp | local | - | Define how the emails will be sent
|
MAIL_TRANSPORT | local, smtp, postmark | local | - | Define how the emails will be sent
|
||||||
MAIL_FROM | - | Claper | - | Email address used to send emails
|
MAIL_FROM | - | Claper | - | Email address used to send emails
|
||||||
MAIL_FROM_NAME | - | noreply@claper.co | - | Name used to send emails
|
MAIL_FROM_NAME | - | noreply@claper.co | - | Name used to send emails
|
||||||
SMTP_RELAY | - | - | _only for smtp_ | SMTP relay server
|
SMTP_RELAY | - | - | _only for smtp_ | SMTP relay server
|
||||||
@@ -32,6 +32,7 @@ SMTP_SSL | true, false | true | - | SMTP SSL
|
|||||||
ENABLE_MAILBOX_ROUTE | true, false | false | - | Enable/disable route to local mailbox (`/dev/mailbox`)
|
ENABLE_MAILBOX_ROUTE | true, false | false | - | Enable/disable route to local mailbox (`/dev/mailbox`)
|
||||||
MAILBOX_USER | - | - | - | Basic auth user for mailbox route
|
MAILBOX_USER | - | - | - | Basic auth user for mailbox route
|
||||||
MAILBOX_PASSWORD | - | - | - | Basic auth password for mailbox route
|
MAILBOX_PASSWORD | - | - | - | Basic auth password for mailbox route
|
||||||
|
POSTMARK_API_KEY | - | - | _only for postmark_ | Postmark API key
|
||||||
|
|
||||||
### Application
|
### Application
|
||||||
|
|
||||||
|
|||||||
@@ -53,9 +53,20 @@ A Docker Compose [reference file](https://github.com/ClaperCo/Claper/blob/main/d
|
|||||||
```sh
|
```sh
|
||||||
git clone https://github.com/ClaperCo/Claper.git
|
git clone https://github.com/ClaperCo/Claper.git
|
||||||
cd Claper
|
cd Claper
|
||||||
docker-compose up
|
docker compose up
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Using Docker Compose for Dev
|
||||||
|
|
||||||
|
To easy check new features, it is possible to directly build the Docker image from the source code and run the container with the [docker-compose-dev.yml](https://github.com/ClaperCo/Claper/blob/main/docker-compose-dev.yml) file.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://github.com/ClaperCo/Claper.git
|
||||||
|
cd Claper
|
||||||
|
docker compose -f docker-compose-dev.yml up
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### ARM architecture
|
### ARM architecture
|
||||||
|
|
||||||
If you are using an ARM architecture (like Apple M1), the original Docker image won't work. You can build the image yourself by replacing the `BUILDER_IMAGE` argument in the `Dockerfile` with `ARG BUILDER_IMAGE="hexpm/elixir-arm64:1.13.2-erlang-24.2.1-debian-bullseye-20210902-slim"` and then build the image as described above.
|
If you are using an ARM architecture (like Apple M1), the original Docker image won't work. You can build the image yourself by replacing the `BUILDER_IMAGE` argument in the `Dockerfile` with `ARG BUILDER_IMAGE="hexpm/elixir-arm64:1.13.2-erlang-24.2.1-debian-bullseye-20210902-slim"` and then build the image as described above.
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ Users can send instant message during the presentation and interact to others me
|
|||||||
|
|
||||||
You can choose to be anoynmous or use your own name before sending a message.
|
You can choose to be anoynmous or use your own name before sending a message.
|
||||||
|
|
||||||
|
You can also pin a message to the screen to highlight it and only show pinned messages.
|
||||||
|
|
||||||
## Polls
|
## Polls
|
||||||
|
|
||||||
You can add polls during your presentation. Users can vote to the poll and see the results in real time.
|
You can add polls during your presentation. Users can vote to the poll and see the results in real time.
|
||||||
@@ -32,6 +34,14 @@ When you create a new presentation, click on **Present/Customize**, select the s
|
|||||||
|
|
||||||
After your presentation, you can export all the submissions in CSV format.
|
After your presentation, you can export all the submissions in CSV format.
|
||||||
|
|
||||||
|
## Web content
|
||||||
|
|
||||||
|
Any web content like Youtube, Slideshare, Google Slides, etc. can be embedded in your presentation.
|
||||||
|
|
||||||
|
When you create a new presentation, click on **Present/Customize**, select the slide where you want to add embed and click **Add interaction**.
|
||||||
|
|
||||||
|
You can choose to show the embed in the attendee side, so your audience can see the embed content during your presentation.
|
||||||
|
|
||||||
## Moderation tools
|
## Moderation tools
|
||||||
|
|
||||||
You can moderate the messages during your presentation. You can delete messages or ban users from the dashboard.
|
You can moderate the messages during your presentation. You can delete messages or ban users from the dashboard.
|
||||||
|
|||||||
11
lib/claper/accounts/leader_notifier.ex
Normal file
11
lib/claper/accounts/leader_notifier.ex
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
defmodule Claper.Accounts.LeaderNotifier do
|
||||||
|
alias Claper.Mailer
|
||||||
|
|
||||||
|
def deliver_event_invitation(event_name, email, url) do
|
||||||
|
e = ClaperWeb.Notifiers.LeaderNotifier.event_invitation(event_name, email, url)
|
||||||
|
|
||||||
|
with {:ok, _metadata} <- Mailer.deliver(e) do
|
||||||
|
{:ok, email}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -73,7 +73,7 @@ defmodule Claper.Accounts.User do
|
|||||||
def password_changeset(user, attrs, opts \\ []) do
|
def password_changeset(user, attrs, opts \\ []) do
|
||||||
user
|
user
|
||||||
|> cast(attrs, [:password])
|
|> cast(attrs, [:password])
|
||||||
|> validate_confirmation(:password, message: "does not match password")
|
|> validate_confirmation(:password)
|
||||||
|> validate_password(opts)
|
|> validate_password(opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,13 @@ defmodule Claper.Accounts.UserNotifier do
|
|||||||
|
|
||||||
# Delivers the email using the application mailer.
|
# Delivers the email using the application mailer.
|
||||||
defp deliver(recipient, subject, body) do
|
defp deliver(recipient, subject, body) do
|
||||||
|
from_name = Application.get_env(:claper, :mail)[:from_name]
|
||||||
|
from_email = Application.get_env(:claper, :mail)[:from]
|
||||||
|
|
||||||
email =
|
email =
|
||||||
new()
|
new()
|
||||||
|> to(recipient)
|
|> to(recipient)
|
||||||
|> from({"MyApp", "contact@example.com"})
|
|> from({from_name, from_email})
|
||||||
|> subject(subject)
|
|> subject(subject)
|
||||||
|> text_body(body)
|
|> text_body(body)
|
||||||
|
|
||||||
|
|||||||
189
lib/claper/embeds.ex
Normal file
189
lib/claper/embeds.ex
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
defmodule Claper.Embeds do
|
||||||
|
@moduledoc """
|
||||||
|
The Embeds context.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import Ecto.Query, warn: false
|
||||||
|
alias Claper.Repo
|
||||||
|
|
||||||
|
alias Claper.Embeds.Embed
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Returns the list of embeds for a given presentation file.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> list_embeds(123)
|
||||||
|
[%Embed{}, ...]
|
||||||
|
|
||||||
|
"""
|
||||||
|
def list_embeds(presentation_file_id) do
|
||||||
|
from(e in Embed,
|
||||||
|
where: e.presentation_file_id == ^presentation_file_id,
|
||||||
|
order_by: [asc: e.id, asc: e.position]
|
||||||
|
)
|
||||||
|
|> Repo.all()
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Returns the list of embeds for a given presentation file and a given position.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> list_embeds_at_position(123, 0)
|
||||||
|
[%Embed{}, ...]
|
||||||
|
|
||||||
|
"""
|
||||||
|
def list_embeds_at_position(presentation_file_id, position) do
|
||||||
|
from(e in Embed,
|
||||||
|
where: e.presentation_file_id == ^presentation_file_id and e.position == ^position,
|
||||||
|
order_by: [asc: e.id]
|
||||||
|
)
|
||||||
|
|> Repo.all()
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a single embed.
|
||||||
|
|
||||||
|
Raises `Ecto.NoResultsError` if the Embed does not exist.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> get_embed!(123)
|
||||||
|
%Embed{}
|
||||||
|
|
||||||
|
iex> get_embed!(456)
|
||||||
|
** (Ecto.NoResultsError)
|
||||||
|
|
||||||
|
"""
|
||||||
|
def get_embed!(id, preload \\ []),
|
||||||
|
do: Repo.get!(Embed, id) |> Repo.preload(preload)
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a single embed for a given position.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> get_embed_current_position(123, 0)
|
||||||
|
%Embed{}
|
||||||
|
|
||||||
|
"""
|
||||||
|
def get_embed_current_position(presentation_file_id, position) do
|
||||||
|
from(e in Embed,
|
||||||
|
where:
|
||||||
|
e.position == ^position and e.presentation_file_id == ^presentation_file_id and
|
||||||
|
e.enabled == true
|
||||||
|
)
|
||||||
|
|> Repo.one()
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Creates a embed.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> create_embed(%{field: value})
|
||||||
|
{:ok, %Embed{}}
|
||||||
|
|
||||||
|
iex> create_embed(%{field: bad_value})
|
||||||
|
{:error, %Ecto.Changeset{}}
|
||||||
|
|
||||||
|
"""
|
||||||
|
def create_embed(attrs \\ %{}) do
|
||||||
|
%Embed{}
|
||||||
|
|> Embed.changeset(attrs)
|
||||||
|
|> Repo.insert()
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Updates a embed.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> update_embed("123e4567-e89b-12d3-a456-426614174000", embed, %{field: new_value})
|
||||||
|
{:ok, %Embed{}}
|
||||||
|
|
||||||
|
iex> update_embed("123e4567-e89b-12d3-a456-426614174000", embed, %{field: bad_value})
|
||||||
|
{:error, %Ecto.Changeset{}}
|
||||||
|
|
||||||
|
"""
|
||||||
|
def update_embed(event_uuid, %Embed{} = embed, attrs) do
|
||||||
|
embed
|
||||||
|
|> Embed.changeset(attrs)
|
||||||
|
|> Repo.update()
|
||||||
|
|> case do
|
||||||
|
{:ok, embed} ->
|
||||||
|
broadcast({:ok, embed, event_uuid}, :embed_updated)
|
||||||
|
|
||||||
|
{:error, changeset} ->
|
||||||
|
{:error, %{changeset | action: :update}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Deletes a embed.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> delete_embed("123e4567-e89b-12d3-a456-426614174000", embed)
|
||||||
|
{:ok, %Embed{}}
|
||||||
|
|
||||||
|
iex> delete_embed("123e4567-e89b-12d3-a456-426614174000", embed)
|
||||||
|
{:error, %Ecto.Changeset{}}
|
||||||
|
|
||||||
|
"""
|
||||||
|
def delete_embed(event_uuid, %Embed{} = embed) do
|
||||||
|
{:ok, embed} = Repo.delete(embed)
|
||||||
|
broadcast({:ok, embed, event_uuid}, :embed_deleted)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Returns an `%Ecto.Changeset{}` for tracking embed changes.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> change_embed(embed)
|
||||||
|
%Ecto.Changeset{data: %Embed{}}
|
||||||
|
|
||||||
|
"""
|
||||||
|
def change_embed(%Embed{} = embed, attrs \\ %{}) do
|
||||||
|
Embed.changeset(embed, attrs)
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable_all(presentation_file_id, position) do
|
||||||
|
from(e in Embed,
|
||||||
|
where: e.presentation_file_id == ^presentation_file_id and e.position == ^position
|
||||||
|
)
|
||||||
|
|> Repo.update_all(set: [enabled: false])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_status(id, presentation_file_id, position, status) do
|
||||||
|
if status do
|
||||||
|
from(e in Embed,
|
||||||
|
where:
|
||||||
|
e.presentation_file_id == ^presentation_file_id and e.position == ^position and
|
||||||
|
e.id != ^id
|
||||||
|
)
|
||||||
|
|> Repo.update_all(set: [enabled: false])
|
||||||
|
end
|
||||||
|
|
||||||
|
from(e in Embed,
|
||||||
|
where:
|
||||||
|
e.presentation_file_id == ^presentation_file_id and e.position == ^position and
|
||||||
|
e.id == ^id
|
||||||
|
)
|
||||||
|
|> Repo.update_all(set: [enabled: status])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp broadcast({:error, _reason} = error, _embed), do: error
|
||||||
|
|
||||||
|
defp broadcast({:ok, embed, event_uuid}, event) do
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{event_uuid}",
|
||||||
|
{event, embed}
|
||||||
|
)
|
||||||
|
|
||||||
|
{:ok, embed}
|
||||||
|
end
|
||||||
|
end
|
||||||
41
lib/claper/embeds/embed.ex
Normal file
41
lib/claper/embeds/embed.ex
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
defmodule Claper.Embeds.Embed do
|
||||||
|
use Ecto.Schema
|
||||||
|
import Ecto.Changeset
|
||||||
|
import ClaperWeb.Gettext
|
||||||
|
|
||||||
|
@derive {Jason.Encoder, only: [:title, :content, :position, :attendee_visibility]}
|
||||||
|
schema "embeds" do
|
||||||
|
field :title, :string
|
||||||
|
field :content, :string
|
||||||
|
field :enabled, :boolean, default: true
|
||||||
|
field :position, :integer, default: 0
|
||||||
|
field :attendee_visibility, :boolean, default: false
|
||||||
|
|
||||||
|
belongs_to :presentation_file, Claper.Presentations.PresentationFile
|
||||||
|
|
||||||
|
timestamps()
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def changeset(embed, attrs \\ %{}) do
|
||||||
|
embed
|
||||||
|
|> cast(attrs, [
|
||||||
|
:enabled,
|
||||||
|
:title,
|
||||||
|
:content,
|
||||||
|
:presentation_file_id,
|
||||||
|
:position,
|
||||||
|
:attendee_visibility
|
||||||
|
])
|
||||||
|
|> validate_required([
|
||||||
|
:title,
|
||||||
|
:content,
|
||||||
|
:presentation_file_id,
|
||||||
|
:position,
|
||||||
|
:attendee_visibility
|
||||||
|
])
|
||||||
|
|> validate_format(:content, ~r/<iframe.*<\/iframe>/,
|
||||||
|
message: gettext("Invalid embed format (should start with <iframe> and end with </iframe>)")
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -275,11 +275,12 @@ defmodule Claper.Events do
|
|||||||
|> Ecto.Multi.run(:from_event, fn _repo, _changes ->
|
|> Ecto.Multi.run(:from_event, fn _repo, _changes ->
|
||||||
{:ok,
|
{:ok,
|
||||||
get_user_event!(user_id, from_event_uuid,
|
get_user_event!(user_id, from_event_uuid,
|
||||||
presentation_file: [polls: [:poll_opts], forms: []]
|
presentation_file: [polls: [:poll_opts], forms: [], embeds: []]
|
||||||
)}
|
)}
|
||||||
end)
|
end)
|
||||||
|> Ecto.Multi.run(:to_event, fn _repo, _changes ->
|
|> Ecto.Multi.run(:to_event, fn _repo, _changes ->
|
||||||
{:ok, get_user_event!(user_id, to_event_uuid, presentation_file: [:polls, :forms])}
|
{:ok,
|
||||||
|
get_user_event!(user_id, to_event_uuid, presentation_file: [:polls, :forms, :embeds])}
|
||||||
end)
|
end)
|
||||||
|> Ecto.Multi.run(:polls, fn _repo, %{from_event: from_event, to_event: to_event} ->
|
|> Ecto.Multi.run(:polls, fn _repo, %{from_event: from_event, to_event: to_event} ->
|
||||||
{:ok,
|
{:ok,
|
||||||
@@ -321,6 +322,22 @@ defmodule Claper.Events do
|
|||||||
end
|
end
|
||||||
end)}
|
end)}
|
||||||
end)
|
end)
|
||||||
|
|> Ecto.Multi.run(:embeds, fn _repo, %{from_event: from_event, to_event: to_event} ->
|
||||||
|
{:ok,
|
||||||
|
from_event.presentation_file.embeds
|
||||||
|
|> Enum.each(fn embed ->
|
||||||
|
if embed.position < to_event.presentation_file.length do
|
||||||
|
Claper.Embeds.create_embed(%{
|
||||||
|
title: embed.title,
|
||||||
|
content: embed.content,
|
||||||
|
position: embed.position,
|
||||||
|
enabled: embed.enabled,
|
||||||
|
attendee_visibility: embed.attendee_visibility,
|
||||||
|
presentation_file_id: to_event.presentation_file.id
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end)}
|
||||||
|
end)
|
||||||
|> Repo.transaction() do
|
|> Repo.transaction() do
|
||||||
{:ok, %{to_event: to_event}} -> {:ok, to_event}
|
{:ok, %{to_event: to_event}} -> {:ok, to_event}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -181,20 +181,22 @@ defmodule Claper.Forms do
|
|||||||
|> Repo.update_all(set: [enabled: false])
|
|> Repo.update_all(set: [enabled: false])
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_default(id, presentation_file_id, position) do
|
def set_status(id, presentation_file_id, position, status) do
|
||||||
from(f in Form,
|
if status do
|
||||||
where:
|
from(f in Form,
|
||||||
f.presentation_file_id == ^presentation_file_id and f.position == ^position and
|
where:
|
||||||
f.id != ^id
|
f.presentation_file_id == ^presentation_file_id and f.position == ^position and
|
||||||
)
|
f.id != ^id
|
||||||
|> Repo.update_all(set: [enabled: false])
|
)
|
||||||
|
|> Repo.update_all(set: [enabled: false])
|
||||||
|
end
|
||||||
|
|
||||||
from(f in Form,
|
from(f in Form,
|
||||||
where:
|
where:
|
||||||
f.presentation_file_id == ^presentation_file_id and f.position == ^position and
|
f.presentation_file_id == ^presentation_file_id and f.position == ^position and
|
||||||
f.id == ^id
|
f.id == ^id
|
||||||
)
|
)
|
||||||
|> Repo.update_all(set: [enabled: true])
|
|> Repo.update_all(set: [enabled: status])
|
||||||
end
|
end
|
||||||
|
|
||||||
defp broadcast({:error, _reason} = error, _form), do: error
|
defp broadcast({:error, _reason} = error, _form), do: error
|
||||||
|
|||||||
@@ -275,20 +275,22 @@ defmodule Claper.Polls do
|
|||||||
|> Repo.update_all(set: [enabled: false])
|
|> Repo.update_all(set: [enabled: false])
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_default(id, presentation_file_id, position) do
|
def set_status(id, presentation_file_id, position, status) do
|
||||||
from(p in Poll,
|
if status do
|
||||||
where:
|
from(p in Poll,
|
||||||
p.presentation_file_id == ^presentation_file_id and p.position == ^position and
|
where:
|
||||||
p.id != ^id
|
p.presentation_file_id == ^presentation_file_id and p.position == ^position and
|
||||||
)
|
p.id != ^id
|
||||||
|> Repo.update_all(set: [enabled: false])
|
)
|
||||||
|
|> Repo.update_all(set: [enabled: false])
|
||||||
|
end
|
||||||
|
|
||||||
from(p in Poll,
|
from(p in Poll,
|
||||||
where:
|
where:
|
||||||
p.presentation_file_id == ^presentation_file_id and p.position == ^position and
|
p.presentation_file_id == ^presentation_file_id and p.position == ^position and
|
||||||
p.id == ^id
|
p.id == ^id
|
||||||
)
|
)
|
||||||
|> Repo.update_all(set: [enabled: true])
|
|> Repo.update_all(set: [enabled: status])
|
||||||
end
|
end
|
||||||
|
|
||||||
defp broadcast({:error, _reason} = error, _poll), do: error
|
defp broadcast({:error, _reason} = error, _poll), do: error
|
||||||
|
|||||||
@@ -24,6 +24,38 @@ defmodule Claper.Posts do
|
|||||||
|> Repo.preload(preload)
|
|> Repo.preload(preload)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Get only the pinned event posts.
|
||||||
|
"""
|
||||||
|
def list_pinned_posts(event_id, preload \\ []) do
|
||||||
|
from(p in Post,
|
||||||
|
join: e in Claper.Events.Event,
|
||||||
|
on: p.event_id == e.id,
|
||||||
|
select: p,
|
||||||
|
# Only pinned posts
|
||||||
|
where: e.uuid == ^event_id and p.pinned == true,
|
||||||
|
order_by: [asc: p.id]
|
||||||
|
)
|
||||||
|
|> Repo.all()
|
||||||
|
|> Repo.preload(preload)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Get only the unpinned event posts.
|
||||||
|
"""
|
||||||
|
def list_unpinned_posts(event_id, preload \\ []) do
|
||||||
|
from(p in Post,
|
||||||
|
join: e in Claper.Events.Event,
|
||||||
|
on: p.event_id == e.id,
|
||||||
|
select: p,
|
||||||
|
# Only unpinned posts
|
||||||
|
where: e.uuid == ^event_id and p.pinned == false,
|
||||||
|
order_by: [asc: p.id]
|
||||||
|
)
|
||||||
|
|> Repo.all()
|
||||||
|
|> Repo.preload(preload)
|
||||||
|
end
|
||||||
|
|
||||||
def reacted_posts(event_id, user_id, icon) when is_number(user_id) do
|
def reacted_posts(event_id, user_id, icon) when is_number(user_id) do
|
||||||
from(reaction in Claper.Posts.Reaction,
|
from(reaction in Claper.Posts.Reaction,
|
||||||
join: post in Claper.Posts.Post,
|
join: post in Claper.Posts.Post,
|
||||||
@@ -99,10 +131,41 @@ defmodule Claper.Posts do
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
def update_post(%Post{} = post, attrs) do
|
def update_post(%Post{} = post, attrs) do
|
||||||
post
|
changeset = Post.changeset(post, attrs)
|
||||||
|> Post.changeset(attrs)
|
|
||||||
|> Repo.update()
|
result = changeset |> Repo.update()
|
||||||
|> broadcast(:post_updated)
|
|
||||||
|
result |> broadcast(:post_updated)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Pins or unpins a post based on its current state.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> toggle_pin_post(post)
|
||||||
|
{:ok, %Post{}}
|
||||||
|
|
||||||
|
iex> toggle_pin_post(invalid_post)
|
||||||
|
{:error, %Ecto.Changeset{}}
|
||||||
|
|
||||||
|
"""
|
||||||
|
def toggle_pin_post(%Post{} = post) do
|
||||||
|
# Toggling the pinned state
|
||||||
|
new_pinned_state = not post.pinned
|
||||||
|
changeset = Post.changeset(post, %{pinned: new_pinned_state})
|
||||||
|
|
||||||
|
result = changeset |> Repo.update()
|
||||||
|
|
||||||
|
# Broadcast the appropriate message based on the new state
|
||||||
|
broadcast_message =
|
||||||
|
if new_pinned_state do
|
||||||
|
:post_pinned
|
||||||
|
else
|
||||||
|
:post_unpinned
|
||||||
|
end
|
||||||
|
|
||||||
|
result |> broadcast(broadcast_message)
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ defmodule Claper.Posts.Post do
|
|||||||
field :name, :string
|
field :name, :string
|
||||||
field :attendee_identifier, :string
|
field :attendee_identifier, :string
|
||||||
field :position, :integer, default: 0
|
field :position, :integer, default: 0
|
||||||
|
field :pinned, :boolean, default: false
|
||||||
|
|
||||||
belongs_to :event, Claper.Events.Event
|
belongs_to :event, Claper.Events.Event
|
||||||
belongs_to :user, Claper.Accounts.User
|
belongs_to :user, Claper.Accounts.User
|
||||||
@@ -30,7 +31,8 @@ defmodule Claper.Posts.Post do
|
|||||||
:love_count,
|
:love_count,
|
||||||
:lol_count,
|
:lol_count,
|
||||||
:name,
|
:name,
|
||||||
:position
|
:position,
|
||||||
|
:pinned
|
||||||
])
|
])
|
||||||
|> validate_required([:body, :position])
|
|> validate_required([:body, :position])
|
||||||
|> validate_length(:body, min: 2, max: 255)
|
|> validate_length(:body, min: 2, max: 255)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ defmodule Claper.Presentations.PresentationFile do
|
|||||||
belongs_to :event, Claper.Events.Event
|
belongs_to :event, Claper.Events.Event
|
||||||
has_many :polls, Claper.Polls.Poll
|
has_many :polls, Claper.Polls.Poll
|
||||||
has_many :forms, Claper.Forms.Form
|
has_many :forms, Claper.Forms.Form
|
||||||
|
has_many :embeds, Claper.Embeds.Embed
|
||||||
has_one :presentation_state, Claper.Presentations.PresentationState, on_replace: :delete
|
has_one :presentation_state, Claper.Presentations.PresentationState, on_replace: :delete
|
||||||
|
|
||||||
timestamps()
|
timestamps()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ defmodule Claper.Presentations.PresentationState do
|
|||||||
field :chat_enabled, :boolean
|
field :chat_enabled, :boolean
|
||||||
field :anonymous_chat_enabled, :boolean
|
field :anonymous_chat_enabled, :boolean
|
||||||
field :banned, {:array, :string}, default: []
|
field :banned, {:array, :string}, default: []
|
||||||
|
field :show_only_pinned, :boolean, default: false
|
||||||
|
|
||||||
belongs_to :presentation_file, Claper.Presentations.PresentationFile
|
belongs_to :presentation_file, Claper.Presentations.PresentationFile
|
||||||
|
|
||||||
@@ -27,7 +28,8 @@ defmodule Claper.Presentations.PresentationState do
|
|||||||
:banned,
|
:banned,
|
||||||
:presentation_file_id,
|
:presentation_file_id,
|
||||||
:chat_enabled,
|
:chat_enabled,
|
||||||
:anonymous_chat_enabled
|
:anonymous_chat_enabled,
|
||||||
|
:show_only_pinned
|
||||||
])
|
])
|
||||||
|> validate_required([])
|
|> validate_required([])
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
defmodule ClaperWeb.UserResetPasswordController do
|
defmodule ClaperWeb.UserResetPasswordController do
|
||||||
use ClaperWeb, :controller
|
use ClaperWeb, :controller
|
||||||
import Phoenix.LiveView.Controller
|
|
||||||
|
|
||||||
alias Claper.Accounts
|
alias Claper.Accounts
|
||||||
|
alias Claper.Accounts.User
|
||||||
|
|
||||||
plug(:get_user_by_reset_password_token when action in [:edit])
|
plug(:get_user_by_reset_password_token when action in [:edit])
|
||||||
|
|
||||||
def new(conn, _params) do
|
def new(conn, _params) do
|
||||||
render(conn, "new.html")
|
changeset = Accounts.change_user_registration(%User{})
|
||||||
|
render(conn, "new.html", changeset: changeset)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create(conn, %{"user" => %{"email" => email}}) do
|
def create(conn, %{"user" => %{"email" => email}}) do
|
||||||
@@ -22,13 +23,30 @@ defmodule ClaperWeb.UserResetPasswordController do
|
|||||||
conn
|
conn
|
||||||
|> put_flash(
|
|> put_flash(
|
||||||
:info,
|
:info,
|
||||||
"If your email is in our system, you'll receive instructions to reset your password shortly."
|
gettext(
|
||||||
|
"If your email is in our system, you'll receive instructions to reset your password shortly."
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|> redirect(to: "/")
|
|> redirect(to: "/")
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit(conn, _params) do
|
def edit(conn, %{"token" => token}) do
|
||||||
live_render(conn, ClaperWeb.UserLive.ResetPassword)
|
changeset = Accounts.change_user_password(%User{})
|
||||||
|
render(conn, "edit.html", changeset: changeset, token: token)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update(conn, %{"user" => user_params, "token" => token}) do
|
||||||
|
user = Accounts.get_user!(get_session(conn, "user_id"))
|
||||||
|
|
||||||
|
case Accounts.reset_user_password(user, user_params) do
|
||||||
|
{:ok, _user} ->
|
||||||
|
conn
|
||||||
|
|> put_flash(:info, gettext("Password updated successfully."))
|
||||||
|
|> redirect(to: "/")
|
||||||
|
|
||||||
|
{:error, changeset} ->
|
||||||
|
render(conn, "edit.html", changeset: changeset, token: token)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_user_by_reset_password_token(conn, _opts) do
|
defp get_user_by_reset_password_token(conn, _opts) do
|
||||||
@@ -38,7 +56,7 @@ defmodule ClaperWeb.UserResetPasswordController do
|
|||||||
put_session(conn, "user_id", user.id)
|
put_session(conn, "user_id", user.id)
|
||||||
else
|
else
|
||||||
conn
|
conn
|
||||||
|> put_flash(:error, "Reset password link is invalid or it has expired.")
|
|> put_flash(:error, gettext("Reset password link is invalid or it has expired."))
|
||||||
|> redirect(to: "/")
|
|> redirect(to: "/")
|
||||||
|> halt()
|
|> halt()
|
||||||
end
|
end
|
||||||
|
|||||||
92
lib/claper_web/live/embed_live/form_component.ex
Normal file
92
lib/claper_web/live/embed_live/form_component.ex
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
defmodule ClaperWeb.EmbedLive.FormComponent do
|
||||||
|
use ClaperWeb, :live_component
|
||||||
|
|
||||||
|
alias Claper.Embeds
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def update(%{embed: embed} = assigns, socket) do
|
||||||
|
changeset = Embeds.change_embed(embed)
|
||||||
|
|
||||||
|
{:ok,
|
||||||
|
socket
|
||||||
|
|> assign(assigns)
|
||||||
|
|> assign_new(:dark, fn -> false end)
|
||||||
|
|> assign(:embeds, list_embeds(assigns))
|
||||||
|
|> assign(:changeset, changeset)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_event("delete", %{"id" => id}, socket) do
|
||||||
|
embed = Embeds.get_embed!(id)
|
||||||
|
{:ok, _} = Embeds.delete_embed(socket.assigns.event_uuid, embed)
|
||||||
|
|
||||||
|
{:noreply, socket |> push_redirect(to: socket.assigns.return_to)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_event("validate", %{"embed" => embed_params}, socket) do
|
||||||
|
changeset =
|
||||||
|
socket.assigns.embed
|
||||||
|
|> Embeds.change_embed(embed_params)
|
||||||
|
|> Map.put(:action, :validate)
|
||||||
|
|
||||||
|
{:noreply, socket |> assign(:changeset, changeset)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_event("save", %{"embed" => embed_params}, socket) do
|
||||||
|
save_embed(socket, socket.assigns.live_action, embed_params)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp save_embed(socket, :edit, embed_params) do
|
||||||
|
case Embeds.update_embed(
|
||||||
|
socket.assigns.event_uuid,
|
||||||
|
socket.assigns.embed,
|
||||||
|
embed_params
|
||||||
|
) do
|
||||||
|
{:ok, _embed} ->
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> push_redirect(to: socket.assigns.return_to)}
|
||||||
|
|
||||||
|
{:error, %Ecto.Changeset{} = changeset} ->
|
||||||
|
{:noreply, assign(socket, :changeset, changeset)}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp save_embed(socket, :new, embed_params) do
|
||||||
|
case Embeds.create_embed(
|
||||||
|
embed_params
|
||||||
|
|> Map.put("presentation_file_id", socket.assigns.presentation_file.id)
|
||||||
|
|> Map.put("position", socket.assigns.position)
|
||||||
|
|> Map.put("enabled", false)
|
||||||
|
) do
|
||||||
|
{:ok, embed} ->
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> maybe_change_current_embed(embed)
|
||||||
|
|> push_redirect(to: socket.assigns.return_to)}
|
||||||
|
|
||||||
|
{:error, %Ecto.Changeset{} = changeset} ->
|
||||||
|
{:noreply, assign(socket, changeset: changeset)}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_change_current_embed(socket, %{enabled: true} = embed) do
|
||||||
|
embed = Embeds.get_embed!(embed.id)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event_uuid}",
|
||||||
|
{:current_embed, embed}
|
||||||
|
)
|
||||||
|
|
||||||
|
socket
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_change_current_embed(socket, _), do: socket
|
||||||
|
|
||||||
|
defp list_embeds(assigns) do
|
||||||
|
Embeds.list_embeds(assigns.presentation_file.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
70
lib/claper_web/live/embed_live/form_component.html.heex
Normal file
70
lib/claper_web/live/embed_live/form_component.html.heex
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<div>
|
||||||
|
<.form
|
||||||
|
:let={f}
|
||||||
|
for={@changeset}
|
||||||
|
id="embed-form"
|
||||||
|
phx-target={@myself}
|
||||||
|
phx-change="validate"
|
||||||
|
phx-submit="save"
|
||||||
|
>
|
||||||
|
<div class="my-3 mb-10">
|
||||||
|
<ClaperWeb.Component.Input.text
|
||||||
|
form={f}
|
||||||
|
key={:title}
|
||||||
|
name={gettext("Title")}
|
||||||
|
labelClass={if @dark, do: "text-white"}
|
||||||
|
fieldClass={if @dark, do: "bg-gray-700 text-white"}
|
||||||
|
autofocus="true"
|
||||||
|
required="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class="mt-3">
|
||||||
|
<ClaperWeb.Component.Input.textarea
|
||||||
|
form={f}
|
||||||
|
key={:content}
|
||||||
|
name={gettext("The iframe component")}
|
||||||
|
labelClass={if @dark, do: "text-white"}
|
||||||
|
fieldClass={if @dark, do: "bg-gray-700 text-white"}
|
||||||
|
autofocus="true"
|
||||||
|
required="true"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-x-2 mb-5 mt-3">
|
||||||
|
<%= checkbox(f, :attendee_visibility, class: "h-4 w-5") %>
|
||||||
|
<%= label(
|
||||||
|
f,
|
||||||
|
:attendee_visibility,
|
||||||
|
gettext("Attendee can view the web content on their device"),
|
||||||
|
class: "text-sm font-medium"
|
||||||
|
) %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex space-x-3">
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
phx_disable_with="Loading..."
|
||||||
|
class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
|
||||||
|
>
|
||||||
|
<%= case @live_action do
|
||||||
|
:new -> gettext("Create")
|
||||||
|
:edit -> gettext("Save")
|
||||||
|
end %>
|
||||||
|
</button>
|
||||||
|
<%= if @live_action == :edit do %>
|
||||||
|
<%= link(gettext("Delete"),
|
||||||
|
to: "#",
|
||||||
|
phx_click: "delete",
|
||||||
|
phx_target: @myself,
|
||||||
|
phx_value_id: @embed.id,
|
||||||
|
data: [
|
||||||
|
confirm: gettext("This will delete the web content, are you sure?")
|
||||||
|
],
|
||||||
|
class:
|
||||||
|
"w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
|
||||||
|
) %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</.form>
|
||||||
|
</div>
|
||||||
84
lib/claper_web/live/event_live/embed_component.ex
Normal file
84
lib/claper_web/live/event_live/embed_component.ex
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
defmodule ClaperWeb.EventLive.EmbedComponent do
|
||||||
|
use ClaperWeb, :live_component
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def render(assigns) do
|
||||||
|
~H"""
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
id="collapsed-embed"
|
||||||
|
class="bg-black py-3 px-6 text-black shadow-lg mx-auto rounded-full w-max hidden"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="block w-full h-full cursor-pointer"
|
||||||
|
phx-click={toggle_embed()}
|
||||||
|
phx-target={@myself}
|
||||||
|
>
|
||||||
|
<div class="text-white flex space-x-2 items-center">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="h-6 w-6"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||||
|
<path d="M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3"></path>
|
||||||
|
<path d="M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3"></path>
|
||||||
|
<path d="M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7"></path>
|
||||||
|
<path d="M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1"></path>
|
||||||
|
<path d="M17 12h.01"></path>
|
||||||
|
<path d="M13 12h.01"></path>
|
||||||
|
</svg>
|
||||||
|
<span class="font-bold"><%= gettext("See current web content") %></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="extended-embed" class="bg-black w-full py-3 px-6 text-black shadow-lg rounded-md">
|
||||||
|
<div
|
||||||
|
class="block w-full h-full cursor-pointer"
|
||||||
|
phx-click={toggle_embed()}
|
||||||
|
phx-target={@myself}
|
||||||
|
>
|
||||||
|
<div id="embed-pane" class="float-right mt-2">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="h-8 w-8 text-white"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
>
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="text-xs text-gray-500 my-1"><%= gettext("Current web content") %></p>
|
||||||
|
<p class="text-white text-lg font-semibold mb-4"><%= @embed.title %></p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col space-y-3">
|
||||||
|
<%= raw(@embed.content) %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
def toggle_embed(js \\ %JS{}) do
|
||||||
|
js
|
||||||
|
|> JS.toggle(
|
||||||
|
out: "animate__animated animate__zoomOut",
|
||||||
|
in: "animate__animated animate__zoomIn",
|
||||||
|
to: "#collapsed-embed",
|
||||||
|
time: 50
|
||||||
|
)
|
||||||
|
|> JS.toggle(
|
||||||
|
out: "animate__animated animate__zoomOut",
|
||||||
|
in: "animate__animated animate__zoomIn",
|
||||||
|
to: "#extended-embed"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -161,7 +161,7 @@ defmodule ClaperWeb.EventLive.EventFormComponent do
|
|||||||
|> Map.put("user_id", socket.assigns.current_user.id)
|
|> Map.put("user_id", socket.assigns.current_user.id)
|
||||||
) do
|
) do
|
||||||
{:ok, event} ->
|
{:ok, event} ->
|
||||||
with e <- Events.get_event!(event.uuid, [:presentation_file]) do
|
with e <- Events.get_event!(event.uuid, [:presentation_file, :leaders]) do
|
||||||
Task.Supervisor.async_nolink(Claper.TaskSupervisor, fn ->
|
Task.Supervisor.async_nolink(Claper.TaskSupervisor, fn ->
|
||||||
Claper.Tasks.Converter.convert(
|
Claper.Tasks.Converter.convert(
|
||||||
socket.assigns.current_user.id,
|
socket.assigns.current_user.id,
|
||||||
@@ -171,6 +171,14 @@ defmodule ClaperWeb.EventLive.EventFormComponent do
|
|||||||
e.presentation_file.id
|
e.presentation_file.id
|
||||||
)
|
)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
Enum.each(e.leaders, fn leader ->
|
||||||
|
Claper.Accounts.LeaderNotifier.deliver_event_invitation(
|
||||||
|
e.name,
|
||||||
|
leader.email,
|
||||||
|
Routes.event_index_url(socket, :index)
|
||||||
|
)
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
{:noreply,
|
{:noreply,
|
||||||
@@ -188,9 +196,11 @@ defmodule ClaperWeb.EventLive.EventFormComponent do
|
|||||||
socket.assigns.event,
|
socket.assigns.event,
|
||||||
event_params
|
event_params
|
||||||
) do
|
) do
|
||||||
{:ok, _event} ->
|
{:ok, event} ->
|
||||||
handle_file_conversion(socket, hash, ext)
|
handle_file_conversion(socket, hash, ext)
|
||||||
|
|
||||||
|
send_email_to_leaders(socket, event)
|
||||||
|
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket
|
socket
|
||||||
|> put_flash(:info, gettext("Updated successfully"))
|
|> put_flash(:info, gettext("Updated successfully"))
|
||||||
@@ -225,6 +235,24 @@ defmodule ClaperWeb.EventLive.EventFormComponent do
|
|||||||
Application.get_env(:claper, :storage_dir)
|
Application.get_env(:claper, :storage_dir)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp send_email_to_leaders(socket, event) do
|
||||||
|
with e <- Events.get_event!(event.uuid, [:leaders]) do
|
||||||
|
# Get the leaders before the update
|
||||||
|
previous_leaders = socket.assigns.event.leaders
|
||||||
|
|
||||||
|
Enum.each(e.leaders, fn leader ->
|
||||||
|
# Only send email if leader was not present before the update
|
||||||
|
unless Enum.member?(previous_leaders, leader) do
|
||||||
|
Claper.Accounts.LeaderNotifier.deliver_event_invitation(
|
||||||
|
e.name,
|
||||||
|
leader.email,
|
||||||
|
Routes.event_index_url(socket, :index)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def error_to_string(:too_large), do: gettext("Your file is too large")
|
def error_to_string(:too_large), do: gettext("Your file is too large")
|
||||||
def error_to_string(:not_accepted), do: gettext("You have selected an incorrect file type")
|
def error_to_string(:not_accepted), do: gettext("You have selected an incorrect file type")
|
||||||
def error_to_string(:external_client_failure), do: gettext("Upload failed")
|
def error_to_string(:external_client_failure), do: gettext("Upload failed")
|
||||||
|
|||||||
@@ -89,12 +89,32 @@ defmodule ClaperWeb.EventLive.FormComponent do
|
|||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button
|
<div class="flex items-center gap-4">
|
||||||
type="submit"
|
<button
|
||||||
class="px-3 py-2 text-white font-semibold bg-primary-500 hover:bg-primary-600 rounded-md my-5"
|
type="submit"
|
||||||
>
|
class="px-3 py-2 text-white font-semibold bg-primary-500 hover:bg-primary-600 rounded-md my-5"
|
||||||
<%= if is_nil(assigns.current_form_submit), do: gettext("Submit"), else: gettext("Edit") %>
|
>
|
||||||
</button>
|
<%= if is_nil(assigns.current_form_submit), do: gettext("Submit"), else: gettext("Edit") %>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<%= unless is_nil(assigns.current_form_submit) do %>
|
||||||
|
<div class="flex gap-1 text-green-500 text-sm">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="h-6 w-6"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M9 12l2 2l4 -4" />
|
||||||
|
</svg>
|
||||||
|
<span><%= gettext("Saved") %></span>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
alias ClaperWeb.Presence
|
alias ClaperWeb.Presence
|
||||||
alias Claper.Polls
|
alias Claper.Polls
|
||||||
alias Claper.Forms
|
alias Claper.Forms
|
||||||
|
alias Claper.Embeds
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def mount(%{"code" => code}, session, socket) do
|
def mount(%{"code" => code}, session, socket) do
|
||||||
@@ -40,9 +41,12 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
|> assign(:attendees_nb, 1)
|
|> assign(:attendees_nb, 1)
|
||||||
|> assign(:event, event)
|
|> assign(:event, event)
|
||||||
|> assign(:state, event.presentation_file.presentation_state)
|
|> assign(:state, event.presentation_file.presentation_state)
|
||||||
|> assign(:posts, list_posts(socket, event.uuid))
|
|> assign(:pinned_posts, list_pinned_posts(socket, event.uuid))
|
||||||
|
|> assign(:all_posts, list_all_posts(socket, event.uuid))
|
||||||
|
|> assign(:pinned_post_count, length(list_pinned_posts(socket, event.uuid)))
|
||||||
|> assign(:polls, list_polls(socket, event.presentation_file.id))
|
|> assign(:polls, list_polls(socket, event.presentation_file.id))
|
||||||
|> assign(:forms, list_forms(socket, event.presentation_file.id))
|
|> assign(:forms, list_forms(socket, event.presentation_file.id))
|
||||||
|
|> assign(:embeds, list_embeds(socket, event.presentation_file.id))
|
||||||
|> assign(:create, nil)
|
|> assign(:create, nil)
|
||||||
|> assign(:list_tab, :posts)
|
|> assign(:list_tab, :posts)
|
||||||
|> assign(:create_action, :new)
|
|> assign(:create_action, :new)
|
||||||
@@ -52,8 +56,9 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
})
|
})
|
||||||
|> poll_at_position(false)
|
|> poll_at_position(false)
|
||||||
|> form_at_position(false)
|
|> form_at_position(false)
|
||||||
|
|> embed_at_position(false)
|
||||||
|
|
||||||
{:ok, socket, temporary_assigns: [posts: [], form_submits: []]}
|
{:ok, socket, temporary_assigns: [all_posts: [], pinned_posts: [], form_submits: []]}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -72,27 +77,50 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
@impl true
|
@impl true
|
||||||
def handle_info({:post_created, post}, socket) do
|
def handle_info({:post_created, post}, socket) do
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket |> update(:posts, fn posts -> [post | posts] end) |> push_event("scroll", %{})}
|
socket
|
||||||
|
|> assign(:all_posts, [post | socket.assigns.all_posts])
|
||||||
|
|> push_event("scroll", %{})}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:post_updated, post}, socket) do
|
def handle_info({:post_updated, updated_post}, socket) do
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:all_posts, fn posts -> [updated_post | posts] end)
|
||||||
|
|> update(:pinned_posts, fn posts -> [updated_post | posts] end)}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:reaction_added, post}, socket) do
|
def handle_info({:post_deleted, deleted_post}, socket) do
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:all_posts, fn posts -> [deleted_post | posts] end)
|
||||||
|
|> update(:pinned_posts, fn posts -> [deleted_post | posts] end)
|
||||||
|
|> update(:pinned_post_count, fn pinned_post_count ->
|
||||||
|
pinned_post_count - if deleted_post.pinned, do: 1, else: 0
|
||||||
|
end)}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:reaction_removed, post}, socket) do
|
def handle_info({:post_pinned, post}, socket) do
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
updated_socket =
|
||||||
|
socket
|
||||||
|
|> update(:all_posts, fn all_posts -> [post | all_posts] end)
|
||||||
|
|> update(:pinned_posts, fn pinned_posts -> [post | pinned_posts] end)
|
||||||
|
|> assign(:pinned_post_count, socket.assigns.pinned_post_count + 1)
|
||||||
|
|
||||||
|
{:noreply, updated_socket}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:post_deleted, post}, socket) do
|
def handle_info({:post_unpinned, post}, socket) do
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
updated_socket =
|
||||||
|
socket
|
||||||
|
|> update(:all_posts, fn all_posts -> [post | all_posts] end)
|
||||||
|
|> update(:pinned_posts, fn pinned_posts -> [post | pinned_posts] end)
|
||||||
|
|> assign(:pinned_post_count, socket.assigns.pinned_post_count - 1)
|
||||||
|
|
||||||
|
{:noreply, updated_socket}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -128,6 +156,21 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
{:noreply, socket |> assign(:current_poll, poll)}
|
{:noreply, socket |> assign(:current_poll, poll)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:embed_updated, embed}, socket) do
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_embed, fn _current_embed -> embed end)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info(
|
||||||
|
{:current_embed, embed},
|
||||||
|
socket
|
||||||
|
) do
|
||||||
|
{:noreply, socket |> assign(:current_embed, embed)}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info(_, socket) do
|
def handle_info(_, socket) do
|
||||||
{:noreply, socket}
|
{:noreply, socket}
|
||||||
@@ -159,7 +202,8 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
socket
|
socket
|
||||||
|> assign(:state, new_state)
|
|> assign(:state, new_state)
|
||||||
|> poll_at_position
|
|> poll_at_position
|
||||||
|> form_at_position}
|
|> form_at_position
|
||||||
|
|> embed_at_position}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -185,13 +229,15 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("poll-set-default", %{"id" => id}, socket) do
|
def handle_event("poll-set-active", %{"id" => id}, socket) do
|
||||||
Forms.disable_all(socket.assigns.event.presentation_file.id, socket.assigns.state.position)
|
Forms.disable_all(socket.assigns.event.presentation_file.id, socket.assigns.state.position)
|
||||||
|
Embeds.disable_all(socket.assigns.event.presentation_file.id, socket.assigns.state.position)
|
||||||
|
|
||||||
Polls.set_default(
|
Polls.set_status(
|
||||||
id,
|
id,
|
||||||
socket.assigns.event.presentation_file.id,
|
socket.assigns.event.presentation_file.id,
|
||||||
socket.assigns.state.position
|
socket.assigns.state.position,
|
||||||
|
true
|
||||||
)
|
)
|
||||||
|
|
||||||
poll = Polls.get_poll!(id)
|
poll = Polls.get_poll!(id)
|
||||||
@@ -208,19 +254,28 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
{:current_form, nil}
|
{:current_form, nil}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event.uuid}",
|
||||||
|
{:current_embed, nil}
|
||||||
|
)
|
||||||
|
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket
|
socket
|
||||||
|> assign(:polls, list_polls(socket, socket.assigns.event.presentation_file.id))
|
|> assign(:polls, list_polls(socket, socket.assigns.event.presentation_file.id))
|
||||||
|> assign(:forms, list_forms(socket, socket.assigns.event.presentation_file.id))}
|
|> assign(:forms, list_forms(socket, socket.assigns.event.presentation_file.id))
|
||||||
|
|> assign(:embeds, list_embeds(socket, socket.assigns.event.presentation_file.id))}
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("form-set-default", %{"id" => id}, socket) do
|
def handle_event("form-set-active", %{"id" => id}, socket) do
|
||||||
Polls.disable_all(socket.assigns.event.presentation_file.id, socket.assigns.state.position)
|
Polls.disable_all(socket.assigns.event.presentation_file.id, socket.assigns.state.position)
|
||||||
|
Embeds.disable_all(socket.assigns.event.presentation_file.id, socket.assigns.state.position)
|
||||||
|
|
||||||
Forms.set_default(
|
Forms.set_status(
|
||||||
id,
|
id,
|
||||||
socket.assigns.event.presentation_file.id,
|
socket.assigns.event.presentation_file.id,
|
||||||
socket.assigns.state.position
|
socket.assigns.state.position,
|
||||||
|
true
|
||||||
)
|
)
|
||||||
|
|
||||||
form = Forms.get_form!(id)
|
form = Forms.get_form!(id)
|
||||||
@@ -237,12 +292,114 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
{:current_poll, nil}
|
{:current_poll, nil}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event.uuid}",
|
||||||
|
{:current_embed, nil}
|
||||||
|
)
|
||||||
|
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket
|
socket
|
||||||
|> assign(:polls, list_polls(socket, socket.assigns.event.presentation_file.id))
|
|> assign(:polls, list_polls(socket, socket.assigns.event.presentation_file.id))
|
||||||
|
|> assign(:forms, list_forms(socket, socket.assigns.event.presentation_file.id))
|
||||||
|
|> assign(:embeds, list_embeds(socket, socket.assigns.event.presentation_file.id))}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_event("embed-set-active", %{"id" => id}, socket) do
|
||||||
|
Polls.disable_all(socket.assigns.event.presentation_file.id, socket.assigns.state.position)
|
||||||
|
Forms.disable_all(socket.assigns.event.presentation_file.id, socket.assigns.state.position)
|
||||||
|
|
||||||
|
Embeds.set_status(
|
||||||
|
id,
|
||||||
|
socket.assigns.event.presentation_file.id,
|
||||||
|
socket.assigns.state.position,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
|
||||||
|
embed = Embeds.get_embed!(id)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event.uuid}",
|
||||||
|
{:current_embed, embed}
|
||||||
|
)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event.uuid}",
|
||||||
|
{:current_poll, nil}
|
||||||
|
)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event.uuid}",
|
||||||
|
{:current_form, nil}
|
||||||
|
)
|
||||||
|
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> assign(:polls, list_polls(socket, socket.assigns.event.presentation_file.id))
|
||||||
|
|> assign(:forms, list_forms(socket, socket.assigns.event.presentation_file.id))
|
||||||
|
|> assign(:embeds, list_embeds(socket, socket.assigns.event.presentation_file.id))}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_event("poll-set-inactive", %{"id" => id}, socket) do
|
||||||
|
Polls.set_status(
|
||||||
|
id,
|
||||||
|
socket.assigns.event.presentation_file.id,
|
||||||
|
socket.assigns.state.position,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event.uuid}",
|
||||||
|
{:current_poll, nil}
|
||||||
|
)
|
||||||
|
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> assign(:polls, list_polls(socket, socket.assigns.event.presentation_file.id))}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_event("form-set-inactive", %{"id" => id}, socket) do
|
||||||
|
Forms.set_status(
|
||||||
|
id,
|
||||||
|
socket.assigns.event.presentation_file.id,
|
||||||
|
socket.assigns.state.position,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event.uuid}",
|
||||||
|
{:current_form, nil}
|
||||||
|
)
|
||||||
|
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|> assign(:forms, list_forms(socket, socket.assigns.event.presentation_file.id))}
|
|> assign(:forms, list_forms(socket, socket.assigns.event.presentation_file.id))}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def handle_event("embed-set-inactive", %{"id" => id}, socket) do
|
||||||
|
Embeds.set_status(
|
||||||
|
id,
|
||||||
|
socket.assigns.event.presentation_file.id,
|
||||||
|
socket.assigns.state.position,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{socket.assigns.event.uuid}",
|
||||||
|
{:current_embed, nil}
|
||||||
|
)
|
||||||
|
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> assign(:embeds, list_embeds(socket, socket.assigns.event.presentation_file.id))}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event(
|
def handle_event(
|
||||||
"ban",
|
"ban",
|
||||||
@@ -254,6 +411,12 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
ban(attendee_identifier, socket)
|
ban(attendee_identifier, socket)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_event("pin", %{"id" => id}, socket) do
|
||||||
|
post = Claper.Posts.get_post!(id, [:event])
|
||||||
|
pin(post, socket)
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event(
|
def handle_event(
|
||||||
"ban",
|
"ban",
|
||||||
@@ -333,6 +496,23 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
{:noreply, socket |> assign(:state, new_state)}
|
{:noreply, socket |> assign(:state, new_state)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_event(
|
||||||
|
"checked",
|
||||||
|
%{"key" => "show_only_pinned", "value" => value},
|
||||||
|
%{assigns: %{event: _event, state: state}} = socket
|
||||||
|
) do
|
||||||
|
{:ok, new_state} =
|
||||||
|
Claper.Presentations.update_presentation_state(
|
||||||
|
state,
|
||||||
|
%{
|
||||||
|
:show_only_pinned => value
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
{:noreply, socket |> assign(:state, new_state)}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event(
|
def handle_event(
|
||||||
"checked",
|
"checked",
|
||||||
@@ -351,11 +531,19 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event("delete", %{"event-id" => event_id, "id" => id}, socket) do
|
def handle_event("delete", %{"id" => id}, socket) do
|
||||||
post = Claper.Posts.get_post!(id, [:event])
|
post = Claper.Posts.get_post!(id, [:event])
|
||||||
{:ok, _} = Claper.Posts.delete_post(post)
|
{:ok, _} = Claper.Posts.delete_post(post)
|
||||||
|
|
||||||
{:noreply, assign(socket, :posts, list_posts(socket, event_id))}
|
updated_socket =
|
||||||
|
if post.pinned do
|
||||||
|
assign(socket, :pinned_posts, list_pinned_posts(socket, socket.assigns.event.uuid))
|
||||||
|
assign(socket, :all_posts, list_all_posts(socket, socket.assigns.event.uuid))
|
||||||
|
else
|
||||||
|
assign(socket, :all_posts, list_all_posts(socket, socket.assigns.event.uuid))
|
||||||
|
end
|
||||||
|
|
||||||
|
{:noreply, updated_socket}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -378,7 +566,9 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
socket =
|
socket =
|
||||||
case tab do
|
case tab do
|
||||||
"posts" ->
|
"posts" ->
|
||||||
assign(socket, :posts, list_posts(socket, socket.assigns.event.uuid))
|
socket
|
||||||
|
|> assign(:pinned_posts, list_pinned_posts(socket, socket.assigns.event.uuid))
|
||||||
|
|> assign(:all_posts, list_all_posts(socket, socket.assigns.event.uuid))
|
||||||
|
|
||||||
"forms" ->
|
"forms" ->
|
||||||
assign(
|
assign(
|
||||||
@@ -386,6 +576,10 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
:form_submits,
|
:form_submits,
|
||||||
list_form_submits(socket, socket.assigns.event.presentation_file.id)
|
list_form_submits(socket, socket.assigns.event.presentation_file.id)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
"pinned_posts" ->
|
||||||
|
socket
|
||||||
|
|> assign(:pinned_posts, list_pinned_posts(socket, socket.assigns.event.uuid))
|
||||||
end
|
end
|
||||||
|
|
||||||
{:noreply, socket}
|
{:noreply, socket}
|
||||||
@@ -459,6 +653,12 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp apply_action(socket, :add_embed, _params) do
|
||||||
|
socket
|
||||||
|
|> assign(:create, "embed")
|
||||||
|
|> assign(:embed, %Embeds.Embed{})
|
||||||
|
end
|
||||||
|
|
||||||
defp apply_action(socket, :import, _params) do
|
defp apply_action(socket, :import, _params) do
|
||||||
socket
|
socket
|
||||||
|> assign(:create, "import")
|
|> assign(:create, "import")
|
||||||
@@ -474,6 +674,15 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
|> assign(:form, form)
|
|> assign(:form, form)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp apply_action(socket, :edit_embed, %{"id" => id}) do
|
||||||
|
embed = Embeds.get_embed!(id)
|
||||||
|
|
||||||
|
socket
|
||||||
|
|> assign(:create, "embed")
|
||||||
|
|> assign(:create_action, :edit)
|
||||||
|
|> assign(:embed, embed)
|
||||||
|
end
|
||||||
|
|
||||||
defp poll_at_position(
|
defp poll_at_position(
|
||||||
%{assigns: %{event: event, state: state}} = socket,
|
%{assigns: %{event: event, state: state}} = socket,
|
||||||
broadcast \\ true
|
broadcast \\ true
|
||||||
@@ -516,6 +725,33 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp pin(post, socket) do
|
||||||
|
{:ok, _updated_post} = Claper.Posts.toggle_pin_post(post)
|
||||||
|
|
||||||
|
{:noreply, socket}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp embed_at_position(
|
||||||
|
%{assigns: %{event: event, state: state}} = socket,
|
||||||
|
broadcast \\ true
|
||||||
|
) do
|
||||||
|
with embed <-
|
||||||
|
Claper.Embeds.get_embed_current_position(
|
||||||
|
event.presentation_file.id,
|
||||||
|
state.position
|
||||||
|
) do
|
||||||
|
if broadcast do
|
||||||
|
Phoenix.PubSub.broadcast(
|
||||||
|
Claper.PubSub,
|
||||||
|
"event:#{event.uuid}",
|
||||||
|
{:current_embed, embed}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
socket |> assign(:current_embed, embed)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp ban(user, %{assigns: %{event: event, state: state}} = socket) do
|
defp ban(user, %{assigns: %{event: event, state: state}} = socket) do
|
||||||
{:ok, new_state} =
|
{:ok, new_state} =
|
||||||
Claper.Presentations.update_presentation_state(state, %{
|
Claper.Presentations.update_presentation_state(state, %{
|
||||||
@@ -531,7 +767,11 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
{:noreply, socket |> assign(:state, new_state)}
|
{:noreply, socket |> assign(:state, new_state)}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp list_posts(_socket, event_id) do
|
defp list_pinned_posts(_socket, event_id) do
|
||||||
|
Claper.Posts.list_pinned_posts(event_id, [:event, :reactions])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp list_all_posts(_socket, event_id) do
|
||||||
Claper.Posts.list_posts(event_id, [:event, :reactions])
|
Claper.Posts.list_posts(event_id, [:event, :reactions])
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -543,6 +783,10 @@ defmodule ClaperWeb.EventLive.Manage do
|
|||||||
Claper.Forms.list_forms(presentation_file_id)
|
Claper.Forms.list_forms(presentation_file_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp list_embeds(_socket, presentation_file_id) do
|
||||||
|
Claper.Embeds.list_embeds(presentation_file_id)
|
||||||
|
end
|
||||||
|
|
||||||
defp list_form_submits(_socket, presentation_file_id) do
|
defp list_form_submits(_socket, presentation_file_id) do
|
||||||
Claper.Forms.list_form_submits(presentation_file_id)
|
Claper.Forms.list_form_submits(presentation_file_id)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
<div
|
<div
|
||||||
id="manager"
|
id="manager"
|
||||||
class="h-screen max-h-screen flex flex-col"
|
class="h-screen max-h-screen flex flex-col"
|
||||||
x-data={"{date: moment.utc('#{@event.expired_at}').local().format('lll')}"}
|
x-data={"{date:
|
||||||
|
moment.utc('#{@event.expired_at}').local().format('lll')}"}
|
||||||
phx-hook="Manager"
|
phx-hook="Manager"
|
||||||
data-max-page={@event.presentation_file.length}
|
data-max-page={@event.presentation_file.length}
|
||||||
data-current-page={@state.position}
|
data-current-page={@state.position}
|
||||||
@@ -117,7 +118,8 @@
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
id="add-modal"
|
id="add-modal"
|
||||||
class={"#{if !@create, do: 'hidden'} fixed z-30 inset-0 overflow-y-auto p-4 sm:p-6 md:p-24 transform transition-all duration-150"}
|
class={"#{if !@create, do: 'hidden' } fixed z-30 inset-0 overflow-y-auto p-4 sm:p-6 md:p-24
|
||||||
|
transform transition-all duration-150"}
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
>
|
>
|
||||||
@@ -145,7 +147,7 @@
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div id="modal-content" class="bg-gray-100">
|
<div id="modal-content" class="bg-gray-100">
|
||||||
<%= if @create == nil do %>
|
<%= if @create==nil do %>
|
||||||
<ul class="scroll-py-3 overflow-y-auto p-3" id="options" role="listbox">
|
<ul class="scroll-py-3 overflow-y-auto p-3" id="options" role="listbox">
|
||||||
<li id="option-1" role="option" tabindex="-1">
|
<li id="option-1" role="option" tabindex="-1">
|
||||||
<a
|
<a
|
||||||
@@ -171,7 +173,9 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4 flex-auto text-left">
|
<div class="ml-4 flex-auto text-left">
|
||||||
<p class="font-medium text-gray-700"><%= gettext("Poll") %></p>
|
<p class="font-medium text-gray-700">
|
||||||
|
<%= gettext("Poll") %>
|
||||||
|
</p>
|
||||||
<p class="text-gray-500">
|
<p class="text-gray-500">
|
||||||
<%= gettext("Add poll to know opinion of your public.") %>
|
<%= gettext("Add poll to know opinion of your public.") %>
|
||||||
</p>
|
</p>
|
||||||
@@ -208,16 +212,49 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4 flex-auto text-left">
|
<div class="ml-4 flex-auto text-left">
|
||||||
<p class="font-medium text-gray-700"><%= gettext("Form") %></p>
|
<p class="font-medium text-gray-700">
|
||||||
|
<%= gettext("Form") %>
|
||||||
|
</p>
|
||||||
<p class="text-gray-500">
|
<p class="text-gray-500">
|
||||||
<%= gettext("Add form to collect data from your public.") %>
|
<%= gettext("Add form to collect data from your public.") %>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li id="option-3" role="option" tabindex="-1">
|
||||||
|
<a
|
||||||
|
data-phx-link="patch"
|
||||||
|
data-phx-link-state="push"
|
||||||
|
href={Routes.event_manage_path(@socket, :add_embed, @event.code)}
|
||||||
|
class="group flex select-none rounded-xl p-3 w-full hover:bg-gray-200 cursor-pointer"
|
||||||
|
>
|
||||||
|
<div class="flex h-12 w-12 flex-none text-white items-center justify-center rounded-lg bg-gradient-to-br from-primary-500 to-secondary-500">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="w-6 h-6"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M14.25 9.75L16.5 12l-2.25 2.25m-4.5 0L7.5 12l2.25-2.25M6 20.25h12A2.25 2.25 0 0020.25 18V6A2.25 2.25 0 0018 3.75H6A2.25 2.25 0 003.75 6v12A2.25 2.25 0 006 20.25z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="ml-4 flex-auto text-left">
|
||||||
|
<p class="font-medium text-gray-700"><%= gettext("Web content") %></p>
|
||||||
|
<p class="text-gray-500">
|
||||||
|
<%= gettext("Add a Youtube video or any web content.") %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<%= if (length @polls) == 0 && (length @forms) == 0 do %>
|
<%= if (length @polls)==0 && (length @forms)==0 do %>
|
||||||
<div class="mt-10">
|
<div class="mt-10">
|
||||||
<a
|
<a
|
||||||
data-phx-link="patch"
|
data-phx-link="patch"
|
||||||
@@ -248,7 +285,7 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= if @create == "poll" do %>
|
<%= if @create=="poll" do %>
|
||||||
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
|
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
|
||||||
<p class="text-xl font-bold">
|
<p class="text-xl font-bold">
|
||||||
<%= case @create_action do
|
<%= case @create_action do
|
||||||
@@ -269,7 +306,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= if @create == "form" do %>
|
<%= if @create=="form" do %>
|
||||||
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
|
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
|
||||||
<p class="text-xl font-bold">
|
<p class="text-xl font-bold">
|
||||||
<%= case @create_action do
|
<%= case @create_action do
|
||||||
@@ -290,9 +327,32 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<%= if @create == "embed" do %>
|
||||||
|
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
|
||||||
|
<p class="text-xl font-bold">
|
||||||
|
<%= case @create_action do
|
||||||
|
:new -> gettext("New web content")
|
||||||
|
:edit -> gettext("Edit web content")
|
||||||
|
end %>
|
||||||
|
</p>
|
||||||
|
<.live_component
|
||||||
|
module={ClaperWeb.EmbedLive.FormComponent}
|
||||||
|
id="embed-create"
|
||||||
|
event_uuid={@event.uuid}
|
||||||
|
presentation_file={@event.presentation_file}
|
||||||
|
embed={@embed}
|
||||||
|
live_action={@create_action}
|
||||||
|
position={@state.position}
|
||||||
|
return_to={Routes.event_manage_path(@socket, :show, @event.code)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<%= if @create == "import" do %>
|
<%= if @create == "import" do %>
|
||||||
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
|
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
|
||||||
<p class="text-xl font-bold"><%= gettext("Select presentation") %></p>
|
<p class="text-xl font-bold">
|
||||||
|
<%= gettext("Select presentation") %>
|
||||||
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
<%= for event <- @events do %>
|
<%= for event <- @events do %>
|
||||||
<li class="my-3">
|
<li class="my-3">
|
||||||
@@ -315,7 +375,9 @@
|
|||||||
d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"
|
d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
<span><%= event.name %></span>
|
<span>
|
||||||
|
<%= event.name %>
|
||||||
|
</span>
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -330,7 +392,7 @@
|
|||||||
<div class="bg-gray-100 pb-10 md:col-span-2 overflow-y-auto">
|
<div class="bg-gray-100 pb-10 md:col-span-2 overflow-y-auto">
|
||||||
<div class="flex flex-col justify-center items-center text-center">
|
<div class="flex flex-col justify-center items-center text-center">
|
||||||
<%= for index <- 0..@event.presentation_file.length-1 do %>
|
<%= for index <- 0..@event.presentation_file.length-1 do %>
|
||||||
<%= if @state.position == index && @state.position > 0 do %>
|
<%= if @state.position==index && @state.position> 0 do %>
|
||||||
<button
|
<button
|
||||||
phx-click="current-page"
|
phx-click="current-page"
|
||||||
phx-value-page={index - 1}
|
phx-value-page={index - 1}
|
||||||
@@ -350,7 +412,8 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class={"#{if @state.position == index, do: 'shadow-xl bg-white', else: 'opacity-50 bg-gray-100'} transition-all pb-5"}
|
class={"#{if @state.position==index, do: 'shadow-xl bg-white' , else: 'opacity-50 bg-gray-100' }
|
||||||
|
transition-all pb-5"}
|
||||||
id={"slide-preview-#{index}"}
|
id={"slide-preview-#{index}"}
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
@@ -366,7 +429,9 @@
|
|||||||
<% else %>
|
<% else %>
|
||||||
<img
|
<img
|
||||||
class="w-1/3 mx-auto"
|
class="w-1/3 mx-auto"
|
||||||
src={"https://#{Application.get_env(:claper, :presentations) |> Keyword.get(:aws_bucket)}.s3.#{Application.get_env(:ex_aws, :region)}.amazonaws.com/presentations/#{@event.presentation_file.hash}/#{index+1}.jpg"}
|
src={"https://#{Application.get_env(:claper, :presentations) |>
|
||||||
|
Keyword.get(:aws_bucket)}.s3.#{Application.get_env(:ex_aws,
|
||||||
|
:region)}.amazonaws.com/presentations/#{@event.presentation_file.hash}/#{index+1}.jpg"}
|
||||||
/>
|
/>
|
||||||
<% end %>
|
<% end %>
|
||||||
</button>
|
</button>
|
||||||
@@ -392,11 +457,17 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex space-x-2">
|
<div class="flex space-x-2">
|
||||||
<span>
|
<span>
|
||||||
<span class="font-semibold"><%= gettext "Poll" %></span>: <%= poll.title %>
|
<span class="font-semibold">
|
||||||
|
<%= gettext "Poll" %>
|
||||||
|
</span>: <%= poll.title %>
|
||||||
</span>
|
</span>
|
||||||
<%= if @state.position == index do %>
|
<%= if @state.position==index do %>
|
||||||
<%= if poll.enabled do %>
|
<%= if poll.enabled do %>
|
||||||
<span class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-supporting-green-100 text-supporting-green-800">
|
<button
|
||||||
|
phx-click="poll-set-inactive"
|
||||||
|
phx-value-id={poll.id}
|
||||||
|
class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-supporting-green-100 text-supporting-green-800"
|
||||||
|
>
|
||||||
<svg
|
<svg
|
||||||
style="--animate-duration: 10s;"
|
style="--animate-duration: 10s;"
|
||||||
class="mr-1.5 h-2 w-2 text-supporting-green-400 animate__animated animate__flash animate__infinite"
|
class="mr-1.5 h-2 w-2 text-supporting-green-400 animate__animated animate__flash animate__infinite"
|
||||||
@@ -406,10 +477,10 @@
|
|||||||
<circle cx="4" cy="4" r="3" />
|
<circle cx="4" cy="4" r="3" />
|
||||||
</svg>
|
</svg>
|
||||||
<%= gettext("Active") %>
|
<%= gettext("Active") %>
|
||||||
</span>
|
</button>
|
||||||
<% else %>
|
<% else %>
|
||||||
<button
|
<button
|
||||||
phx-click="poll-set-default"
|
phx-click="poll-set-active"
|
||||||
phx-value-id={poll.id}
|
phx-value-id={poll.id}
|
||||||
class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-primary-100 text-primary-800"
|
class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-primary-100 text-primary-800"
|
||||||
>
|
>
|
||||||
@@ -468,11 +539,17 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex space-x-2">
|
<div class="flex space-x-2">
|
||||||
<span>
|
<span>
|
||||||
<span class="font-semibold"><%= gettext "Form" %></span>: <%= form.title %>
|
<span class="font-semibold">
|
||||||
|
<%= gettext "Form" %>
|
||||||
|
</span>: <%= form.title %>
|
||||||
</span>
|
</span>
|
||||||
<%= if @state.position == index do %>
|
<%= if @state.position==index do %>
|
||||||
<%= if form.enabled do %>
|
<%= if form.enabled do %>
|
||||||
<span class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-supporting-green-100 text-supporting-green-800">
|
<button
|
||||||
|
phx-click="form-set-inactive"
|
||||||
|
phx-value-id={form.id}
|
||||||
|
class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-supporting-green-100 text-supporting-green-800"
|
||||||
|
>
|
||||||
<svg
|
<svg
|
||||||
style="--animate-duration: 10s;"
|
style="--animate-duration: 10s;"
|
||||||
class="mr-1.5 h-2 w-2 text-supporting-green-400 animate__animated animate__flash animate__infinite"
|
class="mr-1.5 h-2 w-2 text-supporting-green-400 animate__animated animate__flash animate__infinite"
|
||||||
@@ -482,10 +559,10 @@
|
|||||||
<circle cx="4" cy="4" r="3" />
|
<circle cx="4" cy="4" r="3" />
|
||||||
</svg>
|
</svg>
|
||||||
<%= gettext("Active") %>
|
<%= gettext("Active") %>
|
||||||
</span>
|
</button>
|
||||||
<% else %>
|
<% else %>
|
||||||
<button
|
<button
|
||||||
phx-click="form-set-default"
|
phx-click="form-set-active"
|
||||||
phx-value-id={form.id}
|
phx-value-id={form.id}
|
||||||
class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-primary-100 text-primary-800"
|
class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-primary-100 text-primary-800"
|
||||||
>
|
>
|
||||||
@@ -518,16 +595,92 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="h-10 border border-gray-300"></div>
|
<div class="h-10 border border-gray-300"></div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<%= for embed<- Enum.filter(@embeds, fn embed -> embed.position == index end) do %>
|
||||||
|
<div class="flex space-x-2 items-center">
|
||||||
|
<div class="flex h-10 w-10 flex-none text-white items-center justify-center rounded-lg bg-gradient-to-br from-primary-500 to-secondary-500">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="h-6 w-6"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M14.25 9.75L16.5 12l-2.25 2.25m-4.5 0L7.5 12l2.25-2.25M6 20.25h12A2.25 2.25 0 0020.25 18V6A2.25 2.25 0 0018 3.75H6A2.25 2.25 0 003.75 6v12A2.25 2.25 0 006 20.25z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="flex space-x-2">
|
||||||
|
<span>
|
||||||
|
<span class="font-semibold"><%= gettext "Web content" %></span>: <%= embed.title %>
|
||||||
|
</span>
|
||||||
|
<%= if @state.position == index do %>
|
||||||
|
<%= if embed.enabled do %>
|
||||||
|
<button
|
||||||
|
phx-click="embed-set-inactive"
|
||||||
|
phx-value-id={embed.id}
|
||||||
|
class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-supporting-green-100 text-supporting-green-800"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
style="--animate-duration: 10s;"
|
||||||
|
class="mr-1.5 h-2 w-2 text-supporting-green-400 animate__animated animate__flash animate__infinite"
|
||||||
|
fill="currentColor"
|
||||||
|
viewBox="0 0 8 8"
|
||||||
|
>
|
||||||
|
<circle cx="4" cy="4" r="3" />
|
||||||
|
</svg>
|
||||||
|
<%= gettext("Active") %>
|
||||||
|
</button>
|
||||||
|
<% else %>
|
||||||
|
<button
|
||||||
|
phx-click="embed-set-active"
|
||||||
|
phx-value-id={embed.id}
|
||||||
|
class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-primary-100 text-primary-800"
|
||||||
|
>
|
||||||
|
<%= gettext("Set active") %>
|
||||||
|
</button>
|
||||||
|
<% end %>
|
||||||
|
<a
|
||||||
|
data-phx-link="patch"
|
||||||
|
data-phx-link-state="push"
|
||||||
|
href={
|
||||||
|
Routes.event_manage_path(@socket, :edit_embed, @event.code, embed.id)
|
||||||
|
}
|
||||||
|
class="text-xs text-primary-500"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="h-5 w-5"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="h-10 border border-gray-300"></div>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= if @state.position == index do %>
|
<%= if @state.position==index do %>
|
||||||
<button class="underline" phx-click={toggle_add_modal()}>
|
<button class="underline" phx-click={toggle_add_modal()}>
|
||||||
<%= gettext("Add interaction") %>
|
<%= gettext("Add interaction") %>
|
||||||
</button>
|
</button>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= if @state.position == index && @state.position < @event.presentation_file.length - 1 do %>
|
<%= if @state.position==index && @state.position < @event.presentation_file.length - 1 do %>
|
||||||
<button
|
<button
|
||||||
phx-click="current-page"
|
phx-click="current-page"
|
||||||
phx-value-page={index + 1}
|
phx-value-page={index + 1}
|
||||||
@@ -549,13 +702,27 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-1 grid-rows-2 md:grid-rows-3">
|
<div class="grid grid-cols-1 grid-rows-2 md:grid-rows-3" style="height: 100%;">
|
||||||
<div class="bg-gray-200 md:row-span-2">
|
<div class="bg-gray-200 md:row-span-2 border-2">
|
||||||
<ul class="fixed z-20 flex items-center bg-gray-200 space-x-3 px-2 w-full py-2">
|
<ul
|
||||||
<li class={"rounded-md #{if @list_tab == :posts, do: 'bg-secondary-600 text-white', else: 'bg-white text-gray-600' } px-2 py-0.5 text-sm shadow-sm"}>
|
id="menu"
|
||||||
|
phx-update="replace"
|
||||||
|
class="fixed z-20 flex items-center bg-gray-200 space-x-3 px-2 w-full py-2"
|
||||||
|
>
|
||||||
|
<li class={"rounded-md #{if @list_tab==:posts, do: 'bg-secondary-600 text-white' ,
|
||||||
|
else: 'bg-white text-gray-600' } px-2 py-0.5 text-sm shadow-sm"}>
|
||||||
<%= link(gettext("Messages"), to: "#", phx_click: "list-tab", phx_value_tab: :posts) %>
|
<%= link(gettext("Messages"), to: "#", phx_click: "list-tab", phx_value_tab: :posts) %>
|
||||||
</li>
|
</li>
|
||||||
<li class={"rounded-md #{if @list_tab == :forms, do: 'bg-secondary-600 text-white', else: 'bg-white text-gray-600' } px-2 py-0.5 text-sm shadow-sm"}>
|
<li class={"rounded-md #{if @list_tab==:pinned_posts, do: 'bg-secondary-600 text-white' ,
|
||||||
|
else: 'bg-white text-gray-600' } px-2 py-0.5 text-sm shadow-sm"}>
|
||||||
|
<%= link(gettext("Pinned messages") <> " (#{@pinned_post_count})",
|
||||||
|
to: "#",
|
||||||
|
phx_click: "list-tab",
|
||||||
|
phx_value_tab: :pinned_posts
|
||||||
|
) %>
|
||||||
|
</li>
|
||||||
|
<li class={"rounded-md #{if @list_tab==:forms, do: 'bg-secondary-600 text-white' ,
|
||||||
|
else: 'bg-white text-gray-600' } px-2 py-0.5 text-sm shadow-sm"}>
|
||||||
<%= link(gettext("Form submissions"),
|
<%= link(gettext("Form submissions"),
|
||||||
to: "#",
|
to: "#",
|
||||||
phx_click: "list-tab",
|
phx_click: "list-tab",
|
||||||
@@ -563,9 +730,13 @@
|
|||||||
) %>
|
) %>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<%= if @list_tab == :posts do %>
|
|
||||||
<%= if Enum.count(@posts) == 0 do %>
|
<%= if @list_tab==:posts do %>
|
||||||
<div class="text-center h-full flex flex-col space-y-5 items-center justify-center text-gray-400">
|
<%= if Enum.count(@all_posts)==0 && Enum.count(@pinned_posts)==0 do %>
|
||||||
|
<div
|
||||||
|
class="text-center flex flex-col space-y-5 items-center justify-center text-gray-400"
|
||||||
|
style="height: 100%;"
|
||||||
|
>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
class="h-36 w-36"
|
class="h-36 w-36"
|
||||||
@@ -581,112 +752,338 @@
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
<p class="text-lg"><%= gettext("Messages from attendees will appear here.") %></p>
|
<p class="text-lg">
|
||||||
|
<%= gettext("Messages from attendees will appear here.") %>
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div
|
<div
|
||||||
id="post-list"
|
id="x"
|
||||||
class={"overflow-y-auto #{if Enum.count(@posts) > 0, do: 'max-h-full'} pb-5 pt-8 px-5"}
|
class={"overflow-y-auto #{if Enum.any?(@pinned_posts) or Enum.any?(@all_posts), do: 'h-full', else: 'h-1/2'}"}
|
||||||
phx-update="append"
|
|
||||||
data-posts-nb={Enum.count(@posts)}
|
|
||||||
phx-hook="ScrollIntoDiv"
|
|
||||||
data-target="#post-list"
|
|
||||||
>
|
>
|
||||||
<%= for post <- @posts do %>
|
<div
|
||||||
<div class={if post.__meta__.state == :deleted, do: "hidden"} id={"#{post.id}-post"}>
|
id="post-list"
|
||||||
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white relative shadow-md text-black break-all mt-4">
|
class={"overflow-y-auto #{if Enum.count(@all_posts)> 0, do: ''} pb-5 pt-8 px-5"}
|
||||||
<div class="float-right mr-1">
|
phx-update="append"
|
||||||
<%= if post.attendee_identifier do %>
|
data-posts-nb={Enum.count(@all_posts)}
|
||||||
|
phx-hook="ScrollIntoDiv"
|
||||||
|
data-target="#post-list"
|
||||||
|
>
|
||||||
|
<%= for post <- @all_posts do %>
|
||||||
|
<div
|
||||||
|
class={if post.__meta__.state == :deleted, do: "hidden"}
|
||||||
|
id={"#{post.id}-post"}
|
||||||
|
>
|
||||||
|
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white relative shadow-md text-black break-all mt-4">
|
||||||
|
<div class="float-right mr-1">
|
||||||
|
<%= if post.attendee_identifier do %>
|
||||||
|
<span class="text-yellow-500">
|
||||||
|
<%= link(
|
||||||
|
if post.pinned do
|
||||||
|
gettext("Unpin")
|
||||||
|
else
|
||||||
|
gettext("Pin")
|
||||||
|
end,
|
||||||
|
to: "#",
|
||||||
|
phx_click: "pin",
|
||||||
|
phx_value_id: post.uuid,
|
||||||
|
phx_value_event_id: @event.uuid
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<span class="text-red-500">
|
||||||
|
<%= link(gettext("Ban"),
|
||||||
|
to: "#",
|
||||||
|
phx_click: "ban",
|
||||||
|
phx_value_attendee_identifier: post.attendee_identifier,
|
||||||
|
data: [
|
||||||
|
confirm:
|
||||||
|
gettext(
|
||||||
|
"Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<% else %>
|
||||||
|
<span class="text-yellow-500">
|
||||||
|
<%= link(
|
||||||
|
if post.pinned do
|
||||||
|
gettext("Unpin")
|
||||||
|
else
|
||||||
|
gettext("Pin")
|
||||||
|
end,
|
||||||
|
to: "#",
|
||||||
|
phx_click: "pin",
|
||||||
|
phx_value_id: post.uuid,
|
||||||
|
phx_value_event_id: @event.uuid
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<span class="text-red-500">
|
||||||
|
<%= link(gettext("Ban"),
|
||||||
|
to: "#",
|
||||||
|
phx_click: "ban",
|
||||||
|
phx_value_user_id: post.user_id,
|
||||||
|
data: [
|
||||||
|
confirm:
|
||||||
|
gettext(
|
||||||
|
"Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<% end %>
|
||||||
<span class="text-red-500">
|
<span class="text-red-500">
|
||||||
<%= link(gettext("Ban"),
|
<%= link(gettext("Delete"),
|
||||||
to: "#",
|
to: "#",
|
||||||
phx_click: "ban",
|
phx_click: "delete",
|
||||||
phx_value_attendee_identifier: post.attendee_identifier,
|
phx_value_id: post.uuid,
|
||||||
data: [
|
phx_value_event_id: @event.uuid
|
||||||
confirm:
|
|
||||||
gettext(
|
|
||||||
"Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
|
||||||
)
|
|
||||||
]
|
|
||||||
) %>
|
) %>
|
||||||
</span>
|
</span>
|
||||||
/
|
</div>
|
||||||
<% else %>
|
|
||||||
<span class="text-red-500">
|
|
||||||
<%= link(gettext("Ban"),
|
|
||||||
to: "#",
|
|
||||||
phx_click: "ban",
|
|
||||||
phx_value_user_id: post.user_id,
|
|
||||||
data: [
|
|
||||||
confirm:
|
|
||||||
gettext(
|
|
||||||
"Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
|
||||||
)
|
|
||||||
]
|
|
||||||
) %>
|
|
||||||
</span>
|
|
||||||
/
|
|
||||||
<% end %>
|
|
||||||
<span class="text-red-500">
|
|
||||||
<%= link(gettext("Delete"),
|
|
||||||
to: "#",
|
|
||||||
phx_click: "delete",
|
|
||||||
phx_value_id: post.uuid,
|
|
||||||
phx_value_event_id: @event.uuid
|
|
||||||
) %>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex space-x-3 items-center">
|
<div class="flex space-x-3 items-center">
|
||||||
<%= if post.attendee_identifier do %>
|
<%= if post.attendee_identifier do %>
|
||||||
<img
|
<img
|
||||||
class="h-8 w-8"
|
class="h-8 w-8"
|
||||||
src={"https://avatars.dicebear.com/api/identicon/#{post.attendee_identifier}.svg"}
|
src={"https://api.dicebear.com/7.x/personas/svg?seed=#{post.attendee_identifier}"}
|
||||||
/>
|
/>
|
||||||
<% else %>
|
<% else %>
|
||||||
<img
|
<img
|
||||||
class="h-8 w-8"
|
class="h-8 w-8"
|
||||||
src={"https://avatars.dicebear.com/api/identicon/#{post.user_id}.svg"}
|
src={"https://api.dicebear.com/7.x/personas/svg?seed=#{post.user_id}"}
|
||||||
/>
|
/>
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<div class="flex flex-col">
|
|
||||||
<%= if post.name do %>
|
|
||||||
<p class="text-black text-sm font-semibold mr-2"><%= post.name %></p>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<p class="text-xl"><%= post.body %></p>
|
<div class="flex flex-col">
|
||||||
|
<%= if post.name do %>
|
||||||
|
<p class="text-black text-sm font-semibold mr-2">
|
||||||
|
<%= post.name %>
|
||||||
|
</p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<p class="text-xl">
|
||||||
|
<%= post.body %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%= if post.like_count> 0 || post.love_count > 0 || post.lol_count > 0 do %>
|
||||||
|
<div class="flex h-6 space-x-2 text-base text-gray-500 pb-3 items-center mt-5">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.like_count> 0 do %>
|
||||||
|
<img src="/images/icons/thumb.svg" class="h-4" />
|
||||||
|
<span class="ml-1">
|
||||||
|
<%= post.like_count %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.love_count> 0 do %>
|
||||||
|
<img src="/images/icons/heart.svg" class="h-4" />
|
||||||
|
<span class="ml-1">
|
||||||
|
<%= post.love_count %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.lol_count> 0 do %>
|
||||||
|
<img src="/images/icons/laugh.svg" class="h-4" />
|
||||||
|
<span class="ml-1">
|
||||||
|
<%= post.lol_count %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<!-- The div below encompasses the 2 post lists -->
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<%= if @list_tab == :pinned_posts do %>
|
||||||
|
<%= if Enum.count(@pinned_posts) == 0 do %>
|
||||||
|
<div
|
||||||
|
class="text-center flex flex-col space-y-5 items-center justify-center text-gray-400"
|
||||||
|
style="height: 100%;"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="h-36 w-36"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M15 4.5l-4 4l-4 1.5l-1.5 1.5l7 7l1.5 -1.5l1.5 -4l4 -4" /><path d="M9 15l-4.5 4.5" /><path d="M14.5 4l5.5 5.5" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<p class="text-lg">
|
||||||
|
<%= gettext("Pinned messages will appear here.") %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="x-pinned"
|
||||||
|
class={"overflow-y-auto #{if Enum.any?(@pinned_posts), do: 'h-full', else: 'h-1/2'}"}
|
||||||
|
>
|
||||||
|
<%= if Enum.any?(@pinned_posts) do %>
|
||||||
|
<div
|
||||||
|
id="pinned-post-list"
|
||||||
|
class="overflow-y-auto pb-5 pt-8 px-5"
|
||||||
|
phx-update="append"
|
||||||
|
data-posts-nb={Enum.count(@pinned_posts)}
|
||||||
|
phx-hook="ScrollIntoDiv"
|
||||||
|
data-target="#pinned-post-list"
|
||||||
|
>
|
||||||
|
<%= for post <- @pinned_posts do %>
|
||||||
|
<div
|
||||||
|
class={if post.__meta__.state == :deleted || !post.pinned, do: "hidden"}
|
||||||
|
id={"#{post.id}-post"}
|
||||||
|
>
|
||||||
|
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white relative shadow-md text-black break-all mt-4">
|
||||||
|
<div class="float-right mr-1">
|
||||||
|
<%= if post.attendee_identifier do %>
|
||||||
|
<span class="text-yellow-500">
|
||||||
|
<%= link(
|
||||||
|
if post.pinned do
|
||||||
|
gettext("Unpin")
|
||||||
|
else
|
||||||
|
gettext("Pin")
|
||||||
|
end,
|
||||||
|
to: "#",
|
||||||
|
phx_click: "pin",
|
||||||
|
phx_value_id: post.uuid,
|
||||||
|
phx_value_event_id: @event.uuid
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<span class="text-red-500">
|
||||||
|
<%= link(gettext("Ban"),
|
||||||
|
to: "#",
|
||||||
|
phx_click: "ban",
|
||||||
|
phx_value_attendee_identifier: post.attendee_identifier,
|
||||||
|
data: [
|
||||||
|
confirm:
|
||||||
|
gettext(
|
||||||
|
"Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<% else %>
|
||||||
|
<span class="text-yellow-500">
|
||||||
|
<%= link(
|
||||||
|
if post.pinned do
|
||||||
|
gettext("Unpin")
|
||||||
|
else
|
||||||
|
gettext("Pin")
|
||||||
|
end,
|
||||||
|
to: "#",
|
||||||
|
phx_click: "pin",
|
||||||
|
phx_value_id: post.uuid,
|
||||||
|
phx_value_event_id: @event.uuid
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<span class="text-red-500">
|
||||||
|
<%= link(gettext("Ban"),
|
||||||
|
to: "#",
|
||||||
|
phx_click: "ban",
|
||||||
|
phx_value_user_id: post.user_id,
|
||||||
|
data: [
|
||||||
|
confirm:
|
||||||
|
gettext(
|
||||||
|
"Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<% end %>
|
||||||
|
<span class="text-red-500">
|
||||||
|
<%= link(gettext("Delete"),
|
||||||
|
to: "#",
|
||||||
|
phx_click: "delete",
|
||||||
|
phx_value_id: post.uuid,
|
||||||
|
phx_value_event_id: @event.uuid
|
||||||
|
) %>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex space-x-3 items-center">
|
||||||
|
<%= if post.attendee_identifier do %>
|
||||||
|
<img
|
||||||
|
class="h-8 w-8"
|
||||||
|
src={"https://api.dicebear.com/7.x/personas/svg?seed=#{post.attendee_identifier}"}
|
||||||
|
/>
|
||||||
|
<% else %>
|
||||||
|
<img
|
||||||
|
class="h-8 w-8"
|
||||||
|
src={"https://api.dicebear.com/7.x/personas/svg?seed=#{post.user_id}"}
|
||||||
|
/>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<%= if post.name do %>
|
||||||
|
<p class="text-black text-sm font-semibold mr-2">
|
||||||
|
<%= post.name %>
|
||||||
|
</p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<p class="text-xl">
|
||||||
|
<%= post.body %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%= if post.like_count> 0 || post.love_count > 0 || post.lol_count > 0 do %>
|
||||||
|
<div class="flex h-6 space-x-2 text-base text-gray-500 pb-3 items-center mt-5">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.like_count> 0 do %>
|
||||||
|
<img src="/images/icons/thumb.svg" class="h-4" />
|
||||||
|
<span class="ml-1">
|
||||||
|
<%= post.like_count %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.love_count> 0 do %>
|
||||||
|
<img src="/images/icons/heart.svg" class="h-4" />
|
||||||
|
<span class="ml-1">
|
||||||
|
<%= post.love_count %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.lol_count> 0 do %>
|
||||||
|
<img src="/images/icons/laugh.svg" class="h-4" />
|
||||||
|
<span class="ml-1">
|
||||||
|
<%= post.lol_count %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<% end %>
|
||||||
<%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %>
|
|
||||||
<div class="flex h-6 space-x-2 text-base text-gray-500 pb-3 items-center mt-5">
|
|
||||||
<div class="flex items-center">
|
|
||||||
<%= if post.like_count > 0 do %>
|
|
||||||
<img src="/images/icons/thumb.svg" class="h-4" />
|
|
||||||
<span class="ml-1"><%= post.like_count %></span>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-center">
|
|
||||||
<%= if post.love_count > 0 do %>
|
|
||||||
<img src="/images/icons/heart.svg" class="h-4" />
|
|
||||||
<span class="ml-1"><%= post.love_count %></span>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-center">
|
|
||||||
<%= if post.lol_count > 0 do %>
|
|
||||||
<img src="/images/icons/laugh.svg" class="h-4" />
|
|
||||||
<span class="ml-1"><%= post.lol_count %></span>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% else %>
|
<% end %>
|
||||||
<%= if Enum.count(@form_submits) == 0 do %>
|
|
||||||
|
<%= if @list_tab==:forms do %>
|
||||||
|
<%= if Enum.count(@form_submits)==0 do %>
|
||||||
<div class="text-center h-full flex flex-col space-y-5 items-center justify-center text-gray-400">
|
<div class="text-center h-full flex flex-col space-y-5 items-center justify-center text-gray-400">
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@@ -714,7 +1111,8 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
<div
|
<div
|
||||||
id="form-list"
|
id="form-list"
|
||||||
class={"overflow-y-auto #{if Enum.count(@form_submits) > 0, do: 'max-h-full'} pb-5 pt-8 px-5"}
|
class={"overflow-y-auto #{if Enum.count(@form_submits)> 0, do: 'max-h-full'}
|
||||||
|
pb-5 pt-8 px-5"}
|
||||||
phx-update="append"
|
phx-update="append"
|
||||||
data-forms-nb={Enum.count(@form_submits)}
|
data-forms-nb={Enum.count(@form_submits)}
|
||||||
phx-hook="ScrollIntoDiv"
|
phx-hook="ScrollIntoDiv"
|
||||||
@@ -742,18 +1140,23 @@
|
|||||||
<%= if submission.attendee_identifier do %>
|
<%= if submission.attendee_identifier do %>
|
||||||
<img
|
<img
|
||||||
class="h-8 w-8"
|
class="h-8 w-8"
|
||||||
src={"https://avatars.dicebear.com/api/identicon/#{submission.attendee_identifier}.svg"}
|
src={"https://api.dicebear.com/7.x/personas/svg?seed=#{submission.attendee_identifier}"}
|
||||||
/>
|
/>
|
||||||
<% else %>
|
<% else %>
|
||||||
<img
|
<img
|
||||||
class="h-8 w-8"
|
class="h-8 w-8"
|
||||||
src={"https://avatars.dicebear.com/api/identicon/#{submission.user_id}.svg"}
|
src={"https://api.dicebear.com/7.x/personas/svg?seed=#{submission.user_id}"}
|
||||||
/>
|
/>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<%= for res <- submission.response do %>
|
<%= for res <- submission.response do %>
|
||||||
<p><strong><%= elem(res, 0) %>:</strong> <%= elem(res, 1) %></p>
|
<p>
|
||||||
|
<strong>
|
||||||
|
<%= elem(res, 0) %>:
|
||||||
|
</strong>
|
||||||
|
<%= elem(res, 1) %>
|
||||||
|
</p>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -765,47 +1168,75 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="w-full shadow-lg">
|
<div class="w-full shadow-lg">
|
||||||
<div class="px-5 py-3 grid grid-cols-1 sm:grid-cols-2">
|
<div class="px-5 py-3 grid grid-cols-1 lg:grid-cols-2">
|
||||||
<div>
|
<div>
|
||||||
<span class="font-semibold text-lg"><%= gettext("On screen settings") %></span>
|
<span class="font-semibold text-lg">
|
||||||
|
<%= gettext("On screen settings") %>
|
||||||
|
</span>
|
||||||
|
|
||||||
<div class="flex space-x-2 items-center mt-3">
|
<div class="flex space-x-2 items-center mt-3">
|
||||||
<ClaperWeb.Component.Input.check
|
<ClaperWeb.Component.Input.check
|
||||||
key={:join_screen_visible}
|
key={:join_screen_visible}
|
||||||
checked={@state.join_screen_visible}
|
checked={@state.join_screen_visible}
|
||||||
|
shortcut={if @create == nil, do: "Q", else: nil}
|
||||||
/>
|
/>
|
||||||
<span><%= gettext("Show instructions") %></span>
|
<span><%= gettext("Show instructions") %><code class="pl-1">(Q)</code></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex space-x-2 items-center mt-3">
|
<div class="flex space-x-2 items-center mt-3">
|
||||||
<ClaperWeb.Component.Input.check key={:chat_visible} checked={@state.chat_visible} />
|
<ClaperWeb.Component.Input.check
|
||||||
<span><%= gettext("Show messages") %></span>
|
key={:chat_visible}
|
||||||
|
checked={@state.chat_visible}
|
||||||
|
shortcut={if @create == nil, do: "W", else: nil}
|
||||||
|
/>
|
||||||
|
<span><%= gettext("Show messages") %><code class="pl-1">(W)</code></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class={"#{if !@current_poll, do: 'opacity-50'} flex space-x-2 items-center mt-3"}>
|
<div class="flex space-x-2 items-center mt-3">
|
||||||
|
<ClaperWeb.Component.Input.check
|
||||||
|
key={:show_only_pinned}
|
||||||
|
checked={@state.show_only_pinned}
|
||||||
|
shortcut={if @create == nil, do: "E", else: nil}
|
||||||
|
/>
|
||||||
|
<span>
|
||||||
|
<%= gettext("Show only pinned messages") %><code class="pl-1">(E)</code>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class={"#{if !@current_poll, do: 'opacity-50' } flex space-x-2 items-center mt-3"}>
|
||||||
<ClaperWeb.Component.Input.check
|
<ClaperWeb.Component.Input.check
|
||||||
key={:poll_visible}
|
key={:poll_visible}
|
||||||
disabled={!@current_poll}
|
disabled={!@current_poll}
|
||||||
checked={@state.poll_visible}
|
checked={@state.poll_visible}
|
||||||
|
shortcut={if @create == nil, do: "R", else: nil}
|
||||||
/>
|
/>
|
||||||
<span><%= gettext("Show poll results") %></span>
|
<span><%= gettext("Show poll results") %><code class="pl-1">(R)</code></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<span class="font-semibold text-lg"><%= gettext("Attendees settings") %></span>
|
<span class="font-semibold text-lg">
|
||||||
|
<%= gettext("Attendees settings") %>
|
||||||
|
</span>
|
||||||
|
|
||||||
<div class="flex space-x-2 items-center mt-3">
|
<div class="flex space-x-2 items-center mt-3">
|
||||||
<ClaperWeb.Component.Input.check key={:chat_enabled} checked={@state.chat_enabled} />
|
<ClaperWeb.Component.Input.check
|
||||||
<span><%= gettext("Enable messages") %></span>
|
key={:chat_enabled}
|
||||||
|
checked={@state.chat_enabled}
|
||||||
|
shortcut={if @create == nil, do: "A", else: nil}
|
||||||
|
/>
|
||||||
|
<span><%= gettext("Enable messages") %><code class="pl-1">(A)</code></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex space-x-2 items-center mt-3">
|
<div class="flex space-x-2 items-center mt-3">
|
||||||
<ClaperWeb.Component.Input.check
|
<ClaperWeb.Component.Input.check
|
||||||
key={:anonymous_chat_enabled}
|
key={:anonymous_chat_enabled}
|
||||||
checked={@state.anonymous_chat_enabled}
|
checked={@state.anonymous_chat_enabled}
|
||||||
|
shortcut={if @create == nil, do: "S", else: nil}
|
||||||
/>
|
/>
|
||||||
<span><%= gettext("Enable anonymous messages") %></span>
|
<span>
|
||||||
|
<%= gettext("Enable anonymous messages") %><code class="pl-1">(S)</code>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -65,10 +65,18 @@ defmodule ClaperWeb.EventLive.PollComponent do
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex space-x-3 z-10 text-left">
|
<div class="flex space-x-3 z-10 text-left">
|
||||||
<%= if (length Enum.filter(@current_poll_vote, fn(vote) -> vote.poll_opt_id == opt.id end)) > 0 do %>
|
<%= if (length Enum.filter(@current_poll_vote, fn(vote) -> vote.poll_opt_id == opt.id end)) > 0 do %>
|
||||||
<span class="h-5 w-5 mt-0.5 rounded-full point-select bg-white"></span>
|
<%= if @poll.multiple do %>
|
||||||
|
<span class="h-5 w-5 mt-0.5 point-select bg-white"></span>
|
||||||
|
<% else %>
|
||||||
|
<span class="h-5 w-5 mt-0.5 rounded-full point-select bg-white"></span>
|
||||||
|
<% end %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<span class="h-5 w-5 mt-0.5 rounded-full point-select border-2 border-white">
|
<%= if @poll.multiple do %>
|
||||||
</span>
|
<span class="h-5 w-5 mt-0.5 point-select border-2 border-white"></span>
|
||||||
|
<% else %>
|
||||||
|
<span class="h-5 w-5 mt-0.5 rounded-full point-select border-2 border-white">
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<span class="flex-1"><%= opt.content %></span>
|
<span class="flex-1"><%= opt.content %></span>
|
||||||
</div>
|
</div>
|
||||||
@@ -88,10 +96,18 @@ defmodule ClaperWeb.EventLive.PollComponent do
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex space-x-3 z-10 text-left">
|
<div class="flex space-x-3 z-10 text-left">
|
||||||
<%= if Enum.member?(@selected_poll_opt, "#{idx}") do %>
|
<%= if Enum.member?(@selected_poll_opt, "#{idx}") do %>
|
||||||
<span class="h-5 w-5 mt-0.5 rounded-full point-select bg-white"></span>
|
<%= if @poll.multiple do %>
|
||||||
|
<span class="h-5 w-5 mt-0.5 point-select bg-white"></span>
|
||||||
|
<% else %>
|
||||||
|
<span class="h-5 w-5 mt-0.5 rounded-full point-select bg-white"></span>
|
||||||
|
<% end %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<span class="h-5 w-5 mt-0.5 rounded-full point-select border-2 border-white">
|
<%= if @poll.multiple do %>
|
||||||
</span>
|
<span class="h-5 w-5 mt-0.5 point-select border-2 border-white"></span>
|
||||||
|
<% else %>
|
||||||
|
<span class="h-5 w-5 mt-0.5 rounded-full point-select border-2 border-white">
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<span class="flex-1"><%= opt.content %></span>
|
<span class="flex-1"><%= opt.content %></span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ defmodule ClaperWeb.EventLive.PostComponent do
|
|||||||
<img src="/images/icons/ellipsis-horizontal-white.svg" class="h-5" />
|
<img src="/images/icons/ellipsis-horizontal-white.svg" class="h-5" />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<%= if @post.name || is_a_leader(@post, @event, @leaders) do %>
|
<%= if @post.name || is_a_leader(@post, @event, @leaders) || is_pinned(@post) do %>
|
||||||
<div class="inline-flex items-center">
|
<div class="inline-flex items-center">
|
||||||
<%= if @post.name do %>
|
<%= if @post.name do %>
|
||||||
<p class="text-white text-xs font-semibold mb-2 mr-2"><%= @post.name %></p>
|
<p class="text-white text-xs font-semibold mb-2 mr-2"><%= @post.name %></p>
|
||||||
@@ -33,6 +33,32 @@ defmodule ClaperWeb.EventLive.PostComponent do
|
|||||||
<span><%= gettext("Host") %></span>
|
<span><%= gettext("Host") %></span>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<%= if is_pinned(@post) do %>
|
||||||
|
<div class="inline-flex items-center space-x-1 justify-center px-3 py-0.5 rounded-full text-xs font-medium bg-supporting-yellow-100 text-supporting-yellow-800 mb-2 ml-1">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="icon icon-tabler icon-tabler-pin-filled"
|
||||||
|
width="12"
|
||||||
|
height="12"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||||
|
<path
|
||||||
|
d="M15.113 3.21l.094 .083l5.5 5.5a1 1 0 0 1 -1.175 1.59l-3.172 3.171l-1.424 3.797a1 1 0 0 1 -.158 .277l-.07 .08l-1.5 1.5a1 1 0 0 1 -1.32 .082l-.095 -.083l-2.793 -2.792l-3.793 3.792a1 1 0 0 1 -1.497 -1.32l.083 -.094l3.792 -3.793l-2.792 -2.793a1 1 0 0 1 -.083 -1.32l.083 -.094l1.5 -1.5a1 1 0 0 1 .258 -.187l.098 -.042l3.796 -1.425l3.171 -3.17a1 1 0 0 1 1.497 -1.26z"
|
||||||
|
stroke-width="0"
|
||||||
|
fill="currentColor"
|
||||||
|
>
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
<span><%= gettext("Pinned") %></span>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
@@ -124,6 +150,32 @@ defmodule ClaperWeb.EventLive.PostComponent do
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<%= if is_pinned(@post) do %>
|
||||||
|
<div class="inline-flex items-center space-x-1 justify-center px-3 py-0.5 rounded-full text-xs font-medium bg-supporting-yellow-100 text-supporting-yellow-800 mb-2 ml-1">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="icon icon-tabler icon-tabler-pin-filled"
|
||||||
|
width="12"
|
||||||
|
height="12"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||||
|
<path
|
||||||
|
d="M15.113 3.21l.094 .083l5.5 5.5a1 1 0 0 1 -1.175 1.59l-3.172 3.171l-1.424 3.797a1 1 0 0 1 -.158 .277l-.07 .08l-1.5 1.5a1 1 0 0 1 -1.32 .082l-.095 -.083l-2.793 -2.792l-3.793 3.792a1 1 0 0 1 -1.497 -1.32l.083 -.094l3.792 -3.793l-2.792 -2.793a1 1 0 0 1 -.083 -1.32l.083 -.094l1.5 -1.5a1 1 0 0 1 .258 -.187l.098 -.042l3.796 -1.425l3.171 -3.17a1 1 0 0 1 1.497 -1.26z"
|
||||||
|
stroke-width="0"
|
||||||
|
fill="currentColor"
|
||||||
|
>
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
<span><%= gettext("Pinned") %></span>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<p><%= @post.body %></p>
|
<p><%= @post.body %></p>
|
||||||
|
|
||||||
<div class="flex h-6 text-xs float-right space-x-2">
|
<div class="flex h-6 text-xs float-right space-x-2">
|
||||||
@@ -218,4 +270,8 @@ defmodule ClaperWeb.EventLive.PostComponent do
|
|||||||
leader.user_id == post.user_id
|
leader.user_id == post.user_id
|
||||||
end))
|
end))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp is_pinned(post) do
|
||||||
|
post.pinned == true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -46,14 +46,23 @@ defmodule ClaperWeb.EventLive.Presenter do
|
|||||||
|> assign(:event, event)
|
|> assign(:event, event)
|
||||||
|> assign(:state, event.presentation_file.presentation_state)
|
|> assign(:state, event.presentation_file.presentation_state)
|
||||||
|> assign(:posts, list_posts(socket, event.uuid))
|
|> assign(:posts, list_posts(socket, event.uuid))
|
||||||
|
|> assign(:pinned_posts, list_pinned_posts(socket, event.uuid))
|
||||||
|
|> assign(:show_only_pinned, event.presentation_file.presentation_state.show_only_pinned)
|
||||||
|> assign(:reacts, [])
|
|> assign(:reacts, [])
|
||||||
|> poll_at_position
|
|> poll_at_position
|
||||||
|> form_at_position
|
|> form_at_position
|
||||||
|
|> embed_at_position
|
||||||
|
|
||||||
{:ok, socket, temporary_assigns: [posts: []]}
|
{:ok, socket, temporary_assigns: []}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp update_post_in_list(posts, updated_post) do
|
||||||
|
Enum.map(posts, fn post ->
|
||||||
|
if post.id == updated_post.id, do: updated_post, else: post
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
defp is_leader(%{assigns: %{current_user: current_user}} = _socket, event) do
|
defp is_leader(%{assigns: %{current_user: current_user}} = _socket, event) do
|
||||||
Claper.Events.is_leaded_by(current_user.email, event) || event.user.id == current_user.id
|
Claper.Events.is_leaded_by(current_user.email, event) || event.user.id == current_user.id
|
||||||
end
|
end
|
||||||
@@ -70,7 +79,23 @@ defmodule ClaperWeb.EventLive.Presenter do
|
|||||||
def handle_info({:post_created, post}, socket) do
|
def handle_info({:post_created, post}, socket) do
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket
|
socket
|
||||||
|> update(:posts, fn posts -> [post | posts] end)}
|
|> update(:posts, fn posts -> posts ++ [post] end)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:post_pinned, post}, socket) do
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:pinned_posts, fn pinned_posts -> pinned_posts ++ [post] end)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:post_unpinned, post}, socket) do
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:pinned_posts, fn pinned_posts ->
|
||||||
|
Enum.reject(pinned_posts, fn p -> p.id == post.id end)
|
||||||
|
end)}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -80,34 +105,41 @@ defmodule ClaperWeb.EventLive.Presenter do
|
|||||||
|> assign(:state, state)
|
|> assign(:state, state)
|
||||||
|> push_event("page", %{current_page: state.position})
|
|> push_event("page", %{current_page: state.position})
|
||||||
|> push_event("reset-global-react", %{})
|
|> push_event("reset-global-react", %{})
|
||||||
|> poll_at_position}
|
|> poll_at_position
|
||||||
|
|> embed_at_position}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:post_updated, post}, socket) do
|
def handle_info({:post_updated, updated_post}, socket) do
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
updated_posts = update_post_in_list(socket.assigns.posts, updated_post)
|
||||||
end
|
updated_pinned_posts = update_post_in_list(socket.assigns.pinned_posts, updated_post)
|
||||||
|
|
||||||
@impl true
|
{:noreply,
|
||||||
def handle_info({:reaction_added, post}, socket) do
|
socket
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
|> assign(:posts, updated_posts)
|
||||||
end
|
|> assign(:pinned_posts, updated_pinned_posts)}
|
||||||
|
|
||||||
@impl true
|
|
||||||
def handle_info({:reaction_removed, post}, socket) do
|
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:post_deleted, post}, socket) do
|
def handle_info({:post_deleted, post}, socket) do
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
updated_posts = Enum.reject(socket.assigns.posts, fn p -> p.id == post.id end)
|
||||||
|
updated_pinned_posts = Enum.reject(socket.assigns.pinned_posts, fn p -> p.id == post.id end)
|
||||||
|
|
||||||
|
{:noreply,
|
||||||
|
socket |> assign(:posts, updated_posts) |> assign(:pinned_posts, updated_pinned_posts)}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:poll_updated, poll}, socket) do
|
def handle_info({:poll_updated, poll}, socket) do
|
||||||
{:noreply,
|
if poll.enabled do
|
||||||
socket
|
{:noreply,
|
||||||
|> update(:current_poll, fn _current_poll -> poll end)}
|
socket
|
||||||
|
|> update(:current_poll, fn _current_poll -> poll end)}
|
||||||
|
else
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_poll, fn _current_poll -> nil end)}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -119,9 +151,15 @@ defmodule ClaperWeb.EventLive.Presenter do
|
|||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:form_updated, form}, socket) do
|
def handle_info({:form_updated, form}, socket) do
|
||||||
{:noreply,
|
if form.active do
|
||||||
socket
|
{:noreply,
|
||||||
|> update(:current_form, fn _current_form -> form end)}
|
socket
|
||||||
|
|> update(:current_form, fn _current_form -> form end)}
|
||||||
|
else
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_form, fn _current_form -> nil end)}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -131,6 +169,26 @@ defmodule ClaperWeb.EventLive.Presenter do
|
|||||||
|> update(:current_form, fn _current_form -> nil end)}
|
|> update(:current_form, fn _current_form -> nil end)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:embed_updated, embed}, socket) do
|
||||||
|
if embed.active do
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_embed, fn _current_embed -> embed end)}
|
||||||
|
else
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_embed, fn _current_embed -> nil end)}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:embed_deleted, _embed}, socket) do
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_embed, fn _current_embed -> nil end)}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:chat_visible, value}, socket) do
|
def handle_info({:chat_visible, value}, socket) do
|
||||||
{:noreply,
|
{:noreply,
|
||||||
@@ -139,6 +197,14 @@ defmodule ClaperWeb.EventLive.Presenter do
|
|||||||
|> update(:chat_visible, fn _chat_visible -> value end)}
|
|> update(:chat_visible, fn _chat_visible -> value end)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:show_only_pinned, value}, socket) do
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> push_event("show_only_pinned", %{value: value})
|
||||||
|
|> update(:show_only_pinned, fn _show_only_pinned -> value end)}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:poll_visible, value}, socket) do
|
def handle_info({:poll_visible, value}, socket) do
|
||||||
{:noreply,
|
{:noreply,
|
||||||
@@ -178,6 +244,14 @@ defmodule ClaperWeb.EventLive.Presenter do
|
|||||||
{:noreply, socket |> assign(:current_form, form)}
|
{:noreply, socket |> assign(:current_form, form)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info(
|
||||||
|
{:current_embed, embed},
|
||||||
|
socket
|
||||||
|
) do
|
||||||
|
{:noreply, socket |> assign(:current_embed, embed)}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info(_, socket) do
|
def handle_info(_, socket) do
|
||||||
{:noreply, socket}
|
{:noreply, socket}
|
||||||
@@ -212,7 +286,21 @@ defmodule ClaperWeb.EventLive.Presenter do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp embed_at_position(%{assigns: %{event: event, state: state}} = socket) do
|
||||||
|
with embed <-
|
||||||
|
Claper.Embeds.get_embed_current_position(
|
||||||
|
event.presentation_file.id,
|
||||||
|
state.position
|
||||||
|
) do
|
||||||
|
socket |> assign(:current_embed, embed)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp list_posts(_socket, event_id) do
|
defp list_posts(_socket, event_id) do
|
||||||
Claper.Posts.list_posts(event_id, [:event, :reactions])
|
Claper.Posts.list_posts(event_id, [:event, :reactions])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp list_pinned_posts(_socket, event_id) do
|
||||||
|
Claper.Posts.list_pinned_posts(event_id, [:event, :reactions])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
background: black;
|
background: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iframe {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -14,7 +19,7 @@
|
|||||||
<!-- JOIN SCREEN -->
|
<!-- JOIN SCREEN -->
|
||||||
<div
|
<div
|
||||||
id="joinScreen"
|
id="joinScreen"
|
||||||
class={"#{if @state.join_screen_visible, do: 'opacity-100', else: 'opacity-0'} h-full w-full flex flex-col justify-center bg-black absolute z-30 transition-opacity"}
|
class={"#{if @state.join_screen_visible, do: 'opacity-100 z-40', else: 'opacity-0'} h-full w-full flex flex-col justify-center bg-black absolute transition-opacity"}
|
||||||
>
|
>
|
||||||
<div class="h-full bg-black text-white bg-opacity-50 text-center flex flex-col items-center justify-center">
|
<div class="h-full bg-black text-white bg-opacity-50 text-center flex flex-col items-center justify-center">
|
||||||
<span class="font-semibold mb-10 sm:text-3xl md:text-4xl lg:text-6xl">
|
<span class="font-semibold mb-10 sm:text-3xl md:text-4xl lg:text-6xl">
|
||||||
@@ -68,6 +73,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<%= if @current_embed do %>
|
||||||
|
<!-- EMBED -->
|
||||||
|
<div
|
||||||
|
id="embed"
|
||||||
|
class={"#{if @state.chat_visible, do: 'h-5/6 w-9/12 right-0', else: 'h-screen w-full'} transition-all duration-150 inline-block transform -translate-y-1/2 top-1/2 z-30 absolute transition-opacity"}
|
||||||
|
>
|
||||||
|
<%= raw(@current_embed.content) %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
<!-- MESSAGES -->
|
<!-- MESSAGES -->
|
||||||
<div
|
<div
|
||||||
id="slider-wrapper"
|
id="slider-wrapper"
|
||||||
@@ -75,40 +89,80 @@
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class={"#{if @state.chat_visible, do: 'opacity-100 w-3/12 px-4 showed', else: 'opacity-0 w-0 p-0'} transition-all duration-150 flex flex-col h-screen py-5 justify-end max-h-screen bg-black"}
|
class={"#{if @state.chat_visible, do: 'opacity-100 w-3/12 px-4 showed', else: 'opacity-0 w-0 p-0'} transition-all duration-150 flex flex-col h-screen py-5 justify-end max-h-screen bg-black"}
|
||||||
id="post-list"
|
id="post-list-wrapper"
|
||||||
phx-update="append"
|
phx-update="replace"
|
||||||
>
|
>
|
||||||
<%= for post <- @posts do %>
|
<%= if @state.show_only_pinned == false do %>
|
||||||
<div class={if post.__meta__.state == :deleted, do: "hidden"} id={"#{post.id}-post"}>
|
<div id="post-list" phx-update="replace">
|
||||||
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white shadow-md text-black break-word mt-4">
|
<%= for post <- @posts do %>
|
||||||
<%= if post.name do %>
|
<div class={if post.__meta__.state == :deleted, do: "hidden"} id={"#{post.id}-post"}>
|
||||||
<p class="text-gray-400 text-lg font-semibold mb-2 mr-2"><%= post.name %></p>
|
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white shadow-md text-black break-word mt-4">
|
||||||
<% end %>
|
<%= if post.name do %>
|
||||||
<p class="text-3xl"><%= post.body %></p>
|
<p class="text-gray-400 text-lg font-semibold mb-2 mr-2"><%= post.name %></p>
|
||||||
|
<% end %>
|
||||||
|
<p class="text-3xl"><%= post.body %></p>
|
||||||
|
|
||||||
<%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %>
|
<%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %>
|
||||||
<div class="flex h-6 space-x-2 text-lg text-gray-500 pb-3 items-center mt-5">
|
<div class="flex h-6 space-x-2 text-lg text-gray-500 pb-3 items-center mt-5">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<%= if post.like_count > 0 do %>
|
<%= if post.like_count > 0 do %>
|
||||||
<img src="/images/icons/thumb.svg" class="h-7" />
|
<img src="/images/icons/thumb.svg" class="h-7" />
|
||||||
<span class="ml-1"><%= post.like_count %></span>
|
<span class="ml-1"><%= post.like_count %></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<%= if post.love_count > 0 do %>
|
<%= if post.love_count > 0 do %>
|
||||||
<img src="/images/icons/heart.svg" class="h-7" />
|
<img src="/images/icons/heart.svg" class="h-7" />
|
||||||
<span class="ml-1"><%= post.love_count %></span>
|
<span class="ml-1"><%= post.love_count %></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<%= if post.lol_count > 0 do %>
|
<%= if post.lol_count > 0 do %>
|
||||||
<img src="/images/icons/laugh.svg" class="h-7" />
|
<img src="/images/icons/laugh.svg" class="h-7" />
|
||||||
<span class="ml-1"><%= post.lol_count %></span>
|
<span class="ml-1"><%= post.lol_count %></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
</div>
|
||||||
</div>
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<% else %>
|
||||||
|
<div id="pinned-posts" phx-update="replace">
|
||||||
|
<%= for post <- @pinned_posts do %>
|
||||||
|
<div class={if post.__meta__.state == :deleted, do: "hidden"} id={"#{post.id}-post"}>
|
||||||
|
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white shadow-md text-black break-word mt-4">
|
||||||
|
<%= if post.name do %>
|
||||||
|
<p class="text-gray-400 text-lg font-semibold mb-2 mr-2"><%= post.name %></p>
|
||||||
|
<% end %>
|
||||||
|
<p class="text-3xl"><%= post.body %></p>
|
||||||
|
|
||||||
|
<%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %>
|
||||||
|
<div class="flex h-6 space-x-2 text-lg text-gray-500 pb-3 items-center mt-5">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.like_count > 0 do %>
|
||||||
|
<img src="/images/icons/thumb.svg" class="h-7" />
|
||||||
|
<span class="ml-1"><%= post.like_count %></span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.love_count > 0 do %>
|
||||||
|
<img src="/images/icons/heart.svg" class="h-7" />
|
||||||
|
<span class="ml-1"><%= post.love_count %></span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<%= if post.lol_count > 0 do %>
|
||||||
|
<img src="/images/icons/laugh.svg" class="h-7" />
|
||||||
|
<span class="ml-1"><%= post.lol_count %></span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
defmodule ClaperWeb.EventLive.Show do
|
defmodule ClaperWeb.EventLive.Show do
|
||||||
use ClaperWeb, :live_view
|
use ClaperWeb, :live_view
|
||||||
|
|
||||||
alias Claper.{Posts, Polls, Forms}
|
alias Claper.{Posts, Polls, Forms, Embeds}
|
||||||
alias ClaperWeb.Presence
|
alias ClaperWeb.Presence
|
||||||
|
|
||||||
on_mount(ClaperWeb.AttendeeLiveAuth)
|
on_mount(ClaperWeb.AttendeeLiveAuth)
|
||||||
@@ -86,6 +86,7 @@ defmodule ClaperWeb.EventLive.Show do
|
|||||||
|> starting_soon_assigns(event)
|
|> starting_soon_assigns(event)
|
||||||
|> get_current_poll(event)
|
|> get_current_poll(event)
|
||||||
|> get_current_form(event)
|
|> get_current_form(event)
|
||||||
|
|> get_current_embed(event)
|
||||||
|> check_leader(event)
|
|> check_leader(event)
|
||||||
|> leader_list(event)
|
|> leader_list(event)
|
||||||
|
|
||||||
@@ -245,11 +246,29 @@ defmodule ClaperWeb.EventLive.Show do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info(
|
||||||
|
{:current_embed, embed},
|
||||||
|
socket
|
||||||
|
) do
|
||||||
|
{:noreply, socket |> assign(:current_embed, embed)}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:post_updated, post}, socket) do
|
def handle_info({:post_updated, post}, socket) do
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:post_pinned, post}, socket) do
|
||||||
|
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:post_unpinned, post}, socket) do
|
||||||
|
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:reaction_added, post}, socket) do
|
def handle_info({:reaction_added, post}, socket) do
|
||||||
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
{:noreply, socket |> update(:posts, fn posts -> [post | posts] end)}
|
||||||
@@ -267,9 +286,15 @@ defmodule ClaperWeb.EventLive.Show do
|
|||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:poll_updated, poll}, socket) do
|
def handle_info({:poll_updated, poll}, socket) do
|
||||||
{:noreply,
|
if poll.enabled do
|
||||||
socket
|
{:noreply,
|
||||||
|> update(:current_poll, fn _current_poll -> poll end)}
|
socket
|
||||||
|
|> update(:current_poll, fn _current_poll -> poll end)}
|
||||||
|
else
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_poll, fn _current_poll -> nil end)}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -281,9 +306,15 @@ defmodule ClaperWeb.EventLive.Show do
|
|||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:form_updated, form}, socket) do
|
def handle_info({:form_updated, form}, socket) do
|
||||||
{:noreply,
|
if form.enabled do
|
||||||
socket
|
{:noreply,
|
||||||
|> update(:current_form, fn _current_form -> form end)}
|
socket
|
||||||
|
|> update(:current_form, fn _current_form -> form end)}
|
||||||
|
else
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_form, fn _current_form -> nil end)}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -293,6 +324,26 @@ defmodule ClaperWeb.EventLive.Show do
|
|||||||
|> update(:current_form, fn _current_form -> nil end)}
|
|> update(:current_form, fn _current_form -> nil end)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:embed_updated, embed}, socket) do
|
||||||
|
if embed.enabled do
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_embed, fn _current_embed -> embed end)}
|
||||||
|
else
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_embed, fn _current_embed -> nil end)}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info({:embed_deleted, _embed}, socket) do
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> update(:current_embed, fn _current_embed -> nil end)}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:react, type}, socket) do
|
def handle_info({:react, type}, socket) do
|
||||||
{:noreply,
|
{:noreply,
|
||||||
@@ -647,6 +698,16 @@ defmodule ClaperWeb.EventLive.Show do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp get_current_embed(socket, event) do
|
||||||
|
with embed <-
|
||||||
|
Embeds.get_embed_current_position(
|
||||||
|
event.presentation_file.id,
|
||||||
|
event.presentation_file.presentation_state.position
|
||||||
|
) do
|
||||||
|
socket |> assign(:current_embed, embed)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp get_current_vote(%{assigns: %{current_user: current_user}} = socket, poll_id)
|
defp get_current_vote(%{assigns: %{current_user: current_user}} = socket, poll_id)
|
||||||
when is_map(current_user) do
|
when is_map(current_user) do
|
||||||
vote = Polls.get_poll_vote(current_user.id, poll_id)
|
vote = Polls.get_poll_vote(current_user.id, poll_id)
|
||||||
|
|||||||
@@ -88,6 +88,24 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<%= if @current_embed != nil and @current_embed.attendee_visibility == true do %>
|
||||||
|
<div
|
||||||
|
id="embed-wrapper-parent"
|
||||||
|
class="animate__animated animate__zoomInDown w-full lg:w-1/3 lg:mx-auto fixed top-16 z-10 px-2 pb-6 lg:px-7 max-h-screen overflow-y-auto"
|
||||||
|
>
|
||||||
|
<div class="transition-all" id="embed-wrapper">
|
||||||
|
<.live_component
|
||||||
|
module={ClaperWeb.EventLive.EmbedComponent}
|
||||||
|
id={"#{@current_embed.id}-embed"}
|
||||||
|
embed={@current_embed}
|
||||||
|
current_user={@current_user}
|
||||||
|
attendee_identifier={@attendee_identifier}
|
||||||
|
event={@event}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="flex flex-col space-y-4 px-5 pt-20 pb-32 lg:w-1/3 bg-black min-h-screen"
|
class="flex flex-col space-y-4 px-5 pt-20 pb-32 lg:w-1/3 bg-black min-h-screen"
|
||||||
id="post-list"
|
id="post-list"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ defmodule ClaperWeb.StatLive.Index do
|
|||||||
|
|
||||||
event =
|
event =
|
||||||
Events.get_managed_event!(socket.assigns.current_user, id,
|
Events.get_managed_event!(socket.assigns.current_user, id,
|
||||||
presentation_file: [polls: [:poll_opts], forms: [:form_submits]]
|
presentation_file: [polls: [:poll_opts], forms: [:form_submits], embeds: []]
|
||||||
)
|
)
|
||||||
|
|
||||||
grouped_total_votes = Claper.Stats.total_vote_count(event.presentation_file.id)
|
grouped_total_votes = Claper.Stats.total_vote_count(event.presentation_file.id)
|
||||||
|
|||||||
@@ -252,6 +252,17 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<%= for embed <- Enum.filter(@event.presentation_file.embeds , fn e -> e.position == position end) do %>
|
||||||
|
<span class="text-2xl font-semibold text-gray-900 mb-4">
|
||||||
|
<%= gettext("Web content") %>: <%= embed.title %>
|
||||||
|
</span>
|
||||||
|
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white relative shadow-md text-black break-all mt-4">
|
||||||
|
<div class="flex space-x-3 items-center">
|
||||||
|
<%= raw(embed.content) %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% posts = Enum.filter(@posts, fn p -> p.position == position end) %>
|
<% posts = Enum.filter(@posts, fn p -> p.position == position end) %>
|
||||||
|
|
||||||
<span class="text-2xl font-semibold text-gray-900 mb-4">Messages</span>
|
<span class="text-2xl font-semibold text-gray-900 mb-4">Messages</span>
|
||||||
|
|||||||
15
lib/claper_web/notifiers/leader_notifier.ex
Normal file
15
lib/claper_web/notifiers/leader_notifier.ex
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
defmodule ClaperWeb.Notifiers.LeaderNotifier do
|
||||||
|
use Phoenix.Swoosh, view: ClaperWeb.LeaderNotifierView, layout: {ClaperWeb.LayoutView, :email}
|
||||||
|
import ClaperWeb.Gettext
|
||||||
|
|
||||||
|
def event_invitation(event_name, email, url) do
|
||||||
|
new()
|
||||||
|
|> to(email)
|
||||||
|
|> from(
|
||||||
|
{Application.get_env(:claper, :mail) |> Keyword.get(:from_name),
|
||||||
|
Application.get_env(:claper, :mail) |> Keyword.get(:from)}
|
||||||
|
)
|
||||||
|
|> subject(gettext("You have been invited to manage an event"))
|
||||||
|
|> render_body("invitation.html", %{event_name: event_name, leader_email: email, url: url})
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -68,6 +68,8 @@ defmodule ClaperWeb.Router do
|
|||||||
live("/e/:code/manage/add/form", EventLive.Manage, :add_form)
|
live("/e/:code/manage/add/form", EventLive.Manage, :add_form)
|
||||||
live("/e/:code/manage/import", EventLive.Manage, :import)
|
live("/e/:code/manage/import", EventLive.Manage, :import)
|
||||||
live("/e/:code/manage/edit/form/:id", EventLive.Manage, :edit_form)
|
live("/e/:code/manage/edit/form/:id", EventLive.Manage, :edit_form)
|
||||||
|
live("/e/:code/manage/add/embed", EventLive.Manage, :add_embed)
|
||||||
|
live("/e/:code/manage/edit/embed/:id", EventLive.Manage, :edit_embed)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -112,6 +114,7 @@ defmodule ClaperWeb.Router do
|
|||||||
get("/users/reset_password", UserResetPasswordController, :new)
|
get("/users/reset_password", UserResetPasswordController, :new)
|
||||||
post("/users/reset_password", UserResetPasswordController, :create)
|
post("/users/reset_password", UserResetPasswordController, :create)
|
||||||
get("/users/reset_password/:token", UserResetPasswordController, :edit)
|
get("/users/reset_password/:token", UserResetPasswordController, :edit)
|
||||||
|
post("/users/reset_password/:token", UserResetPasswordController, :update)
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/", ClaperWeb do
|
scope "/", ClaperWeb do
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<table
|
||||||
|
width="95%"
|
||||||
|
border="0"
|
||||||
|
align="center"
|
||||||
|
cellpadding="0"
|
||||||
|
cellspacing="0"
|
||||||
|
style="max-width:670px;background:#fff; border-radius:3px; text-align:center;-webkit-box-shadow:0 6px 18px 0 rgba(0,0,0,.06);-moz-box-shadow:0 6px 18px 0 rgba(0,0,0,.06);box-shadow:0 6px 18px 0 rgba(0,0,0,.06);"
|
||||||
|
>
|
||||||
|
<tr>
|
||||||
|
<td style="height:40px;"> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="padding:0 35px;">
|
||||||
|
<h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">
|
||||||
|
<%= gettext("You have been invited") %>
|
||||||
|
</h1>
|
||||||
|
<span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;">
|
||||||
|
</span>
|
||||||
|
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
|
||||||
|
<%= gettext("Someone invited you to manage the event: %{name}", name: @event_name) %>
|
||||||
|
</p>
|
||||||
|
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
|
||||||
|
<%= gettext(
|
||||||
|
"To accept the invitation, please login or create an account with this email: %{email}",
|
||||||
|
email: @leader_email
|
||||||
|
) %>
|
||||||
|
</p>
|
||||||
|
<a
|
||||||
|
href={@url}
|
||||||
|
target="_blank"
|
||||||
|
style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;"
|
||||||
|
>
|
||||||
|
<%= gettext("Login or create account") %>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="height:20px;"> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="font-size: 0.8em; color: #6C6C6C">
|
||||||
|
<p class="sub">
|
||||||
|
<%= gettext(
|
||||||
|
"If you’re having trouble with the button above, copy and paste the URL below into your web browser"
|
||||||
|
) %>.
|
||||||
|
</p>
|
||||||
|
<p class="sub"><%= @url %></p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="height:40px;"> </td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="height:20px;"> </td>
|
||||||
|
</tr>
|
||||||
58
lib/claper_web/templates/user_reset_password/edit.html.heex
Normal file
58
lib/claper_web/templates/user_reset_password/edit.html.heex
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<div>
|
||||||
|
<div class="relative min-h-screen bg-black">
|
||||||
|
<div class="flex justify-center md:items-center h-screen w-full p-8 md:p-10 lg:p-14 sm:rounded-lg md:rounded-none ">
|
||||||
|
<div class="max-w-xl w-full space-y-4 mx-auto">
|
||||||
|
<div class="text-center">
|
||||||
|
<h2 class="mt-6 font-bold text-gray-100">
|
||||||
|
<a href="/">
|
||||||
|
<img src="/images/logo.svg" class="h-10 w-auto inline" />
|
||||||
|
</a>
|
||||||
|
</h2>
|
||||||
|
<h2 class="mt-6 text-3xl font-bold text-gray-100">
|
||||||
|
<%= gettext("Reset your password") %>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<.form
|
||||||
|
:let={f}
|
||||||
|
for={@changeset}
|
||||||
|
action={Routes.user_reset_password_path(@conn, :update, @token)}
|
||||||
|
method="post"
|
||||||
|
class="mt-8 space-y-6"
|
||||||
|
>
|
||||||
|
<%= if @changeset.action do %>
|
||||||
|
<ClaperWeb.Component.Alert.error
|
||||||
|
message={gettext("Oops, check that all fields are filled in correctly.")}
|
||||||
|
stick={true}
|
||||||
|
/>
|
||||||
|
<% end %>
|
||||||
|
<ClaperWeb.Component.Input.password
|
||||||
|
form={f}
|
||||||
|
key={:password}
|
||||||
|
labelClass="text-white"
|
||||||
|
fieldClass="bg-gray-700 text-white"
|
||||||
|
name={gettext("Password")}
|
||||||
|
required="true"
|
||||||
|
/>
|
||||||
|
<ClaperWeb.Component.Input.password
|
||||||
|
form={f}
|
||||||
|
key={:password_confirmation}
|
||||||
|
labelClass="text-white"
|
||||||
|
fieldClass="bg-gray-700 text-white"
|
||||||
|
name={gettext("Password confirmation")}
|
||||||
|
required="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
|
||||||
|
>
|
||||||
|
<%= gettext("Confirm new password") %>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</.form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
48
lib/claper_web/templates/user_reset_password/new.html.heex
Normal file
48
lib/claper_web/templates/user_reset_password/new.html.heex
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<div>
|
||||||
|
<div class="relative min-h-screen bg-black">
|
||||||
|
<div class="flex justify-center md:items-center h-screen w-full p-8 md:p-10 lg:p-14 sm:rounded-lg md:rounded-none ">
|
||||||
|
<div class="max-w-xl w-full space-y-4 mx-auto">
|
||||||
|
<div class="text-center">
|
||||||
|
<h2 class="mt-6 font-bold text-gray-100">
|
||||||
|
<a href="/">
|
||||||
|
<img src="/images/logo.svg" class="h-10 w-auto inline" />
|
||||||
|
</a>
|
||||||
|
</h2>
|
||||||
|
<h2 class="mt-6 text-3xl font-bold text-gray-100">
|
||||||
|
<%= gettext("Reset your password") %>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<.form
|
||||||
|
:let={f}
|
||||||
|
for={@changeset}
|
||||||
|
action={Routes.user_reset_password_path(@conn, :create)}
|
||||||
|
class="mt-8 space-y-6"
|
||||||
|
>
|
||||||
|
<%= if @changeset.action do %>
|
||||||
|
<ClaperWeb.Component.Alert.error
|
||||||
|
message={gettext("Oops, check that all fields are filled in correctly.")}
|
||||||
|
stick={true}
|
||||||
|
/>
|
||||||
|
<% end %>
|
||||||
|
<ClaperWeb.Component.Input.email
|
||||||
|
form={f}
|
||||||
|
key={:email}
|
||||||
|
labelClass="text-white"
|
||||||
|
fieldClass="bg-gray-700 text-white"
|
||||||
|
name={gettext("Email")}
|
||||||
|
required="true"
|
||||||
|
/>
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
|
||||||
|
>
|
||||||
|
<%= gettext("Send link to reset password") %>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</.form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -68,7 +68,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<div class="mt-4 text-center">
|
<div class="mt-4 text-center flex gap-x-2 justify-center">
|
||||||
|
<%= link(gettext("Forgot your password?"),
|
||||||
|
to: Routes.user_reset_password_path(@conn, :new),
|
||||||
|
class: "text-white text-sm text-center"
|
||||||
|
) %>
|
||||||
<%= if Application.get_env(:claper, :enable_account_creation) do %>
|
<%= if Application.get_env(:claper, :enable_account_creation) do %>
|
||||||
<%= link(gettext("Create account"),
|
<%= link(gettext("Create account"),
|
||||||
to: Routes.user_registration_path(@conn, :new),
|
to: Routes.user_registration_path(@conn, :new),
|
||||||
|
|||||||
@@ -37,6 +37,39 @@ defmodule ClaperWeb.Component.Input do
|
|||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def textarea(assigns) do
|
||||||
|
assigns =
|
||||||
|
assigns
|
||||||
|
|> assign_new(:required, fn -> false end)
|
||||||
|
|> assign_new(:autofocus, fn -> false end)
|
||||||
|
|> assign_new(:placeholder, fn -> false end)
|
||||||
|
|> assign_new(:readonly, fn -> false end)
|
||||||
|
|> assign_new(:labelClass, fn -> "text-gray-700" end)
|
||||||
|
|> assign_new(:fieldClass, fn -> "bg-white" end)
|
||||||
|
|> assign_new(:value, fn -> input_value(assigns.form, assigns.key) end)
|
||||||
|
|
||||||
|
~H"""
|
||||||
|
<div class="relative">
|
||||||
|
<%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %>
|
||||||
|
<div class="mt-1">
|
||||||
|
<%= text_input(@form, @key,
|
||||||
|
required: @required,
|
||||||
|
readonly: @readonly,
|
||||||
|
autofocus: @autofocus,
|
||||||
|
placeholder: @placeholder,
|
||||||
|
autocomplete: @key,
|
||||||
|
value: @value,
|
||||||
|
class:
|
||||||
|
"#{@fieldClass} read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-4 px-3"
|
||||||
|
) %>
|
||||||
|
</div>
|
||||||
|
<%= if Keyword.has_key?(@form.errors, @key) do %>
|
||||||
|
<p class="text-supporting-red-500 text-sm"><%= error_tag(@form, @key) %></p>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
def select(assigns) do
|
def select(assigns) do
|
||||||
assigns =
|
assigns =
|
||||||
assigns
|
assigns
|
||||||
@@ -70,6 +103,7 @@ defmodule ClaperWeb.Component.Input do
|
|||||||
assigns =
|
assigns =
|
||||||
assigns
|
assigns
|
||||||
|> assign_new(:disabled, fn -> false end)
|
|> assign_new(:disabled, fn -> false end)
|
||||||
|
|> assign_new(:shortcut, fn -> nil end)
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<!-- Enabled: "bg-indigo-600", Not Enabled: "bg-gray-200" -->
|
<!-- Enabled: "bg-indigo-600", Not Enabled: "bg-gray-200" -->
|
||||||
@@ -82,6 +116,8 @@ defmodule ClaperWeb.Component.Input do
|
|||||||
class={"#{if @checked, do: 'bg-primary-600', else: 'bg-gray-200'} relative inline-flex flex-shrink-0 h-8 w-14 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200"}
|
class={"#{if @checked, do: 'bg-primary-600', else: 'bg-gray-200'} relative inline-flex flex-shrink-0 h-8 w-14 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200"}
|
||||||
role="switch"
|
role="switch"
|
||||||
aria-checked="false"
|
aria-checked="false"
|
||||||
|
phx-key={@shortcut}
|
||||||
|
phx-window-keydown={if @shortcut && not @disabled, do: checked(@checked, @key)}
|
||||||
>
|
>
|
||||||
<!-- Enabled: "translate-x-5", Not Enabled: "translate-x-0" -->
|
<!-- Enabled: "translate-x-5", Not Enabled: "translate-x-0" -->
|
||||||
<span class={"#{if @checked, do: 'translate-x-6', else: 'translate-x-0'} pointer-events-none relative inline-block h-7 w-7 rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200"}>
|
<span class={"#{if @checked, do: 'translate-x-6', else: 'translate-x-0'} pointer-events-none relative inline-block h-7 w-7 rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200"}>
|
||||||
|
|||||||
5
lib/claper_web/views/leader_notifier_view.ex
Normal file
5
lib/claper_web/views/leader_notifier_view.ex
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
defmodule ClaperWeb.LeaderNotifierView do
|
||||||
|
use Phoenix.View, root: "lib/claper_web/templates"
|
||||||
|
import ClaperWeb.Gettext
|
||||||
|
use Phoenix.HTML
|
||||||
|
end
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
defmodule ClaperWeb.UserResetPasswordView do
|
defmodule ClaperWeb.UserResetPasswordView do
|
||||||
|
import Phoenix.Component
|
||||||
use ClaperWeb, :view
|
use ClaperWeb, :view
|
||||||
end
|
end
|
||||||
|
|||||||
8
mix.exs
8
mix.exs
@@ -1,7 +1,7 @@
|
|||||||
defmodule Claper.MixProject do
|
defmodule Claper.MixProject do
|
||||||
use Mix.Project
|
use Mix.Project
|
||||||
|
|
||||||
@version "1.6.0"
|
@version "1.7.0"
|
||||||
|
|
||||||
def project do
|
def project do
|
||||||
[
|
[
|
||||||
@@ -16,7 +16,7 @@ defmodule Claper.MixProject do
|
|||||||
# Docs
|
# Docs
|
||||||
name: "Claper",
|
name: "Claper",
|
||||||
source_url: "https://github.com/ClaperCo/Claper",
|
source_url: "https://github.com/ClaperCo/Claper",
|
||||||
homepage_url: "https://get.claper.co",
|
homepage_url: "https://claper.co",
|
||||||
docs: [
|
docs: [
|
||||||
main: "overview",
|
main: "overview",
|
||||||
assets: "guides/assets",
|
assets: "guides/assets",
|
||||||
@@ -102,8 +102,8 @@ defmodule Claper.MixProject do
|
|||||||
{:phoenix_live_dashboard, "~> 0.7"},
|
{:phoenix_live_dashboard, "~> 0.7"},
|
||||||
{:esbuild, "~> 0.2", runtime: Mix.env() == :dev},
|
{:esbuild, "~> 0.2", runtime: Mix.env() == :dev},
|
||||||
{:dart_sass, "~> 0.5", runtime: Mix.env() == :dev},
|
{:dart_sass, "~> 0.5", runtime: Mix.env() == :dev},
|
||||||
{:swoosh, "~> 1.3"},
|
{:swoosh, "~> 1.12"},
|
||||||
{:finch, "~> 0.8"},
|
{:finch, "~> 0.16"},
|
||||||
{:telemetry_metrics, "~> 0.6"},
|
{:telemetry_metrics, "~> 0.6"},
|
||||||
{:telemetry_poller, "~> 1.0"},
|
{:telemetry_poller, "~> 1.0"},
|
||||||
{:gettext, "~> 0.18"},
|
{:gettext, "~> 0.18"},
|
||||||
|
|||||||
30
mix.lock
30
mix.lock
@@ -1,24 +1,24 @@
|
|||||||
%{
|
%{
|
||||||
"bcrypt_elixir": {:hex, :bcrypt_elixir, "2.3.1", "5114d780459a04f2b4aeef52307de23de961b69e13a5cd98a911e39fda13f420", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "42182d5f46764def15bf9af83739e3bf4ad22661b1c34fc3e88558efced07279"},
|
"bcrypt_elixir": {:hex, :bcrypt_elixir, "2.3.1", "5114d780459a04f2b4aeef52307de23de961b69e13a5cd98a911e39fda13f420", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "42182d5f46764def15bf9af83739e3bf4ad22661b1c34fc3e88558efced07279"},
|
||||||
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
|
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
|
||||||
"castore": {:hex, :castore, "1.0.1", "240b9edb4e9e94f8f56ab39d8d2d0a57f49e46c56aced8f873892df8ff64ff5a", [:mix], [], "hexpm", "b4951de93c224d44fac71614beabd88b71932d0b1dea80d2f80fb9044e01bbb3"},
|
"castore": {:hex, :castore, "1.0.4", "ff4d0fb2e6411c0479b1d965a814ea6d00e51eb2f58697446e9c41a97d940b28", [:mix], [], "hexpm", "9418c1b8144e11656f0be99943db4caf04612e3eaecefb5dae9a2a87565584f8"},
|
||||||
"certifi": {:hex, :certifi, "2.9.0", "6f2a475689dd47f19fb74334859d460a2dc4e3252a3324bd2111b8f0429e7e21", [:rebar3], [], "hexpm", "266da46bdb06d6c6d35fde799bcb28d36d985d424ad7c08b5bb48f5b5cdd4641"},
|
"certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"},
|
||||||
"comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
|
"comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
|
||||||
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
|
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
|
||||||
"cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
|
"cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"},
|
||||||
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
|
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
|
||||||
"cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
|
"cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"},
|
||||||
"credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"},
|
"credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"},
|
||||||
"csv": {:hex, :csv, "3.0.5", "3c1455127e92de8845806db89554ad7d45e0212974be41dd9c38a5c881861713", [:mix], [], "hexpm", "cbbe5455c93df5f3f2943e995e28b7a8808361ba34cf3e44267d77a01eaf1609"},
|
"csv": {:hex, :csv, "3.0.5", "3c1455127e92de8845806db89554ad7d45e0212974be41dd9c38a5c881861713", [:mix], [], "hexpm", "cbbe5455c93df5f3f2943e995e28b7a8808361ba34cf3e44267d77a01eaf1609"},
|
||||||
"dart_sass": {:hex, :dart_sass, "0.6.0", "1fe560c3ed5c577b6b9cf97134a0e05c82b69645d313b1ef0ffb4d659c3d0300", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "41f7bb065b5c30c3ea05e8b41aa3f9b5c62817079b94f70e2a22d133828475bb"},
|
"dart_sass": {:hex, :dart_sass, "0.6.0", "1fe560c3ed5c577b6b9cf97134a0e05c82b69645d313b1ef0ffb4d659c3d0300", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "41f7bb065b5c30c3ea05e8b41aa3f9b5c62817079b94f70e2a22d133828475bb"},
|
||||||
"db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"},
|
"db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"},
|
||||||
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
|
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
|
||||||
"earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"},
|
"earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"},
|
||||||
"ecto": {:hex, :ecto, "3.10.1", "c6757101880e90acc6125b095853176a02da8f1afe056f91f1f90b80c9389822", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d2ac4255f1601bdf7ac74c0ed971102c6829dc158719b94bd30041bbad77f87a"},
|
"ecto": {:hex, :ecto, "3.10.1", "c6757101880e90acc6125b095853176a02da8f1afe056f91f1f90b80c9389822", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d2ac4255f1601bdf7ac74c0ed971102c6829dc158719b94bd30041bbad77f87a"},
|
||||||
"ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"},
|
"ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"},
|
||||||
"elixir_make": {:hex, :elixir_make, "0.7.6", "67716309dc5d43e16b5abbd00c01b8df6a0c2ab54a8f595468035a50189f9169", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5a0569756b0f7873a77687800c164cca6dfc03a09418e6fcf853d78991f49940"},
|
"elixir_make": {:hex, :elixir_make, "0.7.6", "67716309dc5d43e16b5abbd00c01b8df6a0c2ab54a8f595468035a50189f9169", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5a0569756b0f7873a77687800c164cca6dfc03a09418e6fcf853d78991f49940"},
|
||||||
"esbuild": {:hex, :esbuild, "0.7.0", "ce3afb13cd2c5fd63e13c0e2d0e0831487a97a7696cfa563707342bb825d122a", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "4ae9f4f237c5ebcb001390b8ada65a12fb2bb04f3fe3d1f1692b7a06fbfe8752"},
|
"esbuild": {:hex, :esbuild, "0.7.0", "ce3afb13cd2c5fd63e13c0e2d0e0831487a97a7696cfa563707342bb825d122a", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "4ae9f4f237c5ebcb001390b8ada65a12fb2bb04f3fe3d1f1692b7a06fbfe8752"},
|
||||||
"ex_aws": {:hex, :ex_aws, "2.4.2", "d2686c34b69287cc8dd7629e70131aec05fef3cd3eae13698c9422933f7bc9ee", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0a2c07bd1541b0bef315f67e050d3cb9f947ab1a281896a8c35e3ee4976889f6"},
|
"ex_aws": {:hex, :ex_aws, "2.5.0", "1785e69350b16514c1049330537c7da10039b1a53e1d253bbd703b135174aec3", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "971b86e5495fc0ae1c318e35e23f389e74cf322f2c02d34037c6fc6d405006f1"},
|
||||||
"ex_aws_s3": {:hex, :ex_aws_s3, "2.4.0", "ce8decb6b523381812798396bc0e3aaa62282e1b40520125d1f4eff4abdff0f4", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "85dda6e27754d94582869d39cba3241d9ea60b6aa4167f9c88e309dc687e56bb"},
|
"ex_aws_s3": {:hex, :ex_aws_s3, "2.4.0", "ce8decb6b523381812798396bc0e3aaa62282e1b40520125d1f4eff4abdff0f4", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "85dda6e27754d94582869d39cba3241d9ea60b6aa4167f9c88e309dc687e56bb"},
|
||||||
"ex_doc": {:hex, :ex_doc, "0.29.4", "6257ecbb20c7396b1fe5accd55b7b0d23f44b6aa18017b415cb4c2b91d997729", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2c6699a737ae46cb61e4ed012af931b57b699643b24dabe2400a8168414bc4f5"},
|
"ex_doc": {:hex, :ex_doc, "0.29.4", "6257ecbb20c7396b1fe5accd55b7b0d23f44b6aa18017b415cb4c2b91d997729", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2c6699a737ae46cb61e4ed012af931b57b699643b24dabe2400a8168414bc4f5"},
|
||||||
"expo": {:hex, :expo, "0.4.1", "1c61d18a5df197dfda38861673d392e642649a9cef7694d2f97a587b2cfb319b", [:mix], [], "hexpm", "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47"},
|
"expo": {:hex, :expo, "0.4.1", "1c61d18a5df197dfda38861673d392e642649a9cef7694d2f97a587b2cfb319b", [:mix], [], "hexpm", "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47"},
|
||||||
@@ -27,26 +27,26 @@
|
|||||||
"floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"},
|
"floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"},
|
||||||
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
|
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
|
||||||
"gettext": {:hex, :gettext, "0.22.3", "c8273e78db4a0bb6fba7e9f0fd881112f349a3117f7f7c598fa18c66c888e524", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "935f23447713954a6866f1bb28c3a878c4c011e802bcd68a726f5e558e4b64bd"},
|
"gettext": {:hex, :gettext, "0.22.3", "c8273e78db4a0bb6fba7e9f0fd881112f349a3117f7f7c598fa18c66c888e524", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "935f23447713954a6866f1bb28c3a878c4c011e802bcd68a726f5e558e4b64bd"},
|
||||||
"hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~>2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"},
|
"hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~>2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"},
|
||||||
"hashids": {:hex, :hashids, "2.1.0", "aabbcc4f9fa0b460cc6ef629f5bcbc35e7e87b382fee79f9c50be40b86574288", [:mix], [], "hexpm", "172163b1642d415881ef1c6e1f1be12d4e92b0711d5bbbd8854f82a1ce32d60b"},
|
"hashids": {:hex, :hashids, "2.1.0", "aabbcc4f9fa0b460cc6ef629f5bcbc35e7e87b382fee79f9c50be40b86574288", [:mix], [], "hexpm", "172163b1642d415881ef1c6e1f1be12d4e92b0711d5bbbd8854f82a1ce32d60b"},
|
||||||
"honeybadger": {:hex, :honeybadger, "0.18.1", "f61f71147d9e6ce8cdc6114e5df5eed4d2daa32dd15308267a1dacf5fa88b1e9", [:mix], [{:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:hackney, "~> 1.1", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.0.0 and < 2.0.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:plug, ">= 1.0.0 and < 2.0.0", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "693e14b1b7d254dd75f977240c208d6b69cc1cbdd515bdd5b8b1738a1baf5fd5"},
|
"honeybadger": {:hex, :honeybadger, "0.18.1", "f61f71147d9e6ce8cdc6114e5df5eed4d2daa32dd15308267a1dacf5fa88b1e9", [:mix], [{:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:hackney, "~> 1.1", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.0.0 and < 2.0.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:plug, ">= 1.0.0 and < 2.0.0", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "693e14b1b7d254dd75f977240c208d6b69cc1cbdd515bdd5b8b1738a1baf5fd5"},
|
||||||
"hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
|
"hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
|
||||||
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
|
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
|
||||||
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
|
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
|
||||||
"jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"},
|
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
|
||||||
"libcluster": {:hex, :libcluster, "3.3.2", "84c6ebfdc72a03805955abfb5ff573f71921a3e299279cc3445445d5af619ad1", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8b691ce8185670fc8f3fc0b7ed59eff66c6889df890d13411f8f1a0e6871d8a5"},
|
"libcluster": {:hex, :libcluster, "3.3.2", "84c6ebfdc72a03805955abfb5ff573f71921a3e299279cc3445445d5af619ad1", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8b691ce8185670fc8f3fc0b7ed59eff66c6889df890d13411f8f1a0e6871d8a5"},
|
||||||
"makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
|
"makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
|
||||||
"makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
|
"makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
|
||||||
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
|
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
|
||||||
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
|
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
|
||||||
"mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"},
|
"mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"},
|
||||||
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
|
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
|
||||||
"mint": {:hex, :mint, "1.5.1", "8db5239e56738552d85af398798c80648db0e90f343c8469f6c6d8898944fb6f", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "4a63e1e76a7c3956abd2c72f370a0d0aecddc3976dea5c27eccbecfa5e7d5b1e"},
|
"mint": {:hex, :mint, "1.5.1", "8db5239e56738552d85af398798c80648db0e90f343c8469f6c6d8898944fb6f", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "4a63e1e76a7c3956abd2c72f370a0d0aecddc3976dea5c27eccbecfa5e7d5b1e"},
|
||||||
"mogrify": {:hex, :mogrify, "0.9.2", "b360984adea7dd6a55f18028e6327973c58de7f548fdb86c9859848aa904d5b0", [:mix], [], "hexpm", "c18d10fd70ca20e2585301616c89f6e4f7159d92efc9cc8ee579e00c886f699d"},
|
"mogrify": {:hex, :mogrify, "0.9.2", "b360984adea7dd6a55f18028e6327973c58de7f548fdb86c9859848aa904d5b0", [:mix], [], "hexpm", "c18d10fd70ca20e2585301616c89f6e4f7159d92efc9cc8ee579e00c886f699d"},
|
||||||
"nimble_options": {:hex, :nimble_options, "1.0.1", "b448018287b22584e91b5fd9c6c0ad717cb4bcdaa457957c8d57770f56625c43", [:mix], [], "hexpm", "078b2927cd9f84555be6386d56e849b0c555025ecccf7afee00ab6a9e6f63837"},
|
"nimble_options": {:hex, :nimble_options, "1.0.2", "92098a74df0072ff37d0c12ace58574d26880e522c22801437151a159392270e", [:mix], [], "hexpm", "fd12a8db2021036ce12a309f26f564ec367373265b53e25403f0ee697380f1b8"},
|
||||||
"nimble_parsec": {:hex, :nimble_parsec, "1.3.0", "9e18a119d9efc3370a3ef2a937bf0b24c088d9c4bf0ba9d7c3751d49d347d035", [:mix], [], "hexpm", "7977f183127a7cbe9346981e2f480dc04c55ffddaef746bd58debd566070eef8"},
|
"nimble_parsec": {:hex, :nimble_parsec, "1.3.0", "9e18a119d9efc3370a3ef2a937bf0b24c088d9c4bf0ba9d7c3751d49d347d035", [:mix], [], "hexpm", "7977f183127a7cbe9346981e2f480dc04c55ffddaef746bd58debd566070eef8"},
|
||||||
"nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"},
|
"nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"},
|
||||||
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
|
"parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"},
|
||||||
"phoenix": {:hex, :phoenix, "1.7.2", "c375ffb482beb4e3d20894f84dd7920442884f5f5b70b9f4528cbe0cedefec63", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.4", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "1ebca94b32b4d0e097ab2444a9742ed8ff3361acad17365e4e6b2e79b4792159"},
|
"phoenix": {:hex, :phoenix, "1.7.2", "c375ffb482beb4e3d20894f84dd7920442884f5f5b70b9f4528cbe0cedefec63", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.4", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "1ebca94b32b4d0e097ab2444a9742ed8ff3361acad17365e4e6b2e79b4792159"},
|
||||||
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
|
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
|
||||||
"phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
|
"phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
|
||||||
@@ -57,16 +57,16 @@
|
|||||||
"phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.0", "a544d83fde4a767efb78f45404a74c9e37b2a9c5ea3339692e65a6966731f935", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "e88d117251e89a16b92222415a6d87b99a96747ddf674fc5c7631de734811dba"},
|
"phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.0", "a544d83fde4a767efb78f45404a74c9e37b2a9c5ea3339692e65a6966731f935", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "e88d117251e89a16b92222415a6d87b99a96747ddf674fc5c7631de734811dba"},
|
||||||
"phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
|
"phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
|
||||||
"phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
|
"phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
|
||||||
"plug": {:hex, :plug, "1.14.2", "cff7d4ec45b4ae176a227acd94a7ab536d9b37b942c8e8fa6dfc0fff98ff4d80", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "842fc50187e13cf4ac3b253d47d9474ed6c296a8732752835ce4a86acdf68d13"},
|
"plug": {:hex, :plug, "1.15.1", "b7efd81c1a1286f13efb3f769de343236bd8b7d23b4a9f40d3002fc39ad8f74c", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "459497bd94d041d98d948054ec6c0b76feacd28eec38b219ca04c0de13c79d30"},
|
||||||
"plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"},
|
"plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"},
|
||||||
"plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
|
"plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
|
||||||
"porcelain": {:hex, :porcelain, "2.0.3", "2d77b17d1f21fed875b8c5ecba72a01533db2013bd2e5e62c6d286c029150fdc", [:mix], [], "hexpm", "dc996ab8fadbc09912c787c7ab8673065e50ea1a6245177b0c24569013d23620"},
|
"porcelain": {:hex, :porcelain, "2.0.3", "2d77b17d1f21fed875b8c5ecba72a01533db2013bd2e5e62c6d286c029150fdc", [:mix], [], "hexpm", "dc996ab8fadbc09912c787c7ab8673065e50ea1a6245177b0c24569013d23620"},
|
||||||
"postgrex": {:hex, :postgrex, "0.17.1", "01c29fd1205940ee55f7addb8f1dc25618ca63a8817e56fac4f6846fc2cddcbe", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "14b057b488e73be2beee508fb1955d8db90d6485c6466428fe9ccf1d6692a555"},
|
"postgrex": {:hex, :postgrex, "0.17.1", "01c29fd1205940ee55f7addb8f1dc25618ca63a8817e56fac4f6846fc2cddcbe", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "14b057b488e73be2beee508fb1955d8db90d6485c6466428fe9ccf1d6692a555"},
|
||||||
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
|
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
|
||||||
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
|
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
|
||||||
"stripity_stripe": {:hex, :stripity_stripe, "2.13.0", "b9ea806fcf46e85232b75f2145c34770b17faa44c59cdd13ff493aaa6e84b4a9", [:mix], [{:hackney, "~> 1.15", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}, {:uri_query, "~> 0.1.2", [hex: :uri_query, repo: "hexpm", optional: false]}], "hexpm", "d6931ed9816552320f95428fd997edf15e99a913ca78fc4342d5516b98f42476"},
|
"stripity_stripe": {:hex, :stripity_stripe, "2.13.0", "b9ea806fcf46e85232b75f2145c34770b17faa44c59cdd13ff493aaa6e84b4a9", [:mix], [{:hackney, "~> 1.15", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}, {:uri_query, "~> 0.1.2", [hex: :uri_query, repo: "hexpm", optional: false]}], "hexpm", "d6931ed9816552320f95428fd997edf15e99a913ca78fc4342d5516b98f42476"},
|
||||||
"sweet_xml": {:hex, :sweet_xml, "0.7.3", "debb256781c75ff6a8c5cbf7981146312b66f044a2898f453709a53e5031b45b", [:mix], [], "hexpm", "e110c867a1b3fe74bfc7dd9893aa851f0eed5518d0d7cad76d7baafd30e4f5ba"},
|
"sweet_xml": {:hex, :sweet_xml, "0.7.4", "a8b7e1ce7ecd775c7e8a65d501bc2cd933bff3a9c41ab763f5105688ef485d08", [:mix], [], "hexpm", "e7c4b0bdbf460c928234951def54fe87edf1a170f6896675443279e2dbeba167"},
|
||||||
"swoosh": {:hex, :swoosh, "1.9.1", "0a5d7bf9954eb41d7e55525bc0940379982b090abbaef67cd8e1fd2ed7f8ca1a", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "76dffff3ffcab80f249d5937a592eaef7cc49ac6f4cdd27e622868326ed6371e"},
|
"swoosh": {:hex, :swoosh, "1.12.0", "ecc85ee12947932986243299b8d28e6cdfc192c8d9e24c4c64f6738efdf344cb", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "87db7ab0f35e358ba5eac3afc7422ed0c8c168a2d219d2a83ad8cb7a424f6cc9"},
|
||||||
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
|
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
|
||||||
"telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"},
|
"telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"},
|
||||||
"telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
|
"telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
|
||||||
|
|||||||
@@ -15,10 +15,11 @@ msgstr ""
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Einstellungen"
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:457
|
#: lib/claper_web/live/event_live/manage.ex:650
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:37
|
#: lib/claper_web/live/form_live/form_component.html.heex:37
|
||||||
#: lib/claper_web/live/user_settings_live/show.html.heex:34
|
#: lib/claper_web/live/user_settings_live/show.html.heex:34
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:34
|
#: lib/claper_web/templates/user_registration/new.html.heex:34
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:33
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:47
|
#: lib/claper_web/templates/user_session/new.html.heex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
@@ -30,6 +31,8 @@ msgid "Join the Claper experience"
|
|||||||
msgstr "Werden Sie Teil der Claper Erfahrung"
|
msgstr "Werden Sie Teil der Claper Erfahrung"
|
||||||
|
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:24
|
#: lib/claper_web/templates/user_registration/new.html.heex:24
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:25
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:24
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Oops, check that all fields are filled in correctly."
|
msgid "Oops, check that all fields are filled in correctly."
|
||||||
msgstr "Überprüfen Sie, ob alle Felder korrekt ausgefüllt sind."
|
msgstr "Überprüfen Sie, ob alle Felder korrekt ausgefüllt sind."
|
||||||
@@ -75,22 +78,22 @@ msgstr "Wir haben Ihnen eine E-Mail geschickt an"
|
|||||||
msgid "Your personal informations only visible by you"
|
msgid "Your personal informations only visible by you"
|
||||||
msgstr "Ihre persönlichen Informationen sind nur für Sie sichtbar"
|
msgstr "Ihre persönlichen Informationen sind nur für Sie sichtbar"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:387
|
#: lib/claper_web/live/event_live/show.html.heex:405
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "days"
|
msgid "days"
|
||||||
msgstr "Tage"
|
msgstr "Tage"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:393
|
#: lib/claper_web/live/event_live/show.html.heex:411
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "hours"
|
msgid "hours"
|
||||||
msgstr "Stunden"
|
msgstr "Stunden"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:399
|
#: lib/claper_web/live/event_live/show.html.heex:417
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "minutes"
|
msgid "minutes"
|
||||||
msgstr "Minuten"
|
msgstr "Minuten"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:118
|
#: lib/claper_web/live/event_live/show.html.heex:136
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Be the first to react !"
|
msgid "Be the first to react !"
|
||||||
msgstr "Seien Sie der Erste, der reagiert!"
|
msgstr "Seien Sie der Erste, der reagiert!"
|
||||||
@@ -98,7 +101,7 @@ msgstr "Seien Sie der Erste, der reagiert!"
|
|||||||
#: lib/claper_web/live/event_live/event_card_component.ex:98
|
#: lib/claper_web/live/event_live/event_card_component.ex:98
|
||||||
#: lib/claper_web/live/event_live/join.ex:42
|
#: lib/claper_web/live/event_live/join.ex:42
|
||||||
#: lib/claper_web/live/event_live/join.html.heex:106
|
#: lib/claper_web/live/event_live/join.html.heex:106
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:239
|
#: lib/claper_web/live/event_live/show.html.heex:257
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Join"
|
msgid "Join"
|
||||||
msgstr "Teilnehmen"
|
msgstr "Teilnehmen"
|
||||||
@@ -111,12 +114,12 @@ msgid "Dashboard"
|
|||||||
msgstr "Dashboard"
|
msgstr "Dashboard"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:33
|
#: lib/claper_web/live/event_live/post_component.ex:33
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:86
|
#: lib/claper_web/live/event_live/post_component.ex:112
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Host"
|
msgid "Host"
|
||||||
msgstr "Host"
|
msgstr "Host"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:405
|
#: lib/claper_web/live/event_live/show.html.heex:423
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "seconds"
|
msgid "seconds"
|
||||||
msgstr "Sekunden"
|
msgstr "Sekunden"
|
||||||
@@ -127,7 +130,7 @@ msgid "Create your first presentation"
|
|||||||
msgstr "Erstellen Sie Ihre erste Präsentation"
|
msgstr "Erstellen Sie Ihre erste Präsentation"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:50
|
#: lib/claper_web/live/event_live/event_card_component.ex:50
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:80
|
#: lib/claper_web/live/event_live/manage.html.heex:81
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Finish on"
|
msgid "Finish on"
|
||||||
msgstr "Endet um"
|
msgstr "Endet um"
|
||||||
@@ -167,8 +170,8 @@ msgstr "Meine Präsentationen"
|
|||||||
msgid "Name of your presentation"
|
msgid "Name of your presentation"
|
||||||
msgstr "Name Ihrer Präsentation"
|
msgstr "Name Ihrer Präsentation"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/presenter.html.heex:21
|
#: lib/claper_web/live/event_live/presenter.html.heex:26
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:414
|
#: lib/claper_web/live/event_live/show.html.heex:432
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Scan to interact in real-time"
|
msgid "Scan to interact in real-time"
|
||||||
msgstr "Scannen und in Echtzeit interagieren"
|
msgstr "Scannen und in Echtzeit interagieren"
|
||||||
@@ -178,7 +181,7 @@ msgstr "Scannen und in Echtzeit interagieren"
|
|||||||
msgid "Starting on"
|
msgid "Starting on"
|
||||||
msgstr "Startet um"
|
msgstr "Startet um"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:196
|
#: lib/claper_web/live/event_live/event_form_component.ex:206
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated successfully"
|
msgid "Updated successfully"
|
||||||
msgstr "Erfolgreich aktualisiert"
|
msgstr "Erfolgreich aktualisiert"
|
||||||
@@ -205,12 +208,12 @@ msgstr "Es ist an der Zeit, Ihren Präsentationen mehr Bedeutung zu verleihen."
|
|||||||
msgid "Return to home"
|
msgid "Return to home"
|
||||||
msgstr "Zurück zur Startseite"
|
msgstr "Zurück zur Startseite"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:178
|
#: lib/claper_web/live/event_live/event_form_component.ex:186
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Created successfully"
|
msgid "Created successfully"
|
||||||
msgstr "Erfolgreich erstellt"
|
msgstr "Erfolgreich erstellt"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:23
|
#: lib/claper_web/live/event_live/manage.ex:24
|
||||||
#: lib/claper_web/live/event_live/presenter.ex:21
|
#: lib/claper_web/live/event_live/presenter.ex:21
|
||||||
#: lib/claper_web/live/event_live/show.ex:24
|
#: lib/claper_web/live/event_live/show.ex:24
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -219,12 +222,13 @@ msgstr "Präsentation existiert nicht"
|
|||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:109
|
#: lib/claper_web/live/event_live/event_card_component.ex:109
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:129
|
#: lib/claper_web/live/event_live/event_card_component.ex:129
|
||||||
#: lib/claper_web/live/event_live/form_component.ex:96
|
#: lib/claper_web/live/event_live/form_component.ex:97
|
||||||
#: lib/claper_web/live/event_live/index.ex:65
|
#: lib/claper_web/live/event_live/index.ex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Ändern"
|
msgstr "Ändern"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:51
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:18
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:18
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:25
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:25
|
||||||
#: lib/claper_web/live/event_live/index.ex:71
|
#: lib/claper_web/live/event_live/index.ex:71
|
||||||
@@ -235,18 +239,21 @@ msgstr "Ändern"
|
|||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Erstellen"
|
msgstr "Erstellen"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:56
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:171
|
#: lib/claper_web/live/event_live/event_card_component.ex:171
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:30
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:30
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:631
|
#: lib/claper_web/live/event_live/manage.html.heex:835
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:731
|
#: lib/claper_web/live/event_live/manage.html.heex:1010
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:44
|
#: lib/claper_web/live/event_live/manage.html.heex:1125
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:116
|
#: lib/claper_web/live/event_live/post_component.ex:70
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:142
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:103
|
#: lib/claper_web/live/form_live/form_component.html.heex:103
|
||||||
#: lib/claper_web/live/poll_live/form_component.html.heex:99
|
#: lib/claper_web/live/poll_live/form_component.html.heex:99
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Löschen"
|
msgstr "Löschen"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:52
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:17
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:17
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:24
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:24
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:99
|
#: lib/claper_web/live/form_live/form_component.html.heex:99
|
||||||
@@ -310,8 +317,8 @@ msgid "You can log into your account by clicking here."
|
|||||||
msgstr "Sie können sich bei Ihrem Konto anmelden, indem Sie hier klicken."
|
msgstr "Sie können sich bei Ihrem Konto anmelden, indem Sie hier klicken."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:34
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:34
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:49
|
#: lib/claper_web/live/event_live/post_component.ex:75
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:121
|
#: lib/claper_web/live/event_live/post_component.ex:147
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Are you sure?"
|
msgid "Are you sure?"
|
||||||
msgstr "Sind Sie sicher?"
|
msgstr "Sind Sie sicher?"
|
||||||
@@ -350,12 +357,12 @@ msgstr "Datei hochladen"
|
|||||||
msgid "or drag and drop"
|
msgid "or drag and drop"
|
||||||
msgstr "oder drag and drop"
|
msgstr "oder drag and drop"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:229
|
#: lib/claper_web/live/event_live/event_form_component.ex:257
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You have selected an incorrect file type"
|
msgid "You have selected an incorrect file type"
|
||||||
msgstr "Sie haben einen falschen Dateityp ausgewählt"
|
msgstr "Sie haben einen falschen Dateityp ausgewählt"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:228
|
#: lib/claper_web/live/event_live/event_form_component.ex:256
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Your file is too large"
|
msgid "Your file is too large"
|
||||||
msgstr "Ihre Datei ist zu groß"
|
msgstr "Ihre Datei ist zu groß"
|
||||||
@@ -370,12 +377,12 @@ msgstr "Datei ändern"
|
|||||||
msgid "Presentation replaced"
|
msgid "Presentation replaced"
|
||||||
msgstr "Präsentation ersetzt"
|
msgstr "Präsentation ersetzt"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:256
|
#: lib/claper_web/live/event_live/manage.html.heex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit poll"
|
msgid "Edit poll"
|
||||||
msgstr "Umfrage bearbeiten"
|
msgstr "Umfrage bearbeiten"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:255
|
#: lib/claper_web/live/event_live/manage.html.heex:292
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "New poll"
|
msgid "New poll"
|
||||||
msgstr "Neue Umfrage"
|
msgstr "Neue Umfrage"
|
||||||
@@ -385,18 +392,18 @@ msgstr "Neue Umfrage"
|
|||||||
msgid "Title of your poll"
|
msgid "Title of your poll"
|
||||||
msgstr "Titel Ihrer Umfrage"
|
msgstr "Titel Ihrer Umfrage"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:230
|
#: lib/claper_web/live/event_live/event_form_component.ex:258
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload failed"
|
msgid "Upload failed"
|
||||||
msgstr "Hochladen fehlgeschlagen"
|
msgstr "Hochladen fehlgeschlagen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:176
|
#: lib/claper_web/live/event_live/manage.html.heex:180
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add poll to know opinion of your public."
|
msgid "Add poll to know opinion of your public."
|
||||||
msgstr "Fügen Sie eine Umfrage hinzu, um die Meinung Ihres Publikums zu erfahren."
|
msgstr "Fügen Sie eine Umfrage hinzu, um die Meinung Ihres Publikums zu erfahren."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:174
|
#: lib/claper_web/live/event_live/manage.html.heex:177
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:395
|
#: lib/claper_web/live/event_live/manage.html.heex:461
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Poll"
|
msgid "Poll"
|
||||||
msgstr "Umfrage"
|
msgstr "Umfrage"
|
||||||
@@ -418,8 +425,8 @@ msgstr "Aktuelle Umfrage"
|
|||||||
msgid "See current poll"
|
msgid "See current poll"
|
||||||
msgstr "Aktuelle Umfrage anzeigen"
|
msgstr "Aktuelle Umfrage anzeigen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/poll_component.ex:107
|
#: lib/claper_web/live/event_live/poll_component.ex:123
|
||||||
#: lib/claper_web/live/event_live/poll_component.ex:115
|
#: lib/claper_web/live/event_live/poll_component.ex:131
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Vote"
|
msgid "Vote"
|
||||||
msgstr "Abstimmen"
|
msgstr "Abstimmen"
|
||||||
@@ -440,8 +447,9 @@ msgstr "Benutzer Email-Adresse"
|
|||||||
msgid "Present/Customize"
|
msgid "Present/Customize"
|
||||||
msgstr "Vorstellen/Ändern"
|
msgstr "Vorstellen/Ändern"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:408
|
#: lib/claper_web/live/event_live/manage.html.heex:479
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:484
|
#: lib/claper_web/live/event_live/manage.html.heex:561
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:635
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr "Aktiv"
|
msgstr "Aktiv"
|
||||||
@@ -451,12 +459,12 @@ msgstr "Aktiv"
|
|||||||
msgid "Changing your file will remove all interaction elements like polls associated."
|
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."
|
msgstr "Wenn Sie Ihre Datei ändern, werden alle damit verbundenen Interaktionselemente wie Umfragen entfernt."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:584
|
#: lib/claper_web/live/event_live/manage.html.heex:752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages from attendees will appear here."
|
msgid "Messages from attendees will appear here."
|
||||||
msgstr "Nachrichten von Teilnehmern werden hier erscheinen."
|
msgstr "Nachrichten von Teilnehmern werden hier erscheinen."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:770
|
#: lib/claper_web/live/event_live/manage.html.heex:1170
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "On screen settings"
|
msgid "On screen settings"
|
||||||
msgstr "Bildschirmeinstellungen"
|
msgstr "Bildschirmeinstellungen"
|
||||||
@@ -471,29 +479,30 @@ msgstr "Verarbeitung der Datei..."
|
|||||||
msgid "This will delete all responses associated and the poll itself, are you sure?"
|
msgid "This will delete all responses associated and the poll itself, are you sure?"
|
||||||
msgstr "Dadurch werden alle zugehörigen Antworten und die Umfrage selbst gelöscht, sind Sie sicher?"
|
msgstr "Dadurch werden alle zugehörigen Antworten und die Umfrage selbst gelöscht, sind Sie sicher?"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:112
|
#: lib/claper_web/live/event_live/manage.html.heex:113
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Start"
|
msgid "Start"
|
||||||
msgstr "Start"
|
msgstr "Start"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:88
|
#: lib/claper_web/live/event_live/manage.html.heex:89
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Press <strong>F</strong> in the presentation window to enable fullscreen"
|
msgid "Press <strong>F</strong> in the presentation window to enable fullscreen"
|
||||||
msgstr "Drücken Sie <strong>F</strong> im Präsentationsfenster, um den Vollbildmodus zu aktivieren"
|
msgstr "Drücken Sie <strong>F</strong> im Präsentationsfenster, um den Vollbildmodus zu aktivieren"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:298
|
#: lib/claper_web/live/event_live/show.html.heex:316
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Ask, comment..."
|
msgid "Ask, comment..."
|
||||||
msgstr "Fragen, kommentieren..."
|
msgstr "Fragen, kommentieren..."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:556
|
#: lib/claper_web/live/event_live/manage.html.heex:710
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:71
|
#: lib/claper_web/live/stat_live/index.html.heex:71
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages"
|
msgid "Messages"
|
||||||
msgstr "Nachrichten"
|
msgstr "Nachrichten"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:416
|
#: lib/claper_web/live/event_live/manage.html.heex:487
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:492
|
#: lib/claper_web/live/event_live/manage.html.heex:569
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:643
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Set active"
|
msgid "Set active"
|
||||||
msgstr "Aktivieren"
|
msgstr "Aktivieren"
|
||||||
@@ -518,6 +527,7 @@ msgstr "Die Seite wird gerade gewartet, wir sind bald wieder da!"
|
|||||||
msgid "Facilitators can present and manage interactions"
|
msgid "Facilitators can present and manage interactions"
|
||||||
msgstr "Moderatoren können präsentieren und Interaktionen steuern"
|
msgstr "Moderatoren können präsentieren und Interaktionen steuern"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:45
|
||||||
#: lib/claper_web/templates/user_notifier/change.html.heex:42
|
#: lib/claper_web/templates/user_notifier/change.html.heex:42
|
||||||
#: lib/claper_web/templates/user_notifier/magic.html.heex:42
|
#: lib/claper_web/templates/user_notifier/magic.html.heex:42
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -529,26 +539,30 @@ msgstr "Wenn Sie Probleme mit der obigen Schaltfläche haben, kopieren Sie die f
|
|||||||
msgid "You can change your email by visiting the URL below"
|
msgid "You can change your email by visiting the URL below"
|
||||||
msgstr "Sie können Ihre E-Mail-Adresse ändern, indem Sie die folgende URL aufrufen"
|
msgstr "Sie können Ihre E-Mail-Adresse ändern, indem Sie die folgende URL aufrufen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:525
|
#: lib/claper_web/live/event_live/manage.html.heex:678
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add interaction"
|
msgid "Add interaction"
|
||||||
msgstr "Interaktion hinzufügen"
|
msgstr "Interaktion hinzufügen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:607
|
#: lib/claper_web/live/event_live/manage.html.heex:797
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:622
|
#: lib/claper_web/live/event_live/manage.html.heex:826
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:972
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:1001
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
msgid "Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
||||||
msgstr "Wenn Sie diesen Benutzer sperren, werden alle seine Nachrichten gelöscht, und er kann nicht mehr beitreten. Bestätigen?"
|
msgstr "Wenn Sie diesen Benutzer sperren, werden alle seine Nachrichten gelöscht, und er kann nicht mehr beitreten. Bestätigen?"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.ex:50
|
#: lib/claper_web/live/event_live/show.ex:50
|
||||||
#: lib/claper_web/live/event_live/show.ex:197
|
#: lib/claper_web/live/event_live/show.ex:198
|
||||||
#: lib/claper_web/live/event_live/show.ex:212
|
#: lib/claper_web/live/event_live/show.ex:213
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You have been banned from this event"
|
msgid "You have been banned from this event"
|
||||||
msgstr "Sie wurden von dieser Veranstaltung ausgeschlossen"
|
msgstr "Sie wurden von dieser Veranstaltung ausgeschlossen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:601
|
#: lib/claper_web/live/event_live/manage.html.heex:791
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:616
|
#: lib/claper_web/live/event_live/manage.html.heex:820
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:966
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:995
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Ban"
|
msgid "Ban"
|
||||||
msgstr "Ban"
|
msgstr "Ban"
|
||||||
@@ -642,7 +656,7 @@ msgstr "Veranstaltung"
|
|||||||
msgid "Interactions history"
|
msgid "Interactions history"
|
||||||
msgstr "Interaktionsgeschichte"
|
msgstr "Interaktionsgeschichte"
|
||||||
|
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:260
|
#: lib/claper_web/live/stat_live/index.html.heex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No messages has been sent"
|
msgid "No messages has been sent"
|
||||||
msgstr "Es wurden keine Nachrichten gesendet"
|
msgstr "Es wurden keine Nachrichten gesendet"
|
||||||
@@ -702,19 +716,20 @@ msgstr "Anmeldung"
|
|||||||
msgid "Connect to your account"
|
msgid "Connect to your account"
|
||||||
msgstr "Verbinden Sie sich mit Ihrem Konto"
|
msgstr "Verbinden Sie sich mit Ihrem Konto"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:423
|
#: lib/claper_web/live/event_live/show.html.heex:441
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Or use the code:"
|
msgid "Or use the code:"
|
||||||
msgstr "Oder verwenden Sie den Code:"
|
msgstr "Oder verwenden Sie den Code:"
|
||||||
|
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:51
|
#: lib/claper_web/templates/user_registration/new.html.heex:51
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:73
|
#: lib/claper_web/templates/user_session/new.html.heex:77
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Benutzerkonto erstellen"
|
msgstr "Benutzerkonto erstellen"
|
||||||
|
|
||||||
#: lib/claper_web/live/user_settings_live/show.html.heex:116
|
#: lib/claper_web/live/user_settings_live/show.html.heex:116
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:42
|
#: lib/claper_web/templates/user_registration/new.html.heex:42
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:34
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:57
|
#: lib/claper_web/templates/user_session/new.html.heex:57
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
@@ -762,7 +777,7 @@ msgid_plural "Field %{count}"
|
|||||||
msgstr[0] "Feld %{count}"
|
msgstr[0] "Feld %{count}"
|
||||||
msgstr[1] "Feld %{count}"
|
msgstr[1] "Feld %{count}"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:213
|
#: lib/claper_web/live/event_live/manage.html.heex:219
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add form to collect data from your public."
|
msgid "Add form to collect data from your public."
|
||||||
msgstr "Fügen Sie ein Formular hinzu, um Daten von Ihrem Publikum zu sammeln."
|
msgstr "Fügen Sie ein Formular hinzu, um Daten von Ihrem Publikum zu sammeln."
|
||||||
@@ -772,34 +787,34 @@ msgstr "Fügen Sie ein Formular hinzu, um Daten von Ihrem Publikum zu sammeln."
|
|||||||
msgid "Current form"
|
msgid "Current form"
|
||||||
msgstr "Aktuelles Formular"
|
msgstr "Aktuelles Formular"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:277
|
#: lib/claper_web/live/event_live/manage.html.heex:314
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit form"
|
msgid "Edit form"
|
||||||
msgstr "Formular bearbeiten"
|
msgstr "Formular bearbeiten"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:211
|
#: lib/claper_web/live/event_live/manage.html.heex:216
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:471
|
#: lib/claper_web/live/event_live/manage.html.heex:543
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:215
|
#: lib/claper_web/live/stat_live/index.html.heex:215
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form"
|
msgid "Form"
|
||||||
msgstr "Formular"
|
msgstr "Formular"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:559
|
#: lib/claper_web/live/event_live/manage.html.heex:722
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form submissions"
|
msgid "Form submissions"
|
||||||
msgstr "Abgeschickte Formulare"
|
msgstr "Abgeschickte Formulare"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:711
|
#: lib/claper_web/live/event_live/manage.html.heex:1104
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form submissions from attendees will appear here."
|
msgid "Form submissions from attendees will appear here."
|
||||||
msgstr "Formulareinsendungen der Teilnehmer werden hier angezeigt."
|
msgstr "Formulareinsendungen der Teilnehmer werden hier angezeigt."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:456
|
#: lib/claper_web/live/event_live/manage.ex:649
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:276
|
#: lib/claper_web/live/event_live/manage.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "New form"
|
msgid "New form"
|
||||||
msgstr "Neues Formular"
|
msgstr "Neues Formular"
|
||||||
@@ -814,7 +829,7 @@ msgstr "Es wurde kein Formular gesendet"
|
|||||||
msgid "See current form"
|
msgid "See current form"
|
||||||
msgstr "Siehe aktuelles Formular"
|
msgstr "Siehe aktuelles Formular"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/form_component.ex:96
|
#: lib/claper_web/live/event_live/form_component.ex:97
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Abschicken"
|
msgstr "Abschicken"
|
||||||
@@ -824,7 +839,7 @@ msgstr "Abschicken"
|
|||||||
msgid "Text"
|
msgid "Text"
|
||||||
msgstr "Text"
|
msgstr "Text"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:736
|
#: lib/claper_web/live/event_live/manage.html.heex:1130
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "This cannot be undone, confirm ?"
|
msgid "This cannot be undone, confirm ?"
|
||||||
msgstr "Dies kann nicht rückgängig gemacht werden. Bestätigen?"
|
msgstr "Dies kann nicht rückgängig gemacht werden. Bestätigen?"
|
||||||
@@ -864,22 +879,22 @@ msgstr "Wählen Sie eine oder mehrere Optionen aus"
|
|||||||
msgid "Multiple answers"
|
msgid "Multiple answers"
|
||||||
msgstr "Mehrere Antworten"
|
msgstr "Mehrere Antworten"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:244
|
#: lib/claper_web/live/event_live/manage.html.heex:281
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import all interactions from another presentation"
|
msgid "Import all interactions from another presentation"
|
||||||
msgstr "Importieren Sie alle Interaktionen aus einer anderen Präsentation"
|
msgstr "Importieren Sie alle Interaktionen aus einer anderen Präsentation"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:183
|
#: lib/claper_web/live/event_live/manage.ex:226
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Interactions import failed"
|
msgid "Interactions import failed"
|
||||||
msgstr "Der Import der Interaktionen ist fehlgeschlagen"
|
msgstr "Der Import der Interaktionen ist fehlgeschlagen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:176
|
#: lib/claper_web/live/event_live/manage.ex:219
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Interactions imported successfully"
|
msgid "Interactions imported successfully"
|
||||||
msgstr "Interaktionen erfolgreich importiert"
|
msgstr "Interaktionen erfolgreich importiert"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:295
|
#: lib/claper_web/live/event_live/manage.html.heex:354
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Select presentation"
|
msgid "Select presentation"
|
||||||
msgstr "Präsentation auswählen"
|
msgstr "Präsentation auswählen"
|
||||||
@@ -889,70 +904,70 @@ msgstr "Präsentation auswählen"
|
|||||||
msgid "PDF, PPT, PPTX up to %{size} MB"
|
msgid "PDF, PPT, PPTX up to %{size} MB"
|
||||||
msgstr "PDF, PPT, PPTX bis zu %{size} MB"
|
msgstr "PDF, PPT, PPTX bis zu %{size} MB"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:796
|
#: lib/claper_web/live/event_live/manage.html.heex:1215
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Attendees settings"
|
msgid "Attendees settings"
|
||||||
msgstr "Teilnehmereinstellungen"
|
msgstr "Teilnehmereinstellungen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:800
|
#: lib/claper_web/live/event_live/manage.html.heex:1224
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Enable messages"
|
msgid "Enable messages"
|
||||||
msgstr "Nachrichten aktivieren"
|
msgstr "Nachrichten aktivieren"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:777
|
#: lib/claper_web/live/event_live/manage.html.heex:1179
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show instructions"
|
msgid "Show instructions"
|
||||||
msgstr "Anleitung anzeigen"
|
msgstr "Anleitung anzeigen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:782
|
#: lib/claper_web/live/event_live/manage.html.heex:1188
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show messages"
|
msgid "Show messages"
|
||||||
msgstr "Nachrichten anzeigen"
|
msgstr "Nachrichten anzeigen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:791
|
#: lib/claper_web/live/event_live/manage.html.heex:1209
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show poll results"
|
msgid "Show poll results"
|
||||||
msgstr "Umfrageergebnisse anzeigen"
|
msgstr "Umfrageergebnisse anzeigen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:318
|
#: lib/claper_web/live/event_live/show.html.heex:336
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages deactivated"
|
msgid "Messages deactivated"
|
||||||
msgstr "Nachrichten deaktiviert"
|
msgstr "Nachrichten deaktiviert"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:161
|
#: lib/claper_web/live/event_live/show.html.heex:179
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:182
|
#: lib/claper_web/live/event_live/show.html.heex:200
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:282
|
#: lib/claper_web/live/event_live/show.html.heex:300
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Anonymous"
|
msgid "Anonymous"
|
||||||
msgstr ""
|
msgstr "Anonymous"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:208
|
#: lib/claper_web/live/event_live/show.html.heex:226
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr ""
|
msgstr "Schließen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:808
|
#: lib/claper_web/live/event_live/manage.html.heex:1234
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Enable anonymous messages"
|
msgid "Enable anonymous messages"
|
||||||
msgstr "Nachrichten aktivieren"
|
msgstr "Anonyme Nachrichten aktivieren"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:189
|
#: lib/claper_web/live/event_live/show.html.heex:207
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:234
|
#: lib/claper_web/live/event_live/show.html.heex:252
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr "Benutze deinen Namen"
|
msgstr "Benutze deinen Namen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/presenter.html.heex:33
|
#: lib/claper_web/live/event_live/presenter.html.heex:38
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Or go to %{url} and use the code:"
|
msgid "Or go to %{url} and use the code:"
|
||||||
msgstr "Oder gehen Sie zu %{url} und verwenden Sie den Code:"
|
msgstr "Oder gehen Sie zu %{url} und verwenden Sie den Code:"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:202
|
#: lib/claper_web/live/event_live/show.html.heex:220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Use your name"
|
msgid "Use your name"
|
||||||
msgstr "Benutze deinen Namen"
|
msgstr "Benutze deinen Namen"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:182
|
#: lib/claper_web/live/event_live/show.html.heex:200
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr "deaktiviert"
|
msgstr "deaktiviert"
|
||||||
@@ -961,3 +976,168 @@ msgstr "deaktiviert"
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Account creation is disabled"
|
msgid "Account creation is disabled"
|
||||||
msgstr "Kontoerstellung ist deaktiviert"
|
msgstr "Kontoerstellung ist deaktiviert"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:250
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Add a Youtube video or any web content."
|
||||||
|
msgstr "Fügen Sie ein YouTube-Video oder einen beliebigen Webinhalt hinzu."
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:51
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Confirm new password"
|
||||||
|
msgstr "Neues Passwort bestätigen"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_session/new.html.heex:72
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Forgot your password?"
|
||||||
|
msgstr "Passwort vergessen?"
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:26
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "If your email is in our system, you'll receive instructions to reset your password shortly."
|
||||||
|
msgstr "Wenn sich Ihre E-Mail-Adresse in unserem System befindet, erhalten Sie in Kürze Anweisungen zum Zurücksetzen Ihres Passworts."
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:42
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Password confirmation"
|
||||||
|
msgstr "Passwort bestätigen"
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:44
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Password updated successfully."
|
||||||
|
msgstr "Passwort erfolgreich aktualisiert."
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:59
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Reset password link is invalid or it has expired."
|
||||||
|
msgstr "Der Link zum Zurücksetzen des Kennworts ist ungültig oder er ist abgelaufen."
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:12
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:12
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Reset your password"
|
||||||
|
msgstr "Aktualisieren Sie Ihr Passwort"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:41
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Send link to reset password"
|
||||||
|
msgstr "Link zum Zurücksetzen des Passworts senden"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:38
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Attendee can view the web content on their device"
|
||||||
|
msgstr "Der Teilnehmer kann die Webinhalte auf seinem Gerät anzeigen"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/embed_component.ex:59
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Current web content"
|
||||||
|
msgstr "Aktuelle Einbettung"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:335
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Edit web content"
|
||||||
|
msgstr "Webinhalt bearbeiten"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:334
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "New web content"
|
||||||
|
msgstr "Neuer Webinhalt"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/embed_component.ex:36
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "See current web content"
|
||||||
|
msgstr "Aktuellen Webinhalt anzeigen"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:25
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "The iframe component"
|
||||||
|
msgstr "Die iframe-Komponente"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:62
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "This will delete the web content, are you sure?"
|
||||||
|
msgstr "Dies wird den Webinhalt löschen, sind Sie sicher?"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:14
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Titel"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:248
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:618
|
||||||
|
#: lib/claper_web/live/stat_live/index.html.heex:257
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Web content"
|
||||||
|
msgstr "Webinhalt"
|
||||||
|
|
||||||
|
#: lib/claper/embeds/embed.ex:38
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Invalid embed format (should start with <iframe> and end with </iframe>)"
|
||||||
|
msgstr "Ungültiges Einbettungsformat (sollte mit <iframe> beginnen und mit </iframe> enden)"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:781
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:810
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:956
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:985
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pin"
|
||||||
|
msgstr "Anpinnen"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:59
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:175
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pinned"
|
||||||
|
msgstr "Angepinnt"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:714
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Pinned messages"
|
||||||
|
msgstr "Angepinnte Nachrichten"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:925
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pinned messages will appear here."
|
||||||
|
msgstr "Angepinnte Beiträge werden hier angezeigt."
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:1198
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Show only pinned messages"
|
||||||
|
msgstr "Nur angepinnte Nachrichten anzeigen"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:779
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:808
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:954
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:983
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Unpin"
|
||||||
|
msgstr "Lösen"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:35
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Login or create account"
|
||||||
|
msgstr "Einloggen oder Konto erstellen"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:22
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Someone invited you to manage the event: %{name}"
|
||||||
|
msgstr "Jemand hat Sie eingeladen, das Ereignis zu verwalten: %{name}"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:25
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "To accept the invitation, please login or create an account with this email: %{email}"
|
||||||
|
msgstr "Um die Einladung anzunehmen, melden Sie sich bitte an oder erstellen Sie ein Konto mit dieser E-Mail: %{email}"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:17
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "You have been invited"
|
||||||
|
msgstr "Sie wurden eingeladen"
|
||||||
|
|
||||||
|
#: lib/claper_web/notifiers/leader_notifier.ex:12
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "You have been invited to manage an event"
|
||||||
|
msgstr "Sie wurden eingeladen, ein Ereignis zu verwalten"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/form_component.ex:103
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Saved"
|
||||||
|
msgstr "Gespeichert"
|
||||||
|
|||||||
@@ -17,10 +17,11 @@ msgstr ""
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:457
|
#: lib/claper_web/live/event_live/manage.ex:650
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:37
|
#: lib/claper_web/live/form_live/form_component.html.heex:37
|
||||||
#: lib/claper_web/live/user_settings_live/show.html.heex:34
|
#: lib/claper_web/live/user_settings_live/show.html.heex:34
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:34
|
#: lib/claper_web/templates/user_registration/new.html.heex:34
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:33
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:47
|
#: lib/claper_web/templates/user_session/new.html.heex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
@@ -32,6 +33,8 @@ msgid "Join the Claper experience"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:24
|
#: lib/claper_web/templates/user_registration/new.html.heex:24
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:25
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:24
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Oops, check that all fields are filled in correctly."
|
msgid "Oops, check that all fields are filled in correctly."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -77,22 +80,22 @@ msgstr ""
|
|||||||
msgid "Your personal informations only visible by you"
|
msgid "Your personal informations only visible by you"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:387
|
#: lib/claper_web/live/event_live/show.html.heex:405
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "days"
|
msgid "days"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:393
|
#: lib/claper_web/live/event_live/show.html.heex:411
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "hours"
|
msgid "hours"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:399
|
#: lib/claper_web/live/event_live/show.html.heex:417
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "minutes"
|
msgid "minutes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:118
|
#: lib/claper_web/live/event_live/show.html.heex:136
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Be the first to react !"
|
msgid "Be the first to react !"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -100,7 +103,7 @@ msgstr ""
|
|||||||
#: lib/claper_web/live/event_live/event_card_component.ex:98
|
#: lib/claper_web/live/event_live/event_card_component.ex:98
|
||||||
#: lib/claper_web/live/event_live/join.ex:42
|
#: lib/claper_web/live/event_live/join.ex:42
|
||||||
#: lib/claper_web/live/event_live/join.html.heex:106
|
#: lib/claper_web/live/event_live/join.html.heex:106
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:239
|
#: lib/claper_web/live/event_live/show.html.heex:257
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Join"
|
msgid "Join"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -113,12 +116,12 @@ msgid "Dashboard"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:33
|
#: lib/claper_web/live/event_live/post_component.ex:33
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:86
|
#: lib/claper_web/live/event_live/post_component.ex:112
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Host"
|
msgid "Host"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:405
|
#: lib/claper_web/live/event_live/show.html.heex:423
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "seconds"
|
msgid "seconds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -129,7 +132,7 @@ msgid "Create your first presentation"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:50
|
#: lib/claper_web/live/event_live/event_card_component.ex:50
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:80
|
#: lib/claper_web/live/event_live/manage.html.heex:81
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Finish on"
|
msgid "Finish on"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -169,8 +172,8 @@ msgstr ""
|
|||||||
msgid "Name of your presentation"
|
msgid "Name of your presentation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/presenter.html.heex:21
|
#: lib/claper_web/live/event_live/presenter.html.heex:26
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:414
|
#: lib/claper_web/live/event_live/show.html.heex:432
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Scan to interact in real-time"
|
msgid "Scan to interact in real-time"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -180,7 +183,7 @@ msgstr ""
|
|||||||
msgid "Starting on"
|
msgid "Starting on"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:196
|
#: lib/claper_web/live/event_live/event_form_component.ex:206
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated successfully"
|
msgid "Updated successfully"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -207,12 +210,12 @@ msgstr ""
|
|||||||
msgid "Return to home"
|
msgid "Return to home"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:178
|
#: lib/claper_web/live/event_live/event_form_component.ex:186
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Created successfully"
|
msgid "Created successfully"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:23
|
#: lib/claper_web/live/event_live/manage.ex:24
|
||||||
#: lib/claper_web/live/event_live/presenter.ex:21
|
#: lib/claper_web/live/event_live/presenter.ex:21
|
||||||
#: lib/claper_web/live/event_live/show.ex:24
|
#: lib/claper_web/live/event_live/show.ex:24
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -221,12 +224,13 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:109
|
#: lib/claper_web/live/event_live/event_card_component.ex:109
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:129
|
#: lib/claper_web/live/event_live/event_card_component.ex:129
|
||||||
#: lib/claper_web/live/event_live/form_component.ex:96
|
#: lib/claper_web/live/event_live/form_component.ex:97
|
||||||
#: lib/claper_web/live/event_live/index.ex:65
|
#: lib/claper_web/live/event_live/index.ex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:51
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:18
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:18
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:25
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:25
|
||||||
#: lib/claper_web/live/event_live/index.ex:71
|
#: lib/claper_web/live/event_live/index.ex:71
|
||||||
@@ -237,18 +241,21 @@ msgstr ""
|
|||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:56
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:171
|
#: lib/claper_web/live/event_live/event_card_component.ex:171
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:30
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:30
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:631
|
#: lib/claper_web/live/event_live/manage.html.heex:835
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:731
|
#: lib/claper_web/live/event_live/manage.html.heex:1010
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:44
|
#: lib/claper_web/live/event_live/manage.html.heex:1125
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:116
|
#: lib/claper_web/live/event_live/post_component.ex:70
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:142
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:103
|
#: lib/claper_web/live/form_live/form_component.html.heex:103
|
||||||
#: lib/claper_web/live/poll_live/form_component.html.heex:99
|
#: lib/claper_web/live/poll_live/form_component.html.heex:99
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:52
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:17
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:17
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:24
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:24
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:99
|
#: lib/claper_web/live/form_live/form_component.html.heex:99
|
||||||
@@ -312,8 +319,8 @@ msgid "You can log into your account by clicking here."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:34
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:34
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:49
|
#: lib/claper_web/live/event_live/post_component.ex:75
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:121
|
#: lib/claper_web/live/event_live/post_component.ex:147
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Are you sure?"
|
msgid "Are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -352,12 +359,12 @@ msgstr ""
|
|||||||
msgid "or drag and drop"
|
msgid "or drag and drop"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:229
|
#: lib/claper_web/live/event_live/event_form_component.ex:257
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You have selected an incorrect file type"
|
msgid "You have selected an incorrect file type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:228
|
#: lib/claper_web/live/event_live/event_form_component.ex:256
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Your file is too large"
|
msgid "Your file is too large"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -372,12 +379,12 @@ msgstr ""
|
|||||||
msgid "Presentation replaced"
|
msgid "Presentation replaced"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:256
|
#: lib/claper_web/live/event_live/manage.html.heex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit poll"
|
msgid "Edit poll"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:255
|
#: lib/claper_web/live/event_live/manage.html.heex:292
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "New poll"
|
msgid "New poll"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -387,18 +394,18 @@ msgstr ""
|
|||||||
msgid "Title of your poll"
|
msgid "Title of your poll"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:230
|
#: lib/claper_web/live/event_live/event_form_component.ex:258
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload failed"
|
msgid "Upload failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:176
|
#: lib/claper_web/live/event_live/manage.html.heex:180
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add poll to know opinion of your public."
|
msgid "Add poll to know opinion of your public."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:174
|
#: lib/claper_web/live/event_live/manage.html.heex:177
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:395
|
#: lib/claper_web/live/event_live/manage.html.heex:461
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Poll"
|
msgid "Poll"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -420,8 +427,8 @@ msgstr ""
|
|||||||
msgid "See current poll"
|
msgid "See current poll"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/poll_component.ex:107
|
#: lib/claper_web/live/event_live/poll_component.ex:123
|
||||||
#: lib/claper_web/live/event_live/poll_component.ex:115
|
#: lib/claper_web/live/event_live/poll_component.ex:131
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Vote"
|
msgid "Vote"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -442,8 +449,9 @@ msgstr ""
|
|||||||
msgid "Present/Customize"
|
msgid "Present/Customize"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:408
|
#: lib/claper_web/live/event_live/manage.html.heex:479
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:484
|
#: lib/claper_web/live/event_live/manage.html.heex:561
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:635
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -453,12 +461,12 @@ msgstr ""
|
|||||||
msgid "Changing your file will remove all interaction elements like polls associated."
|
msgid "Changing your file will remove all interaction elements like polls associated."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:584
|
#: lib/claper_web/live/event_live/manage.html.heex:752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages from attendees will appear here."
|
msgid "Messages from attendees will appear here."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:770
|
#: lib/claper_web/live/event_live/manage.html.heex:1170
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "On screen settings"
|
msgid "On screen settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -473,29 +481,30 @@ msgstr ""
|
|||||||
msgid "This will delete all responses associated and the poll itself, are you sure?"
|
msgid "This will delete all responses associated and the poll itself, are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:112
|
#: lib/claper_web/live/event_live/manage.html.heex:113
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Start"
|
msgid "Start"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:88
|
#: lib/claper_web/live/event_live/manage.html.heex:89
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Press <strong>F</strong> in the presentation window to enable fullscreen"
|
msgid "Press <strong>F</strong> in the presentation window to enable fullscreen"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:298
|
#: lib/claper_web/live/event_live/show.html.heex:316
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Ask, comment..."
|
msgid "Ask, comment..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:556
|
#: lib/claper_web/live/event_live/manage.html.heex:710
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:71
|
#: lib/claper_web/live/stat_live/index.html.heex:71
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages"
|
msgid "Messages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:416
|
#: lib/claper_web/live/event_live/manage.html.heex:487
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:492
|
#: lib/claper_web/live/event_live/manage.html.heex:569
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:643
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Set active"
|
msgid "Set active"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -520,6 +529,7 @@ msgstr ""
|
|||||||
msgid "Facilitators can present and manage interactions"
|
msgid "Facilitators can present and manage interactions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:45
|
||||||
#: lib/claper_web/templates/user_notifier/change.html.heex:42
|
#: lib/claper_web/templates/user_notifier/change.html.heex:42
|
||||||
#: lib/claper_web/templates/user_notifier/magic.html.heex:42
|
#: lib/claper_web/templates/user_notifier/magic.html.heex:42
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -531,26 +541,30 @@ msgstr ""
|
|||||||
msgid "You can change your email by visiting the URL below"
|
msgid "You can change your email by visiting the URL below"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:525
|
#: lib/claper_web/live/event_live/manage.html.heex:678
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add interaction"
|
msgid "Add interaction"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:607
|
#: lib/claper_web/live/event_live/manage.html.heex:797
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:622
|
#: lib/claper_web/live/event_live/manage.html.heex:826
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:972
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:1001
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
msgid "Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.ex:50
|
#: lib/claper_web/live/event_live/show.ex:50
|
||||||
#: lib/claper_web/live/event_live/show.ex:197
|
#: lib/claper_web/live/event_live/show.ex:198
|
||||||
#: lib/claper_web/live/event_live/show.ex:212
|
#: lib/claper_web/live/event_live/show.ex:213
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You have been banned from this event"
|
msgid "You have been banned from this event"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:601
|
#: lib/claper_web/live/event_live/manage.html.heex:791
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:616
|
#: lib/claper_web/live/event_live/manage.html.heex:820
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:966
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:995
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Ban"
|
msgid "Ban"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -644,7 +658,7 @@ msgstr ""
|
|||||||
msgid "Interactions history"
|
msgid "Interactions history"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:260
|
#: lib/claper_web/live/stat_live/index.html.heex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No messages has been sent"
|
msgid "No messages has been sent"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -704,19 +718,20 @@ msgstr ""
|
|||||||
msgid "Connect to your account"
|
msgid "Connect to your account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:423
|
#: lib/claper_web/live/event_live/show.html.heex:441
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Or use the code:"
|
msgid "Or use the code:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:51
|
#: lib/claper_web/templates/user_registration/new.html.heex:51
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:73
|
#: lib/claper_web/templates/user_session/new.html.heex:77
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/user_settings_live/show.html.heex:116
|
#: lib/claper_web/live/user_settings_live/show.html.heex:116
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:42
|
#: lib/claper_web/templates/user_registration/new.html.heex:42
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:34
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:57
|
#: lib/claper_web/templates/user_session/new.html.heex:57
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
@@ -764,7 +779,7 @@ msgid_plural "Field %{count}"
|
|||||||
msgstr[0] ""
|
msgstr[0] ""
|
||||||
msgstr[1] ""
|
msgstr[1] ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:213
|
#: lib/claper_web/live/event_live/manage.html.heex:219
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add form to collect data from your public."
|
msgid "Add form to collect data from your public."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -774,34 +789,34 @@ msgstr ""
|
|||||||
msgid "Current form"
|
msgid "Current form"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:277
|
#: lib/claper_web/live/event_live/manage.html.heex:314
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit form"
|
msgid "Edit form"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:211
|
#: lib/claper_web/live/event_live/manage.html.heex:216
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:471
|
#: lib/claper_web/live/event_live/manage.html.heex:543
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:215
|
#: lib/claper_web/live/stat_live/index.html.heex:215
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form"
|
msgid "Form"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:559
|
#: lib/claper_web/live/event_live/manage.html.heex:722
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form submissions"
|
msgid "Form submissions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:711
|
#: lib/claper_web/live/event_live/manage.html.heex:1104
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form submissions from attendees will appear here."
|
msgid "Form submissions from attendees will appear here."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:456
|
#: lib/claper_web/live/event_live/manage.ex:649
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:276
|
#: lib/claper_web/live/event_live/manage.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "New form"
|
msgid "New form"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -816,7 +831,7 @@ msgstr ""
|
|||||||
msgid "See current form"
|
msgid "See current form"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/form_component.ex:96
|
#: lib/claper_web/live/event_live/form_component.ex:97
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -826,7 +841,7 @@ msgstr ""
|
|||||||
msgid "Text"
|
msgid "Text"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:736
|
#: lib/claper_web/live/event_live/manage.html.heex:1130
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "This cannot be undone, confirm ?"
|
msgid "This cannot be undone, confirm ?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -866,22 +881,22 @@ msgstr ""
|
|||||||
msgid "Multiple answers"
|
msgid "Multiple answers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:244
|
#: lib/claper_web/live/event_live/manage.html.heex:281
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import all interactions from another presentation"
|
msgid "Import all interactions from another presentation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:183
|
#: lib/claper_web/live/event_live/manage.ex:226
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Interactions import failed"
|
msgid "Interactions import failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:176
|
#: lib/claper_web/live/event_live/manage.ex:219
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Interactions imported successfully"
|
msgid "Interactions imported successfully"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:295
|
#: lib/claper_web/live/event_live/manage.html.heex:354
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Select presentation"
|
msgid "Select presentation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -891,70 +906,70 @@ msgstr ""
|
|||||||
msgid "PDF, PPT, PPTX up to %{size} MB"
|
msgid "PDF, PPT, PPTX up to %{size} MB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:796
|
#: lib/claper_web/live/event_live/manage.html.heex:1215
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Attendees settings"
|
msgid "Attendees settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:800
|
#: lib/claper_web/live/event_live/manage.html.heex:1224
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Enable messages"
|
msgid "Enable messages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:777
|
#: lib/claper_web/live/event_live/manage.html.heex:1179
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show instructions"
|
msgid "Show instructions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:782
|
#: lib/claper_web/live/event_live/manage.html.heex:1188
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show messages"
|
msgid "Show messages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:791
|
#: lib/claper_web/live/event_live/manage.html.heex:1209
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show poll results"
|
msgid "Show poll results"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:318
|
#: lib/claper_web/live/event_live/show.html.heex:336
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages deactivated"
|
msgid "Messages deactivated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:161
|
#: lib/claper_web/live/event_live/show.html.heex:179
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:182
|
#: lib/claper_web/live/event_live/show.html.heex:200
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:282
|
#: lib/claper_web/live/event_live/show.html.heex:300
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Anonymous"
|
msgid "Anonymous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:208
|
#: lib/claper_web/live/event_live/show.html.heex:226
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:808
|
#: lib/claper_web/live/event_live/manage.html.heex:1234
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Enable anonymous messages"
|
msgid "Enable anonymous messages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:189
|
#: lib/claper_web/live/event_live/show.html.heex:207
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:234
|
#: lib/claper_web/live/event_live/show.html.heex:252
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/presenter.html.heex:33
|
#: lib/claper_web/live/event_live/presenter.html.heex:38
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Or go to %{url} and use the code:"
|
msgid "Or go to %{url} and use the code:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:202
|
#: lib/claper_web/live/event_live/show.html.heex:220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Use your name"
|
msgid "Use your name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:182
|
#: lib/claper_web/live/event_live/show.html.heex:200
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -963,3 +978,168 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Account creation is disabled"
|
msgid "Account creation is disabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:250
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Add a Youtube video or any web content."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:51
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Confirm new password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_session/new.html.heex:72
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Forgot your password?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:26
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "If your email is in our system, you'll receive instructions to reset your password shortly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:42
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Password confirmation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:44
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Password updated successfully."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:59
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Reset password link is invalid or it has expired."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:12
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:12
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Reset your password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:41
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Send link to reset password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:38
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Attendee can view the web content on their device"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/embed_component.ex:59
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Current web content"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:335
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Edit web content"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:334
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "New web content"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/embed_component.ex:36
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "See current web content"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:25
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "The iframe component"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:62
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "This will delete the web content, are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:14
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Title"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:248
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:618
|
||||||
|
#: lib/claper_web/live/stat_live/index.html.heex:257
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Web content"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper/embeds/embed.ex:38
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Invalid embed format (should start with <iframe> and end with </iframe>)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:781
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:810
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:956
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:985
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:59
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:175
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pinned"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:714
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pinned messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:925
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pinned messages will appear here."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:1198
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Show only pinned messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:779
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:808
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:954
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:983
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Unpin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:35
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Login or create account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:22
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Someone invited you to manage the event: %{name}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:25
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "To accept the invitation, please login or create an account with this email: %{email}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:17
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "You have been invited"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/notifiers/leader_notifier.ex:12
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "You have been invited to manage an event"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/form_component.ex:103
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Saved"
|
||||||
|
msgstr ""
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -15,10 +15,11 @@ msgstr ""
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Paramètres"
|
msgstr "Paramètres"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:457
|
#: lib/claper_web/live/event_live/manage.ex:650
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:37
|
#: lib/claper_web/live/form_live/form_component.html.heex:37
|
||||||
#: lib/claper_web/live/user_settings_live/show.html.heex:34
|
#: lib/claper_web/live/user_settings_live/show.html.heex:34
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:34
|
#: lib/claper_web/templates/user_registration/new.html.heex:34
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:33
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:47
|
#: lib/claper_web/templates/user_session/new.html.heex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
@@ -30,6 +31,8 @@ msgid "Join the Claper experience"
|
|||||||
msgstr "Rejoignez l'expérience Claper"
|
msgstr "Rejoignez l'expérience Claper"
|
||||||
|
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:24
|
#: lib/claper_web/templates/user_registration/new.html.heex:24
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:25
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:24
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Oops, check that all fields are filled in correctly."
|
msgid "Oops, check that all fields are filled in correctly."
|
||||||
msgstr "Oups, vérifiez que tous les champs sont remplis correctement."
|
msgstr "Oups, vérifiez que tous les champs sont remplis correctement."
|
||||||
@@ -75,22 +78,22 @@ msgstr "Nous vous avons envoyé un email à"
|
|||||||
msgid "Your personal informations only visible by you"
|
msgid "Your personal informations only visible by you"
|
||||||
msgstr "Vos informations personnelles ne sont visibles que par vous"
|
msgstr "Vos informations personnelles ne sont visibles que par vous"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:387
|
#: lib/claper_web/live/event_live/show.html.heex:405
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "days"
|
msgid "days"
|
||||||
msgstr "jours"
|
msgstr "jours"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:393
|
#: lib/claper_web/live/event_live/show.html.heex:411
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "hours"
|
msgid "hours"
|
||||||
msgstr "heures"
|
msgstr "heures"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:399
|
#: lib/claper_web/live/event_live/show.html.heex:417
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "minutes"
|
msgid "minutes"
|
||||||
msgstr "minutes"
|
msgstr "minutes"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:118
|
#: lib/claper_web/live/event_live/show.html.heex:136
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Be the first to react !"
|
msgid "Be the first to react !"
|
||||||
msgstr "Soyez le premier à réagir !"
|
msgstr "Soyez le premier à réagir !"
|
||||||
@@ -98,7 +101,7 @@ msgstr "Soyez le premier à réagir !"
|
|||||||
#: lib/claper_web/live/event_live/event_card_component.ex:98
|
#: lib/claper_web/live/event_live/event_card_component.ex:98
|
||||||
#: lib/claper_web/live/event_live/join.ex:42
|
#: lib/claper_web/live/event_live/join.ex:42
|
||||||
#: lib/claper_web/live/event_live/join.html.heex:106
|
#: lib/claper_web/live/event_live/join.html.heex:106
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:239
|
#: lib/claper_web/live/event_live/show.html.heex:257
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Join"
|
msgid "Join"
|
||||||
msgstr "Rejoindre"
|
msgstr "Rejoindre"
|
||||||
@@ -111,12 +114,12 @@ msgid "Dashboard"
|
|||||||
msgstr "Tableau de bord"
|
msgstr "Tableau de bord"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:33
|
#: lib/claper_web/live/event_live/post_component.ex:33
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:86
|
#: lib/claper_web/live/event_live/post_component.ex:112
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Host"
|
msgid "Host"
|
||||||
msgstr "Animateur"
|
msgstr "Animateur"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:405
|
#: lib/claper_web/live/event_live/show.html.heex:423
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "seconds"
|
msgid "seconds"
|
||||||
msgstr "secondes"
|
msgstr "secondes"
|
||||||
@@ -127,7 +130,7 @@ msgid "Create your first presentation"
|
|||||||
msgstr "Créez votre première présentation"
|
msgstr "Créez votre première présentation"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:50
|
#: lib/claper_web/live/event_live/event_card_component.ex:50
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:80
|
#: lib/claper_web/live/event_live/manage.html.heex:81
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Finish on"
|
msgid "Finish on"
|
||||||
msgstr "Termine le"
|
msgstr "Termine le"
|
||||||
@@ -167,8 +170,8 @@ msgstr "Mes présentations"
|
|||||||
msgid "Name of your presentation"
|
msgid "Name of your presentation"
|
||||||
msgstr "Nom de votre présentation"
|
msgstr "Nom de votre présentation"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/presenter.html.heex:21
|
#: lib/claper_web/live/event_live/presenter.html.heex:26
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:414
|
#: lib/claper_web/live/event_live/show.html.heex:432
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Scan to interact in real-time"
|
msgid "Scan to interact in real-time"
|
||||||
msgstr "Scannez pour interagir en temps réel"
|
msgstr "Scannez pour interagir en temps réel"
|
||||||
@@ -178,7 +181,7 @@ msgstr "Scannez pour interagir en temps réel"
|
|||||||
msgid "Starting on"
|
msgid "Starting on"
|
||||||
msgstr "Commence le"
|
msgstr "Commence le"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:196
|
#: lib/claper_web/live/event_live/event_form_component.ex:206
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated successfully"
|
msgid "Updated successfully"
|
||||||
msgstr "Mis à jour avec succès"
|
msgstr "Mis à jour avec succès"
|
||||||
@@ -205,12 +208,12 @@ msgstr "C'est le moment de propulser vos présentations."
|
|||||||
msgid "Return to home"
|
msgid "Return to home"
|
||||||
msgstr "Retourner à l'accueil"
|
msgstr "Retourner à l'accueil"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:178
|
#: lib/claper_web/live/event_live/event_form_component.ex:186
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Created successfully"
|
msgid "Created successfully"
|
||||||
msgstr "Mis à jour avec succès"
|
msgstr "Mis à jour avec succès"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:23
|
#: lib/claper_web/live/event_live/manage.ex:24
|
||||||
#: lib/claper_web/live/event_live/presenter.ex:21
|
#: lib/claper_web/live/event_live/presenter.ex:21
|
||||||
#: lib/claper_web/live/event_live/show.ex:24
|
#: lib/claper_web/live/event_live/show.ex:24
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -219,12 +222,13 @@ msgstr "La présentation n'existe pas"
|
|||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:109
|
#: lib/claper_web/live/event_live/event_card_component.ex:109
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:129
|
#: lib/claper_web/live/event_live/event_card_component.ex:129
|
||||||
#: lib/claper_web/live/event_live/form_component.ex:96
|
#: lib/claper_web/live/event_live/form_component.ex:97
|
||||||
#: lib/claper_web/live/event_live/index.ex:65
|
#: lib/claper_web/live/event_live/index.ex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Modifier"
|
msgstr "Modifier"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:51
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:18
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:18
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:25
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:25
|
||||||
#: lib/claper_web/live/event_live/index.ex:71
|
#: lib/claper_web/live/event_live/index.ex:71
|
||||||
@@ -235,18 +239,21 @@ msgstr "Modifier"
|
|||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Créer"
|
msgstr "Créer"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:56
|
||||||
#: lib/claper_web/live/event_live/event_card_component.ex:171
|
#: lib/claper_web/live/event_live/event_card_component.ex:171
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:30
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:30
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:631
|
#: lib/claper_web/live/event_live/manage.html.heex:835
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:731
|
#: lib/claper_web/live/event_live/manage.html.heex:1010
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:44
|
#: lib/claper_web/live/event_live/manage.html.heex:1125
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:116
|
#: lib/claper_web/live/event_live/post_component.ex:70
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:142
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:103
|
#: lib/claper_web/live/form_live/form_component.html.heex:103
|
||||||
#: lib/claper_web/live/poll_live/form_component.html.heex:99
|
#: lib/claper_web/live/poll_live/form_component.html.heex:99
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Supprimer"
|
msgstr "Supprimer"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:52
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:17
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:17
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:24
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:24
|
||||||
#: lib/claper_web/live/form_live/form_component.html.heex:99
|
#: lib/claper_web/live/form_live/form_component.html.heex:99
|
||||||
@@ -310,8 +317,8 @@ msgid "You can log into your account by clicking here."
|
|||||||
msgstr "Vous pouvez vous connecter à votre compte en cliquant ici."
|
msgstr "Vous pouvez vous connecter à votre compte en cliquant ici."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.html.heex:34
|
#: lib/claper_web/live/event_live/event_form_component.html.heex:34
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:49
|
#: lib/claper_web/live/event_live/post_component.ex:75
|
||||||
#: lib/claper_web/live/event_live/post_component.ex:121
|
#: lib/claper_web/live/event_live/post_component.ex:147
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Are you sure?"
|
msgid "Are you sure?"
|
||||||
msgstr "Êtes-vous sûr?"
|
msgstr "Êtes-vous sûr?"
|
||||||
@@ -350,12 +357,12 @@ msgstr "Chargez un fichier"
|
|||||||
msgid "or drag and drop"
|
msgid "or drag and drop"
|
||||||
msgstr "ou glisser-déposer"
|
msgstr "ou glisser-déposer"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:229
|
#: lib/claper_web/live/event_live/event_form_component.ex:257
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You have selected an incorrect file type"
|
msgid "You have selected an incorrect file type"
|
||||||
msgstr "Vous avez sélectionné un type de fichier incorrect"
|
msgstr "Vous avez sélectionné un type de fichier incorrect"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:228
|
#: lib/claper_web/live/event_live/event_form_component.ex:256
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Your file is too large"
|
msgid "Your file is too large"
|
||||||
msgstr "Votre fichier est trop volumineux"
|
msgstr "Votre fichier est trop volumineux"
|
||||||
@@ -370,12 +377,12 @@ msgstr "Changer le fichier"
|
|||||||
msgid "Presentation replaced"
|
msgid "Presentation replaced"
|
||||||
msgstr "Présentation remplacée"
|
msgstr "Présentation remplacée"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:256
|
#: lib/claper_web/live/event_live/manage.html.heex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit poll"
|
msgid "Edit poll"
|
||||||
msgstr "Modifier le sondage"
|
msgstr "Modifier le sondage"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:255
|
#: lib/claper_web/live/event_live/manage.html.heex:292
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "New poll"
|
msgid "New poll"
|
||||||
msgstr "Nouveau sondage"
|
msgstr "Nouveau sondage"
|
||||||
@@ -385,18 +392,18 @@ msgstr "Nouveau sondage"
|
|||||||
msgid "Title of your poll"
|
msgid "Title of your poll"
|
||||||
msgstr "Titre de votre sondage"
|
msgstr "Titre de votre sondage"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/event_form_component.ex:230
|
#: lib/claper_web/live/event_live/event_form_component.ex:258
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload failed"
|
msgid "Upload failed"
|
||||||
msgstr "Échec du chargement"
|
msgstr "Échec du chargement"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:176
|
#: lib/claper_web/live/event_live/manage.html.heex:180
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add poll to know opinion of your public."
|
msgid "Add poll to know opinion of your public."
|
||||||
msgstr "Ajoutez un sondage pour connaître l'opinion de votre public."
|
msgstr "Ajoutez un sondage pour connaître l'opinion de votre public."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:174
|
#: lib/claper_web/live/event_live/manage.html.heex:177
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:395
|
#: lib/claper_web/live/event_live/manage.html.heex:461
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Poll"
|
msgid "Poll"
|
||||||
msgstr "Sondage"
|
msgstr "Sondage"
|
||||||
@@ -419,8 +426,8 @@ msgstr "Sondage actuel"
|
|||||||
msgid "See current poll"
|
msgid "See current poll"
|
||||||
msgstr "Voir le sondage"
|
msgstr "Voir le sondage"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/poll_component.ex:107
|
#: lib/claper_web/live/event_live/poll_component.ex:123
|
||||||
#: lib/claper_web/live/event_live/poll_component.ex:115
|
#: lib/claper_web/live/event_live/poll_component.ex:131
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Vote"
|
msgid "Vote"
|
||||||
msgstr "Voter"
|
msgstr "Voter"
|
||||||
@@ -441,8 +448,9 @@ msgstr "Adresse email"
|
|||||||
msgid "Present/Customize"
|
msgid "Present/Customize"
|
||||||
msgstr "Présenter/Personnaliser"
|
msgstr "Présenter/Personnaliser"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:408
|
#: lib/claper_web/live/event_live/manage.html.heex:479
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:484
|
#: lib/claper_web/live/event_live/manage.html.heex:561
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:635
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr "Actif"
|
msgstr "Actif"
|
||||||
@@ -452,12 +460,12 @@ msgstr "Actif"
|
|||||||
msgid "Changing your file will remove all interaction elements like polls associated."
|
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."
|
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:584
|
#: lib/claper_web/live/event_live/manage.html.heex:752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages from attendees will appear here."
|
msgid "Messages from attendees will appear here."
|
||||||
msgstr "Les messages des participants apparaîtront ici."
|
msgstr "Les messages des participants apparaîtront ici."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:770
|
#: lib/claper_web/live/event_live/manage.html.heex:1170
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "On screen settings"
|
msgid "On screen settings"
|
||||||
msgstr "Paramètres écran"
|
msgstr "Paramètres écran"
|
||||||
@@ -472,29 +480,30 @@ msgstr "Traitement de votre fichier..."
|
|||||||
msgid "This will delete all responses associated and the poll itself, are you sure?"
|
msgid "This will delete all responses associated and the poll itself, are you sure?"
|
||||||
msgstr "Cela supprimera toutes les réponses associées et le sondage lui-même, êtes-vous sûr ?"
|
msgstr "Cela supprimera toutes les réponses associées et le sondage lui-même, êtes-vous sûr ?"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:112
|
#: lib/claper_web/live/event_live/manage.html.heex:113
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Start"
|
msgid "Start"
|
||||||
msgstr "Démarrer"
|
msgstr "Démarrer"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:88
|
#: lib/claper_web/live/event_live/manage.html.heex:89
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Press <strong>F</strong> in the presentation window to enable fullscreen"
|
msgid "Press <strong>F</strong> in the presentation window to enable fullscreen"
|
||||||
msgstr "Appuyez sur <strong>F</strong> dans la fenêtre de présentation pour activer le plein écran"
|
msgstr "Appuyez sur <strong>F</strong> dans la fenêtre de présentation pour activer le plein écran"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:298
|
#: lib/claper_web/live/event_live/show.html.heex:316
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Ask, comment..."
|
msgid "Ask, comment..."
|
||||||
msgstr "Questionnez, commentez..."
|
msgstr "Questionnez, commentez..."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:556
|
#: lib/claper_web/live/event_live/manage.html.heex:710
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:71
|
#: lib/claper_web/live/stat_live/index.html.heex:71
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages"
|
msgid "Messages"
|
||||||
msgstr "Messages"
|
msgstr "Messages"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:416
|
#: lib/claper_web/live/event_live/manage.html.heex:487
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:492
|
#: lib/claper_web/live/event_live/manage.html.heex:569
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:643
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Set active"
|
msgid "Set active"
|
||||||
msgstr "Activer"
|
msgstr "Activer"
|
||||||
@@ -519,6 +528,7 @@ msgstr "Le site est en cours de maintenance, nous serons de retour très bientô
|
|||||||
msgid "Facilitators can present and manage interactions"
|
msgid "Facilitators can present and manage interactions"
|
||||||
msgstr "Les animateurs peuvent présenter et gérer les interactions"
|
msgstr "Les animateurs peuvent présenter et gérer les interactions"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:45
|
||||||
#: lib/claper_web/templates/user_notifier/change.html.heex:42
|
#: lib/claper_web/templates/user_notifier/change.html.heex:42
|
||||||
#: lib/claper_web/templates/user_notifier/magic.html.heex:42
|
#: lib/claper_web/templates/user_notifier/magic.html.heex:42
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -530,26 +540,30 @@ msgstr "Si vous rencontrez des difficultés avec le bouton ci-dessus, copiez et
|
|||||||
msgid "You can change your email by visiting the URL below"
|
msgid "You can change your email by visiting the URL below"
|
||||||
msgstr "Vous pouvez modifier votre email en visitant l'URL ci-dessous"
|
msgstr "Vous pouvez modifier votre email en visitant l'URL ci-dessous"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:525
|
#: lib/claper_web/live/event_live/manage.html.heex:678
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Add interaction"
|
msgid "Add interaction"
|
||||||
msgstr "Ajouter une interaction"
|
msgstr "Ajouter une interaction"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:607
|
#: lib/claper_web/live/event_live/manage.html.heex:797
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:622
|
#: lib/claper_web/live/event_live/manage.html.heex:826
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:972
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:1001
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
msgid "Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
|
||||||
msgstr "Bloquer cet utilisateur supprimera tous ses messages et il ne pourra pas rejoindre à nouveau, confirmer ?"
|
msgstr "Bloquer cet utilisateur supprimera tous ses messages et il ne pourra pas rejoindre à nouveau, confirmer ?"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.ex:50
|
#: lib/claper_web/live/event_live/show.ex:50
|
||||||
#: lib/claper_web/live/event_live/show.ex:197
|
#: lib/claper_web/live/event_live/show.ex:198
|
||||||
#: lib/claper_web/live/event_live/show.ex:212
|
#: lib/claper_web/live/event_live/show.ex:213
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You have been banned from this event"
|
msgid "You have been banned from this event"
|
||||||
msgstr "Vous avez été banni de cet événement"
|
msgstr "Vous avez été banni de cet événement"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:601
|
#: lib/claper_web/live/event_live/manage.html.heex:791
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:616
|
#: lib/claper_web/live/event_live/manage.html.heex:820
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:966
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:995
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Ban"
|
msgid "Ban"
|
||||||
msgstr "Bannir"
|
msgstr "Bannir"
|
||||||
@@ -645,7 +659,7 @@ msgstr "Événement"
|
|||||||
msgid "Interactions history"
|
msgid "Interactions history"
|
||||||
msgstr "Historique des interactions"
|
msgstr "Historique des interactions"
|
||||||
|
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:260
|
#: lib/claper_web/live/stat_live/index.html.heex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No messages has been sent"
|
msgid "No messages has been sent"
|
||||||
msgstr "Aucun message n'a été envoyé"
|
msgstr "Aucun message n'a été envoyé"
|
||||||
@@ -706,19 +720,20 @@ msgstr "Connexion"
|
|||||||
msgid "Connect to your account"
|
msgid "Connect to your account"
|
||||||
msgstr "Connectez-vous à votre compte"
|
msgstr "Connectez-vous à votre compte"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:423
|
#: lib/claper_web/live/event_live/show.html.heex:441
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Or use the code:"
|
msgid "Or use the code:"
|
||||||
msgstr "Ou utilisez le code:"
|
msgstr "Ou utilisez le code:"
|
||||||
|
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:51
|
#: lib/claper_web/templates/user_registration/new.html.heex:51
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:73
|
#: lib/claper_web/templates/user_session/new.html.heex:77
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Créer un compte"
|
msgstr "Créer un compte"
|
||||||
|
|
||||||
#: lib/claper_web/live/user_settings_live/show.html.heex:116
|
#: lib/claper_web/live/user_settings_live/show.html.heex:116
|
||||||
#: lib/claper_web/templates/user_registration/new.html.heex:42
|
#: lib/claper_web/templates/user_registration/new.html.heex:42
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:34
|
||||||
#: lib/claper_web/templates/user_session/new.html.heex:57
|
#: lib/claper_web/templates/user_session/new.html.heex:57
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
@@ -767,7 +782,7 @@ msgstr[0] "Champ %{count}"
|
|||||||
msgstr[1] "Champ %{count}"
|
msgstr[1] "Champ %{count}"
|
||||||
msgstr[2] "Champ %{count}"
|
msgstr[2] "Champ %{count}"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:213
|
#: lib/claper_web/live/event_live/manage.html.heex:219
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add form to collect data from your public."
|
msgid "Add form to collect data from your public."
|
||||||
msgstr "Ajoutez un formulaire pour recueillir les données de votre public."
|
msgstr "Ajoutez un formulaire pour recueillir les données de votre public."
|
||||||
@@ -777,34 +792,34 @@ msgstr "Ajoutez un formulaire pour recueillir les données de votre public."
|
|||||||
msgid "Current form"
|
msgid "Current form"
|
||||||
msgstr "Sondage actuel"
|
msgstr "Sondage actuel"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:277
|
#: lib/claper_web/live/event_live/manage.html.heex:314
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Edit form"
|
msgid "Edit form"
|
||||||
msgstr "Modifier"
|
msgstr "Modifier"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:211
|
#: lib/claper_web/live/event_live/manage.html.heex:216
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:471
|
#: lib/claper_web/live/event_live/manage.html.heex:543
|
||||||
#: lib/claper_web/live/stat_live/index.html.heex:215
|
#: lib/claper_web/live/stat_live/index.html.heex:215
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form"
|
msgid "Form"
|
||||||
msgstr "Formulaire"
|
msgstr "Formulaire"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:559
|
#: lib/claper_web/live/event_live/manage.html.heex:722
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form submissions"
|
msgid "Form submissions"
|
||||||
msgstr "Soumissions de formulaire"
|
msgstr "Soumissions de formulaire"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:711
|
#: lib/claper_web/live/event_live/manage.html.heex:1104
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Form submissions from attendees will appear here."
|
msgid "Form submissions from attendees will appear here."
|
||||||
msgstr "Les formulaires soumis par les participants apparaîtront ici."
|
msgstr "Les formulaires soumis par les participants apparaîtront ici."
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:456
|
#: lib/claper_web/live/event_live/manage.ex:649
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nom"
|
msgstr "Nom"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:276
|
#: lib/claper_web/live/event_live/manage.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "New form"
|
msgid "New form"
|
||||||
msgstr "Nouveau formulaire"
|
msgstr "Nouveau formulaire"
|
||||||
@@ -819,7 +834,7 @@ msgstr "Aucun formulaire n'a été envoyé"
|
|||||||
msgid "See current form"
|
msgid "See current form"
|
||||||
msgstr "Voir le formulaire"
|
msgstr "Voir le formulaire"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/form_component.ex:96
|
#: lib/claper_web/live/event_live/form_component.ex:97
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Soumettre"
|
msgstr "Soumettre"
|
||||||
@@ -829,7 +844,7 @@ msgstr "Soumettre"
|
|||||||
msgid "Text"
|
msgid "Text"
|
||||||
msgstr "Texte"
|
msgstr "Texte"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:736
|
#: lib/claper_web/live/event_live/manage.html.heex:1130
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "This cannot be undone, confirm ?"
|
msgid "This cannot be undone, confirm ?"
|
||||||
msgstr "Cela ne peut pas être annulé, confirmez-vous ?"
|
msgstr "Cela ne peut pas être annulé, confirmez-vous ?"
|
||||||
@@ -869,22 +884,22 @@ msgstr "Sélectionner une ou plusieurs options"
|
|||||||
msgid "Multiple answers"
|
msgid "Multiple answers"
|
||||||
msgstr "Réponses multiples"
|
msgstr "Réponses multiples"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:244
|
#: lib/claper_web/live/event_live/manage.html.heex:281
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import all interactions from another presentation"
|
msgid "Import all interactions from another presentation"
|
||||||
msgstr "Importer toutes les interactions d'une autre présentation"
|
msgstr "Importer toutes les interactions d'une autre présentation"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:183
|
#: lib/claper_web/live/event_live/manage.ex:226
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Interactions import failed"
|
msgid "Interactions import failed"
|
||||||
msgstr "Échec de l'importation d'interactions"
|
msgstr "Échec de l'importation d'interactions"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.ex:176
|
#: lib/claper_web/live/event_live/manage.ex:219
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Interactions imported successfully"
|
msgid "Interactions imported successfully"
|
||||||
msgstr "Interactions importées avec succès"
|
msgstr "Interactions importées avec succès"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:295
|
#: lib/claper_web/live/event_live/manage.html.heex:354
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Select presentation"
|
msgid "Select presentation"
|
||||||
msgstr "Sélectionnez la présentation"
|
msgstr "Sélectionnez la présentation"
|
||||||
@@ -894,70 +909,70 @@ msgstr "Sélectionnez la présentation"
|
|||||||
msgid "PDF, PPT, PPTX up to %{size} MB"
|
msgid "PDF, PPT, PPTX up to %{size} MB"
|
||||||
msgstr "PDF, PPT, PPTX jusqu'à %{size} MB"
|
msgstr "PDF, PPT, PPTX jusqu'à %{size} MB"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:796
|
#: lib/claper_web/live/event_live/manage.html.heex:1215
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Attendees settings"
|
msgid "Attendees settings"
|
||||||
msgstr "Paramètres participants"
|
msgstr "Paramètres participants"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:800
|
#: lib/claper_web/live/event_live/manage.html.heex:1224
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Enable messages"
|
msgid "Enable messages"
|
||||||
msgstr "Activer messages"
|
msgstr "Activer messages"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:777
|
#: lib/claper_web/live/event_live/manage.html.heex:1179
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show instructions"
|
msgid "Show instructions"
|
||||||
msgstr "Afficher instructions"
|
msgstr "Afficher instructions"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:782
|
#: lib/claper_web/live/event_live/manage.html.heex:1188
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show messages"
|
msgid "Show messages"
|
||||||
msgstr "Afficher messages"
|
msgstr "Afficher messages"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:791
|
#: lib/claper_web/live/event_live/manage.html.heex:1209
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show poll results"
|
msgid "Show poll results"
|
||||||
msgstr "Afficher résultats sondage"
|
msgstr "Afficher résultats sondage"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:318
|
#: lib/claper_web/live/event_live/show.html.heex:336
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Messages deactivated"
|
msgid "Messages deactivated"
|
||||||
msgstr "Messages désactivés"
|
msgstr "Messages désactivés"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:161
|
#: lib/claper_web/live/event_live/show.html.heex:179
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:182
|
#: lib/claper_web/live/event_live/show.html.heex:200
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:282
|
#: lib/claper_web/live/event_live/show.html.heex:300
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Anonymous"
|
msgid "Anonymous"
|
||||||
msgstr "Anonyme"
|
msgstr "Anonyme"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:208
|
#: lib/claper_web/live/event_live/show.html.heex:226
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Fermer"
|
msgstr "Fermer"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/manage.html.heex:808
|
#: lib/claper_web/live/event_live/manage.html.heex:1234
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Enable anonymous messages"
|
msgid "Enable anonymous messages"
|
||||||
msgstr "Activer messages anonymes"
|
msgstr "Activer messages anonymes"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:189
|
#: lib/claper_web/live/event_live/show.html.heex:207
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:234
|
#: lib/claper_web/live/event_live/show.html.heex:252
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr "Entrer votre nom"
|
msgstr "Entrer votre nom"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/presenter.html.heex:33
|
#: lib/claper_web/live/event_live/presenter.html.heex:38
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Or go to %{url} and use the code:"
|
msgid "Or go to %{url} and use the code:"
|
||||||
msgstr "Ou allez sur %{url} et utilisez le code:"
|
msgstr "Ou allez sur %{url} et utilisez le code:"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:202
|
#: lib/claper_web/live/event_live/show.html.heex:220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Use your name"
|
msgid "Use your name"
|
||||||
msgstr "Utiliser votre nom"
|
msgstr "Utiliser votre nom"
|
||||||
|
|
||||||
#: lib/claper_web/live/event_live/show.html.heex:182
|
#: lib/claper_web/live/event_live/show.html.heex:200
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr "désactivé"
|
msgstr "désactivé"
|
||||||
@@ -966,3 +981,168 @@ msgstr "désactivé"
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Account creation is disabled"
|
msgid "Account creation is disabled"
|
||||||
msgstr "La création de compte est désactivée"
|
msgstr "La création de compte est désactivée"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:250
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Add a Youtube video or any web content."
|
||||||
|
msgstr "Ajoutez une vidéo Youtube ou tout autre contenu web."
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:51
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Confirm new password"
|
||||||
|
msgstr "Confirmer le nouveau mot de passe"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_session/new.html.heex:72
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Forgot your password?"
|
||||||
|
msgstr "Mot de passe oublié ?"
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:26
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "If your email is in our system, you'll receive instructions to reset your password shortly."
|
||||||
|
msgstr "Si votre adresse électronique se trouve dans notre système, vous recevrez sous peu des instructions pour réinitialiser votre mot de passe."
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:42
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Password confirmation"
|
||||||
|
msgstr "Confirmation du mot de passe"
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:44
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Password updated successfully."
|
||||||
|
msgstr "Le mot de passe a été mis à jour."
|
||||||
|
|
||||||
|
#: lib/claper_web/controllers/user_reset_password_controller.ex:59
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Reset password link is invalid or it has expired."
|
||||||
|
msgstr "Le lien de réinitialisation du mot de passe n'est pas valide ou a expiré."
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/edit.html.heex:12
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:12
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Reset your password"
|
||||||
|
msgstr "Changer votre mot de passe"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/user_reset_password/new.html.heex:41
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Send link to reset password"
|
||||||
|
msgstr "Envoyer le lien pour réinitialiser le mot de passe"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:38
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Attendee can view the web content on their device"
|
||||||
|
msgstr "Le participant peut voir le contenu web sur son appareil"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/embed_component.ex:59
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Current web content"
|
||||||
|
msgstr "Contenu web actuel"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:335
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Edit web content"
|
||||||
|
msgstr "Modifier le contenu web"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:334
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "New web content"
|
||||||
|
msgstr "Nouveau contenu web"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/embed_component.ex:36
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "See current web content"
|
||||||
|
msgstr "Voir le contenu web actuel"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:25
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "The iframe component"
|
||||||
|
msgstr "Le composant iframe"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:62
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "This will delete the web content, are you sure?"
|
||||||
|
msgstr "Cela supprimera le contenu web, êtes-vous sûr?"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/embed_live/form_component.html.heex:14
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Titre"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:248
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:618
|
||||||
|
#: lib/claper_web/live/stat_live/index.html.heex:257
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Web content"
|
||||||
|
msgstr "Contenu web"
|
||||||
|
|
||||||
|
#: lib/claper/embeds/embed.ex:38
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Invalid embed format (should start with <iframe> and end with </iframe>)"
|
||||||
|
msgstr "Format d'intégration invalide (doit commencer par <iframe> et se terminer par </iframe>)"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:781
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:810
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:956
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:985
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pin"
|
||||||
|
msgstr "Épingler"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:59
|
||||||
|
#: lib/claper_web/live/event_live/post_component.ex:175
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pinned"
|
||||||
|
msgstr "Épinglé"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:714
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Pinned messages"
|
||||||
|
msgstr "Messages épinglés"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:925
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pinned messages will appear here."
|
||||||
|
msgstr "Les messages épinglés apparaîtront ici."
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:1198
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Show only pinned messages"
|
||||||
|
msgstr "Afficher uniquement les messages épinglés"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:779
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:808
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:954
|
||||||
|
#: lib/claper_web/live/event_live/manage.html.heex:983
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Unpin"
|
||||||
|
msgstr "Détacher"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:35
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Login or create account"
|
||||||
|
msgstr "Connectez-vous ou créez un compte"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:22
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Someone invited you to manage the event: %{name}"
|
||||||
|
msgstr "Quelqu'un vous a invité à gérer l'événement : %{name}"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:25
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "To accept the invitation, please login or create an account with this email: %{email}"
|
||||||
|
msgstr "Pour accepter l'invitation, veuillez vous connecter ou créer un compte avec cette adresse e-mail : %{email}"
|
||||||
|
|
||||||
|
#: lib/claper_web/templates/leader_notifier/invitation.html.heex:17
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "You have been invited"
|
||||||
|
msgstr "Vous avez été invité"
|
||||||
|
|
||||||
|
#: lib/claper_web/notifiers/leader_notifier.ex:12
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "You have been invited to manage an event"
|
||||||
|
msgstr "Vous avez été invité à gérer un événement"
|
||||||
|
|
||||||
|
#: lib/claper_web/live/event_live/form_component.ex:103
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Saved"
|
||||||
|
msgstr "Enregistré"
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
defmodule Claper.Repo.Migrations.AddPinnedToPostsAndPresentationStates do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:presentation_states) do
|
||||||
|
add :show_only_pinned, :boolean, default: false
|
||||||
|
end
|
||||||
|
|
||||||
|
alter table(:posts) do
|
||||||
|
add :pinned, :boolean, default: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
16
priv/repo/migrations/20231028144823_create_embeds.exs
Normal file
16
priv/repo/migrations/20231028144823_create_embeds.exs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
defmodule Claper.Repo.Migrations.CreateEmbeds do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
create table(:embeds) do
|
||||||
|
add :title, :string, null: false
|
||||||
|
add :content, :text, null: false
|
||||||
|
add :position, :integer, default: 0
|
||||||
|
add :enabled, :boolean, default: true
|
||||||
|
add :attendee_visibility, :boolean, default: false
|
||||||
|
add :presentation_file_id, references(:presentation_files, on_delete: :nilify_all)
|
||||||
|
|
||||||
|
timestamps()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
99
test/claper/embeds_test.exs
Normal file
99
test/claper/embeds_test.exs
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
defmodule Claper.EmbedsTest do
|
||||||
|
use Claper.DataCase
|
||||||
|
|
||||||
|
alias Claper.Embeds
|
||||||
|
|
||||||
|
describe "embeds" do
|
||||||
|
alias Claper.Embeds.Embed
|
||||||
|
|
||||||
|
import Claper.{EmbedsFixtures, PresentationsFixtures}
|
||||||
|
|
||||||
|
@invalid_attrs %{title: nil, content: nil}
|
||||||
|
|
||||||
|
test "list_embeds/1 returns all embeds from a presentation" do
|
||||||
|
presentation_file = presentation_file_fixture()
|
||||||
|
embed = embed_fixture(%{presentation_file_id: presentation_file.id})
|
||||||
|
|
||||||
|
assert Embeds.list_embeds(presentation_file.id) == [embed]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "list_embeds_at_position/2 returns all embeds from a presentation at a given position" do
|
||||||
|
presentation_file = presentation_file_fixture()
|
||||||
|
embed = embed_fixture(%{presentation_file_id: presentation_file.id, position: 5})
|
||||||
|
|
||||||
|
assert Embeds.list_embeds_at_position(presentation_file.id, 5) == [embed]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "get_embed!/1 returns the embed with given id" do
|
||||||
|
presentation_file = presentation_file_fixture()
|
||||||
|
|
||||||
|
embed = embed_fixture(%{presentation_file_id: presentation_file.id})
|
||||||
|
assert Embeds.get_embed!(embed.id) == embed
|
||||||
|
end
|
||||||
|
|
||||||
|
test "create_embed/1 with valid data creates a embed" do
|
||||||
|
presentation_file = presentation_file_fixture()
|
||||||
|
|
||||||
|
valid_attrs = %{
|
||||||
|
title: "some title",
|
||||||
|
content:
|
||||||
|
"<iframe src=\"https://www.youtube.com/embed/9bZkp7q19f0\" frameborder=\"0\" allowfullscreen></iframe>",
|
||||||
|
presentation_file_id: presentation_file.id,
|
||||||
|
position: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
assert {:ok, %Embed{} = embed} = Embeds.create_embed(valid_attrs)
|
||||||
|
assert embed.title == "some title"
|
||||||
|
|
||||||
|
assert embed.content ==
|
||||||
|
"<iframe src=\"https://www.youtube.com/embed/9bZkp7q19f0\" frameborder=\"0\" allowfullscreen></iframe>"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "create_embed/1 with invalid data returns error changeset" do
|
||||||
|
assert {:error, %Ecto.Changeset{}} = Embeds.create_embed(@invalid_attrs)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "update_embed/3 with valid data updates the embed" do
|
||||||
|
presentation_file = presentation_file_fixture()
|
||||||
|
embed = embed_fixture(%{presentation_file_id: presentation_file.id})
|
||||||
|
|
||||||
|
update_attrs = %{
|
||||||
|
title: "some updated title",
|
||||||
|
content:
|
||||||
|
"<iframe src=\"https://www.youtube.com/embed/9bZkp7q19f0\" frameborder=\"0\"></iframe>"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert {:ok, %Embed{} = embed} =
|
||||||
|
Embeds.update_embed(presentation_file.event_id, embed, update_attrs)
|
||||||
|
|
||||||
|
assert embed.title == "some updated title"
|
||||||
|
|
||||||
|
assert embed.content ==
|
||||||
|
"<iframe src=\"https://www.youtube.com/embed/9bZkp7q19f0\" frameborder=\"0\"></iframe>"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "update_embed/3 with invalid data returns error changeset" do
|
||||||
|
presentation_file = presentation_file_fixture()
|
||||||
|
embed = embed_fixture(%{presentation_file_id: presentation_file.id})
|
||||||
|
|
||||||
|
assert {:error, %Ecto.Changeset{}} =
|
||||||
|
Embeds.update_embed(presentation_file.event_id, embed, @invalid_attrs)
|
||||||
|
|
||||||
|
assert embed == Embeds.get_embed!(embed.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "delete_embed/2 deletes the embed" do
|
||||||
|
presentation_file = presentation_file_fixture()
|
||||||
|
embed = embed_fixture(%{presentation_file_id: presentation_file.id})
|
||||||
|
|
||||||
|
assert {:ok, %Embed{}} = Embeds.delete_embed(presentation_file.event_id, embed)
|
||||||
|
assert_raise Ecto.NoResultsError, fn -> Embeds.get_embed!(embed.id) end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "change_embed/1 returns a embed changeset" do
|
||||||
|
presentation_file = presentation_file_fixture()
|
||||||
|
embed = embed_fixture(%{presentation_file_id: presentation_file.id})
|
||||||
|
assert %Ecto.Changeset{} = Embeds.change_embed(embed)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
27
test/support/fixtures/embeds__fixtures.ex
Normal file
27
test/support/fixtures/embeds__fixtures.ex
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
defmodule Claper.EmbedsFixtures do
|
||||||
|
@moduledoc """
|
||||||
|
This module defines test helpers for creating
|
||||||
|
entities via the `Claper.Embeds` context.
|
||||||
|
"""
|
||||||
|
|
||||||
|
require Claper.UtilFixture
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Generate a embed.
|
||||||
|
"""
|
||||||
|
def embed_fixture(attrs \\ %{}, preload \\ []) do
|
||||||
|
{:ok, embed} =
|
||||||
|
attrs
|
||||||
|
|> Enum.into(%{
|
||||||
|
title: "some title",
|
||||||
|
content:
|
||||||
|
"<iframe src=\"https://www.youtube.com/embed/9bZkp7q19f0\" frameborder=\"0\" allowfullscreen></iframe>",
|
||||||
|
position: 0,
|
||||||
|
enabled: true,
|
||||||
|
attendee_visibility: true
|
||||||
|
})
|
||||||
|
|> Claper.Embeds.create_embed()
|
||||||
|
|
||||||
|
Claper.UtilFixture.merge_preload(embed, preload, %{})
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user