Compare commits
21 Commits
Author | SHA1 | Date | |
---|---|---|---|
59283a0217 | |||
634891ee73 | |||
571f6fffdb | |||
926805ba9b | |||
220122dec6 | |||
de399b4819 | |||
c3ceb877b2 | |||
0b4449c8a8 | |||
6452f64fec | |||
c0afc96b8d | |||
2cfecc54a0 | |||
501eb5d560 | |||
16c4ae16d3 | |||
516fe4a9f7 | |||
4a15f27923 | |||
dcfd1b87df | |||
c0df3440f5 | |||
6f03bee761 | |||
fe91d8de6d | |||
30535fe5e1 | |||
b7464cff38 |
26
changelog.md
Normal file
26
changelog.md
Normal file
@ -0,0 +1,26 @@
|
||||
# v0.1.5
|
||||
- fix overflow on note/contexts/step contents
|
||||
|
||||
# v0.1.4
|
||||
- fix docker-compose
|
||||
- fix newlines in note/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
|
@ -77,14 +77,14 @@ Check them out!
|
||||
For development, I recommend setting environment variables with
|
||||
[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,
|
||||
they will need to be overridden in `config/dev.exs` and `config/runtime.exs` for
|
||||
`dev` and `prod` modes, respectively.
|
||||
|
||||
## `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
|
||||
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`
|
||||
|
||||
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
|
||||
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`
|
||||
|
||||
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
|
||||
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`.
|
||||
- `EMAIL_FROM`: Sets the sender email in sent emails. Defaults to
|
||||
`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
Normal file
10
de.tbx
Normal file
@ -0,0 +1,10 @@
|
||||
<?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,8 +2,7 @@ version: '3'
|
||||
|
||||
services:
|
||||
memex:
|
||||
build:
|
||||
context: .
|
||||
image: shibaobun/memex
|
||||
container_name: memex
|
||||
restart: always
|
||||
environment:
|
||||
@ -25,8 +24,8 @@ services:
|
||||
# - SMTP_SSL=false
|
||||
# optional, default is format below
|
||||
# - EMAIL_FROM=no-reply@memex.example.tld
|
||||
# optional, default is "Memex"
|
||||
# - EMAIL_NAME=Memex
|
||||
# optional, default is "memEx"
|
||||
# - EMAIL_NAME=memEx
|
||||
expose:
|
||||
- "4000"
|
||||
depends_on:
|
||||
|
@ -4,7 +4,6 @@ defmodule Memex.Contexts do
|
||||
"""
|
||||
|
||||
import Ecto.Query, warn: false
|
||||
alias Ecto.Changeset
|
||||
alias Memex.{Accounts.User, Contexts.Context, Repo}
|
||||
|
||||
@doc """
|
||||
@ -35,13 +34,13 @@ defmodule Memex.Contexts do
|
||||
where: c.user_id == ^user_id,
|
||||
where:
|
||||
fragment(
|
||||
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||
"search @@ websearch_to_tsquery('english', ?)",
|
||||
^trimmed_search
|
||||
),
|
||||
order_by: {
|
||||
:desc,
|
||||
fragment(
|
||||
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
||||
^trimmed_search
|
||||
)
|
||||
}
|
||||
@ -76,13 +75,13 @@ defmodule Memex.Contexts do
|
||||
where: c.visibility == :public,
|
||||
where:
|
||||
fragment(
|
||||
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||
"search @@ websearch_to_tsquery('english', ?)",
|
||||
^trimmed_search
|
||||
),
|
||||
order_by: {
|
||||
:desc,
|
||||
fragment(
|
||||
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
||||
^trimmed_search
|
||||
)
|
||||
}
|
||||
@ -229,18 +228,4 @@ defmodule Memex.Contexts do
|
||||
def change_context(%Context{} = context, attrs \\ %{}, user) do
|
||||
context |> Context.update_changeset(attrs, user)
|
||||
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
|
||||
|
@ -7,7 +7,7 @@ defmodule Memex.Contexts.Context do
|
||||
import Ecto.Changeset
|
||||
import MemexWeb.Gettext
|
||||
alias Ecto.{Changeset, UUID}
|
||||
alias Memex.Accounts.User
|
||||
alias Memex.{Accounts.User, Repo}
|
||||
|
||||
@primary_key {:id, :binary_id, autogenerate: true}
|
||||
@foreign_key_type :binary_id
|
||||
@ -27,7 +27,7 @@ defmodule Memex.Contexts.Context do
|
||||
slug: slug(),
|
||||
content: String.t(),
|
||||
tags: [String.t()] | nil,
|
||||
tags_string: String.t(),
|
||||
tags_string: String.t() | nil,
|
||||
visibility: :public | :private | :unlisted,
|
||||
user: User.t() | Ecto.Association.NotLoaded.t(),
|
||||
user_id: User.id(),
|
||||
@ -49,6 +49,8 @@ defmodule Memex.Contexts.Context do
|
||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||
)
|
||||
|> validate_required([:slug, :content, :user_id, :visibility])
|
||||
|> unique_constraint(:slug)
|
||||
|> unsafe_validate_unique(:slug, Repo)
|
||||
end
|
||||
|
||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||
@ -60,18 +62,42 @@ defmodule Memex.Contexts.Context do
|
||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||
)
|
||||
|> validate_required([:slug, :content, :visibility])
|
||||
|> unique_constraint(:slug)
|
||||
|> unsafe_validate_unique(:slug, Repo)
|
||||
end
|
||||
|
||||
defp cast_tags_string(changeset, %{"tags_string" => tags_string})
|
||||
when tags_string |> is_binary() do
|
||||
tags =
|
||||
tags_string
|
||||
|> String.split(",", trim: true)
|
||||
|> Enum.map(fn str -> str |> String.trim() end)
|
||||
|> Enum.sort()
|
||||
|
||||
changeset |> change(tags: tags)
|
||||
defp cast_tags_string(changeset, attrs) do
|
||||
changeset
|
||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
||||
|> 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_string(changeset, _attrs), do: changeset
|
||||
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
|
||||
|> String.split(",", trim: true)
|
||||
|> Enum.map(fn str -> str |> String.trim() end)
|
||||
|> Enum.reject(fn str -> str |> is_nil() end)
|
||||
|> Enum.sort()
|
||||
end
|
||||
|
||||
defp process_tags(_other_tags_string), do: []
|
||||
|
||||
@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
|
||||
|
@ -4,7 +4,6 @@ defmodule Memex.Notes do
|
||||
"""
|
||||
|
||||
import Ecto.Query, warn: false
|
||||
alias Ecto.Changeset
|
||||
alias Memex.{Accounts.User, Notes.Note, Repo}
|
||||
|
||||
@doc """
|
||||
@ -35,13 +34,13 @@ defmodule Memex.Notes do
|
||||
where: n.user_id == ^user_id,
|
||||
where:
|
||||
fragment(
|
||||
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||
"search @@ websearch_to_tsquery('english', ?)",
|
||||
^trimmed_search
|
||||
),
|
||||
order_by: {
|
||||
:desc,
|
||||
fragment(
|
||||
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
||||
^trimmed_search
|
||||
)
|
||||
}
|
||||
@ -75,13 +74,13 @@ defmodule Memex.Notes do
|
||||
where: n.visibility == :public,
|
||||
where:
|
||||
fragment(
|
||||
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||
"search @@ websearch_to_tsquery('english', ?)",
|
||||
^trimmed_search
|
||||
),
|
||||
order_by: {
|
||||
:desc,
|
||||
fragment(
|
||||
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
||||
^trimmed_search
|
||||
)
|
||||
}
|
||||
@ -229,18 +228,4 @@ defmodule Memex.Notes do
|
||||
def change_note(%Note{} = note, attrs \\ %{}, user) do
|
||||
note |> Note.update_changeset(attrs, user)
|
||||
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
|
||||
|
@ -6,7 +6,7 @@ defmodule Memex.Notes.Note do
|
||||
import Ecto.Changeset
|
||||
import MemexWeb.Gettext
|
||||
alias Ecto.{Changeset, UUID}
|
||||
alias Memex.Accounts.User
|
||||
alias Memex.{Accounts.User, Repo}
|
||||
|
||||
@primary_key {:id, :binary_id, autogenerate: true}
|
||||
@foreign_key_type :binary_id
|
||||
@ -26,7 +26,7 @@ defmodule Memex.Notes.Note do
|
||||
slug: slug(),
|
||||
content: String.t(),
|
||||
tags: [String.t()] | nil,
|
||||
tags_string: String.t(),
|
||||
tags_string: String.t() | nil,
|
||||
visibility: :public | :private | :unlisted,
|
||||
user: User.t() | Ecto.Association.NotLoaded.t(),
|
||||
user_id: User.id(),
|
||||
@ -48,6 +48,8 @@ defmodule Memex.Notes.Note do
|
||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||
)
|
||||
|> validate_required([:slug, :content, :user_id, :visibility])
|
||||
|> unique_constraint(:slug)
|
||||
|> unsafe_validate_unique(:slug, Repo)
|
||||
end
|
||||
|
||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||
@ -59,18 +61,42 @@ defmodule Memex.Notes.Note do
|
||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||
)
|
||||
|> validate_required([:slug, :content, :visibility])
|
||||
|> unique_constraint(:slug)
|
||||
|> unsafe_validate_unique(:slug, Repo)
|
||||
end
|
||||
|
||||
defp cast_tags_string(changeset, %{"tags_string" => tags_string})
|
||||
when tags_string |> is_binary() do
|
||||
tags =
|
||||
tags_string
|
||||
|> String.split(",", trim: true)
|
||||
|> Enum.map(fn str -> str |> String.trim() end)
|
||||
|> Enum.sort()
|
||||
|
||||
changeset |> change(tags: tags)
|
||||
defp cast_tags_string(changeset, attrs) do
|
||||
changeset
|
||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
||||
|> 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_string(changeset, _attrs), do: changeset
|
||||
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
|
||||
|> String.split(",", trim: true)
|
||||
|> Enum.map(fn str -> str |> String.trim() end)
|
||||
|> Enum.reject(fn str -> str |> is_nil() end)
|
||||
|> Enum.sort()
|
||||
end
|
||||
|
||||
defp process_tags(_other_tags_string), do: []
|
||||
|
||||
@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
|
||||
|
@ -4,7 +4,6 @@ defmodule Memex.Pipelines do
|
||||
"""
|
||||
|
||||
import Ecto.Query, warn: false
|
||||
alias Ecto.Changeset
|
||||
alias Memex.{Accounts.User, Pipelines.Pipeline, Repo}
|
||||
|
||||
@doc """
|
||||
@ -35,13 +34,13 @@ defmodule Memex.Pipelines do
|
||||
where: p.user_id == ^user_id,
|
||||
where:
|
||||
fragment(
|
||||
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||
"search @@ websearch_to_tsquery('english', ?)",
|
||||
^trimmed_search
|
||||
),
|
||||
order_by: {
|
||||
:desc,
|
||||
fragment(
|
||||
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
||||
^trimmed_search
|
||||
)
|
||||
}
|
||||
@ -75,13 +74,13 @@ defmodule Memex.Pipelines do
|
||||
where: p.visibility == :public,
|
||||
where:
|
||||
fragment(
|
||||
"search @@ to_tsquery(websearch_to_tsquery(?)::text || ':*')",
|
||||
"search @@ websearch_to_tsquery('english', ?)",
|
||||
^trimmed_search
|
||||
),
|
||||
order_by: {
|
||||
:desc,
|
||||
fragment(
|
||||
"ts_rank_cd(search, to_tsquery(websearch_to_tsquery(?)::text || ':*'), 4)",
|
||||
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
|
||||
^trimmed_search
|
||||
)
|
||||
}
|
||||
@ -231,18 +230,4 @@ defmodule Memex.Pipelines do
|
||||
def change_pipeline(%Pipeline{} = pipeline, attrs \\ %{}, user) do
|
||||
pipeline |> Pipeline.update_changeset(attrs, user)
|
||||
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
|
||||
|
@ -6,7 +6,7 @@ defmodule Memex.Pipelines.Pipeline do
|
||||
import Ecto.Changeset
|
||||
import MemexWeb.Gettext
|
||||
alias Ecto.{Changeset, UUID}
|
||||
alias Memex.{Accounts.User, Pipelines.Steps.Step}
|
||||
alias Memex.{Accounts.User, Pipelines.Steps.Step, Repo}
|
||||
|
||||
@primary_key {:id, :binary_id, autogenerate: true}
|
||||
@foreign_key_type :binary_id
|
||||
@ -28,7 +28,7 @@ defmodule Memex.Pipelines.Pipeline do
|
||||
slug: slug(),
|
||||
description: String.t(),
|
||||
tags: [String.t()] | nil,
|
||||
tags_string: String.t(),
|
||||
tags_string: String.t() | nil,
|
||||
visibility: :public | :private | :unlisted,
|
||||
user: User.t() | Ecto.Association.NotLoaded.t(),
|
||||
user_id: User.id(),
|
||||
@ -50,6 +50,8 @@ defmodule Memex.Pipelines.Pipeline do
|
||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||
)
|
||||
|> validate_required([:slug, :user_id, :visibility])
|
||||
|> unique_constraint(:slug)
|
||||
|> unsafe_validate_unique(:slug, Repo)
|
||||
end
|
||||
|
||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||
@ -61,18 +63,42 @@ defmodule Memex.Pipelines.Pipeline do
|
||||
message: dgettext("errors", "invalid format: only numbers, letters and hyphen are accepted")
|
||||
)
|
||||
|> validate_required([:slug, :visibility])
|
||||
|> unique_constraint(:slug)
|
||||
|> unsafe_validate_unique(:slug, Repo)
|
||||
end
|
||||
|
||||
defp cast_tags_string(changeset, %{"tags_string" => tags_string})
|
||||
when tags_string |> is_binary() do
|
||||
tags =
|
||||
tags_string
|
||||
|> String.split(",", trim: true)
|
||||
|> Enum.map(fn str -> str |> String.trim() end)
|
||||
|> Enum.sort()
|
||||
|
||||
changeset |> change(tags: tags)
|
||||
defp cast_tags_string(changeset, attrs) do
|
||||
changeset
|
||||
|> put_change(:tags_string, changeset |> get_field(:tags) |> get_tags_string())
|
||||
|> 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_string(changeset, _attrs), do: changeset
|
||||
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
|
||||
|> String.split(",", trim: true)
|
||||
|> Enum.map(fn str -> str |> String.trim() end)
|
||||
|> Enum.reject(fn str -> str |> is_nil() end)
|
||||
|> Enum.sort()
|
||||
end
|
||||
|
||||
defp process_tags(_other_tags_string), do: []
|
||||
|
||||
@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
|
||||
|
@ -12,7 +12,7 @@ defmodule MemexWeb.Components.ContextContent do
|
||||
~H"""
|
||||
<div
|
||||
id={"show-context-content-#{@context.id}"}
|
||||
class="input input-primary h-128 min-h-128 inline-block"
|
||||
class="input input-primary h-128 min-h-128 inline-block overflow-x-hidden overflow-y-auto"
|
||||
phx-hook="MaintainAttrs"
|
||||
phx-update="ignore"
|
||||
readonly
|
||||
@ -39,6 +39,7 @@ defmodule MemexWeb.Components.ContextContent do
|
||||
"</p>#{link}<p class=\"inline\">"
|
||||
end
|
||||
)
|
||||
|> String.replace("\n", "<br>")
|
||||
|> HTML.raw()
|
||||
end
|
||||
end
|
||||
|
@ -4,7 +4,7 @@ defmodule MemexWeb.Components.ContextsTableComponent do
|
||||
"""
|
||||
use MemexWeb, :live_component
|
||||
alias Ecto.UUID
|
||||
alias Memex.{Accounts.User, Contexts, Contexts.Context}
|
||||
alias Memex.{Accounts.User, Contexts.Context}
|
||||
alias Phoenix.LiveView.{Rendered, Socket}
|
||||
|
||||
@impl true
|
||||
@ -45,7 +45,6 @@ defmodule MemexWeb.Components.ContextsTableComponent do
|
||||
|
||||
columns = [
|
||||
%{label: gettext("slug"), key: :slug},
|
||||
%{label: gettext("content"), key: :content},
|
||||
%{label: gettext("tags"), key: :tags},
|
||||
%{label: gettext("visibility"), key: :visibility}
|
||||
| columns
|
||||
@ -105,20 +104,18 @@ defmodule MemexWeb.Components.ContextsTableComponent do
|
||||
{slug, slug_block}
|
||||
end
|
||||
|
||||
defp get_value_for_key(:content, %{content: content}, _additional_data) do
|
||||
assigns = %{content: content}
|
||||
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
||||
assigns = %{tags: tags}
|
||||
|
||||
content_block = ~H"""
|
||||
<div class="truncate max-w-sm">
|
||||
<%= @content %>
|
||||
~H"""
|
||||
<div class="flex flex-wrap justify-center space-x-1">
|
||||
<%= for tag <- @tags do %>
|
||||
<.link patch={Routes.context_index_path(Endpoint, :search, tag)} class="link">
|
||||
<%= tag %>
|
||||
</.link>
|
||||
<% end %>
|
||||
</div>
|
||||
"""
|
||||
|
||||
{content, content_block}
|
||||
end
|
||||
|
||||
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
||||
tags |> Contexts.get_tags_string()
|
||||
end
|
||||
|
||||
defp get_value_for_key(:actions, context, %{actions: actions}) do
|
||||
|
45
lib/memex_web/components/note_content.ex
Normal file
45
lib/memex_web/components/note_content.ex
Normal file
@ -0,0 +1,45 @@
|
||||
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 overflow-x-hidden overflow-y-auto"
|
||||
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
|
||||
alias Ecto.UUID
|
||||
alias Memex.{Accounts.User, Notes, Notes.Note}
|
||||
alias Memex.{Accounts.User, Notes.Note}
|
||||
alias Phoenix.LiveView.{Rendered, Socket}
|
||||
|
||||
@impl true
|
||||
@ -45,7 +45,6 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
||||
|
||||
columns = [
|
||||
%{label: gettext("slug"), key: :slug},
|
||||
%{label: gettext("content"), key: :content},
|
||||
%{label: gettext("tags"), key: :tags},
|
||||
%{label: gettext("visibility"), key: :visibility}
|
||||
| columns
|
||||
@ -105,20 +104,18 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
||||
{slug, slug_block}
|
||||
end
|
||||
|
||||
defp get_value_for_key(:content, %{content: content}, _additional_data) do
|
||||
assigns = %{content: content}
|
||||
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
||||
assigns = %{tags: tags}
|
||||
|
||||
content_block = ~H"""
|
||||
<div class="truncate max-w-sm">
|
||||
<%= @content %>
|
||||
~H"""
|
||||
<div class="flex flex-wrap justify-center space-x-1">
|
||||
<%= for tag <- @tags do %>
|
||||
<.link patch={Routes.note_index_path(Endpoint, :search, tag)} class="link">
|
||||
<%= tag %>
|
||||
</.link>
|
||||
<% end %>
|
||||
</div>
|
||||
"""
|
||||
|
||||
{content, content_block}
|
||||
end
|
||||
|
||||
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
||||
tags |> Notes.get_tags_string()
|
||||
end
|
||||
|
||||
defp get_value_for_key(:actions, note, %{actions: actions}) do
|
||||
|
@ -4,7 +4,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
||||
"""
|
||||
use MemexWeb, :live_component
|
||||
alias Ecto.UUID
|
||||
alias Memex.{Accounts.User, Pipelines, Pipelines.Pipeline}
|
||||
alias Memex.{Accounts.User, Pipelines.Pipeline}
|
||||
alias Phoenix.LiveView.{Rendered, Socket}
|
||||
|
||||
@impl true
|
||||
@ -118,7 +118,17 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
||||
end
|
||||
|
||||
defp get_value_for_key(:tags, %{tags: tags}, _additional_data) do
|
||||
tags |> Pipelines.get_tags_string()
|
||||
assigns = %{tags: tags}
|
||||
|
||||
~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
|
||||
|
||||
defp get_value_for_key(:actions, pipeline, %{actions: actions}) do
|
||||
|
@ -12,7 +12,7 @@ defmodule MemexWeb.Components.StepContent do
|
||||
~H"""
|
||||
<div
|
||||
id={"show-step-content-#{@step.id}"}
|
||||
class="input input-primary h-32 min-h-32 inline-block"
|
||||
class="input input-primary h-32 min-h-32 inline-block overflow-x-hidden overflow-y-auto"
|
||||
phx-hook="MaintainAttrs"
|
||||
phx-update="ignore"
|
||||
readonly
|
||||
@ -39,6 +39,7 @@ defmodule MemexWeb.Components.StepContent do
|
||||
"</p>#{link}<p class=\"inline\">"
|
||||
end
|
||||
)
|
||||
|> String.replace("\n", "<br>")
|
||||
|> HTML.raw()
|
||||
end
|
||||
end
|
||||
|
@ -22,15 +22,15 @@ defmodule MemexWeb.Components.UserCard do
|
||||
<%= if @user.confirmed_at |> is_nil() do %>
|
||||
<%= gettext("email unconfirmed") %>
|
||||
<% else %>
|
||||
<%= gettext(
|
||||
"user was confirmed at %{relative_datetime}",
|
||||
relative_datetime: @user.confirmed_at |> display_datetime()
|
||||
) %>
|
||||
<p>
|
||||
<%= gettext("user confirmed on") %>
|
||||
<%= @user.confirmed_at |> display_datetime() %>
|
||||
</p>
|
||||
<% end %>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<%= gettext("User registered on") %>
|
||||
<%= gettext("user registered on") %>
|
||||
<%= @user.inserted_at |> display_datetime() %>
|
||||
</p>
|
||||
</h3>
|
||||
|
@ -6,7 +6,7 @@ defmodule MemexWeb.UserResetPasswordController do
|
||||
plug :get_user_by_reset_password_token when action in [:edit, :update]
|
||||
|
||||
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
|
||||
|
||||
def create(conn, %{"user" => %{"email" => email}}) do
|
||||
|
@ -20,7 +20,7 @@ defmodule MemexWeb.UserSessionController do
|
||||
|
||||
def delete(conn, _params) do
|
||||
conn
|
||||
|> put_flash(:info, dgettext("prompts", "Logged out successfully."))
|
||||
|> put_flash(:info, dgettext("prompts", "logged out successfully."))
|
||||
|> UserAuth.log_out_user()
|
||||
end
|
||||
end
|
||||
|
@ -27,9 +27,7 @@
|
||||
<%= text_input(f, :tags_string,
|
||||
id: "tags-input",
|
||||
class: "input input-primary",
|
||||
placeholder: gettext("tag1,tag2"),
|
||||
phx_update: "ignore",
|
||||
value: Contexts.get_tags_string(@changeset)
|
||||
placeholder: gettext("tag1,tag2")
|
||||
) %>
|
||||
<%= error_tag(f, :tags_string) %>
|
||||
|
||||
|
@ -3,7 +3,13 @@
|
||||
<%= @context.slug %>
|
||||
</h1>
|
||||
|
||||
<p><%= if @context.tags, do: @context.tags |> Enum.join(", ") %></p>
|
||||
<div class="flex flex-wrap space-x-1">
|
||||
<%= for tag <- @context.tags do %>
|
||||
<.link navigate={Routes.context_index_path(Endpoint, :search, tag)} class="link">
|
||||
<%= tag %>
|
||||
</.link>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<.context_content context={@context} />
|
||||
|
||||
|
@ -120,5 +120,26 @@
|
||||
) %>
|
||||
</p>
|
||||
</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>
|
||||
</div>
|
||||
|
@ -3,6 +3,8 @@ defmodule MemexWeb.HomeLive do
|
||||
Liveview for the main home page
|
||||
"""
|
||||
|
||||
@version Mix.Project.config()[:version]
|
||||
|
||||
use MemexWeb, :live_view
|
||||
alias Memex.Accounts
|
||||
alias MemexWeb.{Endpoint, FaqLive}
|
||||
@ -10,6 +12,6 @@ defmodule MemexWeb.HomeLive do
|
||||
@impl true
|
||||
def mount(_params, _session, socket) do
|
||||
admins = Accounts.list_users_by_role(:admin)
|
||||
{:ok, socket |> assign(page_title: gettext("home"), admins: admins)}
|
||||
{:ok, socket |> assign(page_title: gettext("home"), admins: admins, version: @version)}
|
||||
end
|
||||
end
|
||||
|
@ -120,12 +120,12 @@
|
||||
<li class="flex flex-row justify-center items-center space-x-2">
|
||||
<b><%= gettext("version:") %></b>
|
||||
<.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"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<p>0.1.0</p>
|
||||
<p><%= @version %></p>
|
||||
<i class="fas fa-md fa-info-circle"></i>
|
||||
</.link>
|
||||
</li>
|
||||
@ -140,7 +140,7 @@
|
||||
|
||||
<li class="flex flex-col justify-center space-x-2">
|
||||
<.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"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
@ -151,7 +151,7 @@
|
||||
</li>
|
||||
<li class="flex flex-col justify-center space-x-2">
|
||||
<.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"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
@ -162,7 +162,7 @@
|
||||
</li>
|
||||
<li class="flex flex-col justify-center space-x-2">
|
||||
<.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"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
|
@ -27,9 +27,7 @@
|
||||
<%= text_input(f, :tags_string,
|
||||
id: "tags-input",
|
||||
class: "input input-primary",
|
||||
placeholder: gettext("tag1,tag2"),
|
||||
phx_update: "ignore",
|
||||
value: Notes.get_tags_string(@changeset)
|
||||
placeholder: gettext("tag1,tag2")
|
||||
) %>
|
||||
<%= error_tag(f, :tags_string) %>
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
defmodule MemexWeb.NoteLive.Show do
|
||||
use MemexWeb, :live_view
|
||||
|
||||
import MemexWeb.Components.NoteContent
|
||||
alias Memex.{Accounts.User, Notes, Notes.Note}
|
||||
|
||||
@impl true
|
||||
|
@ -3,16 +3,15 @@
|
||||
<%= @note.slug %>
|
||||
</h1>
|
||||
|
||||
<p><%= if @note.tags, do: @note.tags |> Enum.join(", ") %></p>
|
||||
<div class="flex flex-wrap space-x-1">
|
||||
<%= for tag <- @note.tags do %>
|
||||
<.link navigate={Routes.note_index_path(Endpoint, :search, tag)} class="link">
|
||||
<%= tag %>
|
||||
</.link>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<.note_content note={@note} />
|
||||
|
||||
<p class="self-end">
|
||||
<%= gettext("Visibility: %{visibility}", visibility: @note.visibility) %>
|
||||
|
@ -27,9 +27,7 @@
|
||||
<%= text_input(f, :tags_string,
|
||||
id: "tags-input",
|
||||
class: "input input-primary",
|
||||
placeholder: gettext("tag1,tag2"),
|
||||
phx_update: "ignore",
|
||||
value: Pipelines.get_tags_string(@changeset)
|
||||
placeholder: gettext("tag1,tag2")
|
||||
) %>
|
||||
<%= error_tag(f, :tags_string) %>
|
||||
|
||||
|
@ -3,7 +3,13 @@
|
||||
<%= @pipeline.slug %>
|
||||
</h1>
|
||||
|
||||
<p><%= if @pipeline.tags, do: @pipeline.tags |> Enum.join(", ") %></p>
|
||||
<div class="flex flex-wrap space-x-1">
|
||||
<%= for tag <- @pipeline.tags do %>
|
||||
<.link navigate={Routes.pipeline_index_path(Endpoint, :search, tag)} class="link">
|
||||
<%= tag %>
|
||||
</.link>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<%= if @pipeline.description do %>
|
||||
<textarea
|
||||
|
@ -6,7 +6,7 @@
|
||||
<br />
|
||||
|
||||
<span style="margin-bottom: 1em; font-size: 1.25em;">
|
||||
<%= dgettext("emails", "Welcome to Memex") %>
|
||||
<%= dgettext("emails", "Welcome to memEx") %>
|
||||
</span>
|
||||
|
||||
<br />
|
||||
@ -19,5 +19,5 @@
|
||||
|
||||
<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>
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
<%= 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:") %>
|
||||
|
||||
|
@ -13,5 +13,5 @@
|
||||
|
||||
<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>
|
||||
|
@ -15,6 +15,6 @@
|
||||
|
||||
<%= dgettext(
|
||||
"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>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>
|
||||
<%= dgettext("errors", "Error") %>| Memex
|
||||
<%= dgettext("errors", "Error") %> | memEx
|
||||
</title>
|
||||
<link rel="stylesheet" href="/css/app.css" />
|
||||
<script defer type="text/javascript" src="/js/app.js">
|
||||
|
@ -33,7 +33,7 @@
|
||||
<%= select(
|
||||
f,
|
||||
:locale,
|
||||
[{gettext("English"), "en_US"}],
|
||||
[{gettext("english"), "en_US"}],
|
||||
class: "input input-primary col-span-2"
|
||||
) %>
|
||||
<%= error_tag(f, :locale) %>
|
||||
@ -48,7 +48,7 @@
|
||||
<%= dgettext("actions", "log in") %>
|
||||
</.link>
|
||||
<.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
|
||||
<%= dgettext("actions", "Forgot your password?") %>
|
||||
<%= dgettext("actions", "forgot your password?") %>
|
||||
</.link>
|
||||
</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">
|
||||
<h1 class="title text-primary-400 text-xl">
|
||||
<%= dgettext("actions", "Forgot your password?") %>
|
||||
<%= dgettext("actions", "forgot your password?") %>
|
||||
</h1>
|
||||
|
||||
<.form
|
||||
@ -12,7 +12,7 @@
|
||||
<%= label(f, :email, class: "title text-lg text-primary-400") %>
|
||||
<%= 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"
|
||||
) %>
|
||||
</.form>
|
||||
|
@ -41,7 +41,7 @@
|
||||
</.link>
|
||||
<% end %>
|
||||
<.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
|
||||
<%= dgettext("actions", "Forgot your password?") %>
|
||||
<%= dgettext("actions", "forgot your password?") %>
|
||||
</.link>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,17 +1,12 @@
|
||||
defmodule MemexWeb.LayoutView do
|
||||
use MemexWeb, :view
|
||||
import MemexWeb.Components.Topbar
|
||||
import MemexWeb.{Components.Topbar, Gettext}
|
||||
alias MemexWeb.HomeLive
|
||||
|
||||
# Phoenix LiveDashboard is available only in development by default,
|
||||
# so we instruct Elixir to not warn if the dashboard route is missing.
|
||||
@compile {:no_warn_undefined, {Routes, :live_dashboard_path, 2}}
|
||||
|
||||
def get_title(conn) do
|
||||
if conn.assigns |> Map.has_key?(:title) do
|
||||
"Memex | #{conn.assigns.title}"
|
||||
else
|
||||
"Memex"
|
||||
end
|
||||
end
|
||||
def get_title(%{assigns: %{title: title}}), do: gettext("memEx | %{title}", title: title)
|
||||
def get_title(_conn), do: gettext("memEx")
|
||||
end
|
||||
|
2
mix.exs
2
mix.exs
@ -4,7 +4,7 @@ defmodule Memex.MixProject do
|
||||
def project do
|
||||
[
|
||||
app: :memex,
|
||||
version: "0.1.0",
|
||||
version: "0.1.5",
|
||||
elixir: "~> 1.14",
|
||||
elixirc_paths: elixirc_paths(Mix.env()),
|
||||
compilers: Mix.compilers(),
|
||||
|
@ -15,13 +15,6 @@ msgstr ""
|
||||
msgid "Copy to clipboard"
|
||||
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:15
|
||||
#, elixir-autogen, elixir-format
|
||||
@ -39,11 +32,6 @@ msgstr ""
|
||||
msgid "Save"
|
||||
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:44
|
||||
#, elixir-autogen, elixir-format
|
||||
@ -68,12 +56,12 @@ msgid "create invite"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:49
|
||||
#: lib/memex_web/live/context_live/show.html.heex:34
|
||||
#: lib/memex_web/live/context_live/show.html.heex:40
|
||||
#: lib/memex_web/live/note_live/index.html.heex:49
|
||||
#: lib/memex_web/live/note_live/show.html.heex:38
|
||||
#: lib/memex_web/live/note_live/show.html.heex:37
|
||||
#: lib/memex_web/live/pipeline_live/index.html.heex:49
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:43
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:113
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:49
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:119
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
@ -84,12 +72,12 @@ msgid "delete user"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:38
|
||||
#: lib/memex_web/live/context_live/show.html.heex:23
|
||||
#: lib/memex_web/live/context_live/show.html.heex:29
|
||||
#: lib/memex_web/live/note_live/index.html.heex:38
|
||||
#: lib/memex_web/live/note_live/show.html.heex:27
|
||||
#: lib/memex_web/live/note_live/show.html.heex:26
|
||||
#: lib/memex_web/live/pipeline_live/index.html.heex:38
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:32
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:102
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:38
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:108
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "edit"
|
||||
msgstr ""
|
||||
@ -136,22 +124,34 @@ msgstr ""
|
||||
msgid "register"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:42
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:42
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:42
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:40
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:40
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:40
|
||||
#: lib/memex_web/live/step_live/form_component.html.heex:28
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "save"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/show.html.heex:16
|
||||
#: lib/memex_web/live/note_live/show.html.heex:23
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:25
|
||||
#: lib/memex_web/live/context_live/show.html.heex:22
|
||||
#: lib/memex_web/live/note_live/show.html.heex:22
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:31
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "back"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:129
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:135
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "add step"
|
||||
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 ""
|
||||
|
158
priv/gettext/de/LC_MESSAGES/actions.po
Normal file
158
priv/gettext/de/LC_MESSAGES/actions.po
Normal file
@ -0,0 +1,158 @@
|
||||
## "msgid"s in this file come from POT (.pot) files.
|
||||
##
|
||||
## Do not add, change, or remove "msgid"s manually here as
|
||||
## they're tied to the ones in the corresponding POT file
|
||||
## (with the same domain).
|
||||
##
|
||||
## Use "mix gettext.extract --merge" or "mix gettext.merge"
|
||||
## to merge POT files into PO files.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Language: de\n"
|
||||
"Plural-Forms: nplurals=2\n"
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:30
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Copy to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_confirmation/new.html.heex:3
|
||||
#: lib/memex_web/templates/user_confirmation/new.html.heex:15
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Resend confirmation instructions"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_reset_password/edit.html.heex:3
|
||||
#: lib/memex_web/templates/user_reset_password/edit.html.heex:33
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/form_component.html.heex:28
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:15
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:44
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "change email"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:113
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:131
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "change language"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:58
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:99
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "change password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:16
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "create invite"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:49
|
||||
#: lib/memex_web/live/context_live/show.html.heex:40
|
||||
#: lib/memex_web/live/note_live/index.html.heex:49
|
||||
#: lib/memex_web/live/note_live/show.html.heex:37
|
||||
#: 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:119
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:145
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "delete user"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:38
|
||||
#: lib/memex_web/live/context_live/show.html.heex:29
|
||||
#: lib/memex_web/live/note_live/index.html.heex:38
|
||||
#: lib/memex_web/live/note_live/show.html.heex:26
|
||||
#: 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:108
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "edit"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:12
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "invite someone new!"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/topbar.ex:125
|
||||
#: lib/memex_web/templates/user_confirmation/new.html.heex:29
|
||||
#: lib/memex_web/templates/user_registration/new.html.heex:48
|
||||
#: lib/memex_web/templates/user_reset_password/edit.html.heex:47
|
||||
#: lib/memex_web/templates/user_reset_password/new.html.heex:29
|
||||
#: lib/memex_web/templates/user_session/new.html.heex:3
|
||||
#: lib/memex_web/templates/user_session/new.html.heex:32
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "log in"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:58
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "new context"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/note_live/index.html.heex:58
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "new note"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/index.html.heex:58
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "new pipeline"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/topbar.ex:115
|
||||
#: lib/memex_web/templates/user_confirmation/new.html.heex:25
|
||||
#: lib/memex_web/templates/user_registration/new.html.heex:3
|
||||
#: lib/memex_web/templates/user_registration/new.html.heex:41
|
||||
#: lib/memex_web/templates/user_reset_password/edit.html.heex:43
|
||||
#: lib/memex_web/templates/user_reset_password/new.html.heex:25
|
||||
#: lib/memex_web/templates/user_session/new.html.heex:40
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "register"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:40
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:40
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:40
|
||||
#: lib/memex_web/live/step_live/form_component.html.heex:28
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "save"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/show.html.heex:22
|
||||
#: lib/memex_web/live/note_live/show.html.heex:22
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:31
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "back"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:135
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "add step"
|
||||
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 ""
|
667
priv/gettext/de/LC_MESSAGES/default.po
Normal file
667
priv/gettext/de/LC_MESSAGES/default.po
Normal file
@ -0,0 +1,667 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-11-27 04:49+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Translate Toolkit 3.7.4\n"
|
||||
|
||||
## This file is a PO Template file.
|
||||
##
|
||||
## "msgid"s here are often extracted from source code.
|
||||
## Add new translations manually only if they're dynamic
|
||||
## translations that can't be statically extracted.
|
||||
##
|
||||
## Run "mix gettext.extract" to bring this file up to
|
||||
## date. Leave "msgstr"s empty as changing them here has no
|
||||
## effect: edit them in PO (.po) files instead.
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:90
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Admins"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:8
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Confirm your account"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_session/new.html.heex:27
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Keep me logged in for 60 days"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_registration/new.html.heex:32
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/layout/live.html.heex:37
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/form_component.html.heex:20
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/layout/live.html.heex:50
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Reconnecting..."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:36
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Reset your password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_settings_controller.ex:10
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/invite_card.ex:19
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Uses Left:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/form_component.html.heex:24
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Uses left"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/show.html.heex:17
|
||||
#: lib/memex_web/live/note_live/show.html.heex:17
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:26
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Visibility: %{visibility}"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:76
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "accessible from any internet-capable device"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:90
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "admins:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:58
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "built with sharing and collaboration in mind"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:78
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "confirm new password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "content"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/topbar.ex:52
|
||||
#: lib/memex_web/live/context_live/index.ex:35
|
||||
#: lib/memex_web/live/context_live/index.ex:43
|
||||
#: lib/memex_web/live/context_live/index.html.heex:3
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "contexts"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:20
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "contexts:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:73
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "convenient:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:32
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:87
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "current password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:59
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "disable"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:14
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "document notes about individual items or concepts"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:32
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "document your processes, attaching contexts to each step"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:33
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "edit invite"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:28
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "email"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/user_card.ex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "email unconfirmed"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:63
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "enable"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_registration/new.html.heex:36
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:126
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "english"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:50
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "features"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:138
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "get involved!"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:159
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "help translate"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:85
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "instance information"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/invite_card.ex:24
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "invite disabled"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:115
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "invite only"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/topbar.ex:74
|
||||
#: lib/memex_web/live/invite_live/index.ex:41
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:3
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "invites"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_session_controller.ex:8
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "log in"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:55
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "multi-user:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:37
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "new invite"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:71
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "new password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:8
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "no invites 😔"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/note_live/index.html.heex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "no notes found"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/topbar.ex:43
|
||||
#: lib/memex_web/live/note_live/index.ex:35
|
||||
#: lib/memex_web/live/note_live/index.ex:43
|
||||
#: lib/memex_web/live/note_live/index.html.heex:3
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "notes"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:11
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "notes:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/topbar.ex:61
|
||||
#: lib/memex_web/live/pipeline_live/index.ex:35
|
||||
#: lib/memex_web/live/pipeline_live/index.ex:43
|
||||
#: lib/memex_web/live/pipeline_live/index.html.heex:3
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "pipelines"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:29
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "pipelines:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:67
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "privacy controls on a per-note, context or pipeline basis"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:64
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "privacy:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "provide context around a single topic and hotlink to your notes"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:114
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "public signups"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_registration_controller.ex:34
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "register"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:110
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "registration:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:170
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "report bugs or request features"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:41
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:41
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:41
|
||||
#: lib/memex_web/live/step_live/form_component.html.heex:29
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "saving..."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:37
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:37
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:37
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "select privacy"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:79
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "set unlimited"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:3
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "settings"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:30
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:30
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:30
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "tag1,tag2"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/contexts_table_component.ex:48
|
||||
#: lib/memex_web/components/notes_table_component.ex:48
|
||||
#: lib/memex_web/components/pipelines_table_component.ex:49
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "tags"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/invite_card.ex:20
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "unlimited"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:120
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "users"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:121
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "version:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:148
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "view the source code"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/contexts_table_component.ex:49
|
||||
#: lib/memex_web/components/notes_table_component.ex:49
|
||||
#: lib/memex_web/components/pipelines_table_component.ex:50
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "visibility"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/note_live/index.ex:29
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "new note"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:17
|
||||
#: lib/memex_web/live/note_live/index.html.heex:17
|
||||
#: lib/memex_web/live/pipeline_live/index.html.heex:17
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "search"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.ex:29
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "new context"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "no contexts found"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/pipelines_table_component.ex:48
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "description"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/index.ex:29
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "new pipeline"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/index.html.heex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "no pipelines found"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.ex:61
|
||||
#: lib/memex_web/live/note_live/form_component.ex:60
|
||||
#: lib/memex_web/live/pipeline_live/form_component.ex:65
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{slug} created"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.ex:57
|
||||
#: lib/memex_web/live/context_live/show.ex:41
|
||||
#: lib/memex_web/live/note_live/index.ex:57
|
||||
#: lib/memex_web/live/note_live/show.ex:41
|
||||
#: lib/memex_web/live/pipeline_live/index.ex:57
|
||||
#: lib/memex_web/live/pipeline_live/show.ex:77
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{slug} deleted"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.ex:44
|
||||
#: lib/memex_web/live/note_live/form_component.ex:43
|
||||
#: lib/memex_web/live/pipeline_live/form_component.ex:48
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{slug} saved"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.ex:23
|
||||
#: lib/memex_web/live/context_live/show.ex:48
|
||||
#: lib/memex_web/live/note_live/index.ex:23
|
||||
#: lib/memex_web/live/note_live/show.ex:48
|
||||
#: lib/memex_web/live/pipeline_live/index.ex:23
|
||||
#: lib/memex_web/live/pipeline_live/show.ex:125
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "edit %{slug}"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/contexts_table_component.ex:47
|
||||
#: lib/memex_web/components/notes_table_component.ex:47
|
||||
#: lib/memex_web/components/pipelines_table_component.ex:47
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:14
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:14
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:14
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "slug"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/show.ex:19
|
||||
#: lib/memex_web/live/note_live/show.ex:19
|
||||
#: lib/memex_web/live/pipeline_live/show.ex:20
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{slug} could not be found"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.ex:15
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "home"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "use [[note-slug]] to link to a note"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.ex:10
|
||||
#: lib/memex_web/live/faq_live.html.heex:3
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "faq"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/topbar.ex:23
|
||||
#: 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:9
|
||||
#: lib/memex_web/views/layout_view.ex:11
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "memEx"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:41
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "read more on how to use %{name}"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:11
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "what is this?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:68
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{position}. %{title}"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/step_live/form_component.ex:67
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{title} created"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.ex:96
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{title} deleted"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/step_live/form_component.ex:43
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{title} saved"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.ex:127
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "add step to %{slug}"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:62
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "no steps"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:57
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "steps:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/step_live/form_component.html.heex:14
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/step_live/form_component.html.heex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "use [[context-slug]] to link to a context"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:72
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:102
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could backlink to the spoon note as an example of how it fits nicely into your hand."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:118
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could backlink to the physical designs context, maybe with some notes about how it applies in this case."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:62
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "i really admired the idea of a zettelkasten, especially with org-mode backlinks, however I felt like my notes would immediately become too messy by just putting everything into a single hierarchy."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:67
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "i wanted to separate between a personal dictionary of concepts and then my thought processes that are built off of my experiences and life lessons. these are notes, and contexts, respectively."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:99
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "in my opinion, contexts should be like single-topic blog posts."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:83
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:113
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "in my opinion, pipelines should be pretty lightweight, and just backlink to contexts to provide most of the heavy lifting."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:31
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "memex"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:51
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "org-mode"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:20
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "some things that this memex is very loosely inspired by:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:88
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "spoons? probably not. a particular brand of spoons that you really like? why not :)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:14
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "this is a memex, used to document not just your notes, but also your perspectives and processes."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:96
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "what should my contexts be like?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:80
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "what should my notes be like?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:110
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "what should my pipelines be like?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:59
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "why split up into notes, contexts and pipelines?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/faq_live.html.heex:41
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "zettelkasten"
|
||||
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 ""
|
93
priv/gettext/de/LC_MESSAGES/emails.po
Normal file
93
priv/gettext/de/LC_MESSAGES/emails.po
Normal file
@ -0,0 +1,93 @@
|
||||
## "msgid"s in this file come from POT (.pot) files.
|
||||
##
|
||||
## Do not add, change, or remove "msgid"s manually here as
|
||||
## they're tied to the ones in the corresponding POT file
|
||||
## (with the same domain).
|
||||
##
|
||||
## Use "mix gettext.extract --merge" or "mix gettext.merge"
|
||||
## to merge POT files into PO files.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Language: de\n"
|
||||
"Plural-Forms: nplurals=2\n"
|
||||
|
||||
#: lib/memex/accounts/email.ex:30
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Confirm your Memex account"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/email/confirm_email.html.heex:3
|
||||
#: lib/memex_web/templates/email/confirm_email.txt.eex:2
|
||||
#: lib/memex_web/templates/email/reset_password.html.heex:3
|
||||
#: lib/memex_web/templates/email/reset_password.txt.eex:2
|
||||
#: lib/memex_web/templates/email/update_email.html.heex:3
|
||||
#: lib/memex_web/templates/email/update_email.txt.eex:2
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Hi %{email},"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/email/confirm_email.txt.eex:10
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "If you didn't create an account at %{url}, please ignore this."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/email/reset_password.txt.eex:8
|
||||
#: lib/memex_web/templates/email/update_email.txt.eex:8
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "If you didn't request this change from %{url}, please ignore this."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex/accounts/email.ex:37
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Reset your Memex password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex/accounts/email.ex:44
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Update your Memex email"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/email/update_email.html.heex:8
|
||||
#: lib/memex_web/templates/email/update_email.txt.eex:4
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "You can change your email by visiting the URL below:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/email/confirm_email.html.heex:14
|
||||
#: lib/memex_web/templates/email/confirm_email.txt.eex:6
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "You can confirm your account by visiting the URL below:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/email/reset_password.html.heex:8
|
||||
#: lib/memex_web/templates/email/reset_password.txt.eex:4
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "You can reset your password by visiting the URL below:"
|
||||
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 ""
|
140
priv/gettext/de/LC_MESSAGES/errors.po
Normal file
140
priv/gettext/de/LC_MESSAGES/errors.po
Normal file
@ -0,0 +1,140 @@
|
||||
## "msgid"s in this file come from POT (.pot) files.
|
||||
##
|
||||
## Do not add, change, or remove "msgid"s manually here as
|
||||
## they're tied to the ones in the corresponding POT file
|
||||
## (with the same domain).
|
||||
##
|
||||
## Use "mix gettext.extract --merge" or "mix gettext.merge"
|
||||
## to merge POT files into PO files.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Language: de\n"
|
||||
"Plural-Forms: nplurals=2\n"
|
||||
|
||||
#: lib/memex_web/controllers/user_settings_controller.ex:84
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Email change link is invalid or it has expired."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/error/error.html.heex:8
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Error"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_session_controller.ex:17
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Invalid email or password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_registration/new.html.heex:15
|
||||
#: lib/memex_web/templates/user_reset_password/edit.html.heex:15
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:64
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Oops, something went wrong! Please check the errors below."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:63
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Reset password link is invalid or it has expired."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_registration_controller.ex:24
|
||||
#: lib/memex_web/controllers/user_registration_controller.ex:55
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Sorry, public registration is disabled"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_registration_controller.ex:14
|
||||
#: lib/memex_web/controllers/user_registration_controller.ex:45
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Sorry, this invite was not found or expired"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_settings_controller.ex:99
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Unable to delete user"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:54
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "User confirmation link is invalid or it has expired."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:18
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "You are not authorized to view this page"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_auth.ex:177
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "You are not authorized to view this page."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_auth.ex:39
|
||||
#: lib/memex_web/controllers/user_auth.ex:161
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "You must confirm your account and log in to access this page."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex/accounts/user.ex:129
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "did not change"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex/accounts/user.ex:150
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "does not match password"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex/accounts/user.ex:187
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "is not valid"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex/accounts/user.ex:85
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "must have the @ sign and no spaces"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:21
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:119
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "oops, something went wrong! Please check the errors below"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex/contexts/context.ex:49
|
||||
#: lib/memex/contexts/context.ex:62
|
||||
#: lib/memex/notes/note.ex:48
|
||||
#: lib/memex/notes/note.ex:61
|
||||
#: lib/memex/pipelines/pipeline.ex:50
|
||||
#: lib/memex/pipelines/pipeline.ex:63
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/error/error.html.heex:28
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "go back home"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/views/error_view.ex:11
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "internal server error"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/views/error_view.ex:9
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "not found"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/views/error_view.ex:10
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "unauthorized"
|
||||
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 ""
|
159
priv/gettext/de/LC_MESSAGES/prompts.po
Normal file
159
priv/gettext/de/LC_MESSAGES/prompts.po
Normal file
@ -0,0 +1,159 @@
|
||||
## "msgid"s in this file come from POT (.pot) files.
|
||||
##
|
||||
## Do not add, change, or remove "msgid"s manually here as
|
||||
## they're tied to the ones in the corresponding POT file
|
||||
## (with the same domain).
|
||||
##
|
||||
## Use "mix gettext.extract --merge" or "mix gettext.merge"
|
||||
## to merge POT files into PO files.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Language: de\n"
|
||||
"Plural-Forms: nplurals=2\n"
|
||||
|
||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:38
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{email} confirmed successfully."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/form_component.ex:62
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{invite_name} created successfully"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:53
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{invite_name} deleted succesfully"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:114
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{invite_name} disabled succesfully"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:90
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{invite_name} enabled succesfully"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:68
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{invite_name} updated succesfully"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/form_component.ex:42
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{invite_name} updated successfully"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:139
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{user_email} deleted succesfully"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_settings_controller.ex:29
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "A link to confirm your email change has been sent to the new address."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.ex:127
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Copied to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_settings_controller.ex:77
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Email changed successfully."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_confirmation_controller.ex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:24
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "If your email is in our system, you will receive instructions to reset your password shortly."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_settings_controller.ex:65
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Language updated successfully."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_reset_password_controller.ex:46
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Password reset successfully."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_settings_controller.ex:49
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Password updated successfully."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_registration_controller.ex:73
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Please check your email to verify your account"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/form_component.html.heex:30
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Saving..."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_settings_controller.ex:95
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Your account has been deleted"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:133
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "are you sure you want to change your language?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:102
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:132
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "are you sure you want to delete %{email}? This action is permanent!"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:48
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "are you sure you want to delete the invite for %{invite_name}?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:143
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "are you sure you want to delete your account?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/topbar.ex:92
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "are you sure you want to log out?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/invite_live/index.html.heex:74
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "are you sure you want to make %{invite_name} unlimited?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:46
|
||||
#: lib/memex_web/live/context_live/show.html.heex:37
|
||||
#: lib/memex_web/live/note_live/index.html.heex:46
|
||||
#: lib/memex_web/live/note_live/show.html.heex:34
|
||||
#: 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:116
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "are you sure?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.html.heex:95
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "register to setup %{name}"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_session_controller.ex:23
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
msgid "logged out successfully."
|
||||
msgstr ""
|
@ -20,16 +20,6 @@ msgstr ""
|
||||
msgid "Confirm your account"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Keep me logged in for 60 days"
|
||||
@ -65,11 +55,6 @@ msgstr ""
|
||||
msgid "Settings"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Uses Left:"
|
||||
@ -80,9 +65,9 @@ msgstr ""
|
||||
msgid "Uses left"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/show.html.heex:11
|
||||
#: lib/memex_web/live/note_live/show.html.heex:18
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:20
|
||||
#: lib/memex_web/live/context_live/show.html.heex:17
|
||||
#: lib/memex_web/live/note_live/show.html.heex:17
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:26
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Visibility: %{visibility}"
|
||||
msgstr ""
|
||||
@ -107,8 +92,6 @@ msgstr ""
|
||||
msgid "confirm new password"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "content"
|
||||
@ -173,6 +156,7 @@ msgstr ""
|
||||
msgid "enable"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/templates/user_registration/new.html.heex:36
|
||||
#: lib/memex_web/templates/user_settings/edit.html.heex:126
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "english"
|
||||
@ -306,17 +290,17 @@ msgstr ""
|
||||
msgid "report bugs or request features"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:43
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:43
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:43
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:41
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:41
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:41
|
||||
#: lib/memex_web/live/step_live/form_component.html.heex:29
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "saving..."
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:39
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:39
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:39
|
||||
#: lib/memex_web/live/context_live/form_component.html.heex:37
|
||||
#: lib/memex_web/live/note_live/form_component.html.heex:37
|
||||
#: lib/memex_web/live/pipeline_live/form_component.html.heex:37
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "select privacy"
|
||||
msgstr ""
|
||||
@ -338,8 +322,8 @@ msgstr ""
|
||||
msgid "tag1,tag2"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/contexts_table_component.ex:49
|
||||
#: lib/memex_web/components/notes_table_component.ex:49
|
||||
#: lib/memex_web/components/contexts_table_component.ex:48
|
||||
#: lib/memex_web/components/notes_table_component.ex:48
|
||||
#: lib/memex_web/components/pipelines_table_component.ex:49
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "tags"
|
||||
@ -350,11 +334,6 @@ msgstr ""
|
||||
msgid "unlimited"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "users"
|
||||
@ -370,8 +349,8 @@ msgstr ""
|
||||
msgid "view the source code"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/components/contexts_table_component.ex:50
|
||||
#: lib/memex_web/components/notes_table_component.ex:50
|
||||
#: lib/memex_web/components/contexts_table_component.ex:49
|
||||
#: lib/memex_web/components/notes_table_component.ex:49
|
||||
#: lib/memex_web/components/pipelines_table_component.ex:50
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "visibility"
|
||||
@ -466,7 +445,7 @@ msgstr ""
|
||||
msgid "%{slug} could not be found"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/home_live.ex:13
|
||||
#: lib/memex_web/live/home_live.ex:15
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "home"
|
||||
msgstr ""
|
||||
@ -486,6 +465,7 @@ msgstr ""
|
||||
#: 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:9
|
||||
#: lib/memex_web/views/layout_view.ex:11
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "memEx"
|
||||
msgstr ""
|
||||
@ -500,7 +480,7 @@ msgstr ""
|
||||
msgid "what is this?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:62
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:68
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{position}. %{title}"
|
||||
msgstr ""
|
||||
@ -525,12 +505,12 @@ msgstr ""
|
||||
msgid "add step to %{slug}"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:56
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:62
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "no steps"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:51
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:57
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "steps:"
|
||||
msgstr ""
|
||||
@ -634,3 +614,43 @@ msgstr ""
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "zettelkasten"
|
||||
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,23 +30,12 @@ msgstr ""
|
||||
msgid "If you didn't create an account at %{url}, please ignore this."
|
||||
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/update_email.txt.eex:8
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "If you didn't request this change from %{url}, 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/accounts/email.ex:37
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Reset your Memex password"
|
||||
@ -57,12 +46,6 @@ msgstr ""
|
||||
msgid "Update your Memex email"
|
||||
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.txt.eex:4
|
||||
#, elixir-autogen, elixir-format
|
||||
@ -90,3 +73,20 @@ msgstr ""
|
||||
#, 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 ""
|
||||
|
||||
#: lib/memex/contexts/context.ex:49
|
||||
#: lib/memex/contexts/context.ex:60
|
||||
#: lib/memex/contexts/context.ex:62
|
||||
#: lib/memex/notes/note.ex:48
|
||||
#: lib/memex/notes/note.ex:59
|
||||
#: lib/memex/notes/note.ex:61
|
||||
#: lib/memex/pipelines/pipeline.ex:50
|
||||
#: lib/memex/pipelines/pipeline.ex:61
|
||||
#: lib/memex/pipelines/pipeline.ex:63
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
||||
msgstr ""
|
||||
@ -130,3 +130,10 @@ msgstr ""
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "unauthorized"
|
||||
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,11 +80,6 @@ msgstr ""
|
||||
msgid "Language updated successfully."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Password reset successfully."
|
||||
@ -142,12 +137,12 @@ msgid "are you sure you want to make %{invite_name} unlimited?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/live/context_live/index.html.heex:46
|
||||
#: lib/memex_web/live/context_live/show.html.heex:31
|
||||
#: lib/memex_web/live/context_live/show.html.heex:37
|
||||
#: lib/memex_web/live/note_live/index.html.heex:46
|
||||
#: lib/memex_web/live/note_live/show.html.heex:35
|
||||
#: lib/memex_web/live/note_live/show.html.heex:34
|
||||
#: lib/memex_web/live/pipeline_live/index.html.heex:46
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:40
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:110
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:46
|
||||
#: lib/memex_web/live/pipeline_live/show.html.heex:116
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "are you sure?"
|
||||
msgstr ""
|
||||
@ -156,3 +151,8 @@ msgstr ""
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "register to setup %{name}"
|
||||
msgstr ""
|
||||
|
||||
#: lib/memex_web/controllers/user_session_controller.ex:23
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "logged out successfully."
|
||||
msgstr ""
|
||||
|
56
priv/repo/migrations/20221128003712_fix_search.exs
Normal file
56
priv/repo/migrations/20221128003712_fix_search.exs
Normal file
@ -0,0 +1,56 @@
|
||||
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`.
|
||||
- `EMAIL_FROM`: Sets the sender email in sent emails. Defaults to
|
||||
`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,6 +17,36 @@ defmodule Memex.ContextsTest do
|
||||
assert Contexts.list_contexts(user) == [context_a, context_b, context_c]
|
||||
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
|
||||
public_context = context_fixture(%{visibility: :public}, user)
|
||||
context_fixture(%{visibility: :unlisted}, user)
|
||||
@ -24,6 +54,51 @@ defmodule Memex.ContextsTest do
|
||||
assert Contexts.list_public_contexts() == [public_context]
|
||||
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
|
||||
context = context_fixture(%{visibility: :public}, user)
|
||||
assert Contexts.get_context!(context.id, user) == context
|
||||
|
@ -14,9 +14,41 @@ defmodule Memex.NotesTest do
|
||||
note_a = note_fixture(%{slug: "a", visibility: :public}, user)
|
||||
note_b = note_fixture(%{slug: "b", visibility: :unlisted}, 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]
|
||||
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
|
||||
public_note = note_fixture(%{visibility: :public}, user)
|
||||
note_fixture(%{visibility: :unlisted}, user)
|
||||
@ -24,6 +56,51 @@ defmodule Memex.NotesTest do
|
||||
assert Notes.list_public_notes() == [public_note]
|
||||
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
|
||||
note = note_fixture(%{visibility: :public}, user)
|
||||
assert Notes.get_note!(note.id, user) == note
|
||||
|
@ -17,6 +17,36 @@ defmodule Memex.PipelinesTest do
|
||||
assert Pipelines.list_pipelines(user) == [pipeline_a, pipeline_b, pipeline_c]
|
||||
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
|
||||
public_pipeline = pipeline_fixture(%{visibility: :public}, user)
|
||||
pipeline_fixture(%{visibility: :unlisted}, user)
|
||||
@ -24,6 +54,51 @@ defmodule Memex.PipelinesTest do
|
||||
assert Pipelines.list_public_pipelines() == [public_pipeline]
|
||||
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
|
||||
pipeline = pipeline_fixture(%{visibility: :public}, user)
|
||||
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
|
||||
conn = get(conn, Routes.user_reset_password_path(conn, :new))
|
||||
response = html_response(conn, 200)
|
||||
assert response =~ dgettext("actions", "Forgot your password?")
|
||||
assert response =~ dgettext("actions", "forgot your password?")
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -88,14 +88,14 @@ defmodule MemexWeb.UserSessionControllerTest do
|
||||
conn = conn |> log_in_user(current_user) |> delete(Routes.user_session_path(conn, :delete))
|
||||
assert redirected_to(conn) == "/"
|
||||
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
|
||||
|
||||
test "succeeds even if the user is not logged in", %{conn: conn} do
|
||||
conn = delete(conn, Routes.user_session_path(conn, :delete))
|
||||
assert redirected_to(conn) == "/"
|
||||
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
|
||||
|
@ -18,7 +18,7 @@ defmodule MemexWeb.ContextLiveTest do
|
||||
}
|
||||
@invalid_attrs %{
|
||||
"content" => nil,
|
||||
"tags_string" => "",
|
||||
"tags_string" => " ",
|
||||
"slug" => nil,
|
||||
"visibility" => nil
|
||||
}
|
||||
@ -34,7 +34,15 @@ defmodule MemexWeb.ContextLiveTest do
|
||||
{:ok, _index_live, html} = live(conn, Routes.context_index_path(conn, :index))
|
||||
|
||||
assert html =~ "contexts"
|
||||
assert html =~ context.content
|
||||
assert html =~ context.slug
|
||||
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
|
||||
|
||||
test "saves new context", %{conn: conn} do
|
||||
@ -56,7 +64,7 @@ defmodule MemexWeb.ContextLiveTest do
|
||||
|> follow_redirect(conn, Routes.context_index_path(conn, :index))
|
||||
|
||||
assert html =~ "#{@create_attrs |> Map.get("slug")} created"
|
||||
assert html =~ "some content"
|
||||
assert html =~ "some-slug"
|
||||
end
|
||||
|
||||
test "updates context in listing", %{conn: conn, context: context} do
|
||||
@ -78,7 +86,7 @@ defmodule MemexWeb.ContextLiveTest do
|
||||
|> follow_redirect(conn, Routes.context_index_path(conn, :index))
|
||||
|
||||
assert html =~ "#{@update_attrs |> Map.get("slug")} saved"
|
||||
assert html =~ "some updated content"
|
||||
assert html =~ "some-updated-slug"
|
||||
end
|
||||
|
||||
test "deletes context in listing", %{conn: conn, context: context} do
|
||||
@ -96,7 +104,7 @@ defmodule MemexWeb.ContextLiveTest do
|
||||
{:ok, _show_live, html} = live(conn, Routes.context_show_path(conn, :show, context.slug))
|
||||
|
||||
assert html =~ "context"
|
||||
assert html =~ context.content
|
||||
assert html =~ context.slug
|
||||
end
|
||||
|
||||
test "updates context within modal", %{conn: conn, context: context} do
|
||||
@ -106,9 +114,13 @@ defmodule MemexWeb.ContextLiveTest do
|
||||
|
||||
assert_patch(show_live, Routes.context_show_path(conn, :edit, context.slug))
|
||||
|
||||
assert show_live
|
||||
|> form("#context-form", context: @invalid_attrs)
|
||||
|> render_change() =~ "can't be blank"
|
||||
html =
|
||||
show_live
|
||||
|> form("#context-form", context: @invalid_attrs)
|
||||
|> render_change()
|
||||
|
||||
assert html =~ "can't be blank"
|
||||
assert html =~ "tags must be comma-delimited"
|
||||
|
||||
{:ok, _, html} =
|
||||
show_live
|
||||
@ -117,7 +129,7 @@ defmodule MemexWeb.ContextLiveTest do
|
||||
|> follow_redirect(conn, Routes.context_show_path(conn, :show, context.slug))
|
||||
|
||||
assert html =~ "#{context.slug} saved"
|
||||
assert html =~ "some updated content"
|
||||
assert html =~ "tag2"
|
||||
end
|
||||
|
||||
test "deletes context", %{conn: conn, context: context} do
|
||||
@ -146,6 +158,14 @@ defmodule MemexWeb.ContextLiveTest do
|
||||
]
|
||||
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
|
||||
{:ok, show_live, html} = live(conn, Routes.context_show_path(conn, :show, context.slug))
|
||||
|
||||
|
@ -3,6 +3,7 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
|
||||
import Phoenix.LiveViewTest
|
||||
import Memex.NotesFixtures
|
||||
alias MemexWeb.Endpoint
|
||||
|
||||
@create_attrs %{
|
||||
"content" => "some content",
|
||||
@ -18,7 +19,7 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
}
|
||||
@invalid_attrs %{
|
||||
"content" => nil,
|
||||
"tags_string" => "",
|
||||
"tags_string" => " ",
|
||||
"slug" => nil,
|
||||
"visibility" => nil
|
||||
}
|
||||
@ -34,7 +35,15 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
{:ok, _index_live, html} = live(conn, Routes.note_index_path(conn, :index))
|
||||
|
||||
assert html =~ "notes"
|
||||
assert html =~ note.content
|
||||
assert html =~ note.slug
|
||||
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
|
||||
|
||||
test "saves new note", %{conn: conn} do
|
||||
@ -45,9 +54,13 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
|
||||
assert_patch(index_live, Routes.note_index_path(conn, :new))
|
||||
|
||||
assert index_live
|
||||
|> form("#note-form", note: @invalid_attrs)
|
||||
|> render_change() =~ "can't be blank"
|
||||
html =
|
||||
index_live
|
||||
|> form("#note-form", note: @invalid_attrs)
|
||||
|> render_change()
|
||||
|
||||
assert html =~ "can't be blank"
|
||||
assert html =~ "tags must be comma-delimited"
|
||||
|
||||
{:ok, _, html} =
|
||||
index_live
|
||||
@ -56,7 +69,7 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
|> follow_redirect(conn, Routes.note_index_path(conn, :index))
|
||||
|
||||
assert html =~ "#{@create_attrs |> Map.get("slug")} created"
|
||||
assert html =~ "some content"
|
||||
assert html =~ "some-slug"
|
||||
end
|
||||
|
||||
test "updates note in listing", %{conn: conn, note: note} do
|
||||
@ -78,7 +91,7 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
|> follow_redirect(conn, Routes.note_index_path(conn, :index))
|
||||
|
||||
assert html =~ "#{@update_attrs |> Map.get("slug")} saved"
|
||||
assert html =~ "some updated content"
|
||||
assert html =~ "some-updated-slug"
|
||||
end
|
||||
|
||||
test "deletes note in listing", %{conn: conn, note: note} do
|
||||
@ -96,7 +109,7 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
{:ok, _show_live, html} = live(conn, Routes.note_show_path(conn, :show, note.slug))
|
||||
|
||||
assert html =~ "note"
|
||||
assert html =~ note.content
|
||||
assert html =~ note.slug
|
||||
end
|
||||
|
||||
test "updates note within modal", %{conn: conn, note: note} do
|
||||
@ -117,7 +130,7 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
|> follow_redirect(conn, Routes.note_show_path(conn, :show, note.slug))
|
||||
|
||||
assert html =~ "#{note.slug} saved"
|
||||
assert html =~ "some updated content"
|
||||
assert html =~ "tag2"
|
||||
end
|
||||
|
||||
test "deletes note", %{conn: conn, note: note} do
|
||||
@ -132,4 +145,39 @@ defmodule MemexWeb.NoteLiveTest do
|
||||
refute has_element?(index_live, "#note-#{note.id}")
|
||||
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
|
||||
|
@ -17,7 +17,7 @@ defmodule MemexWeb.PipelineLiveTest do
|
||||
}
|
||||
@invalid_attrs %{
|
||||
"description" => nil,
|
||||
"tags_string" => "",
|
||||
"tags_string" => " ",
|
||||
"slug" => nil,
|
||||
"visibility" => nil
|
||||
}
|
||||
@ -48,6 +48,14 @@ defmodule MemexWeb.PipelineLiveTest do
|
||||
assert html =~ pipeline.description
|
||||
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
|
||||
{:ok, index_live, _html} = live(conn, Routes.pipeline_index_path(conn, :index))
|
||||
|
||||
@ -120,9 +128,13 @@ defmodule MemexWeb.PipelineLiveTest do
|
||||
|
||||
assert_patch(show_live, Routes.pipeline_show_path(conn, :edit, pipeline.slug))
|
||||
|
||||
assert show_live
|
||||
|> form("#pipeline-form", pipeline: @invalid_attrs)
|
||||
|> render_change() =~ "can't be blank"
|
||||
html =
|
||||
show_live
|
||||
|> form("#pipeline-form", pipeline: @invalid_attrs)
|
||||
|> render_change()
|
||||
|
||||
assert html =~ "can't be blank"
|
||||
assert html =~ "tags must be comma-delimited"
|
||||
|
||||
{:ok, _, html} =
|
||||
show_live
|
||||
@ -175,6 +187,14 @@ defmodule MemexWeb.PipelineLiveTest do
|
||||
]
|
||||
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
|
||||
{:ok, show_live, _html} = live(conn, Routes.pipeline_show_path(conn, :show, pipeline.slug))
|
||||
|
||||
|
@ -16,12 +16,12 @@ defmodule Memex.ContextsFixtures do
|
||||
attrs
|
||||
|> Enum.into(%{
|
||||
content: "some content",
|
||||
tag: [],
|
||||
tags: ["example-tag"],
|
||||
slug: random_slug(),
|
||||
visibility: :private
|
||||
})
|
||||
|> Contexts.create_context(user)
|
||||
|
||||
context
|
||||
%{context | tags_string: nil}
|
||||
end
|
||||
end
|
||||
|
@ -16,12 +16,12 @@ defmodule Memex.NotesFixtures do
|
||||
attrs
|
||||
|> Enum.into(%{
|
||||
content: "some content",
|
||||
tag: [],
|
||||
tags: ["example-tag"],
|
||||
slug: random_slug(),
|
||||
visibility: :private
|
||||
})
|
||||
|> Notes.create_note(user)
|
||||
|
||||
note
|
||||
%{note | tags_string: nil}
|
||||
end
|
||||
end
|
||||
|
@ -16,12 +16,12 @@ defmodule Memex.PipelinesFixtures do
|
||||
attrs
|
||||
|> Enum.into(%{
|
||||
description: "some description",
|
||||
tag: [],
|
||||
tags: ["example-tag"],
|
||||
slug: random_slug(),
|
||||
visibility: :private
|
||||
})
|
||||
|> Pipelines.create_pipeline(user)
|
||||
|
||||
pipeline
|
||||
%{pipeline | tags_string: nil}
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user