Compare commits
50 Commits
1276635a3e
...
0.1.16
Author | SHA1 | Date | |
---|---|---|---|
eeef7c94cd | |||
3c3391b3a6 | |||
52460024b9 | |||
48f7c8d18e | |||
571e0b65b6 | |||
7dc2047e97 | |||
f769e710d8 | |||
d09f698b71 | |||
8666f663ba | |||
22ccea893c | |||
362c406471 | |||
2a87037f06 | |||
53d0dcfb15 | |||
c892b5449b | |||
7cd9dca958 | |||
0e8ddc22c5 | |||
3671ad6199 | |||
7189c955c3 | |||
f56ecc0ba3 | |||
fdfca3f7a5 | |||
c61b2c67b7 | |||
d0d958a638 | |||
a437b5966f | |||
e2378279d7 | |||
1b49b668b3 | |||
03021614b5 | |||
50af86798a | |||
be01723be2 | |||
0a27a4ee29 | |||
e2f8ac6b78 | |||
d5e334dc09 | |||
1d6ba5960c | |||
bc29ca6c20 | |||
bf9fd4880f | |||
957e433847 | |||
edd631f520 | |||
2e1545a9f5 | |||
3e296080f5 | |||
d2ae6024ce | |||
4615a29c11 | |||
eb48ff7dc0 | |||
fcfd9857d5 | |||
c5f96a9d9d | |||
c1a0b4017f | |||
04ebe59afe | |||
50be85a1c3 | |||
994aa96a20 | |||
026bf22f60 | |||
56e6eb3609 | |||
c49140e7f5 |
12
.drone.yml
12
.drone.yml
@ -17,7 +17,7 @@ steps:
|
|||||||
- .mix
|
- .mix
|
||||||
|
|
||||||
- name: test
|
- name: test
|
||||||
image: elixir:1.14.4-alpine
|
image: elixir:1.17.0-alpine
|
||||||
environment:
|
environment:
|
||||||
TEST_DATABASE_URL: ecto://postgres:postgres@database/memex_test
|
TEST_DATABASE_URL: ecto://postgres:postgres@database/memex_test
|
||||||
HOST: testing.example.tld
|
HOST: testing.example.tld
|
||||||
@ -26,8 +26,8 @@ steps:
|
|||||||
MIX_ENV: test
|
MIX_ENV: test
|
||||||
commands:
|
commands:
|
||||||
- apk add --no-cache build-base npm git
|
- apk add --no-cache build-base npm git
|
||||||
- mix local.rebar --force --if-missing
|
- mix local.rebar --force
|
||||||
- mix local.hex --force --if-missing
|
- mix local.hex --force
|
||||||
- mix deps.get
|
- mix deps.get
|
||||||
- npm set cache .npm
|
- npm set cache .npm
|
||||||
- npm --prefix ./assets ci --no-audit --prefer-offline
|
- npm --prefix ./assets ci --no-audit --prefer-offline
|
||||||
@ -42,7 +42,8 @@ steps:
|
|||||||
repo: shibaobun/memex
|
repo: shibaobun/memex
|
||||||
purge: true
|
purge: true
|
||||||
compress: true
|
compress: true
|
||||||
platforms: linux/amd64,linux/arm/v7
|
platforms:
|
||||||
|
- linux/amd64
|
||||||
username:
|
username:
|
||||||
from_secret: docker_username
|
from_secret: docker_username
|
||||||
password:
|
password:
|
||||||
@ -59,7 +60,8 @@ steps:
|
|||||||
repo: shibaobun/memex
|
repo: shibaobun/memex
|
||||||
purge: true
|
purge: true
|
||||||
compress: true
|
compress: true
|
||||||
platforms: linux/amd64,linux/arm/v7
|
platforms:
|
||||||
|
- linux/amd64
|
||||||
username:
|
username:
|
||||||
from_secret: docker_username
|
from_secret: docker_username
|
||||||
password:
|
password:
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
elixir 1.14.4-otp-25
|
elixir 1.17.0-otp-27
|
||||||
erlang 25.3
|
erlang 27.0
|
||||||
nodejs 18.15.0
|
nodejs 22.3.0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM elixir:1.14.4-alpine AS build
|
FROM elixir:1.17.0-alpine AS build
|
||||||
|
|
||||||
# install build dependencies
|
# install build dependencies
|
||||||
RUN apk add --no-cache build-base npm git python3
|
RUN apk add --no-cache build-base npm git python3
|
||||||
@ -7,8 +7,8 @@ RUN apk add --no-cache build-base npm git python3
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# install hex + rebar
|
# install hex + rebar
|
||||||
RUN mix local.hex --force && \
|
RUN mix local.rebar --force && \
|
||||||
mix local.rebar --force
|
mix local.hex --force
|
||||||
|
|
||||||
# set build ENV
|
# set build ENV
|
||||||
ENV MIX_ENV=prod
|
ENV MIX_ENV=prod
|
||||||
@ -37,7 +37,7 @@ RUN mix do compile, release
|
|||||||
FROM alpine:latest AS app
|
FROM alpine:latest AS app
|
||||||
|
|
||||||
RUN apk upgrade --no-cache && \
|
RUN apk upgrade --no-cache && \
|
||||||
apk add --no-cache bash openssl libssl1.1 libcrypto1.1 libgcc libstdc++ ncurses-libs
|
apk add --no-cache bash openssl libssl3 libcrypto3 libgcc libstdc++ ncurses-libs
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
@ -26,16 +26,19 @@ import 'phoenix_html'
|
|||||||
import { Socket } from 'phoenix'
|
import { Socket } from 'phoenix'
|
||||||
import { LiveSocket } from 'phoenix_live_view'
|
import { LiveSocket } from 'phoenix_live_view'
|
||||||
import topbar from 'topbar'
|
import topbar from 'topbar'
|
||||||
|
|
||||||
|
import CtrlEnter from './ctrlenter'
|
||||||
import Date from './date'
|
import Date from './date'
|
||||||
import DateTime from './datetime'
|
import DateTime from './datetime'
|
||||||
import MaintainAttrs from './maintain_attrs'
|
import SanitizeTags from './sanitizetags'
|
||||||
|
import SanitizeTitles from './sanitizetitles'
|
||||||
|
|
||||||
const csrfTokenElement = document.querySelector("meta[name='csrf-token']")
|
const csrfTokenElement = document.querySelector("meta[name='csrf-token']")
|
||||||
let csrfToken
|
let csrfToken
|
||||||
if (csrfTokenElement) { csrfToken = csrfTokenElement.getAttribute('content') }
|
if (csrfTokenElement) { csrfToken = csrfTokenElement.getAttribute('content') }
|
||||||
const liveSocket = new LiveSocket('/live', Socket, {
|
const liveSocket = new LiveSocket('/live', Socket, {
|
||||||
params: { _csrf_token: csrfToken },
|
params: { _csrf_token: csrfToken },
|
||||||
hooks: { Date, DateTime, MaintainAttrs }
|
hooks: { CtrlEnter, Date, DateTime, SanitizeTags, SanitizeTitles }
|
||||||
})
|
})
|
||||||
|
|
||||||
// Show progress bar on live navigation and form submits
|
// Show progress bar on live navigation and form submits
|
||||||
|
11
assets/js/ctrlenter.js
Normal file
11
assets/js/ctrlenter.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
export default {
|
||||||
|
addFormSubmit (context) {
|
||||||
|
context.el.addEventListener('keydown', (e) => {
|
||||||
|
if (e.ctrlKey && e.key === 'Enter') {
|
||||||
|
context.el.dispatchEvent(
|
||||||
|
new Event('submit', { bubbles: true, cancelable: true }))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
mounted () { this.addFormSubmit(this) }
|
||||||
|
}
|
@ -1,22 +0,0 @@
|
|||||||
// maintain user adjusted attributes, like textbox length on phoenix liveview
|
|
||||||
// update. https://github.com/phoenixframework/phoenix_live_view/issues/1011
|
|
||||||
|
|
||||||
export default {
|
|
||||||
attrs () {
|
|
||||||
if (this.el && this.el.getAttribute('data-attrs')) {
|
|
||||||
return this.el.getAttribute('data-attrs').split(', ')
|
|
||||||
} else {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeUpdate () {
|
|
||||||
if (this.el) {
|
|
||||||
this.prevAttrs = this.attrs().map(name => [name, this.el.getAttribute(name)])
|
|
||||||
}
|
|
||||||
},
|
|
||||||
updated () {
|
|
||||||
if (this.el) {
|
|
||||||
this.prevAttrs.forEach(([name, val]) => this.el.setAttribute(name, val))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
11
assets/js/sanitizetags.js
Normal file
11
assets/js/sanitizetags.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
export default {
|
||||||
|
SanitizeTags (context) {
|
||||||
|
context.el.addEventListener('keyup', (e) => {
|
||||||
|
e.target.value = e.target.value
|
||||||
|
.replace(' ', ',')
|
||||||
|
.replace(',,', ',')
|
||||||
|
.replace(/[^a-zA-Z0-9,]/, '')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
mounted () { this.SanitizeTags(this) }
|
||||||
|
}
|
10
assets/js/sanitizetitles.js
Normal file
10
assets/js/sanitizetitles.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
export default {
|
||||||
|
SanitizeTitles (context) {
|
||||||
|
context.el.addEventListener('keyup', (e) => {
|
||||||
|
e.target.value = e.target.value
|
||||||
|
.replace(' ', '-')
|
||||||
|
.replace(/[^a-zA-Z0-9-]/, '')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
mounted () { this.SanitizeTitles(this) }
|
||||||
|
}
|
15939
assets/package-lock.json
generated
15939
assets/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -3,8 +3,8 @@
|
|||||||
"description": " ",
|
"description": " ",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "v18.15.0",
|
"node": "v22.3.0",
|
||||||
"npm": "9.5.0"
|
"npm": "10.8.1"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"deploy": "NODE_ENV=production webpack --mode production",
|
"deploy": "NODE_ENV=production webpack --mode production",
|
||||||
@ -13,35 +13,35 @@
|
|||||||
"test": "standard"
|
"test": "standard"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource/nunito-sans": "^4.5.10",
|
"@fontsource/nunito-sans": "^5.0.13",
|
||||||
"@fortawesome/fontawesome-free": "^6.4.0",
|
"@fortawesome/fontawesome-free": "^6.6.0",
|
||||||
"phoenix": "file:../deps/phoenix",
|
"phoenix": "file:../deps/phoenix",
|
||||||
"phoenix_html": "file:../deps/phoenix_html",
|
"phoenix_html": "file:../deps/phoenix_html",
|
||||||
"phoenix_live_view": "file:../deps/phoenix_live_view",
|
"phoenix_live_view": "file:../deps/phoenix_live_view",
|
||||||
"topbar": "^2.0.1"
|
"topbar": "^3.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.21.4",
|
"@babel/core": "^7.24.9",
|
||||||
"@babel/preset-env": "^7.21.4",
|
"@babel/preset-env": "^7.25.0",
|
||||||
"autoprefixer": "^10.4.14",
|
"autoprefixer": "^10.4.19",
|
||||||
"babel-loader": "^9.1.2",
|
"babel-loader": "^9.1.3",
|
||||||
"copy-webpack-plugin": "^11.0.0",
|
"copy-webpack-plugin": "^12.0.2",
|
||||||
"css-loader": "^6.7.3",
|
"css-loader": "^7.1.2",
|
||||||
"css-minimizer-webpack-plugin": "^5.0.0",
|
"css-minimizer-webpack-plugin": "^7.0.0",
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
"mini-css-extract-plugin": "^2.7.5",
|
"mini-css-extract-plugin": "^2.9.0",
|
||||||
"npm-check-updates": "^16.10.8",
|
"npm-check-updates": "^16.14.20",
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.40",
|
||||||
"postcss-import": "^15.1.0",
|
"postcss-import": "^16.1.0",
|
||||||
"postcss-loader": "^7.2.4",
|
"postcss-loader": "^8.1.1",
|
||||||
"postcss-preset-env": "^8.3.1",
|
"postcss-preset-env": "^9.6.0",
|
||||||
"sass": "^1.62.0",
|
"sass": "^1.77.8",
|
||||||
"sass-loader": "^13.2.2",
|
"sass-loader": "^16.0.0",
|
||||||
"standard": "^17.0.0",
|
"standard": "^17.1.0",
|
||||||
"tailwindcss": "^3.3.1",
|
"tailwindcss": "^3.4.7",
|
||||||
"terser-webpack-plugin": "^5.3.7",
|
"terser-webpack-plugin": "^5.3.10",
|
||||||
"webpack": "^5.79.0",
|
"webpack": "^5.93.0",
|
||||||
"webpack-cli": "^5.0.1",
|
"webpack-cli": "^5.1.4",
|
||||||
"webpack-dev-server": "^4.13.2"
|
"webpack-dev-server": "^5.0.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
38
changelog.md
38
changelog.md
@ -1,5 +1,43 @@
|
|||||||
|
# v0.1.16
|
||||||
|
- Fix empty invite index page
|
||||||
|
- Fix faq copy
|
||||||
|
- Fix issue with emails
|
||||||
|
- Update deps
|
||||||
|
|
||||||
|
# v0.1.15
|
||||||
|
- Sanitize titles while they are being typed
|
||||||
|
- Sanitize tags while they are being typed
|
||||||
|
- Remove requirement for note and content to have content
|
||||||
|
- Prevent possible additional submissions
|
||||||
|
- Fix content being displayed when blank
|
||||||
|
|
||||||
|
# v0.1.14
|
||||||
|
- Fix issue with item content not able to be displayed sometimes
|
||||||
|
|
||||||
|
# v0.1.13
|
||||||
|
- Update dependencies
|
||||||
|
- Fix debounces
|
||||||
|
- Allow space as delimiter for tags
|
||||||
|
- Add bottom padding to page
|
||||||
|
- Make pipeline step not require content
|
||||||
|
- Make content previews resizable
|
||||||
|
- Fix live flashes not dismissable by click
|
||||||
|
- Fix disconnection modal not displaying
|
||||||
|
- Submit items with ctrl-enter
|
||||||
|
- Display backlinks in pipeline description
|
||||||
|
- Modify backlink format
|
||||||
|
|
||||||
|
# v0.1.12
|
||||||
|
- Code quality fixes
|
||||||
|
- Fix error/404 pages not rendering properly
|
||||||
|
- Update dependencies
|
||||||
|
|
||||||
# v0.1.11
|
# v0.1.11
|
||||||
- Update dependencies
|
- Update dependencies
|
||||||
|
- ee cummings even more
|
||||||
|
- Improve tests
|
||||||
|
- Change invite path slightly
|
||||||
|
- Disable arm builds since ci fails to build
|
||||||
|
|
||||||
# v0.1.10
|
# v0.1.10
|
||||||
- Improve accessibility
|
- Improve accessibility
|
||||||
|
@ -18,7 +18,10 @@ config :memex, MemexWeb.Endpoint,
|
|||||||
url: [scheme: "https", host: System.get_env("HOST") || "localhost", port: "443"],
|
url: [scheme: "https", host: System.get_env("HOST") || "localhost", port: "443"],
|
||||||
http: [port: String.to_integer(System.get_env("PORT") || "4000")],
|
http: [port: String.to_integer(System.get_env("PORT") || "4000")],
|
||||||
secret_key_base: "KH59P0iZixX5gP/u+zkxxG8vAAj6vgt0YqnwEB5JP5K+E567SsqkCz69uWShjE7I",
|
secret_key_base: "KH59P0iZixX5gP/u+zkxxG8vAAj6vgt0YqnwEB5JP5K+E567SsqkCz69uWShjE7I",
|
||||||
render_errors: [view: MemexWeb.ErrorView, accepts: ~w(html json), layout: false],
|
render_errors: [
|
||||||
|
formats: [html: MemexWeb.ErrorHTML, json: MemexWeb.ErrorJSON],
|
||||||
|
layout: false
|
||||||
|
],
|
||||||
pubsub_server: Memex.PubSub,
|
pubsub_server: Memex.PubSub,
|
||||||
live_view: [signing_salt: "zOLgd3lr"]
|
live_view: [signing_salt: "zOLgd3lr"]
|
||||||
|
|
||||||
|
@ -26,10 +26,10 @@ config :memex, Memex.Mailer, adapter: Swoosh.Adapters.Test
|
|||||||
config :memex, Memex.Accounts, registration: "public"
|
config :memex, Memex.Accounts, registration: "public"
|
||||||
|
|
||||||
# Print only warnings and errors during test
|
# Print only warnings and errors during test
|
||||||
config :logger, level: :warn
|
config :logger, level: :warning
|
||||||
|
|
||||||
# Initialize plugs at runtime for faster test compilation
|
# Initialize plugs at runtime for faster test compilation
|
||||||
config :phoenix, :plug_init_mode, :runtime
|
config :phoenix, :plug_init_mode, :runtime
|
||||||
|
|
||||||
# Disable Oban
|
# Disable Oban
|
||||||
config :memex, Oban, queues: false, plugins: false
|
config :memex, Oban, queues: false, plugins: false, testing: :manual
|
||||||
|
@ -405,15 +405,15 @@ defmodule Memex.Accounts do
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> is_admin?(%User{role: :admin})
|
iex> admin?(%User{role: :admin})
|
||||||
true
|
true
|
||||||
|
|
||||||
iex> is_admin?(%User{})
|
iex> admin?(%User{})
|
||||||
false
|
false
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@spec is_admin?(User.t()) :: boolean()
|
@spec admin?(User.t()) :: boolean()
|
||||||
def is_admin?(%User{id: user_id}) do
|
def admin?(%User{id: user_id}) do
|
||||||
Repo.exists?(from u in User, where: u.id == ^user_id, where: u.role == :admin)
|
Repo.exists?(from u in User, where: u.id == ^user_id, where: u.role == :admin)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -422,16 +422,16 @@ defmodule Memex.Accounts do
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> is_already_admin?(%User{role: :admin})
|
iex> already_admin?(%User{role: :admin})
|
||||||
true
|
true
|
||||||
|
|
||||||
iex> is_already_admin?(%User{})
|
iex> already_admin?(%User{})
|
||||||
false
|
false
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@spec is_already_admin?(User.t() | nil) :: boolean()
|
@spec already_admin?(User.t() | nil) :: boolean()
|
||||||
def is_already_admin?(%User{role: :admin}), do: true
|
def already_admin?(%User{role: :admin}), do: true
|
||||||
def is_already_admin?(_invalid_user), do: false
|
def already_admin?(_invalid_user), do: false
|
||||||
|
|
||||||
## Confirmation
|
## Confirmation
|
||||||
|
|
||||||
|
@ -229,12 +229,12 @@ defmodule Memex.Contexts do
|
|||||||
context |> Context.update_changeset(attrs, user)
|
context |> Context.update_changeset(attrs, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec is_owner_or_admin?(Context.t(), User.t()) :: boolean()
|
@spec owner_or_admin?(Context.t(), User.t()) :: boolean()
|
||||||
def is_owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true
|
def owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true
|
||||||
def is_owner_or_admin?(_context, %{role: :admin}), do: true
|
def owner_or_admin?(_context, %{role: :admin}), do: true
|
||||||
def is_owner_or_admin?(_context, _other_user), do: false
|
def owner_or_admin?(_context, _other_user), do: false
|
||||||
|
|
||||||
@spec is_owner?(Context.t(), User.t()) :: boolean()
|
@spec owner?(Context.t(), User.t()) :: boolean()
|
||||||
def is_owner?(%{user_id: user_id}, %{id: user_id}), do: true
|
def owner?(%{user_id: user_id}, %{id: user_id}), do: true
|
||||||
def is_owner?(_context, _other_user), do: false
|
def owner?(_context, _other_user), do: false
|
||||||
end
|
end
|
||||||
|
@ -57,7 +57,7 @@ defmodule Memex.Contexts.Context do
|
|||||||
|> validate_format(:slug, ~r/^[\p{L}\p{N}\-]+$/,
|
|> validate_format(:slug, ~r/^[\p{L}\p{N}\-]+$/,
|
||||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||||
)
|
)
|
||||||
|> validate_required([:slug, :content, :user_id, :visibility])
|
|> validate_required([:slug, :user_id, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Repo)
|
||||||
end
|
end
|
||||||
@ -70,7 +70,7 @@ defmodule Memex.Contexts.Context do
|
|||||||
|> validate_format(:slug, ~r/^[\p{L}\p{N}\-]+$/,
|
|> validate_format(:slug, ~r/^[\p{L}\p{N}\-]+$/,
|
||||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||||
)
|
)
|
||||||
|> validate_required([:slug, :content, :visibility])
|
|> validate_required([:slug, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Repo)
|
||||||
end
|
end
|
||||||
@ -79,11 +79,11 @@ defmodule Memex.Contexts.Context do
|
|||||||
changeset
|
changeset
|
||||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
||||||
|> cast(attrs, [:tags_string])
|
|> cast(attrs, [:tags_string])
|
||||||
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\,]+$/,
|
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\, ]+$/,
|
||||||
message:
|
message:
|
||||||
dgettext(
|
dgettext(
|
||||||
"errors",
|
"errors",
|
||||||
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|> cast_tags()
|
|> cast_tags()
|
||||||
@ -98,9 +98,9 @@ defmodule Memex.Contexts.Context do
|
|||||||
|
|
||||||
defp process_tags(tags_string) when tags_string |> is_binary() do
|
defp process_tags(tags_string) when tags_string |> is_binary() do
|
||||||
tags_string
|
tags_string
|
||||||
|> String.split(",", trim: true)
|
|> String.split([",", " "], trim: true)
|
||||||
|> Enum.map(fn str -> str |> String.trim() end)
|
|> Enum.map(fn str -> str |> String.trim() end)
|
||||||
|> Enum.reject(fn str -> str |> is_nil() end)
|
|> Enum.reject(fn str -> str in [nil, ""] end)
|
||||||
|> Enum.sort()
|
|> Enum.sort()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -229,12 +229,12 @@ defmodule Memex.Notes do
|
|||||||
note |> Note.update_changeset(attrs, user)
|
note |> Note.update_changeset(attrs, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec is_owner_or_admin?(Note.t(), User.t()) :: boolean()
|
@spec owner_or_admin?(Note.t(), User.t()) :: boolean()
|
||||||
def is_owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true
|
def owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true
|
||||||
def is_owner_or_admin?(_context, %{role: :admin}), do: true
|
def owner_or_admin?(_context, %{role: :admin}), do: true
|
||||||
def is_owner_or_admin?(_context, _other_user), do: false
|
def owner_or_admin?(_context, _other_user), do: false
|
||||||
|
|
||||||
@spec is_owner?(Note.t(), User.t()) :: boolean()
|
@spec owner?(Note.t(), User.t()) :: boolean()
|
||||||
def is_owner?(%{user_id: user_id}, %{id: user_id}), do: true
|
def owner?(%{user_id: user_id}, %{id: user_id}), do: true
|
||||||
def is_owner?(_context, _other_user), do: false
|
def owner?(_context, _other_user), do: false
|
||||||
end
|
end
|
||||||
|
@ -56,7 +56,7 @@ defmodule Memex.Notes.Note do
|
|||||||
|> validate_format(:slug, ~r/^[\p{L}\p{N}\-]+$/,
|
|> validate_format(:slug, ~r/^[\p{L}\p{N}\-]+$/,
|
||||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||||
)
|
)
|
||||||
|> validate_required([:slug, :content, :user_id, :visibility])
|
|> validate_required([:slug, :user_id, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Repo)
|
||||||
end
|
end
|
||||||
@ -69,7 +69,7 @@ defmodule Memex.Notes.Note do
|
|||||||
|> validate_format(:slug, ~r/^[\p{L}\p{N}\-]+$/,
|
|> validate_format(:slug, ~r/^[\p{L}\p{N}\-]+$/,
|
||||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||||
)
|
)
|
||||||
|> validate_required([:slug, :content, :visibility])
|
|> validate_required([:slug, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Repo)
|
||||||
end
|
end
|
||||||
@ -78,11 +78,11 @@ defmodule Memex.Notes.Note do
|
|||||||
changeset
|
changeset
|
||||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
||||||
|> cast(attrs, [:tags_string])
|
|> cast(attrs, [:tags_string])
|
||||||
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\,]+$/,
|
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\, ]+$/,
|
||||||
message:
|
message:
|
||||||
dgettext(
|
dgettext(
|
||||||
"errors",
|
"errors",
|
||||||
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|> cast_tags()
|
|> cast_tags()
|
||||||
@ -97,9 +97,9 @@ defmodule Memex.Notes.Note do
|
|||||||
|
|
||||||
defp process_tags(tags_string) when tags_string |> is_binary() do
|
defp process_tags(tags_string) when tags_string |> is_binary() do
|
||||||
tags_string
|
tags_string
|
||||||
|> String.split(",", trim: true)
|
|> String.split([",", " "], trim: true)
|
||||||
|> Enum.map(fn str -> str |> String.trim() end)
|
|> Enum.map(fn str -> str |> String.trim() end)
|
||||||
|> Enum.reject(fn str -> str |> is_nil() end)
|
|> Enum.reject(fn str -> str in [nil, ""] end)
|
||||||
|> Enum.sort()
|
|> Enum.sort()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -231,12 +231,12 @@ defmodule Memex.Pipelines do
|
|||||||
pipeline |> Pipeline.update_changeset(attrs, user)
|
pipeline |> Pipeline.update_changeset(attrs, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec is_owner_or_admin?(Pipeline.t(), User.t()) :: boolean()
|
@spec owner_or_admin?(Pipeline.t(), User.t()) :: boolean()
|
||||||
def is_owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true
|
def owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true
|
||||||
def is_owner_or_admin?(_context, %{role: :admin}), do: true
|
def owner_or_admin?(_context, %{role: :admin}), do: true
|
||||||
def is_owner_or_admin?(_context, _other_user), do: false
|
def owner_or_admin?(_context, _other_user), do: false
|
||||||
|
|
||||||
@spec is_owner?(Pipeline.t(), User.t()) :: boolean()
|
@spec owner?(Pipeline.t(), User.t()) :: boolean()
|
||||||
def is_owner?(%{user_id: user_id}, %{id: user_id}), do: true
|
def owner?(%{user_id: user_id}, %{id: user_id}), do: true
|
||||||
def is_owner?(_context, _other_user), do: false
|
def owner?(_context, _other_user), do: false
|
||||||
end
|
end
|
||||||
|
@ -81,11 +81,11 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
changeset
|
changeset
|
||||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
||||||
|> cast(attrs, [:tags_string])
|
|> cast(attrs, [:tags_string])
|
||||||
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\,]+$/,
|
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\, ]+$/,
|
||||||
message:
|
message:
|
||||||
dgettext(
|
dgettext(
|
||||||
"errors",
|
"errors",
|
||||||
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|> cast_tags()
|
|> cast_tags()
|
||||||
@ -100,9 +100,9 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
|
|
||||||
defp process_tags(tags_string) when tags_string |> is_binary() do
|
defp process_tags(tags_string) when tags_string |> is_binary() do
|
||||||
tags_string
|
tags_string
|
||||||
|> String.split(",", trim: true)
|
|> String.split([",", " "], trim: true)
|
||||||
|> Enum.map(fn str -> str |> String.trim() end)
|
|> Enum.map(fn str -> str |> String.trim() end)
|
||||||
|> Enum.reject(fn str -> str |> is_nil() end)
|
|> Enum.reject(fn str -> str in [nil, ""] end)
|
||||||
|> Enum.sort()
|
|> Enum.sort()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ defmodule Memex.Pipelines.Steps.Step do
|
|||||||
%__MODULE__{}
|
%__MODULE__{}
|
||||||
|> cast(attrs, [:title, :content])
|
|> cast(attrs, [:title, :content])
|
||||||
|> change(pipeline_id: pipeline_id, user_id: user_id, position: position)
|
|> change(pipeline_id: pipeline_id, user_id: user_id, position: position)
|
||||||
|> validate_required([:title, :content, :user_id, :position])
|
|> validate_required([:title, :user_id, :position])
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec update_changeset(t(), attrs :: map(), User.t()) ::
|
@spec update_changeset(t(), attrs :: map(), User.t()) ::
|
||||||
@ -62,7 +62,7 @@ defmodule Memex.Pipelines.Steps.Step do
|
|||||||
) do
|
) do
|
||||||
step
|
step
|
||||||
|> cast(attrs, [:title, :content])
|
|> cast(attrs, [:title, :content])
|
||||||
|> validate_required([:title, :content, :user_id, :position])
|
|> validate_required([:title, :user_id, :position])
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec position_changeset(t(), position :: non_neg_integer(), User.t()) :: changeset()
|
@spec position_changeset(t(), position :: non_neg_integer(), User.t()) :: changeset()
|
||||||
@ -73,6 +73,6 @@ defmodule Memex.Pipelines.Steps.Step do
|
|||||||
) do
|
) do
|
||||||
step
|
step
|
||||||
|> change(position: position)
|
|> change(position: position)
|
||||||
|> validate_required([:title, :content, :user_id, :position])
|
|> validate_required([:title, :user_id, :position])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -69,6 +69,7 @@ defmodule MemexWeb do
|
|||||||
|
|
||||||
def html do
|
def html do
|
||||||
quote do
|
quote do
|
||||||
|
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
|
||||||
use Phoenix.Component
|
use Phoenix.Component
|
||||||
|
|
||||||
# Import convenience functions from controllers
|
# Import convenience functions from controllers
|
||||||
@ -82,11 +83,8 @@ defmodule MemexWeb do
|
|||||||
|
|
||||||
defp html_helpers do
|
defp html_helpers do
|
||||||
quote do
|
quote do
|
||||||
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
|
use PhoenixHTMLHelpers
|
||||||
use Phoenix.HTML
|
import Phoenix.{Component, HTML, HTML.Form}
|
||||||
|
|
||||||
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
|
|
||||||
import Phoenix.Component
|
|
||||||
import MemexWeb.{ErrorHelpers, Gettext, CoreComponents, HTMLHelpers}
|
import MemexWeb.{ErrorHelpers, Gettext, CoreComponents, HTMLHelpers}
|
||||||
|
|
||||||
# Shortcut for generating JS commands
|
# Shortcut for generating JS commands
|
||||||
|
@ -2,14 +2,14 @@ defmodule MemexWeb.CoreComponents do
|
|||||||
@moduledoc """
|
@moduledoc """
|
||||||
Provides core UI components.
|
Provides core UI components.
|
||||||
"""
|
"""
|
||||||
|
use PhoenixHTMLHelpers
|
||||||
use Phoenix.Component
|
use Phoenix.Component
|
||||||
use MemexWeb, :verified_routes
|
use MemexWeb, :verified_routes
|
||||||
|
|
||||||
import MemexWeb.{Gettext, HTMLHelpers}
|
import MemexWeb.{Gettext, HTMLHelpers}
|
||||||
alias Memex.{Accounts, Accounts.Invite, Accounts.User}
|
alias Memex.{Accounts, Accounts.Invite, Accounts.User}
|
||||||
alias Memex.Contexts.Context
|
alias Memex.Contexts.Context
|
||||||
alias Memex.Notes.Note
|
alias Memex.Notes.Note
|
||||||
alias Memex.Pipelines.Steps.Step
|
alias Memex.Pipelines.{Pipeline, Steps.Step}
|
||||||
alias Phoenix.HTML
|
alias Phoenix.HTML
|
||||||
alias Phoenix.LiveView.JS
|
alias Phoenix.LiveView.JS
|
||||||
|
|
||||||
@ -131,53 +131,126 @@ defmodule MemexWeb.CoreComponents do
|
|||||||
|
|
||||||
def step_content(assigns)
|
def step_content(assigns)
|
||||||
|
|
||||||
defp add_links_to_content(content, data_qa_prefix) do
|
attr :pipeline, Pipeline, required: true
|
||||||
# replace links
|
|
||||||
|
|
||||||
# link regex from
|
def pipeline_content(assigns)
|
||||||
# https://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url
|
|
||||||
# and modified with additional schemes from
|
|
||||||
# https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
|
|
||||||
|
|
||||||
content =
|
defp display_links(record) do
|
||||||
Regex.replace(
|
record
|
||||||
~r<((file|git|https?|ipfs|ipns|irc|jabber|magnet|mailto|mumble|tel|udp|xmpp):\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*))>,
|
|> get_content()
|
||||||
content,
|
|> replace_hyperlinks(record)
|
||||||
fn _whole_match, link ->
|
|> replace_triple_links(record)
|
||||||
link =
|
|> replace_double_links(record)
|
||||||
HTML.Link.link(
|
|> replace_single_links(record)
|
||||||
link,
|
|> HTML.raw()
|
||||||
to: link,
|
end
|
||||||
class: "link inline",
|
|
||||||
target: "_blank",
|
|
||||||
rel: "noopener noreferrer"
|
|
||||||
)
|
|
||||||
|> HTML.Safe.to_iodata()
|
|
||||||
|> IO.iodata_to_binary()
|
|
||||||
|
|
||||||
"</p>#{link}<p class=\"inline\">"
|
defp get_content(%{content: content}), do: content |> get_text()
|
||||||
end
|
defp get_content(%{description: description}), do: description |> get_text()
|
||||||
)
|
defp get_content(_fallthrough), do: nil |> get_text()
|
||||||
|
|
||||||
content =
|
defp get_text(string) when is_binary(string), do: string
|
||||||
Regex.replace(
|
defp get_text(_fallthrough), do: ""
|
||||||
~r/\[\[([\p{L}\p{N}\-]+)\]\]/,
|
|
||||||
content,
|
|
||||||
fn _whole_match, slug ->
|
|
||||||
link =
|
|
||||||
HTML.Link.link(
|
|
||||||
"[[#{slug}]]",
|
|
||||||
to: ~p"/note/#{slug}",
|
|
||||||
class: "link inline",
|
|
||||||
data: [qa: "#{data_qa_prefix}-#{slug}"]
|
|
||||||
)
|
|
||||||
|> HTML.Safe.to_iodata()
|
|
||||||
|> IO.iodata_to_binary()
|
|
||||||
|
|
||||||
"</p>#{link}<p class=\"inline\">"
|
# replaces hyperlinks like https://bubbletea.dev
|
||||||
end
|
#
|
||||||
)
|
# link regex from
|
||||||
|
# https://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url
|
||||||
|
# and modified with additional schemes from
|
||||||
|
# https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
|
||||||
|
defp replace_hyperlinks(content, _record) do
|
||||||
|
Regex.replace(
|
||||||
|
~r<((file|git|https?|ipfs|ipns|irc|jabber|magnet|mailto|mumble|tel|udp|xmpp):\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*))>,
|
||||||
|
content,
|
||||||
|
fn _whole_match, link ->
|
||||||
|
link =
|
||||||
|
link(
|
||||||
|
link,
|
||||||
|
to: link,
|
||||||
|
class: "link inline",
|
||||||
|
target: "_blank",
|
||||||
|
rel: "noopener noreferrer"
|
||||||
|
)
|
||||||
|
|> HTML.Safe.to_iodata()
|
||||||
|
|> IO.iodata_to_binary()
|
||||||
|
|
||||||
content |> HTML.raw()
|
"</p>#{link}<p class=\"inline\">"
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# replaces triple links like [[[slug-title]]]
|
||||||
|
defp replace_triple_links(content, _record) do
|
||||||
|
Regex.replace(
|
||||||
|
~r/(^|[^\[])\[\[\[([\p{L}\p{N}\-]+)\]\]\]($|[^\]])/,
|
||||||
|
content,
|
||||||
|
fn _whole_match, prefix, slug, suffix ->
|
||||||
|
link =
|
||||||
|
link(
|
||||||
|
"[[[#{slug}]]]",
|
||||||
|
to: ~p"/note/#{slug}",
|
||||||
|
class: "link inline"
|
||||||
|
)
|
||||||
|
|> HTML.Safe.to_iodata()
|
||||||
|
|> IO.iodata_to_binary()
|
||||||
|
|
||||||
|
"#{prefix}</p>#{link}<p class=\"inline\">#{suffix}"
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# replaces double links like [[slug-title]]
|
||||||
|
defp replace_double_links(content, record) do
|
||||||
|
Regex.replace(
|
||||||
|
~r/(^|[^\[])\[\[([\p{L}\p{N}\-]+)\]\]($|[^\]])/,
|
||||||
|
content,
|
||||||
|
fn _whole_match, prefix, slug, suffix ->
|
||||||
|
target =
|
||||||
|
case record do
|
||||||
|
%Pipeline{} -> ~p"/context/#{slug}"
|
||||||
|
%Step{} -> ~p"/context/#{slug}"
|
||||||
|
_context -> ~p"/note/#{slug}"
|
||||||
|
end
|
||||||
|
|
||||||
|
link =
|
||||||
|
link(
|
||||||
|
"[[#{slug}]]",
|
||||||
|
to: target,
|
||||||
|
class: "link inline"
|
||||||
|
)
|
||||||
|
|> HTML.Safe.to_iodata()
|
||||||
|
|> IO.iodata_to_binary()
|
||||||
|
|
||||||
|
"#{prefix}</p>#{link}<p class=\"inline\">#{suffix}"
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# replaces single links like [slug-title]
|
||||||
|
defp replace_single_links(content, record) do
|
||||||
|
Regex.replace(
|
||||||
|
~r/(^|[^\[])\[([\p{L}\p{N}\-]+)\]($|[^\]])/,
|
||||||
|
content,
|
||||||
|
fn _whole_match, prefix, slug, suffix ->
|
||||||
|
target =
|
||||||
|
case record do
|
||||||
|
%Pipeline{} -> ~p"/pipeline/#{slug}"
|
||||||
|
%Step{} -> ~p"/pipeline/#{slug}"
|
||||||
|
%Context{} -> ~p"/context/#{slug}"
|
||||||
|
_note -> ~p"/note/#{slug}"
|
||||||
|
end
|
||||||
|
|
||||||
|
link =
|
||||||
|
link(
|
||||||
|
"[#{slug}]",
|
||||||
|
to: target,
|
||||||
|
class: "link inline"
|
||||||
|
)
|
||||||
|
|> HTML.Safe.to_iodata()
|
||||||
|
|> IO.iodata_to_binary()
|
||||||
|
|
||||||
|
"#{prefix}</p>#{link}<p class=\"inline\">#{suffix}"
|
||||||
|
end
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<div
|
<div
|
||||||
|
:if={@context.content}
|
||||||
id={"show-context-content-#{@context.id}"}
|
id={"show-context-content-#{@context.id}"}
|
||||||
class="input input-primary h-128 min-h-128 inline-block whitespace-pre-wrap overflow-x-hidden overflow-y-auto"
|
class="input input-primary h-128 min-h-128 inline-block whitespace-pre-wrap overflow-x-hidden overflow-y-auto resize-y"
|
||||||
phx-hook="MaintainAttrs"
|
|
||||||
phx-update="ignore"
|
phx-update="ignore"
|
||||||
readonly
|
readonly
|
||||||
phx-no-format
|
phx-no-format
|
||||||
><p class="inline"><%= add_links_to_content(@context.content, "context-note") %></p></div>
|
><p class="inline"><%= display_links(@context) %></p></div>
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<div
|
<div
|
||||||
|
:if={@note.content}
|
||||||
id={"show-note-content-#{@note.id}"}
|
id={"show-note-content-#{@note.id}"}
|
||||||
class="input input-primary h-128 min-h-128 inline-block whitespace-pre-wrap overflow-x-hidden overflow-y-auto"
|
class="input input-primary h-128 min-h-128 inline-block whitespace-pre-wrap overflow-x-hidden overflow-y-auto resize-y"
|
||||||
phx-hook="MaintainAttrs"
|
|
||||||
phx-update="ignore"
|
phx-update="ignore"
|
||||||
readonly
|
readonly
|
||||||
phx-no-format
|
phx-no-format
|
||||||
><p class="inline"><%= add_links_to_content(@note.content, "note-link") %></p></div>
|
><p class="inline"><%= display_links(@note) %></p></div>
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
<div
|
||||||
|
:if={@pipeline.description}
|
||||||
|
id={"show-pipeline-description-#{@pipeline.id}"}
|
||||||
|
class="input input-primary h-32 min-h-32 inline-block whitespace-pre-wrap overflow-x-hidden overflow-y-auto resize-y"
|
||||||
|
phx-update="ignore"
|
||||||
|
readonly
|
||||||
|
phx-no-format
|
||||||
|
><p class="inline"><%= display_links(@pipeline) %></p></div>
|
@ -1,8 +1,8 @@
|
|||||||
<div
|
<div
|
||||||
|
:if={@step.content}
|
||||||
id={"show-step-content-#{@step.id}"}
|
id={"show-step-content-#{@step.id}"}
|
||||||
class="input input-primary h-32 min-h-32 inline-block whitespace-pre-wrap overflow-x-hidden overflow-y-auto"
|
class="input input-primary h-32 min-h-32 inline-block whitespace-pre-wrap overflow-x-hidden overflow-y-auto resize-y"
|
||||||
phx-hook="MaintainAttrs"
|
|
||||||
phx-update="ignore"
|
phx-update="ignore"
|
||||||
readonly
|
readonly
|
||||||
phx-no-format
|
phx-no-format
|
||||||
><p class="inline"><%= add_links_to_content(@step.content, "step-context") %></p></div>
|
><p class="inline"><%= display_links(@step) %></p></div>
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
<li class="mx-2 my-1 border-left border border-primary-700"></li>
|
<li class="mx-2 my-1 border-left border border-primary-700"></li>
|
||||||
|
|
||||||
<%= if @current_user do %>
|
<%= if @current_user do %>
|
||||||
<li :if={@current_user |> Accounts.is_already_admin?()} class="mx-2 my-1">
|
<li :if={@current_user |> Accounts.already_admin?()} class="mx-2 my-1">
|
||||||
<.link navigate={~p"/invites"} class="text-primary-400 hover:underline">
|
<.link navigate={~p"/invites"} class="text-primary-400 hover:underline">
|
||||||
<%= gettext("invites") %>
|
<%= gettext("invites") %>
|
||||||
</.link>
|
</.link>
|
||||||
|
@ -1,13 +1,26 @@
|
|||||||
<main role="main" class="min-h-full min-w-full">
|
<main role="main" class="pb-8 min-w-full">
|
||||||
<header>
|
<header>
|
||||||
<.topbar current_user={assigns[:current_user]} />
|
<.topbar current_user={assigns[:current_user]} />
|
||||||
|
|
||||||
<div class="mx-8 my-2 flex flex-col space-y-4 text-center">
|
<div class="mx-8 my-2 flex flex-col space-y-4 text-center">
|
||||||
<p :if={@flash["info"]} class="alert alert-info" role="alert">
|
<p
|
||||||
<%= @flash["info"] %>
|
:if={@flash && @flash |> Map.has_key?("info")}
|
||||||
|
class="alert alert-info cursor-pointer"
|
||||||
|
role="alert"
|
||||||
|
phx-click="lv:clear-flash"
|
||||||
|
phx-value-key="info"
|
||||||
|
>
|
||||||
|
<%= Phoenix.Flash.get(@flash, :info) %>
|
||||||
</p>
|
</p>
|
||||||
<p :if={@flash["error"]} class="alert alert-danger" role="alert">
|
|
||||||
<%= @flash["error"] %>
|
<p
|
||||||
|
:if={@flash && @flash |> Map.has_key?("error")}
|
||||||
|
class="alert alert-danger cursor-pointer"
|
||||||
|
role="alert"
|
||||||
|
phx-click="lv:clear-flash"
|
||||||
|
phx-value-key="error"
|
||||||
|
>
|
||||||
|
<%= Phoenix.Flash.get(@flash, :error) %>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
@ -16,3 +29,17 @@
|
|||||||
<%= @inner_content %>
|
<%= @inner_content %>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="disconnect"
|
||||||
|
class="z-50 fixed opacity-0 bottom-8 right-12 px-8 py-4 w-max h-max
|
||||||
|
border border-primary-400 shadow-lg rounded-lg bg-primary-900 text-primary-400
|
||||||
|
flex justify-center items-center space-x-4
|
||||||
|
transition-opacity ease-in-out duration-500 delay-[2000ms]"
|
||||||
|
>
|
||||||
|
<i class="fas fa-fade text-md fa-satellite-dish"></i>
|
||||||
|
|
||||||
|
<h1 class="title text-md">
|
||||||
|
<%= gettext("Reconnecting...") %>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
<main class="pb-8 min-w-full">
|
|
||||||
<header>
|
|
||||||
<.topbar current_user={assigns[:current_user]} />
|
|
||||||
|
|
||||||
<div class="mx-8 my-2 flex flex-col space-y-4 text-center">
|
|
||||||
<p
|
|
||||||
:if={@flash && @flash |> Map.has_key?("info")}
|
|
||||||
class="alert alert-info"
|
|
||||||
role="alert"
|
|
||||||
phx-click="lv:clear-flash"
|
|
||||||
phx-value-key="info"
|
|
||||||
>
|
|
||||||
<%= live_flash(@flash, "info") %>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p
|
|
||||||
:if={@flash && @flash |> Map.has_key?("error")}
|
|
||||||
class="alert alert-danger"
|
|
||||||
role="alert"
|
|
||||||
phx-click="lv:clear-flash"
|
|
||||||
phx-value-key="error"
|
|
||||||
>
|
|
||||||
<%= live_flash(@flash, "error") %>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="mx-4 sm:mx-8 md:mx-16">
|
|
||||||
<%= @inner_content %>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<div
|
|
||||||
id="disconnect"
|
|
||||||
class="z-50 fixed opacity-0 bottom-12 right-12 px-8 py-4 w-max h-max
|
|
||||||
border border-primary-400 shadow-lg rounded-lg bg-primary-900 text-primary-400
|
|
||||||
flex justify-center items-center space-x-4
|
|
||||||
transition-opacity ease-in-out duration-500 delay-[2000ms]"
|
|
||||||
>
|
|
||||||
<i class="fas fa-fade text-md fa-satellite-dish"></i>
|
|
||||||
|
|
||||||
<h1 class="title text-md">
|
|
||||||
<%= gettext("Reconnecting...") %>
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
@ -88,9 +88,7 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
|||||||
|
|
||||||
@spec get_value_for_key(atom(), Note.t(), additional_data :: map()) ::
|
@spec get_value_for_key(atom(), Note.t(), additional_data :: map()) ::
|
||||||
any() | {any(), Rendered.t()}
|
any() | {any(), Rendered.t()}
|
||||||
defp get_value_for_key(:slug, %{slug: slug}, _additional_data) do
|
defp get_value_for_key(:slug, %{slug: slug} = assigns, _additional_data) do
|
||||||
assigns = %{slug: slug}
|
|
||||||
|
|
||||||
slug_block = ~H"""
|
slug_block = ~H"""
|
||||||
<.link navigate={~p"/note/#{@slug}"} class="link">
|
<.link navigate={~p"/note/#{@slug}"} class="link">
|
||||||
<%= @slug %>
|
<%= @slug %>
|
||||||
@ -100,9 +98,7 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
|||||||
{slug, slug_block}
|
{slug, slug_block}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
defp get_value_for_key(:tags, assigns, _additional_data) do
|
||||||
assigns = %{tags: tags}
|
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div class="flex flex-wrap justify-center space-x-1">
|
<div class="flex flex-wrap justify-center space-x-1">
|
||||||
<.link :for={tag <- @tags} patch={~p"/notes/#{tag}"} class="link">
|
<.link :for={tag <- @tags} patch={~p"/notes/#{tag}"} class="link">
|
||||||
|
@ -89,9 +89,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
|
|
||||||
@spec get_value_for_key(atom(), Pipeline.t(), additional_data :: map()) ::
|
@spec get_value_for_key(atom(), Pipeline.t(), additional_data :: map()) ::
|
||||||
any() | {any(), Rendered.t()}
|
any() | {any(), Rendered.t()}
|
||||||
defp get_value_for_key(:slug, %{slug: slug}, _additional_data) do
|
defp get_value_for_key(:slug, %{slug: slug} = assigns, _additional_data) do
|
||||||
assigns = %{slug: slug}
|
|
||||||
|
|
||||||
slug_block = ~H"""
|
slug_block = ~H"""
|
||||||
<.link navigate={~p"/pipeline/#{@slug}"} class="link">
|
<.link navigate={~p"/pipeline/#{@slug}"} class="link">
|
||||||
<%= @slug %>
|
<%= @slug %>
|
||||||
@ -101,9 +99,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
{slug, slug_block}
|
{slug, slug_block}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_value_for_key(:description, %{description: description}, _additional_data) do
|
defp get_value_for_key(:description, %{description: description} = assigns, _additional_data) do
|
||||||
assigns = %{description: description}
|
|
||||||
|
|
||||||
description_block = ~H"""
|
description_block = ~H"""
|
||||||
<div class="truncate max-w-sm">
|
<div class="truncate max-w-sm">
|
||||||
<%= @description %>
|
<%= @description %>
|
||||||
@ -113,9 +109,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
{description, description_block}
|
{description, description_block}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
defp get_value_for_key(:tags, assigns, _additional_data) do
|
||||||
assigns = %{tags: tags}
|
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div class="flex flex-wrap justify-center space-x-1">
|
<div class="flex flex-wrap justify-center space-x-1">
|
||||||
<.link :for={tag <- @tags} patch={~p"/pipelines/#{tag}"} class="link">
|
<.link :for={tag <- @tags} patch={~p"/pipelines/#{tag}"} class="link">
|
||||||
|
@ -5,7 +5,7 @@ defmodule MemexWeb.UserConfirmationController do
|
|||||||
alias Memex.Accounts
|
alias Memex.Accounts
|
||||||
|
|
||||||
def new(conn, _params) do
|
def new(conn, _params) do
|
||||||
render(conn, :new, page_title: gettext("Confirm your account"))
|
render(conn, :new, page_title: gettext("confirm your account"))
|
||||||
end
|
end
|
||||||
|
|
||||||
def create(conn, %{"user" => %{"email" => email}}) do
|
def create(conn, %{"user" => %{"email" => email}}) do
|
||||||
@ -22,11 +22,10 @@ defmodule MemexWeb.UserConfirmationController do
|
|||||||
:info,
|
:info,
|
||||||
dgettext(
|
dgettext(
|
||||||
"prompts",
|
"prompts",
|
||||||
"If your email is in our system and it has not been confirmed yet, " <>
|
"if your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
||||||
"you will receive an email with instructions shortly."
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|> redirect(to: "/")
|
|> redirect(to: ~p"/")
|
||||||
end
|
end
|
||||||
|
|
||||||
# Do not log in the user after confirmation to avoid a
|
# Do not log in the user after confirmation to avoid a
|
||||||
@ -36,7 +35,7 @@ defmodule MemexWeb.UserConfirmationController do
|
|||||||
{:ok, %{email: email}} ->
|
{:ok, %{email: email}} ->
|
||||||
conn
|
conn
|
||||||
|> put_flash(:info, dgettext("prompts", "%{email} confirmed successfully.", email: email))
|
|> put_flash(:info, dgettext("prompts", "%{email} confirmed successfully.", email: email))
|
||||||
|> redirect(to: "/")
|
|> redirect(to: ~p"/")
|
||||||
|
|
||||||
:error ->
|
:error ->
|
||||||
# If there is a current user and the account was already confirmed,
|
# If there is a current user and the account was already confirmed,
|
||||||
@ -45,15 +44,15 @@ defmodule MemexWeb.UserConfirmationController do
|
|||||||
# a warning message.
|
# a warning message.
|
||||||
case conn.assigns do
|
case conn.assigns do
|
||||||
%{current_user: %{confirmed_at: confirmed_at}} when not is_nil(confirmed_at) ->
|
%{current_user: %{confirmed_at: confirmed_at}} when not is_nil(confirmed_at) ->
|
||||||
redirect(conn, to: "/")
|
redirect(conn, to: ~p"/")
|
||||||
|
|
||||||
%{} ->
|
%{} ->
|
||||||
conn
|
conn
|
||||||
|> put_flash(
|
|> put_flash(
|
||||||
:error,
|
:error,
|
||||||
dgettext("errors", "User confirmation link is invalid or it has expired.")
|
dgettext("errors", "user confirmation link is invalid or it has expired.")
|
||||||
)
|
)
|
||||||
|> redirect(to: "/")
|
|> redirect(to: ~p"/")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
defmodule MemexWeb.UserRegistrationController do
|
defmodule MemexWeb.UserRegistrationController do
|
||||||
use MemexWeb, :controller
|
use MemexWeb, :controller
|
||||||
import MemexWeb.Gettext
|
import MemexWeb.Gettext
|
||||||
|
alias Ecto.Changeset
|
||||||
alias Memex.{Accounts, Accounts.Invites}
|
alias Memex.{Accounts, Accounts.Invites}
|
||||||
|
|
||||||
def new(conn, %{"invite" => invite_token}) do
|
def new(conn, %{"invite" => invite_token}) do
|
||||||
@ -8,7 +9,7 @@ defmodule MemexWeb.UserRegistrationController do
|
|||||||
conn |> render_new(invite_token)
|
conn |> render_new(invite_token)
|
||||||
else
|
else
|
||||||
conn
|
conn
|
||||||
|> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired"))
|
|> put_flash(:error, dgettext("errors", "sorry, this invite was not found or expired"))
|
||||||
|> redirect(to: ~p"/")
|
|> redirect(to: ~p"/")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -18,7 +19,7 @@ defmodule MemexWeb.UserRegistrationController do
|
|||||||
conn |> render_new()
|
conn |> render_new()
|
||||||
else
|
else
|
||||||
conn
|
conn
|
||||||
|> put_flash(:error, dgettext("errors", "Sorry, public registration is disabled"))
|
|> put_flash(:error, dgettext("errors", "sorry, public registration is disabled"))
|
||||||
|> redirect(to: ~p"/")
|
|> redirect(to: ~p"/")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -37,7 +38,7 @@ defmodule MemexWeb.UserRegistrationController do
|
|||||||
conn |> create_user(attrs, invite_token)
|
conn |> create_user(attrs, invite_token)
|
||||||
else
|
else
|
||||||
conn
|
conn
|
||||||
|> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired"))
|
|> put_flash(:error, dgettext("errors", "sorry, this invite was not found or expired"))
|
||||||
|> redirect(to: ~p"/")
|
|> redirect(to: ~p"/")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -47,7 +48,7 @@ defmodule MemexWeb.UserRegistrationController do
|
|||||||
conn |> create_user(attrs)
|
conn |> create_user(attrs)
|
||||||
else
|
else
|
||||||
conn
|
conn
|
||||||
|> put_flash(:error, dgettext("errors", "Sorry, public registration is disabled"))
|
|> put_flash(:error, dgettext("errors", "sorry, public registration is disabled"))
|
||||||
|> redirect(to: ~p"/")
|
|> redirect(to: ~p"/")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -69,8 +70,8 @@ defmodule MemexWeb.UserRegistrationController do
|
|||||||
|> put_flash(:error, dgettext("errors", "sorry, this invite was not found or expired"))
|
|> put_flash(:error, dgettext("errors", "sorry, this invite was not found or expired"))
|
||||||
|> redirect(to: ~p"/")
|
|> redirect(to: ~p"/")
|
||||||
|
|
||||||
{:error, %Ecto.Changeset{} = changeset} ->
|
{:error, %Changeset{} = changeset} ->
|
||||||
conn |> render("new.html", changeset: changeset, invite_token: invite_token)
|
conn |> render(:new, changeset: changeset, invite_token: invite_token)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
action={~p"/users/register"}
|
action={~p"/users/register"}
|
||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<p :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3">
|
<p :if={@changeset.action && not @changeset.valid?} class="alert alert-danger col-span-3">
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -23,17 +23,16 @@ defmodule MemexWeb.UserResetPasswordController do
|
|||||||
:info,
|
:info,
|
||||||
dgettext(
|
dgettext(
|
||||||
"prompts",
|
"prompts",
|
||||||
"If your email is in our system, you will receive instructions to " <>
|
"if your email is in our system, you will receive instructions to reset your password shortly."
|
||||||
"reset your password shortly."
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|> redirect(to: "/")
|
|> redirect(to: ~p"/")
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit(conn, _params) do
|
def edit(conn, _params) do
|
||||||
render(conn, :edit,
|
render(conn, :edit,
|
||||||
changeset: Accounts.change_user_password(conn.assigns.user),
|
changeset: Accounts.change_user_password(conn.assigns.user),
|
||||||
page_title: gettext("Reset your password")
|
page_title: gettext("reset your password")
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -43,7 +42,7 @@ defmodule MemexWeb.UserResetPasswordController do
|
|||||||
case Accounts.reset_user_password(conn.assigns.user, user_params) do
|
case Accounts.reset_user_password(conn.assigns.user, user_params) do
|
||||||
{:ok, _} ->
|
{:ok, _} ->
|
||||||
conn
|
conn
|
||||||
|> put_flash(:info, dgettext("prompts", "Password reset successfully."))
|
|> put_flash(:info, dgettext("prompts", "password reset successfully."))
|
||||||
|> redirect(to: ~p"/users/log_in")
|
|> redirect(to: ~p"/users/log_in")
|
||||||
|
|
||||||
{:error, changeset} ->
|
{:error, changeset} ->
|
||||||
@ -60,9 +59,9 @@ defmodule MemexWeb.UserResetPasswordController do
|
|||||||
conn
|
conn
|
||||||
|> put_flash(
|
|> put_flash(
|
||||||
:error,
|
:error,
|
||||||
dgettext("errors", "Reset password link is invalid or it has expired.")
|
dgettext("errors", "reset password link is invalid or it has expired.")
|
||||||
)
|
)
|
||||||
|> redirect(to: "/")
|
|> redirect(to: ~p"/")
|
||||||
|> halt()
|
|> halt()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
||||||
<h1 class="title text-primary-400 text-xl">
|
<h1 class="title text-primary-400 text-xl">
|
||||||
<%= dgettext("actions", "Reset password") %>
|
<%= dgettext("actions", "reset password") %>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -9,7 +9,7 @@
|
|||||||
action={~p"/users/reset_password/#{@token}"}
|
action={~p"/users/reset_password/#{@token}"}
|
||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<p :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3">
|
<p :if={@changeset.action && not @changeset.valid?} class="alert alert-danger col-span-3">
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@ -26,7 +26,7 @@
|
|||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :password_confirmation, "col-span-3") %>
|
<%= error_tag(f, :password_confirmation, "col-span-3") %>
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "Reset password"),
|
<%= submit(dgettext("actions", "reset password"),
|
||||||
class: "mx-auto btn btn-primary col-span-3"
|
class: "mx-auto btn btn-primary col-span-3"
|
||||||
) %>
|
) %>
|
||||||
</.form>
|
</.form>
|
||||||
|
@ -14,7 +14,7 @@ defmodule MemexWeb.UserSessionController do
|
|||||||
if user = Accounts.get_user_by_email_and_password(email, password) do
|
if user = Accounts.get_user_by_email_and_password(email, password) do
|
||||||
UserAuth.log_in_user(conn, user, user_params)
|
UserAuth.log_in_user(conn, user, user_params)
|
||||||
else
|
else
|
||||||
render(conn, :new, error_message: dgettext("errors", "Invalid email or password"))
|
render(conn, :new, error_message: dgettext("errors", "invalid email or password"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
:if={@email_changeset.action && not @email_changeset.valid?()}
|
:if={@email_changeset.action && not @email_changeset.valid?}
|
||||||
class="alert alert-danger col-span-3"
|
class="alert alert-danger col-span-3"
|
||||||
>
|
>
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below") %>
|
<%= dgettext("errors", "oops, something went wrong! please check the errors below") %>
|
||||||
@ -58,7 +58,7 @@
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p
|
<p
|
||||||
:if={@password_changeset.action && not @password_changeset.valid?()}
|
:if={@password_changeset.action && not @password_changeset.valid?}
|
||||||
class="alert alert-danger col-span-3"
|
class="alert alert-danger col-span-3"
|
||||||
>
|
>
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
||||||
@ -112,7 +112,7 @@
|
|||||||
) %>
|
) %>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
:if={@locale_changeset.action && not @locale_changeset.valid?()}
|
:if={@locale_changeset.action && not @locale_changeset.valid?}
|
||||||
class="alert alert-danger col-span-3"
|
class="alert alert-danger col-span-3"
|
||||||
>
|
>
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below") %>
|
<%= dgettext("errors", "oops, something went wrong! please check the errors below") %>
|
||||||
|
@ -3,8 +3,8 @@ defmodule MemexWeb.ErrorHelpers do
|
|||||||
Conveniences for translating and building error messages.
|
Conveniences for translating and building error messages.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
use Phoenix.HTML
|
use PhoenixHTMLHelpers
|
||||||
import Phoenix.Component
|
import Phoenix.{Component, HTML.Form}
|
||||||
alias Ecto.Changeset
|
alias Ecto.Changeset
|
||||||
alias Phoenix.{HTML.Form, LiveView.Rendered}
|
alias Phoenix.{HTML.Form, LiveView.Rendered}
|
||||||
|
|
||||||
|
@ -6,31 +6,37 @@
|
|||||||
phx-target={@myself}
|
phx-target={@myself}
|
||||||
phx-change="validate"
|
phx-change="validate"
|
||||||
phx-submit="save"
|
phx-submit="save"
|
||||||
phx-debounce="300"
|
phx-hook="CtrlEnter"
|
||||||
class="flex flex-col justify-start items-stretch space-y-4"
|
class="flex flex-col justify-start items-stretch space-y-4"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :slug,
|
<%= text_input(f, :slug,
|
||||||
|
aria_label: gettext("slug"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("slug"),
|
phx_debounce: 300,
|
||||||
aria_label: gettext("slug")
|
phx_hook: "SanitizeTitles",
|
||||||
|
placeholder: gettext("slug")
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :slug) %>
|
<%= error_tag(f, :slug) %>
|
||||||
|
|
||||||
<%= textarea(f, :content,
|
<%= textarea(f, :content,
|
||||||
id: "context-form-content",
|
id: "context-form-content",
|
||||||
class: "input input-primary h-64 min-h-64",
|
class: "input input-primary h-64 min-h-64",
|
||||||
phx_hook: "MaintainAttrs",
|
|
||||||
phx_update: "ignore",
|
phx_update: "ignore",
|
||||||
placeholder: gettext("use [[note-slug]] to link to a note"),
|
placeholder:
|
||||||
aria_label: gettext("use [[note-slug]] to link to a note")
|
gettext("use [[note-slug]] to link to a note or [context-slug] to link to a context"),
|
||||||
|
aria_label:
|
||||||
|
gettext("use [[note-slug]] to link to a note or [context-slug] to link to a context"),
|
||||||
|
phx_debounce: 300
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :content) %>
|
<%= error_tag(f, :content) %>
|
||||||
|
|
||||||
<%= text_input(f, :tags_string,
|
<%= text_input(f, :tags_string,
|
||||||
id: "tags-input",
|
aria_label: gettext("tag1,tag2"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("tag1,tag2"),
|
id: "tags-input",
|
||||||
aria_label: gettext("tag1,tag2")
|
phx_debounce: 300,
|
||||||
|
phx_hook: "SanitizeTags",
|
||||||
|
placeholder: gettext("tag1,tag2")
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :tags_string) %>
|
<%= error_tag(f, :tags_string) %>
|
||||||
|
|
||||||
@ -38,7 +44,8 @@
|
|||||||
<%= select(f, :visibility, Ecto.Enum.values(Memex.Contexts.Context, :visibility),
|
<%= select(f, :visibility, Ecto.Enum.values(Memex.Contexts.Context, :visibility),
|
||||||
class: "grow input input-primary",
|
class: "grow input input-primary",
|
||||||
prompt: gettext("select privacy"),
|
prompt: gettext("select privacy"),
|
||||||
aria_label: gettext("select privacy")
|
aria_label: gettext("select privacy"),
|
||||||
|
phx_debounce: 300
|
||||||
) %>
|
) %>
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "save"),
|
<%= submit(dgettext("actions", "save"),
|
||||||
|
@ -33,14 +33,14 @@
|
|||||||
>
|
>
|
||||||
<:actions :let={context}>
|
<:actions :let={context}>
|
||||||
<.link
|
<.link
|
||||||
:if={Contexts.is_owner?(context, @current_user)}
|
:if={Contexts.owner?(context, @current_user)}
|
||||||
patch={~p"/contexts/#{context}/edit"}
|
patch={~p"/contexts/#{context}/edit"}
|
||||||
aria-label={dgettext("actions", "edit %{context_slug}", context_slug: context.slug)}
|
aria-label={dgettext("actions", "edit %{context_slug}", context_slug: context.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
<%= dgettext("actions", "edit") %>
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:if={Contexts.is_owner_or_admin?(context, @current_user)}
|
:if={Contexts.owner_or_admin?(context, @current_user)}
|
||||||
href="#"
|
href="#"
|
||||||
phx-click="delete"
|
phx-click="delete"
|
||||||
phx-value-id={context.id}
|
phx-value-id={context.id}
|
||||||
|
@ -17,14 +17,14 @@
|
|||||||
|
|
||||||
<div class="self-end flex space-x-4">
|
<div class="self-end flex space-x-4">
|
||||||
<.link
|
<.link
|
||||||
:if={Contexts.is_owner?(@context, @current_user)}
|
:if={Contexts.owner?(@context, @current_user)}
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
patch={~p"/context/#{@context}/edit"}
|
patch={~p"/context/#{@context}/edit"}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
<%= dgettext("actions", "edit") %>
|
||||||
</.link>
|
</.link>
|
||||||
<button
|
<button
|
||||||
:if={Contexts.is_owner_or_admin?(@context, @current_user)}
|
:if={Contexts.owner_or_admin?(@context, @current_user)}
|
||||||
type="button"
|
type="button"
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
phx-click="delete"
|
phx-click="delete"
|
||||||
|
@ -89,7 +89,7 @@
|
|||||||
<p>
|
<p>
|
||||||
<%= gettext("in my opinion, contexts should be like single-topic blog posts.") %>
|
<%= gettext("in my opinion, contexts should be like single-topic blog posts.") %>
|
||||||
<%= gettext(
|
<%= gettext(
|
||||||
"for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could backlink to the spoon note as an example of how it fits nicely into your hand."
|
"for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could link to the spoon note as an example of how it fits nicely into your hand."
|
||||||
) %>
|
) %>
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
@ -100,10 +100,10 @@
|
|||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext(
|
<%= gettext(
|
||||||
"in my opinion, pipelines should be pretty lightweight, and just backlink to contexts to provide most of the heavy lifting."
|
"in my opinion, pipelines should be pretty lightweight, and just link to contexts to provide most of the heavy lifting."
|
||||||
) %>
|
) %>
|
||||||
<%= gettext(
|
<%= gettext(
|
||||||
"for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could backlink to the physical designs context, maybe with some notes about how it applies in this case."
|
"for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could link to the physical designs context, maybe with some notes about how it applies in this case."
|
||||||
) %>
|
) %>
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
@ -117,7 +117,7 @@
|
|||||||
"while memEx fully supports multiple users, each memEx instance should be treated as a single cohesive and collaborative document."
|
"while memEx fully supports multiple users, each memEx instance should be treated as a single cohesive and collaborative document."
|
||||||
) %>
|
) %>
|
||||||
<%= gettext(
|
<%= gettext(
|
||||||
"note, context and pipeline slugs must be unique, and you are free to backlink to notes not written by you."
|
"note, context and pipeline slugs must be unique, and you are free to link to notes not written by you."
|
||||||
) %>
|
) %>
|
||||||
<%= gettext(
|
<%= gettext(
|
||||||
"so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
"so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
||||||
|
@ -10,21 +10,36 @@
|
|||||||
phx-target={@myself}
|
phx-target={@myself}
|
||||||
phx-change="validate"
|
phx-change="validate"
|
||||||
phx-submit="save"
|
phx-submit="save"
|
||||||
|
phx-hook="CtrlEnter"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
:if={@changeset.action && not @changeset.valid?()}
|
:if={@changeset.action && not @changeset.valid?}
|
||||||
class="invalid-feedback col-span-3 text-center"
|
class="invalid-feedback col-span-3 text-center"
|
||||||
>
|
>
|
||||||
<%= changeset_errors(@changeset) %>
|
<%= changeset_errors(@changeset) %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= label(f, :name, gettext("name"), class: "title text-lg text-primary-400") %>
|
<%= label(f, :name, gettext("name"),
|
||||||
<%= text_input(f, :name, class: "input input-primary col-span-2") %>
|
class: "title text-lg text-primary-400",
|
||||||
|
phx_debounce: 300
|
||||||
|
) %>
|
||||||
|
<%= text_input(f, :name,
|
||||||
|
class: "input input-primary col-span-2",
|
||||||
|
phx_debounce: 300
|
||||||
|
) %>
|
||||||
<%= error_tag(f, :name, "col-span-3") %>
|
<%= error_tag(f, :name, "col-span-3") %>
|
||||||
|
|
||||||
<%= label(f, :uses_left, gettext("uses left"), class: "title text-lg text-primary-400") %>
|
<%= label(f, :uses_left, gettext("uses left"),
|
||||||
<%= number_input(f, :uses_left, min: 0, class: "input input-primary col-span-2") %>
|
class: "title text-lg text-primary-400",
|
||||||
|
phx_debounce: 300
|
||||||
|
) %>
|
||||||
|
<%= number_input(f, :uses_left,
|
||||||
|
min: 0,
|
||||||
|
class: "input input-primary col-span-2",
|
||||||
|
phx_debounce: 300
|
||||||
|
) %>
|
||||||
<%= error_tag(f, :uses_left, "col-span-3") %>
|
<%= error_tag(f, :uses_left, "col-span-3") %>
|
||||||
|
|
||||||
<span class="col-span-3 text-primary-500 italic text-center">
|
<span class="col-span-3 text-primary-500 italic text-center">
|
||||||
<%= gettext(~s/leave "uses left" blank to make invite unlimited/) %>
|
<%= gettext(~s/leave "uses left" blank to make invite unlimited/) %>
|
||||||
</span>
|
</span>
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<%= if @invites |> Enum.empty?() do %>
|
<%= if @invites |> Enum.empty?() do %>
|
||||||
<h1 class="title text-xl text-primary-400">
|
<h1 class="title text-xl text-primary-400 text-center">
|
||||||
<%= gettext("no invites 😔") %>
|
<%= gettext("no invites 😔") %>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.link patch={~p"/invites"} class="btn btn-primary">
|
<.link patch={~p"/invites"} class="ml-auto btn btn-primary">
|
||||||
<%= dgettext("actions", "invite someone new!") %>
|
<%= dgettext("actions", "new invite") %>
|
||||||
</.link>
|
</.link>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
@ -35,7 +35,7 @@
|
|||||||
</form>
|
</form>
|
||||||
</:code_actions>
|
</:code_actions>
|
||||||
<.link
|
<.link
|
||||||
patch={~p"/invites/#{invite}/edit"}
|
patch={~p"/invites/edit/#{invite}"}
|
||||||
class="text-primary-400 link"
|
class="text-primary-400 link"
|
||||||
aria-label={
|
aria-label={
|
||||||
dgettext("actions", "edit invite for %{invite_name}", invite_name: invite.name)
|
dgettext("actions", "edit invite for %{invite_name}", invite_name: invite.name)
|
||||||
|
@ -6,31 +6,35 @@
|
|||||||
phx-target={@myself}
|
phx-target={@myself}
|
||||||
phx-change="validate"
|
phx-change="validate"
|
||||||
phx-submit="save"
|
phx-submit="save"
|
||||||
phx-debounce="300"
|
phx-hook="CtrlEnter"
|
||||||
class="flex flex-col justify-start items-stretch space-y-4"
|
class="flex flex-col justify-start items-stretch space-y-4"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :slug,
|
<%= text_input(f, :slug,
|
||||||
|
aria_label: gettext("slug"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("slug"),
|
phx_debounce: 300,
|
||||||
aria_label: gettext("slug")
|
phx_hook: "SanitizeTitles",
|
||||||
|
placeholder: gettext("slug")
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :slug) %>
|
<%= error_tag(f, :slug) %>
|
||||||
|
|
||||||
<%= textarea(f, :content,
|
<%= textarea(f, :content,
|
||||||
id: "note-form-content",
|
id: "note-form-content",
|
||||||
class: "input input-primary h-64 min-h-64",
|
class: "input input-primary h-64 min-h-64",
|
||||||
phx_hook: "MaintainAttrs",
|
|
||||||
phx_update: "ignore",
|
phx_update: "ignore",
|
||||||
placeholder: gettext("content"),
|
placeholder: gettext("use [note-slug] to link to a note"),
|
||||||
aria_label: gettext("content")
|
aria_label: gettext("use [note-slug] to link to a note"),
|
||||||
|
phx_debounce: 300
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :content) %>
|
<%= error_tag(f, :content) %>
|
||||||
|
|
||||||
<%= text_input(f, :tags_string,
|
<%= text_input(f, :tags_string,
|
||||||
id: "tags-input",
|
aria_label: gettext("tag1,tag2"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("tag1,tag2"),
|
id: "tags-input",
|
||||||
aria_label: gettext("tag1,tag2")
|
phx_debounce: 300,
|
||||||
|
phx_hook: "SanitizeTags",
|
||||||
|
placeholder: gettext("tag1,tag2")
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :tags_string) %>
|
<%= error_tag(f, :tags_string) %>
|
||||||
|
|
||||||
@ -38,7 +42,8 @@
|
|||||||
<%= select(f, :visibility, Ecto.Enum.values(Memex.Notes.Note, :visibility),
|
<%= select(f, :visibility, Ecto.Enum.values(Memex.Notes.Note, :visibility),
|
||||||
class: "grow input input-primary",
|
class: "grow input input-primary",
|
||||||
prompt: gettext("select privacy"),
|
prompt: gettext("select privacy"),
|
||||||
aria_label: gettext("select privacy")
|
aria_label: gettext("select privacy"),
|
||||||
|
phx_debounce: 300
|
||||||
) %>
|
) %>
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "save"),
|
<%= submit(dgettext("actions", "save"),
|
||||||
|
@ -33,14 +33,14 @@
|
|||||||
>
|
>
|
||||||
<:actions :let={note}>
|
<:actions :let={note}>
|
||||||
<.link
|
<.link
|
||||||
:if={Notes.is_owner?(note, @current_user)}
|
:if={Notes.owner?(note, @current_user)}
|
||||||
patch={~p"/notes/#{note}/edit"}
|
patch={~p"/notes/#{note}/edit"}
|
||||||
aria-label={dgettext("actions", "edit %{note_slug}", note_slug: note.slug)}
|
aria-label={dgettext("actions", "edit %{note_slug}", note_slug: note.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
<%= dgettext("actions", "edit") %>
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:if={Notes.is_owner_or_admin?(note, @current_user)}
|
:if={Notes.owner_or_admin?(note, @current_user)}
|
||||||
href="#"
|
href="#"
|
||||||
phx-click="delete"
|
phx-click="delete"
|
||||||
phx-value-id={note.id}
|
phx-value-id={note.id}
|
||||||
|
@ -17,14 +17,14 @@
|
|||||||
|
|
||||||
<div class="self-end flex space-x-4">
|
<div class="self-end flex space-x-4">
|
||||||
<.link
|
<.link
|
||||||
:if={Notes.is_owner?(@note, @current_user)}
|
:if={Notes.owner?(@note, @current_user)}
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
patch={~p"/note/#{@note}/edit"}
|
patch={~p"/note/#{@note}/edit"}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
<%= dgettext("actions", "edit") %>
|
||||||
</.link>
|
</.link>
|
||||||
<button
|
<button
|
||||||
:if={Notes.is_owner_or_admin?(@note, @current_user)}
|
:if={Notes.owner_or_admin?(@note, @current_user)}
|
||||||
type="button"
|
type="button"
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
phx-click="delete"
|
phx-click="delete"
|
||||||
|
@ -6,31 +6,41 @@
|
|||||||
phx-target={@myself}
|
phx-target={@myself}
|
||||||
phx-change="validate"
|
phx-change="validate"
|
||||||
phx-submit="save"
|
phx-submit="save"
|
||||||
phx-debounce="300"
|
phx-hook="CtrlEnter"
|
||||||
class="flex flex-col justify-start items-stretch space-y-4"
|
class="flex flex-col justify-start items-stretch space-y-4"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :slug,
|
<%= text_input(f, :slug,
|
||||||
|
aria_label: gettext("slug"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("slug"),
|
phx_debounce: 300,
|
||||||
aria_label: gettext("slug")
|
phx_hook: "SanitizeTitles",
|
||||||
|
placeholder: gettext("slug")
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :slug) %>
|
<%= error_tag(f, :slug) %>
|
||||||
|
|
||||||
<%= textarea(f, :description,
|
<%= textarea(f, :description,
|
||||||
id: "pipeline-form-description",
|
id: "pipeline-form-description",
|
||||||
class: "input input-primary h-64 min-h-64",
|
class: "input input-primary h-64 min-h-64",
|
||||||
phx_hook: "MaintainAttrs",
|
|
||||||
phx_update: "ignore",
|
phx_update: "ignore",
|
||||||
placeholder: gettext("description"),
|
placeholder:
|
||||||
aria_label: gettext("description")
|
gettext(
|
||||||
|
"use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
|
),
|
||||||
|
aria_label:
|
||||||
|
gettext(
|
||||||
|
"use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
|
),
|
||||||
|
phx_debounce: 300
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :description) %>
|
<%= error_tag(f, :description) %>
|
||||||
|
|
||||||
<%= text_input(f, :tags_string,
|
<%= text_input(f, :tags_string,
|
||||||
id: "tags-input",
|
aria_label: gettext("tag1,tag2"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("tag1,tag2"),
|
id: "tags-input",
|
||||||
aria_label: gettext("tag1,tag2")
|
phx_debounce: 300,
|
||||||
|
phx_hook: "SanitizeTags",
|
||||||
|
placeholder: gettext("tag1,tag2")
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :tags_string) %>
|
<%= error_tag(f, :tags_string) %>
|
||||||
|
|
||||||
@ -38,7 +48,8 @@
|
|||||||
<%= select(f, :visibility, Ecto.Enum.values(Memex.Pipelines.Pipeline, :visibility),
|
<%= select(f, :visibility, Ecto.Enum.values(Memex.Pipelines.Pipeline, :visibility),
|
||||||
class: "grow input input-primary",
|
class: "grow input input-primary",
|
||||||
prompt: gettext("select privacy"),
|
prompt: gettext("select privacy"),
|
||||||
aria_label: gettext("select privacy")
|
aria_label: gettext("select privacy"),
|
||||||
|
phx_debounce: 300
|
||||||
) %>
|
) %>
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "save"),
|
<%= submit(dgettext("actions", "save"),
|
||||||
|
@ -33,14 +33,14 @@
|
|||||||
>
|
>
|
||||||
<:actions :let={pipeline}>
|
<:actions :let={pipeline}>
|
||||||
<.link
|
<.link
|
||||||
:if={Pipelines.is_owner?(pipeline, @current_user)}
|
:if={Pipelines.owner?(pipeline, @current_user)}
|
||||||
patch={~p"/pipelines/#{pipeline}/edit"}
|
patch={~p"/pipelines/#{pipeline}/edit"}
|
||||||
aria-label={dgettext("actions", "edit %{pipeline_slug}", pipeline_slug: pipeline.slug)}
|
aria-label={dgettext("actions", "edit %{pipeline_slug}", pipeline_slug: pipeline.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
<%= dgettext("actions", "edit") %>
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:if={Pipelines.is_owner_or_admin?(pipeline, @current_user)}
|
:if={Pipelines.owner_or_admin?(pipeline, @current_user)}
|
||||||
href="#"
|
href="#"
|
||||||
phx-click="delete"
|
phx-click="delete"
|
||||||
phx-value-id={pipeline.id}
|
phx-value-id={pipeline.id}
|
||||||
|
@ -9,15 +9,7 @@
|
|||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<textarea
|
<.pipeline_content pipeline={@pipeline} />
|
||||||
:if={@pipeline.description}
|
|
||||||
id="show-pipeline-description"
|
|
||||||
class="input input-primary h-32 min-h-32"
|
|
||||||
phx-hook="MaintainAttrs"
|
|
||||||
phx-update="ignore"
|
|
||||||
readonly
|
|
||||||
phx-no-format
|
|
||||||
><%= @pipeline.description %></textarea>
|
|
||||||
|
|
||||||
<p class="self-end">
|
<p class="self-end">
|
||||||
<%= gettext("Visibility: %{visibility}", visibility: @pipeline.visibility) %>
|
<%= gettext("Visibility: %{visibility}", visibility: @pipeline.visibility) %>
|
||||||
@ -25,14 +17,14 @@
|
|||||||
|
|
||||||
<div class="pb-4 self-end flex space-x-4">
|
<div class="pb-4 self-end flex space-x-4">
|
||||||
<.link
|
<.link
|
||||||
:if={Pipelines.is_owner?(@pipeline, @current_user)}
|
:if={Pipelines.owner?(@pipeline, @current_user)}
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
patch={~p"/pipeline/#{@pipeline}/edit"}
|
patch={~p"/pipeline/#{@pipeline}/edit"}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
<%= dgettext("actions", "edit") %>
|
||||||
</.link>
|
</.link>
|
||||||
<button
|
<button
|
||||||
:if={Pipelines.is_owner_or_admin?(@pipeline, @current_user)}
|
:if={Pipelines.owner_or_admin?(@pipeline, @current_user)}
|
||||||
type="button"
|
type="button"
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
phx-click="delete"
|
phx-click="delete"
|
||||||
@ -60,7 +52,7 @@
|
|||||||
<%= gettext("%{position}. %{title}", position: position + 1, title: title) %>
|
<%= gettext("%{position}. %{title}", position: position + 1, title: title) %>
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<%= if Pipelines.is_owner?(@pipeline, @current_user) do %>
|
<%= if Pipelines.owner?(@pipeline, @current_user) do %>
|
||||||
<div class="flex justify-between items-center space-x-4">
|
<div class="flex justify-between items-center space-x-4">
|
||||||
<%= if position <= 0 do %>
|
<%= if position <= 0 do %>
|
||||||
<i class="fas text-xl fa-chevron-up cursor-not-allowed opacity-25"></i>
|
<i class="fas text-xl fa-chevron-up cursor-not-allowed opacity-25"></i>
|
||||||
@ -121,7 +113,7 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<.link
|
<.link
|
||||||
:if={Pipelines.is_owner?(@pipeline, @current_user)}
|
:if={Pipelines.owner?(@pipeline, @current_user)}
|
||||||
class="self-end btn btn-primary"
|
class="self-end btn btn-primary"
|
||||||
patch={~p"/pipeline/#{@pipeline}/add_step"}
|
patch={~p"/pipeline/#{@pipeline}/add_step"}
|
||||||
>
|
>
|
||||||
|
@ -6,23 +6,31 @@
|
|||||||
phx-target={@myself}
|
phx-target={@myself}
|
||||||
phx-change="validate"
|
phx-change="validate"
|
||||||
phx-submit="save"
|
phx-submit="save"
|
||||||
phx-debounce="300"
|
phx-hook="CtrlEnter"
|
||||||
class="flex flex-col justify-start items-stretch space-y-4"
|
class="flex flex-col justify-start items-stretch space-y-4"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :title,
|
<%= text_input(f, :title,
|
||||||
|
aria_label: gettext("title"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("title"),
|
phx_debounce: 300,
|
||||||
aria_label: gettext("title")
|
phx_hook: "SanitizeTitles",
|
||||||
|
placeholder: gettext("title")
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :title) %>
|
<%= error_tag(f, :title) %>
|
||||||
|
|
||||||
<%= textarea(f, :content,
|
<%= textarea(f, :content,
|
||||||
id: "step-form-content",
|
id: "step-form-content",
|
||||||
class: "input input-primary h-64 min-h-64",
|
class: "input input-primary h-64 min-h-64",
|
||||||
phx_hook: "MaintainAttrs",
|
|
||||||
phx_update: "ignore",
|
phx_update: "ignore",
|
||||||
placeholder: gettext("use [[context-slug]] to link to a context"),
|
placeholder:
|
||||||
aria_label: gettext("use [[context-slug]] to link to a context")
|
gettext(
|
||||||
|
"use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
|
),
|
||||||
|
aria_label:
|
||||||
|
gettext(
|
||||||
|
"use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
|
),
|
||||||
|
phx_debounce: 300
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :content) %>
|
<%= error_tag(f, :content) %>
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ defmodule MemexWeb.Router do
|
|||||||
live_session :admin, on_mount: [{MemexWeb.UserAuth, :ensure_admin}] do
|
live_session :admin, on_mount: [{MemexWeb.UserAuth, :ensure_admin}] do
|
||||||
live "/invites", InviteLive.Index, :index
|
live "/invites", InviteLive.Index, :index
|
||||||
live "/invites/new", InviteLive.Index, :new
|
live "/invites/new", InviteLive.Index, :new
|
||||||
live "/invites/:id/edit", InviteLive.Index, :edit
|
live "/invites/edit/:id", InviteLive.Index, :edit
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
39
mix.exs
39
mix.exs
@ -4,8 +4,8 @@ defmodule Memex.MixProject do
|
|||||||
def project do
|
def project do
|
||||||
[
|
[
|
||||||
app: :memex,
|
app: :memex,
|
||||||
version: "0.1.11",
|
version: "0.1.16",
|
||||||
elixir: "1.14.4",
|
elixir: "1.17.0",
|
||||||
elixirc_paths: elixirc_paths(Mix.env()),
|
elixirc_paths: elixirc_paths(Mix.env()),
|
||||||
start_permanent: Mix.env() == :prod,
|
start_permanent: Mix.env() == :prod,
|
||||||
aliases: aliases(),
|
aliases: aliases(),
|
||||||
@ -47,29 +47,30 @@ defmodule Memex.MixProject do
|
|||||||
defp deps do
|
defp deps do
|
||||||
[
|
[
|
||||||
{:bcrypt_elixir, "~> 3.0"},
|
{:bcrypt_elixir, "~> 3.0"},
|
||||||
{:phoenix, "~> 1.7.0"},
|
{:credo, "~> 1.5", only: [:dev, :test], runtime: false},
|
||||||
{:phoenix_ecto, "~> 4.4"},
|
{:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false},
|
||||||
{:phoenix_html, "~> 3.0"},
|
{:ecto_psql_extras, "~> 0.6"},
|
||||||
{:phoenix_live_reload, "~> 1.2", only: :dev},
|
|
||||||
{:phoenix_live_view, "~> 0.18.0"},
|
|
||||||
{:phoenix_live_dashboard, "~> 0.6"},
|
|
||||||
{:ecto_sql, "~> 3.6"},
|
{:ecto_sql, "~> 3.6"},
|
||||||
{:postgrex, ">= 0.0.0"},
|
{:eqrcode, "~> 0.1.10"},
|
||||||
{:floki, ">= 0.30.0", only: :test},
|
|
||||||
# {:esbuild, "~> 0.3", runtime: Mix.env() == :dev},
|
# {:esbuild, "~> 0.3", runtime: Mix.env() == :dev},
|
||||||
{:ex_doc, "~> 0.27", only: :dev, runtime: false},
|
{:ex_doc, "~> 0.27", only: :dev, runtime: false},
|
||||||
{:swoosh, "~> 1.6"},
|
{:floki, ">= 0.30.0", only: :test},
|
||||||
{:gen_smtp, "~> 1.0"},
|
{:gen_smtp, "~> 1.0"},
|
||||||
{:oban, "~> 2.10"},
|
|
||||||
{:telemetry_metrics, "~> 0.6"},
|
|
||||||
{:telemetry_poller, "~> 1.0"},
|
|
||||||
{:gettext, "~> 0.18"},
|
{:gettext, "~> 0.18"},
|
||||||
{:jason, "~> 1.2"},
|
{:jason, "~> 1.2"},
|
||||||
{:plug_cowboy, "~> 2.5"},
|
{:oban, "~> 2.10"},
|
||||||
{:ecto_psql_extras, "~> 0.6"},
|
{:phoenix_ecto, "~> 4.4"},
|
||||||
{:eqrcode, "~> 0.1.10"},
|
{:phoenix_html_helpers, "~> 1.0"},
|
||||||
{:credo, "~> 1.5", only: [:dev, :test], runtime: false},
|
{:phoenix_html, "~> 4.0"},
|
||||||
{:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false}
|
{:phoenix_live_dashboard, "~> 0.8"},
|
||||||
|
{:phoenix_live_reload, "~> 1.2", only: :dev},
|
||||||
|
{:phoenix_live_view, "~> 0.20.0"},
|
||||||
|
{:phoenix, "~> 1.7.11"},
|
||||||
|
{:plug_cowboy, "~> 2.7.0"},
|
||||||
|
{:postgrex, ">= 0.0.0"},
|
||||||
|
{:swoosh, "~> 1.6"},
|
||||||
|
{:telemetry_metrics, "~> 0.6"},
|
||||||
|
{:telemetry_poller, "~> 1.0"}
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
94
mix.lock
94
mix.lock
@ -1,54 +1,54 @@
|
|||||||
%{
|
%{
|
||||||
"bcrypt_elixir": {:hex, :bcrypt_elixir, "3.0.1", "9be815469e6bfefec40fa74658ecbbe6897acfb57614df1416eeccd4903f602c", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "486bb95efb645d1efc6794c1ddd776a186a9a713abf06f45708a6ce324fb96cf"},
|
"bcrypt_elixir": {:hex, :bcrypt_elixir, "3.1.0", "0b110a9a6c619b19a7f73fa3004aa11d6e719a67e672d1633dc36b6b2290a0f7", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "2ad2acb5a8bc049e8d5aa267802631912bb80d5f4110a178ae7999e69dca1bf7"},
|
||||||
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
|
"bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
|
||||||
"castore": {:hex, :castore, "1.0.1", "240b9edb4e9e94f8f56ab39d8d2d0a57f49e46c56aced8f873892df8ff64ff5a", [:mix], [], "hexpm", "b4951de93c224d44fac71614beabd88b71932d0b1dea80d2f80fb9044e01bbb3"},
|
"castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"},
|
||||||
"comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
|
"comeonin": {:hex, :comeonin, "5.4.0", "246a56ca3f41d404380fc6465650ddaa532c7f98be4bda1b4656b3a37cc13abe", [:mix], [], "hexpm", "796393a9e50d01999d56b7b8420ab0481a7538d0caf80919da493b4a6e51faf1"},
|
||||||
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
|
"cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"},
|
||||||
"cowboy": {:hex, :cowboy, "2.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_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.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"},
|
||||||
"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.7", "771445037228f763f9b2afd612b6aa2fd8e28432a95dbbc60d8e03ce71ba4446", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8bc87496c9aaacdc3f90f01b7b0582467b69b4bd2441fe8aae3109d843cc2f2e"},
|
||||||
"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.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"},
|
||||||
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
|
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
|
||||||
"dialyxir": {:hex, :dialyxir, "1.3.0", "fd1672f0922b7648ff9ce7b1b26fcf0ef56dda964a459892ad15f6b4410b5284", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "00b2a4bcd6aa8db9dcb0b38c1225b7277dca9bc370b6438715667071a304696f"},
|
"dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"},
|
||||||
"earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"},
|
"earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"},
|
||||||
"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.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"},
|
||||||
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.10", "e14d400930f401ca9f541b3349212634e44027d7f919bbb71224d7ac0d0e8acd", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15.7 or ~> 0.16.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "505e8cd81e4f17c090be0f99e92b1b3f0fd915f98e76965130b8ccfb891e7088"},
|
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.8.0", "440719cd74f09b3f01c84455707a2c3972b725c513808e68eb6c5b0ab82bf523", [:mix], [{:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 0.18.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1 or ~> 4.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "f1512812dc196bcb932a96c82e55f69b543dc125e9d39f5e3631a9c4ec65ef12"},
|
||||||
"ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [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.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 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", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"},
|
||||||
"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.8.4", "4960a03ce79081dee8fe119d80ad372c4e7badb84c493cc75983f9d3bc8bde0f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "6e7f1d619b5f61dfabd0a20aa268e575572b542ac31723293a4c1a567d5ef040"},
|
||||||
"eqrcode": {:hex, :eqrcode, "0.1.10", "6294fece9d68ad64eef1c3c92cf111cfd6469f4fbf230a2d4cc905a682178f3f", [:mix], [], "hexpm", "da30e373c36a0fd37ab6f58664b16029919896d6c45a68a95cc4d713e81076f1"},
|
"eqrcode": {:hex, :eqrcode, "0.1.10", "6294fece9d68ad64eef1c3c92cf111cfd6469f4fbf230a2d4cc905a682178f3f", [:mix], [], "hexpm", "da30e373c36a0fd37ab6f58664b16029919896d6c45a68a95cc4d713e81076f1"},
|
||||||
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
|
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
|
||||||
"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.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"},
|
||||||
"expo": {:hex, :expo, "0.4.1", "1c61d18a5df197dfda38861673d392e642649a9cef7694d2f97a587b2cfb319b", [:mix], [], "hexpm", "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47"},
|
"expo": {:hex, :expo, "0.5.2", "beba786aab8e3c5431813d7a44b828e7b922bfa431d6bfbada0904535342efe2", [:mix], [], "hexpm", "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"},
|
||||||
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
|
"file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"},
|
||||||
"floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"},
|
"floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"},
|
||||||
"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.1", "e7942988383c3d9eed4bdc22fc63e712b655ae94a672a27e4900e3d4a2c43581", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "ad105b8dab668ee3f90c0d3d94ba75e9aead27a62495c101d94f2657a190ac5d"},
|
"gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"},
|
||||||
"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.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
|
||||||
"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.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"},
|
||||||
"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.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"},
|
||||||
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
|
"makeup_erlang": {:hex, :makeup_erlang, "1.0.1", "c7f58c120b2b5aa5fd80d540a89fdf866ed42f1f3994e4fe189abebeab610839", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "8a89a1eeccc2d798d6ea15496a6e4870b75e014d1af514b1b71fa33134f57814"},
|
||||||
"mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"},
|
"mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
|
||||||
"nimble_parsec": {:hex, :nimble_parsec, "1.3.0", "9e18a119d9efc3370a3ef2a937bf0b24c088d9c4bf0ba9d7c3751d49d347d035", [:mix], [], "hexpm", "7977f183127a7cbe9346981e2f480dc04c55ffddaef746bd58debd566070eef8"},
|
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
|
||||||
"oban": {:hex, :oban, "2.15.0", "27b9c2845cdff30c98c8060b11a64318e79bbc1bd32b8dc95fa59a1580a8d90c", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "22e181c540335d1dd5c995be00435927075519207d62b3de32477d95dbf9dfd3"},
|
"oban": {:hex, :oban, "2.18.0", "092d20bfd3d70c7ecb70960f8548d300b54bb9937c7f2e56b388f3a9ed02ec68", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aace1eff6f8227ae38d4274af967d96f051c2f0a5152f2ef9809dd1f97866745"},
|
||||||
"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.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"},
|
||||||
"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.6.2", "3b83b24ab5a2eb071a20372f740d7118767c272db386831b2e77638c4dcc606d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "3f94d025f59de86be00f5f8c5dd7b5965a3298458d21ab1c328488be3b5fcd59"},
|
||||||
"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, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"},
|
||||||
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.7.2", "97cc4ff2dba1ebe504db72cb45098cb8e91f11160528b980bd282cc45c73b29c", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.18.3", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "0e5fdf063c7a3b620c566a30fcf68b7ee02e5e46fe48ee46a6ec3ba382dc05b7"},
|
"phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"},
|
||||||
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
|
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.4", "4508e481f791ce62ec6a096e13b061387158cbeefacca68c6c1928e1305e23ed", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "2984aae96994fbc5c61795a73b8fb58153b41ff934019cfb522343d2d3817d59"},
|
||||||
"phoenix_live_view": {:hex, :phoenix_live_view, "0.18.18", "1f38fbd7c363723f19aad1a04b5490ff3a178e37daaf6999594d5f34796c47fc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a5810d0472f3189ede6d2a95bda7f31c6113156b91784a3426cb0ab6a6d85214"},
|
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"},
|
||||||
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
|
"phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"},
|
||||||
"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_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
|
||||||
"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"},
|
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
|
||||||
"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": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
|
||||||
"plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
|
"plug_cowboy": {:hex, :plug_cowboy, "2.7.1", "87677ffe3b765bc96a89be7960f81703223fe2e21efa42c125fcd0127dd9d6b2", [: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", "02dbd5f9ab571b864ae39418db7811618506256f6d13b4a45037e5fe78dc5de3"},
|
||||||
"postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {: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", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"},
|
"plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},
|
||||||
|
"postgrex": {:hex, :postgrex, "0.18.0", "f34664101eaca11ff24481ed4c378492fed2ff416cd9b06c399e90f321867d7e", [: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", "a042989ba1bc1cca7383ebb9e461398e3f89f868c92ce6671feb7ef132a252d1"},
|
||||||
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
|
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
|
||||||
"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.16.10", "04be6e2eb1a31aa0aa21a731175c81cc3998189456a92daf13d44a5c754afcf5", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "756be04db173c0cbe318f1dfe2bcc88aa63aed78cf5a4b02b61b36ee11fc716a"},
|
||||||
"table_rex": {:hex, :table_rex, "3.1.1", "0c67164d1714b5e806d5067c1e96ff098ba7ae79413cc075973e17c38a587caa", [:mix], [], "hexpm", "678a23aba4d670419c23c17790f9dcd635a4a89022040df7d5d772cb21012490"},
|
"table_rex": {:hex, :table_rex, "4.0.0", "3c613a68ebdc6d4d1e731bc973c233500974ec3993c99fcdabb210407b90959b", [:mix], [], "hexpm", "c35c4d5612ca49ebb0344ea10387da4d2afe278387d4019e4d8111e815df8f55"},
|
||||||
"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.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"},
|
||||||
"telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
|
"telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"},
|
||||||
"websock": {:hex, :websock, "0.5.0", "f6bbce90226121d62a0715bca7c986c5e43de0ccc9475d79c55381d1796368cc", [:mix], [], "hexpm", "b51ac706df8a7a48a2c622ee02d09d68be8c40418698ffa909d73ae207eb5fb8"},
|
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
|
||||||
"websock_adapter": {:hex, :websock_adapter, "0.5.0", "cea35d8bbf1a6964e32d4b02ceb561dfb769c04f16d60d743885587e7d2ca55b", [:mix], [{:bandit, "~> 0.6", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "16318b124effab8209b1eb7906c636374f623dc9511a8278ad09c083cea5bb83"},
|
"websock_adapter": {:hex, :websock_adapter, "0.5.6", "0437fe56e093fd4ac422de33bf8fc89f7bc1416a3f2d732d8b2c8fd54792fe60", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"},
|
||||||
}
|
}
|
||||||
|
@ -16,12 +16,6 @@ msgstr ""
|
|||||||
msgid "Resend confirmation instructions"
|
msgid "Resend confirmation instructions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:3
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:29
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:15
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:15
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:43
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -50,8 +44,8 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:50
|
#: lib/memex_web/live/note_live/index.html.heex:50
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:34
|
#: lib/memex_web/live/note_live/show.html.heex:34
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:52
|
#: lib/memex_web/live/pipeline_live/index.html.heex:52
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:42
|
#: lib/memex_web/live/pipeline_live/show.html.heex:34
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:113
|
#: lib/memex_web/live/pipeline_live/show.html.heex:105
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete"
|
msgid "delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -66,17 +60,12 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:40
|
#: lib/memex_web/live/note_live/index.html.heex:40
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:24
|
#: lib/memex_web/live/note_live/show.html.heex:24
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:40
|
#: lib/memex_web/live/pipeline_live/index.html.heex:40
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
#: lib/memex_web/live/pipeline_live/show.html.heex:24
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
#: lib/memex_web/live/pipeline_live/show.html.heex:94
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "edit"
|
msgid "edit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/index.html.heex:12
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "invite someone new!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:85
|
#: lib/memex_web/components/core_components/topbar.html.heex:85
|
||||||
#: lib/memex_web/controllers/user_confirmation_html/new.html.heex:28
|
#: lib/memex_web/controllers/user_confirmation_html/new.html.heex:28
|
||||||
#: lib/memex_web/controllers/user_registration_html/new.html.heex:44
|
#: lib/memex_web/controllers/user_registration_html/new.html.heex:44
|
||||||
@ -114,16 +103,16 @@ msgstr ""
|
|||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:44
|
#: lib/memex_web/live/context_live/form_component.html.heex:51
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:32
|
#: lib/memex_web/live/invite_live/form_component.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:44
|
#: lib/memex_web/live/note_live/form_component.html.heex:49
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:44
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:55
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:30
|
#: lib/memex_web/live/step_live/form_component.html.heex:38
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "save"
|
msgid "save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:128
|
#: lib/memex_web/live/pipeline_live/show.html.heex:120
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "add step"
|
msgid "add step"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -168,12 +157,12 @@ msgid "delete %{note_slug}"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:49
|
#: lib/memex_web/live/pipeline_live/index.html.heex:49
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:40
|
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete %{pipeline_slug}"
|
msgid "delete %{pipeline_slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:111
|
#: lib/memex_web/live/pipeline_live/show.html.heex:103
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete %{step_title}"
|
msgid "delete %{step_title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -198,7 +187,7 @@ msgstr ""
|
|||||||
msgid "edit %{pipeline_slug}"
|
msgid "edit %{pipeline_slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:100
|
#: lib/memex_web/live/pipeline_live/show.html.heex:92
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "edit %{step_title}"
|
msgid "edit %{step_title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -208,12 +197,23 @@ msgstr ""
|
|||||||
msgid "edit invite for %{invite_name}"
|
msgid "edit invite for %{invite_name}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:90
|
#: lib/memex_web/live/pipeline_live/show.html.heex:82
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "move %{step_title} down"
|
msgid "move %{step_title} down"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:74
|
#: lib/memex_web/live/pipeline_live/show.html.heex:66
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "move %{step_title} up"
|
msgid "move %{step_title} up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:3
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:29
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "reset password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/invite_live/index.html.heex:12
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "new invite"
|
||||||
|
msgstr ""
|
||||||
|
@ -16,12 +16,6 @@ msgstr ""
|
|||||||
msgid "Resend confirmation instructions"
|
msgid "Resend confirmation instructions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:3
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:29
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:15
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:15
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:43
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -50,8 +44,8 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:50
|
#: lib/memex_web/live/note_live/index.html.heex:50
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:34
|
#: lib/memex_web/live/note_live/show.html.heex:34
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:52
|
#: lib/memex_web/live/pipeline_live/index.html.heex:52
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:42
|
#: lib/memex_web/live/pipeline_live/show.html.heex:34
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:113
|
#: lib/memex_web/live/pipeline_live/show.html.heex:105
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete"
|
msgid "delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -66,17 +60,12 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:40
|
#: lib/memex_web/live/note_live/index.html.heex:40
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:24
|
#: lib/memex_web/live/note_live/show.html.heex:24
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:40
|
#: lib/memex_web/live/pipeline_live/index.html.heex:40
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
#: lib/memex_web/live/pipeline_live/show.html.heex:24
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
#: lib/memex_web/live/pipeline_live/show.html.heex:94
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "edit"
|
msgid "edit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/index.html.heex:12
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "invite someone new!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:85
|
#: lib/memex_web/components/core_components/topbar.html.heex:85
|
||||||
#: lib/memex_web/controllers/user_confirmation_html/new.html.heex:28
|
#: lib/memex_web/controllers/user_confirmation_html/new.html.heex:28
|
||||||
#: lib/memex_web/controllers/user_registration_html/new.html.heex:44
|
#: lib/memex_web/controllers/user_registration_html/new.html.heex:44
|
||||||
@ -114,16 +103,16 @@ msgstr ""
|
|||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:44
|
#: lib/memex_web/live/context_live/form_component.html.heex:51
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:32
|
#: lib/memex_web/live/invite_live/form_component.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:44
|
#: lib/memex_web/live/note_live/form_component.html.heex:49
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:44
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:55
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:30
|
#: lib/memex_web/live/step_live/form_component.html.heex:38
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "save"
|
msgid "save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:128
|
#: lib/memex_web/live/pipeline_live/show.html.heex:120
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "add step"
|
msgid "add step"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -168,12 +157,12 @@ msgid "delete %{note_slug}"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:49
|
#: lib/memex_web/live/pipeline_live/index.html.heex:49
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:40
|
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete %{pipeline_slug}"
|
msgid "delete %{pipeline_slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:111
|
#: lib/memex_web/live/pipeline_live/show.html.heex:103
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete %{step_title}"
|
msgid "delete %{step_title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -198,7 +187,7 @@ msgstr ""
|
|||||||
msgid "edit %{pipeline_slug}"
|
msgid "edit %{pipeline_slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:100
|
#: lib/memex_web/live/pipeline_live/show.html.heex:92
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "edit %{step_title}"
|
msgid "edit %{step_title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -208,12 +197,23 @@ msgstr ""
|
|||||||
msgid "edit invite for %{invite_name}"
|
msgid "edit invite for %{invite_name}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:90
|
#: lib/memex_web/live/pipeline_live/show.html.heex:82
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "move %{step_title} down"
|
msgid "move %{step_title} down"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:74
|
#: lib/memex_web/live/pipeline_live/show.html.heex:66
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "move %{step_title} up"
|
msgid "move %{step_title} up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:3
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:29
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "reset password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/invite_live/index.html.heex:12
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "new invite"
|
||||||
|
msgstr ""
|
||||||
|
@ -12,24 +12,14 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Generator: Translate Toolkit 3.7.4\n"
|
"X-Generator: Translate Toolkit 3.7.4\n"
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:8
|
#: lib/memex_web/components/layouts/app.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Confirm your account"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/layouts/live.html.heex:43
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reconnecting..."
|
msgid "Reconnecting..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:36
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset your password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:15
|
#: lib/memex_web/live/context_live/show.html.heex:15
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:15
|
#: lib/memex_web/live/note_live/show.html.heex:15
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:23
|
#: lib/memex_web/live/pipeline_live/show.html.heex:15
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Visibility: %{visibility}"
|
msgid "Visibility: %{visibility}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -55,12 +45,6 @@ msgstr ""
|
|||||||
msgid "confirm new password"
|
msgid "confirm new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "content"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:28
|
#: lib/memex_web/components/core_components/topbar.html.heex:28
|
||||||
#: lib/memex_web/live/context_live/index.ex:35
|
#: lib/memex_web/live/context_live/index.ex:35
|
||||||
#: lib/memex_web/live/context_live/index.ex:43
|
#: lib/memex_web/live/context_live/index.ex:43
|
||||||
@ -238,7 +222,7 @@ msgstr ""
|
|||||||
msgid "public signups"
|
msgid "public signups"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:31
|
#: lib/memex_web/controllers/user_registration_controller.ex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -253,20 +237,20 @@ msgstr ""
|
|||||||
msgid "report bugs or request features"
|
msgid "report bugs or request features"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:45
|
#: lib/memex_web/live/context_live/form_component.html.heex:52
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:45
|
#: lib/memex_web/live/note_live/form_component.html.heex:50
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:45
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:56
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:31
|
#: lib/memex_web/live/step_live/form_component.html.heex:39
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "saving..."
|
msgid "saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:40
|
#: lib/memex_web/live/context_live/form_component.html.heex:46
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:41
|
#: lib/memex_web/live/context_live/form_component.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:40
|
#: lib/memex_web/live/note_live/form_component.html.heex:44
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:41
|
#: lib/memex_web/live/note_live/form_component.html.heex:45
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:40
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:50
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:41
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:51
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "select privacy"
|
msgid "select privacy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -282,12 +266,12 @@ msgstr ""
|
|||||||
msgid "settings"
|
msgid "settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:32
|
#: lib/memex_web/live/context_live/form_component.html.heex:34
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:33
|
#: lib/memex_web/live/context_live/form_component.html.heex:39
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:32
|
#: lib/memex_web/live/note_live/form_component.html.heex:32
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:33
|
#: lib/memex_web/live/note_live/form_component.html.heex:37
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:32
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:38
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:33
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "tag1,tag2"
|
msgid "tag1,tag2"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -344,8 +328,6 @@ msgid "no contexts found"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:48
|
#: lib/memex_web/components/pipelines_table_component.ex:48
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "description"
|
msgid "description"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -397,12 +379,12 @@ msgstr ""
|
|||||||
#: lib/memex_web/components/contexts_table_component.ex:47
|
#: lib/memex_web/components/contexts_table_component.ex:47
|
||||||
#: lib/memex_web/components/notes_table_component.ex:47
|
#: lib/memex_web/components/notes_table_component.ex:47
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:47
|
#: lib/memex_web/components/pipelines_table_component.ex:47
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:14
|
#: lib/memex_web/live/context_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:15
|
#: lib/memex_web/live/context_live/form_component.html.heex:17
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:14
|
#: lib/memex_web/live/note_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:15
|
#: lib/memex_web/live/note_live/form_component.html.heex:17
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:14
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:15
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:17
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "slug"
|
msgid "slug"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -419,12 +401,6 @@ msgstr ""
|
|||||||
msgid "home"
|
msgid "home"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "use [[note-slug]] to link to a note"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.ex:10
|
#: lib/memex_web/live/faq_live.ex:10
|
||||||
#: lib/memex_web/live/faq_live.html.heex:3
|
#: lib/memex_web/live/faq_live.html.heex:3
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -446,7 +422,7 @@ msgstr ""
|
|||||||
msgid "what is this?"
|
msgid "what is this?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:60
|
#: lib/memex_web/live/pipeline_live/show.html.heex:52
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{position}. %{title}"
|
msgid "%{position}. %{title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -471,43 +447,27 @@ msgstr ""
|
|||||||
msgid "add step to %{slug}"
|
msgid "add step to %{slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:54
|
#: lib/memex_web/live/pipeline_live/show.html.heex:46
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "no steps"
|
msgid "no steps"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:49
|
#: lib/memex_web/live/pipeline_live/show.html.heex:41
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "steps:"
|
msgid "steps:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:14
|
#: lib/memex_web/live/step_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:15
|
#: lib/memex_web/live/step_live/form_component.html.heex:17
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "title"
|
msgid "title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "use [[context-slug]] to link to a context"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:65
|
#: lib/memex_web/live/faq_live.html.heex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
msgid "finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:91
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could backlink to the spoon note as an example of how it fits nicely into your hand."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:105
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could backlink to the physical designs context, maybe with some notes about how it applies in this case."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:59
|
#: lib/memex_web/live/faq_live.html.heex:59
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "i really admired the idea of a zettelkasten, especially with org-mode backlinks, however I felt like my notes would immediately become too messy by just putting everything into a single hierarchy."
|
msgid "i really admired the idea of a zettelkasten, especially with org-mode backlinks, however I felt like my notes would immediately become too messy by just putting everything into a single hierarchy."
|
||||||
@ -528,11 +488,6 @@ msgstr ""
|
|||||||
msgid "in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
msgid "in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:102
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "in my opinion, pipelines should be pretty lightweight, and just backlink to contexts to provide most of the heavy lifting."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:28
|
#: lib/memex_web/live/faq_live.html.heex:28
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "memex"
|
msgid "memex"
|
||||||
@ -598,11 +553,6 @@ msgstr ""
|
|||||||
msgid "how many people should i invite?"
|
msgid "how many people should i invite?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:119
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "note, context and pipeline slugs must be unique, and you are free to backlink to notes not written by you."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:122
|
#: lib/memex_web/live/faq_live.html.heex:122
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
msgid "so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
||||||
@ -668,7 +618,7 @@ msgstr ""
|
|||||||
msgid "keep me logged in for 60 days"
|
msgid "keep me logged in for 60 days"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:21
|
#: lib/memex_web/live/invite_live/form_component.html.heex:22
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -679,12 +629,12 @@ msgstr ""
|
|||||||
msgid "password"
|
msgid "password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:25
|
#: lib/memex_web/live/invite_live/form_component.html.heex:32
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "uses left"
|
msgid "uses left"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:29
|
#: lib/memex_web/live/invite_live/form_component.html.heex:44
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "leave \"uses left\" blank to make invite unlimited"
|
msgid "leave \"uses left\" blank to make invite unlimited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -711,3 +661,53 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "log out"
|
msgid "log out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:8
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "confirm your account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:35
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "reset your password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:30
|
||||||
|
#: lib/memex_web/live/step_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/step_live/form_component.html.heex:30
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/context_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/context_live/form_component.html.heex:28
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "use [[note-slug]] to link to a note or [context-slug] to link to a context"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/note_live/form_component.html.heex:25
|
||||||
|
#: lib/memex_web/live/note_live/form_component.html.heex:26
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "use [note-slug] to link to a note"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:91
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could link to the spoon note as an example of how it fits nicely into your hand."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:105
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could link to the physical designs context, maybe with some notes about how it applies in this case."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:102
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "in my opinion, pipelines should be pretty lightweight, and just link to contexts to provide most of the heavy lifting."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:119
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "note, context and pipeline slugs must be unique, and you are free to link to notes not written by you."
|
||||||
|
msgstr ""
|
||||||
|
@ -66,12 +66,12 @@ msgstr ""
|
|||||||
msgid "Welcome to memEx"
|
msgid "Welcome to memEx"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:31
|
#: lib/memex/email.ex:31
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "confirm your memEx account"
|
msgid "confirm your memEx account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:37
|
#: lib/memex/email.ex:37
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "reset your memEx password"
|
msgid "reset your memEx password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -86,7 +86,7 @@ msgstr ""
|
|||||||
msgid "this email was sent from memEx at %{url}"
|
msgid "this email was sent from memEx at %{url}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:43
|
#: lib/memex/email.ex:43
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "update your memEx email"
|
msgid "update your memEx email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -15,33 +15,6 @@ msgstr ""
|
|||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_session_controller.ex:17
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Invalid email or password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:63
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset password link is invalid or it has expired."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:21
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:50
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Sorry, public registration is disabled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:11
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:40
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Sorry, this invite was not found or expired"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:54
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "User confirmation link is invalid or it has expired."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_auth.ex:266
|
#: lib/memex_web/controllers/user_auth.ex:266
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You are not authorized to view this page."
|
msgid "You are not authorized to view this page."
|
||||||
@ -106,13 +79,6 @@ msgstr ""
|
|||||||
msgid "unauthorized"
|
msgid "unauthorized"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:84
|
|
||||||
#: lib/memex/notes/note.ex:83
|
|
||||||
#: lib/memex/pipelines/pipeline.ex:86
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_html/new.html.heex:13
|
#: lib/memex_web/controllers/user_registration_html/new.html.heex:13
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:13
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:13
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:64
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:64
|
||||||
@ -120,7 +86,9 @@ msgstr ""
|
|||||||
msgid "oops, something went wrong! please check the errors below."
|
msgid "oops, something went wrong! please check the errors below."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:69
|
#: lib/memex_web/controllers/user_registration_controller.ex:12
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:41
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:70
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "sorry, this invite was not found or expired"
|
msgid "sorry, this invite was not found or expired"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -150,3 +118,31 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You must log in to access this page."
|
msgid "You must log in to access this page."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_session_controller.ex:17
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "invalid email or password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:62
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "reset password link is invalid or it has expired."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:22
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:51
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "sorry, public registration is disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:53
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "user confirmation link is invalid or it has expired."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex/contexts/context.ex:84
|
||||||
|
#: lib/memex/notes/note.ex:83
|
||||||
|
#: lib/memex/pipelines/pipeline.ex:86
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
|
msgstr ""
|
||||||
|
@ -10,7 +10,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:38
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:37
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{email} confirmed successfully."
|
msgid "%{email} confirmed successfully."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -40,21 +40,6 @@ msgstr ""
|
|||||||
msgid "%{user_email} deleted succesfully"
|
msgid "%{user_email} deleted succesfully"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:23
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:24
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "If your email is in our system, you will receive instructions to reset your password shortly."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:46
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Password reset successfully."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:130
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:130
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "are you sure you want to change your language?"
|
msgid "are you sure you want to change your language?"
|
||||||
@ -85,8 +70,8 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:47
|
#: lib/memex_web/live/note_live/index.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:31
|
#: lib/memex_web/live/note_live/show.html.heex:31
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:47
|
#: lib/memex_web/live/pipeline_live/index.html.heex:47
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:39
|
#: lib/memex_web/live/pipeline_live/show.html.heex:31
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:110
|
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "are you sure?"
|
msgid "are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -121,7 +106,7 @@ msgstr ""
|
|||||||
msgid "copied to clipboard"
|
msgid "copied to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:64
|
#: lib/memex_web/controllers/user_registration_controller.ex:65
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "please check your email to verify your account"
|
msgid "please check your email to verify your account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -152,7 +137,22 @@ msgstr ""
|
|||||||
msgid "are you sure you want to delete %{email}? this action is permanent!"
|
msgid "are you sure you want to delete %{email}? this action is permanent!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:34
|
#: lib/memex_web/live/invite_live/form_component.html.heex:49
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "saving..."
|
msgid "saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:23
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "if your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:24
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "if your email is in our system, you will receive instructions to reset your password shortly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:45
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "password reset successfully."
|
||||||
|
msgstr ""
|
||||||
|
@ -10,24 +10,14 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:8
|
#: lib/memex_web/components/layouts/app.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Confirm your account"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/layouts/live.html.heex:43
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reconnecting..."
|
msgid "Reconnecting..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:36
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset your password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:15
|
#: lib/memex_web/live/context_live/show.html.heex:15
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:15
|
#: lib/memex_web/live/note_live/show.html.heex:15
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:23
|
#: lib/memex_web/live/pipeline_live/show.html.heex:15
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Visibility: %{visibility}"
|
msgid "Visibility: %{visibility}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -53,12 +43,6 @@ msgstr ""
|
|||||||
msgid "confirm new password"
|
msgid "confirm new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "content"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:28
|
#: lib/memex_web/components/core_components/topbar.html.heex:28
|
||||||
#: lib/memex_web/live/context_live/index.ex:35
|
#: lib/memex_web/live/context_live/index.ex:35
|
||||||
#: lib/memex_web/live/context_live/index.ex:43
|
#: lib/memex_web/live/context_live/index.ex:43
|
||||||
@ -236,7 +220,7 @@ msgstr ""
|
|||||||
msgid "public signups"
|
msgid "public signups"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:31
|
#: lib/memex_web/controllers/user_registration_controller.ex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -251,20 +235,20 @@ msgstr ""
|
|||||||
msgid "report bugs or request features"
|
msgid "report bugs or request features"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:45
|
#: lib/memex_web/live/context_live/form_component.html.heex:52
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:45
|
#: lib/memex_web/live/note_live/form_component.html.heex:50
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:45
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:56
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:31
|
#: lib/memex_web/live/step_live/form_component.html.heex:39
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "saving..."
|
msgid "saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:40
|
#: lib/memex_web/live/context_live/form_component.html.heex:46
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:41
|
#: lib/memex_web/live/context_live/form_component.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:40
|
#: lib/memex_web/live/note_live/form_component.html.heex:44
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:41
|
#: lib/memex_web/live/note_live/form_component.html.heex:45
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:40
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:50
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:41
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:51
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "select privacy"
|
msgid "select privacy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -280,12 +264,12 @@ msgstr ""
|
|||||||
msgid "settings"
|
msgid "settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:32
|
#: lib/memex_web/live/context_live/form_component.html.heex:34
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:33
|
#: lib/memex_web/live/context_live/form_component.html.heex:39
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:32
|
#: lib/memex_web/live/note_live/form_component.html.heex:32
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:33
|
#: lib/memex_web/live/note_live/form_component.html.heex:37
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:32
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:38
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:33
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "tag1,tag2"
|
msgid "tag1,tag2"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -342,8 +326,6 @@ msgid "no contexts found"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:48
|
#: lib/memex_web/components/pipelines_table_component.ex:48
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "description"
|
msgid "description"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -395,12 +377,12 @@ msgstr ""
|
|||||||
#: lib/memex_web/components/contexts_table_component.ex:47
|
#: lib/memex_web/components/contexts_table_component.ex:47
|
||||||
#: lib/memex_web/components/notes_table_component.ex:47
|
#: lib/memex_web/components/notes_table_component.ex:47
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:47
|
#: lib/memex_web/components/pipelines_table_component.ex:47
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:14
|
#: lib/memex_web/live/context_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:15
|
#: lib/memex_web/live/context_live/form_component.html.heex:17
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:14
|
#: lib/memex_web/live/note_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:15
|
#: lib/memex_web/live/note_live/form_component.html.heex:17
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:14
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:15
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:17
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "slug"
|
msgid "slug"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -417,12 +399,6 @@ msgstr ""
|
|||||||
msgid "home"
|
msgid "home"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "use [[note-slug]] to link to a note"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.ex:10
|
#: lib/memex_web/live/faq_live.ex:10
|
||||||
#: lib/memex_web/live/faq_live.html.heex:3
|
#: lib/memex_web/live/faq_live.html.heex:3
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -444,7 +420,7 @@ msgstr ""
|
|||||||
msgid "what is this?"
|
msgid "what is this?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:60
|
#: lib/memex_web/live/pipeline_live/show.html.heex:52
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{position}. %{title}"
|
msgid "%{position}. %{title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -469,43 +445,27 @@ msgstr ""
|
|||||||
msgid "add step to %{slug}"
|
msgid "add step to %{slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:54
|
#: lib/memex_web/live/pipeline_live/show.html.heex:46
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "no steps"
|
msgid "no steps"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:49
|
#: lib/memex_web/live/pipeline_live/show.html.heex:41
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "steps:"
|
msgid "steps:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:14
|
#: lib/memex_web/live/step_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:15
|
#: lib/memex_web/live/step_live/form_component.html.heex:17
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "title"
|
msgid "title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "use [[context-slug]] to link to a context"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:65
|
#: lib/memex_web/live/faq_live.html.heex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
msgid "finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:91
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could backlink to the spoon note as an example of how it fits nicely into your hand."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:105
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could backlink to the physical designs context, maybe with some notes about how it applies in this case."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:59
|
#: lib/memex_web/live/faq_live.html.heex:59
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "i really admired the idea of a zettelkasten, especially with org-mode backlinks, however I felt like my notes would immediately become too messy by just putting everything into a single hierarchy."
|
msgid "i really admired the idea of a zettelkasten, especially with org-mode backlinks, however I felt like my notes would immediately become too messy by just putting everything into a single hierarchy."
|
||||||
@ -526,11 +486,6 @@ msgstr ""
|
|||||||
msgid "in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
msgid "in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:102
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "in my opinion, pipelines should be pretty lightweight, and just backlink to contexts to provide most of the heavy lifting."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:28
|
#: lib/memex_web/live/faq_live.html.heex:28
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "memex"
|
msgid "memex"
|
||||||
@ -596,11 +551,6 @@ msgstr ""
|
|||||||
msgid "how many people should i invite?"
|
msgid "how many people should i invite?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:119
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "note, context and pipeline slugs must be unique, and you are free to backlink to notes not written by you."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:122
|
#: lib/memex_web/live/faq_live.html.heex:122
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
msgid "so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
||||||
@ -666,7 +616,7 @@ msgstr ""
|
|||||||
msgid "keep me logged in for 60 days"
|
msgid "keep me logged in for 60 days"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:21
|
#: lib/memex_web/live/invite_live/form_component.html.heex:22
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -677,12 +627,12 @@ msgstr ""
|
|||||||
msgid "password"
|
msgid "password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:25
|
#: lib/memex_web/live/invite_live/form_component.html.heex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "uses left"
|
msgid "uses left"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:29
|
#: lib/memex_web/live/invite_live/form_component.html.heex:44
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "leave \"uses left\" blank to make invite unlimited"
|
msgid "leave \"uses left\" blank to make invite unlimited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -709,3 +659,53 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "log out"
|
msgid "log out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:8
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "confirm your account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:35
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "reset your password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:30
|
||||||
|
#: lib/memex_web/live/step_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/step_live/form_component.html.heex:30
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/context_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/context_live/form_component.html.heex:28
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "use [[note-slug]] to link to a note or [context-slug] to link to a context"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/note_live/form_component.html.heex:25
|
||||||
|
#: lib/memex_web/live/note_live/form_component.html.heex:26
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "use [note-slug] to link to a note"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:91
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could link to the spoon note as an example of how it fits nicely into your hand."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:105
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could link to the physical designs context, maybe with some notes about how it applies in this case."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:102
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "in my opinion, pipelines should be pretty lightweight, and just link to contexts to provide most of the heavy lifting."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:119
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "note, context and pipeline slugs must be unique, and you are free to link to notes not written by you."
|
||||||
|
msgstr ""
|
||||||
|
@ -66,12 +66,12 @@ msgstr ""
|
|||||||
msgid "Welcome to memEx"
|
msgid "Welcome to memEx"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:31
|
#: lib/memex/email.ex:31
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "confirm your memEx account"
|
msgid "confirm your memEx account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:37
|
#: lib/memex/email.ex:37
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "reset your memEx password"
|
msgid "reset your memEx password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -86,7 +86,7 @@ msgstr ""
|
|||||||
msgid "this email was sent from memEx at %{url}"
|
msgid "this email was sent from memEx at %{url}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:43
|
#: lib/memex/email.ex:43
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "update your memEx email"
|
msgid "update your memEx email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -17,12 +17,6 @@ msgstr ""
|
|||||||
msgid "Resend confirmation instructions"
|
msgid "Resend confirmation instructions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:3
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:29
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:15
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:15
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:43
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -51,8 +45,8 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:50
|
#: lib/memex_web/live/note_live/index.html.heex:50
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:34
|
#: lib/memex_web/live/note_live/show.html.heex:34
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:52
|
#: lib/memex_web/live/pipeline_live/index.html.heex:52
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:42
|
#: lib/memex_web/live/pipeline_live/show.html.heex:34
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:113
|
#: lib/memex_web/live/pipeline_live/show.html.heex:105
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete"
|
msgid "delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -67,17 +61,12 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:40
|
#: lib/memex_web/live/note_live/index.html.heex:40
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:24
|
#: lib/memex_web/live/note_live/show.html.heex:24
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:40
|
#: lib/memex_web/live/pipeline_live/index.html.heex:40
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
#: lib/memex_web/live/pipeline_live/show.html.heex:24
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
#: lib/memex_web/live/pipeline_live/show.html.heex:94
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "edit"
|
msgid "edit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/index.html.heex:12
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "invite someone new!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:85
|
#: lib/memex_web/components/core_components/topbar.html.heex:85
|
||||||
#: lib/memex_web/controllers/user_confirmation_html/new.html.heex:28
|
#: lib/memex_web/controllers/user_confirmation_html/new.html.heex:28
|
||||||
#: lib/memex_web/controllers/user_registration_html/new.html.heex:44
|
#: lib/memex_web/controllers/user_registration_html/new.html.heex:44
|
||||||
@ -115,16 +104,16 @@ msgstr ""
|
|||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:44
|
#: lib/memex_web/live/context_live/form_component.html.heex:51
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:32
|
#: lib/memex_web/live/invite_live/form_component.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:44
|
#: lib/memex_web/live/note_live/form_component.html.heex:49
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:44
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:55
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:30
|
#: lib/memex_web/live/step_live/form_component.html.heex:38
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "save"
|
msgid "save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:128
|
#: lib/memex_web/live/pipeline_live/show.html.heex:120
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "add step"
|
msgid "add step"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -169,12 +158,12 @@ msgid "delete %{note_slug}"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:49
|
#: lib/memex_web/live/pipeline_live/index.html.heex:49
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:40
|
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete %{pipeline_slug}"
|
msgid "delete %{pipeline_slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:111
|
#: lib/memex_web/live/pipeline_live/show.html.heex:103
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete %{step_title}"
|
msgid "delete %{step_title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -199,7 +188,7 @@ msgstr ""
|
|||||||
msgid "edit %{pipeline_slug}"
|
msgid "edit %{pipeline_slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:100
|
#: lib/memex_web/live/pipeline_live/show.html.heex:92
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "edit %{step_title}"
|
msgid "edit %{step_title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -209,12 +198,23 @@ msgstr ""
|
|||||||
msgid "edit invite for %{invite_name}"
|
msgid "edit invite for %{invite_name}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:90
|
#: lib/memex_web/live/pipeline_live/show.html.heex:82
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "move %{step_title} down"
|
msgid "move %{step_title} down"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:74
|
#: lib/memex_web/live/pipeline_live/show.html.heex:66
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "move %{step_title} up"
|
msgid "move %{step_title} up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:3
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:29
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "reset password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/invite_live/index.html.heex:12
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "new invite"
|
||||||
|
msgstr ""
|
||||||
|
@ -11,24 +11,14 @@ msgstr ""
|
|||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:8
|
#: lib/memex_web/components/layouts/app.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Confirm your account"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/layouts/live.html.heex:43
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reconnecting..."
|
msgid "Reconnecting..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:36
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset your password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:15
|
#: lib/memex_web/live/context_live/show.html.heex:15
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:15
|
#: lib/memex_web/live/note_live/show.html.heex:15
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:23
|
#: lib/memex_web/live/pipeline_live/show.html.heex:15
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Visibility: %{visibility}"
|
msgid "Visibility: %{visibility}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -54,12 +44,6 @@ msgstr ""
|
|||||||
msgid "confirm new password"
|
msgid "confirm new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "content"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:28
|
#: lib/memex_web/components/core_components/topbar.html.heex:28
|
||||||
#: lib/memex_web/live/context_live/index.ex:35
|
#: lib/memex_web/live/context_live/index.ex:35
|
||||||
#: lib/memex_web/live/context_live/index.ex:43
|
#: lib/memex_web/live/context_live/index.ex:43
|
||||||
@ -237,7 +221,7 @@ msgstr ""
|
|||||||
msgid "public signups"
|
msgid "public signups"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:31
|
#: lib/memex_web/controllers/user_registration_controller.ex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -252,20 +236,20 @@ msgstr ""
|
|||||||
msgid "report bugs or request features"
|
msgid "report bugs or request features"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:45
|
#: lib/memex_web/live/context_live/form_component.html.heex:52
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:45
|
#: lib/memex_web/live/note_live/form_component.html.heex:50
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:45
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:56
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:31
|
#: lib/memex_web/live/step_live/form_component.html.heex:39
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "saving..."
|
msgid "saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:40
|
#: lib/memex_web/live/context_live/form_component.html.heex:46
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:41
|
#: lib/memex_web/live/context_live/form_component.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:40
|
#: lib/memex_web/live/note_live/form_component.html.heex:44
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:41
|
#: lib/memex_web/live/note_live/form_component.html.heex:45
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:40
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:50
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:41
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:51
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "select privacy"
|
msgid "select privacy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -281,12 +265,12 @@ msgstr ""
|
|||||||
msgid "settings"
|
msgid "settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:32
|
#: lib/memex_web/live/context_live/form_component.html.heex:34
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:33
|
#: lib/memex_web/live/context_live/form_component.html.heex:39
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:32
|
#: lib/memex_web/live/note_live/form_component.html.heex:32
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:33
|
#: lib/memex_web/live/note_live/form_component.html.heex:37
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:32
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:38
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:33
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:43
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "tag1,tag2"
|
msgid "tag1,tag2"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -343,8 +327,6 @@ msgid "no contexts found"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:48
|
#: lib/memex_web/components/pipelines_table_component.ex:48
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "description"
|
msgid "description"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -396,12 +378,12 @@ msgstr ""
|
|||||||
#: lib/memex_web/components/contexts_table_component.ex:47
|
#: lib/memex_web/components/contexts_table_component.ex:47
|
||||||
#: lib/memex_web/components/notes_table_component.ex:47
|
#: lib/memex_web/components/notes_table_component.ex:47
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:47
|
#: lib/memex_web/components/pipelines_table_component.ex:47
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:14
|
#: lib/memex_web/live/context_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:15
|
#: lib/memex_web/live/context_live/form_component.html.heex:17
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:14
|
#: lib/memex_web/live/note_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:15
|
#: lib/memex_web/live/note_live/form_component.html.heex:17
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:14
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:15
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:17
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "slug"
|
msgid "slug"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -418,12 +400,6 @@ msgstr ""
|
|||||||
msgid "home"
|
msgid "home"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "use [[note-slug]] to link to a note"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.ex:10
|
#: lib/memex_web/live/faq_live.ex:10
|
||||||
#: lib/memex_web/live/faq_live.html.heex:3
|
#: lib/memex_web/live/faq_live.html.heex:3
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -445,7 +421,7 @@ msgstr ""
|
|||||||
msgid "what is this?"
|
msgid "what is this?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:60
|
#: lib/memex_web/live/pipeline_live/show.html.heex:52
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{position}. %{title}"
|
msgid "%{position}. %{title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -470,43 +446,27 @@ msgstr ""
|
|||||||
msgid "add step to %{slug}"
|
msgid "add step to %{slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:54
|
#: lib/memex_web/live/pipeline_live/show.html.heex:46
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "no steps"
|
msgid "no steps"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:49
|
#: lib/memex_web/live/pipeline_live/show.html.heex:41
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "steps:"
|
msgid "steps:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:14
|
#: lib/memex_web/live/step_live/form_component.html.heex:13
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:15
|
#: lib/memex_web/live/step_live/form_component.html.heex:17
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "title"
|
msgid "title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:24
|
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:25
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "use [[context-slug]] to link to a context"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:65
|
#: lib/memex_web/live/faq_live.html.heex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
msgid "finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:91
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could backlink to the spoon note as an example of how it fits nicely into your hand."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:105
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could backlink to the physical designs context, maybe with some notes about how it applies in this case."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:59
|
#: lib/memex_web/live/faq_live.html.heex:59
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "i really admired the idea of a zettelkasten, especially with org-mode backlinks, however I felt like my notes would immediately become too messy by just putting everything into a single hierarchy."
|
msgid "i really admired the idea of a zettelkasten, especially with org-mode backlinks, however I felt like my notes would immediately become too messy by just putting everything into a single hierarchy."
|
||||||
@ -527,11 +487,6 @@ msgstr ""
|
|||||||
msgid "in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
msgid "in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:102
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "in my opinion, pipelines should be pretty lightweight, and just backlink to contexts to provide most of the heavy lifting."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:28
|
#: lib/memex_web/live/faq_live.html.heex:28
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "memex"
|
msgid "memex"
|
||||||
@ -597,11 +552,6 @@ msgstr ""
|
|||||||
msgid "how many people should i invite?"
|
msgid "how many people should i invite?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:119
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "note, context and pipeline slugs must be unique, and you are free to backlink to notes not written by you."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:122
|
#: lib/memex_web/live/faq_live.html.heex:122
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
msgid "so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
||||||
@ -667,7 +617,7 @@ msgstr ""
|
|||||||
msgid "keep me logged in for 60 days"
|
msgid "keep me logged in for 60 days"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:21
|
#: lib/memex_web/live/invite_live/form_component.html.heex:22
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -678,12 +628,12 @@ msgstr ""
|
|||||||
msgid "password"
|
msgid "password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:25
|
#: lib/memex_web/live/invite_live/form_component.html.heex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "uses left"
|
msgid "uses left"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:29
|
#: lib/memex_web/live/invite_live/form_component.html.heex:44
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "leave \"uses left\" blank to make invite unlimited"
|
msgid "leave \"uses left\" blank to make invite unlimited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -710,3 +660,53 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "log out"
|
msgid "log out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:8
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "confirm your account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:35
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "reset your password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:30
|
||||||
|
#: lib/memex_web/live/step_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/step_live/form_component.html.heex:30
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/context_live/form_component.html.heex:26
|
||||||
|
#: lib/memex_web/live/context_live/form_component.html.heex:28
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "use [[note-slug]] to link to a note or [context-slug] to link to a context"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/note_live/form_component.html.heex:25
|
||||||
|
#: lib/memex_web/live/note_live/form_component.html.heex:26
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "use [note-slug] to link to a note"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:91
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could link to the spoon note as an example of how it fits nicely into your hand."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:105
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could link to the physical designs context, maybe with some notes about how it applies in this case."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:102
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "in my opinion, pipelines should be pretty lightweight, and just link to contexts to provide most of the heavy lifting."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/live/faq_live.html.heex:119
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "note, context and pipeline slugs must be unique, and you are free to link to notes not written by you."
|
||||||
|
msgstr ""
|
||||||
|
@ -67,12 +67,12 @@ msgstr ""
|
|||||||
msgid "Welcome to memEx"
|
msgid "Welcome to memEx"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:31
|
#: lib/memex/email.ex:31
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "confirm your memEx account"
|
msgid "confirm your memEx account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:37
|
#: lib/memex/email.ex:37
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "reset your memEx password"
|
msgid "reset your memEx password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -87,7 +87,7 @@ msgstr ""
|
|||||||
msgid "this email was sent from memEx at %{url}"
|
msgid "this email was sent from memEx at %{url}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:43
|
#: lib/memex/email.ex:43
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "update your memEx email"
|
msgid "update your memEx email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -16,33 +16,6 @@ msgstr ""
|
|||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_session_controller.ex:17
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Invalid email or password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:63
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset password link is invalid or it has expired."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:21
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:50
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Sorry, public registration is disabled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:11
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:40
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Sorry, this invite was not found or expired"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:54
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "User confirmation link is invalid or it has expired."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_auth.ex:266
|
#: lib/memex_web/controllers/user_auth.ex:266
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You are not authorized to view this page."
|
msgid "You are not authorized to view this page."
|
||||||
@ -107,13 +80,6 @@ msgstr ""
|
|||||||
msgid "unauthorized"
|
msgid "unauthorized"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:84
|
|
||||||
#: lib/memex/notes/note.ex:83
|
|
||||||
#: lib/memex/pipelines/pipeline.ex:86
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_html/new.html.heex:13
|
#: lib/memex_web/controllers/user_registration_html/new.html.heex:13
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:13
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:13
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:64
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:64
|
||||||
@ -121,7 +87,9 @@ msgstr ""
|
|||||||
msgid "oops, something went wrong! please check the errors below."
|
msgid "oops, something went wrong! please check the errors below."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:69
|
#: lib/memex_web/controllers/user_registration_controller.ex:12
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:41
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:70
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "sorry, this invite was not found or expired"
|
msgid "sorry, this invite was not found or expired"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -151,3 +119,31 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You must log in to access this page."
|
msgid "You must log in to access this page."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_session_controller.ex:17
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "invalid email or password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:62
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "reset password link is invalid or it has expired."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:22
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:51
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "sorry, public registration is disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:53
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "user confirmation link is invalid or it has expired."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex/contexts/context.ex:84
|
||||||
|
#: lib/memex/notes/note.ex:83
|
||||||
|
#: lib/memex/pipelines/pipeline.ex:86
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
|
msgstr ""
|
||||||
|
@ -11,7 +11,7 @@ msgstr ""
|
|||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:38
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:37
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{email} confirmed successfully."
|
msgid "%{email} confirmed successfully."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -41,21 +41,6 @@ msgstr ""
|
|||||||
msgid "%{user_email} deleted succesfully"
|
msgid "%{user_email} deleted succesfully"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:23
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:24
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "If your email is in our system, you will receive instructions to reset your password shortly."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:46
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Password reset successfully."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:130
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:130
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "are you sure you want to change your language?"
|
msgid "are you sure you want to change your language?"
|
||||||
@ -86,8 +71,8 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:47
|
#: lib/memex_web/live/note_live/index.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:31
|
#: lib/memex_web/live/note_live/show.html.heex:31
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:47
|
#: lib/memex_web/live/pipeline_live/index.html.heex:47
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:39
|
#: lib/memex_web/live/pipeline_live/show.html.heex:31
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:110
|
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "are you sure?"
|
msgid "are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -122,7 +107,7 @@ msgstr ""
|
|||||||
msgid "copied to clipboard"
|
msgid "copied to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:64
|
#: lib/memex_web/controllers/user_registration_controller.ex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "please check your email to verify your account"
|
msgid "please check your email to verify your account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -153,7 +138,22 @@ msgstr ""
|
|||||||
msgid "are you sure you want to delete %{email}? this action is permanent!"
|
msgid "are you sure you want to delete %{email}? this action is permanent!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:34
|
#: lib/memex_web/live/invite_live/form_component.html.heex:49
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "saving..."
|
msgid "saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:23
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "if your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:24
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "if your email is in our system, you will receive instructions to reset your password shortly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:45
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "password reset successfully."
|
||||||
|
msgstr ""
|
||||||
|
@ -15,33 +15,6 @@ msgstr ""
|
|||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_session_controller.ex:17
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Invalid email or password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:63
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reset password link is invalid or it has expired."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:21
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:50
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Sorry, public registration is disabled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:11
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:40
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Sorry, this invite was not found or expired"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:54
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "User confirmation link is invalid or it has expired."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_auth.ex:266
|
#: lib/memex_web/controllers/user_auth.ex:266
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You are not authorized to view this page."
|
msgid "You are not authorized to view this page."
|
||||||
@ -106,13 +79,6 @@ msgstr ""
|
|||||||
msgid "unauthorized"
|
msgid "unauthorized"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:84
|
|
||||||
#: lib/memex/notes/note.ex:83
|
|
||||||
#: lib/memex/pipelines/pipeline.ex:86
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_html/new.html.heex:13
|
#: lib/memex_web/controllers/user_registration_html/new.html.heex:13
|
||||||
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:13
|
#: lib/memex_web/controllers/user_reset_password_html/edit.html.heex:13
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:64
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:64
|
||||||
@ -120,7 +86,9 @@ msgstr ""
|
|||||||
msgid "oops, something went wrong! please check the errors below."
|
msgid "oops, something went wrong! please check the errors below."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:69
|
#: lib/memex_web/controllers/user_registration_controller.ex:12
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:41
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:70
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "sorry, this invite was not found or expired"
|
msgid "sorry, this invite was not found or expired"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -150,3 +118,31 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You must log in to access this page."
|
msgid "You must log in to access this page."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_session_controller.ex:17
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "invalid email or password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:62
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "reset password link is invalid or it has expired."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:22
|
||||||
|
#: lib/memex_web/controllers/user_registration_controller.ex:51
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "sorry, public registration is disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:53
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "user confirmation link is invalid or it has expired."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex/contexts/context.ex:84
|
||||||
|
#: lib/memex/notes/note.ex:83
|
||||||
|
#: lib/memex/pipelines/pipeline.ex:86
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
|
msgstr ""
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:38
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:37
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{email} confirmed successfully."
|
msgid "%{email} confirmed successfully."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -40,21 +40,6 @@ msgstr ""
|
|||||||
msgid "%{user_email} deleted succesfully"
|
msgid "%{user_email} deleted succesfully"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:23
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:24
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "If your email is in our system, you will receive instructions to reset your password shortly."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:46
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Password reset successfully."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:130
|
#: lib/memex_web/controllers/user_settings_html/edit.html.heex:130
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "are you sure you want to change your language?"
|
msgid "are you sure you want to change your language?"
|
||||||
@ -85,8 +70,8 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/note_live/index.html.heex:47
|
#: lib/memex_web/live/note_live/index.html.heex:47
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:31
|
#: lib/memex_web/live/note_live/show.html.heex:31
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:47
|
#: lib/memex_web/live/pipeline_live/index.html.heex:47
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:39
|
#: lib/memex_web/live/pipeline_live/show.html.heex:31
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:110
|
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "are you sure?"
|
msgid "are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -121,7 +106,7 @@ msgstr ""
|
|||||||
msgid "copied to clipboard"
|
msgid "copied to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_registration_controller.ex:64
|
#: lib/memex_web/controllers/user_registration_controller.ex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "please check your email to verify your account"
|
msgid "please check your email to verify your account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -152,7 +137,22 @@ msgstr ""
|
|||||||
msgid "are you sure you want to delete %{email}? this action is permanent!"
|
msgid "are you sure you want to delete %{email}? this action is permanent!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/form_component.html.heex:34
|
#: lib/memex_web/live/invite_live/form_component.html.heex:49
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "saving..."
|
msgid "saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_confirmation_controller.ex:23
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "if your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:24
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "if your email is in our system, you will receive instructions to reset your password shortly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:45
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "password reset successfully."
|
||||||
|
msgstr ""
|
||||||
|
@ -3,7 +3,7 @@ defmodule Memex.InvitesTest do
|
|||||||
This module tests the Memex.Accounts.Invites context
|
This module tests the Memex.Accounts.Invites context
|
||||||
"""
|
"""
|
||||||
|
|
||||||
use Memex.DataCase
|
use Memex.DataCase, async: true
|
||||||
alias Ecto.Changeset
|
alias Ecto.Changeset
|
||||||
alias Memex.Accounts
|
alias Memex.Accounts
|
||||||
alias Memex.Accounts.{Invite, Invites}
|
alias Memex.Accounts.{Invite, Invites}
|
||||||
|
@ -3,7 +3,7 @@ defmodule Memex.AccountsTest do
|
|||||||
This tests the accounts module
|
This tests the accounts module
|
||||||
"""
|
"""
|
||||||
|
|
||||||
use Memex.DataCase
|
use Memex.DataCase, async: true
|
||||||
alias Ecto.Changeset
|
alias Ecto.Changeset
|
||||||
alias Memex.Accounts
|
alias Memex.Accounts
|
||||||
alias Memex.Accounts.{Invites, User, UserToken}
|
alias Memex.Accounts.{Invites, User, UserToken}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
defmodule Memex.ContextsTest do
|
defmodule Memex.ContextsTest do
|
||||||
use Memex.DataCase
|
use Memex.DataCase, async: true
|
||||||
import Memex.Fixtures
|
import Memex.Fixtures
|
||||||
alias Memex.{Contexts, Contexts.Context}
|
alias Memex.{Contexts, Contexts.Context}
|
||||||
@moduletag :contexts_test
|
@moduletag :contexts_test
|
||||||
|
40
test/memex/email_worker_test.exs
Normal file
40
test/memex/email_worker_test.exs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
defmodule Memex.EmailWorkerTest do
|
||||||
|
use Memex.DataCase, async: true
|
||||||
|
|
||||||
|
def perform_job(worker, args) do
|
||||||
|
Oban.Testing.perform_job(worker, args, [])
|
||||||
|
end
|
||||||
|
|
||||||
|
test "sending welcome email" do
|
||||||
|
user = user_fixture()
|
||||||
|
|
||||||
|
{:ok, _user} =
|
||||||
|
perform_job(Memex.EmailWorker, %{
|
||||||
|
"email" => "welcome",
|
||||||
|
"user_id" => user.id,
|
||||||
|
"attrs" => %{"url" => "test_url"}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
test "sending reset password email" do
|
||||||
|
user = user_fixture()
|
||||||
|
|
||||||
|
{:ok, _user} =
|
||||||
|
perform_job(Memex.EmailWorker, %{
|
||||||
|
"email" => "reset_password",
|
||||||
|
"user_id" => user.id,
|
||||||
|
"attrs" => %{"url" => "test_url"}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
test "sending update email email" do
|
||||||
|
user = user_fixture()
|
||||||
|
|
||||||
|
{:ok, _user} =
|
||||||
|
perform_job(Memex.EmailWorker, %{
|
||||||
|
"email" => "update_email",
|
||||||
|
"user_id" => user.id,
|
||||||
|
"attrs" => %{"url" => "test_url"}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
@ -1,5 +1,5 @@
|
|||||||
defmodule Memex.NotesTest do
|
defmodule Memex.NotesTest do
|
||||||
use Memex.DataCase
|
use Memex.DataCase, async: true
|
||||||
import Memex.Fixtures
|
import Memex.Fixtures
|
||||||
alias Memex.{Notes, Notes.Note}
|
alias Memex.{Notes, Notes.Note}
|
||||||
@moduletag :notes_test
|
@moduletag :notes_test
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
defmodule Memex.PipelinesTest do
|
defmodule Memex.PipelinesTest do
|
||||||
use Memex.DataCase
|
use Memex.DataCase, async: true
|
||||||
import Memex.Fixtures
|
import Memex.Fixtures
|
||||||
alias Memex.{Pipelines, Pipelines.Pipeline}
|
alias Memex.{Pipelines, Pipelines.Pipeline}
|
||||||
@moduletag :pipelines_test
|
@moduletag :pipelines_test
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
defmodule Memex.StepsTest do
|
defmodule Memex.StepsTest do
|
||||||
use Memex.DataCase
|
use Memex.DataCase, async: true
|
||||||
import Memex.Fixtures
|
import Memex.Fixtures
|
||||||
alias Memex.Pipelines.{Steps, Steps.Step}
|
alias Memex.Pipelines.{Steps, Steps.Step}
|
||||||
@moduletag :steps_test
|
@moduletag :steps_test
|
||||||
|
@ -3,7 +3,7 @@ defmodule MemexWeb.ExportControllerTest do
|
|||||||
Tests the export function
|
Tests the export function
|
||||||
"""
|
"""
|
||||||
|
|
||||||
use MemexWeb.ConnCase
|
use MemexWeb.ConnCase, async: true
|
||||||
import Memex.Fixtures
|
import Memex.Fixtures
|
||||||
|
|
||||||
@moduletag :export_controller_test
|
@moduletag :export_controller_test
|
||||||
|
@ -24,7 +24,7 @@ defmodule MemexWeb.UserAuthTest do
|
|||||||
conn = UserAuth.log_in_user(conn, current_user)
|
conn = UserAuth.log_in_user(conn, current_user)
|
||||||
assert token = get_session(conn, :user_token)
|
assert token = get_session(conn, :user_token)
|
||||||
assert get_session(conn, :live_socket_id) == "users_sessions:#{Base.url_encode64(token)}"
|
assert get_session(conn, :live_socket_id) == "users_sessions:#{Base.url_encode64(token)}"
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
assert Accounts.get_user_by_session_token(token)
|
assert Accounts.get_user_by_session_token(token)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ defmodule MemexWeb.UserAuthTest do
|
|||||||
refute get_session(conn, :user_token)
|
refute get_session(conn, :user_token)
|
||||||
refute conn.cookies[@remember_me_cookie]
|
refute conn.cookies[@remember_me_cookie]
|
||||||
assert %{max_age: 0} = conn.resp_cookies[@remember_me_cookie]
|
assert %{max_age: 0} = conn.resp_cookies[@remember_me_cookie]
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
refute Accounts.get_user_by_session_token(user_token)
|
refute Accounts.get_user_by_session_token(user_token)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ defmodule MemexWeb.UserAuthTest do
|
|||||||
conn = conn |> fetch_cookies() |> UserAuth.log_out_user()
|
conn = conn |> fetch_cookies() |> UserAuth.log_out_user()
|
||||||
refute get_session(conn, :user_token)
|
refute get_session(conn, :user_token)
|
||||||
assert %{max_age: 0} = conn.resp_cookies[@remember_me_cookie]
|
assert %{max_age: 0} = conn.resp_cookies[@remember_me_cookie]
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -129,7 +129,7 @@ defmodule MemexWeb.UserAuthTest do
|
|||||||
|> UserAuth.redirect_if_user_is_authenticated([])
|
|> UserAuth.redirect_if_user_is_authenticated([])
|
||||||
|
|
||||||
assert conn.halted
|
assert conn.halted
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "does not redirect if user is not authenticated", %{conn: conn} do
|
test "does not redirect if user is not authenticated", %{conn: conn} do
|
||||||
|
@ -23,15 +23,11 @@ defmodule MemexWeb.UserConfirmationControllerTest do
|
|||||||
describe "POST /users/confirm" do
|
describe "POST /users/confirm" do
|
||||||
@tag :capture_log
|
@tag :capture_log
|
||||||
test "sends a new confirmation token", %{conn: conn, user: user} do
|
test "sends a new confirmation token", %{conn: conn, user: user} do
|
||||||
conn =
|
conn = post(conn, ~p"/users/confirm", %{user: %{email: user.email}})
|
||||||
post(conn, ~p"/users/confirm", %{
|
assert redirected_to(conn) == ~p"/"
|
||||||
user: %{email: user.email}
|
|
||||||
})
|
|
||||||
|
|
||||||
assert redirected_to(conn) == "/"
|
assert conn.assigns.flash["info"] =~
|
||||||
|
"if your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
||||||
conn.assigns.flash["info"] =~
|
|
||||||
"If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
|
||||||
|
|
||||||
assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "confirm"
|
assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "confirm"
|
||||||
end
|
end
|
||||||
@ -39,27 +35,19 @@ defmodule MemexWeb.UserConfirmationControllerTest do
|
|||||||
test "does not send confirmation token if User is confirmed", %{conn: conn, user: user} do
|
test "does not send confirmation token if User is confirmed", %{conn: conn, user: user} do
|
||||||
Repo.update!(Accounts.User.confirm_changeset(user))
|
Repo.update!(Accounts.User.confirm_changeset(user))
|
||||||
|
|
||||||
conn =
|
conn = post(conn, ~p"/users/confirm", %{user: %{email: user.email}})
|
||||||
post(conn, ~p"/users/confirm", %{
|
assert redirected_to(conn) == ~p"/"
|
||||||
user: %{email: user.email}
|
|
||||||
})
|
|
||||||
|
|
||||||
assert redirected_to(conn) == "/"
|
assert conn.assigns.flash["info"] =~
|
||||||
|
"if your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
||||||
conn.assigns.flash["info"] =~
|
|
||||||
"If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "does not send confirmation token if email is invalid", %{conn: conn} do
|
test "does not send confirmation token if email is invalid", %{conn: conn} do
|
||||||
conn =
|
conn = post(conn, ~p"/users/confirm", %{user: %{email: "unknown@example.com"}})
|
||||||
post(conn, ~p"/users/confirm", %{
|
assert redirected_to(conn) == ~p"/"
|
||||||
user: %{email: "unknown@example.com"}
|
|
||||||
})
|
|
||||||
|
|
||||||
assert redirected_to(conn) == "/"
|
assert conn.assigns.flash["info"] =~
|
||||||
|
"if your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
||||||
conn.assigns.flash["info"] =~
|
|
||||||
"If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
|
||||||
|
|
||||||
assert Repo.all(Accounts.UserToken) == []
|
assert Repo.all(Accounts.UserToken) == []
|
||||||
end
|
end
|
||||||
@ -73,18 +61,16 @@ defmodule MemexWeb.UserConfirmationControllerTest do
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
conn = get(conn, ~p"/users/confirm/#{token}")
|
conn = get(conn, ~p"/users/confirm/#{token}")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
|
assert conn.assigns.flash["info"] =~ "#{user.email} confirmed successfully"
|
||||||
conn.assigns.flash["info"] =~ "#{user.email} confirmed successfully"
|
|
||||||
|
|
||||||
assert Accounts.get_user!(user.id).confirmed_at
|
assert Accounts.get_user!(user.id).confirmed_at
|
||||||
refute get_session(conn, :user_token)
|
refute get_session(conn, :user_token)
|
||||||
assert Repo.all(Accounts.UserToken) == []
|
assert Repo.all(Accounts.UserToken) == []
|
||||||
|
|
||||||
# When not logged in
|
# When not logged in
|
||||||
conn = get(conn, ~p"/users/confirm/#{token}")
|
conn = get(conn, ~p"/users/confirm/#{token}")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
conn.assigns.flash["error"] =~ "User confirmation link is invalid or it has expired"
|
assert conn.assigns.flash["error"] =~ "user confirmation link is invalid or it has expired"
|
||||||
|
|
||||||
# When logged in
|
# When logged in
|
||||||
conn =
|
conn =
|
||||||
@ -92,15 +78,14 @@ defmodule MemexWeb.UserConfirmationControllerTest do
|
|||||||
|> log_in_user(user)
|
|> log_in_user(user)
|
||||||
|> get(~p"/users/confirm/#{token}")
|
|> get(~p"/users/confirm/#{token}")
|
||||||
|
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
refute conn.assigns.flash["error"]
|
refute conn.assigns.flash["error"]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "does not confirm email with invalid token", %{conn: conn, user: user} do
|
test "does not confirm email with invalid token", %{conn: conn, user: user} do
|
||||||
conn = get(conn, ~p"/users/confirm/#{"oops"}")
|
conn = get(conn, ~p"/users/confirm/oops")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
conn.assigns.flash["error"] =~ "User confirmation link is invalid or it has expired"
|
assert conn.assigns.flash["error"] =~ "user confirmation link is invalid or it has expired"
|
||||||
|
|
||||||
refute Accounts.get_user!(user.id).confirmed_at
|
refute Accounts.get_user!(user.id).confirmed_at
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -17,7 +17,7 @@ defmodule MemexWeb.UserRegistrationControllerTest do
|
|||||||
|
|
||||||
test "redirects if already logged in", %{conn: conn} do
|
test "redirects if already logged in", %{conn: conn} do
|
||||||
conn = conn |> log_in_user(user_fixture()) |> get(~p"/users/register")
|
conn = conn |> log_in_user(user_fixture()) |> get(~p"/users/register")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -25,24 +25,24 @@ defmodule MemexWeb.UserRegistrationControllerTest do
|
|||||||
@tag :capture_log
|
@tag :capture_log
|
||||||
test "creates account and logs the user in", %{conn: conn} do
|
test "creates account and logs the user in", %{conn: conn} do
|
||||||
email = unique_user_email()
|
email = unique_user_email()
|
||||||
|
conn = post(conn, ~p"/users/register", %{user: valid_user_attributes(email: email)})
|
||||||
conn =
|
|
||||||
post(conn, ~p"/users/register", %{
|
|
||||||
user: valid_user_attributes(email: email)
|
|
||||||
})
|
|
||||||
|
|
||||||
assert get_session(conn, :phoenix_flash) == %{
|
assert get_session(conn, :phoenix_flash) == %{
|
||||||
"info" => "please check your email to verify your account"
|
"info" => "please check your email to verify your account"
|
||||||
}
|
}
|
||||||
|
|
||||||
assert redirected_to(conn) =~ "/"
|
assert redirected_to(conn) =~ ~p"/"
|
||||||
|
|
||||||
|
# Now do a logged in request and assert on the menu
|
||||||
|
conn = get(conn, ~p"/")
|
||||||
|
response = html_response(conn, 200)
|
||||||
|
# user's email is recorded as admin
|
||||||
|
assert response =~ email
|
||||||
end
|
end
|
||||||
|
|
||||||
test "render errors for invalid data", %{conn: conn} do
|
test "render errors for invalid data", %{conn: conn} do
|
||||||
conn =
|
conn =
|
||||||
post(conn, ~p"/users/register", %{
|
post(conn, ~p"/users/register", %{user: %{email: "with spaces", password: "too short"}})
|
||||||
user: %{email: "with spaces", password: "too short"}
|
|
||||||
})
|
|
||||||
|
|
||||||
response = html_response(conn, 200)
|
response = html_response(conn, 200)
|
||||||
assert response =~ "register"
|
assert response =~ "register"
|
||||||
|
@ -23,29 +23,21 @@ defmodule MemexWeb.UserResetPasswordControllerTest do
|
|||||||
describe "POST /users/reset_password" do
|
describe "POST /users/reset_password" do
|
||||||
@tag :capture_log
|
@tag :capture_log
|
||||||
test "sends a new reset password token", %{conn: conn, user: user} do
|
test "sends a new reset password token", %{conn: conn, user: user} do
|
||||||
conn =
|
conn = post(conn, ~p"/users/reset_password", %{user: %{email: user.email}})
|
||||||
post(conn, ~p"/users/reset_password", %{
|
assert redirected_to(conn) == ~p"/"
|
||||||
user: %{email: user.email}
|
|
||||||
})
|
|
||||||
|
|
||||||
assert redirected_to(conn) == "/"
|
assert conn.assigns.flash["info"] =~
|
||||||
|
"if your email is in our system, you will receive instructions to reset your password shortly."
|
||||||
conn.assigns.flash["info"] =~
|
|
||||||
"If your email is in our system, you will receive instructions to reset your password shortly."
|
|
||||||
|
|
||||||
assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "reset_password"
|
assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "reset_password"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "does not send reset password token if email is invalid", %{conn: conn} do
|
test "does not send reset password token if email is invalid", %{conn: conn} do
|
||||||
conn =
|
conn = post(conn, ~p"/users/reset_password", %{user: %{email: "unknown@example.com"}})
|
||||||
post(conn, ~p"/users/reset_password", %{
|
assert redirected_to(conn) == ~p"/"
|
||||||
user: %{email: "unknown@example.com"}
|
|
||||||
})
|
|
||||||
|
|
||||||
assert redirected_to(conn) == "/"
|
assert conn.assigns.flash["info"] =~
|
||||||
|
"if your email is in our system, you will receive instructions to reset your password shortly."
|
||||||
conn.assigns.flash["info"] =~
|
|
||||||
"If your email is in our system, you will receive instructions to reset your password shortly."
|
|
||||||
|
|
||||||
assert Repo.all(Accounts.UserToken) == []
|
assert Repo.all(Accounts.UserToken) == []
|
||||||
end
|
end
|
||||||
@ -63,13 +55,13 @@ defmodule MemexWeb.UserResetPasswordControllerTest do
|
|||||||
|
|
||||||
test "renders reset password", %{conn: conn, token: token} do
|
test "renders reset password", %{conn: conn, token: token} do
|
||||||
conn = get(conn, ~p"/users/reset_password/#{token}")
|
conn = get(conn, ~p"/users/reset_password/#{token}")
|
||||||
assert html_response(conn, 200) =~ "Reset password"
|
assert html_response(conn, 200) =~ "reset password"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "does not render reset password with invalid token", %{conn: conn} do
|
test "does not render reset password with invalid token", %{conn: conn} do
|
||||||
conn = get(conn, ~p"/users/reset_password/#{"oops"}")
|
conn = get(conn, ~p"/users/reset_password/oops")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
conn.assigns.flash["error"] =~ "Reset password link is invalid or it has expired"
|
assert conn.assigns.flash["error"] =~ "reset password link is invalid or it has expired"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -94,7 +86,7 @@ defmodule MemexWeb.UserResetPasswordControllerTest do
|
|||||||
|
|
||||||
assert redirected_to(conn) == ~p"/users/log_in"
|
assert redirected_to(conn) == ~p"/users/log_in"
|
||||||
refute get_session(conn, :user_token)
|
refute get_session(conn, :user_token)
|
||||||
conn.assigns.flash["info"] =~ "Password reset successfully"
|
assert conn.assigns.flash["info"] =~ "password reset successfully"
|
||||||
assert Accounts.get_user_by_email_and_password(user.email, "new valid password")
|
assert Accounts.get_user_by_email_and_password(user.email, "new valid password")
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -108,15 +100,15 @@ defmodule MemexWeb.UserResetPasswordControllerTest do
|
|||||||
})
|
})
|
||||||
|
|
||||||
response = html_response(conn, 200)
|
response = html_response(conn, 200)
|
||||||
assert response =~ "Reset password"
|
assert response =~ "reset password"
|
||||||
assert response =~ "should be at least 12 character(s)"
|
assert response =~ "should be at least 12 character(s)"
|
||||||
assert response =~ "does not match password"
|
assert response =~ "does not match password"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "does not reset password with invalid token", %{conn: conn} do
|
test "does not reset password with invalid token", %{conn: conn} do
|
||||||
conn = put(conn, ~p"/users/reset_password/#{"oops"}")
|
conn = put(conn, ~p"/users/reset_password/oops")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
conn.assigns.flash["error"] =~ "Reset password link is invalid or it has expired"
|
assert conn.assigns.flash["error"] =~ "reset password link is invalid or it has expired"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -20,7 +20,7 @@ defmodule MemexWeb.UserSessionControllerTest do
|
|||||||
|
|
||||||
test "redirects if already logged in", %{conn: conn, current_user: current_user} do
|
test "redirects if already logged in", %{conn: conn, current_user: current_user} do
|
||||||
conn = conn |> log_in_user(current_user) |> get(~p"/users/log_in")
|
conn = conn |> log_in_user(current_user) |> get(~p"/users/log_in")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -32,10 +32,10 @@ defmodule MemexWeb.UserSessionControllerTest do
|
|||||||
})
|
})
|
||||||
|
|
||||||
assert get_session(conn, :user_token)
|
assert get_session(conn, :user_token)
|
||||||
assert redirected_to(conn) =~ "/"
|
assert redirected_to(conn) =~ ~p"/"
|
||||||
|
|
||||||
# Now do a logged in request and assert on the menu
|
# Now do a logged in request and assert on the menu
|
||||||
conn = get(conn, "/")
|
conn = get(conn, ~p"/")
|
||||||
response = html_response(conn, 200)
|
response = html_response(conn, 200)
|
||||||
assert response =~ current_user.email
|
assert response =~ current_user.email
|
||||||
assert response =~ "are you sure you want to log out?"
|
assert response =~ "are you sure you want to log out?"
|
||||||
@ -52,7 +52,7 @@ defmodule MemexWeb.UserSessionControllerTest do
|
|||||||
})
|
})
|
||||||
|
|
||||||
assert conn.resp_cookies["_memex_web_user_remember_me"]
|
assert conn.resp_cookies["_memex_web_user_remember_me"]
|
||||||
assert redirected_to(conn) =~ "/"
|
assert redirected_to(conn) =~ ~p"/"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "logs the user in with return to", %{conn: conn, current_user: current_user} do
|
test "logs the user in with return to", %{conn: conn, current_user: current_user} do
|
||||||
@ -71,30 +71,26 @@ defmodule MemexWeb.UserSessionControllerTest do
|
|||||||
|
|
||||||
test "emits error message with invalid credentials",
|
test "emits error message with invalid credentials",
|
||||||
%{conn: conn, current_user: current_user} do
|
%{conn: conn, current_user: current_user} do
|
||||||
conn =
|
conn = post(conn, ~p"/users/log_in", %{user: %{email: current_user.email, password: "bad"}})
|
||||||
post(conn, ~p"/users/log_in", %{
|
|
||||||
user: %{email: current_user.email, password: "bad"}
|
|
||||||
})
|
|
||||||
|
|
||||||
response = html_response(conn, 200)
|
response = html_response(conn, 200)
|
||||||
assert response =~ "log in"
|
assert response =~ "log in"
|
||||||
assert response =~ "Invalid email or password"
|
assert response =~ "invalid email or password"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "DELETE /users/log_out" do
|
describe "DELETE /users/log_out" do
|
||||||
test "logs the user out", %{conn: conn, current_user: current_user} do
|
test "logs the user out", %{conn: conn, current_user: current_user} do
|
||||||
conn = conn |> log_in_user(current_user) |> delete(~p"/users/log_out")
|
conn = conn |> log_in_user(current_user) |> delete(~p"/users/log_out")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
refute get_session(conn, :user_token)
|
refute get_session(conn, :user_token)
|
||||||
conn.assigns.flash["info"] =~ "logged out successfully"
|
assert conn.assigns.flash["info"] =~ "logged out successfully"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "succeeds even if the user is not logged in", %{conn: conn} do
|
test "succeeds even if the user is not logged in", %{conn: conn} do
|
||||||
conn = delete(conn, ~p"/users/log_out")
|
conn = delete(conn, ~p"/users/log_out")
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
refute get_session(conn, :user_token)
|
refute get_session(conn, :user_token)
|
||||||
conn.assigns.flash["info"] =~ "logged out successfully"
|
assert conn.assigns.flash["info"] =~ "logged out successfully"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -39,8 +39,7 @@ defmodule MemexWeb.UserSettingsControllerTest do
|
|||||||
|
|
||||||
assert redirected_to(new_password_conn) == ~p"/users/settings"
|
assert redirected_to(new_password_conn) == ~p"/users/settings"
|
||||||
assert get_session(new_password_conn, :user_token) != get_session(conn, :user_token)
|
assert get_session(new_password_conn, :user_token) != get_session(conn, :user_token)
|
||||||
new_password_conn.assigns.flash["info"] =~ "password updated successfully"
|
assert new_password_conn.assigns.flash["info"] =~ "password updated successfully"
|
||||||
|
|
||||||
assert Accounts.get_user_by_email_and_password(current_user.email, "new valid password")
|
assert Accounts.get_user_by_email_and_password(current_user.email, "new valid password")
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -60,7 +59,6 @@ defmodule MemexWeb.UserSettingsControllerTest do
|
|||||||
assert response =~ "should be at least 12 character(s)"
|
assert response =~ "should be at least 12 character(s)"
|
||||||
assert response =~ "does not match password"
|
assert response =~ "does not match password"
|
||||||
assert response =~ "is not valid"
|
assert response =~ "is not valid"
|
||||||
|
|
||||||
assert get_session(old_password_conn, :user_token) == get_session(conn, :user_token)
|
assert get_session(old_password_conn, :user_token) == get_session(conn, :user_token)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -72,13 +70,13 @@ defmodule MemexWeb.UserSettingsControllerTest do
|
|||||||
put(conn, ~p"/users/settings", %{
|
put(conn, ~p"/users/settings", %{
|
||||||
action: "update_email",
|
action: "update_email",
|
||||||
current_password: valid_user_password(),
|
current_password: valid_user_password(),
|
||||||
user: %{"email" => unique_user_email()}
|
user: %{email: unique_user_email()}
|
||||||
})
|
})
|
||||||
|
|
||||||
assert redirected_to(conn) == ~p"/users/settings"
|
assert redirected_to(conn) == ~p"/users/settings"
|
||||||
|
|
||||||
conn.assigns.flash["info"] =~
|
assert conn.assigns.flash["info"] =~
|
||||||
"a link to confirm your email change has been sent to the new address."
|
"a link to confirm your email change has been sent to the new address."
|
||||||
|
|
||||||
assert Accounts.get_user_by_email(current_user.email)
|
assert Accounts.get_user_by_email(current_user.email)
|
||||||
end
|
end
|
||||||
@ -86,9 +84,9 @@ defmodule MemexWeb.UserSettingsControllerTest do
|
|||||||
test "does not update email on invalid data", %{conn: conn} do
|
test "does not update email on invalid data", %{conn: conn} do
|
||||||
conn =
|
conn =
|
||||||
put(conn, ~p"/users/settings", %{
|
put(conn, ~p"/users/settings", %{
|
||||||
"action" => "update_email",
|
action: "update_email",
|
||||||
"current_password" => "invalid",
|
current_password: "invalid",
|
||||||
"user" => %{"email" => "with spaces"}
|
user: %{email: "with spaces"}
|
||||||
})
|
})
|
||||||
|
|
||||||
response = html_response(conn, 200)
|
response = html_response(conn, 200)
|
||||||
@ -118,19 +116,19 @@ defmodule MemexWeb.UserSettingsControllerTest do
|
|||||||
%{conn: conn, current_user: current_user, token: token, email: email} do
|
%{conn: conn, current_user: current_user, token: token, email: email} do
|
||||||
conn = get(conn, ~p"/users/settings/confirm_email/#{token}")
|
conn = get(conn, ~p"/users/settings/confirm_email/#{token}")
|
||||||
assert redirected_to(conn) == ~p"/users/settings"
|
assert redirected_to(conn) == ~p"/users/settings"
|
||||||
conn.assigns.flash["info"] =~ "email changed successfully"
|
assert conn.assigns.flash["info"] =~ "email changed successfully"
|
||||||
refute Accounts.get_user_by_email(current_user.email)
|
refute Accounts.get_user_by_email(current_user.email)
|
||||||
assert Accounts.get_user_by_email(email)
|
assert Accounts.get_user_by_email(email)
|
||||||
|
|
||||||
conn = get(conn, ~p"/users/settings/confirm_email/#{token}")
|
conn = get(conn, ~p"/users/settings/confirm_email/#{token}")
|
||||||
assert redirected_to(conn) == ~p"/users/settings"
|
assert redirected_to(conn) == ~p"/users/settings"
|
||||||
conn.assigns.flash["error"] =~ "email change link is invalid or it has expired"
|
assert conn.assigns.flash["error"] =~ "email change link is invalid or it has expired"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "does not update email with invalid token", %{conn: conn, current_user: current_user} do
|
test "does not update email with invalid token", %{conn: conn, current_user: current_user} do
|
||||||
conn = get(conn, ~p"/users/settings/confirm_email/#{"oops"}")
|
conn = get(conn, ~p"/users/settings/confirm_email/oops")
|
||||||
assert redirected_to(conn) == ~p"/users/settings"
|
assert redirected_to(conn) == ~p"/users/settings"
|
||||||
conn.assigns.flash["error"] =~ "email change link is invalid or it has expired"
|
assert conn.assigns.flash["error"] =~ "email change link is invalid or it has expired"
|
||||||
assert Accounts.get_user_by_email(current_user.email)
|
assert Accounts.get_user_by_email(current_user.email)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
defmodule MemexWeb.ContextLiveTest do
|
defmodule MemexWeb.ContextLiveTest do
|
||||||
use MemexWeb.ConnCase
|
use MemexWeb.ConnCase, async: true
|
||||||
import Phoenix.LiveViewTest
|
import Phoenix.LiveViewTest
|
||||||
import Memex.Fixtures
|
import Memex.Fixtures
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
}
|
}
|
||||||
@invalid_attrs %{
|
@invalid_attrs %{
|
||||||
content: nil,
|
content: nil,
|
||||||
tags_string: "invalid tags",
|
tags_string: "invalid_tag or_tags",
|
||||||
slug: nil,
|
slug: nil,
|
||||||
visibility: nil
|
visibility: nil
|
||||||
}
|
}
|
||||||
@ -114,7 +114,7 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
|> render_change(context: @invalid_attrs)
|
|> render_change(context: @invalid_attrs)
|
||||||
|
|
||||||
assert html =~ "can't be blank"
|
assert html =~ "can't be blank"
|
||||||
assert html =~ "tags must be comma-delimited"
|
assert html =~ "tags must be comma or space delimited"
|
||||||
|
|
||||||
{:ok, _live, html} =
|
{:ok, _live, html} =
|
||||||
show_live
|
show_live
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
defmodule MemexWeb.FaqLiveTest do
|
defmodule MemexWeb.FaqLiveTest do
|
||||||
use MemexWeb.ConnCase
|
use MemexWeb.ConnCase, async: true
|
||||||
|
|
||||||
import Phoenix.LiveViewTest
|
import Phoenix.LiveViewTest
|
||||||
|
|
||||||
test "disconnected and connected render", %{conn: conn} do
|
test "disconnected and connected render", %{conn: conn} do
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
defmodule MemexWeb.HomeLiveTest do
|
defmodule MemexWeb.HomeLiveTest do
|
||||||
use MemexWeb.ConnCase
|
use MemexWeb.ConnCase, async: true
|
||||||
|
|
||||||
import Phoenix.LiveViewTest
|
import Phoenix.LiveViewTest
|
||||||
|
|
||||||
test "disconnected and connected render", %{conn: conn} do
|
test "disconnected and connected render", %{conn: conn} do
|
||||||
@ -8,4 +7,10 @@ defmodule MemexWeb.HomeLiveTest do
|
|||||||
assert disconnected_html =~ "memEx"
|
assert disconnected_html =~ "memEx"
|
||||||
assert render(page_live) =~ "memEx"
|
assert render(page_live) =~ "memEx"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "displays version number", %{conn: conn} do
|
||||||
|
{:ok, home_live, disconnected_html} = live(conn, ~p"/")
|
||||||
|
assert disconnected_html =~ Mix.Project.config()[:version]
|
||||||
|
assert render(home_live) =~ Mix.Project.config()[:version]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -3,7 +3,7 @@ defmodule MemexWeb.InviteLiveTest do
|
|||||||
Tests the invite liveview
|
Tests the invite liveview
|
||||||
"""
|
"""
|
||||||
|
|
||||||
use MemexWeb.ConnCase
|
use MemexWeb.ConnCase, async: true
|
||||||
import Phoenix.LiveViewTest
|
import Phoenix.LiveViewTest
|
||||||
alias Memex.Accounts.Invites
|
alias Memex.Accounts.Invites
|
||||||
|
|
||||||
@ -22,7 +22,6 @@ defmodule MemexWeb.InviteLiveTest do
|
|||||||
|
|
||||||
test "lists all invites", %{conn: conn, invite: invite} do
|
test "lists all invites", %{conn: conn, invite: invite} do
|
||||||
{:ok, _index_live, html} = live(conn, ~p"/invites")
|
{:ok, _index_live, html} = live(conn, ~p"/invites")
|
||||||
|
|
||||||
assert html =~ "invites"
|
assert html =~ "invites"
|
||||||
assert html =~ invite.name
|
assert html =~ invite.name
|
||||||
end
|
end
|
||||||
@ -52,7 +51,7 @@ defmodule MemexWeb.InviteLiveTest do
|
|||||||
|> element(~s/a[aria-label="edit invite for #{invite.name}"]/)
|
|> element(~s/a[aria-label="edit invite for #{invite.name}"]/)
|
||||||
|> render_click() =~ "edit invite"
|
|> render_click() =~ "edit invite"
|
||||||
|
|
||||||
assert_patch(index_live, ~p"/invites/#{invite}/edit")
|
assert_patch(index_live, ~p"/invites/edit/#{invite}")
|
||||||
|
|
||||||
assert index_live
|
assert index_live
|
||||||
|> form("#invite-form")
|
|> form("#invite-form")
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
defmodule MemexWeb.NoteLiveTest do
|
defmodule MemexWeb.NoteLiveTest do
|
||||||
use MemexWeb.ConnCase
|
use MemexWeb.ConnCase, async: true
|
||||||
|
|
||||||
import Phoenix.LiveViewTest
|
import Phoenix.LiveViewTest
|
||||||
import Memex.Fixtures
|
import Memex.Fixtures
|
||||||
|
|
||||||
@ -18,7 +17,7 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
}
|
}
|
||||||
@invalid_attrs %{
|
@invalid_attrs %{
|
||||||
content: nil,
|
content: nil,
|
||||||
tags_string: "invalid tags",
|
tags_string: "invalid_tag or_tags",
|
||||||
slug: nil,
|
slug: nil,
|
||||||
visibility: nil
|
visibility: nil
|
||||||
}
|
}
|
||||||
@ -56,7 +55,7 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
|> render_change(note: @invalid_attrs)
|
|> render_change(note: @invalid_attrs)
|
||||||
|
|
||||||
assert html =~ "can't be blank"
|
assert html =~ "can't be blank"
|
||||||
assert html =~ "tags must be comma-delimited"
|
assert html =~ "tags must be comma or space delimited"
|
||||||
|
|
||||||
{:ok, _live, html} =
|
{:ok, _live, html} =
|
||||||
index_live
|
index_live
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
defmodule MemexWeb.PipelineLiveTest do
|
defmodule MemexWeb.PipelineLiveTest do
|
||||||
use MemexWeb.ConnCase
|
use MemexWeb.ConnCase, async: true
|
||||||
import Phoenix.LiveViewTest
|
import Phoenix.LiveViewTest
|
||||||
import Memex.Fixtures
|
import Memex.Fixtures
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
}
|
}
|
||||||
@invalid_attrs %{
|
@invalid_attrs %{
|
||||||
description: nil,
|
description: nil,
|
||||||
tags_string: "invalid tags",
|
tags_string: "invalid_tag or_tags",
|
||||||
slug: nil,
|
slug: nil,
|
||||||
visibility: nil
|
visibility: nil
|
||||||
}
|
}
|
||||||
@ -130,7 +130,7 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
|> render_change(pipeline: @invalid_attrs)
|
|> render_change(pipeline: @invalid_attrs)
|
||||||
|
|
||||||
assert html =~ "can't be blank"
|
assert html =~ "can't be blank"
|
||||||
assert html =~ "tags must be comma-delimited"
|
assert html =~ "tags must be comma or space delimited"
|
||||||
|
|
||||||
{:ok, _live, html} =
|
{:ok, _live, html} =
|
||||||
show_live
|
show_live
|
||||||
|
@ -61,7 +61,7 @@ defmodule Memex.DataCase do
|
|||||||
def valid_user_password, do: "hello world!"
|
def valid_user_password, do: "hello world!"
|
||||||
|
|
||||||
def random_slug(length \\ 20) do
|
def random_slug(length \\ 20) do
|
||||||
symbols = '0123456789abcdef-'
|
symbols = ~c"0123456789abcdef-"
|
||||||
symbol_count = Enum.count(symbols)
|
symbol_count = Enum.count(symbols)
|
||||||
|
|
||||||
for _ <- Range.new(1, length),
|
for _ <- Range.new(1, length),
|
||||||
|
@ -38,8 +38,9 @@ defmodule Memex.Fixtures do
|
|||||||
def extract_user_token(fun) do
|
def extract_user_token(fun) do
|
||||||
%{args: %{attrs: attrs, email: email_key, user_id: user_id}} = fun.(&"[TOKEN]#{&1}[TOKEN]")
|
%{args: %{attrs: attrs, email: email_key, user_id: user_id}} = fun.(&"[TOKEN]#{&1}[TOKEN]")
|
||||||
|
|
||||||
# convert atoms to string keys
|
attrs =
|
||||||
attrs = attrs |> Map.new(fn {atom_key, value} -> {atom_key |> Atom.to_string(), value} end)
|
attrs
|
||||||
|
|> Map.new(fn {key, value} -> {Atom.to_string(key), value} end)
|
||||||
|
|
||||||
email =
|
email =
|
||||||
email_key
|
email_key
|
||||||
|
Reference in New Issue
Block a user