Editable info paragraphs.

This commit is contained in:
codevictory
2021-06-12 00:16:35 +03:00
parent b128fea663
commit 61a2792dbe
17 changed files with 450 additions and 19 deletions

View File

@@ -114,4 +114,113 @@ defmodule Runosaari.Pages do
def change_index(%Index{} = index, attrs \\ %{}) do
Index.changeset(index, attrs)
end
alias Runosaari.Pages.Info
@doc """
Returns the list of info_paragraphs.
## Examples
iex> list_info_paragraphs()
[%Info{}, ...]
"""
def list_info_paragraphs do
Repo.all(Info)
end
@doc """
Returns the list of info_paragraphs.
## Examples
iex> list_info_paragraphs()
[%Info{}, ...]
"""
def list_sorted_info_paragraphs do
Repo.all(Info |> order_by(:seqnum))
end
@doc """
Gets a single info.
Raises `Ecto.NoResultsError` if the Info does not exist.
## Examples
iex> get_info!(123)
%Info{}
iex> get_info!(456)
** (Ecto.NoResultsError)
"""
def get_info!(id), do: Repo.get!(Info, id)
@doc """
Creates a info.
## Examples
iex> create_info(%{field: value})
{:ok, %Info{}}
iex> create_info(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_info(attrs \\ %{}) do
%Info{}
|> Info.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a info.
## Examples
iex> update_info(info, %{field: new_value})
{:ok, %Info{}}
iex> update_info(info, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_info(%Info{} = info, attrs) do
info
|> Info.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a info.
## Examples
iex> delete_info(info)
{:ok, %Info{}}
iex> delete_info(info)
{:error, %Ecto.Changeset{}}
"""
def delete_info(%Info{} = info) do
Repo.delete(info)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking info changes.
## Examples
iex> change_info(info)
%Ecto.Changeset{data: %Info{}}
"""
def change_info(%Info{} = info, attrs \\ %{}) do
Info.changeset(info, attrs)
end
end

View File

@@ -0,0 +1,18 @@
defmodule Runosaari.Pages.Info do
use Ecto.Schema
import Ecto.Changeset
schema "info_paragraphs" do
field :content, :string
field :seqnum, :integer, default: 999
timestamps()
end
@doc false
def changeset(info, attrs) do
info
|> cast(attrs, [:content, :seqnum])
|> validate_required([:content, :seqnum])
end
end

View File

@@ -0,0 +1,67 @@
defmodule RunosaariWeb.InfoController do
use RunosaariWeb, :controller
alias Runosaari.Pages
alias Runosaari.Pages.Info
def index(conn, _params) do
info_paragraphs = Pages.list_sorted_info_paragraphs()
render(conn, "index.html", info_paragraphs: info_paragraphs)
end
def admin(conn, _params) do
info_paragraphs = Pages.list_info_paragraphs()
render(conn, "admin.html", info_paragraphs: info_paragraphs)
end
def new(conn, _params) do
changeset = Pages.change_info(%Info{})
render(conn, "new.html", changeset: changeset)
end
def create(conn, %{"info" => info_params}) do
case Pages.create_info(info_params) do
{:ok, info} ->
conn
|> put_flash(:info, "Info created successfully.")
|> redirect(to: Routes.admin_info_path(conn, :admin))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def show(conn, %{"id" => id}) do
info = Pages.get_info!(id)
render(conn, "show.html", info: info)
end
def edit(conn, %{"id" => id}) do
info = Pages.get_info!(id)
changeset = Pages.change_info(info)
render(conn, "edit.html", info: info, changeset: changeset)
end
def update(conn, %{"id" => id, "info" => info_params}) do
info = Pages.get_info!(id)
case Pages.update_info(info, info_params) do
{:ok, info} ->
conn
|> put_flash(:info, "Info updated successfully.")
|> redirect(to: Routes.admin_info_path(conn, :show, info))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", info: info, changeset: changeset)
end
end
def delete(conn, %{"id" => id}) do
info = Pages.get_info!(id)
{:ok, _info} = Pages.delete_info(info)
conn
|> put_flash(:info, "Info deleted successfully.")
|> redirect(to: Routes.admin_info_path(conn, :admin))
end
end

View File

@@ -17,13 +17,13 @@ defmodule RunosaariWeb.Router do
pipe_through :browser
resources "/", IndexController, only: [:index]
get "/info", PageController, :info
get "/covid19", PageController, :covid19
get "/privacy", PageController, :privacy
resources "/performers", PerformerController, only: [:index, :show]
resources "/performances", PerformanceController, only: [:index]
resources "/visitors", VisitorController, only: [:new, :create]
get "/confirmation", VisitorController, :confirmation
resources "/info", InfoController, only: [:index]
end
scope "/admin", RunosaariWeb, as: :admin do
@@ -36,6 +36,8 @@ defmodule RunosaariWeb.Router do
resources "/performers", PerformerController, except: [:index, :show]
resources "/performances", PerformanceController, except: [:index]
resources "/visitors", VisitorController, except: [:new, :create]
resources "/info", InfoController, except: [:index]
get "/info", InfoController, :admin
end
# Other scopes may use custom stacks.

View File

@@ -1,5 +1,5 @@
<section class="main">
<h1>HALLINTA - Etusivu</h1>
<h1>HALLINTA - Etusivu<n kappaleet/h1>
<table>
<thead>
@@ -19,12 +19,12 @@
<td class="actions">
<span><%= link "Lisätietoja", to: Routes.admin_index_path(@conn, :show, index) %></span>
<span><%= link "Muokkaa", to: Routes.admin_index_path(@conn, :edit, index) %></span>
<span><%= link "Poista", to: Routes.admin_index_path(@conn, :delete, index), method: :delete, data: [confirm: "Are you sure?"] %></span>
<span><%= link "Poista", to: Routes.admin_index_path(@conn, :delete, index), method: :delete, data: [confirm: "Oletko varma?"] %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "Uusi Kappale", to: Routes.admin_index_path(@conn, :new) %></span>
<span><%= link "Uusi kappale", to: Routes.admin_index_path(@conn, :new) %></span>
</section>

View File

@@ -0,0 +1,30 @@
<section class="main">
<h1>HALLINTA - Infon kappaleet</h1>
<table>
<thead>
<tr>
<th>Sisältö</th>
<th>Prioriteetti</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for info <- @info_paragraphs do %>
<tr>
<td><%= info.content %></td>
<td><%= info.seqnum %></td>
<td class="actions">
<span><%= link "Lisätietoja", to: Routes.admin_info_path(@conn, :show, info) %></span>
<span><%= link "Muokkaa", to: Routes.admin_info_path(@conn, :edit, info) %></span>
<span><%= link "Poista", to: Routes.admin_info_path(@conn, :delete, info), method: :delete, data: [confirm: "Oletko varma?"] %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "Uusi kappale", to: Routes.admin_info_path(@conn, :new) %></span>
</section>

View File

@@ -0,0 +1,5 @@
<h1>Muokkaa kappaletta</h1>
<%= render "form.html", Map.put(assigns, :action, Routes.admin_info_path(@conn, :update, @info)) %>
<span><%= link "Takaisin", to: Routes.admin_info_path(@conn, :admin) %></span>

View File

@@ -0,0 +1,19 @@
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Jokin kentistä on tyhjä.</p>
</div>
<% end %>
<%= label f, :content, "Sisältö" %>
<%= text_input f, :content %>
<%= error_tag f, :content %>
<%= label f, :seqnum, "Prioritetti (1 on korkein)" %>
<%= number_input f, :seqnum %>
<%= error_tag f, :seqnum %>
<div>
<%= submit "Tallenna" %>
</div>
<% end %>

View File

@@ -9,18 +9,9 @@
Kirjan talo Bokens hus ry, Livonsaaren kyläyhdistys ry ja
Saaristohotelli Vaihela.
</p>
<p>
Tapahtuma tuo korkeatasoista kotimaista runoutta helposti
lähestyttävässä muodossa maaseudun uusille yleisöille, niin
paikallisille saaristolaisille kuin mökkiläisille, kutsuvieraille ja
kauempaa tulleillekin. Samalla se voimistaa paikallista
yhteisöllisyyttä ja taiteen tekemistä ja kokemista vaikeina
korona-aikoina.
</p>
<p>
Esitykset striimataan Suomeen ja mahdollisesti myös kansainvälisten
yhteistyökumppanien sivuille.
</p>
<%= for info <- @info_paragraphs do %>
<p><%= info.content %></p>
<% end %>
<p>
<b><i>Ota yhteyttä:</i></b> Inkeri Aula & Katariina Vuorinen,
<a class="generic-link" href="mailto:info@runosaari.net">info@runosaari.net</a>

View File

@@ -0,0 +1,5 @@
<h1>New Info</h1>
<%= render "form.html", Map.put(assigns, :action, Routes.admin_info_path(@conn, :create)) %>
<span><%= link "Back", to: Routes.admin_info_path(@conn, :admin) %></span>

View File

@@ -0,0 +1,20 @@
<section class="main">
<h1>Kappaleen tiedot</h1>
<ul>
<li>
<strong>Sisältö:</strong>
<%= @info.content %>
</li>
<li>
<strong>Prioriteetti:</strong>
<%= @info.seqnum %>
</li>
</ul>
<span><%= link "Muokkaa", to: Routes.admin_info_path(@conn, :edit, @info) %></span>
<span><%= link "Takaisin", to: Routes.admin_info_path(@conn, :admin) %></span>
</section>

View File

@@ -19,7 +19,7 @@
<%= link "Etusivu", to: Routes.index_path(@conn, :index) %>
<%= link "Ohjelma", to: Routes.performance_path(@conn, :index) %>
<%= link "Esiintyjät", to: Routes.performer_path(@conn, :index) %>
<%= link "Info", to: Routes.page_path(@conn, :info) %>
<%= link "Info", to: Routes.info_path(@conn, :index) %>
<%= link "Covid-19", to: Routes.page_path(@conn, :covid19) %>
<%= link "Ilmoittautuminen", to: Routes.visitor_path(@conn, :new) %>
</nav>
@@ -30,7 +30,7 @@
<%= link "Etusivu", to: "#{Routes.index_path(@conn, :index)}#logo-start" %>
<%= link "Ohjelma", to: "#{Routes.performance_path(@conn, :index)}#calendar-start" %>
<%= link "Esiintyjät", to: "#{Routes.performer_path(@conn, :index)}#performers-start" %>
<%= link "Info", to: "#{Routes.page_path(@conn, :info)}#contact-start" %>
<%= link "Info", to: "#{Routes.info_path(@conn, :index )}#contact-start" %>
<%= link "Covid-19", to: "#{Routes.page_path(@conn, :covid19)}#covid-start" %>
<%= link "Ilmoittautuminen", to: "#{Routes.visitor_path(@conn, :new)}#registration-start" %>
</nav>

View File

@@ -0,0 +1,3 @@
defmodule RunosaariWeb.InfoView do
use RunosaariWeb, :view
end

View File

@@ -4,7 +4,7 @@ defmodule Runosaari.MixProject do
def project do
[
app: :runosaari,
version: "0.3.0",
version: "0.4.0",
elixir: "~> 1.7",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix, :gettext] ++ Mix.compilers(),

View File

@@ -0,0 +1,13 @@
defmodule Runosaari.Repo.Migrations.CreateInfoParagraphs do
use Ecto.Migration
def change do
create table(:info_paragraphs) do
add :content, :string, size: 3000
add :seqnum, :integer
timestamps()
end
end
end

View File

@@ -63,4 +63,65 @@ defmodule Runosaari.PagesTest do
assert %Ecto.Changeset{} = Pages.change_index(index)
end
end
describe "info_paragraphs" do
alias Runosaari.Pages.Info
@valid_attrs %{content: "some content", seqnum: 42}
@update_attrs %{content: "some updated content", seqnum: 43}
@invalid_attrs %{content: nil, seqnum: nil}
def info_fixture(attrs \\ %{}) do
{:ok, info} =
attrs
|> Enum.into(@valid_attrs)
|> Pages.create_info()
info
end
test "list_info_paragraphs/0 returns all info_paragraphs" do
info = info_fixture()
assert Pages.list_info_paragraphs() == [info]
end
test "get_info!/1 returns the info with given id" do
info = info_fixture()
assert Pages.get_info!(info.id) == info
end
test "create_info/1 with valid data creates a info" do
assert {:ok, %Info{} = info} = Pages.create_info(@valid_attrs)
assert info.content == "some content"
assert info.seqnum == 42
end
test "create_info/1 with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{}} = Pages.create_info(@invalid_attrs)
end
test "update_info/2 with valid data updates the info" do
info = info_fixture()
assert {:ok, %Info{} = info} = Pages.update_info(info, @update_attrs)
assert info.content == "some updated content"
assert info.seqnum == 43
end
test "update_info/2 with invalid data returns error changeset" do
info = info_fixture()
assert {:error, %Ecto.Changeset{}} = Pages.update_info(info, @invalid_attrs)
assert info == Pages.get_info!(info.id)
end
test "delete_info/1 deletes the info" do
info = info_fixture()
assert {:ok, %Info{}} = Pages.delete_info(info)
assert_raise Ecto.NoResultsError, fn -> Pages.get_info!(info.id) end
end
test "change_info/1 returns a info changeset" do
info = info_fixture()
assert %Ecto.Changeset{} = Pages.change_info(info)
end
end
end

View File

@@ -0,0 +1,88 @@
defmodule RunosaariWeb.InfoControllerTest do
use RunosaariWeb.ConnCase
alias Runosaari.Pages
@create_attrs %{content: "some content", seqnum: 42}
@update_attrs %{content: "some updated content", seqnum: 43}
@invalid_attrs %{content: nil, seqnum: nil}
def fixture(:info) do
{:ok, info} = Pages.create_info(@create_attrs)
info
end
describe "index" do
test "lists all info_paragraphs", %{conn: conn} do
conn = get(conn, Routes.info_path(conn, :index))
assert html_response(conn, 200) =~ "Listing Info paragraphs"
end
end
describe "new info" do
test "renders form", %{conn: conn} do
conn = get(conn, Routes.info_path(conn, :new))
assert html_response(conn, 200) =~ "New Info"
end
end
describe "create info" do
test "redirects to show when data is valid", %{conn: conn} do
conn = post(conn, Routes.info_path(conn, :create), info: @create_attrs)
assert %{id: id} = redirected_params(conn)
assert redirected_to(conn) == Routes.info_path(conn, :show, id)
conn = get(conn, Routes.info_path(conn, :show, id))
assert html_response(conn, 200) =~ "Show Info"
end
test "renders errors when data is invalid", %{conn: conn} do
conn = post(conn, Routes.info_path(conn, :create), info: @invalid_attrs)
assert html_response(conn, 200) =~ "New Info"
end
end
describe "edit info" do
setup [:create_info]
test "renders form for editing chosen info", %{conn: conn, info: info} do
conn = get(conn, Routes.info_path(conn, :edit, info))
assert html_response(conn, 200) =~ "Edit Info"
end
end
describe "update info" do
setup [:create_info]
test "redirects when data is valid", %{conn: conn, info: info} do
conn = put(conn, Routes.info_path(conn, :update, info), info: @update_attrs)
assert redirected_to(conn) == Routes.info_path(conn, :show, info)
conn = get(conn, Routes.info_path(conn, :show, info))
assert html_response(conn, 200) =~ "some updated content"
end
test "renders errors when data is invalid", %{conn: conn, info: info} do
conn = put(conn, Routes.info_path(conn, :update, info), info: @invalid_attrs)
assert html_response(conn, 200) =~ "Edit Info"
end
end
describe "delete info" do
setup [:create_info]
test "deletes chosen info", %{conn: conn, info: info} do
conn = delete(conn, Routes.info_path(conn, :delete, info))
assert redirected_to(conn) == Routes.info_path(conn, :index)
assert_error_sent 404, fn ->
get(conn, Routes.info_path(conn, :show, info))
end
end
end
defp create_info(_) do
info = fixture(:info)
%{info: info}
end
end