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
|
use ChiyaWeb, :controller
|
||||||
|
|
||||||
alias Chiya.Notes
|
alias Chiya.Notes
|
||||||
alias Chiya.Notes.Note
|
alias Chiya.Notes.{Note, NoteImport}
|
||||||
|
|
||||||
def index(conn, _params) do
|
def index(conn, _params) do
|
||||||
notes = Notes.list_notes()
|
notes = Notes.list_notes()
|
||||||
|
@ -95,6 +95,47 @@ defmodule ChiyaWeb.NoteController do
|
||||||
end
|
end
|
||||||
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
|
defp from_channel_ids(note_params) do
|
||||||
selected_ids = Enum.map(note_params["channels"] || [], &String.to_integer/1)
|
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"}>
|
<.link href={~p"/admin/notes/new"}>
|
||||||
<.button>New Note</.button>
|
<.button>New Note</.button>
|
||||||
</.link>
|
</.link>
|
||||||
|
<.link href={~p"/admin/notes/import"}>
|
||||||
|
<.button>Import Note</.button>
|
||||||
|
</.link>
|
||||||
</:actions>
|
</:actions>
|
||||||
</.header>
|
</.header>
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,16 @@ defmodule ChiyaWeb.NoteShowLive do
|
||||||
<:item title="Channels"><%= @channels %></:item>
|
<:item title="Channels"><%= @channels %></:item>
|
||||||
</.list>
|
</.list>
|
||||||
|
|
||||||
|
<.line />
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>File Content</summary>
|
||||||
|
<section class="prose">
|
||||||
|
<%= raw ChiyaWeb.Markdown.render(@note.content) %>
|
||||||
|
</section>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
<.line />
|
<.line />
|
||||||
|
|
||||||
<%= if !Enum.empty?(@note.images) do %>
|
<%= if !Enum.empty?(@note.images) do %>
|
||||||
|
|
|
@ -61,6 +61,9 @@ defmodule ChiyaWeb.Router do
|
||||||
resources "/settings", SettingController, singleton: true
|
resources "/settings", SettingController, singleton: true
|
||||||
resources "/identities", IdentityController
|
resources "/identities", IdentityController
|
||||||
|
|
||||||
|
get "/notes/import", NoteController, :import_prepare
|
||||||
|
post "/notes/import", NoteController, :import_run
|
||||||
|
|
||||||
live "/notes/:id", NoteShowLive, :show
|
live "/notes/:id", NoteShowLive, :show
|
||||||
get "/notes/:id/raw", NoteController, :raw
|
get "/notes/:id/raw", NoteController, :raw
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue