This commit is contained in:
parent
4cca4ee3b7
commit
32094221c2
@ -17,7 +17,7 @@ steps:
|
|||||||
- .mix
|
- .mix
|
||||||
|
|
||||||
- name: test
|
- name: test
|
||||||
image: elixir:1.18.1-alpine
|
image: elixir:1.18.3-alpine
|
||||||
environment:
|
environment:
|
||||||
TEST_DATABASE_URL: ecto://postgres:postgres@database/memex_test
|
TEST_DATABASE_URL: ecto://postgres:postgres@database/memex_test
|
||||||
HOST: testing.example.tld
|
HOST: testing.example.tld
|
||||||
@ -31,8 +31,7 @@ steps:
|
|||||||
- mix deps.get
|
- mix deps.get
|
||||||
- npm set cache .npm
|
- npm set cache .npm
|
||||||
- npm --prefix ./assets ci --no-audit --prefer-offline
|
- npm --prefix ./assets ci --no-audit --prefer-offline
|
||||||
- npm run --prefix ./assets deploy
|
- mix do phx.digest, gettext.extract, assets.deploy
|
||||||
- mix do phx.digest, gettext.extract
|
|
||||||
- mix test.all
|
- mix test.all
|
||||||
|
|
||||||
- name: build and publish stable
|
- name: build and publish stable
|
||||||
|
9
.gitignore
vendored
9
.gitignore
vendored
@ -28,10 +28,11 @@ npm-debug.log
|
|||||||
# The directory NPM downloads your dependencies sources to.
|
# The directory NPM downloads your dependencies sources to.
|
||||||
/assets/node_modules/
|
/assets/node_modules/
|
||||||
|
|
||||||
# Since we are building assets from assets/,
|
# Ignore assets that are produced by build tools.
|
||||||
# we ignore priv/static. You may want to comment
|
/priv/static/assets/
|
||||||
# this depending on your deployment strategy.
|
|
||||||
/priv/static/
|
# Ignore digested assets cache.
|
||||||
|
/priv/static/cache_manifest.json
|
||||||
|
|
||||||
.elixir_ls/
|
.elixir_ls/
|
||||||
|
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
elixir 1.18.1-otp-27
|
elixir 1.18.3-otp-27
|
||||||
erlang 27.2.1
|
erlang 27.3.1
|
||||||
nodejs 23.7.0
|
nodejs 23.10.0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM elixir:1.18.1-alpine AS build
|
FROM elixir:1.18.3-otp-27-alpine AS build
|
||||||
|
|
||||||
# install build dependencies
|
# install build dependencies
|
||||||
RUN apk add --no-cache build-base npm git python3
|
RUN apk add --no-cache build-base npm git python3
|
||||||
@ -25,13 +25,12 @@ RUN npm --prefix ./assets ci --progress=false --no-audit --loglevel=error
|
|||||||
COPY lib lib
|
COPY lib lib
|
||||||
COPY priv priv
|
COPY priv priv
|
||||||
COPY assets assets
|
COPY assets assets
|
||||||
RUN npm run --prefix ./assets deploy
|
|
||||||
RUN mix do phx.digest, gettext.extract
|
RUN mix do phx.digest, gettext.extract
|
||||||
|
|
||||||
# compile and build release
|
# compile and build release
|
||||||
# uncomment COPY if rel/ exists
|
# uncomment COPY if rel/ exists
|
||||||
# COPY rel rel
|
# COPY rel rel
|
||||||
RUN mix do compile, release
|
RUN mix do assets.deploy, compile, release
|
||||||
|
|
||||||
# prepare release image
|
# prepare release image
|
||||||
FROM alpine:latest AS app
|
FROM alpine:latest AS app
|
||||||
@ -43,6 +42,8 @@ WORKDIR /app
|
|||||||
|
|
||||||
RUN chown nobody:nobody /app
|
RUN chown nobody:nobody /app
|
||||||
|
|
||||||
|
ENV MIX_ENV=prod
|
||||||
|
|
||||||
USER nobody:nobody
|
USER nobody:nobody
|
||||||
|
|
||||||
COPY --from=build --chown=nobody:nobody /app/_build/prod/rel/memex ./
|
COPY --from=build --chown=nobody:nobody /app/_build/prod/rel/memex ./
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"presets": [
|
|
||||||
"@babel/preset-env"
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
@layer components {
|
|
||||||
.input {
|
|
||||||
@apply rounded-lg px-4 py-2 border focus:outline-none;
|
|
||||||
@apply shadow-sm focus:shadow-lg;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-primary {
|
|
||||||
@apply bg-primary-900;
|
|
||||||
@apply border-primary-900 hover:border-primary-800 active:border-primary-700;
|
|
||||||
@apply text-primary-400 placeholder-primary-600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkbox {
|
|
||||||
@apply bg-primary-900;
|
|
||||||
-ms-transform: scale(1.5);
|
|
||||||
-moz-transform: scale(1.5);
|
|
||||||
-webkit-transform: scale(1.5);
|
|
||||||
-o-transform: scale(1.5);
|
|
||||||
transform: scale(1.5);
|
|
||||||
padding: 10px;
|
|
||||||
margin: 1em auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
@apply leading-5 tracking-wide;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn {
|
|
||||||
@apply focus:outline-none px-4 py-2 rounded-lg;
|
|
||||||
@apply shadow-sm active:shadow-lg;
|
|
||||||
@apply border;
|
|
||||||
@apply transition-all duration-300 ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-primary {
|
|
||||||
@apply bg-primary-900 active:bg-primary-800;
|
|
||||||
@apply border-primary-900 hover:border-primary-800 active:border-primary-700;
|
|
||||||
@apply text-primary-400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-secondary {
|
|
||||||
@apply bg-primary-800 active:bg-primary-700;
|
|
||||||
@apply border-primary-800 hover:border-primary-700 active:border-primary-600;
|
|
||||||
@apply text-primary-400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-alert {
|
|
||||||
@apply bg-red-800 active:bg-red-900;
|
|
||||||
@apply border-red-800 active:border-red-900;
|
|
||||||
@apply text-primary-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hr {
|
|
||||||
@apply mx-auto border border-primary-600 w-full max-w-3xl;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link {
|
|
||||||
@apply hover:underline;
|
|
||||||
@apply transition-colors duration-500 ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert {
|
|
||||||
@apply bg-primary-900;
|
|
||||||
@apply text-primary-400;
|
|
||||||
padding: 15px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert-info {
|
|
||||||
@apply text-primary-400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert-warning {
|
|
||||||
color: #8a6d3b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert-danger {
|
|
||||||
color: #a94442;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert p {
|
|
||||||
@apply mb-0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert:empty {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
}
|
|
226
assets/css/app.css
Normal file
226
assets/css/app.css
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
@import "tailwindcss" source("../..");
|
||||||
|
|
||||||
|
@theme {
|
||||||
|
--color-primary-50: oklch(0.985 0 0);
|
||||||
|
--color-primary-100: oklch(0.967 0.001 286.375);
|
||||||
|
--color-primary-200: oklch(0.92 0.004 286.32);
|
||||||
|
--color-primary-300: oklch(0.871 0.006 286.286);
|
||||||
|
--color-primary-400: oklch(0.705 0.015 286.067);
|
||||||
|
--color-primary-500: oklch(0.552 0.016 285.938);
|
||||||
|
--color-primary-600: oklch(0.442 0.017 285.786);
|
||||||
|
--color-primary-700: oklch(0.37 0.013 285.805);
|
||||||
|
--color-primary-800: oklch(0.274 0.006 286.033);
|
||||||
|
--color-primary-900: oklch(0.21 0.006 285.885);
|
||||||
|
--color-primary-950: oklch(0.141 0.005 285.823);
|
||||||
|
--font-display: "Nunito Sans", sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
@import "@fortawesome/fontawesome-free/css/fontawesome" source("../..");
|
||||||
|
@import "@fortawesome/fontawesome-free/css/regular" source("../..");
|
||||||
|
@import "@fortawesome/fontawesome-free/css/solid" source("../..");
|
||||||
|
@import "@fortawesome/fontawesome-free/css/brands" source("../..");
|
||||||
|
|
||||||
|
/* fix firefox scrollbars */
|
||||||
|
* {
|
||||||
|
scrollbar-width: auto;
|
||||||
|
scrollbar-color: rgba(161, 161, 170, var(--tw-bg-opacity)) white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fa-fade {
|
||||||
|
animation: pulse 1s ease-in-out 0s infinite alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
0% { scale: 0.95; opacity: 0.5; }
|
||||||
|
100% { scale: 1.0; opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disconnect toast */
|
||||||
|
.phx-connected > #disconnect {
|
||||||
|
opacity: 0 !important;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phx-error > #disconnect {
|
||||||
|
opacity: 0.95 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.invalid-feedback {
|
||||||
|
color: #f36c69;
|
||||||
|
display: block;
|
||||||
|
margin: -1rem 0 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* LiveView specific classes for your customization */
|
||||||
|
.phx-no-feedback.invalid-feedback,
|
||||||
|
.phx-no-feedback .invalid-feedback {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phx-click-loading {
|
||||||
|
opacity: 0.5;
|
||||||
|
transition: opacity 1s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phx-loading{
|
||||||
|
cursor: wait;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phx-modal {
|
||||||
|
opacity: 1!important;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 1;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
background-color: rgba(0,0,0,0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.phx-modal-content {
|
||||||
|
background-color: #fefefe;
|
||||||
|
margin: 15vh auto;
|
||||||
|
padding: 20px;
|
||||||
|
border: 1px solid #888;
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phx-modal-close {
|
||||||
|
color: #aaa;
|
||||||
|
float: right;
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phx-modal-close:hover,
|
||||||
|
.phx-modal-close:focus {
|
||||||
|
color: black;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-in-scale {
|
||||||
|
animation: 0.2s ease-in 0s normal forwards 1 fade-in-scale-keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-out-scale {
|
||||||
|
animation: 0.2s ease-out 0s normal forwards 1 fade-out-scale-keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-in {
|
||||||
|
animation: 0.2s ease-out 0s normal forwards 1 fade-in-keys;
|
||||||
|
}
|
||||||
|
.fade-out {
|
||||||
|
animation: 0.2s ease-out 0s normal forwards 1 fade-out-keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade-in-scale-keys{
|
||||||
|
0% { scale: 0.95; opacity: 0; }
|
||||||
|
100% { scale: 1.0; opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade-out-scale-keys{
|
||||||
|
0% { scale: 1.0; opacity: 1; }
|
||||||
|
100% { scale: 0.95; opacity: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade-in-keys{
|
||||||
|
0% { opacity: 0; }
|
||||||
|
100% { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade-out-keys{
|
||||||
|
0% { opacity: 1; }
|
||||||
|
100% { opacity: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* components */
|
||||||
|
.input {
|
||||||
|
@apply px-4 py-2 rounded-lg border focus:outline-hidden;
|
||||||
|
@apply shadow-sm focus:shadow-lg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-primary {
|
||||||
|
@apply bg-primary-900;
|
||||||
|
@apply border-primary-900 hover:border-primary-800 active:border-primary-700;
|
||||||
|
@apply text-primary-400 placeholder-primary-600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox {
|
||||||
|
@apply bg-primary-900;
|
||||||
|
-ms-transform: scale(1.5);
|
||||||
|
-moz-transform: scale(1.5);
|
||||||
|
-webkit-transform: scale(1.5);
|
||||||
|
-o-transform: scale(1.5);
|
||||||
|
transform: scale(1.5);
|
||||||
|
padding: 10px;
|
||||||
|
margin: 1em auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
@apply tracking-wide leading-5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
@apply px-4 py-2 rounded-lg focus:outline-hidden;
|
||||||
|
@apply shadow-sm active:shadow-lg;
|
||||||
|
@apply border;
|
||||||
|
@apply transition-all duration-300 ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary {
|
||||||
|
@apply bg-primary-900 active:bg-primary-800;
|
||||||
|
@apply border-primary-900 hover:border-primary-800 active:border-primary-700;
|
||||||
|
@apply text-primary-400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-secondary {
|
||||||
|
@apply bg-primary-800 active:bg-primary-700;
|
||||||
|
@apply border-primary-800 hover:border-primary-700 active:border-primary-600;
|
||||||
|
@apply text-primary-400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-alert {
|
||||||
|
@apply bg-rose-800 active:bg-rose-900;
|
||||||
|
@apply border-rose-800 active:border-rose-900;
|
||||||
|
@apply text-primary-300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hr {
|
||||||
|
@apply mx-auto w-full max-w-3xl border border-primary-600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link {
|
||||||
|
@apply hover:underline;
|
||||||
|
@apply transition-colors duration-500 ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
@apply bg-primary-900;
|
||||||
|
@apply text-primary-400;
|
||||||
|
padding: 15px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-info {
|
||||||
|
@apply text-primary-400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-warning {
|
||||||
|
color: #8a6d3b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-danger {
|
||||||
|
color: #a94442;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert p {
|
||||||
|
@apply mb-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert:empty {
|
||||||
|
@apply hidden;
|
||||||
|
}
|
@ -1,125 +0,0 @@
|
|||||||
@use "tailwindcss/base";
|
|
||||||
@use "tailwindcss/components";
|
|
||||||
@use "tailwindcss/utilities";
|
|
||||||
@use "components" as memex-components;
|
|
||||||
|
|
||||||
$fa-font-path: "@fortawesome/fontawesome-free/webfonts";
|
|
||||||
@import "@fortawesome/fontawesome-free/scss/fontawesome";
|
|
||||||
@import "@fortawesome/fontawesome-free/scss/regular";
|
|
||||||
@import "@fortawesome/fontawesome-free/scss/solid";
|
|
||||||
@import "@fortawesome/fontawesome-free/scss/brands";
|
|
||||||
|
|
||||||
/* fix firefox scrollbars */
|
|
||||||
* {
|
|
||||||
scrollbar-width: auto;
|
|
||||||
scrollbar-color: rgba(161, 161, 170, var(--tw-bg-opacity)) white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fa-fade {
|
|
||||||
animation: pulse 1s ease-in-out 0s infinite alternate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes pulse {
|
|
||||||
0% { scale: 0.95; opacity: 0.5; }
|
|
||||||
100% { scale: 1.0; opacity: 1; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// disconnect toast
|
|
||||||
.phx-connected > #disconnect {
|
|
||||||
opacity: 0 !important;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phx-error > #disconnect {
|
|
||||||
opacity: 0.95 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.invalid-feedback {
|
|
||||||
color: #f36c69;
|
|
||||||
display: block;
|
|
||||||
margin: -1rem 0 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* LiveView specific classes for your customization */
|
|
||||||
.phx-no-feedback.invalid-feedback,
|
|
||||||
.phx-no-feedback .invalid-feedback {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phx-click-loading {
|
|
||||||
opacity: 0.5;
|
|
||||||
transition: opacity 1s ease-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phx-loading{
|
|
||||||
cursor: wait;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phx-modal {
|
|
||||||
opacity: 1!important;
|
|
||||||
position: fixed;
|
|
||||||
z-index: 1;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
overflow: auto;
|
|
||||||
background-color: rgba(0,0,0,0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
.phx-modal-content {
|
|
||||||
background-color: #fefefe;
|
|
||||||
margin: 15vh auto;
|
|
||||||
padding: 20px;
|
|
||||||
border: 1px solid #888;
|
|
||||||
width: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phx-modal-close {
|
|
||||||
color: #aaa;
|
|
||||||
float: right;
|
|
||||||
font-size: 28px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phx-modal-close:hover,
|
|
||||||
.phx-modal-close:focus {
|
|
||||||
color: black;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-in-scale {
|
|
||||||
animation: 0.2s ease-in 0s normal forwards 1 fade-in-scale-keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-out-scale {
|
|
||||||
animation: 0.2s ease-out 0s normal forwards 1 fade-out-scale-keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-in {
|
|
||||||
animation: 0.2s ease-out 0s normal forwards 1 fade-in-keys;
|
|
||||||
}
|
|
||||||
.fade-out {
|
|
||||||
animation: 0.2s ease-out 0s normal forwards 1 fade-out-keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes fade-in-scale-keys{
|
|
||||||
0% { scale: 0.95; opacity: 0; }
|
|
||||||
100% { scale: 1.0; opacity: 1; }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes fade-out-scale-keys{
|
|
||||||
0% { scale: 1.0; opacity: 1; }
|
|
||||||
100% { scale: 0.95; opacity: 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes fade-in-keys{
|
|
||||||
0% { opacity: 0; }
|
|
||||||
100% { opacity: 1; }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes fade-out-keys{
|
|
||||||
0% { opacity: 1; }
|
|
||||||
100% { opacity: 0; }
|
|
||||||
}
|
|
@ -1,6 +1,3 @@
|
|||||||
// We import the CSS which is extracted to its own file by esbuild.
|
|
||||||
// Remove this line if you add a your own CSS build pipeline (e.g postcss).
|
|
||||||
import '../css/app.scss'
|
|
||||||
import '@fontsource/nunito-sans'
|
import '@fontsource/nunito-sans'
|
||||||
|
|
||||||
// If you want to use Phoenix channels, run `mix help phx.gen.channel`
|
// If you want to use Phoenix channels, run `mix help phx.gen.channel`
|
||||||
|
20019
assets/package-lock.json
generated
20019
assets/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,46 +1,18 @@
|
|||||||
{
|
{
|
||||||
"repository": {},
|
|
||||||
"description": " ",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "v23.7.0"
|
"node": "v23.10.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"deploy": "NODE_ENV=production webpack --mode production",
|
|
||||||
"watch": "webpack --mode development --watch --watch-options-stdin",
|
|
||||||
"format": "standard --fix",
|
"format": "standard --fix",
|
||||||
"test": "standard"
|
"test": "standard"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource/nunito-sans": "^5.1.1",
|
"@fontsource/nunito-sans": "^5.2.5",
|
||||||
"@fortawesome/fontawesome-free": "^6.7.2",
|
"@fortawesome/fontawesome-free": "^6.7.2",
|
||||||
"phoenix": "file:../deps/phoenix",
|
|
||||||
"phoenix_html": "file:../deps/phoenix_html",
|
|
||||||
"phoenix_live_view": "file:../deps/phoenix_live_view",
|
|
||||||
"topbar": "^3.0.0"
|
"topbar": "^3.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.26.9",
|
"npm-check-updates": "^17.1.16",
|
||||||
"@babel/preset-env": "^7.26.9",
|
"standard": "^17.1.2"
|
||||||
"autoprefixer": "^10.4.20",
|
|
||||||
"babel-loader": "^9.2.1",
|
|
||||||
"copy-webpack-plugin": "^12.0.2",
|
|
||||||
"css-loader": "^7.1.2",
|
|
||||||
"css-minimizer-webpack-plugin": "^7.0.0",
|
|
||||||
"file-loader": "^6.2.0",
|
|
||||||
"mini-css-extract-plugin": "^2.9.2",
|
|
||||||
"npm-check-updates": "^17.1.14",
|
|
||||||
"postcss": "^8.5.2",
|
|
||||||
"postcss-import": "^16.1.0",
|
|
||||||
"postcss-loader": "^8.1.1",
|
|
||||||
"postcss-preset-env": "^10.1.4",
|
|
||||||
"sass": "^1.85.0",
|
|
||||||
"sass-loader": "^16.0.5",
|
|
||||||
"standard": "^17.1.2",
|
|
||||||
"tailwindcss": "^3.4.17",
|
|
||||||
"terser-webpack-plugin": "^5.3.11",
|
|
||||||
"webpack": "^5.98.0",
|
|
||||||
"webpack-cli": "^6.0.1",
|
|
||||||
"webpack-dev-server": "^5.2.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
plugins: {
|
|
||||||
'postcss-import': {},
|
|
||||||
tailwindcss: {},
|
|
||||||
autoprefixer: {}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 14 KiB |
@ -1,46 +0,0 @@
|
|||||||
const colors = require('tailwindcss/colors')
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
content: [
|
|
||||||
'../lib/**/*.{ex,heex,leex,eex}',
|
|
||||||
'./js/**/*.js'
|
|
||||||
],
|
|
||||||
theme: {
|
|
||||||
colors: {
|
|
||||||
transparent: 'transparent',
|
|
||||||
current: 'currentColor',
|
|
||||||
primary: colors.zinc,
|
|
||||||
black: colors.black,
|
|
||||||
white: colors.white,
|
|
||||||
gray: colors.neutral,
|
|
||||||
indigo: colors.indigo,
|
|
||||||
red: colors.rose,
|
|
||||||
yellow: colors.amber
|
|
||||||
},
|
|
||||||
fontFamily: {
|
|
||||||
sans: ['Nunito Sans', 'ui-sans-serif', 'system-ui', '-apple-system', 'BlinkMacSystemFont']
|
|
||||||
},
|
|
||||||
extend: {
|
|
||||||
spacing: {
|
|
||||||
128: '32rem',
|
|
||||||
192: '48rem',
|
|
||||||
256: '64rem'
|
|
||||||
},
|
|
||||||
minWidth: {
|
|
||||||
4: '1rem',
|
|
||||||
8: '2rem',
|
|
||||||
12: '3rem',
|
|
||||||
16: '4rem',
|
|
||||||
20: '8rem'
|
|
||||||
},
|
|
||||||
maxWidth: {
|
|
||||||
4: '1rem',
|
|
||||||
8: '2rem',
|
|
||||||
12: '3rem',
|
|
||||||
16: '4rem',
|
|
||||||
20: '8rem'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
const path = require('path')
|
|
||||||
const glob = require('glob')
|
|
||||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
|
||||||
const TerserPlugin = require('terser-webpack-plugin')
|
|
||||||
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
|
|
||||||
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
|
||||||
|
|
||||||
module.exports = (env, options) => {
|
|
||||||
const devMode = options.mode !== 'production'
|
|
||||||
|
|
||||||
return {
|
|
||||||
optimization: {
|
|
||||||
minimizer: [
|
|
||||||
new TerserPlugin({ parallel: true, extractComments: true }),
|
|
||||||
new CssMinimizerPlugin({})
|
|
||||||
]
|
|
||||||
},
|
|
||||||
entry: {
|
|
||||||
app: glob.sync('./vendor/**/*.js').concat(['./js/app.js'])
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
filename: '[name].js',
|
|
||||||
path: path.resolve(__dirname, '../priv/static/js'),
|
|
||||||
publicPath: '/js/'
|
|
||||||
},
|
|
||||||
devtool: devMode ? 'eval-cheap-module-source-map' : undefined,
|
|
||||||
module: {
|
|
||||||
rules: [
|
|
||||||
{
|
|
||||||
test: /\.js$/,
|
|
||||||
exclude: /node_modules/,
|
|
||||||
use: {
|
|
||||||
loader: 'babel-loader'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
test: /\.s?css$/,
|
|
||||||
use: [
|
|
||||||
MiniCssExtractPlugin.loader,
|
|
||||||
'css-loader',
|
|
||||||
'postcss-loader',
|
|
||||||
'sass-loader'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
test: /\.(woff(2)?|ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
|
||||||
type: 'asset/resource',
|
|
||||||
generator: { filename: 'fonts/[name].[ext]' }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
new MiniCssExtractPlugin({ filename: '../css/app.css' }),
|
|
||||||
new CopyWebpackPlugin({ patterns: [{ from: 'static/', to: '../' }] })
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +1,5 @@
|
|||||||
# v0.1.20
|
# v0.1.20
|
||||||
|
- Update deps
|
||||||
- Improve accuracy of timestamps
|
- Improve accuracy of timestamps
|
||||||
|
|
||||||
# v0.1.19
|
# v0.1.19
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
import Config
|
import Config
|
||||||
|
|
||||||
config :memex,
|
config :memex,
|
||||||
ecto_repos: [Memex.Repo],
|
env: :dev,
|
||||||
generators: [binary_id: true]
|
ecto_repos: [Memex.Repo]
|
||||||
|
|
||||||
config :memex, Memex.Accounts, registration: System.get_env("REGISTRATION", "invite")
|
config :memex, Memex.Accounts, registration: System.get_env("REGISTRATION", "invite")
|
||||||
|
|
||||||
# Configures the endpoint
|
# Configures the endpoint
|
||||||
config :memex, MemexWeb.Endpoint,
|
config :memex, MemexWeb.Endpoint,
|
||||||
|
adapter: Bandit.PhoenixAdapter,
|
||||||
url: [scheme: "https", host: System.get_env("HOST") || "localhost", port: "443"],
|
url: [scheme: "https", host: System.get_env("HOST") || "localhost", port: "443"],
|
||||||
http: [port: String.to_integer(System.get_env("PORT") || "4000")],
|
http: [port: String.to_integer(System.get_env("PORT") || "4000")],
|
||||||
secret_key_base: "KH59P0iZixX5gP/u+zkxxG8vAAj6vgt0YqnwEB5JP5K+E567SsqkCz69uWShjE7I",
|
secret_key_base: "KH59P0iZixX5gP/u+zkxxG8vAAj6vgt0YqnwEB5JP5K+E567SsqkCz69uWShjE7I",
|
||||||
@ -55,14 +56,25 @@ config :memex, Oban,
|
|||||||
queues: [default: 10, mailers: 20]
|
queues: [default: 10, mailers: 20]
|
||||||
|
|
||||||
# Configure esbuild (the version is required)
|
# Configure esbuild (the version is required)
|
||||||
# config :esbuild,
|
config :esbuild,
|
||||||
# version: "0.14.0",
|
version: "0.17.11",
|
||||||
# default: [
|
memex: [
|
||||||
# args:
|
args:
|
||||||
# ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
|
~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/* --loader:.woff=file --loader:.woff2=file),
|
||||||
# cd: Path.expand("../assets", __DIR__),
|
cd: Path.expand("../assets", __DIR__),
|
||||||
# env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
|
env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
|
||||||
# ]
|
]
|
||||||
|
|
||||||
|
# Configure tailwind (the version is required)
|
||||||
|
config :tailwind,
|
||||||
|
version: "4.0.0",
|
||||||
|
memex: [
|
||||||
|
args: ~w(
|
||||||
|
--input=css/app.css
|
||||||
|
--output=../priv/static/assets/app.css
|
||||||
|
),
|
||||||
|
cd: Path.expand("../assets", __DIR__)
|
||||||
|
]
|
||||||
|
|
||||||
# Configures Elixir's Logger
|
# Configures Elixir's Logger
|
||||||
config :logger, :console,
|
config :logger, :console,
|
||||||
|
@ -2,6 +2,7 @@ import Config
|
|||||||
|
|
||||||
# Configure your database
|
# Configure your database
|
||||||
config :memex, Memex.Repo,
|
config :memex, Memex.Repo,
|
||||||
|
stacktrace: true,
|
||||||
show_sensitive_data_on_connection_error: true,
|
show_sensitive_data_on_connection_error: true,
|
||||||
pool_size: 10
|
pool_size: 10
|
||||||
|
|
||||||
@ -12,21 +13,14 @@ config :memex, Memex.Repo,
|
|||||||
# watchers to your application. For example, we use it
|
# watchers to your application. For example, we use it
|
||||||
# with esbuild to bundle .js and .css sources.
|
# with esbuild to bundle .js and .css sources.
|
||||||
config :memex, MemexWeb.Endpoint,
|
config :memex, MemexWeb.Endpoint,
|
||||||
|
http: [ip: {0, 0, 0, 0}, port: 4000],
|
||||||
check_origin: false,
|
check_origin: false,
|
||||||
code_reloader: true,
|
code_reloader: true,
|
||||||
debug_errors: true,
|
debug_errors: true,
|
||||||
secret_key_base: "dg2lccMgaY3+ZeKppR+ondk4ZRaANZGIN0LMZT1u1uzscH4jO5W9a9b9V9BkC+MW",
|
secret_key_base: "dg2lccMgaY3+ZeKppR+ondk4ZRaANZGIN0LMZT1u1uzscH4jO5W9a9b9V9BkC+MW",
|
||||||
watchers: [
|
watchers: [
|
||||||
# Start the esbuild watcher by calling Esbuild.install_and_run(:default, args)
|
esbuild: {Esbuild, :install_and_run, [:memex, ~w(--sourcemap=inline --watch)]},
|
||||||
# esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}
|
tailwind: {Tailwind, :install_and_run, [:memex, ~w(--watch)]}
|
||||||
node: [
|
|
||||||
"node_modules/webpack/bin/webpack.js",
|
|
||||||
"--mode",
|
|
||||||
"development",
|
|
||||||
"--watch",
|
|
||||||
"--watch-options-stdin",
|
|
||||||
cd: Path.expand("../assets", __DIR__)
|
|
||||||
]
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# ## SSL Support
|
# ## SSL Support
|
||||||
@ -57,7 +51,7 @@ config :memex, MemexWeb.Endpoint,
|
|||||||
config :memex, MemexWeb.Endpoint,
|
config :memex, MemexWeb.Endpoint,
|
||||||
live_reload: [
|
live_reload: [
|
||||||
patterns: [
|
patterns: [
|
||||||
~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$",
|
~r"priv/static/(?!uploads/).*(js|css|png|jpeg|jpg|gif|svg)$",
|
||||||
~r"priv/gettext/.*(po)$",
|
~r"priv/gettext/.*(po)$",
|
||||||
~r"lib/memex_web/*/.*(ex)$"
|
~r"lib/memex_web/*/.*(ex)$"
|
||||||
]
|
]
|
||||||
@ -73,3 +67,9 @@ config :phoenix, :stacktrace_depth, 20
|
|||||||
|
|
||||||
# Initialize plugs at runtime for faster development compilation
|
# Initialize plugs at runtime for faster development compilation
|
||||||
config :phoenix, :plug_init_mode, :runtime
|
config :phoenix, :plug_init_mode, :runtime
|
||||||
|
|
||||||
|
config :phoenix_live_view,
|
||||||
|
# Include HEEx debug annotations as HTML comments in rendered markup
|
||||||
|
debug_heex_annotations: true,
|
||||||
|
# Enable helpful, but potentially expensive runtime checks
|
||||||
|
enable_expensive_runtime_checks: true
|
||||||
|
@ -14,6 +14,8 @@ config :memex, MemexWeb.Endpoint, cache_static_manifest: "priv/static/cache_mani
|
|||||||
# Do not print debug messages in production
|
# Do not print debug messages in production
|
||||||
config :logger, level: :info
|
config :logger, level: :info
|
||||||
|
|
||||||
|
config :memex, env: :prod
|
||||||
|
|
||||||
# ## SSL Support
|
# ## SSL Support
|
||||||
#
|
#
|
||||||
# To get SSL working, you will need to add the `https` key
|
# To get SSL working, you will need to add the `https` key
|
||||||
|
@ -7,11 +7,21 @@ import Config
|
|||||||
# any compile-time configuration in here, as it won't be applied.
|
# any compile-time configuration in here, as it won't be applied.
|
||||||
# The block below contains prod specific runtime configuration.
|
# The block below contains prod specific runtime configuration.
|
||||||
|
|
||||||
# Start the phoenix server if environment is set and running in a release
|
# ## Using releases
|
||||||
if System.get_env("PHX_SERVER") && System.get_env("RELEASE_NAME") do
|
#
|
||||||
|
# If you use `mix release`, you need to explicitly enable the server
|
||||||
|
# by passing the PHX_SERVER=true when you start it:
|
||||||
|
#
|
||||||
|
# PHX_SERVER=true bin/memex start
|
||||||
|
#
|
||||||
|
# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server`
|
||||||
|
# script that automatically sets the env var above.
|
||||||
|
if System.get_env("PHX_SERVER") do
|
||||||
config :memex, MemexWeb.Endpoint, server: true
|
config :memex, MemexWeb.Endpoint, server: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
config :memex, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY")
|
||||||
|
|
||||||
# Set default locale
|
# Set default locale
|
||||||
config :gettext, :default_locale, System.get_env("LOCALE", "en_US")
|
config :gettext, :default_locale, System.get_env("LOCALE", "en_US")
|
||||||
|
|
||||||
|
@ -20,6 +20,8 @@ config :memex, MemexWeb.Endpoint,
|
|||||||
secret_key_base: "S3qq9QtUdsFtlYej+HTjAVN95uP5i5tf2sPYINWSQfCKJghFj2B1+wTAoljZyHOK",
|
secret_key_base: "S3qq9QtUdsFtlYej+HTjAVN95uP5i5tf2sPYINWSQfCKJghFj2B1+wTAoljZyHOK",
|
||||||
server: false
|
server: false
|
||||||
|
|
||||||
|
config :memex, env: :test
|
||||||
|
|
||||||
# In test we don't send emails.
|
# In test we don't send emails.
|
||||||
config :memex, Memex.Mailer, adapter: Swoosh.Adapters.Test
|
config :memex, Memex.Mailer, adapter: Swoosh.Adapters.Test
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ defmodule Memex.Accounts.User do
|
|||||||
field :email, :string
|
field :email, :string
|
||||||
field :password, :string, virtual: true
|
field :password, :string, virtual: true
|
||||||
field :hashed_password, :string
|
field :hashed_password, :string
|
||||||
|
field :current_password, :string, virtual: true, redact: true
|
||||||
field :confirmed_at, :utc_datetime_usec
|
field :confirmed_at, :utc_datetime_usec
|
||||||
field :role, Ecto.Enum, values: [:admin, :user], default: :user
|
field :role, Ecto.Enum, values: [:admin, :user], default: :user
|
||||||
field :locale, :string
|
field :locale, :string
|
||||||
@ -192,6 +193,8 @@ defmodule Memex.Accounts.User do
|
|||||||
"""
|
"""
|
||||||
@spec validate_current_password(changeset(), String.t()) :: changeset()
|
@spec validate_current_password(changeset(), String.t()) :: changeset()
|
||||||
def validate_current_password(changeset, password) do
|
def validate_current_password(changeset, password) do
|
||||||
|
changeset = cast(changeset, %{current_password: password}, [:current_password])
|
||||||
|
|
||||||
if valid_password?(changeset.data, password),
|
if valid_password?(changeset.data, password),
|
||||||
do: changeset,
|
do: changeset,
|
||||||
else: changeset |> add_error(:current_password, dgettext("errors", "is not valid"))
|
else: changeset |> add_error(:current_password, dgettext("errors", "is not valid"))
|
||||||
|
@ -15,6 +15,7 @@ defmodule Memex.Application do
|
|||||||
MemexWeb.Telemetry,
|
MemexWeb.Telemetry,
|
||||||
# Start the PubSub system
|
# Start the PubSub system
|
||||||
{Phoenix.PubSub, name: Memex.PubSub},
|
{Phoenix.PubSub, name: Memex.PubSub},
|
||||||
|
{DNSCluster, query: Application.get_env(:memex, :dns_cluster_query) || :ignore},
|
||||||
# Start the Endpoint (http/https)
|
# Start the Endpoint (http/https)
|
||||||
MemexWeb.Endpoint,
|
MemexWeb.Endpoint,
|
||||||
# Add Oban
|
# Add Oban
|
||||||
|
@ -17,7 +17,7 @@ defmodule MemexWeb do
|
|||||||
those modules here.
|
those modules here.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def static_paths, do: ~w(css js fonts images favicon.ico robots.txt)
|
def static_paths, do: ~w(assets fonts images favicon.ico robots.txt webfonts)
|
||||||
|
|
||||||
def router do
|
def router do
|
||||||
quote do
|
quote do
|
||||||
|
@ -91,7 +91,7 @@ defmodule MemexWeb.Components.ContextsTableComponent do
|
|||||||
defp get_value_for_key(:slug, %{slug: slug} = assigns, _additional_data) do
|
defp get_value_for_key(:slug, %{slug: slug} = assigns, _additional_data) do
|
||||||
slug_block = ~H"""
|
slug_block = ~H"""
|
||||||
<.link navigate={~p"/context/#{@slug}"} class="link">
|
<.link navigate={~p"/context/#{@slug}"} class="link">
|
||||||
<%= @slug %>
|
{@slug}
|
||||||
</.link>
|
</.link>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ defmodule MemexWeb.Components.ContextsTableComponent do
|
|||||||
~H"""
|
~H"""
|
||||||
<div class="flex flex-wrap justify-center space-x-1">
|
<div class="flex flex-wrap justify-center space-x-1">
|
||||||
<.link :for={tag <- @tags} patch={~p"/contexts/#{tag}"} class="link">
|
<.link :for={tag <- @tags} patch={~p"/contexts/#{tag}"} class="link">
|
||||||
<%= tag %>
|
{tag}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
@ -113,7 +113,7 @@ defmodule MemexWeb.Components.ContextsTableComponent do
|
|||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div class="flex justify-center items-center space-x-4">
|
<div class="flex justify-center items-center space-x-4">
|
||||||
<%= render_slot(@actions, @context) %>
|
{render_slot(@actions, @context)}
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
@ -6,6 +6,6 @@
|
|||||||
readonly
|
readonly
|
||||||
phx-no-format
|
phx-no-format
|
||||||
><p class="inline"><%= display_links(@context) %></p></div>
|
><p class="inline"><%= display_links(@context) %></p></div>
|
||||||
<div :if={!@context.content} class="text-sm italic text-center text-gray-600">
|
<div :if={!@context.content} class="text-sm italic text-center text-zinc-600">
|
||||||
<%= gettext("(This context is empty)") %>
|
{gettext("(This context is empty)")}
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
<time :if={@date} id={@id} datetime={Date.to_iso8601(@date, :extended)} phx-hook="Date">
|
<time :if={@date} id={@id} datetime={Date.to_iso8601(@date, :extended)} phx-hook="Date">
|
||||||
<%= Date.to_iso8601(@date, :extended) %>
|
{Date.to_iso8601(@date, :extended)}
|
||||||
</time>
|
</time>
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
<time :if={@datetime} id={@id} datetime={cast_datetime(@datetime)} phx-hook="DateTime">
|
<time :if={@datetime} id={@id} datetime={cast_datetime(@datetime)} phx-hook="DateTime">
|
||||||
<%= cast_datetime(@datetime) %>
|
{cast_datetime(@datetime)}
|
||||||
</time>
|
</time>
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
<div class="flex flex-col justify-center items-center px-8 py-4 space-y-4 rounded-lg border border-gray-400 shadow-lg transition-all duration-300 ease-in-out bg-primary-900 hover:shadow-md">
|
<div class="flex flex-col justify-center items-center px-8 py-4 space-y-4 rounded-lg border border-zinc-400 shadow-lg transition-all duration-300 ease-in-out bg-primary-900 hover:shadow-md">
|
||||||
<h1 class="text-xl title">
|
<h1 class="text-xl title">
|
||||||
<%= @invite.name %>
|
{@invite.name}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<%= if @invite.disabled_at do %>
|
<%= if @invite.disabled_at do %>
|
||||||
<h2 class="title text-md">
|
<h2 class="title text-md">
|
||||||
<%= gettext("invite disabled") %>
|
{gettext("invite disabled")}
|
||||||
</h2>
|
</h2>
|
||||||
<% else %>
|
<% else %>
|
||||||
<h2 class="title text-md">
|
<h2 class="title text-md">
|
||||||
<%= if @invite.uses_left do %>
|
<%= if @invite.uses_left do %>
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"uses left: %{uses_left_count}",
|
"uses left: %{uses_left_count}",
|
||||||
uses_left_count: @invite.uses_left
|
uses_left_count: @invite.uses_left
|
||||||
) %>
|
)}
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= gettext("uses left: unlimited") %>
|
{gettext("uses left: unlimited")}
|
||||||
<% end %>
|
<% end %>
|
||||||
</h2>
|
</h2>
|
||||||
<% end %>
|
<% end %>
|
||||||
@ -26,7 +26,7 @@
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<h2 :if={@use_count && @use_count != 0} class="title text-md">
|
<h2 :if={@use_count && @use_count != 0} class="title text-md">
|
||||||
<%= gettext("uses: %{uses_count}", uses_count: @use_count) %>
|
{gettext("uses: %{uses_count}", uses_count: @use_count)}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div class="flex flex-row flex-wrap justify-center items-center">
|
<div class="flex flex-row flex-wrap justify-center items-center">
|
||||||
@ -35,10 +35,10 @@
|
|||||||
class="px-4 py-2 mx-2 my-1 text-xs text-center break-all rounded-lg text-primary-400 bg-primary-800"
|
class="px-4 py-2 mx-2 my-1 text-xs text-center break-all rounded-lg text-primary-400 bg-primary-800"
|
||||||
phx-no-format
|
phx-no-format
|
||||||
><%= url(MemexWeb.Endpoint, ~p"/users/register?invite=#{@invite.token}") %></code>
|
><%= url(MemexWeb.Endpoint, ~p"/users/register?invite=#{@invite.token}") %></code>
|
||||||
<%= if @code_actions, do: render_slot(@code_actions) %>
|
{if @code_actions, do: render_slot(@code_actions)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div :if={@inner_block} class="flex justify-center items-center space-x-4">
|
<div :if={@inner_block} class="flex justify-center items-center space-x-4">
|
||||||
<%= render_slot(@inner_block) %>
|
{render_slot(@inner_block)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
patch={@return_to}
|
patch={@return_to}
|
||||||
id="close"
|
id="close"
|
||||||
class="absolute top-8 right-10
|
class="absolute top-8 right-10
|
||||||
text-gray-500 hover:text-gray-800
|
text-zinc-500 hover:text-zinc-800
|
||||||
transition-all duration-500 ease-in-out"
|
transition-all duration-500 ease-in-out"
|
||||||
phx-remove={hide_modal()}
|
phx-remove={hide_modal()}
|
||||||
aria-label={gettext("close modal")}
|
aria-label={gettext("close modal")}
|
||||||
@ -37,7 +37,7 @@
|
|||||||
</.link>
|
</.link>
|
||||||
|
|
||||||
<div class="overflow-x-hidden overflow-y-auto w-full p-8 flex flex-col space-y-4 justify-start items-stretch">
|
<div class="overflow-x-hidden overflow-y-auto w-full p-8 flex flex-col space-y-4 justify-start items-stretch">
|
||||||
<%= render_slot(@inner_block) %>
|
{render_slot(@inner_block)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -6,6 +6,6 @@
|
|||||||
readonly
|
readonly
|
||||||
phx-no-format
|
phx-no-format
|
||||||
><p class="inline"><%= display_links(@note) %></p></div>
|
><p class="inline"><%= display_links(@note) %></p></div>
|
||||||
<div :if={!@note.content} class="text-sm italic text-center text-gray-600">
|
<div :if={!@note.content} class="text-sm italic text-center text-zinc-600">
|
||||||
<%= gettext("(This note is empty)") %>
|
{gettext("(This note is empty)")}
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
<div class="flex flex-col sm:flex-row justify-between items-center">
|
<div class="flex flex-col sm:flex-row justify-between items-center">
|
||||||
<div class="mb-4 sm:mb-0 sm:mr-8 flex flex-row justify-start items-center space-x-2">
|
<div class="mb-4 sm:mb-0 sm:mr-8 flex flex-row justify-start items-center space-x-2">
|
||||||
<.link navigate={~p"/"} class="mx-2 my-1 leading-5 text-xl text-primary-400 hover:underline">
|
<.link navigate={~p"/"} class="mx-2 my-1 leading-5 text-xl text-primary-400 hover:underline">
|
||||||
<%= gettext("memEx") %>
|
{gettext("memEx")}
|
||||||
</.link>
|
</.link>
|
||||||
|
|
||||||
<%= if @title_content do %>
|
<%= if @title_content do %>
|
||||||
<span class="mx-2 my-1">
|
<span class="mx-2 my-1">
|
||||||
|
|
|
|
||||||
</span>
|
</span>
|
||||||
<%= @title_content %>
|
{@title_content}
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -19,19 +19,19 @@
|
|||||||
text-lg text-primary-400 text-ellipsis">
|
text-lg text-primary-400 text-ellipsis">
|
||||||
<li class="mx-2 my-1">
|
<li class="mx-2 my-1">
|
||||||
<.link navigate={~p"/notes"} class="text-primary-400 hover:underline truncate">
|
<.link navigate={~p"/notes"} class="text-primary-400 hover:underline truncate">
|
||||||
<%= gettext("notes") %>
|
{gettext("notes")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="mx-2 my-1">
|
<li class="mx-2 my-1">
|
||||||
<.link navigate={~p"/contexts"} class="text-primary-400 hover:underline truncate">
|
<.link navigate={~p"/contexts"} class="text-primary-400 hover:underline truncate">
|
||||||
<%= gettext("contexts") %>
|
{gettext("contexts")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="mx-2 my-1">
|
<li class="mx-2 my-1">
|
||||||
<.link navigate={~p"/pipelines"} class="text-primary-400 hover:underline truncate">
|
<.link navigate={~p"/pipelines"} class="text-primary-400 hover:underline truncate">
|
||||||
<%= gettext("pipelines") %>
|
{gettext("pipelines")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@ -40,13 +40,13 @@
|
|||||||
<%= if @current_user do %>
|
<%= if @current_user do %>
|
||||||
<li :if={@current_user |> Accounts.already_admin?()} class="mx-2 my-1">
|
<li :if={@current_user |> Accounts.already_admin?()} class="mx-2 my-1">
|
||||||
<.link navigate={~p"/invites"} class="text-primary-400 hover:underline">
|
<.link navigate={~p"/invites"} class="text-primary-400 hover:underline">
|
||||||
<%= gettext("invites") %>
|
{gettext("invites")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="mx-2 my-1">
|
<li class="mx-2 my-1">
|
||||||
<.link navigate={~p"/users/settings"} class="text-primary-400 hover:underline truncate">
|
<.link navigate={~p"/users/settings"} class="text-primary-400 hover:underline truncate">
|
||||||
<%= @current_user.email %>
|
{@current_user.email}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
<li class="mx-2 my-1">
|
<li class="mx-2 my-1">
|
||||||
@ -76,13 +76,13 @@
|
|||||||
<% else %>
|
<% else %>
|
||||||
<li :if={Accounts.allow_registration?()} class="mx-2 my-1">
|
<li :if={Accounts.allow_registration?()} class="mx-2 my-1">
|
||||||
<.link href={~p"/users/register"} class="text-primary-400 hover:underline truncate">
|
<.link href={~p"/users/register"} class="text-primary-400 hover:underline truncate">
|
||||||
<%= dgettext("actions", "register") %>
|
{dgettext("actions", "register")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="mx-2 my-1">
|
<li class="mx-2 my-1">
|
||||||
<.link href={~p"/users/log_in"} class="text-primary-400 hover:underline truncate">
|
<.link href={~p"/users/log_in"} class="text-primary-400 hover:underline truncate">
|
||||||
<%= dgettext("actions", "log in") %>
|
{dgettext("actions", "log in")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
@ -2,36 +2,36 @@
|
|||||||
id={"user-#{@user.id}"}
|
id={"user-#{@user.id}"}
|
||||||
class="px-8 py-4 flex flex-col justify-center items-center text-center
|
class="px-8 py-4 flex flex-col justify-center items-center text-center
|
||||||
bg-primary-900
|
bg-primary-900
|
||||||
border border-gray-400 rounded-lg shadow-lg hover:shadow-md
|
border border-zinc-400 rounded-lg shadow-lg hover:shadow-md
|
||||||
transition-all duration-300 ease-in-out"
|
transition-all duration-300 ease-in-out"
|
||||||
>
|
>
|
||||||
<h1 class="px-4 py-2 rounded-lg title text-xl break-all">
|
<h1 class="px-4 py-2 rounded-lg title text-xl break-all">
|
||||||
<%= @user.email %>
|
{@user.email}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<h3 class="px-4 py-2 rounded-lg title text-lg">
|
<h3 class="px-4 py-2 rounded-lg title text-lg">
|
||||||
<p>
|
<p>
|
||||||
<%= if @user.confirmed_at do %>
|
<%= if @user.confirmed_at do %>
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"user confirmed on%{confirmed_datetime}",
|
"user confirmed on%{confirmed_datetime}",
|
||||||
confirmed_datetime: ""
|
confirmed_datetime: ""
|
||||||
) %>
|
)}
|
||||||
<.datetime id={"#{@user.id}-confirmed-at"} datetime={@user.confirmed_at} />
|
<.datetime id={"#{@user.id}-confirmed-at"} datetime={@user.confirmed_at} />
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= gettext("email unconfirmed") %>
|
{gettext("email unconfirmed")}
|
||||||
<% end %>
|
<% end %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"user registered on%{registered_datetime}",
|
"user registered on%{registered_datetime}",
|
||||||
registered_datetime: ""
|
registered_datetime: ""
|
||||||
) %>
|
)}
|
||||||
<.datetime id={"#{@user.id}-inserted-at"} datetime={@user.inserted_at} />
|
<.datetime id={"#{@user.id}-inserted-at"} datetime={@user.inserted_at} />
|
||||||
</p>
|
</p>
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div :if={@inner_block} class="px-4 py-2 flex space-x-4 justify-center items-center">
|
<div :if={@inner_block} class="px-4 py-2 flex space-x-4 justify-center items-center">
|
||||||
<%= render_slot(@inner_block) %>
|
{render_slot(@inner_block)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
phx-click="lv:clear-flash"
|
phx-click="lv:clear-flash"
|
||||||
phx-value-key="info"
|
phx-value-key="info"
|
||||||
>
|
>
|
||||||
<%= Phoenix.Flash.get(@flash, :info) %>
|
{Phoenix.Flash.get(@flash, :info)}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p
|
<p
|
||||||
@ -20,13 +20,13 @@
|
|||||||
phx-click="lv:clear-flash"
|
phx-click="lv:clear-flash"
|
||||||
phx-value-key="error"
|
phx-value-key="error"
|
||||||
>
|
>
|
||||||
<%= Phoenix.Flash.get(@flash, :error) %>
|
{Phoenix.Flash.get(@flash, :error)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="mx-4 sm:mx-8 md:mx-16">
|
<div class="mx-4 sm:mx-8 md:mx-16">
|
||||||
<%= @inner_content %>
|
{@inner_content}
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
@ -40,6 +40,6 @@
|
|||||||
<i class="fas fa-fade text-md fa-satellite-dish"></i>
|
<i class="fas fa-fade text-md fa-satellite-dish"></i>
|
||||||
|
|
||||||
<h1 class="title text-md">
|
<h1 class="title text-md">
|
||||||
<%= gettext("Reconnecting...") %>
|
{gettext("Reconnecting...")}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>
|
<title>
|
||||||
<%= @email.subject %>
|
{@email.subject}
|
||||||
</title>
|
</title>
|
||||||
</head>
|
</head>
|
||||||
<body style="padding: 2em; color: rgb(161, 161, 170); background-color: rgb(39, 39, 42); font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; text-align: center;">
|
<body style="padding: 2em; color: rgb(161, 161, 170); background-color: rgb(39, 39, 42); font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; text-align: center;">
|
||||||
<%= @inner_content %>
|
{@inner_content}
|
||||||
|
|
||||||
<hr style="margin: 2em auto; border-width: 1px; border-color: rgb(161, 161, 170); width: 100%; max-width: 42rem;" />
|
<hr style="margin: 2em auto; border-width: 1px; border-color: rgb(161, 161, 170); width: 100%; max-width: 42rem;" />
|
||||||
|
|
||||||
<a style="color: rgb(161, 161, 170);" href={~p"/"}>
|
<a style="color: rgb(161, 161, 170);" href={~p"/"}>
|
||||||
<%= dgettext("emails", "this email was sent from memEx") %>
|
{dgettext("emails", "this email was sent from memEx")}
|
||||||
</a>
|
</a>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1 +1 @@
|
|||||||
<%= @inner_content %>
|
{@inner_content}
|
||||||
|
@ -1,19 +1,18 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en" class="m-0 p-0 w-full h-full bg-primary-800">
|
<html lang="en" class="p-0 m-0 w-full h-full bg-primary-800 [scrollbar-gutter:stable]">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="csrf-token" content={get_csrf_token()} />
|
||||||
<%= csrf_meta_tag() %>
|
|
||||||
<.live_title suffix={" | #{gettext("memEx")}"}>
|
<.live_title suffix={" | #{gettext("memEx")}"}>
|
||||||
<%= assigns[:page_title] || gettext("memEx") %>
|
{assigns[:page_title] || gettext("memEx")}
|
||||||
</.live_title>
|
</.live_title>
|
||||||
<link phx-track-static rel="stylesheet" href={~p"/css/app.css"} />
|
<link phx-track-static rel="stylesheet" href={~p"/assets/app.css"} />
|
||||||
<script defer phx-track-static type="text/javascript" src={~p"/js/app.js"}>
|
<script defer phx-track-static type="text/javascript" src={~p"/assets/app.js"}>
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="m-0 p-0 w-full h-full text-primary-400 subpixel-antialiased">
|
<body class="p-0 m-0 w-full h-full subpixel-antialiased text-primary-400">
|
||||||
<%= @inner_content %>
|
{@inner_content}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -91,7 +91,7 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
|||||||
defp get_value_for_key(:slug, %{slug: slug} = assigns, _additional_data) do
|
defp get_value_for_key(:slug, %{slug: slug} = assigns, _additional_data) do
|
||||||
slug_block = ~H"""
|
slug_block = ~H"""
|
||||||
<.link navigate={~p"/note/#{@slug}"} class="link">
|
<.link navigate={~p"/note/#{@slug}"} class="link">
|
||||||
<%= @slug %>
|
{@slug}
|
||||||
</.link>
|
</.link>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
|||||||
~H"""
|
~H"""
|
||||||
<div class="flex flex-wrap justify-center space-x-1">
|
<div class="flex flex-wrap justify-center space-x-1">
|
||||||
<.link :for={tag <- @tags} patch={~p"/notes/#{tag}"} class="link">
|
<.link :for={tag <- @tags} patch={~p"/notes/#{tag}"} class="link">
|
||||||
<%= tag %>
|
{tag}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
@ -113,7 +113,7 @@ defmodule MemexWeb.Components.NotesTableComponent do
|
|||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div class="flex justify-center items-center space-x-4">
|
<div class="flex justify-center items-center space-x-4">
|
||||||
<%= render_slot(@actions, @note) %>
|
{render_slot(@actions, @note)}
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
@ -92,7 +92,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
defp get_value_for_key(:slug, %{slug: slug} = assigns, _additional_data) do
|
defp get_value_for_key(:slug, %{slug: slug} = assigns, _additional_data) do
|
||||||
slug_block = ~H"""
|
slug_block = ~H"""
|
||||||
<.link navigate={~p"/pipeline/#{@slug}"} class="link">
|
<.link navigate={~p"/pipeline/#{@slug}"} class="link">
|
||||||
<%= @slug %>
|
{@slug}
|
||||||
</.link>
|
</.link>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
defp get_value_for_key(:description, %{description: description} = assigns, _additional_data) do
|
defp get_value_for_key(:description, %{description: description} = assigns, _additional_data) do
|
||||||
description_block = ~H"""
|
description_block = ~H"""
|
||||||
<div class="max-w-sm truncate">
|
<div class="max-w-sm truncate">
|
||||||
<%= @description %>
|
{@description}
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
~H"""
|
~H"""
|
||||||
<div class="flex flex-wrap justify-center space-x-1">
|
<div class="flex flex-wrap justify-center space-x-1">
|
||||||
<.link :for={tag <- @tags} patch={~p"/pipelines/#{tag}"} class="link">
|
<.link :for={tag <- @tags} patch={~p"/pipelines/#{tag}"} class="link">
|
||||||
<%= tag %>
|
{tag}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
@ -124,7 +124,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do
|
|||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div class="flex justify-center items-center space-x-4">
|
<div class="flex justify-center items-center space-x-4">
|
||||||
<%= render_slot(@actions, @pipeline) %>
|
{render_slot(@actions, @pipeline)}
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
phx-target={@myself}
|
phx-target={@myself}
|
||||||
>
|
>
|
||||||
<i class="w-0 float-right fas fa-sm fa-chevron-up opacity-0"></i>
|
<i class="w-0 float-right fas fa-sm fa-chevron-up opacity-0"></i>
|
||||||
<span class={if @last_sort_key == key, do: "underline"}><%= label %></span>
|
<span class={if @last_sort_key == key, do: "underline"}>{label}</span>
|
||||||
<%= if @last_sort_key == key do %>
|
<%= if @last_sort_key == key do %>
|
||||||
<%= case @sort_mode do %>
|
<%= case @sort_mode do %>
|
||||||
<% :asc -> %>
|
<% :asc -> %>
|
||||||
@ -27,7 +27,7 @@
|
|||||||
</th>
|
</th>
|
||||||
<% else %>
|
<% else %>
|
||||||
<th class={["p-2 cursor-not-allowed", column[:class]]}>
|
<th class={["p-2 cursor-not-allowed", column[:class]]}>
|
||||||
<%= label %>
|
{label}
|
||||||
</th>
|
</th>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
@ -41,9 +41,9 @@
|
|||||||
<td :for={%{key: key} = value <- @columns} class={["p-2", value[:class]]}>
|
<td :for={%{key: key} = value <- @columns} class={["p-2", value[:class]]}>
|
||||||
<%= case values |> Map.get(key) do %>
|
<%= case values |> Map.get(key) do %>
|
||||||
<% {_custom_sort_value, value} -> %>
|
<% {_custom_sort_value, value} -> %>
|
||||||
<%= value %>
|
{value}
|
||||||
<% value -> %>
|
<% value -> %>
|
||||||
<%= value %>
|
{value}
|
||||||
<% end %>
|
<% end %>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -1,23 +1,23 @@
|
|||||||
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center;">
|
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center;">
|
||||||
<span style="margin-bottom: 0.75em; font-size: 1.5em;">
|
<span style="margin-bottom: 0.75em; font-size: 1.5em;">
|
||||||
<%= dgettext("emails", "Hi %{email},", email: @user.email) %>
|
{dgettext("emails", "Hi %{email},", email: @user.email)}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<span style="margin-bottom: 1em; font-size: 1.25em;">
|
<span style="margin-bottom: 1em; font-size: 1.25em;">
|
||||||
<%= dgettext("emails", "Welcome to memEx") %>
|
{dgettext("emails", "Welcome to memEx")}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<%= dgettext("emails", "You can confirm your account by visiting the URL below:") %>
|
{dgettext("emails", "You can confirm your account by visiting the URL below:")}
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<a style="margin: 1em; color: rgb(161, 161, 170);" href={@url}><%= @url %></a>
|
<a style="margin: 1em; color: rgb(161, 161, 170);" href={@url}>{@url}</a>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<%= dgettext("emails", "If you didn't create an account at memEx, please ignore this.") %>
|
{dgettext("emails", "If you didn't create an account at memEx, please ignore this.")}
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center;">
|
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center;">
|
||||||
<span style="margin-bottom: 0.5em; font-size: 1.5em;">
|
<span style="margin-bottom: 0.5em; font-size: 1.5em;">
|
||||||
<%= dgettext("emails", "Hi %{email},", email: @user.email) %>
|
{dgettext("emails", "Hi %{email},", email: @user.email)}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<%= dgettext("emails", "You can reset your password by visiting the URL below:") %>
|
{dgettext("emails", "You can reset your password by visiting the URL below:")}
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<a style="margin: 1em; color: rgb(161, 161, 170);" href={@url}><%= @url %></a>
|
<a style="margin: 1em; color: rgb(161, 161, 170);" href={@url}>{@url}</a>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<%= dgettext("emails", "If you didn't request this change from memEx, please ignore this.") %>
|
{dgettext("emails", "If you didn't request this change from memEx, please ignore this.")}
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center;">
|
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center;">
|
||||||
<span style="margin-bottom: 0.5em; font-size: 1.5em;">
|
<span style="margin-bottom: 0.5em; font-size: 1.5em;">
|
||||||
<%= dgettext("emails", "Hi %{email},", email: @user.email) %>
|
{dgettext("emails", "Hi %{email},", email: @user.email)}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<%= dgettext("emails", "You can change your email by visiting the URL below:") %>
|
{dgettext("emails", "You can change your email by visiting the URL below:")}
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<a style="margin: 1em; color: rgb(161, 161, 170);" href={@url}><%= @url %></a>
|
<a style="margin: 1em; color: rgb(161, 161, 170);" href={@url}>{@url}</a>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<%= dgettext(
|
{dgettext(
|
||||||
"emails",
|
"emails",
|
||||||
"If you didn't request this change from memEx, please ignore this."
|
"If you didn't request this change from memEx, please ignore this."
|
||||||
) %>
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>
|
<title>
|
||||||
<%= dgettext("errors", "Error") %> | <%= gettext("memEx") %>
|
{dgettext("errors", "Error")} | {gettext("memEx")}
|
||||||
</title>
|
</title>
|
||||||
<link rel="stylesheet" href="/css/app.css" />
|
<link rel="stylesheet" href="/css/app.css" />
|
||||||
<script defer type="text/javascript" src="/js/app.js">
|
<script defer type="text/javascript" src="/js/app.js">
|
||||||
@ -19,13 +19,13 @@
|
|||||||
<div class="pb-8 w-full flex flex-col justify-center items-center text-center">
|
<div class="pb-8 w-full flex flex-col justify-center items-center text-center">
|
||||||
<div class="p-8 sm:p-16 w-full flex flex-col justify-center items-center space-y-4 max-w-3xl">
|
<div class="p-8 sm:p-16 w-full flex flex-col justify-center items-center space-y-4 max-w-3xl">
|
||||||
<h1 class="title text-primary-400 text-3xl">
|
<h1 class="title text-primary-400 text-3xl">
|
||||||
<%= @error_string %>
|
{@error_string}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<hr class="w-full hr" />
|
<hr class="w-full hr" />
|
||||||
|
|
||||||
<.link href={~p"/"} class="link title text-primary-400 text-lg">
|
<.link href={~p"/"} class="link title text-primary-400 text-lg">
|
||||||
<%= dgettext("errors", "go back home") %>
|
{dgettext("errors", "go back home")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
||||||
<h1 class="title text-primary-400 text-xl">
|
<h1 class="title text-primary-400 text-xl">
|
||||||
<%= dgettext("actions", "Resend confirmation instructions") %>
|
{dgettext("actions", "Resend confirmation instructions")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -10,22 +10,22 @@
|
|||||||
action={~p"/users/confirm"}
|
action={~p"/users/confirm"}
|
||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<%= label(f, :email, gettext("Email"), class: "title text-lg text-primary-400") %>
|
{label(f, :email, gettext("Email"), class: "title text-lg text-primary-400")}
|
||||||
<%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
|
{email_input(f, :email, required: true, class: "input input-primary col-span-2")}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "Resend confirmation instructions"),
|
{submit(dgettext("actions", "Resend confirmation instructions"),
|
||||||
class: "mx-auto btn btn-primary col-span-3"
|
class: "mx-auto btn btn-primary col-span-3"
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<div class="flex flex-row justify-center items-center space-x-4">
|
<div class="flex flex-row justify-center items-center space-x-4">
|
||||||
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
|
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "register") %>
|
{dgettext("actions", "register")}
|
||||||
</.link>
|
</.link>
|
||||||
<.link href={~p"/users/log_in"} class="btn btn-primary">
|
<.link href={~p"/users/log_in"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "log in") %>
|
{dgettext("actions", "log in")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
||||||
<h1 class="title text-primary-400 text-xl">
|
<h1 class="title text-primary-400 text-xl">
|
||||||
<%= dgettext("actions", "register") %>
|
{dgettext("actions", "register")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -10,41 +10,41 @@
|
|||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<p :if={@changeset.action && not @changeset.valid?} class="alert alert-danger col-span-3">
|
<p :if={@changeset.action && not @changeset.valid?} class="alert alert-danger col-span-3">
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
{dgettext("errors", "oops, something went wrong! please check the errors below.")}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<%= if @invite_token do %>
|
<%= if @invite_token do %>
|
||||||
<%= hidden_input(f, :invite_token, value: @invite_token) %>
|
{hidden_input(f, :invite_token, value: @invite_token)}
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= label(f, :email, gettext("email"), class: "title text-lg text-primary-400") %>
|
{label(f, :email, gettext("email"), class: "title text-lg text-primary-400")}
|
||||||
<%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
|
{email_input(f, :email, required: true, class: "input input-primary col-span-2")}
|
||||||
<%= error_tag(f, :email, "col-span-3") %>
|
{error_tag(f, :email, "col-span-3")}
|
||||||
|
|
||||||
<%= label(f, :password, gettext("password"), class: "title text-lg text-primary-400") %>
|
{label(f, :password, gettext("password"), class: "title text-lg text-primary-400")}
|
||||||
<%= password_input(f, :password, required: true, class: "input input-primary col-span-2") %>
|
{password_input(f, :password, required: true, class: "input input-primary col-span-2")}
|
||||||
<%= error_tag(f, :password, "col-span-3") %>
|
{error_tag(f, :password, "col-span-3")}
|
||||||
|
|
||||||
<%= label(f, :locale, gettext("language"), class: "title text-lg text-primary-400") %>
|
{label(f, :locale, gettext("language"), class: "title text-lg text-primary-400")}
|
||||||
<%= select(
|
{select(
|
||||||
f,
|
f,
|
||||||
:locale,
|
:locale,
|
||||||
[{gettext("english"), "en_US"}],
|
[{gettext("english"), "en_US"}],
|
||||||
class: "input input-primary col-span-2"
|
class: "input input-primary col-span-2"
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :locale) %>
|
{error_tag(f, :locale)}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "register"), class: "mx-auto btn btn-primary col-span-3") %>
|
{submit(dgettext("actions", "register"), class: "mx-auto btn btn-primary col-span-3")}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<div class="flex flex-row justify-center items-center space-x-4">
|
<div class="flex flex-row justify-center items-center space-x-4">
|
||||||
<.link href={~p"/users/log_in"} class="btn btn-primary">
|
<.link href={~p"/users/log_in"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "log in") %>
|
{dgettext("actions", "log in")}
|
||||||
</.link>
|
</.link>
|
||||||
<.link href={~p"/users/reset_password"} class="btn btn-primary">
|
<.link href={~p"/users/reset_password"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "forgot your password?") %>
|
{dgettext("actions", "forgot your password?")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
||||||
<h1 class="title text-primary-400 text-xl">
|
<h1 class="title text-primary-400 text-xl">
|
||||||
<%= dgettext("actions", "reset password") %>
|
{dgettext("actions", "reset password")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -10,35 +10,35 @@
|
|||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<p :if={@changeset.action && not @changeset.valid?} class="alert alert-danger col-span-3">
|
<p :if={@changeset.action && not @changeset.valid?} class="alert alert-danger col-span-3">
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
{dgettext("errors", "oops, something went wrong! please check the errors below.")}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<%= label(f, :password, gettext("new password"), class: "title text-lg text-primary-400") %>
|
{label(f, :password, gettext("new password"), class: "title text-lg text-primary-400")}
|
||||||
<%= password_input(f, :password, required: true, class: "input input-primary col-span-2") %>
|
{password_input(f, :password, required: true, class: "input input-primary col-span-2")}
|
||||||
<%= error_tag(f, :password, "col-span-3") %>
|
{error_tag(f, :password, "col-span-3")}
|
||||||
|
|
||||||
<%= label(f, :password_confirmation, gettext("confirm new password"),
|
{label(f, :password_confirmation, gettext("confirm new password"),
|
||||||
class: "title text-lg text-primary-400"
|
class: "title text-lg text-primary-400"
|
||||||
) %>
|
)}
|
||||||
<%= password_input(f, :password_confirmation,
|
{password_input(f, :password_confirmation,
|
||||||
required: true,
|
required: true,
|
||||||
class: "input input-primary col-span-2"
|
class: "input input-primary col-span-2"
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :password_confirmation, "col-span-3") %>
|
{error_tag(f, :password_confirmation, "col-span-3")}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "reset password"),
|
{submit(dgettext("actions", "reset password"),
|
||||||
class: "mx-auto btn btn-primary col-span-3"
|
class: "mx-auto btn btn-primary col-span-3"
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<div class="flex flex-row justify-center items-center space-x-4">
|
<div class="flex flex-row justify-center items-center space-x-4">
|
||||||
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
|
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "register") %>
|
{dgettext("actions", "register")}
|
||||||
</.link>
|
</.link>
|
||||||
<.link href={~p"/users/log_in"} class="btn btn-primary">
|
<.link href={~p"/users/log_in"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "log in") %>
|
{dgettext("actions", "log in")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
||||||
<h1 class="title text-primary-400 text-xl">
|
<h1 class="title text-primary-400 text-xl">
|
||||||
<%= dgettext("actions", "forgot your password?") %>
|
{dgettext("actions", "forgot your password?")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -10,22 +10,22 @@
|
|||||||
action={~p"/users/reset_password"}
|
action={~p"/users/reset_password"}
|
||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<%= label(f, :email, gettext("email"), class: "title text-lg text-primary-400") %>
|
{label(f, :email, gettext("email"), class: "title text-lg text-primary-400")}
|
||||||
<%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
|
{email_input(f, :email, required: true, class: "input input-primary col-span-2")}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "send instructions to reset password"),
|
{submit(dgettext("actions", "send instructions to reset password"),
|
||||||
class: "mx-auto btn btn-primary col-span-3"
|
class: "mx-auto btn btn-primary col-span-3"
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<div class="flex flex-row justify-center items-center space-x-4">
|
<div class="flex flex-row justify-center items-center space-x-4">
|
||||||
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
|
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "register") %>
|
{dgettext("actions", "register")}
|
||||||
</.link>
|
</.link>
|
||||||
<.link href={~p"/users/log_in"} class="btn btn-primary">
|
<.link href={~p"/users/log_in"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "log in") %>
|
{dgettext("actions", "log in")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
<div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4">
|
||||||
<h1 class="title text-primary-400 text-xl">
|
<h1 class="title text-primary-400 text-xl">
|
||||||
<%= dgettext("actions", "log in") %>
|
{dgettext("actions", "log in")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -11,31 +11,31 @@
|
|||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<p :if={@error_message} class="alert alert-danger col-span-3">
|
<p :if={@error_message} class="alert alert-danger col-span-3">
|
||||||
<%= @error_message %>
|
{@error_message}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<%= label(f, :email, gettext("email"), class: "title text-lg text-primary-400") %>
|
{label(f, :email, gettext("email"), class: "title text-lg text-primary-400")}
|
||||||
<%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
|
{email_input(f, :email, required: true, class: "input input-primary col-span-2")}
|
||||||
|
|
||||||
<%= label(f, :password, gettext("password"), class: "title text-lg text-primary-400") %>
|
{label(f, :password, gettext("password"), class: "title text-lg text-primary-400")}
|
||||||
<%= password_input(f, :password, required: true, class: "input input-primary col-span-2") %>
|
{password_input(f, :password, required: true, class: "input input-primary col-span-2")}
|
||||||
|
|
||||||
<%= label(f, :remember_me, gettext("keep me logged in for 60 days"),
|
{label(f, :remember_me, gettext("keep me logged in for 60 days"),
|
||||||
class: "title text-lg text-primary-400"
|
class: "title text-lg text-primary-400"
|
||||||
) %>
|
)}
|
||||||
<%= checkbox(f, :remember_me, class: "checkbox col-span-2") %>
|
{checkbox(f, :remember_me, class: "checkbox col-span-2")}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "log in"), class: "mx-auto btn btn-primary col-span-3") %>
|
{submit(dgettext("actions", "log in"), class: "mx-auto btn btn-primary col-span-3")}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<div class="flex flex-row justify-center items-center space-x-4">
|
<div class="flex flex-row justify-center items-center space-x-4">
|
||||||
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
|
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "register") %>
|
{dgettext("actions", "register")}
|
||||||
</.link>
|
</.link>
|
||||||
<.link href={~p"/users/reset_password"} class="btn btn-primary">
|
<.link href={~p"/users/reset_password"} class="btn btn-primary">
|
||||||
<%= dgettext("actions", "forgot your password?") %>
|
{dgettext("actions", "forgot your password?")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto pb-8 max-w-3xl flex flex-col justify-center items-stretch text-right space-y-4">
|
<div class="mx-auto pb-8 max-w-3xl flex flex-col justify-center items-stretch text-right space-y-4">
|
||||||
<h1 class="title text-primary-400 text-xl text-left">
|
<h1 class="title text-primary-400 text-xl text-left">
|
||||||
<%= gettext("settings") %>
|
{gettext("settings")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
@ -12,37 +12,37 @@
|
|||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<h3 class="title text-primary-400 text-lg text-center col-span-3">
|
<h3 class="title text-primary-400 text-lg text-center col-span-3">
|
||||||
<%= dgettext("actions", "change email") %>
|
{dgettext("actions", "change email")}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
:if={@email_changeset.action && not @email_changeset.valid?}
|
:if={@email_changeset.action && not @email_changeset.valid?}
|
||||||
class="alert alert-danger col-span-3"
|
class="alert alert-danger col-span-3"
|
||||||
>
|
>
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below") %>
|
{dgettext("errors", "oops, something went wrong! please check the errors below")}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= hidden_input(f, :action, name: "action", value: "update_email") %>
|
{hidden_input(f, :action, name: "action", value: "update_email")}
|
||||||
|
|
||||||
<%= label(f, :email, gettext("email"), class: "title text-lg text-primary-400") %>
|
{label(f, :email, gettext("email"), class: "title text-lg text-primary-400")}
|
||||||
<%= email_input(f, :email, required: true, class: "mx-2 my-1 input input-primary col-span-2") %>
|
{email_input(f, :email, required: true, class: "mx-2 my-1 input input-primary col-span-2")}
|
||||||
<%= error_tag(f, :email, "col-span-3") %>
|
{error_tag(f, :email, "col-span-3")}
|
||||||
|
|
||||||
<%= label(f, :current_password, gettext("current password"),
|
{label(f, :current_password, gettext("current password"),
|
||||||
for: "current_password_for_email",
|
for: "current_password_for_email",
|
||||||
class: "mx-2 my-1 title text-lg text-primary-400"
|
class: "mx-2 my-1 title text-lg text-primary-400"
|
||||||
) %>
|
)}
|
||||||
<%= password_input(f, :current_password,
|
{password_input(f, :current_password,
|
||||||
required: true,
|
required: true,
|
||||||
name: "current_password",
|
name: "current_password",
|
||||||
id: "current_password_for_email",
|
id: "current_password_for_email",
|
||||||
class: "mx-2 my-1 input input-primary col-span-2"
|
class: "mx-2 my-1 input input-primary col-span-2"
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :current_password, "col-span-3") %>
|
{error_tag(f, :current_password, "col-span-3")}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "change email"),
|
{submit(dgettext("actions", "change email"),
|
||||||
class: "mx-auto btn btn-primary col-span-3"
|
class: "mx-auto btn btn-primary col-span-3"
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
@ -54,49 +54,49 @@
|
|||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<h3 class="title text-primary-400 text-lg text-center col-span-3">
|
<h3 class="title text-primary-400 text-lg text-center col-span-3">
|
||||||
<%= dgettext("actions", "change password") %>
|
{dgettext("actions", "change password")}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p
|
<p
|
||||||
:if={@password_changeset.action && not @password_changeset.valid?}
|
:if={@password_changeset.action && not @password_changeset.valid?}
|
||||||
class="alert alert-danger col-span-3"
|
class="alert alert-danger col-span-3"
|
||||||
>
|
>
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below.") %>
|
{dgettext("errors", "oops, something went wrong! please check the errors below.")}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<%= hidden_input(f, :action, name: "action", value: "update_password") %>
|
{hidden_input(f, :action, name: "action", value: "update_password")}
|
||||||
|
|
||||||
<%= label(f, :password, gettext("new password"), class: "title text-lg text-primary-400") %>
|
{label(f, :password, gettext("new password"), class: "title text-lg text-primary-400")}
|
||||||
<%= password_input(f, :password,
|
{password_input(f, :password,
|
||||||
required: true,
|
required: true,
|
||||||
class: "mx-2 my-1 input input-primary col-span-2"
|
class: "mx-2 my-1 input input-primary col-span-2"
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :password, "col-span-3") %>
|
{error_tag(f, :password, "col-span-3")}
|
||||||
|
|
||||||
<%= label(f, :password_confirmation, gettext("confirm new password"),
|
{label(f, :password_confirmation, gettext("confirm new password"),
|
||||||
class: "title text-lg text-primary-400"
|
class: "title text-lg text-primary-400"
|
||||||
) %>
|
)}
|
||||||
<%= password_input(f, :password_confirmation,
|
{password_input(f, :password_confirmation,
|
||||||
required: true,
|
required: true,
|
||||||
class: "mx-2 my-1 input input-primary col-span-2"
|
class: "mx-2 my-1 input input-primary col-span-2"
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :password_confirmation, "col-span-3") %>
|
{error_tag(f, :password_confirmation, "col-span-3")}
|
||||||
|
|
||||||
<%= label(f, :current_password, gettext("current password"),
|
{label(f, :current_password, gettext("current password"),
|
||||||
for: "current_password_for_password",
|
for: "current_password_for_password",
|
||||||
class: "title text-lg text-primary-400"
|
class: "title text-lg text-primary-400"
|
||||||
) %>
|
)}
|
||||||
<%= password_input(f, :current_password,
|
{password_input(f, :current_password,
|
||||||
required: true,
|
required: true,
|
||||||
name: "current_password",
|
name: "current_password",
|
||||||
id: "current_password_for_password",
|
id: "current_password_for_password",
|
||||||
class: "mx-2 my-1 input input-primary col-span-2"
|
class: "mx-2 my-1 input input-primary col-span-2"
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :current_password, "col-span-3") %>
|
{error_tag(f, :current_password, "col-span-3")}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "change password"),
|
{submit(dgettext("actions", "change password"),
|
||||||
class: "mx-auto btn btn-primary col-span-3"
|
class: "mx-auto btn btn-primary col-span-3"
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
@ -107,35 +107,35 @@
|
|||||||
action={~p"/users/settings"}
|
action={~p"/users/settings"}
|
||||||
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
|
||||||
>
|
>
|
||||||
<%= label(f, :locale, dgettext("actions", "change language"),
|
{label(f, :locale, dgettext("actions", "change language"),
|
||||||
class: "title text-primary-400 text-lg text-center col-span-3"
|
class: "title text-primary-400 text-lg text-center col-span-3"
|
||||||
) %>
|
)}
|
||||||
|
|
||||||
<div
|
<div
|
||||||
:if={@locale_changeset.action && not @locale_changeset.valid?}
|
:if={@locale_changeset.action && not @locale_changeset.valid?}
|
||||||
class="alert alert-danger col-span-3"
|
class="alert alert-danger col-span-3"
|
||||||
>
|
>
|
||||||
<%= dgettext("errors", "oops, something went wrong! please check the errors below") %>
|
{dgettext("errors", "oops, something went wrong! please check the errors below")}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= hidden_input(f, :action, name: "action", value: "update_locale") %>
|
{hidden_input(f, :action, name: "action", value: "update_locale")}
|
||||||
|
|
||||||
<%= select(f, :locale, [{gettext("english"), "en_US"}, {"spanish", "es"}],
|
{select(f, :locale, [{gettext("english"), "en_US"}, {"spanish", "es"}],
|
||||||
class: "mx-2 my-1 min-w-md input input-primary col-start-2"
|
class: "mx-2 my-1 min-w-md input input-primary col-start-2"
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :locale, "col-span-3") %>
|
{error_tag(f, :locale, "col-span-3")}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "change language"),
|
{submit(dgettext("actions", "change language"),
|
||||||
class: "whitespace-nowrap mx-auto btn btn-primary col-span-3",
|
class: "whitespace-nowrap mx-auto btn btn-primary col-span-3",
|
||||||
data: [qa: dgettext("prompts", "are you sure you want to change your language?")]
|
data: [qa: dgettext("prompts", "are you sure you want to change your language?")]
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<div class="flex justify-end items-center">
|
<div class="flex justify-end items-center">
|
||||||
<.link href={~p"/export/json"} class="mx-4 my-2 btn btn-primary" target="_blank">
|
<.link href={~p"/export/json"} class="mx-4 my-2 btn btn-primary" target="_blank">
|
||||||
<%= dgettext("actions", "export data as json") %>
|
{dgettext("actions", "export data as json")}
|
||||||
</.link>
|
</.link>
|
||||||
|
|
||||||
<.link
|
<.link
|
||||||
@ -144,7 +144,7 @@
|
|||||||
class="mx-4 my-2 btn btn-alert"
|
class="mx-4 my-2 btn btn-alert"
|
||||||
data-confirm={dgettext("prompts", "are you sure you want to delete your account?")}
|
data-confirm={dgettext("prompts", "are you sure you want to delete your account?")}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "delete user") %>
|
{dgettext("actions", "delete user")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,7 +4,7 @@ defmodule MemexWeb.ErrorHelpers do
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
use PhoenixHTMLHelpers
|
use PhoenixHTMLHelpers
|
||||||
import Phoenix.{Component, HTML.Form}
|
import Phoenix.Component
|
||||||
alias Ecto.Changeset
|
alias Ecto.Changeset
|
||||||
alias Phoenix.{HTML.Form, LiveView.Rendered}
|
alias Phoenix.{HTML.Form, LiveView.Rendered}
|
||||||
|
|
||||||
@ -19,10 +19,10 @@ defmodule MemexWeb.ErrorHelpers do
|
|||||||
~H"""
|
~H"""
|
||||||
<span
|
<span
|
||||||
:for={error <- Keyword.get_values(@form.errors, @field)}
|
:for={error <- Keyword.get_values(@form.errors, @field)}
|
||||||
|
:if={used_input?(@form[@field])}
|
||||||
class={["invalid-feedback", @extra_class]}
|
class={["invalid-feedback", @extra_class]}
|
||||||
phx-feedback-for={input_name(@form, @field)}
|
|
||||||
>
|
>
|
||||||
<%= translate_error(error) %>
|
{translate_error(error)}
|
||||||
</span>
|
</span>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
@ -9,17 +9,17 @@
|
|||||||
phx-hook="CtrlEnter"
|
phx-hook="CtrlEnter"
|
||||||
class="flex flex-col justify-start items-stretch space-y-4"
|
class="flex flex-col justify-start items-stretch space-y-4"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :slug,
|
{text_input(f, :slug,
|
||||||
aria_label: gettext("slug"),
|
aria_label: gettext("slug"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
phx_hook: "SanitizeTitles",
|
phx_hook: "SanitizeTitles",
|
||||||
placeholder: gettext("slug"),
|
placeholder: gettext("slug"),
|
||||||
required: true
|
required: true
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :slug) %>
|
{error_tag(f, :slug)}
|
||||||
|
|
||||||
<%= textarea(f, :content,
|
{textarea(f, :content,
|
||||||
id: "context-form-content",
|
id: "context-form-content",
|
||||||
class: "input input-primary h-64 min-h-64",
|
class: "input input-primary h-64 min-h-64",
|
||||||
phx_update: "ignore",
|
phx_update: "ignore",
|
||||||
@ -28,32 +28,32 @@
|
|||||||
aria_label:
|
aria_label:
|
||||||
gettext("use [[note-slug]] to link to a note or [context-slug] to link to a context"),
|
gettext("use [[note-slug]] to link to a note or [context-slug] to link to a context"),
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :content) %>
|
{error_tag(f, :content)}
|
||||||
|
|
||||||
<%= text_input(f, :tags_string,
|
{text_input(f, :tags_string,
|
||||||
aria_label: gettext("tag1,tag2"),
|
aria_label: gettext("tag1,tag2"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
id: "tags-input",
|
id: "tags-input",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
phx_hook: "SanitizeTags",
|
phx_hook: "SanitizeTags",
|
||||||
placeholder: gettext("tag1,tag2")
|
placeholder: gettext("tag1,tag2")
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :tags_string) %>
|
{error_tag(f, :tags_string)}
|
||||||
|
|
||||||
<div class="flex justify-center items-stretch space-x-4">
|
<div class="flex justify-center items-stretch space-x-4">
|
||||||
<%= select(f, :visibility, Ecto.Enum.values(Memex.Contexts.Context, :visibility),
|
{select(f, :visibility, Ecto.Enum.values(Memex.Contexts.Context, :visibility),
|
||||||
class: "grow input input-primary",
|
class: "grow input input-primary",
|
||||||
prompt: gettext("select privacy"),
|
prompt: gettext("select privacy"),
|
||||||
aria_label: gettext("select privacy"),
|
aria_label: gettext("select privacy"),
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "save"),
|
{submit(dgettext("actions", "save"),
|
||||||
phx_disable_with: gettext("saving..."),
|
phx_disable_with: gettext("saving..."),
|
||||||
class: "mx-auto btn btn-primary"
|
class: "mx-auto btn btn-primary"
|
||||||
) %>
|
)}
|
||||||
</div>
|
</div>
|
||||||
<%= error_tag(f, :visibility) %>
|
{error_tag(f, :visibility)}
|
||||||
</.form>
|
</.form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="flex flex-col justify-center items-start mx-auto space-y-4 max-w-3xl">
|
<div class="flex flex-col justify-center items-start mx-auto space-y-4 max-w-3xl">
|
||||||
<h1 class="text-xl">
|
<h1 class="text-xl">
|
||||||
<%= gettext("contexts") %>
|
{gettext("contexts")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -11,18 +11,18 @@
|
|||||||
phx-submit="search"
|
phx-submit="search"
|
||||||
class="flex flex-col items-stretch self-stretch"
|
class="flex flex-col items-stretch self-stretch"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :search_term,
|
{text_input(f, :search_term,
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
value: @search,
|
value: @search,
|
||||||
role: "search",
|
role: "search",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
placeholder: gettext("search")
|
placeholder: gettext("search")
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<%= if @contexts |> Enum.empty?() do %>
|
<%= if @contexts |> Enum.empty?() do %>
|
||||||
<h1 class="self-center text-primary-500">
|
<h1 class="self-center text-primary-500">
|
||||||
<%= gettext("no contexts found") %>
|
{gettext("no contexts found")}
|
||||||
</h1>
|
</h1>
|
||||||
<% else %>
|
<% else %>
|
||||||
<.live_component
|
<.live_component
|
||||||
@ -37,7 +37,7 @@
|
|||||||
patch={~p"/contexts/#{context}/edit"}
|
patch={~p"/contexts/#{context}/edit"}
|
||||||
aria-label={dgettext("actions", "edit %{context_slug}", context_slug: context.slug)}
|
aria-label={dgettext("actions", "edit %{context_slug}", context_slug: context.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
{dgettext("actions", "edit")}
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:if={@current_user}
|
:if={@current_user}
|
||||||
@ -47,14 +47,14 @@
|
|||||||
data-confirm={dgettext("prompts", "are you sure?")}
|
data-confirm={dgettext("prompts", "are you sure?")}
|
||||||
aria-label={dgettext("actions", "delete %{context_slug}", context_slug: context.slug)}
|
aria-label={dgettext("actions", "delete %{context_slug}", context_slug: context.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "delete") %>
|
{dgettext("actions", "delete")}
|
||||||
</.link>
|
</.link>
|
||||||
</:actions>
|
</:actions>
|
||||||
</.live_component>
|
</.live_component>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<.link :if={@current_user} patch={~p"/contexts/new"} class="self-end btn btn-primary">
|
<.link :if={@current_user} patch={~p"/contexts/new"} class="self-end btn btn-primary">
|
||||||
<%= dgettext("actions", "new context") %>
|
{dgettext("actions", "new context")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-3xl">
|
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-3xl">
|
||||||
<h1 class="text-xl">
|
<h1 class="text-xl">
|
||||||
<%= @context.slug %>
|
{@context.slug}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="flex flex-wrap space-x-1">
|
<div class="flex flex-wrap space-x-1">
|
||||||
<.link :for={tag <- @context.tags} navigate={~p"/contexts/#{tag}"} class="link">
|
<.link :for={tag <- @context.tags} navigate={~p"/contexts/#{tag}"} class="link">
|
||||||
<%= tag %>
|
{tag}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -15,30 +15,30 @@
|
|||||||
:if={@context_backlinks ++ @pipeline_backlinks != []}
|
:if={@context_backlinks ++ @pipeline_backlinks != []}
|
||||||
class="flex flex-wrap justify-end items-center self-end"
|
class="flex flex-wrap justify-end items-center self-end"
|
||||||
>
|
>
|
||||||
<p><%= gettext("Backlinked by:") %></p>
|
<p>{gettext("Backlinked by:")}</p>
|
||||||
<.link
|
<.link
|
||||||
:for={backlink <- @context_backlinks}
|
:for={backlink <- @context_backlinks}
|
||||||
class="m-1 hover:underline"
|
class="m-1 hover:underline"
|
||||||
patch={~p"/context/#{backlink}"}
|
patch={~p"/context/#{backlink}"}
|
||||||
>
|
>
|
||||||
<%= gettext("[%{slug}]", slug: backlink.slug) %>
|
{gettext("[%{slug}]", slug: backlink.slug)}
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:for={backlink <- @pipeline_backlinks}
|
:for={backlink <- @pipeline_backlinks}
|
||||||
class="m-1 hover:underline"
|
class="m-1 hover:underline"
|
||||||
patch={~p"/pipeline/#{backlink}"}
|
patch={~p"/pipeline/#{backlink}"}
|
||||||
>
|
>
|
||||||
<%= gettext("[[%{slug}]]", slug: backlink.slug) %>
|
{gettext("[[%{slug}]]", slug: backlink.slug)}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="self-end">
|
<p class="self-end">
|
||||||
<%= gettext("Visibility: %{visibility}", visibility: @context.visibility) %>
|
{gettext("Visibility: %{visibility}", visibility: @context.visibility)}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="flex self-end space-x-4">
|
<div class="flex self-end space-x-4">
|
||||||
<.link :if={@current_user} class="btn btn-primary" patch={~p"/context/#{@context}/edit"}>
|
<.link :if={@current_user} class="btn btn-primary" patch={~p"/context/#{@context}/edit"}>
|
||||||
<%= dgettext("actions", "edit") %>
|
{dgettext("actions", "edit")}
|
||||||
</.link>
|
</.link>
|
||||||
<button
|
<button
|
||||||
:if={@current_user}
|
:if={@current_user}
|
||||||
@ -48,7 +48,7 @@
|
|||||||
data-confirm={dgettext("prompts", "are you sure?")}
|
data-confirm={dgettext("prompts", "are you sure?")}
|
||||||
aria-label={dgettext("actions", "delete %{context_slug}", context_slug: @context.slug)}
|
aria-label={dgettext("actions", "delete %{context_slug}", context_slug: @context.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "delete") %>
|
{dgettext("actions", "delete")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="mx-auto flex flex-col justify-center items-stretch space-y-8 text-center max-w-3xl">
|
<div class="mx-auto flex flex-col justify-center items-stretch space-y-8 text-center max-w-3xl">
|
||||||
<h1 class="title text-primary-400 text-xl text-left">
|
<h1 class="title text-primary-400 text-xl text-left">
|
||||||
<%= gettext("faq") %>
|
{gettext("faq")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
@ -8,13 +8,13 @@
|
|||||||
<ul class="flex flex-col justify-center items-stretch space-y-8">
|
<ul class="flex flex-col justify-center items-stretch space-y-8">
|
||||||
<li class="flex flex-col justify-center items-stretch space-y-2">
|
<li class="flex flex-col justify-center items-stretch space-y-2">
|
||||||
<b class="whitespace-nowrap text-left">
|
<b class="whitespace-nowrap text-left">
|
||||||
<%= gettext("what is this?") %>
|
{gettext("what is this?")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"this is a memex, used to document not just your notes, but also your perspectives and processes."
|
"this is a memex, used to document not just your notes, but also your perspectives and processes."
|
||||||
) %>
|
)}
|
||||||
<%= gettext("some things that this memex is very loosely inspired by:") %>
|
{gettext("some things that this memex is very loosely inspired by:")}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul class="list-disc flex flex-col justify-center items-center space-y-2">
|
<ul class="list-disc flex flex-col justify-center items-center space-y-2">
|
||||||
@ -25,7 +25,7 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<%= gettext("memex") %>
|
{gettext("memex")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -35,7 +35,7 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<%= gettext("zettelkasten") %>
|
{gettext("zettelkasten")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -45,7 +45,7 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<%= gettext("org-mode") %>
|
{gettext("org-mode")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -53,75 +53,75 @@
|
|||||||
|
|
||||||
<li class="flex flex-col justify-center items-stretch space-y-2">
|
<li class="flex flex-col justify-center items-stretch space-y-2">
|
||||||
<b class="whitespace-nowrap text-left">
|
<b class="whitespace-nowrap text-left">
|
||||||
<%= gettext("why split up into notes, contexts and pipelines?") %>
|
{gettext("why split up into notes, contexts and pipelines?")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"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."
|
"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."
|
||||||
) %>
|
)}
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"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."
|
"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."
|
||||||
) %>
|
)}
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
"finally, i wanted to externalize the processes for common situations that use these thought processes at discrete steps. these are pipelines!"
|
||||||
) %>
|
)}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-stretch space-y-2">
|
<li class="flex flex-col justify-center items-stretch space-y-2">
|
||||||
<b class="whitespace-nowrap text-left">
|
<b class="whitespace-nowrap text-left">
|
||||||
<%= gettext("what should my notes be like?") %>
|
{gettext("what should my notes be like?")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
"in my opinion, notes should be written by any of the discrete objects or concepts that are meaningful to you in your life."
|
||||||
) %>
|
)}
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"spoons? probably not. a particular brand of spoons that you really like? why not :)"
|
"spoons? probably not. a particular brand of spoons that you really like? why not :)"
|
||||||
) %>
|
)}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-stretch space-y-2">
|
<li class="flex flex-col justify-center items-stretch space-y-2">
|
||||||
<b class="whitespace-nowrap text-left">
|
<b class="whitespace-nowrap text-left">
|
||||||
<%= gettext("what should my contexts be like?") %>
|
{gettext("what should my contexts be like?")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("in my opinion, contexts should be like single-topic blog posts.") %>
|
{gettext("in my opinion, contexts should be like single-topic blog posts.")}
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could link to the spoon note as an example of how it fits nicely into your hand."
|
"for instance, a good context could be what makes some physical designs spark joy for you, and in that context you could link to the spoon note as an example of how it fits nicely into your hand."
|
||||||
) %>
|
)}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-stretch space-y-2">
|
<li class="flex flex-col justify-center items-stretch space-y-2">
|
||||||
<b class="whitespace-nowrap text-left">
|
<b class="whitespace-nowrap text-left">
|
||||||
<%= gettext("what should my pipelines be like?") %>
|
{gettext("what should my pipelines be like?")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"in my opinion, pipelines should be pretty lightweight, and just link to contexts to provide most of the heavy lifting."
|
"in my opinion, pipelines should be pretty lightweight, and just link to contexts to provide most of the heavy lifting."
|
||||||
) %>
|
)}
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could link to the physical designs context, maybe with some notes about how it applies in this case."
|
"for instance, a pipeline for buying an object could have a step where you consider how much it sparks joy, and it could link to the physical designs context, maybe with some notes about how it applies in this case."
|
||||||
) %>
|
)}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-stretch space-y-2">
|
<li class="flex flex-col justify-center items-stretch space-y-2">
|
||||||
<b class="whitespace-nowrap text-left">
|
<b class="whitespace-nowrap text-left">
|
||||||
<%= gettext("how many people should i invite?") %>
|
{gettext("how many people should i invite?")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"while memEx fully supports multiple users, each memEx instance should be treated as a single cohesive and collaborative document."
|
"while memEx fully supports multiple users, each memEx instance should be treated as a single cohesive and collaborative document."
|
||||||
) %>
|
)}
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"note, context and pipeline slugs must be unique, and you are free to link to notes not written by you."
|
"note, context and pipeline slugs must be unique, and you are free to link to notes not written by you."
|
||||||
) %>
|
)}
|
||||||
<%= gettext(
|
{gettext(
|
||||||
"so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
"so, i'd recommend inviting anyone you'd like to work on your collective memEx. however, when in doubt, hopefully setting up a new instance is easy enough. if it isn't, then feel free to let me know :)"
|
||||||
) %>
|
)}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -1,39 +1,39 @@
|
|||||||
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-lg">
|
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-lg">
|
||||||
<h1 class="text-xl title text-primary-400">
|
<h1 class="text-xl title text-primary-400">
|
||||||
<%= gettext("memEx") %>
|
{gettext("memEx")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<ul class="flex flex-col space-y-4">
|
<ul class="flex flex-col space-y-4">
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b class="whitespace-nowrap">
|
<b class="whitespace-nowrap">
|
||||||
<%= gettext("notes:") %>
|
{gettext("notes:")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("document notes about individual items or concepts") %>
|
{gettext("document notes about individual items or concepts")}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b class="whitespace-nowrap">
|
<b class="whitespace-nowrap">
|
||||||
<%= gettext("contexts:") %>
|
{gettext("contexts:")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("provide context around a single topic and hotlink to your notes") %>
|
{gettext("provide context around a single topic and hotlink to your notes")}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b class="whitespace-nowrap">
|
<b class="whitespace-nowrap">
|
||||||
<%= gettext("pipelines:") %>
|
{gettext("pipelines:")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("document your processes, attaching contexts to each step") %>
|
{gettext("document your processes, attaching contexts to each step")}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2 text-right">
|
<li class="flex flex-col justify-center items-center space-y-2 text-right">
|
||||||
<.link navigate={~p"/faq"} class="btn btn-primary">
|
<.link navigate={~p"/faq"} class="btn btn-primary">
|
||||||
<%= gettext("read more on how to use memEx") %>
|
{gettext("read more on how to use memEx")}
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -42,42 +42,42 @@
|
|||||||
|
|
||||||
<ul class="flex flex-col space-y-4">
|
<ul class="flex flex-col space-y-4">
|
||||||
<h2 class="text-lg title text-primary-400">
|
<h2 class="text-lg title text-primary-400">
|
||||||
<%= gettext("features") %>
|
{gettext("features")}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b class="whitespace-nowrap">
|
<b class="whitespace-nowrap">
|
||||||
<%= gettext("multi-user:") %>
|
{gettext("multi-user:")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("built with sharing and collaboration in mind") %>
|
{gettext("built with sharing and collaboration in mind")}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b class="whitespace-nowrap">
|
<b class="whitespace-nowrap">
|
||||||
<%= gettext("privacy:") %>
|
{gettext("privacy:")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("privacy controls on a per-note, context or pipeline basis") %>
|
{gettext("privacy controls on a per-note, context or pipeline basis")}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b class="whitespace-nowrap">
|
<b class="whitespace-nowrap">
|
||||||
<%= gettext("convenient:") %>
|
{gettext("convenient:")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("accessible from any internet-capable device") %>
|
{gettext("accessible from any internet-capable device")}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b class="whitespace-nowrap">
|
<b class="whitespace-nowrap">
|
||||||
<%= gettext("backlinks:") %>
|
{gettext("backlinks:")}
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<%= gettext("view referencing items from the referenced item") %>
|
{gettext("view referencing items from the referenced item")}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -86,45 +86,45 @@
|
|||||||
|
|
||||||
<ul class="flex flex-col justify-center space-y-4">
|
<ul class="flex flex-col justify-center space-y-4">
|
||||||
<h2 class="text-lg title text-primary-400">
|
<h2 class="text-lg title text-primary-400">
|
||||||
<%= gettext("instance information") %>
|
{gettext("instance information")}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b>
|
<b>
|
||||||
<%= gettext("admins:") %>
|
{gettext("admins:")}
|
||||||
</b>
|
</b>
|
||||||
<p class="flex flex-col justify-center items-center space-y-2">
|
<p class="flex flex-col justify-center items-center space-y-2">
|
||||||
<%= if @admins |> Enum.empty?() do %>
|
<%= if @admins |> Enum.empty?() do %>
|
||||||
<.link href={~p"/users/register"} class="link">
|
<.link href={~p"/users/register"} class="link">
|
||||||
<%= dgettext("prompts", "register to setup memEx") %>
|
{dgettext("prompts", "register to setup memEx")}
|
||||||
</.link>
|
</.link>
|
||||||
<% else %>
|
<% else %>
|
||||||
<.link :for={%{email: email} <- @admins} class="link" href={"mailto:#{email}"}>
|
<.link :for={%{email: email} <- @admins} class="link" href={"mailto:#{email}"}>
|
||||||
<%= email %>
|
{email}
|
||||||
</.link>
|
</.link>
|
||||||
<% end %>
|
<% end %>
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b><%= gettext("registration:") %></b>
|
<b>{gettext("registration:")}</b>
|
||||||
<p>
|
<p>
|
||||||
<%= case Accounts.registration_mode() do
|
{case Accounts.registration_mode() do
|
||||||
:public -> gettext("public signups")
|
:public -> gettext("public signups")
|
||||||
:invite_only -> gettext("invite only")
|
:invite_only -> gettext("invite only")
|
||||||
end %>
|
end}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
<b><%= gettext("version:") %></b>
|
<b>{gettext("version:")}</b>
|
||||||
<.link
|
<.link
|
||||||
href="https://gitea.bubbletea.dev/shibao/memEx/src/branch/stable/changelog.md"
|
href="https://gitea.bubbletea.dev/shibao/memEx/src/branch/stable/changelog.md"
|
||||||
class="flex flex-row justify-center items-center space-x-2 link"
|
class="flex flex-row justify-center items-center space-x-2 link"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<p><%= @version %></p>
|
<p>{@version}</p>
|
||||||
<i class="fas fa-md fa-info-circle"></i>
|
<i class="fas fa-md fa-info-circle"></i>
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
@ -134,7 +134,7 @@
|
|||||||
|
|
||||||
<ul class="flex flex-col space-y-2">
|
<ul class="flex flex-col space-y-2">
|
||||||
<h2 class="text-lg title text-primary-400">
|
<h2 class="text-lg title text-primary-400">
|
||||||
<%= gettext("get involved") %>
|
{gettext("get involved")}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<li class="flex flex-col justify-center items-center space-y-2">
|
<li class="flex flex-col justify-center items-center space-y-2">
|
||||||
@ -144,7 +144,7 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<p><%= gettext("view the source code") %></p>
|
<p>{gettext("view the source code")}</p>
|
||||||
<i class="fas fa-md fa-code"></i>
|
<i class="fas fa-md fa-code"></i>
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
@ -155,7 +155,7 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<p><%= gettext("help translate") %></p>
|
<p>{gettext("help translate")}</p>
|
||||||
<i class="fas fa-md fa-language"></i>
|
<i class="fas fa-md fa-language"></i>
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
@ -166,7 +166,7 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<p><%= gettext("report bugs or request features") %></p>
|
<p>{gettext("report bugs or request features")}</p>
|
||||||
<i class="fas fa-md fa-spider"></i>
|
<i class="fas fa-md fa-spider"></i>
|
||||||
</.link>
|
</.link>
|
||||||
</li>
|
</li>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div>
|
<div>
|
||||||
<h2 class="mb-8 text-xl text-center title text-primary-400">
|
<h2 class="mb-8 text-xl text-center title text-primary-400">
|
||||||
<%= @title %>
|
{@title}
|
||||||
</h2>
|
</h2>
|
||||||
<.form
|
<.form
|
||||||
:let={f}
|
:let={f}
|
||||||
@ -16,38 +16,38 @@
|
|||||||
:if={@changeset.action && not @changeset.valid?}
|
:if={@changeset.action && not @changeset.valid?}
|
||||||
class="col-span-3 text-center invalid-feedback"
|
class="col-span-3 text-center invalid-feedback"
|
||||||
>
|
>
|
||||||
<%= changeset_errors(@changeset) %>
|
{changeset_errors(@changeset)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= label(f, :name, gettext("name"),
|
{label(f, :name, gettext("name"),
|
||||||
class: "title text-lg text-primary-400",
|
class: "title text-lg text-primary-400",
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
<%= text_input(f, :name,
|
{text_input(f, :name,
|
||||||
class: "input input-primary col-span-2",
|
class: "input input-primary col-span-2",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
required: true
|
required: true
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :name, "col-span-3") %>
|
{error_tag(f, :name, "col-span-3")}
|
||||||
|
|
||||||
<%= label(f, :uses_left, gettext("uses left"),
|
{label(f, :uses_left, gettext("uses left"),
|
||||||
class: "title text-lg text-primary-400",
|
class: "title text-lg text-primary-400",
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
<%= number_input(f, :uses_left,
|
{number_input(f, :uses_left,
|
||||||
min: 0,
|
min: 0,
|
||||||
class: "input input-primary col-span-2",
|
class: "input input-primary col-span-2",
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :uses_left, "col-span-3") %>
|
{error_tag(f, :uses_left, "col-span-3")}
|
||||||
|
|
||||||
<span class="col-span-3 italic text-center text-primary-500">
|
<span class="col-span-3 italic text-center text-primary-500">
|
||||||
<%= gettext(~s/leave "uses left" blank to make invite unlimited/) %>
|
{gettext(~s/leave "uses left" blank to make invite unlimited/)}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "save"),
|
{submit(dgettext("actions", "save"),
|
||||||
class: "mx-auto btn btn-primary col-span-3",
|
class: "mx-auto btn btn-primary col-span-3",
|
||||||
phx_disable_with: dgettext("prompts", "saving...")
|
phx_disable_with: dgettext("prompts", "saving...")
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-3xl">
|
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-3xl">
|
||||||
<h1 class="text-xl title title-primary-500">
|
<h1 class="text-xl title title-primary-500">
|
||||||
<%= gettext("invites") %>
|
{gettext("invites")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<%= if @invites |> Enum.empty?() do %>
|
<%= if @invites |> Enum.empty?() do %>
|
||||||
<h1 class="text-xl text-center title text-primary-400">
|
<h1 class="text-xl text-center title text-primary-400">
|
||||||
<%= gettext("no invites 😔") %>
|
{gettext("no invites 😔")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.link patch={~p"/invites/new"} class="ml-auto btn btn-primary">
|
<.link patch={~p"/invites/new"} class="ml-auto btn btn-primary">
|
||||||
<%= dgettext("actions", "new invite") %>
|
{dgettext("actions", "new invite")}
|
||||||
</.link>
|
</.link>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
@ -30,7 +30,7 @@
|
|||||||
dgettext("actions", "copy invite link for %{invite_name}", invite_name: invite.name)
|
dgettext("actions", "copy invite link for %{invite_name}", invite_name: invite.name)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "copy") %>
|
{dgettext("actions", "copy")}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</:code_actions>
|
</:code_actions>
|
||||||
@ -67,7 +67,7 @@
|
|||||||
phx-click={if invite.disabled_at, do: "enable_invite", else: "disable_invite"}
|
phx-click={if invite.disabled_at, do: "enable_invite", else: "disable_invite"}
|
||||||
phx-value-id={invite.id}
|
phx-value-id={invite.id}
|
||||||
>
|
>
|
||||||
<%= if invite.disabled_at, do: gettext("enable"), else: gettext("disable") %>
|
{if invite.disabled_at, do: gettext("enable"), else: gettext("disable")}
|
||||||
</.link>
|
</.link>
|
||||||
|
|
||||||
<.link
|
<.link
|
||||||
@ -82,12 +82,12 @@
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<%= gettext("set unlimited") %>
|
{gettext("set unlimited")}
|
||||||
</.link>
|
</.link>
|
||||||
</.invite_card>
|
</.invite_card>
|
||||||
|
|
||||||
<.link :if={@invites != []} patch={~p"/invites/new"} class="ml-auto btn btn-primary">
|
<.link :if={@invites != []} patch={~p"/invites/new"} class="ml-auto btn btn-primary">
|
||||||
<%= dgettext("actions", "create invite") %>
|
{dgettext("actions", "create invite")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -95,7 +95,7 @@
|
|||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<h1 class="text-xl title text-primary-400">
|
<h1 class="text-xl title text-primary-400">
|
||||||
<%= gettext("admins") %>
|
{gettext("admins")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="flex flex-col justify-center items-stretch space-y-4">
|
<div class="flex flex-col justify-center items-stretch space-y-4">
|
||||||
@ -123,7 +123,7 @@
|
|||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<h1 class="text-xl title text-primary-400">
|
<h1 class="text-xl title text-primary-400">
|
||||||
<%= gettext("users") %>
|
{gettext("users")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="flex flex-col justify-center items-stretch space-y-4">
|
<div class="flex flex-col justify-center items-stretch space-y-4">
|
||||||
|
@ -9,49 +9,49 @@
|
|||||||
phx-hook="CtrlEnter"
|
phx-hook="CtrlEnter"
|
||||||
class="flex flex-col justify-start items-stretch space-y-4"
|
class="flex flex-col justify-start items-stretch space-y-4"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :slug,
|
{text_input(f, :slug,
|
||||||
aria_label: gettext("slug"),
|
aria_label: gettext("slug"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
phx_hook: "SanitizeTitles",
|
phx_hook: "SanitizeTitles",
|
||||||
placeholder: gettext("slug"),
|
placeholder: gettext("slug"),
|
||||||
required: true
|
required: true
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :slug) %>
|
{error_tag(f, :slug)}
|
||||||
|
|
||||||
<%= textarea(f, :content,
|
{textarea(f, :content,
|
||||||
id: "note-form-content",
|
id: "note-form-content",
|
||||||
class: "input input-primary h-64 min-h-64",
|
class: "input input-primary h-64 min-h-64",
|
||||||
phx_update: "ignore",
|
phx_update: "ignore",
|
||||||
placeholder: gettext("use [note-slug] to link to a note"),
|
placeholder: gettext("use [note-slug] to link to a note"),
|
||||||
aria_label: gettext("use [note-slug] to link to a note"),
|
aria_label: gettext("use [note-slug] to link to a note"),
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :content) %>
|
{error_tag(f, :content)}
|
||||||
|
|
||||||
<%= text_input(f, :tags_string,
|
{text_input(f, :tags_string,
|
||||||
aria_label: gettext("tag1,tag2"),
|
aria_label: gettext("tag1,tag2"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
id: "tags-input",
|
id: "tags-input",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
phx_hook: "SanitizeTags",
|
phx_hook: "SanitizeTags",
|
||||||
placeholder: gettext("tag1,tag2")
|
placeholder: gettext("tag1,tag2")
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :tags_string) %>
|
{error_tag(f, :tags_string)}
|
||||||
|
|
||||||
<div class="flex justify-center items-stretch space-x-4">
|
<div class="flex justify-center items-stretch space-x-4">
|
||||||
<%= select(f, :visibility, Ecto.Enum.values(Memex.Notes.Note, :visibility),
|
{select(f, :visibility, Ecto.Enum.values(Memex.Notes.Note, :visibility),
|
||||||
class: "grow input input-primary",
|
class: "grow input input-primary",
|
||||||
prompt: gettext("select privacy"),
|
prompt: gettext("select privacy"),
|
||||||
aria_label: gettext("select privacy"),
|
aria_label: gettext("select privacy"),
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "save"),
|
{submit(dgettext("actions", "save"),
|
||||||
phx_disable_with: gettext("saving..."),
|
phx_disable_with: gettext("saving..."),
|
||||||
class: "mx-auto btn btn-primary"
|
class: "mx-auto btn btn-primary"
|
||||||
) %>
|
)}
|
||||||
</div>
|
</div>
|
||||||
<%= error_tag(f, :visibility) %>
|
{error_tag(f, :visibility)}
|
||||||
</.form>
|
</.form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="flex flex-col justify-center items-start mx-auto space-y-4 max-w-3xl">
|
<div class="flex flex-col justify-center items-start mx-auto space-y-4 max-w-3xl">
|
||||||
<h1 class="text-xl">
|
<h1 class="text-xl">
|
||||||
<%= gettext("notes") %>
|
{gettext("notes")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -11,18 +11,18 @@
|
|||||||
phx-submit="search"
|
phx-submit="search"
|
||||||
class="flex flex-col items-stretch self-stretch"
|
class="flex flex-col items-stretch self-stretch"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :search_term,
|
{text_input(f, :search_term,
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
value: @search,
|
value: @search,
|
||||||
role: "search",
|
role: "search",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
placeholder: gettext("search")
|
placeholder: gettext("search")
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<%= if @notes |> Enum.empty?() do %>
|
<%= if @notes |> Enum.empty?() do %>
|
||||||
<h1 class="self-center text-primary-500">
|
<h1 class="self-center text-primary-500">
|
||||||
<%= gettext("no notes found") %>
|
{gettext("no notes found")}
|
||||||
</h1>
|
</h1>
|
||||||
<% else %>
|
<% else %>
|
||||||
<.live_component
|
<.live_component
|
||||||
@ -37,7 +37,7 @@
|
|||||||
patch={~p"/notes/#{note}/edit"}
|
patch={~p"/notes/#{note}/edit"}
|
||||||
aria-label={dgettext("actions", "edit %{note_slug}", note_slug: note.slug)}
|
aria-label={dgettext("actions", "edit %{note_slug}", note_slug: note.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
{dgettext("actions", "edit")}
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:if={@current_user}
|
:if={@current_user}
|
||||||
@ -47,14 +47,14 @@
|
|||||||
data-confirm={dgettext("prompts", "are you sure?")}
|
data-confirm={dgettext("prompts", "are you sure?")}
|
||||||
aria-label={dgettext("actions", "delete %{note_slug}", note_slug: note.slug)}
|
aria-label={dgettext("actions", "delete %{note_slug}", note_slug: note.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "delete") %>
|
{dgettext("actions", "delete")}
|
||||||
</.link>
|
</.link>
|
||||||
</:actions>
|
</:actions>
|
||||||
</.live_component>
|
</.live_component>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<.link :if={@current_user} patch={~p"/notes/new"} class="self-end btn btn-primary">
|
<.link :if={@current_user} patch={~p"/notes/new"} class="self-end btn btn-primary">
|
||||||
<%= dgettext("actions", "new note") %>
|
{dgettext("actions", "new note")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-3xl">
|
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-3xl">
|
||||||
<h1 class="text-xl">
|
<h1 class="text-xl">
|
||||||
<%= @note.slug %>
|
{@note.slug}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="flex flex-wrap space-x-1">
|
<div class="flex flex-wrap space-x-1">
|
||||||
<.link :for={tag <- @note.tags} navigate={~p"/notes/#{tag}"} class="link">
|
<.link :for={tag <- @note.tags} navigate={~p"/notes/#{tag}"} class="link">
|
||||||
<%= tag %>
|
{tag}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -15,37 +15,37 @@
|
|||||||
:if={@note_backlinks ++ @context_backlinks ++ @pipeline_backlinks != []}
|
:if={@note_backlinks ++ @context_backlinks ++ @pipeline_backlinks != []}
|
||||||
class="flex flex-wrap justify-end items-center self-end"
|
class="flex flex-wrap justify-end items-center self-end"
|
||||||
>
|
>
|
||||||
<p><%= gettext("Backlinked by:") %></p>
|
<p>{gettext("Backlinked by:")}</p>
|
||||||
<.link
|
<.link
|
||||||
:for={backlink <- @note_backlinks}
|
:for={backlink <- @note_backlinks}
|
||||||
class="m-1 hover:underline"
|
class="m-1 hover:underline"
|
||||||
patch={~p"/note/#{backlink}"}
|
patch={~p"/note/#{backlink}"}
|
||||||
>
|
>
|
||||||
<%= gettext("[%{slug}]", slug: backlink.slug) %>
|
{gettext("[%{slug}]", slug: backlink.slug)}
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:for={backlink <- @context_backlinks}
|
:for={backlink <- @context_backlinks}
|
||||||
class="m-1 hover:underline"
|
class="m-1 hover:underline"
|
||||||
patch={~p"/context/#{backlink}"}
|
patch={~p"/context/#{backlink}"}
|
||||||
>
|
>
|
||||||
<%= gettext("[[%{slug}]]", slug: backlink.slug) %>
|
{gettext("[[%{slug}]]", slug: backlink.slug)}
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:for={backlink <- @pipeline_backlinks}
|
:for={backlink <- @pipeline_backlinks}
|
||||||
class="m-1 hover:underline"
|
class="m-1 hover:underline"
|
||||||
patch={~p"/pipeline/#{backlink}"}
|
patch={~p"/pipeline/#{backlink}"}
|
||||||
>
|
>
|
||||||
<%= gettext("[[[%{slug}]]]", slug: backlink.slug) %>
|
{gettext("[[[%{slug}]]]", slug: backlink.slug)}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="self-end">
|
<p class="self-end">
|
||||||
<%= gettext("Visibility: %{visibility}", visibility: @note.visibility) %>
|
{gettext("Visibility: %{visibility}", visibility: @note.visibility)}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="flex self-end space-x-4">
|
<div class="flex self-end space-x-4">
|
||||||
<.link :if={@current_user} class="btn btn-primary" patch={~p"/note/#{@note}/edit"}>
|
<.link :if={@current_user} class="btn btn-primary" patch={~p"/note/#{@note}/edit"}>
|
||||||
<%= dgettext("actions", "edit") %>
|
{dgettext("actions", "edit")}
|
||||||
</.link>
|
</.link>
|
||||||
<button
|
<button
|
||||||
:if={@current_user}
|
:if={@current_user}
|
||||||
@ -55,7 +55,7 @@
|
|||||||
data-confirm={dgettext("prompts", "are you sure?")}
|
data-confirm={dgettext("prompts", "are you sure?")}
|
||||||
aria-label={dgettext("actions", "delete %{note_slug}", note_slug: @note.slug)}
|
aria-label={dgettext("actions", "delete %{note_slug}", note_slug: @note.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "delete") %>
|
{dgettext("actions", "delete")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,17 +9,17 @@
|
|||||||
phx-hook="CtrlEnter"
|
phx-hook="CtrlEnter"
|
||||||
class="flex flex-col justify-start items-stretch space-y-4"
|
class="flex flex-col justify-start items-stretch space-y-4"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :slug,
|
{text_input(f, :slug,
|
||||||
aria_label: gettext("slug"),
|
aria_label: gettext("slug"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
phx_hook: "SanitizeTitles",
|
phx_hook: "SanitizeTitles",
|
||||||
placeholder: gettext("slug"),
|
placeholder: gettext("slug"),
|
||||||
required: true
|
required: true
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :slug) %>
|
{error_tag(f, :slug)}
|
||||||
|
|
||||||
<%= textarea(f, :description,
|
{textarea(f, :description,
|
||||||
id: "pipeline-form-description",
|
id: "pipeline-form-description",
|
||||||
class: "input input-primary h-64 min-h-64",
|
class: "input input-primary h-64 min-h-64",
|
||||||
phx_update: "ignore",
|
phx_update: "ignore",
|
||||||
@ -32,32 +32,32 @@
|
|||||||
"use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
"use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
),
|
),
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :description) %>
|
{error_tag(f, :description)}
|
||||||
|
|
||||||
<%= text_input(f, :tags_string,
|
{text_input(f, :tags_string,
|
||||||
aria_label: gettext("tag1,tag2"),
|
aria_label: gettext("tag1,tag2"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
id: "tags-input",
|
id: "tags-input",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
phx_hook: "SanitizeTags",
|
phx_hook: "SanitizeTags",
|
||||||
placeholder: gettext("tag1,tag2")
|
placeholder: gettext("tag1,tag2")
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :tags_string) %>
|
{error_tag(f, :tags_string)}
|
||||||
|
|
||||||
<div class="flex justify-center items-stretch space-x-4">
|
<div class="flex justify-center items-stretch space-x-4">
|
||||||
<%= select(f, :visibility, Ecto.Enum.values(Memex.Pipelines.Pipeline, :visibility),
|
{select(f, :visibility, Ecto.Enum.values(Memex.Pipelines.Pipeline, :visibility),
|
||||||
class: "grow input input-primary",
|
class: "grow input input-primary",
|
||||||
prompt: gettext("select privacy"),
|
prompt: gettext("select privacy"),
|
||||||
aria_label: gettext("select privacy"),
|
aria_label: gettext("select privacy"),
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
|
|
||||||
<%= submit(dgettext("actions", "save"),
|
{submit(dgettext("actions", "save"),
|
||||||
phx_disable_with: gettext("saving..."),
|
phx_disable_with: gettext("saving..."),
|
||||||
class: "mx-auto btn btn-primary"
|
class: "mx-auto btn btn-primary"
|
||||||
) %>
|
)}
|
||||||
</div>
|
</div>
|
||||||
<%= error_tag(f, :visibility) %>
|
{error_tag(f, :visibility)}
|
||||||
</.form>
|
</.form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="flex flex-col justify-center items-start mx-auto space-y-4 max-w-3xl">
|
<div class="flex flex-col justify-center items-start mx-auto space-y-4 max-w-3xl">
|
||||||
<h1 class="text-xl">
|
<h1 class="text-xl">
|
||||||
<%= gettext("pipelines") %>
|
{gettext("pipelines")}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<.form
|
<.form
|
||||||
@ -11,18 +11,18 @@
|
|||||||
phx-submit="search"
|
phx-submit="search"
|
||||||
class="flex flex-col items-stretch self-stretch"
|
class="flex flex-col items-stretch self-stretch"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :search_term,
|
{text_input(f, :search_term,
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
value: @search,
|
value: @search,
|
||||||
role: "search",
|
role: "search",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
placeholder: gettext("search")
|
placeholder: gettext("search")
|
||||||
) %>
|
)}
|
||||||
</.form>
|
</.form>
|
||||||
|
|
||||||
<%= if @pipelines |> Enum.empty?() do %>
|
<%= if @pipelines |> Enum.empty?() do %>
|
||||||
<h1 class="self-center text-primary-500">
|
<h1 class="self-center text-primary-500">
|
||||||
<%= gettext("no pipelines found") %>
|
{gettext("no pipelines found")}
|
||||||
</h1>
|
</h1>
|
||||||
<% else %>
|
<% else %>
|
||||||
<.live_component
|
<.live_component
|
||||||
@ -37,7 +37,7 @@
|
|||||||
patch={~p"/pipelines/#{pipeline}/edit"}
|
patch={~p"/pipelines/#{pipeline}/edit"}
|
||||||
aria-label={dgettext("actions", "edit %{pipeline_slug}", pipeline_slug: pipeline.slug)}
|
aria-label={dgettext("actions", "edit %{pipeline_slug}", pipeline_slug: pipeline.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
{dgettext("actions", "edit")}
|
||||||
</.link>
|
</.link>
|
||||||
<.link
|
<.link
|
||||||
:if={@current_user}
|
:if={@current_user}
|
||||||
@ -49,14 +49,14 @@
|
|||||||
dgettext("actions", "delete %{pipeline_slug}", pipeline_slug: pipeline.slug)
|
dgettext("actions", "delete %{pipeline_slug}", pipeline_slug: pipeline.slug)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "delete") %>
|
{dgettext("actions", "delete")}
|
||||||
</.link>
|
</.link>
|
||||||
</:actions>
|
</:actions>
|
||||||
</.live_component>
|
</.live_component>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<.link :if={@current_user} patch={~p"/pipelines/new"} class="self-end btn btn-primary">
|
<.link :if={@current_user} patch={~p"/pipelines/new"} class="self-end btn btn-primary">
|
||||||
<%= dgettext("actions", "new pipeline") %>
|
{dgettext("actions", "new pipeline")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,34 +1,34 @@
|
|||||||
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-3xl">
|
<div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-3xl">
|
||||||
<h1 class="text-xl">
|
<h1 class="text-xl">
|
||||||
<%= @pipeline.slug %>
|
{@pipeline.slug}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="flex flex-wrap space-x-1">
|
<div class="flex flex-wrap space-x-1">
|
||||||
<.link :for={tag <- @pipeline.tags} navigate={~p"/pipelines/#{tag}"} class="link">
|
<.link :for={tag <- @pipeline.tags} navigate={~p"/pipelines/#{tag}"} class="link">
|
||||||
<%= tag %>
|
{tag}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<.pipeline_content pipeline={@pipeline} />
|
<.pipeline_content pipeline={@pipeline} />
|
||||||
|
|
||||||
<div :if={@pipeline_backlinks != []} class="flex flex-wrap justify-end items-center self-end">
|
<div :if={@pipeline_backlinks != []} class="flex flex-wrap justify-end items-center self-end">
|
||||||
<p><%= gettext("Backlinked by:") %></p>
|
<p>{gettext("Backlinked by:")}</p>
|
||||||
<.link
|
<.link
|
||||||
:for={backlink <- @pipeline_backlinks}
|
:for={backlink <- @pipeline_backlinks}
|
||||||
class="m-1 hover:underline"
|
class="m-1 hover:underline"
|
||||||
patch={~p"/pipeline/#{backlink}"}
|
patch={~p"/pipeline/#{backlink}"}
|
||||||
>
|
>
|
||||||
<%= gettext("[%{slug}]", slug: backlink.slug) %>
|
{gettext("[%{slug}]", slug: backlink.slug)}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="self-end">
|
<p class="self-end">
|
||||||
<%= gettext("Visibility: %{visibility}", visibility: @pipeline.visibility) %>
|
{gettext("Visibility: %{visibility}", visibility: @pipeline.visibility)}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="flex self-end pb-4 space-x-4">
|
<div class="flex self-end pb-4 space-x-4">
|
||||||
<.link :if={@current_user} class="btn btn-primary" patch={~p"/pipeline/#{@pipeline}/edit"}>
|
<.link :if={@current_user} class="btn btn-primary" patch={~p"/pipeline/#{@pipeline}/edit"}>
|
||||||
<%= dgettext("actions", "edit") %>
|
{dgettext("actions", "edit")}
|
||||||
</.link>
|
</.link>
|
||||||
<button
|
<button
|
||||||
:if={@current_user}
|
:if={@current_user}
|
||||||
@ -38,25 +38,25 @@
|
|||||||
data-confirm={dgettext("prompts", "are you sure?")}
|
data-confirm={dgettext("prompts", "are you sure?")}
|
||||||
aria-label={dgettext("actions", "delete %{pipeline_slug}", pipeline_slug: @pipeline.slug)}
|
aria-label={dgettext("actions", "delete %{pipeline_slug}", pipeline_slug: @pipeline.slug)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "delete") %>
|
{dgettext("actions", "delete")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="hr" />
|
<hr class="hr" />
|
||||||
|
|
||||||
<h2 class="self-center pt-2 text-lg">
|
<h2 class="self-center pt-2 text-lg">
|
||||||
<%= gettext("steps:") %>
|
{gettext("steps:")}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<%= if @steps |> Enum.empty?() do %>
|
<%= if @steps |> Enum.empty?() do %>
|
||||||
<h3 class="self-center text-md text-primary-600">
|
<h3 class="self-center text-md text-primary-600">
|
||||||
<%= gettext("no steps") %>
|
{gettext("no steps")}
|
||||||
</h3>
|
</h3>
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= for %{id: step_id, position: position, title: title} = step <- @steps do %>
|
<%= for %{id: step_id, position: position, title: title} = step <- @steps do %>
|
||||||
<div class="flex justify-between items-center space-x-4">
|
<div class="flex justify-between items-center space-x-4">
|
||||||
<h3 class="text-md">
|
<h3 class="text-md">
|
||||||
<%= gettext("%{position}. %{title}", position: position + 1, title: title) %>
|
{gettext("%{position}. %{title}", position: position + 1, title: title)}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<%= if @current_user do %>
|
<%= if @current_user do %>
|
||||||
@ -98,7 +98,7 @@
|
|||||||
patch={~p"/pipeline/#{@pipeline}/#{step_id}"}
|
patch={~p"/pipeline/#{@pipeline}/#{step_id}"}
|
||||||
aria-label={dgettext("actions", "edit %{step_title}", step_title: step.title)}
|
aria-label={dgettext("actions", "edit %{step_title}", step_title: step.title)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "edit") %>
|
{dgettext("actions", "edit")}
|
||||||
</.link>
|
</.link>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
@ -109,7 +109,7 @@
|
|||||||
data-confirm={dgettext("prompts", "are you sure?")}
|
data-confirm={dgettext("prompts", "are you sure?")}
|
||||||
aria-label={dgettext("actions", "delete %{step_title}", step_title: step.title)}
|
aria-label={dgettext("actions", "delete %{step_title}", step_title: step.title)}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "delete") %>
|
{dgettext("actions", "delete")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
@ -124,7 +124,7 @@
|
|||||||
class="self-end btn btn-primary"
|
class="self-end btn btn-primary"
|
||||||
patch={~p"/pipeline/#{@pipeline}/add_step"}
|
patch={~p"/pipeline/#{@pipeline}/add_step"}
|
||||||
>
|
>
|
||||||
<%= dgettext("actions", "add step") %>
|
{dgettext("actions", "add step")}
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -9,17 +9,17 @@
|
|||||||
phx-hook="CtrlEnter"
|
phx-hook="CtrlEnter"
|
||||||
class="flex flex-col justify-start items-stretch space-y-4"
|
class="flex flex-col justify-start items-stretch space-y-4"
|
||||||
>
|
>
|
||||||
<%= text_input(f, :title,
|
{text_input(f, :title,
|
||||||
aria_label: gettext("title"),
|
aria_label: gettext("title"),
|
||||||
class: "input input-primary",
|
class: "input input-primary",
|
||||||
phx_debounce: 300,
|
phx_debounce: 300,
|
||||||
phx_hook: "SanitizeTitles",
|
phx_hook: "SanitizeTitles",
|
||||||
placeholder: gettext("title"),
|
placeholder: gettext("title"),
|
||||||
required: true
|
required: true
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :title) %>
|
{error_tag(f, :title)}
|
||||||
|
|
||||||
<%= textarea(f, :content,
|
{textarea(f, :content,
|
||||||
id: "step-form-content",
|
id: "step-form-content",
|
||||||
class: "input input-primary h-64 min-h-64",
|
class: "input input-primary h-64 min-h-64",
|
||||||
phx_update: "ignore",
|
phx_update: "ignore",
|
||||||
@ -32,14 +32,14 @@
|
|||||||
"use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
"use [[[note-slug]]] to link to a note or use [[context-slug]] to link to a context or [pipeline-slug] to link to a pipeline"
|
||||||
),
|
),
|
||||||
phx_debounce: 300
|
phx_debounce: 300
|
||||||
) %>
|
)}
|
||||||
<%= error_tag(f, :content) %>
|
{error_tag(f, :content)}
|
||||||
|
|
||||||
<div class="flex justify-center items-stretch space-x-4">
|
<div class="flex justify-center items-stretch space-x-4">
|
||||||
<%= submit(dgettext("actions", "save"),
|
{submit(dgettext("actions", "save"),
|
||||||
phx_disable_with: gettext("saving..."),
|
phx_disable_with: gettext("saving..."),
|
||||||
class: "mx-auto btn btn-primary"
|
class: "mx-auto btn btn-primary"
|
||||||
) %>
|
)}
|
||||||
</div>
|
</div>
|
||||||
</.form>
|
</.form>
|
||||||
</div>
|
</div>
|
||||||
|
37
mix.exs
37
mix.exs
@ -4,8 +4,8 @@ defmodule Memex.MixProject do
|
|||||||
def project do
|
def project do
|
||||||
[
|
[
|
||||||
app: :memex,
|
app: :memex,
|
||||||
version: "0.1.19",
|
version: "0.1.20",
|
||||||
elixir: "1.18.1",
|
elixir: "1.18.3",
|
||||||
elixirc_paths: elixirc_paths(Mix.env()),
|
elixirc_paths: elixirc_paths(Mix.env()),
|
||||||
start_permanent: Mix.env() == :prod,
|
start_permanent: Mix.env() == :prod,
|
||||||
aliases: aliases(),
|
aliases: aliases(),
|
||||||
@ -46,13 +46,15 @@ defmodule Memex.MixProject do
|
|||||||
# Type `mix help deps` for examples and options.
|
# Type `mix help deps` for examples and options.
|
||||||
defp deps do
|
defp deps do
|
||||||
[
|
[
|
||||||
|
{:bandit, "~> 1.5"},
|
||||||
{:bcrypt_elixir, "~> 3.0"},
|
{:bcrypt_elixir, "~> 3.0"},
|
||||||
{:credo, "~> 1.5", only: [:dev, :test], runtime: false},
|
{:credo, "~> 1.5", only: [:dev, :test], runtime: false},
|
||||||
{:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false},
|
{:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false},
|
||||||
|
{:dns_cluster, "~> 0.2"},
|
||||||
{:ecto_psql_extras, "~> 0.6"},
|
{:ecto_psql_extras, "~> 0.6"},
|
||||||
{:ecto_sql, "~> 3.6"},
|
{:ecto_sql, "~> 3.6"},
|
||||||
{:eqrcode, "~> 0.1.10"},
|
{:eqrcode, "~> 0.2"},
|
||||||
# {:esbuild, "~> 0.3", runtime: Mix.env() == :dev},
|
{:esbuild, "~> 0.8", runtime: Mix.env() == :dev},
|
||||||
{:ex_doc, "~> 0.27", only: :dev, runtime: false},
|
{:ex_doc, "~> 0.27", only: :dev, runtime: false},
|
||||||
{:floki, ">= 0.30.0", only: :test},
|
{:floki, ">= 0.30.0", only: :test},
|
||||||
{:gen_smtp, "~> 1.0"},
|
{:gen_smtp, "~> 1.0"},
|
||||||
@ -62,14 +64,15 @@ defmodule Memex.MixProject do
|
|||||||
{:phoenix_ecto, "~> 4.4"},
|
{:phoenix_ecto, "~> 4.4"},
|
||||||
{:phoenix_html_helpers, "~> 1.0"},
|
{:phoenix_html_helpers, "~> 1.0"},
|
||||||
{:phoenix_html, "~> 4.0"},
|
{:phoenix_html, "~> 4.0"},
|
||||||
{:phoenix_live_dashboard, "~> 0.8"},
|
{:phoenix_live_dashboard, "~> 0.8.3"},
|
||||||
{:phoenix_live_reload, "~> 1.2", only: :dev},
|
{:phoenix_live_reload, "~> 1.2", only: :dev},
|
||||||
{:phoenix_live_view, "~> 0.20.0"},
|
{:phoenix_live_view, "~> 1.0.0"},
|
||||||
{:phoenix, "~> 1.7.11"},
|
{:phoenix, "~> 1.7.19"},
|
||||||
{:plug_cowboy, "~> 2.7.0"},
|
{:plug_cowboy, "~> 2.7.0"},
|
||||||
{:postgrex, ">= 0.0.0"},
|
{:postgrex, ">= 0.0.0"},
|
||||||
{:swoosh, "~> 1.6"},
|
{:swoosh, "~> 1.6"},
|
||||||
{:telemetry_metrics, "~> 0.6"},
|
{:tailwind, "~> 0.2", runtime: Mix.env() == :dev},
|
||||||
|
{:telemetry_metrics, "~> 1.1"},
|
||||||
{:telemetry_poller, "~> 1.0"}
|
{:telemetry_poller, "~> 1.0"}
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
@ -82,17 +85,23 @@ defmodule Memex.MixProject do
|
|||||||
# See the documentation for `Mix` for more info on aliases.
|
# See the documentation for `Mix` for more info on aliases.
|
||||||
defp aliases do
|
defp aliases do
|
||||||
[
|
[
|
||||||
setup: ["deps.get", "compile", "ecto.setup", "cmd npm install --prefix assets"],
|
"assets.build": ["tailwind memex", "esbuild memex"],
|
||||||
"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
|
"assets.deploy": [
|
||||||
|
"tailwind memex --minify",
|
||||||
|
"esbuild memex --minify",
|
||||||
|
"phx.digest"
|
||||||
|
],
|
||||||
|
"assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
|
||||||
"ecto.reset": ["ecto.drop", "ecto.setup"],
|
"ecto.reset": ["ecto.drop", "ecto.setup"],
|
||||||
|
"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
|
||||||
"format.all": [
|
"format.all": [
|
||||||
"cmd npm run format --prefix assets",
|
"assets.build",
|
||||||
"format",
|
"format",
|
||||||
"gettext.extract --merge",
|
"gettext.extract --merge",
|
||||||
"gettext.merge --no-fuzzy priv/gettext"
|
"gettext.merge --no-fuzzy priv/gettext"
|
||||||
],
|
],
|
||||||
"test.all": [
|
"test.all": [
|
||||||
"cmd npm run test --prefix assets",
|
"assets.build",
|
||||||
"dialyzer",
|
"dialyzer",
|
||||||
"credo --strict",
|
"credo --strict",
|
||||||
"format --check-formatted",
|
"format --check-formatted",
|
||||||
@ -101,7 +110,9 @@ defmodule Memex.MixProject do
|
|||||||
"ecto.create --quiet",
|
"ecto.create --quiet",
|
||||||
"ecto.migrate --quiet",
|
"ecto.migrate --quiet",
|
||||||
"test"
|
"test"
|
||||||
]
|
],
|
||||||
|
setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"],
|
||||||
|
test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"]
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
46
mix.lock
46
mix.lock
@ -1,54 +1,60 @@
|
|||||||
%{
|
%{
|
||||||
|
"bandit": {:hex, :bandit, "1.6.11", "2fbadd60c95310eefb4ba7f1e58810aa8956e18c664a3b2029d57edb7d28d410", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "543f3f06b4721619a1220bed743aa77bf7ecc9c093ba9fab9229ff6b99eacc65"},
|
||||||
"bcrypt_elixir": {:hex, :bcrypt_elixir, "3.2.1", "e361261a0401d82dadc1ab7b969f91d250bf7577283e933fe8c5b72f8f5b3c46", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "81170177d5c2e280d12141a0b9d9e299bf731535e2d959982bdcd4cfe3c82865"},
|
"bcrypt_elixir": {:hex, :bcrypt_elixir, "3.2.1", "e361261a0401d82dadc1ab7b969f91d250bf7577283e933fe8c5b72f8f5b3c46", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "81170177d5c2e280d12141a0b9d9e299bf731535e2d959982bdcd4cfe3c82865"},
|
||||||
"bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
|
"bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
|
||||||
"castore": {:hex, :castore, "1.0.11", "4bbd584741601eb658007339ea730b082cc61f3554cf2e8f39bf693a11b49073", [:mix], [], "hexpm", "e03990b4db988df56262852f20de0f659871c35154691427a5047f4967a16a62"},
|
"castore": {:hex, :castore, "1.0.12", "053f0e32700cbec356280c0e835df425a3be4bc1e0627b714330ad9d0f05497f", [:mix], [], "hexpm", "3dca286b2186055ba0c9449b4e95b97bf1b57b47c1f2644555879e659960c224"},
|
||||||
"comeonin": {:hex, :comeonin, "5.5.1", "5113e5f3800799787de08a6e0db307133850e635d34e9fab23c70b6501669510", [:mix], [], "hexpm", "65aac8f19938145377cee73973f192c5645873dcf550a8a6b18187d17c13ccdb"},
|
"comeonin": {:hex, :comeonin, "5.5.1", "5113e5f3800799787de08a6e0db307133850e635d34e9fab23c70b6501669510", [:mix], [], "hexpm", "65aac8f19938145377cee73973f192c5645873dcf550a8a6b18187d17c13ccdb"},
|
||||||
"cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"},
|
"cowboy": {:hex, :cowboy, "2.13.0", "09d770dd5f6a22cc60c071f432cd7cb87776164527f205c5a6b0f24ff6b38990", [:make, :rebar3], [{:cowlib, ">= 2.14.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "e724d3a70995025d654c1992c7b11dbfea95205c047d86ff9bf1cda92ddc5614"},
|
||||||
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
|
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
|
||||||
"cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"},
|
"cowlib": {:hex, :cowlib, "2.14.0", "623791c56c1cc9df54a71a9c55147a401549917f00a2e48a6ae12b812c586ced", [:make, :rebar3], [], "hexpm", "0af652d1550c8411c3b58eed7a035a7fb088c0b86aff6bc504b0bc3b7f791aa2"},
|
||||||
"credo": {:hex, :credo, "1.7.11", "d3e805f7ddf6c9c854fd36f089649d7cf6ba74c42bc3795d587814e3c9847102", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "56826b4306843253a66e47ae45e98e7d284ee1f95d53d1612bb483f88a8cf219"},
|
"credo": {:hex, :credo, "1.7.11", "d3e805f7ddf6c9c854fd36f089649d7cf6ba74c42bc3795d587814e3c9847102", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "56826b4306843253a66e47ae45e98e7d284ee1f95d53d1612bb483f88a8cf219"},
|
||||||
"db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"},
|
"db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"},
|
||||||
"decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"},
|
"decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"},
|
||||||
"dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"},
|
"dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"},
|
||||||
"earmark_parser": {:hex, :earmark_parser, "1.4.43", "34b2f401fe473080e39ff2b90feb8ddfeef7639f8ee0bbf71bb41911831d77c5", [:mix], [], "hexpm", "970a3cd19503f5e8e527a190662be2cee5d98eed1ff72ed9b3d1a3d466692de8"},
|
"dns_cluster": {:hex, :dns_cluster, "0.2.0", "aa8eb46e3bd0326bd67b84790c561733b25c5ba2fe3c7e36f28e88f384ebcb33", [:mix], [], "hexpm", "ba6f1893411c69c01b9e8e8f772062535a4cf70f3f35bcc964a324078d8c8240"},
|
||||||
|
"earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"},
|
||||||
"ecto": {:hex, :ecto, "3.12.5", "4a312960ce612e17337e7cefcf9be45b95a3be6b36b6f94dfb3d8c361d631866", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6eb18e80bef8bb57e17f5a7f068a1719fbda384d40fc37acb8eb8aeca493b6ea"},
|
"ecto": {:hex, :ecto, "3.12.5", "4a312960ce612e17337e7cefcf9be45b95a3be6b36b6f94dfb3d8c361d631866", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6eb18e80bef8bb57e17f5a7f068a1719fbda384d40fc37acb8eb8aeca493b6ea"},
|
||||||
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.8.6", "9a4f25ba493ac111ae9e7bea2876f4deb1110c5d68a3e22092257be074fccaa0", [:mix], [{:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "> 0.16.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1 or ~> 4.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "5f615ab7e64ca452c107410d2d8f2e6c8330c520c581302cd1c770e65668cf6c"},
|
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.8.7", "49943fe6bce07281fe3adfc2a23d3794e2acc644dfe98411cb5712ffecb6ad1a", [:mix], [{:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "> 0.16.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1 or ~> 4.0", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "ac0a0bce57ffe36b30fac2a2d0d427b04de016e6af5db6f4b41afa1241f39cda"},
|
||||||
"ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"},
|
"ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"},
|
||||||
"elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"},
|
"elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"},
|
||||||
"eqrcode": {:hex, :eqrcode, "0.1.10", "6294fece9d68ad64eef1c3c92cf111cfd6469f4fbf230a2d4cc905a682178f3f", [:mix], [], "hexpm", "da30e373c36a0fd37ab6f58664b16029919896d6c45a68a95cc4d713e81076f1"},
|
"eqrcode": {:hex, :eqrcode, "0.2.1", "d12838813e8fc87b8940cc05f9baadb189031f6009facdc56ff074375ec73b6e", [:mix], [], "hexpm", "d5828a222b904c68360e7dc2a40c3ef33a1328b7c074583898040f389f928025"},
|
||||||
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
|
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
|
||||||
"ex_doc": {:hex, :ex_doc, "0.37.1", "65ca30d242082b95aa852b3b73c9d9914279fff56db5dc7b3859be5504417980", [:mix], [{:earmark_parser, "~> 1.4.42", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "6774f75477733ea88ce861476db031f9399c110640752ca2b400dbbb50491224"},
|
"esbuild": {:hex, :esbuild, "0.9.0", "f043eeaca4932ca8e16e5429aebd90f7766f31ac160a25cbd9befe84f2bc068f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b415027f71d5ab57ef2be844b2a10d0c1b5a492d431727f43937adce22ba45ae"},
|
||||||
|
"ex_doc": {:hex, :ex_doc, "0.37.3", "f7816881a443cd77872b7d6118e8a55f547f49903aef8747dbcb345a75b462f9", [:mix], [{:earmark_parser, "~> 1.4.42", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "e6aebca7156e7c29b5da4daa17f6361205b2ae5f26e5c7d8ca0d3f7e18972233"},
|
||||||
"expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"},
|
"expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"},
|
||||||
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
|
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
|
||||||
"floki": {:hex, :floki, "0.37.0", "b83e0280bbc6372f2a403b2848013650b16640cd2470aea6701f0632223d719e", [:mix], [], "hexpm", "516a0c15a69f78c47dc8e0b9b3724b29608aa6619379f91b1ffa47109b5d0dd3"},
|
"floki": {:hex, :floki, "0.37.1", "d7aaee758c8a5b4a7495799a4260754fec5530d95b9c383c03b27359dea117cf", [:mix], [], "hexpm", "673d040cb594d31318d514590246b6dd587ed341d3b67e17c1c0eb8ce7ca6f04"},
|
||||||
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
|
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
|
||||||
"gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"},
|
"gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"},
|
||||||
|
"hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"},
|
||||||
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
|
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
|
||||||
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
|
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
|
||||||
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
|
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
|
||||||
"makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"},
|
"makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"},
|
||||||
"mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
|
"mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
|
||||||
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
|
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
|
||||||
"oban": {:hex, :oban, "2.19.1", "fc376dcb04782973e384ce675539271363eef65222b23b2a8611e78c0744e5f7", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5f27ba9e79b9af623dacd79d597504176e8a7d24f3f8b5570ead2f6cedd3c5ec"},
|
"oban": {:hex, :oban, "2.19.4", "045adb10db1161dceb75c254782f97cdc6596e7044af456a59decb6d06da73c1", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5fcc6219e6464525b808d97add17896e724131f498444a292071bf8991c99f97"},
|
||||||
"phoenix": {:hex, :phoenix, "1.7.19", "36617efe5afbd821099a8b994ff4618a340a5bfb25531a1802c4d4c634017a57", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "ba4dc14458278773f905f8ae6c2ec743d52c3a35b6b353733f64f02dfe096cd6"},
|
"phoenix": {:hex, :phoenix, "1.7.21", "14ca4f1071a5f65121217d6b57ac5712d1857e40a0833aff7a691b7870fc9a3b", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "336dce4f86cba56fed312a7d280bf2282c720abb6074bdb1b61ec8095bdd0bc9"},
|
||||||
"phoenix_ecto": {:hex, :phoenix_ecto, "4.6.3", "f686701b0499a07f2e3b122d84d52ff8a31f5def386e03706c916f6feddf69ef", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "909502956916a657a197f94cc1206d9a65247538de8a5e186f7537c895d95764"},
|
"phoenix_ecto": {:hex, :phoenix_ecto, "4.6.3", "f686701b0499a07f2e3b122d84d52ff8a31f5def386e03706c916f6feddf69ef", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "909502956916a657a197f94cc1206d9a65247538de8a5e186f7537c895d95764"},
|
||||||
"phoenix_html": {:hex, :phoenix_html, "4.2.0", "83a4d351b66f472ebcce242e4ae48af1b781866f00ef0eb34c15030d4e2069ac", [:mix], [], "hexpm", "9713b3f238d07043583a94296cc4bbdceacd3b3a6c74667f4df13971e7866ec8"},
|
"phoenix_html": {:hex, :phoenix_html, "4.2.1", "35279e2a39140068fc03f8874408d58eef734e488fc142153f055c5454fd1c08", [:mix], [], "hexpm", "cff108100ae2715dd959ae8f2a8cef8e20b593f8dfd031c9cba92702cf23e053"},
|
||||||
"phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"},
|
"phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"},
|
||||||
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.6", "7b1f0327f54c9eb69845fd09a77accf922f488c549a7e7b8618775eb603a62c7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "1681ab813ec26ca6915beb3414aa138f298e17721dc6a2bde9e6eb8a62360ff6"},
|
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.6", "7b1f0327f54c9eb69845fd09a77accf922f488c549a7e7b8618775eb603a62c7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "1681ab813ec26ca6915beb3414aa138f298e17721dc6a2bde9e6eb8a62360ff6"},
|
||||||
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"},
|
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"},
|
||||||
"phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"},
|
"phoenix_live_view": {:hex, :phoenix_live_view, "1.0.9", "4dc5e535832733df68df22f9de168b11c0c74bca65b27b088a10ac36dfb75d04", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1dccb04ec8544340e01608e108f32724458d0ac4b07e551406b3b920c40ba2e5"},
|
||||||
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
|
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
|
||||||
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
|
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
|
||||||
"plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
|
"plug": {:hex, :plug, "1.17.0", "a0832e7af4ae0f4819e0c08dd2e7482364937aea6a8a997a679f2cbb7e026b2e", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6692046652a69a00a5a21d0b7e11fcf401064839d59d6b8787f23af55b1e6bc"},
|
||||||
"plug_cowboy": {:hex, :plug_cowboy, "2.7.2", "fdadb973799ae691bf9ecad99125b16625b1c6039999da5fe544d99218e662e4", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "245d8a11ee2306094840c000e8816f0cbed69a23fc0ac2bcf8d7835ae019bb2f"},
|
"plug_cowboy": {:hex, :plug_cowboy, "2.7.3", "1304d36752e8bdde213cea59ef424ca932910a91a07ef9f3874be709c4ddb94b", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "77c95524b2aa5364b247fa17089029e73b951ebc1adeef429361eab0bb55819d"},
|
||||||
"plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},
|
"plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"},
|
||||||
"postgrex": {:hex, :postgrex, "0.20.0", "363ed03ab4757f6bc47942eff7720640795eb557e1935951c1626f0d303a3aed", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "d36ef8b36f323d29505314f704e21a1a038e2dc387c6409ee0cd24144e187c0f"},
|
"postgrex": {:hex, :postgrex, "0.20.0", "363ed03ab4757f6bc47942eff7720640795eb557e1935951c1626f0d303a3aed", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "d36ef8b36f323d29505314f704e21a1a038e2dc387c6409ee0cd24144e187c0f"},
|
||||||
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
|
"ranch": {:hex, :ranch, "2.2.0", "25528f82bc8d7c6152c57666ca99ec716510fe0925cb188172f41ce93117b1b0", [:make, :rebar3], [], "hexpm", "fa0b99a1780c80218a4197a59ea8d3bdae32fbff7e88527d7d8a4787eff4f8e7"},
|
||||||
"swoosh": {:hex, :swoosh, "1.17.10", "3bfce0e716f92c85579c8b7bb390f1d287f388e4961bfb9343fe191ec4214225", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "277f86c249089f4fc7d70944987151b76424fac1d348d40685008ba88e0a2717"},
|
"swoosh": {:hex, :swoosh, "1.18.4", "5f5f325cfbc68d454f1606421f2dd02d1b20fd03e10905e9728b26662ae01f1d", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c8b45e6f9109bdf89f3d83f810e0cc97c1c971925e72fc4f47da42959d8487ee"},
|
||||||
"table_rex": {:hex, :table_rex, "4.0.0", "3c613a68ebdc6d4d1e731bc973c233500974ec3993c99fcdabb210407b90959b", [:mix], [], "hexpm", "c35c4d5612ca49ebb0344ea10387da4d2afe278387d4019e4d8111e815df8f55"},
|
"table_rex": {:hex, :table_rex, "4.1.0", "fbaa8b1ce154c9772012bf445bfb86b587430fb96f3b12022d3f35ee4a68c918", [:mix], [], "hexpm", "95932701df195d43bc2d1c6531178fc8338aa8f38c80f098504d529c43bc2601"},
|
||||||
|
"tailwind": {:hex, :tailwind, "0.3.1", "a89d2835c580748c7a975ad7dd3f2ea5e63216dc16d44f9df492fbd12c094bed", [:mix], [], "hexpm", "98a45febdf4a87bc26682e1171acdedd6317d0919953c353fcd1b4f9f4b676a2"},
|
||||||
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
|
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
|
||||||
"telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"},
|
"telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"},
|
||||||
"telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"},
|
"telemetry_poller": {:hex, :telemetry_poller, "1.2.0", "ba82e333215aed9dd2096f93bd1d13ae89d249f82760fcada0850ba33bac154b", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7216e21a6c326eb9aa44328028c34e9fd348fb53667ca837be59d0aa2a0156e8"},
|
||||||
|
"thousand_island": {:hex, :thousand_island, "1.3.12", "590ff651a6d2a59ed7eabea398021749bdc664e2da33e0355e6c64e7e1a2ef93", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "55d0b1c868b513a7225892b8a8af0234d7c8981a51b0740369f3125f7c99a549"},
|
||||||
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
|
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
|
||||||
"websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"},
|
"websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"},
|
||||||
}
|
}
|
||||||
|
@ -409,8 +409,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:5
|
#: lib/memex_web/components/core_components/topbar.html.heex:5
|
||||||
#: lib/memex_web/components/layouts.ex:15
|
#: lib/memex_web/components/layouts.ex:15
|
||||||
|
#: lib/memex_web/components/layouts/root.html.heex:7
|
||||||
#: lib/memex_web/components/layouts/root.html.heex:8
|
#: lib/memex_web/components/layouts/root.html.heex:8
|
||||||
#: lib/memex_web/components/layouts/root.html.heex:9
|
|
||||||
#: lib/memex_web/controllers/error_html/error.html.heex:8
|
#: lib/memex_web/controllers/error_html/error.html.heex:8
|
||||||
#: lib/memex_web/live/home_live.html.heex:3
|
#: lib/memex_web/live/home_live.html.heex:3
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
|
@ -26,32 +26,32 @@ msgstr ""
|
|||||||
msgid "You must confirm your account and log in to access this page."
|
msgid "You must confirm your account and log in to access this page."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:144
|
#: lib/memex/accounts/user.ex:140
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "did not change"
|
msgid "did not change"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:165
|
#: lib/memex/accounts/user.ex:161
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "does not match password"
|
msgid "does not match password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:202
|
#: lib/memex/accounts/user.ex:200
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "is not valid"
|
msgid "is not valid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:99
|
#: lib/memex/accounts/user.ex:95
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "must have the @ sign and no spaces"
|
msgid "must have the @ sign and no spaces"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:58
|
#: lib/memex/contexts/context.ex:53
|
||||||
#: lib/memex/contexts/context.ex:72
|
#: lib/memex/contexts/context.ex:67
|
||||||
#: lib/memex/notes/note.ex:57
|
#: lib/memex/notes/note.ex:52
|
||||||
#: lib/memex/notes/note.ex:71
|
#: lib/memex/notes/note.ex:66
|
||||||
#: lib/memex/pipelines/pipeline.ex:60
|
#: lib/memex/pipelines/pipeline.ex:56
|
||||||
#: lib/memex/pipelines/pipeline.ex:74
|
#: lib/memex/pipelines/pipeline.ex:70
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -140,9 +140,9 @@ msgstr ""
|
|||||||
msgid "user confirmation link is invalid or it has expired."
|
msgid "user confirmation link is invalid or it has expired."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:85
|
#: lib/memex/contexts/context.ex:80
|
||||||
#: lib/memex/notes/note.ex:84
|
#: lib/memex/notes/note.ex:79
|
||||||
#: lib/memex/pipelines/pipeline.ex:87
|
#: lib/memex/pipelines/pipeline.ex:83
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -407,8 +407,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:5
|
#: lib/memex_web/components/core_components/topbar.html.heex:5
|
||||||
#: lib/memex_web/components/layouts.ex:15
|
#: lib/memex_web/components/layouts.ex:15
|
||||||
|
#: lib/memex_web/components/layouts/root.html.heex:7
|
||||||
#: lib/memex_web/components/layouts/root.html.heex:8
|
#: lib/memex_web/components/layouts/root.html.heex:8
|
||||||
#: lib/memex_web/components/layouts/root.html.heex:9
|
|
||||||
#: lib/memex_web/controllers/error_html/error.html.heex:8
|
#: lib/memex_web/controllers/error_html/error.html.heex:8
|
||||||
#: lib/memex_web/live/home_live.html.heex:3
|
#: lib/memex_web/live/home_live.html.heex:3
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
|
@ -408,8 +408,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/memex_web/components/core_components/topbar.html.heex:5
|
#: lib/memex_web/components/core_components/topbar.html.heex:5
|
||||||
#: lib/memex_web/components/layouts.ex:15
|
#: lib/memex_web/components/layouts.ex:15
|
||||||
|
#: lib/memex_web/components/layouts/root.html.heex:7
|
||||||
#: lib/memex_web/components/layouts/root.html.heex:8
|
#: lib/memex_web/components/layouts/root.html.heex:8
|
||||||
#: lib/memex_web/components/layouts/root.html.heex:9
|
|
||||||
#: lib/memex_web/controllers/error_html/error.html.heex:8
|
#: lib/memex_web/controllers/error_html/error.html.heex:8
|
||||||
#: lib/memex_web/live/home_live.html.heex:3
|
#: lib/memex_web/live/home_live.html.heex:3
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
|
@ -27,32 +27,32 @@ msgstr ""
|
|||||||
msgid "You must confirm your account and log in to access this page."
|
msgid "You must confirm your account and log in to access this page."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:144
|
#: lib/memex/accounts/user.ex:140
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "did not change"
|
msgid "did not change"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:165
|
#: lib/memex/accounts/user.ex:161
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "does not match password"
|
msgid "does not match password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:202
|
#: lib/memex/accounts/user.ex:200
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "is not valid"
|
msgid "is not valid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:99
|
#: lib/memex/accounts/user.ex:95
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "must have the @ sign and no spaces"
|
msgid "must have the @ sign and no spaces"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:58
|
#: lib/memex/contexts/context.ex:53
|
||||||
#: lib/memex/contexts/context.ex:72
|
#: lib/memex/contexts/context.ex:67
|
||||||
#: lib/memex/notes/note.ex:57
|
#: lib/memex/notes/note.ex:52
|
||||||
#: lib/memex/notes/note.ex:71
|
#: lib/memex/notes/note.ex:66
|
||||||
#: lib/memex/pipelines/pipeline.ex:60
|
#: lib/memex/pipelines/pipeline.ex:56
|
||||||
#: lib/memex/pipelines/pipeline.ex:74
|
#: lib/memex/pipelines/pipeline.ex:70
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -141,9 +141,9 @@ msgstr ""
|
|||||||
msgid "user confirmation link is invalid or it has expired."
|
msgid "user confirmation link is invalid or it has expired."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:85
|
#: lib/memex/contexts/context.ex:80
|
||||||
#: lib/memex/notes/note.ex:84
|
#: lib/memex/notes/note.ex:79
|
||||||
#: lib/memex/pipelines/pipeline.ex:87
|
#: lib/memex/pipelines/pipeline.ex:83
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -26,32 +26,32 @@ msgstr ""
|
|||||||
msgid "You must confirm your account and log in to access this page."
|
msgid "You must confirm your account and log in to access this page."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:144
|
#: lib/memex/accounts/user.ex:140
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "did not change"
|
msgid "did not change"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:165
|
#: lib/memex/accounts/user.ex:161
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "does not match password"
|
msgid "does not match password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:202
|
#: lib/memex/accounts/user.ex:200
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "is not valid"
|
msgid "is not valid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/accounts/user.ex:99
|
#: lib/memex/accounts/user.ex:95
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "must have the @ sign and no spaces"
|
msgid "must have the @ sign and no spaces"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:58
|
#: lib/memex/contexts/context.ex:53
|
||||||
#: lib/memex/contexts/context.ex:72
|
#: lib/memex/contexts/context.ex:67
|
||||||
#: lib/memex/notes/note.ex:57
|
#: lib/memex/notes/note.ex:52
|
||||||
#: lib/memex/notes/note.ex:71
|
#: lib/memex/notes/note.ex:66
|
||||||
#: lib/memex/pipelines/pipeline.ex:60
|
#: lib/memex/pipelines/pipeline.ex:56
|
||||||
#: lib/memex/pipelines/pipeline.ex:74
|
#: lib/memex/pipelines/pipeline.ex:70
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
msgid "invalid format: only numbers, letters and hyphen are accepted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -140,9 +140,9 @@ msgstr ""
|
|||||||
msgid "user confirmation link is invalid or it has expired."
|
msgid "user confirmation link is invalid or it has expired."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/memex/contexts/context.ex:85
|
#: lib/memex/contexts/context.ex:80
|
||||||
#: lib/memex/notes/note.ex:84
|
#: lib/memex/notes/note.ex:79
|
||||||
#: lib/memex/pipelines/pipeline.ex:87
|
#: lib/memex/pipelines/pipeline.ex:83
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
msgid "invalid format: only numbers, letters and hyphen are accepted. tags must be comma or space delimited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
BIN
priv/static/webfonts/fa-brands-400.ttf
Normal file
BIN
priv/static/webfonts/fa-brands-400.ttf
Normal file
Binary file not shown.
BIN
priv/static/webfonts/fa-brands-400.woff2
Normal file
BIN
priv/static/webfonts/fa-brands-400.woff2
Normal file
Binary file not shown.
BIN
priv/static/webfonts/fa-regular-400.ttf
Normal file
BIN
priv/static/webfonts/fa-regular-400.ttf
Normal file
Binary file not shown.
BIN
priv/static/webfonts/fa-regular-400.woff2
Normal file
BIN
priv/static/webfonts/fa-regular-400.woff2
Normal file
Binary file not shown.
BIN
priv/static/webfonts/fa-solid-900.ttf
Normal file
BIN
priv/static/webfonts/fa-solid-900.ttf
Normal file
Binary file not shown.
BIN
priv/static/webfonts/fa-solid-900.woff2
Normal file
BIN
priv/static/webfonts/fa-solid-900.woff2
Normal file
Binary file not shown.
BIN
priv/static/webfonts/fa-v4compatibility.ttf
Normal file
BIN
priv/static/webfonts/fa-v4compatibility.ttf
Normal file
Binary file not shown.
BIN
priv/static/webfonts/fa-v4compatibility.woff2
Normal file
BIN
priv/static/webfonts/fa-v4compatibility.woff2
Normal file
Binary file not shown.
@ -49,6 +49,8 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
assert index_live |> element("a", "new context") |> render_click() =~ "new context"
|
assert index_live |> element("a", "new context") |> render_click() =~ "new context"
|
||||||
assert_patch(index_live, ~p"/contexts/new")
|
assert_patch(index_live, ~p"/contexts/new")
|
||||||
|
|
||||||
|
{:ok, index_live, _html} = live(conn, ~p"/contexts/new")
|
||||||
|
|
||||||
assert index_live
|
assert index_live
|
||||||
|> form("#context-form")
|
|> form("#context-form")
|
||||||
|> render_change(context: @invalid_attrs) =~ "can't be blank"
|
|> render_change(context: @invalid_attrs) =~ "can't be blank"
|
||||||
@ -71,6 +73,8 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
|
|
||||||
assert_patch(index_live, ~p"/contexts/#{context}/edit")
|
assert_patch(index_live, ~p"/contexts/#{context}/edit")
|
||||||
|
|
||||||
|
{:ok, index_live, _html} = live(conn, ~p"/contexts/#{context}/edit")
|
||||||
|
|
||||||
assert index_live
|
assert index_live
|
||||||
|> form("#context-form")
|
|> form("#context-form")
|
||||||
|> render_change(context: @invalid_attrs) =~ "can't be blank"
|
|> render_change(context: @invalid_attrs) =~ "can't be blank"
|
||||||
@ -108,6 +112,8 @@ defmodule MemexWeb.ContextLiveTest do
|
|||||||
assert show_live |> element("a", "edit") |> render_click() =~ "edit"
|
assert show_live |> element("a", "edit") |> render_click() =~ "edit"
|
||||||
assert_patch(show_live, ~p"/context/#{context}/edit")
|
assert_patch(show_live, ~p"/context/#{context}/edit")
|
||||||
|
|
||||||
|
{:ok, show_live, _html} = live(conn, ~p"/context/#{context}/edit")
|
||||||
|
|
||||||
html =
|
html =
|
||||||
show_live
|
show_live
|
||||||
|> form("#context-form")
|
|> form("#context-form")
|
||||||
|
@ -49,6 +49,8 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
assert index_live |> element("a", "new note") |> render_click() =~ "new note"
|
assert index_live |> element("a", "new note") |> render_click() =~ "new note"
|
||||||
assert_patch(index_live, ~p"/notes/new")
|
assert_patch(index_live, ~p"/notes/new")
|
||||||
|
|
||||||
|
{:ok, index_live, _html} = live(conn, ~p"/notes/new")
|
||||||
|
|
||||||
html =
|
html =
|
||||||
index_live
|
index_live
|
||||||
|> form("#note-form")
|
|> form("#note-form")
|
||||||
@ -75,6 +77,8 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
|
|
||||||
assert_patch(index_live, ~p"/notes/#{note}/edit")
|
assert_patch(index_live, ~p"/notes/#{note}/edit")
|
||||||
|
|
||||||
|
{:ok, index_live, _html} = live(conn, ~p"/notes/#{note}/edit")
|
||||||
|
|
||||||
assert index_live
|
assert index_live
|
||||||
|> form("#note-form")
|
|> form("#note-form")
|
||||||
|> render_change(note: @invalid_attrs) =~ "can't be blank"
|
|> render_change(note: @invalid_attrs) =~ "can't be blank"
|
||||||
@ -112,6 +116,8 @@ defmodule MemexWeb.NoteLiveTest do
|
|||||||
assert show_live |> element("a", "edit") |> render_click() =~ "edit"
|
assert show_live |> element("a", "edit") |> render_click() =~ "edit"
|
||||||
assert_patch(show_live, ~p"/note/#{note}/edit")
|
assert_patch(show_live, ~p"/note/#{note}/edit")
|
||||||
|
|
||||||
|
{:ok, show_live, _html} = live(conn, ~p"/note/#{note}/edit")
|
||||||
|
|
||||||
assert show_live
|
assert show_live
|
||||||
|> form("#note-form")
|
|> form("#note-form")
|
||||||
|> render_change(note: @invalid_attrs) =~ "can't be blank"
|
|> render_change(note: @invalid_attrs) =~ "can't be blank"
|
||||||
|
@ -62,6 +62,8 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
assert index_live |> element("a", "new pipeline") |> render_click() =~ "new pipeline"
|
assert index_live |> element("a", "new pipeline") |> render_click() =~ "new pipeline"
|
||||||
assert_patch(index_live, ~p"/pipelines/new")
|
assert_patch(index_live, ~p"/pipelines/new")
|
||||||
|
|
||||||
|
{:ok, index_live, _html} = live(conn, ~p"/pipelines/new")
|
||||||
|
|
||||||
assert index_live
|
assert index_live
|
||||||
|> form("#pipeline-form")
|
|> form("#pipeline-form")
|
||||||
|> render_change(pipeline: @invalid_attrs) =~ "can't be blank"
|
|> render_change(pipeline: @invalid_attrs) =~ "can't be blank"
|
||||||
@ -84,6 +86,8 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
|
|
||||||
assert_patch(index_live, ~p"/pipelines/#{pipeline}/edit")
|
assert_patch(index_live, ~p"/pipelines/#{pipeline}/edit")
|
||||||
|
|
||||||
|
{:ok, index_live, _html} = live(conn, ~p"/pipelines/#{pipeline}/edit")
|
||||||
|
|
||||||
assert index_live
|
assert index_live
|
||||||
|> form("#pipeline-form")
|
|> form("#pipeline-form")
|
||||||
|> render_change(pipeline: @invalid_attrs) =~ "can't be blank"
|
|> render_change(pipeline: @invalid_attrs) =~ "can't be blank"
|
||||||
@ -124,6 +128,8 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
assert show_live |> element("a", "edit") |> render_click() =~ "edit"
|
assert show_live |> element("a", "edit") |> render_click() =~ "edit"
|
||||||
assert_patch(show_live, ~p"/pipeline/#{pipeline}/edit")
|
assert_patch(show_live, ~p"/pipeline/#{pipeline}/edit")
|
||||||
|
|
||||||
|
{:ok, show_live, _html} = live(conn, ~p"/pipeline/#{pipeline}/edit")
|
||||||
|
|
||||||
html =
|
html =
|
||||||
show_live
|
show_live
|
||||||
|> form("#pipeline-form")
|
|> form("#pipeline-form")
|
||||||
@ -159,6 +165,8 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
show_live |> element("a", "add step") |> render_click()
|
show_live |> element("a", "add step") |> render_click()
|
||||||
assert_patch(show_live, ~p"/pipeline/#{pipeline}/add_step")
|
assert_patch(show_live, ~p"/pipeline/#{pipeline}/add_step")
|
||||||
|
|
||||||
|
{:ok, show_live, _html} = live(conn, ~p"/pipeline/#{pipeline}/add_step")
|
||||||
|
|
||||||
{:ok, _show_live, html} =
|
{:ok, _show_live, html} =
|
||||||
show_live
|
show_live
|
||||||
|> form("#step-form")
|
|> form("#step-form")
|
||||||
@ -196,6 +204,8 @@ defmodule MemexWeb.PipelineLiveTest do
|
|||||||
|
|
||||||
assert_patch(show_live, ~p"/pipeline/#{pipeline}/#{step.id}")
|
assert_patch(show_live, ~p"/pipeline/#{pipeline}/#{step.id}")
|
||||||
|
|
||||||
|
{:ok, show_live, _html} = live(conn, ~p"/pipeline/#{pipeline}/#{step.id}")
|
||||||
|
|
||||||
assert show_live
|
assert show_live
|
||||||
|> form("#step-form")
|
|> form("#step-form")
|
||||||
|> render_change(step: @step_invalid_attrs) =~ "can't be blank"
|
|> render_change(step: @step_invalid_attrs) =~ "can't be blank"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user