file import
This commit is contained in:
parent
8d9a21e94d
commit
4c0a073d3d
6 changed files with 86 additions and 1 deletions
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
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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