Compare commits
1 Commits
0.1.4
...
41b9d87278
Author | SHA1 | Date | |
---|---|---|---|
41b9d87278 |
@ -1,4 +1,4 @@
|
|||||||
FROM elixir:1.14.1-alpine AS build
|
FROM elixir:1.14-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
|
||||||
@ -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 libgcc libstdc++ ncurses-libs
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
23
changelog.md
23
changelog.md
@ -1,23 +0,0 @@
|
|||||||
# v0.1.4
|
|
||||||
- fix docker-compose
|
|
||||||
- fix newlines in notes/context/step contents
|
|
||||||
- fix user invite page
|
|
||||||
- improve tagging logic
|
|
||||||
|
|
||||||
# v0.1.3
|
|
||||||
- backlink to other notes in notes
|
|
||||||
- search tags on click
|
|
||||||
|
|
||||||
# v0.1.2
|
|
||||||
- fix more typos
|
|
||||||
- add to faq
|
|
||||||
- check for slug uniqueness before submitting
|
|
||||||
|
|
||||||
# v0.1.1
|
|
||||||
- improve search a whole lot
|
|
||||||
- improve table information for notes and contexts
|
|
||||||
- fix some typos
|
|
||||||
- use project version on homepage
|
|
||||||
|
|
||||||
# v0.1.0
|
|
||||||
- initial release >:3c
|
|
@ -62,7 +62,7 @@ if config_env() == :prod do
|
|||||||
System.get_env("SECRET_KEY_BASE") ||
|
System.get_env("SECRET_KEY_BASE") ||
|
||||||
raise """
|
raise """
|
||||||
environment variable SECRET_KEY_BASE is missing.
|
environment variable SECRET_KEY_BASE is missing.
|
||||||
You can generate one by running: mix phx.gen.secret
|
You can generate one by calling: mix phx.gen.secret
|
||||||
"""
|
"""
|
||||||
|
|
||||||
config :memex, MemexWeb.Endpoint, secret_key_base: secret_key_base
|
config :memex, MemexWeb.Endpoint, secret_key_base: secret_key_base
|
||||||
@ -79,7 +79,7 @@ if config_env() == :prod do
|
|||||||
password: System.get_env("SMTP_PASSWORD") || raise("No SMTP_PASSWORD set!"),
|
password: System.get_env("SMTP_PASSWORD") || raise("No SMTP_PASSWORD set!"),
|
||||||
ssl: System.get_env("SMTP_SSL") == "true",
|
ssl: System.get_env("SMTP_SSL") == "true",
|
||||||
email_from: System.get_env("EMAIL_FROM") || "no-reply@#{System.get_env("HOST")}",
|
email_from: System.get_env("EMAIL_FROM") || "no-reply@#{System.get_env("HOST")}",
|
||||||
email_name: System.get_env("EMAIL_NAME") || "memEx"
|
email_name: System.get_env("EMAIL_NAME") || "Memex"
|
||||||
|
|
||||||
# ## Using releases
|
# ## Using releases
|
||||||
#
|
#
|
||||||
|
@ -77,14 +77,14 @@ Check them out!
|
|||||||
For development, I recommend setting environment variables with
|
For development, I recommend setting environment variables with
|
||||||
[direnv](https://direnv.net).
|
[direnv](https://direnv.net).
|
||||||
|
|
||||||
By default, memEx will always bind to all external IPv4 and IPv6 addresses in
|
By default, Memex will always bind to all external IPv4 and IPv6 addresses in
|
||||||
`dev` and `prod` mode, respectively. If you would like to use different values,
|
`dev` and `prod` mode, respectively. If you would like to use different values,
|
||||||
they will need to be overridden in `config/dev.exs` and `config/runtime.exs` for
|
they will need to be overridden in `config/dev.exs` and `config/runtime.exs` for
|
||||||
`dev` and `prod` modes, respectively.
|
`dev` and `prod` modes, respectively.
|
||||||
|
|
||||||
## `MIX_ENV=dev`
|
## `MIX_ENV=dev`
|
||||||
|
|
||||||
In `dev` mode, memEx will listen for these environment variables at runtime.
|
In `dev` mode, Memex will listen for these environment variables at runtime.
|
||||||
|
|
||||||
- `HOST`: External url to generate links with. Set this especially if you're
|
- `HOST`: External url to generate links with. Set this especially if you're
|
||||||
behind a reverse proxy. Defaults to `localhost`. External URLs will always be
|
behind a reverse proxy. Defaults to `localhost`. External URLs will always be
|
||||||
@ -100,7 +100,7 @@ In `dev` mode, memEx will listen for these environment variables at runtime.
|
|||||||
|
|
||||||
## `MIX_ENV=test`
|
## `MIX_ENV=test`
|
||||||
|
|
||||||
In `test` mode (or in the Docker container), memEx will listen for the same environment variables as dev mode, but also include the following at runtime:
|
In `test` mode (or in the Docker container), Memex will listen for the same environment variables as dev mode, but also include the following at runtime:
|
||||||
|
|
||||||
- `TEST_DATABASE_URL`: REPLACES `DATABASE_URL`. Controls the database url to
|
- `TEST_DATABASE_URL`: REPLACES `DATABASE_URL`. Controls the database url to
|
||||||
connect to. Defaults to `ecto://postgres:postgres@localhost/memex_test`.
|
connect to. Defaults to `ecto://postgres:postgres@localhost/memex_test`.
|
||||||
@ -110,7 +110,7 @@ In `test` mode (or in the Docker container), memEx will listen for the same envi
|
|||||||
|
|
||||||
## `MIX_ENV=prod`
|
## `MIX_ENV=prod`
|
||||||
|
|
||||||
In `prod` mode (or in the Docker container), memEx will listen for the same environment variables as dev mode, but also include the following at runtime:
|
In `prod` mode (or in the Docker container), Memex will listen for the same environment variables as dev mode, but also include the following at runtime:
|
||||||
|
|
||||||
- `SECRET_KEY_BASE`: Secret key base used to sign cookies. Must be generated
|
- `SECRET_KEY_BASE`: Secret key base used to sign cookies. Must be generated
|
||||||
with `docker run -it shibaobun/memex mix phx.gen.secret` and set for server to start.
|
with `docker run -it shibaobun/memex mix phx.gen.secret` and set for server to start.
|
||||||
@ -121,4 +121,4 @@ In `prod` mode (or in the Docker container), memEx will listen for the same envi
|
|||||||
- `SMTP_SSL`: Set to `true` to enable SSL for emails. Defaults to `false`.
|
- `SMTP_SSL`: Set to `true` to enable SSL for emails. Defaults to `false`.
|
||||||
- `EMAIL_FROM`: Sets the sender email in sent emails. Defaults to
|
- `EMAIL_FROM`: Sets the sender email in sent emails. Defaults to
|
||||||
`no-reply@HOST` where `HOST` was previously defined.
|
`no-reply@HOST` where `HOST` was previously defined.
|
||||||
- `EMAIL_NAME`: Sets the sender name in sent emails. Defaults to "memEx".
|
- `EMAIL_NAME`: Sets the sender name in sent emails. Defaults to "Memex".
|
||||||
|
10
de.tbx
10
de.tbx
@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<!DOCTYPE martif PUBLIC "ISO 12200:1999A//DTD MARTIF core (DXFcdV04)//EN" "TBXcdv04.dtd">
|
|
||||||
<martif type="TBX">
|
|
||||||
<martifHeader>
|
|
||||||
<fileDesc>
|
|
||||||
<sourceDesc><p>Translate Toolkit</p></sourceDesc>
|
|
||||||
</fileDesc>
|
|
||||||
</martifHeader>
|
|
||||||
<text><body></body></text>
|
|
||||||
</martif>
|
|
@ -2,7 +2,8 @@ version: '3'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
memex:
|
memex:
|
||||||
image: shibaobun/memex
|
build:
|
||||||
|
context: .
|
||||||
container_name: memex
|
container_name: memex
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
@ -24,8 +25,8 @@ services:
|
|||||||
# - SMTP_SSL=false
|
# - SMTP_SSL=false
|
||||||
# optional, default is format below
|
# optional, default is format below
|
||||||
# - EMAIL_FROM=no-reply@memex.example.tld
|
# - EMAIL_FROM=no-reply@memex.example.tld
|
||||||
# optional, default is "memEx"
|
# optional, default is "Memex"
|
||||||
# - EMAIL_NAME=memEx
|
# - EMAIL_NAME=Memex
|
||||||
expose:
|
expose:
|
||||||
- "4000"
|
- "4000"
|
||||||
depends_on:
|
depends_on:
|
||||||
|
@ -19,8 +19,8 @@ defmodule Memex.Email do
|
|||||||
|
|
||||||
@spec base_email(User.t(), String.t()) :: t()
|
@spec base_email(User.t(), String.t()) :: t()
|
||||||
defp base_email(%User{email: email}, subject) do
|
defp base_email(%User{email: email}, subject) do
|
||||||
from = Application.get_env(:memex, Memex.Mailer)[:email_from] || "noreply@localhost"
|
from = Application.get_env(:Memex, Memex.Mailer)[:email_from] || "noreply@localhost"
|
||||||
name = Application.get_env(:memex, Memex.Mailer)[:email_name]
|
name = Application.get_env(:Memex, Memex.Mailer)[:email_name]
|
||||||
new() |> to(email) |> from({name, from}) |> subject(subject)
|
new() |> to(email) |> from({name, from}) |> subject(subject)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ defmodule Memex.Contexts do
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
import Ecto.Query, warn: false
|
||||||
|
alias Ecto.Changeset
|
||||||
alias Memex.{Accounts.User, Contexts.Context, Repo}
|
alias Memex.{Accounts.User, Contexts.Context, Repo}
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
@ -34,13 +35,13 @@ defmodule Memex.Contexts do
|
|||||||
where: c.user_id == ^user_id,
|
where: c.user_id == ^user_id,
|
||||||
where:
|
where:
|
||||||
fragment(
|
fragment(
|
||||||
"search @@ websearch_to_tsquery('english', ?)",
|
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
),
|
),
|
||||||
order_by: {
|
order_by: {
|
||||||
:desc,
|
:desc,
|
||||||
fragment(
|
fragment(
|
||||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -75,13 +76,13 @@ defmodule Memex.Contexts do
|
|||||||
where: c.visibility == :public,
|
where: c.visibility == :public,
|
||||||
where:
|
where:
|
||||||
fragment(
|
fragment(
|
||||||
"search @@ websearch_to_tsquery('english', ?)",
|
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
),
|
),
|
||||||
order_by: {
|
order_by: {
|
||||||
:desc,
|
:desc,
|
||||||
fragment(
|
fragment(
|
||||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -228,4 +229,18 @@ defmodule Memex.Contexts do
|
|||||||
def change_context(%Context{} = context, attrs \\ %{}, user) do
|
def change_context(%Context{} = context, attrs \\ %{}, user) do
|
||||||
context |> Context.update_changeset(attrs, user)
|
context |> Context.update_changeset(attrs, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a canonical string representation of the `:tags` field for a Note
|
||||||
|
"""
|
||||||
|
@spec get_tags_string(Context.t() | Context.changeset() | [String.t()] | nil) :: String.t()
|
||||||
|
def get_tags_string(nil), do: ""
|
||||||
|
def get_tags_string(tags) when tags |> is_list(), do: tags |> Enum.join(",")
|
||||||
|
def get_tags_string(%Context{tags: tags}), do: tags |> get_tags_string()
|
||||||
|
|
||||||
|
def get_tags_string(%Changeset{} = changeset) do
|
||||||
|
changeset
|
||||||
|
|> Changeset.get_field(:tags)
|
||||||
|
|> get_tags_string()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -7,7 +7,7 @@ defmodule Memex.Contexts.Context do
|
|||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
import MemexWeb.Gettext
|
import MemexWeb.Gettext
|
||||||
alias Ecto.{Changeset, UUID}
|
alias Ecto.{Changeset, UUID}
|
||||||
alias Memex.{Accounts.User, Repo}
|
alias Memex.Accounts.User
|
||||||
|
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
@primary_key {:id, :binary_id, autogenerate: true}
|
||||||
@foreign_key_type :binary_id
|
@foreign_key_type :binary_id
|
||||||
@ -27,7 +27,7 @@ defmodule Memex.Contexts.Context do
|
|||||||
slug: slug(),
|
slug: slug(),
|
||||||
content: String.t(),
|
content: String.t(),
|
||||||
tags: [String.t()] | nil,
|
tags: [String.t()] | nil,
|
||||||
tags_string: String.t() | nil,
|
tags_string: String.t(),
|
||||||
visibility: :public | :private | :unlisted,
|
visibility: :public | :private | :unlisted,
|
||||||
user: User.t() | Ecto.Association.NotLoaded.t(),
|
user: User.t() | Ecto.Association.NotLoaded.t(),
|
||||||
user_id: User.id(),
|
user_id: User.id(),
|
||||||
@ -49,8 +49,6 @@ defmodule Memex.Contexts.Context do
|
|||||||
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, :content, :user_id, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||||
@ -62,42 +60,18 @@ defmodule Memex.Contexts.Context do
|
|||||||
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, :content, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp cast_tags_string(changeset, attrs) do
|
defp cast_tags_string(changeset, %{"tags_string" => tags_string})
|
||||||
changeset
|
when tags_string |> is_binary() do
|
||||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
tags =
|
||||||
|> cast(attrs, [:tags_string])
|
|
||||||
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\,]+$/,
|
|
||||||
message:
|
|
||||||
dgettext(
|
|
||||||
"errors",
|
|
||||||
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|> cast_tags()
|
|
||||||
end
|
|
||||||
|
|
||||||
defp cast_tags(%{valid?: false} = changeset), do: changeset
|
|
||||||
|
|
||||||
defp cast_tags(%{valid?: true} = changeset) do
|
|
||||||
tags = changeset |> get_field(:tags_string) |> process_tags()
|
|
||||||
changeset |> put_change(:tags, tags)
|
|
||||||
end
|
|
||||||
|
|
||||||
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.sort()
|
|> Enum.sort()
|
||||||
|
|
||||||
|
changeset |> change(tags: tags)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp process_tags(_other_tags_string), do: []
|
defp cast_tags_string(changeset, _attrs), do: changeset
|
||||||
|
|
||||||
@spec get_tags_string([String.t()] | nil) :: String.t()
|
|
||||||
def get_tags_string(nil), do: ""
|
|
||||||
def get_tags_string(tags) when tags |> is_list(), do: tags |> Enum.join(",")
|
|
||||||
end
|
end
|
||||||
|
@ -4,6 +4,7 @@ defmodule Memex.Notes do
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
import Ecto.Query, warn: false
|
||||||
|
alias Ecto.Changeset
|
||||||
alias Memex.{Accounts.User, Notes.Note, Repo}
|
alias Memex.{Accounts.User, Notes.Note, Repo}
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
@ -34,13 +35,13 @@ defmodule Memex.Notes do
|
|||||||
where: n.user_id == ^user_id,
|
where: n.user_id == ^user_id,
|
||||||
where:
|
where:
|
||||||
fragment(
|
fragment(
|
||||||
"search @@ websearch_to_tsquery('english', ?)",
|
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
),
|
),
|
||||||
order_by: {
|
order_by: {
|
||||||
:desc,
|
:desc,
|
||||||
fragment(
|
fragment(
|
||||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -74,13 +75,13 @@ defmodule Memex.Notes do
|
|||||||
where: n.visibility == :public,
|
where: n.visibility == :public,
|
||||||
where:
|
where:
|
||||||
fragment(
|
fragment(
|
||||||
"search @@ websearch_to_tsquery('english', ?)",
|
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
),
|
),
|
||||||
order_by: {
|
order_by: {
|
||||||
:desc,
|
:desc,
|
||||||
fragment(
|
fragment(
|
||||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -228,4 +229,18 @@ defmodule Memex.Notes do
|
|||||||
def change_note(%Note{} = note, attrs \\ %{}, user) do
|
def change_note(%Note{} = note, attrs \\ %{}, user) do
|
||||||
note |> Note.update_changeset(attrs, user)
|
note |> Note.update_changeset(attrs, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a canonical string representation of the `:tags` field for a Note
|
||||||
|
"""
|
||||||
|
@spec get_tags_string(Note.t() | Note.changeset() | [String.t()] | nil) :: String.t()
|
||||||
|
def get_tags_string(nil), do: ""
|
||||||
|
def get_tags_string(tags) when tags |> is_list(), do: tags |> Enum.join(",")
|
||||||
|
def get_tags_string(%Note{tags: tags}), do: tags |> get_tags_string()
|
||||||
|
|
||||||
|
def get_tags_string(%Changeset{} = changeset) do
|
||||||
|
changeset
|
||||||
|
|> Changeset.get_field(:tags)
|
||||||
|
|> get_tags_string()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -6,7 +6,7 @@ defmodule Memex.Notes.Note do
|
|||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
import MemexWeb.Gettext
|
import MemexWeb.Gettext
|
||||||
alias Ecto.{Changeset, UUID}
|
alias Ecto.{Changeset, UUID}
|
||||||
alias Memex.{Accounts.User, Repo}
|
alias Memex.Accounts.User
|
||||||
|
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
@primary_key {:id, :binary_id, autogenerate: true}
|
||||||
@foreign_key_type :binary_id
|
@foreign_key_type :binary_id
|
||||||
@ -26,7 +26,7 @@ defmodule Memex.Notes.Note do
|
|||||||
slug: slug(),
|
slug: slug(),
|
||||||
content: String.t(),
|
content: String.t(),
|
||||||
tags: [String.t()] | nil,
|
tags: [String.t()] | nil,
|
||||||
tags_string: String.t() | nil,
|
tags_string: String.t(),
|
||||||
visibility: :public | :private | :unlisted,
|
visibility: :public | :private | :unlisted,
|
||||||
user: User.t() | Ecto.Association.NotLoaded.t(),
|
user: User.t() | Ecto.Association.NotLoaded.t(),
|
||||||
user_id: User.id(),
|
user_id: User.id(),
|
||||||
@ -48,8 +48,6 @@ defmodule Memex.Notes.Note do
|
|||||||
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, :content, :user_id, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||||
@ -61,42 +59,18 @@ defmodule Memex.Notes.Note do
|
|||||||
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, :content, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp cast_tags_string(changeset, attrs) do
|
defp cast_tags_string(changeset, %{"tags_string" => tags_string})
|
||||||
changeset
|
when tags_string |> is_binary() do
|
||||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
tags =
|
||||||
|> cast(attrs, [:tags_string])
|
|
||||||
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\,]+$/,
|
|
||||||
message:
|
|
||||||
dgettext(
|
|
||||||
"errors",
|
|
||||||
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|> cast_tags()
|
|
||||||
end
|
|
||||||
|
|
||||||
defp cast_tags(%{valid?: false} = changeset), do: changeset
|
|
||||||
|
|
||||||
defp cast_tags(%{valid?: true} = changeset) do
|
|
||||||
tags = changeset |> get_field(:tags_string) |> process_tags()
|
|
||||||
changeset |> put_change(:tags, tags)
|
|
||||||
end
|
|
||||||
|
|
||||||
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.sort()
|
|> Enum.sort()
|
||||||
|
|
||||||
|
changeset |> change(tags: tags)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp process_tags(_other_tags_string), do: []
|
defp cast_tags_string(changeset, _attrs), do: changeset
|
||||||
|
|
||||||
@spec get_tags_string([String.t()] | nil) :: String.t()
|
|
||||||
def get_tags_string(nil), do: ""
|
|
||||||
def get_tags_string(tags) when tags |> is_list(), do: tags |> Enum.join(",")
|
|
||||||
end
|
end
|
||||||
|
@ -4,6 +4,7 @@ defmodule Memex.Pipelines do
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
import Ecto.Query, warn: false
|
||||||
|
alias Ecto.Changeset
|
||||||
alias Memex.{Accounts.User, Pipelines.Pipeline, Repo}
|
alias Memex.{Accounts.User, Pipelines.Pipeline, Repo}
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
@ -34,13 +35,13 @@ defmodule Memex.Pipelines do
|
|||||||
where: p.user_id == ^user_id,
|
where: p.user_id == ^user_id,
|
||||||
where:
|
where:
|
||||||
fragment(
|
fragment(
|
||||||
"search @@ websearch_to_tsquery('english', ?)",
|
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
),
|
),
|
||||||
order_by: {
|
order_by: {
|
||||||
:desc,
|
:desc,
|
||||||
fragment(
|
fragment(
|
||||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -74,13 +75,13 @@ defmodule Memex.Pipelines do
|
|||||||
where: p.visibility == :public,
|
where: p.visibility == :public,
|
||||||
where:
|
where:
|
||||||
fragment(
|
fragment(
|
||||||
"search @@ websearch_to_tsquery('english', ?)",
|
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
),
|
),
|
||||||
order_by: {
|
order_by: {
|
||||||
:desc,
|
:desc,
|
||||||
fragment(
|
fragment(
|
||||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||||
^trimmed_search
|
^trimmed_search
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -230,4 +231,18 @@ defmodule Memex.Pipelines do
|
|||||||
def change_pipeline(%Pipeline{} = pipeline, attrs \\ %{}, user) do
|
def change_pipeline(%Pipeline{} = pipeline, attrs \\ %{}, user) do
|
||||||
pipeline |> Pipeline.update_changeset(attrs, user)
|
pipeline |> Pipeline.update_changeset(attrs, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a canonical string representation of the `:tags` field for a Pipeline
|
||||||
|
"""
|
||||||
|
@spec get_tags_string(Pipeline.t() | Pipeline.changeset() | [String.t()] | nil) :: String.t()
|
||||||
|
def get_tags_string(nil), do: ""
|
||||||
|
def get_tags_string(tags) when tags |> is_list(), do: tags |> Enum.join(",")
|
||||||
|
def get_tags_string(%Pipeline{tags: tags}), do: tags |> get_tags_string()
|
||||||
|
|
||||||
|
def get_tags_string(%Changeset{} = changeset) do
|
||||||
|
changeset
|
||||||
|
|> Changeset.get_field(:tags)
|
||||||
|
|> get_tags_string()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -6,7 +6,7 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
import MemexWeb.Gettext
|
import MemexWeb.Gettext
|
||||||
alias Ecto.{Changeset, UUID}
|
alias Ecto.{Changeset, UUID}
|
||||||
alias Memex.{Accounts.User, Pipelines.Steps.Step, Repo}
|
alias Memex.{Accounts.User, Pipelines.Steps.Step}
|
||||||
|
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
@primary_key {:id, :binary_id, autogenerate: true}
|
||||||
@foreign_key_type :binary_id
|
@foreign_key_type :binary_id
|
||||||
@ -28,7 +28,7 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
slug: slug(),
|
slug: slug(),
|
||||||
description: String.t(),
|
description: String.t(),
|
||||||
tags: [String.t()] | nil,
|
tags: [String.t()] | nil,
|
||||||
tags_string: String.t() | nil,
|
tags_string: String.t(),
|
||||||
visibility: :public | :private | :unlisted,
|
visibility: :public | :private | :unlisted,
|
||||||
user: User.t() | Ecto.Association.NotLoaded.t(),
|
user: User.t() | Ecto.Association.NotLoaded.t(),
|
||||||
user_id: User.id(),
|
user_id: User.id(),
|
||||||
@ -50,8 +50,6 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
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, :user_id, :visibility])
|
|> validate_required([:slug, :user_id, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||||
@ -63,42 +61,18 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
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, :visibility])
|
|> validate_required([:slug, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp cast_tags_string(changeset, attrs) do
|
defp cast_tags_string(changeset, %{"tags_string" => tags_string})
|
||||||
changeset
|
when tags_string |> is_binary() do
|
||||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
tags =
|
||||||
|> cast(attrs, [:tags_string])
|
|
||||||
|> validate_format(:tags_string, ~r/^[\p{L}\p{N}\-\,]+$/,
|
|
||||||
message:
|
|
||||||
dgettext(
|
|
||||||
"errors",
|
|
||||||
"invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|> cast_tags()
|
|
||||||
end
|
|
||||||
|
|
||||||
defp cast_tags(%{valid?: false} = changeset), do: changeset
|
|
||||||
|
|
||||||
defp cast_tags(%{valid?: true} = changeset) do
|
|
||||||
tags = changeset |> get_field(:tags_string) |> process_tags()
|
|
||||||
changeset |> put_change(:tags, tags)
|
|
||||||
end
|
|
||||||
|
|
||||||
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.sort()
|
|> Enum.sort()
|
||||||
|
|
||||||
|
changeset |> change(tags: tags)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp process_tags(_other_tags_string), do: []
|
defp cast_tags_string(changeset, _attrs), do: changeset
|
||||||
|
|
||||||
@spec get_tags_string([String.t()] | nil) :: String.t()
|
|
||||||
def get_tags_string(nil), do: ""
|
|
||||||
def get_tags_string(tags) when tags |> is_list(), do: tags |> Enum.join(",")
|
|
||||||
end
|
end
|
||||||
|
@ -39,7 +39,6 @@ defmodule MemexWeb.Components.ContextContent do
|
|||||||
"</p>#{link}<p class=\"inline\">"
|
"</p>#{link}<p class=\"inline\">"
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|> String.replace("\n", "<br>")
|
|
||||||
|> HTML.raw()
|
|> HTML.raw()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -4,7 +4,7 @@ defmodule MemexWeb.Components.ContextsTableComponent do
|
|||||||
"""
|
"""
|
||||||
use MemexWeb, :live_component
|
use MemexWeb, :live_component
|
||||||
alias Ecto.UUID
|
alias Ecto.UUID
|
||||||
alias Memex.{Accounts.User, Contexts.Context}
|
alias Memex.{Accounts.User, Contexts, Contexts.Context}
|
||||||
alias Phoenix.LiveView.{Rendered, Socket}
|
alias Phoenix.LiveView.{Rendered, Socket}
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@ -45,6 +45,7 @@ defmodule MemexWeb.Components.ContextsTableComponent do
|
|||||||
|
|
||||||
columns = [
|
columns = [
|
||||||
%{label: gettext("slug"), key: :slug},
|
%{label: gettext("slug"), key: :slug},
|
||||||
|
%{label: gettext("content"), key: :content},
|
||||||
%{label: gettext("tags"), key: :tags},
|
%{label: gettext("tags"), key: :tags},
|
||||||
%{label: gettext("visibility"), key: :visibility}
|
%{label: gettext("visibility"), key: :visibility}
|
||||||
| columns
|
| columns
|
||||||
@ -104,18 +105,20 @@ defmodule MemexWeb.Components.ContextsTableComponent 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(:content, %{content: content}, _additional_data) do
|
||||||
assigns = %{tags: tags}
|
assigns = %{content: content}
|
||||||
|
|
||||||
~H"""
|
content_block = ~H"""
|
||||||
<div class="flex flex-wrap justify-center space-x-1">
|
<div class="truncate max-w-sm">
|
||||||
<%= for tag <- @tags do %>
|
<%= @content %>
|
||||||
<.link patch={Routes.context_index_path(Endpoint, :search, tag)} class="link">
|
|
||||||
<%= tag %>
|
|
||||||
</.link>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
{content, content_block}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
||||||
|
tags |> Contexts.get_tags_string()
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_value_for_key(:actions, context, %{actions: actions}) do
|
defp get_value_for_key(:actions, context, %{actions: actions}) do
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
defmodule MemexWeb.Components.NoteContent do
|
|
||||||
@moduledoc """
|
|
||||||
Display the content for a note
|
|
||||||
"""
|
|
||||||
use MemexWeb, :component
|
|
||||||
alias Memex.Notes.Note
|
|
||||||
alias Phoenix.HTML
|
|
||||||
|
|
||||||
attr :note, Note, required: true
|
|
||||||
|
|
||||||
def note_content(assigns) do
|
|
||||||
~H"""
|
|
||||||
<div
|
|
||||||
id={"show-note-content-#{@note.id}"}
|
|
||||||
class="input input-primary h-128 min-h-128 inline-block"
|
|
||||||
phx-hook="MaintainAttrs"
|
|
||||||
phx-update="ignore"
|
|
||||||
readonly
|
|
||||||
phx-no-format
|
|
||||||
><p class="inline"><%= add_links_to_content(@note.content) %></p></div>
|
|
||||||
"""
|
|
||||||
end
|
|
||||||
|
|
||||||
defp add_links_to_content(content) do
|
|
||||||
Regex.replace(
|
|
||||||
~r/\[\[([\p{L}\p{N}\-]+)\]\]/,
|
|
||||||
content,
|
|
||||||
fn _whole_match, slug ->
|
|
||||||
link =
|
|
||||||
HTML.Link.link(
|
|
||||||
"[[#{slug}]]",
|
|
||||||
to: Routes.note_show_path(Endpoint, :show, slug),
|
|
||||||
class: "link inline",
|
|
||||||
data: [qa: "note-link-#{slug}"]
|
|
||||||
)
|
|
||||||
|> HTML.Safe.to_iodata()
|
|
||||||
|> IO.iodata_to_binary()
|
|
||||||
|
|
||||||
"</p>#{link}<p class=\"inline\">"
|
|
||||||
end
|
|
||||||
)
|
|
||||||
|> String.replace("\n", "<br>")
|
|
||||||
|> HTML.raw()
|
|
||||||
end
|
|
||||||
end
|
|
@ -4,7 +4,7 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
|||||||
"""
|
"""
|
||||||
use MemexWeb, :live_component
|
use MemexWeb, :live_component
|
||||||
alias Ecto.UUID
|
alias Ecto.UUID
|
||||||
alias Memex.{Accounts.User, Notes.Note}
|
alias Memex.{Accounts.User, Notes, Notes.Note}
|
||||||
alias Phoenix.LiveView.{Rendered, Socket}
|
alias Phoenix.LiveView.{Rendered, Socket}
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@ -45,6 +45,7 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
|||||||
|
|
||||||
columns = [
|
columns = [
|
||||||
%{label: gettext("slug"), key: :slug},
|
%{label: gettext("slug"), key: :slug},
|
||||||
|
%{label: gettext("content"), key: :content},
|
||||||
%{label: gettext("tags"), key: :tags},
|
%{label: gettext("tags"), key: :tags},
|
||||||
%{label: gettext("visibility"), key: :visibility}
|
%{label: gettext("visibility"), key: :visibility}
|
||||||
| columns
|
| columns
|
||||||
@ -104,18 +105,20 @@ 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(:content, %{content: content}, _additional_data) do
|
||||||
assigns = %{tags: tags}
|
assigns = %{content: content}
|
||||||
|
|
||||||
~H"""
|
content_block = ~H"""
|
||||||
<div class="flex flex-wrap justify-center space-x-1">
|
<div class="truncate max-w-sm">
|
||||||
<%= for tag <- @tags do %>
|
<%= @content %>
|
||||||
<.link patch={Routes.note_index_path(Endpoint, :search, tag)} class="link">
|
|
||||||
<%= tag %>
|
|
||||||
</.link>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
{content, content_block}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
||||||
|
tags |> Notes.get_tags_string()
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_value_for_key(:actions, note, %{actions: actions}) do
|
defp get_value_for_key(:actions, note, %{actions: actions}) do
|
||||||
|
@ -4,7 +4,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
"""
|
"""
|
||||||
use MemexWeb, :live_component
|
use MemexWeb, :live_component
|
||||||
alias Ecto.UUID
|
alias Ecto.UUID
|
||||||
alias Memex.{Accounts.User, Pipelines.Pipeline}
|
alias Memex.{Accounts.User, Pipelines, Pipelines.Pipeline}
|
||||||
alias Phoenix.LiveView.{Rendered, Socket}
|
alias Phoenix.LiveView.{Rendered, Socket}
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@ -118,17 +118,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
||||||
assigns = %{tags: tags}
|
tags |> Pipelines.get_tags_string()
|
||||||
|
|
||||||
~H"""
|
|
||||||
<div class="flex flex-wrap justify-center space-x-1">
|
|
||||||
<%= for tag <- @tags do %>
|
|
||||||
<.link patch={Routes.pipeline_index_path(Endpoint, :search, tag)} class="link">
|
|
||||||
<%= tag %>
|
|
||||||
</.link>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
"""
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_value_for_key(:actions, pipeline, %{actions: actions}) do
|
defp get_value_for_key(:actions, pipeline, %{actions: actions}) do
|
||||||
|
@ -39,7 +39,6 @@ defmodule MemexWeb.Components.StepContent do
|
|||||||
"</p>#{link}<p class=\"inline\">"
|
"</p>#{link}<p class=\"inline\">"
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|> String.replace("\n", "<br>")
|
|
||||||
|> HTML.raw()
|
|> HTML.raw()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -22,15 +22,15 @@ defmodule MemexWeb.Components.UserCard do
|
|||||||
<%= if @user.confirmed_at |> is_nil() do %>
|
<%= if @user.confirmed_at |> is_nil() do %>
|
||||||
<%= gettext("email unconfirmed") %>
|
<%= gettext("email unconfirmed") %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<p>
|
<%= gettext(
|
||||||
<%= gettext("user confirmed on") %>
|
"user was confirmed at %{relative_datetime}",
|
||||||
<%= @user.confirmed_at |> display_datetime() %>
|
relative_datetime: @user.confirmed_at |> display_datetime()
|
||||||
</p>
|
) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("user registered on") %>
|
<%= gettext("User registered on") %>
|
||||||
<%= @user.inserted_at |> display_datetime() %>
|
<%= @user.inserted_at |> display_datetime() %>
|
||||||
</p>
|
</p>
|
||||||
</h3>
|
</h3>
|
||||||
|
@ -6,7 +6,7 @@ defmodule MemexWeb.UserResetPasswordController do
|
|||||||
plug :get_user_by_reset_password_token when action in [:edit, :update]
|
plug :get_user_by_reset_password_token when action in [:edit, :update]
|
||||||
|
|
||||||
def new(conn, _params) do
|
def new(conn, _params) do
|
||||||
render(conn, "new.html", page_title: gettext("forgot your password?"))
|
render(conn, "new.html", page_title: gettext("Forgot your password?"))
|
||||||
end
|
end
|
||||||
|
|
||||||
def create(conn, %{"user" => %{"email" => email}}) do
|
def create(conn, %{"user" => %{"email" => email}}) do
|
||||||
|
@ -20,7 +20,7 @@ defmodule MemexWeb.UserSessionController do
|
|||||||
|
|
||||||
def delete(conn, _params) do
|
def delete(conn, _params) do
|
||||||
conn
|
conn
|
||||||
|> put_flash(:info, dgettext("prompts", "logged out successfully."))
|
|> put_flash(:info, dgettext("prompts", "Logged out successfully."))
|
||||||
|> UserAuth.log_out_user()
|
|> UserAuth.log_out_user()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -27,7 +27,9 @@
|
|||||||
<%= text_input(f, :tags_string,
|
<%= text_input(f, :tags_string,
|
||||||
id: "tags-input",
|
id: "tags-input",
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("tag1,tag2")
|
placeholder: gettext("tag1,tag2"),
|
||||||
|
phx_update: "ignore",
|
||||||
|
value: Contexts.get_tags_string(@changeset)
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :tags_string) %>
|
<%= error_tag(f, :tags_string) %>
|
||||||
|
|
||||||
|
@ -3,13 +3,7 @@
|
|||||||
<%= @context.slug %>
|
<%= @context.slug %>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="flex flex-wrap space-x-1">
|
<p><%= if @context.tags, do: @context.tags |> Enum.join(", ") %></p>
|
||||||
<%= for tag <- @context.tags do %>
|
|
||||||
<.link navigate={Routes.context_index_path(Endpoint, :search, tag)} class="link">
|
|
||||||
<%= tag %>
|
|
||||||
</.link>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<.context_content context={@context} />
|
<.context_content context={@context} />
|
||||||
|
|
||||||
|
@ -120,26 +120,5 @@
|
|||||||
) %>
|
) %>
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-stretch space-y-2">
|
|
||||||
<b class="whitespace-nowrap">
|
|
||||||
<%= gettext("how many people should i invite?") %>
|
|
||||||
</b>
|
|
||||||
<p>
|
|
||||||
<%= gettext(
|
|
||||||
"while memEx fully supports multiple users, each memEx instance should be treated as a single cohesive and collaborative document."
|
|
||||||
) %>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<%= gettext(
|
|
||||||
"note, context and pipeline slugs must be unique, and you are free to backlink to notes not written by you."
|
|
||||||
) %>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<%= 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 :)"
|
|
||||||
) %>
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,8 +3,6 @@ defmodule MemexWeb.HomeLive do
|
|||||||
Liveview for the main home page
|
Liveview for the main home page
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@version Mix.Project.config()[:version]
|
|
||||||
|
|
||||||
use MemexWeb, :live_view
|
use MemexWeb, :live_view
|
||||||
alias Memex.Accounts
|
alias Memex.Accounts
|
||||||
alias MemexWeb.{Endpoint, FaqLive}
|
alias MemexWeb.{Endpoint, FaqLive}
|
||||||
@ -12,6 +10,6 @@ defmodule MemexWeb.HomeLive do
|
|||||||
@impl true
|
@impl true
|
||||||
def mount(_params, _session, socket) do
|
def mount(_params, _session, socket) do
|
||||||
admins = Accounts.list_users_by_role(:admin)
|
admins = Accounts.list_users_by_role(:admin)
|
||||||
{:ok, socket |> assign(page_title: gettext("home"), admins: admins, version: @version)}
|
{:ok, socket |> assign(page_title: gettext("home"), admins: admins)}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -120,12 +120,12 @@
|
|||||||
<li class="flex flex-row justify-center items-center space-x-2">
|
<li class="flex flex-row justify-center items-center space-x-2">
|
||||||
<b><%= gettext("version:") %></b>
|
<b><%= gettext("version:") %></b>
|
||||||
<.link
|
<.link
|
||||||
href="https://gitea.bubbletea.dev/shibao/memEx/src/branch/stable/changelog.md"
|
href="https://gitea.bubbletea.dev/shibao/memex/src/branch/stable/CHANGELOG.md"
|
||||||
class="flex flex-row justify-center items-center space-x-2 link"
|
class="flex flex-row justify-center items-center space-x-2 link"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<p><%= @version %></p>
|
<p>0.1.0</p>
|
||||||
<i class="fas fa-md fa-info-circle"></i>
|
<i class="fas fa-md fa-info-circle"></i>
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
@ -140,7 +140,7 @@
|
|||||||
|
|
||||||
<li class="flex flex-col justify-center space-x-2">
|
<li class="flex flex-col justify-center space-x-2">
|
||||||
<.link
|
<.link
|
||||||
href="https://gitea.bubbletea.dev/shibao/memEx"
|
href="https://gitea.bubbletea.dev/shibao/memex"
|
||||||
class="flex flex-row justify-center items-center space-x-2 link"
|
class="flex flex-row justify-center items-center space-x-2 link"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
@ -151,7 +151,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="flex flex-col justify-center space-x-2">
|
<li class="flex flex-col justify-center space-x-2">
|
||||||
<.link
|
<.link
|
||||||
href="https://weblate.bubbletea.dev/engage/memEx"
|
href="https://weblate.bubbletea.dev/engage/memex"
|
||||||
class="flex flex-row justify-center items-center space-x-2 link"
|
class="flex flex-row justify-center items-center space-x-2 link"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
@ -162,7 +162,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="flex flex-col justify-center space-x-2">
|
<li class="flex flex-col justify-center space-x-2">
|
||||||
<.link
|
<.link
|
||||||
href="https://gitea.bubbletea.dev/shibao/memEx/issues/new"
|
href="https://gitea.bubbletea.dev/shibao/memex/issues/new"
|
||||||
class="flex flex-row justify-center items-center space-x-2 link"
|
class="flex flex-row justify-center items-center space-x-2 link"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
|
@ -27,7 +27,9 @@
|
|||||||
<%= text_input(f, :tags_string,
|
<%= text_input(f, :tags_string,
|
||||||
id: "tags-input",
|
id: "tags-input",
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("tag1,tag2")
|
placeholder: gettext("tag1,tag2"),
|
||||||
|
phx_update: "ignore",
|
||||||
|
value: Notes.get_tags_string(@changeset)
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :tags_string) %>
|
<%= error_tag(f, :tags_string) %>
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
defmodule MemexWeb.NoteLive.Show do
|
defmodule MemexWeb.NoteLive.Show do
|
||||||
use MemexWeb, :live_view
|
use MemexWeb, :live_view
|
||||||
import MemexWeb.Components.NoteContent
|
|
||||||
alias Memex.{Accounts.User, Notes, Notes.Note}
|
alias Memex.{Accounts.User, Notes, Notes.Note}
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
|
@ -3,15 +3,16 @@
|
|||||||
<%= @note.slug %>
|
<%= @note.slug %>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="flex flex-wrap space-x-1">
|
<p><%= if @note.tags, do: @note.tags |> Enum.join(", ") %></p>
|
||||||
<%= for tag <- @note.tags do %>
|
|
||||||
<.link navigate={Routes.note_index_path(Endpoint, :search, tag)} class="link">
|
|
||||||
<%= tag %>
|
|
||||||
</.link>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<.note_content note={@note} />
|
<textarea
|
||||||
|
id="show-note-content"
|
||||||
|
class="input input-primary h-128 min-h-128"
|
||||||
|
phx-hook="MaintainAttrs"
|
||||||
|
phx-update="ignore"
|
||||||
|
readonly
|
||||||
|
phx-no-format
|
||||||
|
><%= @note.content %></textarea>
|
||||||
|
|
||||||
<p class="self-end">
|
<p class="self-end">
|
||||||
<%= gettext("Visibility: %{visibility}", visibility: @note.visibility) %>
|
<%= gettext("Visibility: %{visibility}", visibility: @note.visibility) %>
|
||||||
|
@ -27,7 +27,9 @@
|
|||||||
<%= text_input(f, :tags_string,
|
<%= text_input(f, :tags_string,
|
||||||
id: "tags-input",
|
id: "tags-input",
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
placeholder: gettext("tag1,tag2")
|
placeholder: gettext("tag1,tag2"),
|
||||||
|
phx_update: "ignore",
|
||||||
|
value: Pipelines.get_tags_string(@changeset)
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :tags_string) %>
|
<%= error_tag(f, :tags_string) %>
|
||||||
|
|
||||||
|
@ -3,13 +3,7 @@
|
|||||||
<%= @pipeline.slug %>
|
<%= @pipeline.slug %>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="flex flex-wrap space-x-1">
|
<p><%= if @pipeline.tags, do: @pipeline.tags |> Enum.join(", ") %></p>
|
||||||
<%= for tag <- @pipeline.tags do %>
|
|
||||||
<.link navigate={Routes.pipeline_index_path(Endpoint, :search, tag)} class="link">
|
|
||||||
<%= tag %>
|
|
||||||
</.link>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<%= if @pipeline.description do %>
|
<%= if @pipeline.description do %>
|
||||||
<textarea
|
<textarea
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<br />
|
<br />
|
||||||
|
|
||||||
<span style="margin-bottom: 1em; font-size: 1.25em;">
|
<span style="margin-bottom: 1em; font-size: 1.25em;">
|
||||||
<%= dgettext("emails", "Welcome to memEx") %>
|
<%= dgettext("emails", "Welcome to Memex") %>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
@ -19,5 +19,5 @@
|
|||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<%= dgettext("emails", "If you didn't create an account at memEx, please ignore this.") %>
|
<%= dgettext("emails", "If you didn't create an account at Memex, please ignore this.") %>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
<%= dgettext("emails", "Hi %{email},", email: @user.email) %>
|
<%= dgettext("emails", "Hi %{email},", email: @user.email) %>
|
||||||
|
|
||||||
<%= dgettext("emails", "Welcome to memEx") %>
|
<%= dgettext("emails", "Welcome to Memex") %>
|
||||||
|
|
||||||
<%= dgettext("emails", "You can confirm your account by visiting the URL below:") %>
|
<%= dgettext("emails", "You can confirm your account by visiting the URL below:") %>
|
||||||
|
|
||||||
|
@ -13,5 +13,5 @@
|
|||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<%= dgettext("emails", "If you didn't request this change from memEx, please ignore this.") %>
|
<%= dgettext("emails", "If you didn't request this change from Memex, please ignore this.") %>
|
||||||
</div>
|
</div>
|
||||||
|
@ -15,6 +15,6 @@
|
|||||||
|
|
||||||
<%= dgettext(
|
<%= dgettext(
|
||||||
"emails",
|
"emails",
|
||||||
"If you didn't request this change from memEx, please ignore this."
|
"If you didn't request this change from Memex, please ignore this."
|
||||||
) %>
|
) %>
|
||||||
</div>
|
</div>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>
|
<title>
|
||||||
<%= dgettext("errors", "Error") %> | memEx
|
<%= dgettext("errors", "Error") %>| Memex
|
||||||
</title>
|
</title>
|
||||||
<link rel="stylesheet" href="/css/app.css" />
|
<link rel="stylesheet" href="/css/app.css" />
|
||||||
<script defer type="text/javascript" src="/js/app.js">
|
<script defer type="text/javascript" src="/js/app.js">
|
||||||
|
@ -4,15 +4,15 @@
|
|||||||
<%= @email.subject %>
|
<%= @email.subject %>
|
||||||
</title>
|
</title>
|
||||||
</head>
|
</head>
|
||||||
<body style="padding: 2em; color: rgb(161, 161, 170); background-color: rgb(39, 39, 42); font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; text-align: center;">
|
<body style="padding: 2em; color: rgb(31, 31, 31); background-color: rgb(220, 220, 228); font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; text-align: center;">
|
||||||
<%= @inner_content %>
|
<%= @inner_content %>
|
||||||
|
|
||||||
<hr style="margin: 2em auto; border-width: 1px; border-color: rgb(161, 161, 170); width: 100%; max-width: 42rem;" />
|
<hr style="margin: 2em auto; border-width: 1px; border-color: rgb(212, 212, 216); width: 100%; max-width: 42rem;" />
|
||||||
|
|
||||||
<a style="color: rgb(161, 161, 170);" href={Routes.live_url(Endpoint, HomeLive)}>
|
<a style="color: rgb(31, 31, 31);" href={Routes.live_url(Endpoint, HomeLive)}>
|
||||||
<%= dgettext(
|
<%= dgettext(
|
||||||
"emails",
|
"emails",
|
||||||
"This email was sent from memEx"
|
"This email was sent from Memex, the self-hosted firearm tracker website."
|
||||||
) %>
|
) %>
|
||||||
</a>
|
</a>
|
||||||
</body>
|
</body>
|
||||||
|
@ -7,5 +7,5 @@
|
|||||||
=====================
|
=====================
|
||||||
|
|
||||||
<%= dgettext("emails",
|
<%= dgettext("emails",
|
||||||
"This email was sent from memEx at %{url}",
|
"This email was sent from Memex at %{url}, the self-hosted firearm tracker website.",
|
||||||
url: Routes.live_url(Endpoint, HomeLive)) %>
|
url: Routes.live_url(Endpoint, HomeLive)) %>
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
<%= select(
|
<%= select(
|
||||||
f,
|
f,
|
||||||
:locale,
|
:locale,
|
||||||
[{gettext("english"), "en_US"}],
|
[{gettext("English"), "en_US"}],
|
||||||
class: "input input-primary col-span-2"
|
class: "input input-primary col-span-2"
|
||||||
) %>
|
) %>
|
||||||
<%= error_tag(f, :locale) %>
|
<%= error_tag(f, :locale) %>
|
||||||
@ -48,7 +48,7 @@
|
|||||||
<%= dgettext("actions", "log in") %>
|
<%= dgettext("actions", "log in") %>
|
||||||
</.link>
|
</.link>
|
||||||
<.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
|
<.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "forgot your password?") %>
|
<%= dgettext("actions", "Forgot your password?") %>
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
<div class="mx-auto mb-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", "forgot your password?") %>
|
<%= dgettext("actions", "Forgot your password?") %>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -12,7 +12,7 @@
|
|||||||
<%= label(f, :email, class: "title text-lg text-primary-400") %>
|
<%= label(f, :email, class: "title text-lg text-primary-400") %>
|
||||||
<%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
|
<%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "send instructions to reset password"),
|
<%= submit(dgettext("actions", "Send instructions to reset password"),
|
||||||
class: "mx-auto btn btn-primary col-span-3"
|
class: "mx-auto btn btn-primary col-span-3"
|
||||||
) %>
|
) %>
|
||||||
</.form>
|
</.form>
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
</.link>
|
</.link>
|
||||||
<% end %>
|
<% end %>
|
||||||
<.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
|
<.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "forgot your password?") %>
|
<%= dgettext("actions", "Forgot your password?") %>
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,12 +1,17 @@
|
|||||||
defmodule MemexWeb.LayoutView do
|
defmodule MemexWeb.LayoutView do
|
||||||
use MemexWeb, :view
|
use MemexWeb, :view
|
||||||
import MemexWeb.{Components.Topbar, Gettext}
|
import MemexWeb.Components.Topbar
|
||||||
alias MemexWeb.HomeLive
|
alias MemexWeb.HomeLive
|
||||||
|
|
||||||
# Phoenix LiveDashboard is available only in development by default,
|
# Phoenix LiveDashboard is available only in development by default,
|
||||||
# so we instruct Elixir to not warn if the dashboard route is missing.
|
# so we instruct Elixir to not warn if the dashboard route is missing.
|
||||||
@compile {:no_warn_undefined, {Routes, :live_dashboard_path, 2}}
|
@compile {:no_warn_undefined, {Routes, :live_dashboard_path, 2}}
|
||||||
|
|
||||||
def get_title(%{assigns: %{title: title}}), do: gettext("memEx | %{title}", title: title)
|
def get_title(conn) do
|
||||||
def get_title(_conn), do: gettext("memEx")
|
if conn.assigns |> Map.has_key?(:title) do
|
||||||
|
"Memex | #{conn.assigns.title}"
|
||||||
|
else
|
||||||
|
"Memex"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
2
mix.exs
2
mix.exs
@ -4,7 +4,7 @@ defmodule Memex.MixProject do
|
|||||||
def project do
|
def project do
|
||||||
[
|
[
|
||||||
app: :memex,
|
app: :memex,
|
||||||
version: "0.1.4",
|
version: "0.1.0",
|
||||||
elixir: "~> 1.14",
|
elixir: "~> 1.14",
|
||||||
elixirc_paths: elixirc_paths(Mix.env()),
|
elixirc_paths: elixirc_paths(Mix.env()),
|
||||||
compilers: Mix.compilers(),
|
compilers: Mix.compilers(),
|
||||||
|
@ -15,6 +15,13 @@ msgstr ""
|
|||||||
msgid "Copy to clipboard"
|
msgid "Copy to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/user_registration/new.html.heex:51
|
||||||
|
#: lib/memex_web/templates/user_reset_password/new.html.heex:3
|
||||||
|
#: lib/memex_web/templates/user_session/new.html.heex:44
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Forgot your password?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_confirmation/new.html.heex:3
|
#: lib/memex_web/templates/user_confirmation/new.html.heex:3
|
||||||
#: lib/memex_web/templates/user_confirmation/new.html.heex:15
|
#: lib/memex_web/templates/user_confirmation/new.html.heex:15
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -32,6 +39,11 @@ msgstr ""
|
|||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/user_reset_password/new.html.heex:15
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Send instructions to reset password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_settings/edit.html.heex:15
|
#: lib/memex_web/templates/user_settings/edit.html.heex:15
|
||||||
#: lib/memex_web/templates/user_settings/edit.html.heex:44
|
#: lib/memex_web/templates/user_settings/edit.html.heex:44
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -56,12 +68,12 @@ msgid "create invite"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/index.html.heex:49
|
#: lib/memex_web/live/context_live/index.html.heex:49
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:40
|
#: lib/memex_web/live/context_live/show.html.heex:34
|
||||||
#: lib/memex_web/live/note_live/index.html.heex:49
|
#: lib/memex_web/live/note_live/index.html.heex:49
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:37
|
#: lib/memex_web/live/note_live/show.html.heex:38
|
||||||
#: 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:49
|
#: lib/memex_web/live/pipeline_live/show.html.heex:43
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:119
|
#: lib/memex_web/live/pipeline_live/show.html.heex:113
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete"
|
msgid "delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -72,12 +84,12 @@ msgid "delete user"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/index.html.heex:38
|
#: lib/memex_web/live/context_live/index.html.heex:38
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:29
|
#: lib/memex_web/live/context_live/show.html.heex:23
|
||||||
#: lib/memex_web/live/note_live/index.html.heex:38
|
#: lib/memex_web/live/note_live/index.html.heex:38
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:26
|
#: lib/memex_web/live/note_live/show.html.heex:27
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:38
|
#: lib/memex_web/live/pipeline_live/index.html.heex:38
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:38
|
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:108
|
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "edit"
|
msgid "edit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -124,34 +136,22 @@ msgstr ""
|
|||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:40
|
#: lib/memex_web/live/context_live/form_component.html.heex:42
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:40
|
#: lib/memex_web/live/note_live/form_component.html.heex:42
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:40
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:42
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:28
|
#: lib/memex_web/live/step_live/form_component.html.heex:28
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "save"
|
msgid "save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:22
|
#: lib/memex_web/live/context_live/show.html.heex:16
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:22
|
#: lib/memex_web/live/note_live/show.html.heex:23
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:31
|
#: lib/memex_web/live/pipeline_live/show.html.heex:25
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "back"
|
msgid "back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:135
|
#: lib/memex_web/live/pipeline_live/show.html.heex:129
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "add step"
|
msgid "add step"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_registration/new.html.heex:51
|
|
||||||
#: lib/memex_web/templates/user_reset_password/new.html.heex:3
|
|
||||||
#: lib/memex_web/templates/user_session/new.html.heex:44
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "forgot your password?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_reset_password/new.html.heex:15
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "send instructions to reset password"
|
|
||||||
msgstr ""
|
|
||||||
|
@ -16,6 +16,13 @@ msgstr ""
|
|||||||
msgid "Copy to clipboard"
|
msgid "Copy to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/user_registration/new.html.heex:51
|
||||||
|
#: lib/memex_web/templates/user_reset_password/new.html.heex:3
|
||||||
|
#: lib/memex_web/templates/user_session/new.html.heex:44
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Forgot your password?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_confirmation/new.html.heex:3
|
#: lib/memex_web/templates/user_confirmation/new.html.heex:3
|
||||||
#: lib/memex_web/templates/user_confirmation/new.html.heex:15
|
#: lib/memex_web/templates/user_confirmation/new.html.heex:15
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -33,6 +40,11 @@ msgstr ""
|
|||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/user_reset_password/new.html.heex:15
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Send instructions to reset password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_settings/edit.html.heex:15
|
#: lib/memex_web/templates/user_settings/edit.html.heex:15
|
||||||
#: lib/memex_web/templates/user_settings/edit.html.heex:44
|
#: lib/memex_web/templates/user_settings/edit.html.heex:44
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -57,12 +69,12 @@ msgid "create invite"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/index.html.heex:49
|
#: lib/memex_web/live/context_live/index.html.heex:49
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:40
|
#: lib/memex_web/live/context_live/show.html.heex:34
|
||||||
#: lib/memex_web/live/note_live/index.html.heex:49
|
#: lib/memex_web/live/note_live/index.html.heex:49
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:37
|
#: lib/memex_web/live/note_live/show.html.heex:38
|
||||||
#: 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:49
|
#: lib/memex_web/live/pipeline_live/show.html.heex:43
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:119
|
#: lib/memex_web/live/pipeline_live/show.html.heex:113
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "delete"
|
msgid "delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -73,12 +85,12 @@ msgid "delete user"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/index.html.heex:38
|
#: lib/memex_web/live/context_live/index.html.heex:38
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:29
|
#: lib/memex_web/live/context_live/show.html.heex:23
|
||||||
#: lib/memex_web/live/note_live/index.html.heex:38
|
#: lib/memex_web/live/note_live/index.html.heex:38
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:26
|
#: lib/memex_web/live/note_live/show.html.heex:27
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:38
|
#: lib/memex_web/live/pipeline_live/index.html.heex:38
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:38
|
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:108
|
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "edit"
|
msgid "edit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -125,34 +137,22 @@ msgstr ""
|
|||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:40
|
#: lib/memex_web/live/context_live/form_component.html.heex:42
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:40
|
#: lib/memex_web/live/note_live/form_component.html.heex:42
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:40
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:42
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:28
|
#: lib/memex_web/live/step_live/form_component.html.heex:28
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "save"
|
msgid "save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:22
|
#: lib/memex_web/live/context_live/show.html.heex:16
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:22
|
#: lib/memex_web/live/note_live/show.html.heex:23
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:31
|
#: lib/memex_web/live/pipeline_live/show.html.heex:25
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "back"
|
msgid "back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:135
|
#: lib/memex_web/live/pipeline_live/show.html.heex:129
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "add step"
|
msgid "add step"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_registration/new.html.heex:51
|
|
||||||
#: lib/memex_web/templates/user_reset_password/new.html.heex:3
|
|
||||||
#: lib/memex_web/templates/user_session/new.html.heex:44
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "forgot your password?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_reset_password/new.html.heex:15
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "send instructions to reset password"
|
|
||||||
msgstr ""
|
|
||||||
|
@ -31,6 +31,16 @@ msgstr ""
|
|||||||
msgid "Confirm your account"
|
msgid "Confirm your account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/user_registration/new.html.heex:36
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "English"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:9
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Forgot your password?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_session/new.html.heex:27
|
#: lib/memex_web/templates/user_session/new.html.heex:27
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Keep me logged in for 60 days"
|
msgid "Keep me logged in for 60 days"
|
||||||
@ -66,6 +76,11 @@ msgstr ""
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/components/user_card.ex:33
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "User registered on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/invite_card.ex:19
|
#: lib/memex_web/components/invite_card.ex:19
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Uses Left:"
|
msgid "Uses Left:"
|
||||||
@ -76,9 +91,9 @@ msgstr ""
|
|||||||
msgid "Uses left"
|
msgid "Uses left"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:17
|
#: lib/memex_web/live/context_live/show.html.heex:11
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:17
|
#: lib/memex_web/live/note_live/show.html.heex:18
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:26
|
#: lib/memex_web/live/pipeline_live/show.html.heex:20
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Visibility: %{visibility}"
|
msgid "Visibility: %{visibility}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -103,6 +118,8 @@ msgstr ""
|
|||||||
msgid "confirm new password"
|
msgid "confirm new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/components/contexts_table_component.ex:48
|
||||||
|
#: lib/memex_web/components/notes_table_component.ex:48
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:23
|
#: lib/memex_web/live/note_live/form_component.html.heex:23
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "content"
|
msgid "content"
|
||||||
@ -167,7 +184,6 @@ msgstr ""
|
|||||||
msgid "enable"
|
msgid "enable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_registration/new.html.heex:36
|
|
||||||
#: lib/memex_web/templates/user_settings/edit.html.heex:126
|
#: lib/memex_web/templates/user_settings/edit.html.heex:126
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "english"
|
msgid "english"
|
||||||
@ -301,17 +317,17 @@ 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:41
|
#: lib/memex_web/live/context_live/form_component.html.heex:43
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:41
|
#: lib/memex_web/live/note_live/form_component.html.heex:43
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:41
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:43
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:29
|
#: lib/memex_web/live/step_live/form_component.html.heex:29
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "saving..."
|
msgid "saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:37
|
#: lib/memex_web/live/context_live/form_component.html.heex:39
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:37
|
#: lib/memex_web/live/note_live/form_component.html.heex:39
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:37
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:39
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "select privacy"
|
msgid "select privacy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -333,8 +349,8 @@ msgstr ""
|
|||||||
msgid "tag1,tag2"
|
msgid "tag1,tag2"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/contexts_table_component.ex:48
|
#: lib/memex_web/components/contexts_table_component.ex:49
|
||||||
#: lib/memex_web/components/notes_table_component.ex:48
|
#: lib/memex_web/components/notes_table_component.ex:49
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:49
|
#: lib/memex_web/components/pipelines_table_component.ex:49
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "tags"
|
msgid "tags"
|
||||||
@ -345,6 +361,11 @@ msgstr ""
|
|||||||
msgid "unlimited"
|
msgid "unlimited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/components/user_card.ex:25
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "user was confirmed at %{relative_datetime}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/index.html.heex:120
|
#: lib/memex_web/live/invite_live/index.html.heex:120
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "users"
|
msgid "users"
|
||||||
@ -360,8 +381,8 @@ msgstr ""
|
|||||||
msgid "view the source code"
|
msgid "view the source code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/contexts_table_component.ex:49
|
#: lib/memex_web/components/contexts_table_component.ex:50
|
||||||
#: lib/memex_web/components/notes_table_component.ex:49
|
#: lib/memex_web/components/notes_table_component.ex:50
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:50
|
#: lib/memex_web/components/pipelines_table_component.ex:50
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "visibility"
|
msgid "visibility"
|
||||||
@ -456,7 +477,7 @@ msgstr ""
|
|||||||
msgid "%{slug} could not be found"
|
msgid "%{slug} could not be found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/home_live.ex:15
|
#: lib/memex_web/live/home_live.ex:13
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "home"
|
msgid "home"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -476,7 +497,6 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/home_live.html.heex:3
|
#: lib/memex_web/live/home_live.html.heex:3
|
||||||
#: lib/memex_web/templates/layout/root.html.heex:8
|
#: lib/memex_web/templates/layout/root.html.heex:8
|
||||||
#: lib/memex_web/templates/layout/root.html.heex:9
|
#: lib/memex_web/templates/layout/root.html.heex:9
|
||||||
#: lib/memex_web/views/layout_view.ex:11
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "memEx"
|
msgid "memEx"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -491,7 +511,7 @@ msgstr ""
|
|||||||
msgid "what is this?"
|
msgid "what is this?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:68
|
#: lib/memex_web/live/pipeline_live/show.html.heex:62
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{position}. %{title}"
|
msgid "%{position}. %{title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -516,12 +536,12 @@ msgstr ""
|
|||||||
msgid "add step to %{slug}"
|
msgid "add step to %{slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:62
|
#: lib/memex_web/live/pipeline_live/show.html.heex:56
|
||||||
#, 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:57
|
#: lib/memex_web/live/pipeline_live/show.html.heex:51
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "steps:"
|
msgid "steps:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -625,43 +645,3 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "zettelkasten"
|
msgid "zettelkasten"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/views/layout_view.ex:10
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "memEx | %{title}"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:9
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "forgot your password?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:126
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "how many people should i invite?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:134
|
|
||||||
#, 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:139
|
|
||||||
#, 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 :)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:129
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "while memEx fully supports multiple users, each memEx instance should be treated as a single cohesive and collaborative document."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/user_card.ex:26
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "user confirmed on"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/user_card.ex:33
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "user registered on"
|
|
||||||
msgstr ""
|
|
||||||
|
@ -31,22 +31,49 @@ msgstr ""
|
|||||||
msgid "If you didn't create an account at %{url}, please ignore this."
|
msgid "If you didn't create an account at %{url}, please ignore this."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/email/confirm_email.html.heex:22
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "If you didn't create an account at Memex, please ignore this."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/reset_password.txt.eex:8
|
#: lib/memex_web/templates/email/reset_password.txt.eex:8
|
||||||
#: lib/memex_web/templates/email/update_email.txt.eex:8
|
#: lib/memex_web/templates/email/update_email.txt.eex:8
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "If you didn't request this change from %{url}, please ignore this."
|
msgid "If you didn't request this change from %{url}, please ignore this."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/email/reset_password.html.heex:16
|
||||||
|
#: lib/memex_web/templates/email/update_email.html.heex:16
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "If you didn't request this change from Memex, please ignore this."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:37
|
#: lib/memex/accounts/email.ex:37
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reset your Memex password"
|
msgid "Reset your Memex password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/layout/email.txt.eex:9
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "This email was sent from Memex at %{url}, the self-hosted firearm tracker website."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/layout/email.html.heex:13
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "This email was sent from Memex, the self-hosted firearm tracker website."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:44
|
#: lib/memex/accounts/email.ex:44
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Update your Memex email"
|
msgid "Update your Memex email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/email/confirm_email.html.heex:9
|
||||||
|
#: lib/memex_web/templates/email/confirm_email.txt.eex:4
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Welcome to Memex"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/update_email.html.heex:8
|
#: lib/memex_web/templates/email/update_email.html.heex:8
|
||||||
#: lib/memex_web/templates/email/update_email.txt.eex:4
|
#: lib/memex_web/templates/email/update_email.txt.eex:4
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -64,30 +91,3 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You can reset your password by visiting the URL below:"
|
msgid "You can reset your password by visiting the URL below:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/layout/email.html.heex:13
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "This email was sent from memEx"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/layout/email.txt.eex:9
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "This email was sent from memEx at %{url}"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/confirm_email.html.heex:22
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "If you didn't create an account at memEx, please ignore this."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/reset_password.html.heex:16
|
|
||||||
#: lib/memex_web/templates/email/update_email.html.heex:16
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "If you didn't request this change from memEx, please ignore this."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/confirm_email.html.heex:9
|
|
||||||
#: lib/memex_web/templates/email/confirm_email.txt.eex:4
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "Welcome to memEx"
|
|
||||||
msgstr ""
|
|
||||||
|
@ -103,11 +103,11 @@ msgid "oops, something went wrong! Please check the errors below"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:49
|
#: lib/memex/contexts/context.ex:49
|
||||||
#: lib/memex/contexts/context.ex:62
|
#: lib/memex/contexts/context.ex:60
|
||||||
#: lib/memex/notes/note.ex:48
|
#: lib/memex/notes/note.ex:48
|
||||||
#: lib/memex/notes/note.ex:61
|
#: lib/memex/notes/note.ex:59
|
||||||
#: lib/memex/pipelines/pipeline.ex:50
|
#: lib/memex/pipelines/pipeline.ex:50
|
||||||
#: lib/memex/pipelines/pipeline.ex:63
|
#: lib/memex/pipelines/pipeline.ex:61
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -131,10 +131,3 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "unauthorized"
|
msgid "unauthorized"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:75
|
|
||||||
#: lib/memex/notes/note.ex:74
|
|
||||||
#: lib/memex/pipelines/pipeline.ex:76
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
|
||||||
msgstr ""
|
|
||||||
|
@ -81,6 +81,11 @@ msgstr ""
|
|||||||
msgid "Language updated successfully."
|
msgid "Language updated successfully."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_session_controller.ex:23
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Logged out successfully."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:46
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:46
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Password reset successfully."
|
msgid "Password reset successfully."
|
||||||
@ -138,12 +143,12 @@ msgid "are you sure you want to make %{invite_name} unlimited?"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/index.html.heex:46
|
#: lib/memex_web/live/context_live/index.html.heex:46
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:37
|
#: lib/memex_web/live/context_live/show.html.heex:31
|
||||||
#: lib/memex_web/live/note_live/index.html.heex:46
|
#: lib/memex_web/live/note_live/index.html.heex:46
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:34
|
#: lib/memex_web/live/note_live/show.html.heex:35
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:46
|
#: lib/memex_web/live/pipeline_live/index.html.heex:46
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:46
|
#: lib/memex_web/live/pipeline_live/show.html.heex:40
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:116
|
#: lib/memex_web/live/pipeline_live/show.html.heex:110
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "are you sure?"
|
msgid "are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -152,8 +157,3 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "register to setup %{name}"
|
msgid "register to setup %{name}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_session_controller.ex:23
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
|
||||||
msgid "logged out successfully."
|
|
||||||
msgstr ""
|
|
||||||
|
@ -20,6 +20,16 @@ msgstr ""
|
|||||||
msgid "Confirm your account"
|
msgid "Confirm your account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/user_registration/new.html.heex:36
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "English"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:9
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Forgot your password?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_session/new.html.heex:27
|
#: lib/memex_web/templates/user_session/new.html.heex:27
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Keep me logged in for 60 days"
|
msgid "Keep me logged in for 60 days"
|
||||||
@ -55,6 +65,11 @@ msgstr ""
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/components/user_card.ex:33
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "User registered on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/invite_card.ex:19
|
#: lib/memex_web/components/invite_card.ex:19
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Uses Left:"
|
msgid "Uses Left:"
|
||||||
@ -65,9 +80,9 @@ msgstr ""
|
|||||||
msgid "Uses left"
|
msgid "Uses left"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:17
|
#: lib/memex_web/live/context_live/show.html.heex:11
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:17
|
#: lib/memex_web/live/note_live/show.html.heex:18
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:26
|
#: lib/memex_web/live/pipeline_live/show.html.heex:20
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Visibility: %{visibility}"
|
msgid "Visibility: %{visibility}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -92,6 +107,8 @@ msgstr ""
|
|||||||
msgid "confirm new password"
|
msgid "confirm new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/components/contexts_table_component.ex:48
|
||||||
|
#: lib/memex_web/components/notes_table_component.ex:48
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:23
|
#: lib/memex_web/live/note_live/form_component.html.heex:23
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "content"
|
msgid "content"
|
||||||
@ -156,7 +173,6 @@ msgstr ""
|
|||||||
msgid "enable"
|
msgid "enable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/user_registration/new.html.heex:36
|
|
||||||
#: lib/memex_web/templates/user_settings/edit.html.heex:126
|
#: lib/memex_web/templates/user_settings/edit.html.heex:126
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "english"
|
msgid "english"
|
||||||
@ -290,17 +306,17 @@ 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:41
|
#: lib/memex_web/live/context_live/form_component.html.heex:43
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:41
|
#: lib/memex_web/live/note_live/form_component.html.heex:43
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:41
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:43
|
||||||
#: lib/memex_web/live/step_live/form_component.html.heex:29
|
#: lib/memex_web/live/step_live/form_component.html.heex:29
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "saving..."
|
msgid "saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/form_component.html.heex:37
|
#: lib/memex_web/live/context_live/form_component.html.heex:39
|
||||||
#: lib/memex_web/live/note_live/form_component.html.heex:37
|
#: lib/memex_web/live/note_live/form_component.html.heex:39
|
||||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:37
|
#: lib/memex_web/live/pipeline_live/form_component.html.heex:39
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "select privacy"
|
msgid "select privacy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -322,8 +338,8 @@ msgstr ""
|
|||||||
msgid "tag1,tag2"
|
msgid "tag1,tag2"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/contexts_table_component.ex:48
|
#: lib/memex_web/components/contexts_table_component.ex:49
|
||||||
#: lib/memex_web/components/notes_table_component.ex:48
|
#: lib/memex_web/components/notes_table_component.ex:49
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:49
|
#: lib/memex_web/components/pipelines_table_component.ex:49
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "tags"
|
msgid "tags"
|
||||||
@ -334,6 +350,11 @@ msgstr ""
|
|||||||
msgid "unlimited"
|
msgid "unlimited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/components/user_card.ex:25
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "user was confirmed at %{relative_datetime}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/invite_live/index.html.heex:120
|
#: lib/memex_web/live/invite_live/index.html.heex:120
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "users"
|
msgid "users"
|
||||||
@ -349,8 +370,8 @@ msgstr ""
|
|||||||
msgid "view the source code"
|
msgid "view the source code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/components/contexts_table_component.ex:49
|
#: lib/memex_web/components/contexts_table_component.ex:50
|
||||||
#: lib/memex_web/components/notes_table_component.ex:49
|
#: lib/memex_web/components/notes_table_component.ex:50
|
||||||
#: lib/memex_web/components/pipelines_table_component.ex:50
|
#: lib/memex_web/components/pipelines_table_component.ex:50
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "visibility"
|
msgid "visibility"
|
||||||
@ -445,7 +466,7 @@ msgstr ""
|
|||||||
msgid "%{slug} could not be found"
|
msgid "%{slug} could not be found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/home_live.ex:15
|
#: lib/memex_web/live/home_live.ex:13
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "home"
|
msgid "home"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -465,7 +486,6 @@ msgstr ""
|
|||||||
#: lib/memex_web/live/home_live.html.heex:3
|
#: lib/memex_web/live/home_live.html.heex:3
|
||||||
#: lib/memex_web/templates/layout/root.html.heex:8
|
#: lib/memex_web/templates/layout/root.html.heex:8
|
||||||
#: lib/memex_web/templates/layout/root.html.heex:9
|
#: lib/memex_web/templates/layout/root.html.heex:9
|
||||||
#: lib/memex_web/views/layout_view.ex:11
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "memEx"
|
msgid "memEx"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -480,7 +500,7 @@ msgstr ""
|
|||||||
msgid "what is this?"
|
msgid "what is this?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:68
|
#: lib/memex_web/live/pipeline_live/show.html.heex:62
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{position}. %{title}"
|
msgid "%{position}. %{title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -505,12 +525,12 @@ msgstr ""
|
|||||||
msgid "add step to %{slug}"
|
msgid "add step to %{slug}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:62
|
#: lib/memex_web/live/pipeline_live/show.html.heex:56
|
||||||
#, 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:57
|
#: lib/memex_web/live/pipeline_live/show.html.heex:51
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "steps:"
|
msgid "steps:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -614,43 +634,3 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "zettelkasten"
|
msgid "zettelkasten"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/views/layout_view.ex:10
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "memEx | %{title}"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:9
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "forgot your password?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:126
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "how many people should i invite?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:134
|
|
||||||
#, 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:139
|
|
||||||
#, 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 :)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/live/faq_live.html.heex:129
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "while memEx fully supports multiple users, each memEx instance should be treated as a single cohesive and collaborative document."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/user_card.ex:26
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "user confirmed on"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/components/user_card.ex:33
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "user registered on"
|
|
||||||
msgstr ""
|
|
||||||
|
@ -30,22 +30,49 @@ msgstr ""
|
|||||||
msgid "If you didn't create an account at %{url}, please ignore this."
|
msgid "If you didn't create an account at %{url}, please ignore this."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/email/confirm_email.html.heex:22
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "If you didn't create an account at Memex, please ignore this."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/reset_password.txt.eex:8
|
#: lib/memex_web/templates/email/reset_password.txt.eex:8
|
||||||
#: lib/memex_web/templates/email/update_email.txt.eex:8
|
#: lib/memex_web/templates/email/update_email.txt.eex:8
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "If you didn't request this change from %{url}, please ignore this."
|
msgid "If you didn't request this change from %{url}, please ignore this."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/email/reset_password.html.heex:16
|
||||||
|
#: lib/memex_web/templates/email/update_email.html.heex:16
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "If you didn't request this change from Memex, please ignore this."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:37
|
#: lib/memex/accounts/email.ex:37
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reset your Memex password"
|
msgid "Reset your Memex password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/layout/email.txt.eex:9
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "This email was sent from Memex at %{url}, the self-hosted firearm tracker website."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/layout/email.html.heex:13
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "This email was sent from Memex, the self-hosted firearm tracker website."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/email.ex:44
|
#: lib/memex/accounts/email.ex:44
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Update your Memex email"
|
msgid "Update your Memex email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/templates/email/confirm_email.html.heex:9
|
||||||
|
#: lib/memex_web/templates/email/confirm_email.txt.eex:4
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Welcome to Memex"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/update_email.html.heex:8
|
#: lib/memex_web/templates/email/update_email.html.heex:8
|
||||||
#: lib/memex_web/templates/email/update_email.txt.eex:4
|
#: lib/memex_web/templates/email/update_email.txt.eex:4
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@ -63,30 +90,3 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "You can reset your password by visiting the URL below:"
|
msgid "You can reset your password by visiting the URL below:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/templates/layout/email.html.heex:13
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "This email was sent from memEx"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/layout/email.txt.eex:9
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "This email was sent from memEx at %{url}"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/confirm_email.html.heex:22
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "If you didn't create an account at memEx, please ignore this."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/reset_password.html.heex:16
|
|
||||||
#: lib/memex_web/templates/email/update_email.html.heex:16
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "If you didn't request this change from memEx, please ignore this."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/memex_web/templates/email/confirm_email.html.heex:9
|
|
||||||
#: lib/memex_web/templates/email/confirm_email.txt.eex:4
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Welcome to memEx"
|
|
||||||
msgstr ""
|
|
||||||
|
@ -102,11 +102,11 @@ msgid "oops, something went wrong! Please check the errors below"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:49
|
#: lib/memex/contexts/context.ex:49
|
||||||
#: lib/memex/contexts/context.ex:62
|
#: lib/memex/contexts/context.ex:60
|
||||||
#: lib/memex/notes/note.ex:48
|
#: lib/memex/notes/note.ex:48
|
||||||
#: lib/memex/notes/note.ex:61
|
#: lib/memex/notes/note.ex:59
|
||||||
#: lib/memex/pipelines/pipeline.ex:50
|
#: lib/memex/pipelines/pipeline.ex:50
|
||||||
#: lib/memex/pipelines/pipeline.ex:63
|
#: lib/memex/pipelines/pipeline.ex:61
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -130,10 +130,3 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "unauthorized"
|
msgid "unauthorized"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:75
|
|
||||||
#: lib/memex/notes/note.ex:74
|
|
||||||
#: lib/memex/pipelines/pipeline.ex:76
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma-delimited"
|
|
||||||
msgstr ""
|
|
||||||
|
@ -80,6 +80,11 @@ msgstr ""
|
|||||||
msgid "Language updated successfully."
|
msgid "Language updated successfully."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/memex_web/controllers/user_session_controller.ex:23
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Logged out successfully."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:46
|
#: lib/memex_web/controllers/user_reset_password_controller.ex:46
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Password reset successfully."
|
msgid "Password reset successfully."
|
||||||
@ -137,12 +142,12 @@ msgid "are you sure you want to make %{invite_name} unlimited?"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/live/context_live/index.html.heex:46
|
#: lib/memex_web/live/context_live/index.html.heex:46
|
||||||
#: lib/memex_web/live/context_live/show.html.heex:37
|
#: lib/memex_web/live/context_live/show.html.heex:31
|
||||||
#: lib/memex_web/live/note_live/index.html.heex:46
|
#: lib/memex_web/live/note_live/index.html.heex:46
|
||||||
#: lib/memex_web/live/note_live/show.html.heex:34
|
#: lib/memex_web/live/note_live/show.html.heex:35
|
||||||
#: lib/memex_web/live/pipeline_live/index.html.heex:46
|
#: lib/memex_web/live/pipeline_live/index.html.heex:46
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:46
|
#: lib/memex_web/live/pipeline_live/show.html.heex:40
|
||||||
#: lib/memex_web/live/pipeline_live/show.html.heex:116
|
#: lib/memex_web/live/pipeline_live/show.html.heex:110
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "are you sure?"
|
msgid "are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -151,8 +156,3 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "register to setup %{name}"
|
msgid "register to setup %{name}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex_web/controllers/user_session_controller.ex:23
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "logged out successfully."
|
|
||||||
msgstr ""
|
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
defmodule Memex.Repo.Migrations.FixSearch do
|
|
||||||
use Ecto.Migration
|
|
||||||
|
|
||||||
def up do
|
|
||||||
reset_search_columns()
|
|
||||||
end
|
|
||||||
|
|
||||||
def down do
|
|
||||||
# no way to rollback this migration since the previous generated search columns were invalid
|
|
||||||
reset_search_columns()
|
|
||||||
end
|
|
||||||
|
|
||||||
defp reset_search_columns() do
|
|
||||||
alter table(:notes), do: remove(:search)
|
|
||||||
alter table(:contexts), do: remove(:search)
|
|
||||||
alter table(:pipelines), do: remove(:search)
|
|
||||||
|
|
||||||
flush()
|
|
||||||
|
|
||||||
execute """
|
|
||||||
ALTER TABLE notes
|
|
||||||
ADD COLUMN search tsvector
|
|
||||||
GENERATED ALWAYS AS (
|
|
||||||
setweight(to_tsvector('english', coalesce(slug, '')), 'A') ||
|
|
||||||
setweight(to_tsvector('english', coalesce(immutable_array_to_string(tags, ' '), '')), 'B') ||
|
|
||||||
setweight(to_tsvector('english', coalesce(content, '')), 'C')
|
|
||||||
) STORED
|
|
||||||
"""
|
|
||||||
|
|
||||||
execute("CREATE INDEX notes_trgm_idx ON notes USING GIN (search)")
|
|
||||||
|
|
||||||
execute """
|
|
||||||
ALTER TABLE contexts
|
|
||||||
ADD COLUMN search tsvector
|
|
||||||
GENERATED ALWAYS AS (
|
|
||||||
setweight(to_tsvector('english', coalesce(slug, '')), 'A') ||
|
|
||||||
setweight(to_tsvector('english', coalesce(immutable_array_to_string(tags, ' '), '')), 'B') ||
|
|
||||||
setweight(to_tsvector('english', coalesce(content, '')), 'C')
|
|
||||||
) STORED
|
|
||||||
"""
|
|
||||||
|
|
||||||
execute("CREATE INDEX contexts_trgm_idx ON contexts USING GIN (search)")
|
|
||||||
|
|
||||||
execute """
|
|
||||||
ALTER TABLE pipelines
|
|
||||||
ADD COLUMN search tsvector
|
|
||||||
GENERATED ALWAYS AS (
|
|
||||||
setweight(to_tsvector('english', coalesce(slug, '')), 'A') ||
|
|
||||||
setweight(to_tsvector('english', coalesce(immutable_array_to_string(tags, ' '), '')), 'B') ||
|
|
||||||
setweight(to_tsvector('english', coalesce(description, '')), 'C')
|
|
||||||
) STORED
|
|
||||||
"""
|
|
||||||
|
|
||||||
execute("CREATE INDEX pipelines_trgm_idx ON pipelines USING GIN (search)")
|
|
||||||
end
|
|
||||||
end
|
|
@ -52,7 +52,7 @@ You can use the following environment variables to configure memEx in
|
|||||||
- `SMTP_SSL`: Set to `true` to enable SSL for emails. Defaults to `false`.
|
- `SMTP_SSL`: Set to `true` to enable SSL for emails. Defaults to `false`.
|
||||||
- `EMAIL_FROM`: Sets the sender email in sent emails. Defaults to
|
- `EMAIL_FROM`: Sets the sender email in sent emails. Defaults to
|
||||||
`no-reply@HOST` where `HOST` was previously defined.
|
`no-reply@HOST` where `HOST` was previously defined.
|
||||||
- `EMAIL_NAME`: Sets the sender name in sent emails. Defaults to "memEx".
|
- `EMAIL_NAME`: Sets the sender name in sent emails. Defaults to "Memex".
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -17,36 +17,6 @@ defmodule Memex.ContextsTest do
|
|||||||
assert Contexts.list_contexts(user) == [context_a, context_b, context_c]
|
assert Contexts.list_contexts(user) == [context_a, context_b, context_c]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "list_contexts/2 returns relevant contexts for a user", %{user: user} do
|
|
||||||
context_a = context_fixture(%{slug: "dogs", content: "has some treats in it"}, user)
|
|
||||||
context_b = context_fixture(%{slug: "cats", tags: ["home"]}, user)
|
|
||||||
|
|
||||||
context_c =
|
|
||||||
%{slug: "chickens", content: "bananas stuff", tags: ["life", "decisions"]}
|
|
||||||
|> context_fixture(user)
|
|
||||||
|
|
||||||
_shouldnt_return =
|
|
||||||
%{slug: "dog", content: "banana treat stuff", visibility: :private}
|
|
||||||
|> context_fixture(user_fixture())
|
|
||||||
|
|
||||||
# slug
|
|
||||||
assert Contexts.list_contexts("dog", user) == [context_a]
|
|
||||||
assert Contexts.list_contexts("dogs", user) == [context_a]
|
|
||||||
assert Contexts.list_contexts("cat", user) == [context_b]
|
|
||||||
assert Contexts.list_contexts("chicken", user) == [context_c]
|
|
||||||
|
|
||||||
# content
|
|
||||||
assert Contexts.list_contexts("treat", user) == [context_a]
|
|
||||||
assert Contexts.list_contexts("banana", user) == [context_c]
|
|
||||||
assert Contexts.list_contexts("stuff", user) == [context_c]
|
|
||||||
|
|
||||||
# tag
|
|
||||||
assert Contexts.list_contexts("home", user) == [context_b]
|
|
||||||
assert Contexts.list_contexts("life", user) == [context_c]
|
|
||||||
assert Contexts.list_contexts("decision", user) == [context_c]
|
|
||||||
assert Contexts.list_contexts("decisions", user) == [context_c]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "list_public_contexts/0 returns public contexts", %{user: user} do
|
test "list_public_contexts/0 returns public contexts", %{user: user} do
|
||||||
public_context = context_fixture(%{visibility: :public}, user)
|
public_context = context_fixture(%{visibility: :public}, user)
|
||||||
context_fixture(%{visibility: :unlisted}, user)
|
context_fixture(%{visibility: :unlisted}, user)
|
||||||
@ -54,51 +24,6 @@ defmodule Memex.ContextsTest do
|
|||||||
assert Contexts.list_public_contexts() == [public_context]
|
assert Contexts.list_public_contexts() == [public_context]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "list_public_contexts/1 returns relevant contexts for a user", %{user: user} do
|
|
||||||
context_a =
|
|
||||||
%{slug: "dogs", content: "has some treats in it", visibility: :public}
|
|
||||||
|> context_fixture(user)
|
|
||||||
|
|
||||||
context_b =
|
|
||||||
%{slug: "cats", tags: ["home"], visibility: :public}
|
|
||||||
|> context_fixture(user)
|
|
||||||
|
|
||||||
context_c =
|
|
||||||
%{
|
|
||||||
slug: "chickens",
|
|
||||||
content: "bananas stuff",
|
|
||||||
tags: ["life", "decisions"],
|
|
||||||
visibility: :public
|
|
||||||
}
|
|
||||||
|> context_fixture(user)
|
|
||||||
|
|
||||||
_shouldnt_return =
|
|
||||||
%{
|
|
||||||
slug: "dog",
|
|
||||||
content: "treats bananas stuff",
|
|
||||||
tags: ["home", "life", "decisions"],
|
|
||||||
visibility: :private
|
|
||||||
}
|
|
||||||
|> context_fixture(user)
|
|
||||||
|
|
||||||
# slug
|
|
||||||
assert Contexts.list_public_contexts("dog") == [context_a]
|
|
||||||
assert Contexts.list_public_contexts("dogs") == [context_a]
|
|
||||||
assert Contexts.list_public_contexts("cat") == [context_b]
|
|
||||||
assert Contexts.list_public_contexts("chicken") == [context_c]
|
|
||||||
|
|
||||||
# content
|
|
||||||
assert Contexts.list_public_contexts("treat") == [context_a]
|
|
||||||
assert Contexts.list_public_contexts("banana") == [context_c]
|
|
||||||
assert Contexts.list_public_contexts("stuff") == [context_c]
|
|
||||||
|
|
||||||
# tag
|
|
||||||
assert Contexts.list_public_contexts("home") == [context_b]
|
|
||||||
assert Contexts.list_public_contexts("life") == [context_c]
|
|
||||||
assert Contexts.list_public_contexts("decision") == [context_c]
|
|
||||||
assert Contexts.list_public_contexts("decisions") == [context_c]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "get_context!/1 returns the context with given id", %{user: user} do
|
test "get_context!/1 returns the context with given id", %{user: user} do
|
||||||
context = context_fixture(%{visibility: :public}, user)
|
context = context_fixture(%{visibility: :public}, user)
|
||||||
assert Contexts.get_context!(context.id, user) == context
|
assert Contexts.get_context!(context.id, user) == context
|
||||||
|
@ -14,41 +14,9 @@ defmodule Memex.NotesTest do
|
|||||||
note_a = note_fixture(%{slug: "a", visibility: :public}, user)
|
note_a = note_fixture(%{slug: "a", visibility: :public}, user)
|
||||||
note_b = note_fixture(%{slug: "b", visibility: :unlisted}, user)
|
note_b = note_fixture(%{slug: "b", visibility: :unlisted}, user)
|
||||||
note_c = note_fixture(%{slug: "c", visibility: :private}, user)
|
note_c = note_fixture(%{slug: "c", visibility: :private}, user)
|
||||||
_shouldnt_return = note_fixture(%{visibility: :private}, user_fixture())
|
|
||||||
|
|
||||||
assert Notes.list_notes(user) == [note_a, note_b, note_c]
|
assert Notes.list_notes(user) == [note_a, note_b, note_c]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "list_notes/2 returns relevant notes for a user", %{user: user} do
|
|
||||||
note_a = note_fixture(%{slug: "dogs", content: "has some treats in it"}, user)
|
|
||||||
note_b = note_fixture(%{slug: "cats", tags: ["home"]}, user)
|
|
||||||
|
|
||||||
note_c =
|
|
||||||
%{slug: "chickens", content: "bananas stuff", tags: ["life", "decisions"]}
|
|
||||||
|> note_fixture(user)
|
|
||||||
|
|
||||||
_shouldnt_return =
|
|
||||||
%{slug: "dog", content: "banana treat stuff", visibility: :private}
|
|
||||||
|> note_fixture(user_fixture())
|
|
||||||
|
|
||||||
# slug
|
|
||||||
assert Notes.list_notes("dog", user) == [note_a]
|
|
||||||
assert Notes.list_notes("dogs", user) == [note_a]
|
|
||||||
assert Notes.list_notes("cat", user) == [note_b]
|
|
||||||
assert Notes.list_notes("chicken", user) == [note_c]
|
|
||||||
|
|
||||||
# content
|
|
||||||
assert Notes.list_notes("treat", user) == [note_a]
|
|
||||||
assert Notes.list_notes("banana", user) == [note_c]
|
|
||||||
assert Notes.list_notes("stuff", user) == [note_c]
|
|
||||||
|
|
||||||
# tag
|
|
||||||
assert Notes.list_notes("home", user) == [note_b]
|
|
||||||
assert Notes.list_notes("life", user) == [note_c]
|
|
||||||
assert Notes.list_notes("decision", user) == [note_c]
|
|
||||||
assert Notes.list_notes("decisions", user) == [note_c]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "list_public_notes/0 returns public notes", %{user: user} do
|
test "list_public_notes/0 returns public notes", %{user: user} do
|
||||||
public_note = note_fixture(%{visibility: :public}, user)
|
public_note = note_fixture(%{visibility: :public}, user)
|
||||||
note_fixture(%{visibility: :unlisted}, user)
|
note_fixture(%{visibility: :unlisted}, user)
|
||||||
@ -56,51 +24,6 @@ defmodule Memex.NotesTest do
|
|||||||
assert Notes.list_public_notes() == [public_note]
|
assert Notes.list_public_notes() == [public_note]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "list_public_notes/1 returns relevant notes for a user", %{user: user} do
|
|
||||||
note_a =
|
|
||||||
%{slug: "dogs", content: "has some treats in it", visibility: :public}
|
|
||||||
|> note_fixture(user)
|
|
||||||
|
|
||||||
note_b =
|
|
||||||
%{slug: "cats", tags: ["home"], visibility: :public}
|
|
||||||
|> note_fixture(user)
|
|
||||||
|
|
||||||
note_c =
|
|
||||||
%{
|
|
||||||
slug: "chickens",
|
|
||||||
content: "bananas stuff",
|
|
||||||
tags: ["life", "decisions"],
|
|
||||||
visibility: :public
|
|
||||||
}
|
|
||||||
|> note_fixture(user)
|
|
||||||
|
|
||||||
_shouldnt_return =
|
|
||||||
%{
|
|
||||||
slug: "dog",
|
|
||||||
content: "treats bananas stuff",
|
|
||||||
tags: ["home", "life", "decisions"],
|
|
||||||
visibility: :private
|
|
||||||
}
|
|
||||||
|> note_fixture(user)
|
|
||||||
|
|
||||||
# slug
|
|
||||||
assert Notes.list_public_notes("dog") == [note_a]
|
|
||||||
assert Notes.list_public_notes("dogs") == [note_a]
|
|
||||||
assert Notes.list_public_notes("cat") == [note_b]
|
|
||||||
assert Notes.list_public_notes("chicken") == [note_c]
|
|
||||||
|
|
||||||
# content
|
|
||||||
assert Notes.list_public_notes("treat") == [note_a]
|
|
||||||
assert Notes.list_public_notes("banana") == [note_c]
|
|
||||||
assert Notes.list_public_notes("stuff") == [note_c]
|
|
||||||
|
|
||||||
# tag
|
|
||||||
assert Notes.list_public_notes("home") == [note_b]
|
|
||||||
assert Notes.list_public_notes("life") == [note_c]
|
|
||||||
assert Notes.list_public_notes("decision") == [note_c]
|
|
||||||
assert Notes.list_public_notes("decisions") == [note_c]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "get_note!/1 returns the note with given id", %{user: user} do
|
test "get_note!/1 returns the note with given id", %{user: user} do
|
||||||
note = note_fixture(%{visibility: :public}, user)
|
note = note_fixture(%{visibility: :public}, user)
|
||||||
assert Notes.get_note!(note.id, user) == note
|
assert Notes.get_note!(note.id, user) == note
|
||||||
|
@ -17,36 +17,6 @@ defmodule Memex.PipelinesTest do
|
|||||||
assert Pipelines.list_pipelines(user) == [pipeline_a, pipeline_b, pipeline_c]
|
assert Pipelines.list_pipelines(user) == [pipeline_a, pipeline_b, pipeline_c]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "list_pipelines/2 returns relevant pipelines for a user", %{user: user} do
|
|
||||||
pipeline_a = pipeline_fixture(%{slug: "dogs", description: "has some treats in it"}, user)
|
|
||||||
pipeline_b = pipeline_fixture(%{slug: "cats", tags: ["home"]}, user)
|
|
||||||
|
|
||||||
pipeline_c =
|
|
||||||
%{slug: "chickens", description: "bananas stuff", tags: ["life", "decisions"]}
|
|
||||||
|> pipeline_fixture(user)
|
|
||||||
|
|
||||||
_shouldnt_return =
|
|
||||||
%{slug: "dog", description: "banana treat stuff", visibility: :private}
|
|
||||||
|> pipeline_fixture(user_fixture())
|
|
||||||
|
|
||||||
# slug
|
|
||||||
assert Pipelines.list_pipelines("dog", user) == [pipeline_a]
|
|
||||||
assert Pipelines.list_pipelines("dogs", user) == [pipeline_a]
|
|
||||||
assert Pipelines.list_pipelines("cat", user) == [pipeline_b]
|
|
||||||
assert Pipelines.list_pipelines("chicken", user) == [pipeline_c]
|
|
||||||
|
|
||||||
# description
|
|
||||||
assert Pipelines.list_pipelines("treat", user) == [pipeline_a]
|
|
||||||
assert Pipelines.list_pipelines("banana", user) == [pipeline_c]
|
|
||||||
assert Pipelines.list_pipelines("stuff", user) == [pipeline_c]
|
|
||||||
|
|
||||||
# tag
|
|
||||||
assert Pipelines.list_pipelines("home", user) == [pipeline_b]
|
|
||||||
assert Pipelines.list_pipelines("life", user) == [pipeline_c]
|
|
||||||
assert Pipelines.list_pipelines("decision", user) == [pipeline_c]
|
|
||||||
assert Pipelines.list_pipelines("decisions", user) == [pipeline_c]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "list_public_pipelines/0 returns public pipelines", %{user: user} do
|
test "list_public_pipelines/0 returns public pipelines", %{user: user} do
|
||||||
public_pipeline = pipeline_fixture(%{visibility: :public}, user)
|
public_pipeline = pipeline_fixture(%{visibility: :public}, user)
|
||||||
pipeline_fixture(%{visibility: :unlisted}, user)
|
pipeline_fixture(%{visibility: :unlisted}, user)
|
||||||
@ -54,51 +24,6 @@ defmodule Memex.PipelinesTest do
|
|||||||
assert Pipelines.list_public_pipelines() == [public_pipeline]
|
assert Pipelines.list_public_pipelines() == [public_pipeline]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "list_public_pipelines/1 returns relevant pipelines for a user", %{user: user} do
|
|
||||||
pipeline_a =
|
|
||||||
%{slug: "dogs", description: "has some treats in it", visibility: :public}
|
|
||||||
|> pipeline_fixture(user)
|
|
||||||
|
|
||||||
pipeline_b =
|
|
||||||
%{slug: "cats", tags: ["home"], visibility: :public}
|
|
||||||
|> pipeline_fixture(user)
|
|
||||||
|
|
||||||
pipeline_c =
|
|
||||||
%{
|
|
||||||
slug: "chickens",
|
|
||||||
description: "bananas stuff",
|
|
||||||
tags: ["life", "decisions"],
|
|
||||||
visibility: :public
|
|
||||||
}
|
|
||||||
|> pipeline_fixture(user)
|
|
||||||
|
|
||||||
_shouldnt_return =
|
|
||||||
%{
|
|
||||||
slug: "dog",
|
|
||||||
description: "treats bananas stuff",
|
|
||||||
tags: ["home", "life", "decisions"],
|
|
||||||
visibility: :private
|
|
||||||
}
|
|
||||||
|> pipeline_fixture(user)
|
|
||||||
|
|
||||||
# slug
|
|
||||||
assert Pipelines.list_public_pipelines("dog") == [pipeline_a]
|
|
||||||
assert Pipelines.list_public_pipelines("dogs") == [pipeline_a]
|
|
||||||
assert Pipelines.list_public_pipelines("cat") == [pipeline_b]
|
|
||||||
assert Pipelines.list_public_pipelines("chicken") == [pipeline_c]
|
|
||||||
|
|
||||||
# description
|
|
||||||
assert Pipelines.list_public_pipelines("treat") == [pipeline_a]
|
|
||||||
assert Pipelines.list_public_pipelines("banana") == [pipeline_c]
|
|
||||||
assert Pipelines.list_public_pipelines("stuff") == [pipeline_c]
|
|
||||||
|
|
||||||
# tag
|
|
||||||
assert Pipelines.list_public_pipelines("home") == [pipeline_b]
|
|
||||||
assert Pipelines.list_public_pipelines("life") == [pipeline_c]
|
|
||||||
assert Pipelines.list_public_pipelines("decision") == [pipeline_c]
|
|
||||||
assert Pipelines.list_public_pipelines("decisions") == [pipeline_c]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "get_pipeline!/1 returns the pipeline with given id", %{user: user} do
|
test "get_pipeline!/1 returns the pipeline with given id", %{user: user} do
|
||||||
pipeline = pipeline_fixture(%{visibility: :public}, user)
|
pipeline = pipeline_fixture(%{visibility: :public}, user)
|
||||||
assert Pipelines.get_pipeline!(pipeline.id, user) == pipeline
|
assert Pipelines.get_pipeline!(pipeline.id, user) == pipeline
|
||||||
|
@ -17,7 +17,7 @@ defmodule MemexWeb.UserResetPasswordControllerTest do
|
|||||||
test "renders the reset password page", %{conn: conn} do
|
test "renders the reset password page", %{conn: conn} do
|
||||||
conn = get(conn, Routes.user_reset_password_path(conn, :new))
|
conn = get(conn, Routes.user_reset_password_path(conn, :new))
|
||||||
response = html_response(conn, 200)
|
response = html_response(conn, 200)
|
||||||
assert response =~ dgettext("actions", "forgot your password?")
|
assert response =~ dgettext("actions", "Forgot your password?")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -88,14 +88,14 @@ defmodule MemexWeb.UserSessionControllerTest do
|
|||||||
conn = conn |> log_in_user(current_user) |> delete(Routes.user_session_path(conn, :delete))
|
conn = conn |> log_in_user(current_user) |> delete(Routes.user_session_path(conn, :delete))
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == "/"
|
||||||
refute get_session(conn, :user_token)
|
refute get_session(conn, :user_token)
|
||||||
assert get_flash(conn, :info) =~ gettext("logged out successfully")
|
assert get_flash(conn, :info) =~ gettext("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, Routes.user_session_path(conn, :delete))
|
conn = delete(conn, Routes.user_session_path(conn, :delete))
|
||||||
assert redirected_to(conn) == "/"
|
assert redirected_to(conn) == "/"
|
||||||
refute get_session(conn, :user_token)
|
refute get_session(conn, :user_token)
|
||||||
assert get_flash(conn, :info) =~ gettext("logged out successfully")
|
assert get_flash(conn, :info) =~ gettext("Logged out successfully")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -34,15 +34,7 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
{:ok, _index_live, html} = live(conn, Routes.context_index_path(conn, :index))
|
{:ok, _index_live, html} = live(conn, Routes.context_index_path(conn, :index))
|
||||||
|
|
||||||
assert html =~ "contexts"
|
assert html =~ "contexts"
|
||||||
assert html =~ context.slug
|
assert html =~ context.content
|
||||||
end
|
|
||||||
|
|
||||||
test "searches by tag", %{conn: conn} do
|
|
||||||
{:ok, index_live, html} = live(conn, Routes.context_index_path(conn, :index))
|
|
||||||
|
|
||||||
assert html =~ "example-tag"
|
|
||||||
assert index_live |> element("a", "example-tag") |> render_click()
|
|
||||||
assert_patch(index_live, Routes.context_index_path(conn, :search, "example-tag"))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "saves new context", %{conn: conn} do
|
test "saves new context", %{conn: conn} do
|
||||||
@ -64,7 +56,7 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
|> follow_redirect(conn, Routes.context_index_path(conn, :index))
|
|> follow_redirect(conn, Routes.context_index_path(conn, :index))
|
||||||
|
|
||||||
assert html =~ "#{@create_attrs |> Map.get("slug")} created"
|
assert html =~ "#{@create_attrs |> Map.get("slug")} created"
|
||||||
assert html =~ "some-slug"
|
assert html =~ "some content"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates context in listing", %{conn: conn, context: context} do
|
test "updates context in listing", %{conn: conn, context: context} do
|
||||||
@ -86,7 +78,7 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
|> follow_redirect(conn, Routes.context_index_path(conn, :index))
|
|> follow_redirect(conn, Routes.context_index_path(conn, :index))
|
||||||
|
|
||||||
assert html =~ "#{@update_attrs |> Map.get("slug")} saved"
|
assert html =~ "#{@update_attrs |> Map.get("slug")} saved"
|
||||||
assert html =~ "some-updated-slug"
|
assert html =~ "some updated content"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "deletes context in listing", %{conn: conn, context: context} do
|
test "deletes context in listing", %{conn: conn, context: context} do
|
||||||
@ -104,7 +96,7 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
{:ok, _show_live, html} = live(conn, Routes.context_show_path(conn, :show, context.slug))
|
{:ok, _show_live, html} = live(conn, Routes.context_show_path(conn, :show, context.slug))
|
||||||
|
|
||||||
assert html =~ "context"
|
assert html =~ "context"
|
||||||
assert html =~ context.slug
|
assert html =~ context.content
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates context within modal", %{conn: conn, context: context} do
|
test "updates context within modal", %{conn: conn, context: context} do
|
||||||
@ -114,13 +106,9 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
|
|
||||||
assert_patch(show_live, Routes.context_show_path(conn, :edit, context.slug))
|
assert_patch(show_live, Routes.context_show_path(conn, :edit, context.slug))
|
||||||
|
|
||||||
html =
|
assert show_live
|
||||||
show_live
|
|
||||||
|> form("#context-form", context: @invalid_attrs)
|
|> form("#context-form", context: @invalid_attrs)
|
||||||
|> render_change()
|
|> render_change() =~ "can't be blank"
|
||||||
|
|
||||||
assert html =~ "can't be blank"
|
|
||||||
assert html =~ "tags must be comma-delimited"
|
|
||||||
|
|
||||||
{:ok, _, html} =
|
{:ok, _, html} =
|
||||||
show_live
|
show_live
|
||||||
@ -129,7 +117,7 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
|> follow_redirect(conn, Routes.context_show_path(conn, :show, context.slug))
|
|> follow_redirect(conn, Routes.context_show_path(conn, :show, context.slug))
|
||||||
|
|
||||||
assert html =~ "#{context.slug} saved"
|
assert html =~ "#{context.slug} saved"
|
||||||
assert html =~ "tag2"
|
assert html =~ "some updated content"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "deletes context", %{conn: conn, context: context} do
|
test "deletes context", %{conn: conn, context: context} do
|
||||||
@ -158,14 +146,6 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "searches by tag", %{conn: conn, context: context} do
|
|
||||||
{:ok, show_live, html} = live(conn, Routes.context_show_path(conn, :show, context.slug))
|
|
||||||
|
|
||||||
assert html =~ "example-tag"
|
|
||||||
assert show_live |> element("a", "example-tag") |> render_click()
|
|
||||||
assert_redirect(show_live, Routes.context_index_path(conn, :search, "example-tag"))
|
|
||||||
end
|
|
||||||
|
|
||||||
test "displays context", %{conn: conn, context: context, note: %{slug: note_slug}} do
|
test "displays context", %{conn: conn, context: context, note: %{slug: note_slug}} do
|
||||||
{:ok, show_live, html} = live(conn, Routes.context_show_path(conn, :show, context.slug))
|
{:ok, show_live, html} = live(conn, Routes.context_show_path(conn, :show, context.slug))
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
|
|
||||||
import Phoenix.LiveViewTest
|
import Phoenix.LiveViewTest
|
||||||
import Memex.NotesFixtures
|
import Memex.NotesFixtures
|
||||||
alias MemexWeb.Endpoint
|
|
||||||
|
|
||||||
@create_attrs %{
|
@create_attrs %{
|
||||||
"content" => "some content",
|
"content" => "some content",
|
||||||
@ -35,15 +34,7 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
{:ok, _index_live, html} = live(conn, Routes.note_index_path(conn, :index))
|
{:ok, _index_live, html} = live(conn, Routes.note_index_path(conn, :index))
|
||||||
|
|
||||||
assert html =~ "notes"
|
assert html =~ "notes"
|
||||||
assert html =~ note.slug
|
assert html =~ note.content
|
||||||
end
|
|
||||||
|
|
||||||
test "searches by tag", %{conn: conn} do
|
|
||||||
{:ok, index_live, html} = live(conn, Routes.note_index_path(conn, :index))
|
|
||||||
|
|
||||||
assert html =~ "example-tag"
|
|
||||||
assert index_live |> element("a", "example-tag") |> render_click()
|
|
||||||
assert_patch(index_live, Routes.note_index_path(conn, :search, "example-tag"))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "saves new note", %{conn: conn} do
|
test "saves new note", %{conn: conn} do
|
||||||
@ -54,13 +45,9 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
|
|
||||||
assert_patch(index_live, Routes.note_index_path(conn, :new))
|
assert_patch(index_live, Routes.note_index_path(conn, :new))
|
||||||
|
|
||||||
html =
|
assert index_live
|
||||||
index_live
|
|
||||||
|> form("#note-form", note: @invalid_attrs)
|
|> form("#note-form", note: @invalid_attrs)
|
||||||
|> render_change()
|
|> render_change() =~ "can't be blank"
|
||||||
|
|
||||||
assert html =~ "can't be blank"
|
|
||||||
assert html =~ "tags must be comma-delimited"
|
|
||||||
|
|
||||||
{:ok, _, html} =
|
{:ok, _, html} =
|
||||||
index_live
|
index_live
|
||||||
@ -69,7 +56,7 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
|> follow_redirect(conn, Routes.note_index_path(conn, :index))
|
|> follow_redirect(conn, Routes.note_index_path(conn, :index))
|
||||||
|
|
||||||
assert html =~ "#{@create_attrs |> Map.get("slug")} created"
|
assert html =~ "#{@create_attrs |> Map.get("slug")} created"
|
||||||
assert html =~ "some-slug"
|
assert html =~ "some content"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates note in listing", %{conn: conn, note: note} do
|
test "updates note in listing", %{conn: conn, note: note} do
|
||||||
@ -91,7 +78,7 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
|> follow_redirect(conn, Routes.note_index_path(conn, :index))
|
|> follow_redirect(conn, Routes.note_index_path(conn, :index))
|
||||||
|
|
||||||
assert html =~ "#{@update_attrs |> Map.get("slug")} saved"
|
assert html =~ "#{@update_attrs |> Map.get("slug")} saved"
|
||||||
assert html =~ "some-updated-slug"
|
assert html =~ "some updated content"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "deletes note in listing", %{conn: conn, note: note} do
|
test "deletes note in listing", %{conn: conn, note: note} do
|
||||||
@ -109,7 +96,7 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
{:ok, _show_live, html} = live(conn, Routes.note_show_path(conn, :show, note.slug))
|
{:ok, _show_live, html} = live(conn, Routes.note_show_path(conn, :show, note.slug))
|
||||||
|
|
||||||
assert html =~ "note"
|
assert html =~ "note"
|
||||||
assert html =~ note.slug
|
assert html =~ note.content
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates note within modal", %{conn: conn, note: note} do
|
test "updates note within modal", %{conn: conn, note: note} do
|
||||||
@ -130,7 +117,7 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
|> follow_redirect(conn, Routes.note_show_path(conn, :show, note.slug))
|
|> follow_redirect(conn, Routes.note_show_path(conn, :show, note.slug))
|
||||||
|
|
||||||
assert html =~ "#{note.slug} saved"
|
assert html =~ "#{note.slug} saved"
|
||||||
assert html =~ "tag2"
|
assert html =~ "some updated content"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "deletes note", %{conn: conn, note: note} do
|
test "deletes note", %{conn: conn, note: note} do
|
||||||
@ -145,39 +132,4 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
refute has_element?(index_live, "#note-#{note.id}")
|
refute has_element?(index_live, "#note-#{note.id}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "show with note" do
|
|
||||||
setup [:register_and_log_in_user]
|
|
||||||
|
|
||||||
setup %{user: user} do
|
|
||||||
%{slug: note_slug} = note = note_fixture(user)
|
|
||||||
|
|
||||||
[
|
|
||||||
note: note,
|
|
||||||
backlinked_note:
|
|
||||||
note_fixture(%{content: "example with backlink to [[#{note_slug}]] note"}, user)
|
|
||||||
]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "searches by tag", %{conn: conn, note: note} do
|
|
||||||
{:ok, show_live, html} = live(conn, Routes.note_show_path(conn, :show, note.slug))
|
|
||||||
|
|
||||||
assert html =~ "example-tag"
|
|
||||||
assert show_live |> element("a", "example-tag") |> render_click()
|
|
||||||
assert_redirect(show_live, Routes.note_index_path(conn, :search, "example-tag"))
|
|
||||||
end
|
|
||||||
|
|
||||||
test "displays context", %{
|
|
||||||
conn: conn,
|
|
||||||
backlinked_note: %{slug: backlinked_note_slug},
|
|
||||||
note: %{slug: note_slug}
|
|
||||||
} do
|
|
||||||
{:ok, show_live, html} =
|
|
||||||
live(conn, Routes.note_show_path(conn, :show, backlinked_note_slug))
|
|
||||||
|
|
||||||
assert html =~ "context"
|
|
||||||
assert html =~ Routes.note_show_path(Endpoint, :show, note_slug)
|
|
||||||
assert has_element?(show_live, "[data-qa=\"note-link-#{note_slug}\"]")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
@ -48,14 +48,6 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
assert html =~ pipeline.description
|
assert html =~ pipeline.description
|
||||||
end
|
end
|
||||||
|
|
||||||
test "searches by tag", %{conn: conn} do
|
|
||||||
{:ok, index_live, html} = live(conn, Routes.pipeline_index_path(conn, :index))
|
|
||||||
|
|
||||||
assert html =~ "example-tag"
|
|
||||||
assert index_live |> element("a", "example-tag") |> render_click()
|
|
||||||
assert_patch(index_live, Routes.pipeline_index_path(conn, :search, "example-tag"))
|
|
||||||
end
|
|
||||||
|
|
||||||
test "saves new pipeline", %{conn: conn} do
|
test "saves new pipeline", %{conn: conn} do
|
||||||
{:ok, index_live, _html} = live(conn, Routes.pipeline_index_path(conn, :index))
|
{:ok, index_live, _html} = live(conn, Routes.pipeline_index_path(conn, :index))
|
||||||
|
|
||||||
@ -128,13 +120,9 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
|
|
||||||
assert_patch(show_live, Routes.pipeline_show_path(conn, :edit, pipeline.slug))
|
assert_patch(show_live, Routes.pipeline_show_path(conn, :edit, pipeline.slug))
|
||||||
|
|
||||||
html =
|
assert show_live
|
||||||
show_live
|
|
||||||
|> form("#pipeline-form", pipeline: @invalid_attrs)
|
|> form("#pipeline-form", pipeline: @invalid_attrs)
|
||||||
|> render_change()
|
|> render_change() =~ "can't be blank"
|
||||||
|
|
||||||
assert html =~ "can't be blank"
|
|
||||||
assert html =~ "tags must be comma-delimited"
|
|
||||||
|
|
||||||
{:ok, _, html} =
|
{:ok, _, html} =
|
||||||
show_live
|
show_live
|
||||||
@ -187,14 +175,6 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "searches by tag", %{conn: conn, pipeline: pipeline} do
|
|
||||||
{:ok, show_live, html} = live(conn, Routes.pipeline_show_path(conn, :show, pipeline.slug))
|
|
||||||
|
|
||||||
assert html =~ "example-tag"
|
|
||||||
assert show_live |> element("a", "example-tag") |> render_click()
|
|
||||||
assert_redirect(show_live, Routes.pipeline_index_path(conn, :search, "example-tag"))
|
|
||||||
end
|
|
||||||
|
|
||||||
test "updates a step", %{conn: conn, pipeline: pipeline, step: step} do
|
test "updates a step", %{conn: conn, pipeline: pipeline, step: step} do
|
||||||
{:ok, show_live, _html} = live(conn, Routes.pipeline_show_path(conn, :show, pipeline.slug))
|
{:ok, show_live, _html} = live(conn, Routes.pipeline_show_path(conn, :show, pipeline.slug))
|
||||||
|
|
||||||
|
@ -16,12 +16,12 @@ defmodule Memex.ContextsFixtures do
|
|||||||
attrs
|
attrs
|
||||||
|> Enum.into(%{
|
|> Enum.into(%{
|
||||||
content: "some content",
|
content: "some content",
|
||||||
tags: ["example-tag"],
|
tag: [],
|
||||||
slug: random_slug(),
|
slug: random_slug(),
|
||||||
visibility: :private
|
visibility: :private
|
||||||
})
|
})
|
||||||
|> Contexts.create_context(user)
|
|> Contexts.create_context(user)
|
||||||
|
|
||||||
%{context | tags_string: nil}
|
context
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -16,12 +16,12 @@ defmodule Memex.NotesFixtures do
|
|||||||
attrs
|
attrs
|
||||||
|> Enum.into(%{
|
|> Enum.into(%{
|
||||||
content: "some content",
|
content: "some content",
|
||||||
tags: ["example-tag"],
|
tag: [],
|
||||||
slug: random_slug(),
|
slug: random_slug(),
|
||||||
visibility: :private
|
visibility: :private
|
||||||
})
|
})
|
||||||
|> Notes.create_note(user)
|
|> Notes.create_note(user)
|
||||||
|
|
||||||
%{note | tags_string: nil}
|
note
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -16,12 +16,12 @@ defmodule Memex.PipelinesFixtures do
|
|||||||
attrs
|
attrs
|
||||||
|> Enum.into(%{
|
|> Enum.into(%{
|
||||||
description: "some description",
|
description: "some description",
|
||||||
tags: ["example-tag"],
|
tag: [],
|
||||||
slug: random_slug(),
|
slug: random_slug(),
|
||||||
visibility: :private
|
visibility: :private
|
||||||
})
|
})
|
||||||
|> Pipelines.create_pipeline(user)
|
|> Pipelines.create_pipeline(user)
|
||||||
|
|
||||||
%{pipeline | tags_string: nil}
|
pipeline
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user