commit
010d9af0dc
13 changed files with 155 additions and 11 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -46,3 +46,6 @@ npm-debug.log
|
|||
|
||||
# env file
|
||||
.env
|
||||
|
||||
# elixir ls
|
||||
.elixir_ls
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
@import "tailwindcss/components";
|
||||
@import "tailwindcss/utilities";
|
||||
|
||||
@import "./reset.css";
|
||||
@import "./lolight.css";
|
||||
@import "./lightbox.css";
|
||||
|
||||
|
|
52
assets/css/reset.css
Normal file
52
assets/css/reset.css
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
1. Use a more-intuitive box-sizing model.
|
||||
*/
|
||||
*, *::before, *::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
/*
|
||||
2. Remove default margin
|
||||
*/
|
||||
* {
|
||||
margin: 0;
|
||||
}
|
||||
/*
|
||||
3. Allow percentage-based heights in the application
|
||||
*/
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
/*
|
||||
Typographic tweaks!
|
||||
4. Add accessible line-height
|
||||
5. Improve text rendering
|
||||
*/
|
||||
body {
|
||||
line-height: 1.5;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
/*
|
||||
6. Improve media defaults
|
||||
*/
|
||||
img, picture, video, canvas, svg {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
}
|
||||
/*
|
||||
7. Remove built-in form typography styles
|
||||
*/
|
||||
input, button, textarea, select {
|
||||
font: inherit;
|
||||
}
|
||||
/*
|
||||
8. Avoid text overflows
|
||||
*/
|
||||
p, h1, h2, h3, h4, h5, h6 {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
/*
|
||||
9. Create a root stacking context
|
||||
*/
|
||||
#root, #__next {
|
||||
isolation: isolate;
|
||||
}
|
13
lib/chiya/notes/note_import.ex
Normal file
13
lib/chiya/notes/note_import.ex
Normal file
|
@ -0,0 +1,13 @@
|
|||
defmodule Chiya.Notes.NoteImport do
|
||||
import Ecto.Changeset
|
||||
|
||||
defstruct [:file]
|
||||
|
||||
@types %{file: :string}
|
||||
|
||||
def change_note_import(params) do
|
||||
{%Chiya.Notes.NoteImport{}, @types}
|
||||
|> cast(params, Map.keys(@types))
|
||||
|> validate_required(:file)
|
||||
end
|
||||
end
|
|
@ -13,9 +13,7 @@
|
|||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<div class="mx-auto max-w-2xl">
|
||||
<.flash_group flash={@flash} />
|
||||
<%= @inner_content %>
|
||||
</div>
|
||||
<main class="mx-auto max-w-2xl px-4">
|
||||
<.flash_group flash={@flash} />
|
||||
<%= @inner_content %>
|
||||
</main>
|
||||
|
|
|
@ -2,7 +2,7 @@ defmodule ChiyaWeb.NoteController do
|
|||
use ChiyaWeb, :controller
|
||||
|
||||
alias Chiya.Notes
|
||||
alias Chiya.Notes.Note
|
||||
alias Chiya.Notes.{Note, NoteImport}
|
||||
|
||||
def index(conn, _params) do
|
||||
notes = Notes.list_notes()
|
||||
|
@ -95,6 +95,47 @@ defmodule ChiyaWeb.NoteController do
|
|||
end
|
||||
end
|
||||
|
||||
def import_prepare(conn, _params) do
|
||||
render(conn, :import, changeset: NoteImport.change_note_import(%{}))
|
||||
end
|
||||
|
||||
def import_run(conn, %{
|
||||
"note_import" => %{
|
||||
"file" => %{
|
||||
path: path,
|
||||
content_type: "text/markdown",
|
||||
filename: filename
|
||||
}
|
||||
}
|
||||
}) do
|
||||
case File.read(path) do
|
||||
{:ok, content} ->
|
||||
note_params = %{
|
||||
name: filename,
|
||||
content: content
|
||||
}
|
||||
|
||||
case Notes.create_note(note_params) do
|
||||
{:ok, note} ->
|
||||
conn
|
||||
|> put_flash(:info, "Note created successfully.")
|
||||
|> redirect(to: ~p"/admin/notes/#{note}")
|
||||
|
||||
{:error, %Ecto.Changeset{} = changeset} ->
|
||||
render(conn, :new, changeset: changeset, channels: to_channel_options())
|
||||
end
|
||||
|
||||
_ ->
|
||||
render(conn, :import, changeset: NoteImport.change_note_import(%{}))
|
||||
end
|
||||
end
|
||||
|
||||
def import_run(conn, _params) do
|
||||
conn
|
||||
|> put_flash(:error, "Error while importing.")
|
||||
|> redirect(to: ~p"/admin/notes")
|
||||
end
|
||||
|
||||
defp from_channel_ids(note_params) do
|
||||
selected_ids = Enum.map(note_params["channels"] || [], &String.to_integer/1)
|
||||
|
||||
|
|
15
lib/chiya_web/controllers/note_html/import.html.heex
Normal file
15
lib/chiya_web/controllers/note_html/import.html.heex
Normal file
|
@ -0,0 +1,15 @@
|
|||
<.header>
|
||||
Import
|
||||
</.header>
|
||||
|
||||
<.simple_form :let={f} for={@changeset} action={~p"/admin/notes/import"} multipart={true}>
|
||||
<.error :if={@changeset.action}>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</.error>
|
||||
|
||||
<.input field={f[:file]} type="file" label="Markdown file" accept="text/markdown, text/plain" />
|
||||
|
||||
<:actions>
|
||||
<.button>Import Note</.button>
|
||||
</:actions>
|
||||
</.simple_form>
|
|
@ -4,6 +4,9 @@
|
|||
<.link href={~p"/admin/notes/new"}>
|
||||
<.button>New Note</.button>
|
||||
</.link>
|
||||
<.link href={~p"/admin/notes/import"}>
|
||||
<.button>Import Note</.button>
|
||||
</.link>
|
||||
</:actions>
|
||||
</.header>
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
<div class="w-full mt-6 sm:w-auto">
|
||||
<div class="flex gap-4 text-sm leading-6 text-theme-base">
|
||||
<%= for identity <- @identities do %>
|
||||
<%= for identity <- @public_identities do %>
|
||||
<div>
|
||||
<a
|
||||
rel={identity.rel}
|
||||
|
@ -27,7 +27,7 @@
|
|||
<%= for note <- @channel.notes do %>
|
||||
<a
|
||||
href={~p"/#{note.slug}"}
|
||||
class="rounded-lg -mx-2 -my-0.5 px-2 py-0.5 hover:bg-theme-primary/30 transition"
|
||||
class="rounded-lg -mx-2 -my-0.5 px-2 py-0.5 hover:bg-theme-primary/10 transition"
|
||||
>
|
||||
<span class="text-theme-heading text-lg font-semibold leading-8">
|
||||
<%= note.name %>
|
||||
|
|
|
@ -3,8 +3,10 @@
|
|||
<h1 class="mt-16 text-3xl font-semibold leading-8 text-theme-heading font-serif">
|
||||
<%= @note.name %>
|
||||
</h1>
|
||||
<p class="mt-2 text-sm leading-6 text-theme-base font-semibold">
|
||||
<%= pretty_date(@note.published_at) %>
|
||||
<p class="mt-2 text-sm leading-6 text-theme-base">
|
||||
<span>Published</span> <time class="text-theme-primary font-semibold"><%= pretty_date(@note.published_at) %></time>
|
||||
<span>·</span>
|
||||
<span>Last Updated</span> <time class="text-theme-primary font-semibold"><%= pretty_date(@note.updated_at) %></time>
|
||||
</p>
|
||||
</header>
|
||||
|
||||
|
|
|
@ -8,7 +8,10 @@ defmodule ChiyaWeb.GlobalAssigns do
|
|||
|
||||
def fetch_identities(conn, _opts) do
|
||||
identities = Chiya.Identities.list_identities()
|
||||
assign(conn, :identities, identities)
|
||||
|
||||
conn
|
||||
|> assign(:identities, identities)
|
||||
|> assign(:public_identities, Enum.filter(identities, fn i -> i.public && i.active end))
|
||||
end
|
||||
|
||||
def fetch_public_channels(conn, _opts) do
|
||||
|
|
|
@ -36,6 +36,16 @@ defmodule ChiyaWeb.NoteShowLive do
|
|||
<:item title="Channels"><%= @channels %></:item>
|
||||
</.list>
|
||||
|
||||
<.line />
|
||||
|
||||
<details>
|
||||
<summary>File Content</summary>
|
||||
<section class="prose">
|
||||
<%= raw ChiyaWeb.Markdown.render(@note.content) %>
|
||||
</section>
|
||||
</details>
|
||||
|
||||
|
||||
<.line />
|
||||
|
||||
<%= if !Enum.empty?(@note.images) do %>
|
||||
|
|
|
@ -61,6 +61,9 @@ defmodule ChiyaWeb.Router do
|
|||
resources "/settings", SettingController, singleton: true
|
||||
resources "/identities", IdentityController
|
||||
|
||||
get "/notes/import", NoteController, :import_prepare
|
||||
post "/notes/import", NoteController, :import_run
|
||||
|
||||
live "/notes/:id", NoteShowLive, :show
|
||||
get "/notes/:id/raw", NoteController, :raw
|
||||
|
||||
|
|
Loading…
Reference in a new issue