mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-23 20:18:00 +01:00
mix convert_to_heex
This commit is contained in:
parent
88a28e646d
commit
a19b1d1cb6
546 changed files with 13840 additions and 9366 deletions
|
@ -0,0 +1,32 @@
|
|||
<div class="block__content flex alternating-color">
|
||||
<div class="flex__grow">
|
||||
<% # TODO %>
|
||||
<a href={~p"/channels/#{@channel}"}>
|
||||
<% # - if channel.channel_image.present? %>
|
||||
<% # => image_tag channel.uploaded_channel_image.url, width: 32, height: 32, alt: "#{channel.title}'s logo'", class: 'channel-strip__image' %>
|
||||
<% # - else %>
|
||||
<% # => image_tag 'no_avatar_original.svg', width: 32, height: 32, alt: "#{channel.title}'s logo'", class: 'channel-strip__image' %>
|
||||
<%= @channel.title || @channel.short_name %>
|
||||
</a>
|
||||
</div>
|
||||
<div class="flex__fixed flex__right">
|
||||
<%= if @channel.is_live do %>
|
||||
<span class="channel-strip__state label label--narrow label--success">
|
||||
LIVE NOW
|
||||
</span>
|
||||
<br />
|
||||
<%= @channel.viewers %>
|
||||
<%=
|
||||
if @channel.viewers == 1 do
|
||||
"viewer"
|
||||
else
|
||||
"viewers"
|
||||
end
|
||||
%>
|
||||
<% else %>
|
||||
<span class="channel-strip__state label label--narrow label--danger">
|
||||
OFF AIR
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,19 +0,0 @@
|
|||
.block__content.flex.alternating-color
|
||||
.flex__grow
|
||||
/ TODO
|
||||
a href=~p"/channels/#{@channel}"
|
||||
/- if channel.channel_image.present?
|
||||
/ => image_tag channel.uploaded_channel_image.url, width: 32, height: 32, alt: "#{channel.title}'s logo'", class: 'channel-strip__image'
|
||||
/- else
|
||||
/ => image_tag 'no_avatar_original.svg', width: 32, height: 32, alt: "#{channel.title}'s logo'", class: 'channel-strip__image'
|
||||
= @channel.title || @channel.short_name
|
||||
.flex__fixed.flex__right
|
||||
= if @channel.is_live do
|
||||
span.channel-strip__state.label.label--narrow.label--success
|
||||
' LIVE NOW
|
||||
br
|
||||
=> @channel.viewers
|
||||
= if @channel.viewers == 1, do: "viewer", else: "viewers"
|
||||
- else
|
||||
span.channel-strip__state.label.label--narrow.label--danger
|
||||
' OFF AIR
|
|
@ -0,0 +1,17 @@
|
|||
<div class="block__content flex alternating-color">
|
||||
<div class="flex__shrink spacing-right">
|
||||
<%= render(PhilomenaWeb.ImageView, "_image_container.html", image: @comment.image, size: :thumb_tiny, conn: @conn) %>
|
||||
</div>
|
||||
<div class="flex__grow">
|
||||
<a href={"/#{@comment.image.id}#comment_#{@comment.id}"}>
|
||||
#
|
||||
<%= @comment.image.id %>
|
||||
</a>
|
||||
by
|
||||
<span class="hyphenate-breaks">
|
||||
<%= render(PhilomenaWeb.UserAttributionView, "_anon_user.html", object: @comment, conn: @conn) %>
|
||||
</span>
|
||||
<br />
|
||||
<%= pretty_time(@comment.created_at) %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,12 +0,0 @@
|
|||
.block__content.flex.alternating-color
|
||||
.flex__shrink.spacing-right
|
||||
= render PhilomenaWeb.ImageView, "_image_container.html", image: @comment.image, size: :thumb_tiny, conn: @conn
|
||||
.flex__grow
|
||||
a href="/#{@comment.image.id}#comment_#{@comment.id}"
|
||||
| #
|
||||
=> @comment.image.id
|
||||
' by
|
||||
span.hyphenate-breaks
|
||||
= render PhilomenaWeb.UserAttributionView, "_anon_user.html", object: @comment, conn: @conn
|
||||
br
|
||||
= pretty_time(@comment.created_at)
|
14
lib/philomena_web/templates/activity/_topic_strip.html.heex
Normal file
14
lib/philomena_web/templates/activity/_topic_strip.html.heex
Normal file
|
@ -0,0 +1,14 @@
|
|||
<div class="block__content alternating-color">
|
||||
<%= if @topic.sticky do %>
|
||||
<i class="fa fa-thumbtack"></i>
|
||||
<% end %>
|
||||
<%= if @topic.last_post do %>
|
||||
<span class="hyphenate-breaks">
|
||||
<%= render(PhilomenaWeb.UserAttributionView, "_anon_user.html", object: @topic.last_post, conn: @conn) %>
|
||||
</span>
|
||||
<%= link("replied to", to: ~p"/forums/#{@topic.forum}/topics/#{@topic}?#{[post_id: @topic.last_post]}" <> "#post_#{@topic.last_post.id}") %>
|
||||
<% end %>
|
||||
<%= link(@topic.title, to: ~p"/forums/#{@topic.forum}/topics/#{@topic}") %>
|
||||
in
|
||||
<%= link(@topic.forum.name, to: ~p"/forums/#{@topic.forum}") %>
|
||||
</div>
|
|
@ -1,10 +0,0 @@
|
|||
.block__content.alternating-color
|
||||
= if @topic.sticky do
|
||||
i.fa.fa-thumbtack>
|
||||
= if @topic.last_post do
|
||||
span.hyphenate-breaks
|
||||
= render PhilomenaWeb.UserAttributionView, "_anon_user.html", object: @topic.last_post, conn: @conn
|
||||
= link("replied to", to: ~p"/forums/#{@topic.forum}/topics/#{@topic}?#{[post_id: @topic.last_post]}" <> "#post_#{@topic.last_post.id}")
|
||||
=<> link(@topic.title, to: ~p"/forums/#{@topic.forum}/topics/#{@topic}")
|
||||
' in
|
||||
=> link(@topic.forum.name, to: ~p"/forums/#{@topic.forum}")
|
89
lib/philomena_web/templates/activity/index.html.heex
Normal file
89
lib/philomena_web/templates/activity/index.html.heex
Normal file
|
@ -0,0 +1,89 @@
|
|||
<div class="column-layout">
|
||||
<%= if @show_sidebar do %>
|
||||
<aside class="column-layout__left" id="activity-side">
|
||||
<%= if not is_nil(@featured_image) and not PhilomenaWeb.ImageView.filter_or_spoiler_hits?(@conn, @featured_image) do %>
|
||||
<div class="center">
|
||||
<h4 class="remove-top-margin">
|
||||
Featured Image
|
||||
</h4>
|
||||
<%= render(PhilomenaWeb.ImageView, "_image_box.html", image: @featured_image, size: :medium, conn: @conn) %>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="block block--fixed block--fixed--sub block--success center hide-mobile">
|
||||
Enjoy the site?
|
||||
<a href="/pages/donations">
|
||||
Become a patron or donate!
|
||||
</a>
|
||||
</div>
|
||||
<div class="block block--fixed block--fixed--sub center hide-mobile">
|
||||
Issues? Want to chat?
|
||||
<a href="/pages/contact">
|
||||
Contact us!
|
||||
</a>
|
||||
</div>
|
||||
<div class="block hide-mobile">
|
||||
<a class="block__header--single-item center" href="/search?q=first_seen_at.gt:3 days ago&sf=wilson_score&sd=desc">
|
||||
Trending Images
|
||||
</a>
|
||||
<div class="block__content flex flex--centered flex--wrap image-flex-grid">
|
||||
<%= for image <- @top_scoring do %>
|
||||
<%= render(PhilomenaWeb.ImageView, "_image_box.html", image: image, size: :thumb_small, conn: @conn) %>
|
||||
<% end %>
|
||||
</div>
|
||||
<a class="block__header--single-item center" href="/search?q=*&sf=score&sd=desc">
|
||||
All Time Top Scoring
|
||||
</a>
|
||||
</div>
|
||||
<div class="block hide-mobile">
|
||||
<a class="block__header--single-item center" href="/channels">
|
||||
Streams
|
||||
</a>
|
||||
<%= for channel <- @streams do %>
|
||||
<%= render(PhilomenaWeb.ActivityView, "_channel_strip.html", channel: channel, conn: @conn) %>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="block hide-mobile">
|
||||
<a class="block__header--single-item center" href="/forums">
|
||||
Forum Activity
|
||||
</a>
|
||||
<%= for topic <- @topics do %>
|
||||
<%= render(PhilomenaWeb.ActivityView, "_topic_strip.html", topic: topic, conn: @conn) %>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="block hide-mobile">
|
||||
<a class="block__header--single-item center" href="/comments">
|
||||
Recent Comments
|
||||
</a>
|
||||
<%= for comment <- @comments do %>
|
||||
<%= render(PhilomenaWeb.ActivityView, "_comment_strip.html", comment: comment, conn: @conn) %>
|
||||
<% end %>
|
||||
<a class="block__header--single-item center" href="/search?q=first_seen_at.gt:3 days ago&sf=comment_count&sd=desc">
|
||||
Most Commented-on Images
|
||||
</a>
|
||||
</div>
|
||||
</aside>
|
||||
<% end %>
|
||||
<div class="column-layout__main">
|
||||
<%= render(PhilomenaWeb.ImageView, "index.html", conn: @conn, images: @images, size: :thumb) %>
|
||||
<%= if @show_sidebar and not is_nil(@watched) and Enum.any?(@watched) do %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<span class="block__header__title">
|
||||
Watched Images
|
||||
</span>
|
||||
<a href="/search?q=my:watched" title="Browse Watched Images">
|
||||
<i class="fa fa-eye"></i>
|
||||
<span class="hide-mobile">
|
||||
Browse Watched Images
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="block__content js-resizable-media-container">
|
||||
<%= for image <- @watched do %>
|
||||
<%= render(PhilomenaWeb.ImageView, "_image_box.html", image: image, link: ~p"/images/#{image}?#{[q: "my:watched"]}", size: :thumb_small, conn: @conn) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,54 +0,0 @@
|
|||
.column-layout
|
||||
= if @show_sidebar do
|
||||
aside.column-layout__left#activity-side
|
||||
= if not is_nil(@featured_image) and not PhilomenaWeb.ImageView.filter_or_spoiler_hits?(@conn, @featured_image) do
|
||||
.center
|
||||
h4.remove-top-margin Featured Image
|
||||
= render PhilomenaWeb.ImageView, "_image_box.html", image: @featured_image, size: :medium, conn: @conn
|
||||
.block.block--fixed.block--fixed--sub.block--success.center.hide-mobile
|
||||
' Enjoy the site?
|
||||
a href="/pages/donations"
|
||||
' Become a patron or donate!
|
||||
.block.block--fixed.block--fixed--sub.center.hide-mobile
|
||||
' Issues? Want to chat?
|
||||
a href="/pages/contact" Contact us!
|
||||
.block.hide-mobile
|
||||
a.block__header--single-item.center href="/search?q=first_seen_at.gt:3 days ago&sf=wilson_score&sd=desc"
|
||||
' Trending Images
|
||||
.block__content.flex.flex--centered.flex--wrap.image-flex-grid
|
||||
= for image <- @top_scoring do
|
||||
= render PhilomenaWeb.ImageView, "_image_box.html", image: image, size: :thumb_small, conn: @conn
|
||||
a.block__header--single-item.center href="/search?q=*&sf=score&sd=desc"
|
||||
' All Time Top Scoring
|
||||
.block.hide-mobile
|
||||
a.block__header--single-item.center href="/channels"
|
||||
' Streams
|
||||
= for channel <- @streams do
|
||||
= render PhilomenaWeb.ActivityView, "_channel_strip.html", channel: channel, conn: @conn
|
||||
.block.hide-mobile
|
||||
a.block__header--single-item.center href="/forums"
|
||||
' Forum Activity
|
||||
= for topic <- @topics do
|
||||
= render PhilomenaWeb.ActivityView, "_topic_strip.html", topic: topic, conn: @conn
|
||||
.block.hide-mobile
|
||||
a.block__header--single-item.center href="/comments"
|
||||
' Recent Comments
|
||||
= for comment <- @comments do
|
||||
= render PhilomenaWeb.ActivityView, "_comment_strip.html", comment: comment, conn: @conn
|
||||
a.block__header--single-item.center href="/search?q=first_seen_at.gt:3 days ago&sf=comment_count&sd=desc"
|
||||
' Most Commented-on Images
|
||||
|
||||
.column-layout__main
|
||||
= render PhilomenaWeb.ImageView, "index.html", conn: @conn, images: @images, size: :thumb
|
||||
= if @show_sidebar and not is_nil(@watched) and Enum.any?(@watched) do
|
||||
.block
|
||||
.block__header
|
||||
span.block__header__title
|
||||
' Watched Images
|
||||
a href="/search?q=my:watched" title="Browse Watched Images"
|
||||
i.fa.fa-eye>
|
||||
span.hide-mobile
|
||||
' Browse Watched Images
|
||||
.block__content.js-resizable-media-container
|
||||
= for image <- @watched do
|
||||
= render PhilomenaWeb.ImageView, "_image_box.html", image: image, link: ~p"/images/#{image}?#{[q: "my:watched"]}", size: :thumb_small, conn: @conn
|
59
lib/philomena_web/templates/admin/advert/_form.html.heex
Normal file
59
lib/philomena_web/templates/admin/advert/_form.html.heex
Normal file
|
@ -0,0 +1,59 @@
|
|||
<%= form_for @changeset, @action, [multipart: true], fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<%= if @changeset.data.__meta__.state != :loaded do %>
|
||||
<div class="field">
|
||||
<%= label(f, :image, "Upload image:") %>
|
||||
<%= file_input(f, :image, class: "input input--wide") %>
|
||||
<%= error_tag(f, :image) %>
|
||||
<%= error_tag(f, :image_mime_type) %>
|
||||
<%= error_tag(f, :image_size) %>
|
||||
<%= error_tag(f, :image_width) %>
|
||||
<%= error_tag(f, :image_height) %>
|
||||
</div>
|
||||
<% else %>
|
||||
<div class="field">
|
||||
<%= link("Change image", to: ~p"/admin/adverts/#{@changeset.data}/image/edit", class: "button") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= label(f, :link, "Link which the advert should take users to:") %>
|
||||
<%= url_input(f, :link, class: "input input--wide", placeholder: "Link", required: true) %>
|
||||
<%= error_tag(f, :link) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :title, "Title/alt-text for the advert:") %>
|
||||
<%= text_input(f, :title, class: "input input--wide", placeholder: "Title", required: true) %>
|
||||
<%= error_tag(f, :title) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :start_time, "Start time for the advert (usually \"now\"):") %>
|
||||
<%= text_input(f, :start_time, class: "input input--wide", placeholder: "Start") %>
|
||||
<%= error_tag(f, :start_time) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :finish_time, "Finish time for the advert (e.g. \"2 weeks from now\"):") %>
|
||||
<%= text_input(f, :finish_time, class: "input input--wide", placeholder: "Finish") %>
|
||||
<%= error_tag(f, :finish_time) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :notes, "Notes (Payment details, contact info, etc):") %>
|
||||
<%= text_input(f, :notes, class: "input input--wide", placeholder: "Notes") %>
|
||||
<%= error_tag(f, :notes) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :restrictions, "Restriction:") %>
|
||||
<%= select(f, :restrictions, restrictions(), class: "input") %>
|
||||
<%= error_tag(f, :restrictions) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= checkbox(f, :live, class: "checkbox") %>
|
||||
<%= label(f, :live, "Live") %>
|
||||
</div>
|
||||
<%= submit("Save Advert", class: "button") %>
|
||||
<% end %>
|
|
@ -1,53 +0,0 @@
|
|||
= form_for @changeset, @action, [multipart: true], fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
= if @changeset.data.__meta__.state != :loaded do
|
||||
.field
|
||||
=> label f, :image, "Upload image:"
|
||||
= file_input f, :image, class: "input input--wide"
|
||||
= error_tag f, :image
|
||||
= error_tag f, :image_mime_type
|
||||
= error_tag f, :image_size
|
||||
= error_tag f, :image_width
|
||||
= error_tag f, :image_height
|
||||
- else
|
||||
.field
|
||||
= link "Change image", to: ~p"/admin/adverts/#{@changeset.data}/image/edit", class: "button"
|
||||
|
||||
.field
|
||||
=> label f, :link, "Link which the advert should take users to:"
|
||||
= url_input f, :link, class: "input input--wide", placeholder: "Link", required: true
|
||||
= error_tag f, :link
|
||||
|
||||
.field
|
||||
=> label f, :title, "Title/alt-text for the advert:"
|
||||
= text_input f, :title, class: "input input--wide", placeholder: "Title", required: true
|
||||
= error_tag f, :title
|
||||
|
||||
.field
|
||||
=> label f, :start_time, "Start time for the advert (usually \"now\"):"
|
||||
= text_input f, :start_time, class: "input input--wide", placeholder: "Start"
|
||||
= error_tag f, :start_time
|
||||
|
||||
.field
|
||||
=> label f, :finish_time, "Finish time for the advert (e.g. \"2 weeks from now\"):"
|
||||
= text_input f, :finish_time, class: "input input--wide", placeholder: "Finish"
|
||||
= error_tag f, :finish_time
|
||||
|
||||
.field
|
||||
=> label f, :notes, "Notes (Payment details, contact info, etc):"
|
||||
= text_input f, :notes, class: "input input--wide", placeholder: "Notes"
|
||||
= error_tag f, :notes
|
||||
|
||||
.field
|
||||
=> label f, :restrictions, "Restriction:"
|
||||
= select f, :restrictions, restrictions(), class: "input"
|
||||
= error_tag f, :restrictions
|
||||
|
||||
.field
|
||||
=> checkbox f, :live, class: "checkbox"
|
||||
= label f, :live, "Live"
|
||||
|
||||
= submit "Save Advert", class: "button"
|
4
lib/philomena_web/templates/admin/advert/edit.html.heex
Normal file
4
lib/philomena_web/templates/admin/advert/edit.html.heex
Normal file
|
@ -0,0 +1,4 @@
|
|||
<h1>
|
||||
Editing advert
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.AdvertView, "_form.html", changeset: @changeset, action: ~p"/admin/adverts/#{@advert}", conn: @conn) %>
|
|
@ -1,2 +0,0 @@
|
|||
h1 Editing advert
|
||||
= render PhilomenaWeb.Admin.AdvertView, "_form.html", changeset: @changeset, action: ~p"/admin/adverts/#{@advert}", conn: @conn
|
|
@ -0,0 +1,22 @@
|
|||
<h2>
|
||||
Edit Advert
|
||||
</h2>
|
||||
<%= form_for @changeset, ~p"/admin/adverts/#{@advert}/image", [multipart: true], fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= label(f, :image, "Upload image:") %>
|
||||
<%= file_input(f, :image, class: "input input--wide") %>
|
||||
<%= error_tag(f, :image) %>
|
||||
<%= error_tag(f, :image_mime_type) %>
|
||||
<%= error_tag(f, :image_size) %>
|
||||
<%= error_tag(f, :image_width) %>
|
||||
<%= error_tag(f, :image_height) %>
|
||||
</div>
|
||||
<%= submit("Save Advert", class: "button") %>
|
||||
<% end %>
|
|
@ -1,17 +0,0 @@
|
|||
h2 Edit Advert
|
||||
|
||||
= form_for @changeset, ~p"/admin/adverts/#{@advert}/image", [multipart: true], fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
.field
|
||||
=> label f, :image, "Upload image:"
|
||||
= file_input f, :image, class: "input input--wide"
|
||||
= error_tag f, :image
|
||||
= error_tag f, :image_mime_type
|
||||
= error_tag f, :image_size
|
||||
= error_tag f, :image_width
|
||||
= error_tag f, :image_height
|
||||
|
||||
= submit "Save Advert", class: "button"
|
99
lib/philomena_web/templates/admin/advert/index.html.heex
Normal file
99
lib/philomena_web/templates/admin/advert/index.html.heex
Normal file
|
@ -0,0 +1,99 @@
|
|||
<% route = fn p -> ~p"/admin/adverts?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @adverts, route: route) %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<a href={~p"/admin/adverts/new"}>
|
||||
<i class="fa fa-plus"></i>
|
||||
New advert
|
||||
</a>
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="table--adverts__image">
|
||||
Image
|
||||
</th>
|
||||
<th>
|
||||
Ad Information
|
||||
</th>
|
||||
<th>
|
||||
Start
|
||||
</th>
|
||||
<th>
|
||||
Finish
|
||||
</th>
|
||||
<th>
|
||||
Enabled
|
||||
</th>
|
||||
<th>
|
||||
Restriction
|
||||
</th>
|
||||
<th>
|
||||
Statistics
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for advert <- @adverts do %>
|
||||
<tr>
|
||||
<td>
|
||||
<img src={advert_image_url(advert)} />
|
||||
</td>
|
||||
<td>
|
||||
<strong>
|
||||
URL:
|
||||
</strong>
|
||||
<%= link(advert.link, to: advert.link) %>
|
||||
<br />
|
||||
<strong>
|
||||
Title:
|
||||
</strong>
|
||||
<em>
|
||||
<%= advert.title %>
|
||||
</em>
|
||||
<%= if present?(advert.notes) do %>
|
||||
<br />
|
||||
<strong>
|
||||
Notes:
|
||||
</strong>
|
||||
<%= advert.notes %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class={time_column_class(advert.start_date)}>
|
||||
<%= pretty_time(advert.start_date) %>
|
||||
</td>
|
||||
<td class={time_column_class(advert.finish_date)}>
|
||||
<%= pretty_time(advert.finish_date) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= live_text(advert) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= advert.restrictions %>
|
||||
</td>
|
||||
<td>
|
||||
Impressions:
|
||||
<%= advert.impressions %>
|
||||
<br />
|
||||
Clicks:
|
||||
<%= advert.clicks %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Edit", to: ~p"/admin/adverts/#{advert}/edit") %>
|
||||
•
|
||||
<%= link("Destroy", to: ~p"/admin/adverts/#{advert}", data: [confirm: "Are you really, really sure?", method: "delete"]) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,73 +0,0 @@
|
|||
- route = fn p -> ~p"/admin/adverts?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @adverts, route: route
|
||||
|
||||
.block
|
||||
.block__header
|
||||
a href=~p"/admin/adverts/new"
|
||||
i.fa.fa-plus>
|
||||
' New advert
|
||||
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th.table--adverts__image Image
|
||||
th Ad Information
|
||||
th Start
|
||||
th Finish
|
||||
th Enabled
|
||||
th Restriction
|
||||
th Statistics
|
||||
th Options
|
||||
tbody
|
||||
= for advert <- @adverts do
|
||||
tr
|
||||
td
|
||||
img src=advert_image_url(advert)
|
||||
|
||||
td
|
||||
strong
|
||||
' URL:
|
||||
= link advert.link, to: advert.link
|
||||
br
|
||||
|
||||
strong
|
||||
' Title:
|
||||
em
|
||||
= advert.title
|
||||
|
||||
= if present?(advert.notes) do
|
||||
br
|
||||
strong
|
||||
' Notes:
|
||||
= advert.notes
|
||||
|
||||
td class=time_column_class(advert.start_date)
|
||||
= pretty_time advert.start_date
|
||||
|
||||
td class=time_column_class(advert.finish_date)
|
||||
= pretty_time advert.finish_date
|
||||
|
||||
td
|
||||
= live_text(advert)
|
||||
|
||||
td
|
||||
= advert.restrictions
|
||||
|
||||
td
|
||||
' Impressions:
|
||||
= advert.impressions
|
||||
|
||||
br
|
||||
' Clicks:
|
||||
= advert.clicks
|
||||
|
||||
td
|
||||
=> link "Edit", to: ~p"/admin/adverts/#{advert}/edit"
|
||||
' •
|
||||
= link "Destroy", to: ~p"/admin/adverts/#{advert}", data: [confirm: "Are you really, really sure?", method: "delete"]
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
4
lib/philomena_web/templates/admin/advert/new.html.heex
Normal file
4
lib/philomena_web/templates/admin/advert/new.html.heex
Normal file
|
@ -0,0 +1,4 @@
|
|||
<h1>
|
||||
New advert
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.AdvertView, "_form.html", changeset: @changeset, action: ~p"/admin/adverts", conn: @conn) %>
|
|
@ -1,2 +0,0 @@
|
|||
h1 New advert
|
||||
= render PhilomenaWeb.Admin.AdvertView, "_form.html", changeset: @changeset, action: ~p"/admin/adverts", conn: @conn
|
|
@ -0,0 +1,70 @@
|
|||
<div class="block">
|
||||
<div class="block__header">
|
||||
<div class="block__header__title approval-grid">
|
||||
<div class="approval-items--main">
|
||||
<span>
|
||||
ID
|
||||
</span>
|
||||
<span>
|
||||
Image
|
||||
</span>
|
||||
<span>
|
||||
Uploader
|
||||
</span>
|
||||
<span>
|
||||
Time
|
||||
</span>
|
||||
</div>
|
||||
<div class="approval-items--footer hide-mobile">
|
||||
<span class="hide-mobile">
|
||||
Actions
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%= for image <- @images do %>
|
||||
<div class="block__content alternating-color">
|
||||
<div class="approval-grid">
|
||||
<div class="approval-items--main">
|
||||
<span>
|
||||
<%= link(">>#{image.id}", to: ~p"/images/#{image}") %>
|
||||
</span>
|
||||
<div class={"approval-items__details #{class_for_image(image)}"}>
|
||||
<span>
|
||||
<%= image_thumb(@conn, image) %>
|
||||
</span>
|
||||
<span>
|
||||
<%= warning_text(image) %>
|
||||
</span>
|
||||
</div>
|
||||
<span>
|
||||
<%= if image.user do %>
|
||||
<%= link(image.user.name, to: ~p"/profiles/#{image.user}") %>
|
||||
<% else %>
|
||||
<em>
|
||||
<%= truncated_ip_link(image.ip) %>
|
||||
</em>
|
||||
<%= link_to_fingerprint(@conn, image.fingerprint) %>
|
||||
<% end %>
|
||||
</span>
|
||||
<span>
|
||||
<%= pretty_time(image.created_at) %>
|
||||
</span>
|
||||
</div>
|
||||
<div class="approval-items--footer">
|
||||
<%= if can?(@conn, :approve, image) do %>
|
||||
<%= button_to("Approve", ~p"/images/#{image}/approve", method: "post", class: "button button--state-success") %>
|
||||
<% end %>
|
||||
<%= if can?(@conn, :hide, image) do %>
|
||||
<%= form_for :image, ~p"/images/#{image}/delete", [method: "post"], fn f -> %>
|
||||
<div class="field field--inline">
|
||||
<%= text_input(f, :deletion_reason, class: "input input--wide", placeholder: "Rule violation", required: true) %>
|
||||
<%= submit("Delete", class: "button button--state-danger button--separate-left") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
|
@ -1,34 +0,0 @@
|
|||
.block
|
||||
.block__header
|
||||
.block__header__title.approval-grid
|
||||
.approval-items--main
|
||||
span ID
|
||||
span Image
|
||||
span Uploader
|
||||
span Time
|
||||
.approval-items--footer.hide-mobile
|
||||
span.hide-mobile Actions
|
||||
= for image <- @images do
|
||||
.block__content.alternating-color
|
||||
.approval-grid
|
||||
.approval-items--main
|
||||
span = link ">>#{image.id}", to: ~p"/images/#{image}"
|
||||
.approval-items__details class=class_for_image(image)
|
||||
span = image_thumb(@conn, image)
|
||||
span = warning_text(image)
|
||||
span
|
||||
= if image.user do
|
||||
= link image.user.name, to: ~p"/profiles/#{image.user}"
|
||||
- else
|
||||
em>
|
||||
= truncated_ip_link(image.ip)
|
||||
= link_to_fingerprint(@conn, image.fingerprint)
|
||||
span = pretty_time(image.created_at)
|
||||
.approval-items--footer
|
||||
= if can?(@conn, :approve, image) do
|
||||
= button_to "Approve", ~p"/images/#{image}/approve", method: "post", class: "button button--state-success"
|
||||
= if can?(@conn, :hide, image) do
|
||||
= form_for :image, ~p"/images/#{image}/delete", [method: "post"], fn f ->
|
||||
.field.field--inline
|
||||
= text_input f, :deletion_reason, class: "input input--wide", placeholder: "Rule violation", required: true
|
||||
= submit "Delete", class: "button button--state-danger button--separate-left"
|
18
lib/philomena_web/templates/admin/approval/index.html.heex
Normal file
18
lib/philomena_web/templates/admin/approval/index.html.heex
Normal file
|
@ -0,0 +1,18 @@
|
|||
<% route = fn p -> ~p"/admin/approvals?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @images, route: route) %>
|
||||
<h1>
|
||||
Approval Queue
|
||||
</h1>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<%= if Enum.any?(@images) do %>
|
||||
<%= render(PhilomenaWeb.Admin.ApprovalView, "_approvals.html", images: @images, conn: @conn) %>
|
||||
<% else %>
|
||||
No images are pending approval. Good job!
|
||||
<% end %>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,16 +0,0 @@
|
|||
- route = fn p -> ~p"/admin/approvals?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @images, route: route
|
||||
|
||||
h1 Approval Queue
|
||||
|
||||
.block
|
||||
.block__header
|
||||
= pagination
|
||||
|
||||
= if Enum.any?(@images) do
|
||||
= render PhilomenaWeb.Admin.ApprovalView, "_approvals.html", images: @images, conn: @conn
|
||||
- else
|
||||
' No images are pending approval. Good job!
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
108
lib/philomena_web/templates/admin/artist_link/index.html.heex
Normal file
108
lib/philomena_web/templates/admin/artist_link/index.html.heex
Normal file
|
@ -0,0 +1,108 @@
|
|||
<h1>
|
||||
Artist Links
|
||||
</h1>
|
||||
<p>
|
||||
Link creation is done via the Users menu.
|
||||
</p>
|
||||
<p>
|
||||
Verifying a link will automatically award an artist badge if the link is public, no artist badge exists, and an "artist:" tag is specified.
|
||||
</p>
|
||||
<%= form_for :artist_link, ~p"/admin/artist_links", [method: "get", class: "hform"], fn f -> %>
|
||||
<div class="field">
|
||||
<%= text_input(f, :q, name: :q, value: @conn.params["q"], class: "input hform__text", placeholder: "Search query", autocapitalize: "none") %>
|
||||
<%= submit("Search", class: "hform__button button") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% route = fn p -> ~p"/admin/artist_links?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @artist_links, route: route, params: link_scope(@conn), conn: @conn) %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<%= if @conn.params["all"] do %>
|
||||
<%= link("Show unverified only", to: ~p"/admin/artist_links") %>
|
||||
<% else %>
|
||||
<%= link("Show all", to: ~p"/admin/artist_links?#{[all: "true"]}") %>
|
||||
<% end %>
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
State
|
||||
</th>
|
||||
<th>
|
||||
User
|
||||
</th>
|
||||
<th>
|
||||
URL
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
<th>
|
||||
Mark
|
||||
</th>
|
||||
<th>
|
||||
Public
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for link <- @artist_links do %>
|
||||
<tr>
|
||||
<td class={link_state_class(link)}>
|
||||
<strong>
|
||||
<%= link_state_name(link) %>
|
||||
</strong>
|
||||
<%= if contacted?(link) do %>
|
||||
<br />
|
||||
by
|
||||
<%= link.contacted_by_user.name %>
|
||||
<br />
|
||||
(
|
||||
<%= pretty_time(link.contacted_at) %>
|
||||
)
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= render(PhilomenaWeb.UserAttributionView, "_user.html", object: link, awards: true, conn: @conn) %>
|
||||
<%= render(PhilomenaWeb.TagView, "_tag_list.html", tags: display_order(link.user.linked_tags), conn: @conn) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link(String.slice(link.uri, 0, 100), to: link.uri) %>
|
||||
<%= if link.tag do %>
|
||||
<br />
|
||||
<%= render(PhilomenaWeb.TagView, "_tag.html", tag: link.tag, conn: @conn) %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("View", to: ~p"/profiles/#{link.user}/artist_links/#{link}") %>
|
||||
•
|
||||
<%= link("Edit", to: ~p"/profiles/#{link.user}/artist_links/#{link}/edit") %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Verify", to: ~p"/admin/artist_links/#{link}/verification", method: :post) %>
|
||||
•
|
||||
<%= link("Reject", to: ~p"/admin/artist_links/#{link}/reject", method: :post) %>
|
||||
<br />
|
||||
<%= if not verified?(link) do %>
|
||||
<%= if contacted?(link) do %>
|
||||
Artist contacted
|
||||
<% else %>
|
||||
<%= link("Artist contacted", to: ~p"/admin/artist_links/#{link}/contact", method: :post) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= public_text(link) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,78 +0,0 @@
|
|||
h1 Artist Links
|
||||
p Link creation is done via the Users menu.
|
||||
p Verifying a link will automatically award an artist badge if the link is public, no artist badge exists, and an "artist:" tag is specified.
|
||||
|
||||
= form_for :artist_link, ~p"/admin/artist_links", [method: "get", class: "hform"], fn f ->
|
||||
.field
|
||||
= text_input f, :q, name: :q, value: @conn.params["q"], class: "input hform__text", placeholder: "Search query", autocapitalize: "none"
|
||||
= submit "Search", class: "hform__button button"
|
||||
|
||||
- route = fn p -> ~p"/admin/artist_links?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @artist_links, route: route, params: link_scope(@conn), conn: @conn
|
||||
|
||||
.block
|
||||
.block__header
|
||||
= if @conn.params["all"] do
|
||||
= link "Show unverified only", to: ~p"/admin/artist_links"
|
||||
- else
|
||||
= link "Show all", to: ~p"/admin/artist_links?#{[all: "true"]}"
|
||||
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th State
|
||||
th User
|
||||
th URL
|
||||
th Options
|
||||
th Mark
|
||||
th Public
|
||||
tbody
|
||||
= for link <- @artist_links do
|
||||
tr
|
||||
td class=link_state_class(link)
|
||||
strong
|
||||
= link_state_name(link)
|
||||
|
||||
= if contacted?(link) do
|
||||
br
|
||||
' by
|
||||
= link.contacted_by_user.name
|
||||
br
|
||||
| (
|
||||
= pretty_time link.contacted_at
|
||||
| )
|
||||
|
||||
td
|
||||
= render PhilomenaWeb.UserAttributionView, "_user.html", object: link, awards: true, conn: @conn
|
||||
= render PhilomenaWeb.TagView, "_tag_list.html", tags: display_order(link.user.linked_tags), conn: @conn
|
||||
|
||||
td
|
||||
= link String.slice(link.uri, 0, 100), to: link.uri
|
||||
= if link.tag do
|
||||
br
|
||||
= render PhilomenaWeb.TagView, "_tag.html", tag: link.tag, conn: @conn
|
||||
|
||||
td
|
||||
=> link "View", to: ~p"/profiles/#{link.user}/artist_links/#{link}"
|
||||
' •
|
||||
= link "Edit", to: ~p"/profiles/#{link.user}/artist_links/#{link}/edit"
|
||||
|
||||
td
|
||||
=> link "Verify", to: ~p"/admin/artist_links/#{link}/verification", method: :post
|
||||
' •
|
||||
=> link "Reject", to: ~p"/admin/artist_links/#{link}/reject", method: :post
|
||||
br
|
||||
= if not verified?(link) do
|
||||
= if contacted?(link) do
|
||||
' Artist contacted
|
||||
- else
|
||||
= link "Artist contacted", to: ~p"/admin/artist_links/#{link}/contact", method: :post
|
||||
|
||||
td
|
||||
= public_text(link)
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
43
lib/philomena_web/templates/admin/badge/_form.html.heex
Normal file
43
lib/philomena_web/templates/admin/badge/_form.html.heex
Normal file
|
@ -0,0 +1,43 @@
|
|||
<%= form_for @changeset, @action, [multipart: true], fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= label(f, :title, "Badge name:") %>
|
||||
<%= text_input(f, :title, class: "input input--wide", placeholder: "Name", required: true) %>
|
||||
<%= error_tag(f, :title) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :description, "An optional short description:") %>
|
||||
<%= text_input(f, :description, class: "input input--wide", placeholder: "Description") %>
|
||||
<%= error_tag(f, :description) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= checkbox(f, :disable_award, class: "checkbox") %>
|
||||
<%= label(f, :disable_award, "Prevent image from appearing in \"Badge to award\" list") %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= checkbox(f, :priority, class: "checkbox") %>
|
||||
<%= label(f, :priority, "Displays before badges that don't have this checkbox checked") %>
|
||||
</div>
|
||||
<%= if @changeset.data.__meta__.state != :loaded do %>
|
||||
<h4>
|
||||
Image
|
||||
</h4>
|
||||
<div class="field">
|
||||
<%= label(f, :image, "Upload SVG image:") %>
|
||||
<%= file_input(f, :image, class: "input input--wide") %>
|
||||
<%= error_tag(f, :image) %>
|
||||
<%= error_tag(f, :image_mime_type) %>
|
||||
</div>
|
||||
<% else %>
|
||||
<div class="field">
|
||||
<%= link("Change image", to: ~p"/admin/badges/#{@changeset.data}/image/edit", class: "button") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<%= submit("Save Badge", class: "button", data: [disable_with: raw("Saving…")]) %>
|
||||
<% end %>
|
|
@ -1,35 +0,0 @@
|
|||
= form_for @changeset, @action, [multipart: true], fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
.field
|
||||
=> label f, :title, "Badge name:"
|
||||
= text_input f, :title, class: "input input--wide", placeholder: "Name", required: true
|
||||
= error_tag f, :title
|
||||
|
||||
.field
|
||||
=> label f, :description, "An optional short description:"
|
||||
= text_input f, :description, class: "input input--wide", placeholder: "Description"
|
||||
= error_tag f, :description
|
||||
|
||||
.field
|
||||
=> checkbox f, :disable_award, class: "checkbox"
|
||||
= label f, :disable_award, "Prevent image from appearing in \"Badge to award\" list"
|
||||
|
||||
.field
|
||||
=> checkbox f, :priority, class: "checkbox"
|
||||
= label f, :priority, "Displays before badges that don't have this checkbox checked"
|
||||
|
||||
= if @changeset.data.__meta__.state != :loaded do
|
||||
h4 Image
|
||||
.field
|
||||
=> label f, :image, "Upload SVG image:"
|
||||
= file_input f, :image, class: "input input--wide"
|
||||
= error_tag f, :image
|
||||
= error_tag f, :image_mime_type
|
||||
- else
|
||||
.field
|
||||
= link "Change image", to: ~p"/admin/badges/#{@changeset.data}/image/edit", class: "button"
|
||||
|
||||
= submit "Save Badge", class: "button", data: [disable_with: raw("Saving…")]
|
5
lib/philomena_web/templates/admin/badge/edit.html.heex
Normal file
5
lib/philomena_web/templates/admin/badge/edit.html.heex
Normal file
|
@ -0,0 +1,5 @@
|
|||
<h2>
|
||||
Edit Badge
|
||||
</h2>
|
||||
<%= render("_form.html", Map.put(assigns, :action, ~p"/admin/badges/#{@badge}")) %>
|
||||
<%= link("Back", to: ~p"/admin/badges") %>
|
|
@ -1,5 +0,0 @@
|
|||
h2 Edit Badge
|
||||
|
||||
= render "_form.html", Map.put(assigns, :action, ~p"/admin/badges/#{@badge}")
|
||||
|
||||
= link "Back", to: ~p"/admin/badges"
|
22
lib/philomena_web/templates/admin/badge/image/edit.html.heex
Normal file
22
lib/philomena_web/templates/admin/badge/image/edit.html.heex
Normal file
|
@ -0,0 +1,22 @@
|
|||
<h2>
|
||||
Edit Badge
|
||||
</h2>
|
||||
<%= form_for @changeset, ~p"/admin/badges/#{@badge}/image", [multipart: true], fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<h4>
|
||||
Image
|
||||
</h4>
|
||||
<div class="field">
|
||||
<%= label(f, :image, "Upload SVG image:") %>
|
||||
<%= file_input(f, :image, class: "input input--wide") %>
|
||||
<%= error_tag(f, :image) %>
|
||||
<%= error_tag(f, :image_mime_type) %>
|
||||
</div>
|
||||
<%= submit("Save Badge", class: "button", data: [disable_with: raw("Saving…")]) %>
|
||||
<% end %>
|
|
@ -1,15 +0,0 @@
|
|||
h2 Edit Badge
|
||||
|
||||
= form_for @changeset, ~p"/admin/badges/#{@badge}/image", [multipart: true], fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
h4 Image
|
||||
.field
|
||||
=> label f, :image, "Upload SVG image:"
|
||||
= file_input f, :image, class: "input input--wide"
|
||||
= error_tag f, :image
|
||||
= error_tag f, :image_mime_type
|
||||
|
||||
= submit "Save Badge", class: "button", data: [disable_with: raw("Saving…")]
|
51
lib/philomena_web/templates/admin/badge/index.html.heex
Normal file
51
lib/philomena_web/templates/admin/badge/index.html.heex
Normal file
|
@ -0,0 +1,51 @@
|
|||
<h2>
|
||||
Badges
|
||||
</h2>
|
||||
<% route = fn p -> ~p"/admin/badges?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @badges, route: route, conn: @conn) %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<a href={~p"/admin/badges/new"}>
|
||||
<i class="fa fa-plus"></i>
|
||||
New Badge
|
||||
</a>
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Badge
|
||||
</th>
|
||||
<th>
|
||||
Image
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for badge <- @badges do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= badge.title %>
|
||||
</td>
|
||||
<td>
|
||||
<%= badge_image(badge, width: 32, height: 32) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Users", to: ~p"/admin/badges/#{badge}/users") %>
|
||||
•
|
||||
<%= link("Edit", to: ~p"/admin/badges/#{badge}/edit") %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,36 +0,0 @@
|
|||
h2 Badges
|
||||
|
||||
- route = fn p -> ~p"/admin/badges?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @badges, route: route, conn: @conn
|
||||
|
||||
.block
|
||||
.block__header
|
||||
a href=~p"/admin/badges/new"
|
||||
i.fa.fa-plus>
|
||||
' New Badge
|
||||
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th Badge
|
||||
th Image
|
||||
th Options
|
||||
tbody
|
||||
= for badge <- @badges do
|
||||
tr
|
||||
td
|
||||
= badge.title
|
||||
|
||||
td
|
||||
= badge_image(badge, width: 32, height: 32)
|
||||
|
||||
td
|
||||
=> link "Users", to: ~p"/admin/badges/#{badge}/users"
|
||||
' •
|
||||
= link "Edit", to: ~p"/admin/badges/#{badge}/edit"
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
5
lib/philomena_web/templates/admin/badge/new.html.heex
Normal file
5
lib/philomena_web/templates/admin/badge/new.html.heex
Normal file
|
@ -0,0 +1,5 @@
|
|||
<h2>
|
||||
New Badge
|
||||
</h2>
|
||||
<%= render("_form.html", Map.put(assigns, :action, ~p"/admin/badges")) %>
|
||||
<%= link("Back", to: ~p"/admin/badges") %>
|
|
@ -1,5 +0,0 @@
|
|||
h2 New Badge
|
||||
|
||||
= render "_form.html", Map.put(assigns, :action, ~p"/admin/badges")
|
||||
|
||||
= link "Back", to: ~p"/admin/badges"
|
35
lib/philomena_web/templates/admin/badge/user/index.html.heex
Normal file
35
lib/philomena_web/templates/admin/badge/user/index.html.heex
Normal file
|
@ -0,0 +1,35 @@
|
|||
<h1>
|
||||
Users with
|
||||
<%= @badge.title %>
|
||||
badge
|
||||
</h1>
|
||||
<% route = fn p -> ~p"/admin/badges/#{@badge}/users?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @users, route: route, conn: @conn) %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
User
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for user <- @users do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= link(user.name, to: ~p"/profiles/#{user}") %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,25 +0,0 @@
|
|||
h1
|
||||
' Users with
|
||||
=> @badge.title
|
||||
' badge
|
||||
|
||||
- route = fn p -> ~p"/admin/badges/#{@badge}/users?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @users, route: route, conn: @conn
|
||||
|
||||
.block
|
||||
.block__header
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th User
|
||||
tbody
|
||||
= for user <- @users do
|
||||
tr
|
||||
td
|
||||
= link user.name, to: ~p"/profiles/#{user}"
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
113
lib/philomena_web/templates/admin/dnp_entry/index.html.heex
Normal file
113
lib/philomena_web/templates/admin/dnp_entry/index.html.heex
Normal file
|
@ -0,0 +1,113 @@
|
|||
<h2>
|
||||
Do-Not-Post Requests
|
||||
</h2>
|
||||
<%= form_for :dnp_entry, ~p"/admin/dnp_entries", [method: "get", class: "hform"], fn f -> %>
|
||||
<div class="field">
|
||||
<%= text_input(f, :q, name: :q, value: @conn.params["q"], class: "input hform__text", placeholder: "Search query", autocapitalize: "none") %>
|
||||
<%= submit("Search", class: "hform__button button") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% route = fn p -> ~p"/admin/dnp_entries?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @dnp_entries, route: route, params: [states: state_param(@conn.params["states"])]) %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<%= pagination %>
|
||||
<span class="block__header__title">
|
||||
Display Only:
|
||||
</span>
|
||||
<%= link("All Open", to: ~p"/admin/dnp_entries?#{[states: ~W(requested claimed rescinded acknowledged)]}") %>
|
||||
<%= link("Listed", to: ~p"/admin/dnp_entries?#{[states: ~W(listed)]}") %>
|
||||
<%= link("Rescinded", to: ~p"/admin/dnp_entries?#{[states: ~W(rescinded acknowledged)]}") %>
|
||||
<%= link("Closed", to: ~p"/admin/dnp_entries?#{[states: ~W(closed)]}") %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
Tag
|
||||
</td>
|
||||
<td>
|
||||
Requesting User
|
||||
</td>
|
||||
<td>
|
||||
Type
|
||||
</td>
|
||||
<td>
|
||||
Conditions
|
||||
</td>
|
||||
<td>
|
||||
Status
|
||||
</td>
|
||||
<td>
|
||||
Created
|
||||
</td>
|
||||
<td>
|
||||
Modified
|
||||
</td>
|
||||
<td>
|
||||
Options
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for {body, request} <- @dnp_entries do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= render(PhilomenaWeb.TagView, "_tag.html", tag: request.tag, conn: @conn) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link(request.requesting_user.name, to: ~p"/profiles/#{request.requesting_user}") %>
|
||||
</td>
|
||||
<td>
|
||||
<%= request.dnp_type %>
|
||||
</td>
|
||||
<td>
|
||||
<%= body %>
|
||||
</td>
|
||||
<td class={dnp_entry_row_class(request)}>
|
||||
<%= pretty_state(request) %>
|
||||
<%= if request.modifying_user do %>
|
||||
by
|
||||
<%= link(request.modifying_user.name, to: ~p"/profiles/#{request.modifying_user}") %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= pretty_time(request.created_at) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= pretty_time(request.updated_at) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Show", to: ~p"/dnp/#{request}") %>
|
||||
•
|
||||
<%= link("Send PM", to: ~p"/conversations/new?#{[recipient: request.requesting_user.name]}") %>
|
||||
<%= case request.aasm_state do %>
|
||||
<% s when s in ["requested", "claimed"] -> %>
|
||||
•
|
||||
<%= link("Claim", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "claimed"]}", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
•
|
||||
<%= link("Approve", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "listed"]}", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
•
|
||||
<%= link("Close", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "closed"]}", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
<% "listed" -> %>
|
||||
•
|
||||
<%= link("Rescind", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "rescinded"]}", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
•
|
||||
<%= link("Close", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "closed"]}", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
<% s when s in ["rescinded", "acknowledged"] -> %>
|
||||
•
|
||||
<%= link("Claim", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "acknowledged"]}", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
•
|
||||
<%= link("Close", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "closed"]}", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
<% _state -> %>
|
||||
•
|
||||
<%= link("Claim", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "claimed"]}", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
|
@ -1,90 +0,0 @@
|
|||
h2 Do-Not-Post Requests
|
||||
|
||||
= form_for :dnp_entry, ~p"/admin/dnp_entries", [method: "get", class: "hform"], fn f ->
|
||||
.field
|
||||
= text_input f, :q, name: :q, value: @conn.params["q"], class: "input hform__text", placeholder: "Search query", autocapitalize: "none"
|
||||
= submit "Search", class: "hform__button button"
|
||||
|
||||
- route = fn p -> ~p"/admin/dnp_entries?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @dnp_entries, route: route, params: [states: state_param(@conn.params["states"])]
|
||||
|
||||
.block
|
||||
.block__header
|
||||
= pagination
|
||||
|
||||
span.block__header__title Display Only:
|
||||
=> link "All Open", to: ~p"/admin/dnp_entries?#{[states: ~W(requested claimed rescinded acknowledged)]}"
|
||||
=> link "Listed", to: ~p"/admin/dnp_entries?#{[states: ~W(listed)]}"
|
||||
=> link "Rescinded", to: ~p"/admin/dnp_entries?#{[states: ~W(rescinded acknowledged)]}"
|
||||
=> link "Closed", to: ~p"/admin/dnp_entries?#{[states: ~W(closed)]}"
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
td Tag
|
||||
td Requesting User
|
||||
td Type
|
||||
td Conditions
|
||||
td Status
|
||||
td Created
|
||||
td Modified
|
||||
td Options
|
||||
|
||||
tbody
|
||||
= for {body, request} <- @dnp_entries do
|
||||
tr
|
||||
td
|
||||
= render PhilomenaWeb.TagView, "_tag.html", tag: request.tag, conn: @conn
|
||||
|
||||
td
|
||||
= link request.requesting_user.name, to: ~p"/profiles/#{request.requesting_user}"
|
||||
|
||||
td
|
||||
= request.dnp_type
|
||||
|
||||
td
|
||||
= body
|
||||
|
||||
td class=dnp_entry_row_class(request)
|
||||
=> pretty_state(request)
|
||||
|
||||
= if request.modifying_user do
|
||||
' by
|
||||
= link request.modifying_user.name, to: ~p"/profiles/#{request.modifying_user}"
|
||||
|
||||
td
|
||||
= pretty_time(request.created_at)
|
||||
|
||||
td
|
||||
= pretty_time(request.updated_at)
|
||||
|
||||
td
|
||||
=> link "Show", to: ~p"/dnp/#{request}"
|
||||
' •
|
||||
=> link "Send PM", to: ~p"/conversations/new?#{[recipient: request.requesting_user.name]}"
|
||||
|
||||
= case request.aasm_state do
|
||||
- s when s in ["requested", "claimed"] ->
|
||||
' •
|
||||
=> link "Claim", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "claimed"]}", data: [method: "post", confirm: "Are you really, really sure?"]
|
||||
' •
|
||||
=> link "Approve", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "listed"]}", data: [method: "post", confirm: "Are you really, really sure?"]
|
||||
' •
|
||||
=> link "Close", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "closed"]}", data: [method: "post", confirm: "Are you really, really sure?"]
|
||||
|
||||
- "listed" ->
|
||||
' •
|
||||
=> link "Rescind", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "rescinded"]}", data: [method: "post", confirm: "Are you really, really sure?"]
|
||||
' •
|
||||
= link "Close", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "closed"]}", data: [method: "post", confirm: "Are you really, really sure?"]
|
||||
|
||||
- s when s in ["rescinded", "acknowledged"] ->
|
||||
' •
|
||||
=> link "Claim", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "acknowledged"]}", data: [method: "post", confirm: "Are you really, really sure?"]
|
||||
' •
|
||||
= link "Close", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "closed"]}", data: [method: "post", confirm: "Are you really, really sure?"]
|
||||
|
||||
- _state ->
|
||||
' •
|
||||
=> link "Claim", to: ~p"/admin/dnp_entries/#{request}/transition?#{[state: "claimed"]}", data: [method: "post", confirm: "Are you really, really sure?"]
|
44
lib/philomena_web/templates/admin/donation/_table.html.heex
Normal file
44
lib/philomena_web/templates/admin/donation/_table.html.heex
Normal file
|
@ -0,0 +1,44 @@
|
|||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
User
|
||||
</th>
|
||||
<th>
|
||||
Email
|
||||
</th>
|
||||
<th>
|
||||
Amount
|
||||
</th>
|
||||
<th>
|
||||
Note
|
||||
</th>
|
||||
<th>
|
||||
At
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for donation <- @donations do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= if donation.user do %>
|
||||
<%= link(donation.user.name, to: ~p"/profiles/#{donation.user}") %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= donation.email %>
|
||||
</td>
|
||||
<td>
|
||||
<%= donation.amount %>
|
||||
</td>
|
||||
<td title={donation.note}>
|
||||
<%= String.slice(donation.note, 0, 30) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= pretty_time(donation.created_at) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
|
@ -1,27 +0,0 @@
|
|||
table.table
|
||||
thead
|
||||
tr
|
||||
th User
|
||||
th Email
|
||||
th Amount
|
||||
th Note
|
||||
th At
|
||||
|
||||
tbody
|
||||
= for donation <- @donations do
|
||||
tr
|
||||
td
|
||||
= if donation.user do
|
||||
= link donation.user.name, to: ~p"/profiles/#{donation.user}"
|
||||
|
||||
td
|
||||
= donation.email
|
||||
|
||||
td
|
||||
= donation.amount
|
||||
|
||||
td title=donation.note
|
||||
= String.slice(donation.note, 0, 30)
|
||||
|
||||
td
|
||||
= pretty_time donation.created_at
|
16
lib/philomena_web/templates/admin/donation/index.html.heex
Normal file
16
lib/philomena_web/templates/admin/donation/index.html.heex
Normal file
|
@ -0,0 +1,16 @@
|
|||
<% route = fn p -> ~p"/admin/donations?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @donations, route: route, conn: @conn) %>
|
||||
<h1>
|
||||
Donations
|
||||
</h1>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<%= render(PhilomenaWeb.Admin.DonationView, "_table.html", donations: @donations, conn: @conn) %>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,14 +0,0 @@
|
|||
- route = fn p -> ~p"/admin/donations?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @donations, route: route, conn: @conn
|
||||
|
||||
h1 Donations
|
||||
|
||||
.block
|
||||
.block__header
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
= render PhilomenaWeb.Admin.DonationView, "_table.html", donations: @donations, conn: @conn
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
|
@ -0,0 +1,29 @@
|
|||
<div class="walloftext">
|
||||
<h1>
|
||||
<%= @user.name %>
|
||||
's Donations
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.DonationView, "_table.html", donations: @donations, conn: @conn) %>
|
||||
<h1>
|
||||
Add Donation
|
||||
</h1>
|
||||
<%= form_for @changeset, ~p"/admin/donations", fn f -> %>
|
||||
<div class="field">
|
||||
<%= label(f, :user_id, "User ID:") %>
|
||||
<%= number_input(f, :user_id, class: "input input--short", value: @user.id) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :email, "Email:") %>
|
||||
<%= text_input(f, :email, class: "input input--wide", value: @user.email) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :amount, "Amount:") %>
|
||||
<%= number_input(f, :amount, class: "input input--wide", min: 0, step: 0.01) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :note, "Note:") %>
|
||||
<%= textarea(f, :note, class: "input input--wide") %>
|
||||
</div>
|
||||
<%= submit("Create Donation", class: "button") %>
|
||||
<% end %>
|
||||
</div>
|
|
@ -1,26 +0,0 @@
|
|||
.walloftext
|
||||
h1
|
||||
= @user.name
|
||||
| 's Donations
|
||||
|
||||
= render PhilomenaWeb.Admin.DonationView, "_table.html", donations: @donations, conn: @conn
|
||||
|
||||
h1 Add Donation
|
||||
= form_for @changeset, ~p"/admin/donations", fn f ->
|
||||
.field
|
||||
=> label f, :user_id, "User ID:"
|
||||
= number_input f, :user_id, class: "input input--short", value: @user.id
|
||||
|
||||
.field
|
||||
=> label f, :email, "Email:"
|
||||
= text_input f, :email, class: "input input--wide", value: @user.email
|
||||
|
||||
.field
|
||||
=> label f, :amount, "Amount:"
|
||||
= number_input f, :amount, class: "input input--wide", min: 0, step: 0.01
|
||||
|
||||
.field
|
||||
=> label f, :note, "Note:"
|
||||
= textarea f, :note, class: "input input--wide"
|
||||
|
||||
= submit "Create Donation", class: "button"
|
|
@ -0,0 +1,34 @@
|
|||
<%= form_for @changeset, @action, fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= label(f, :fingerprint, "Fingerprint:") %>
|
||||
<%= text_input(f, :fingerprint, class: "input", placeholder: "Fingerprint", required: true) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :reason, "Reason (shown to the banned user, and to staff on the user's profile page):") %>
|
||||
<%= text_input(f, :reason, class: "input input--wide", placeholder: "Reason", required: true) %>
|
||||
<%= error_tag(f, :reason) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :note, "Admin-only note:") %>
|
||||
<%= text_input(f, :note, class: "input input--wide", placeholder: "Note") %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :until, "End time relative to now, in simple English (e.g. \"1 week from now\"):") %>
|
||||
<%= text_input(f, :until, class: "input input--wide", placeholder: "Until", required: true) %>
|
||||
<%= error_tag(f, :until) %>
|
||||
</div>
|
||||
<br />
|
||||
<div class="field">
|
||||
<%= checkbox(f, :enabled) %>
|
||||
<%= label(f, :enabled) %>
|
||||
</div>
|
||||
<br />
|
||||
<%= submit("Save Ban", class: "button") %>
|
||||
<% end %>
|
|
@ -1,30 +0,0 @@
|
|||
= form_for @changeset, @action, fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
.field
|
||||
=> label f, :fingerprint, "Fingerprint:"
|
||||
= text_input f, :fingerprint, class: "input", placeholder: "Fingerprint", required: true
|
||||
|
||||
.field
|
||||
=> label f, :reason, "Reason (shown to the banned user, and to staff on the user's profile page):"
|
||||
= text_input f, :reason, class: "input input--wide", placeholder: "Reason", required: true
|
||||
= error_tag f, :reason
|
||||
|
||||
.field
|
||||
=> label f, :note, "Admin-only note:"
|
||||
= text_input f, :note, class: "input input--wide", placeholder: "Note"
|
||||
|
||||
.field
|
||||
=> label f, :until, "End time relative to now, in simple English (e.g. \"1 week from now\"):"
|
||||
= text_input f, :until, class: "input input--wide", placeholder: "Until", required: true
|
||||
= error_tag f, :until
|
||||
|
||||
br
|
||||
.field
|
||||
=> checkbox f, :enabled
|
||||
= label f, :enabled
|
||||
br
|
||||
|
||||
= submit "Save Ban", class: "button"
|
|
@ -0,0 +1,6 @@
|
|||
<h1>
|
||||
Editing ban
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.FingerprintBanView, "_form.html", changeset: @changeset, action: ~p"/admin/fingerprint_bans/#{@fingerprint}", conn: @conn) %>
|
||||
<br />
|
||||
<%= link("Back", to: ~p"/admin/fingerprint_bans") %>
|
|
@ -1,6 +0,0 @@
|
|||
h1 Editing ban
|
||||
|
||||
= render PhilomenaWeb.Admin.FingerprintBanView, "_form.html", changeset: @changeset, action: ~p"/admin/fingerprint_bans/#{@fingerprint}", conn: @conn
|
||||
|
||||
br
|
||||
= link "Back", to: ~p"/admin/fingerprint_bans"
|
|
@ -0,0 +1,86 @@
|
|||
<h1>
|
||||
Fingerprint Bans
|
||||
</h1>
|
||||
<% route = fn p -> ~p"/admin/fingerprint_bans?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @fingerprint_bans, route: route, params: page_params(@conn.params)) %>
|
||||
<%= form_for :fingerprint_ban, ~p"/admin/fingerprint_bans", [method: "get", class: "hform"], fn f -> %>
|
||||
<div class="field">
|
||||
<%= text_input(f, :q, name: "q", class: "hform__text input", placeholder: "Search") %>
|
||||
<%= submit("Search", class: "button hform__button") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<a href={~p"/admin/fingerprint_bans/new"}>
|
||||
<i class="fa fa-plus"></i>
|
||||
New fingerprint ban
|
||||
</a>
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Fingerprint
|
||||
</th>
|
||||
<th>
|
||||
Created
|
||||
</th>
|
||||
<th>
|
||||
Expires
|
||||
</th>
|
||||
<th>
|
||||
Reason/Note
|
||||
</th>
|
||||
<th>
|
||||
Ban ID
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for ban <- @fingerprint_bans do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= link(ban.fingerprint, to: ~p"/fingerprint_profiles/#{ban.fingerprint}") %>
|
||||
</td>
|
||||
<td>
|
||||
<%= pretty_time(ban.created_at) %>
|
||||
<%= user_abbrv(ban.banning_user) %>
|
||||
</td>
|
||||
<td class={ban_row_class(ban)}>
|
||||
<%= pretty_time(ban.valid_until) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= ban.reason %>
|
||||
<%= if present?(ban.note) do %>
|
||||
<p class="block block--fixed">
|
||||
<em>
|
||||
Note:
|
||||
<%= ban.note %>
|
||||
</em>
|
||||
</p>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= ban.generated_ban_id %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Edit", to: ~p"/admin/fingerprint_bans/#{ban}/edit") %>
|
||||
<%= if @current_user.role == "admin" do %>
|
||||
•
|
||||
<%= link("Destroy", to: ~p"/admin/fingerprint_bans/#{ban}", data: [confirm: "Are you really, really sure?", method: "delete"]) %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,62 +0,0 @@
|
|||
h1 Fingerprint Bans
|
||||
|
||||
- route = fn p -> ~p"/admin/fingerprint_bans?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @fingerprint_bans, route: route, params: page_params(@conn.params)
|
||||
|
||||
= form_for :fingerprint_ban, ~p"/admin/fingerprint_bans", [method: "get", class: "hform"], fn f ->
|
||||
.field
|
||||
= text_input f, :q, name: "q", class: "hform__text input", placeholder: "Search"
|
||||
= submit "Search", class: "button hform__button"
|
||||
|
||||
.block
|
||||
.block__header
|
||||
a href=~p"/admin/fingerprint_bans/new"
|
||||
i.fa.fa-plus>
|
||||
' New fingerprint ban
|
||||
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th Fingerprint
|
||||
th Created
|
||||
th Expires
|
||||
th Reason/Note
|
||||
th Ban ID
|
||||
th Options
|
||||
|
||||
tbody
|
||||
= for ban <- @fingerprint_bans do
|
||||
tr
|
||||
td
|
||||
= link ban.fingerprint, to: ~p"/fingerprint_profiles/#{ban.fingerprint}"
|
||||
|
||||
td
|
||||
=> pretty_time ban.created_at
|
||||
= user_abbrv ban.banning_user
|
||||
|
||||
td class=ban_row_class(ban)
|
||||
= pretty_time ban.valid_until
|
||||
|
||||
td
|
||||
= ban.reason
|
||||
|
||||
= if present?(ban.note) do
|
||||
p.block.block--fixed
|
||||
em
|
||||
' Note:
|
||||
= ban.note
|
||||
|
||||
td
|
||||
= ban.generated_ban_id
|
||||
|
||||
td
|
||||
=> link "Edit", to: ~p"/admin/fingerprint_bans/#{ban}/edit"
|
||||
= if @current_user.role == "admin" do
|
||||
' •
|
||||
=> link "Destroy", to: ~p"/admin/fingerprint_bans/#{ban}", data: [confirm: "Are you really, really sure?", method: "delete"]
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
|
@ -0,0 +1,6 @@
|
|||
<h1>
|
||||
New Fingerprint Ban
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.FingerprintBanView, "_form.html", changeset: @changeset, action: ~p"/admin/fingerprint_bans", conn: @conn) %>
|
||||
<br />
|
||||
<%= link("Back", to: ~p"/admin/fingerprint_bans") %>
|
|
@ -1,5 +0,0 @@
|
|||
h1 New Fingerprint Ban
|
||||
= render PhilomenaWeb.Admin.FingerprintBanView, "_form.html", changeset: @changeset, action: ~p"/admin/fingerprint_bans", conn: @conn
|
||||
|
||||
br
|
||||
= link "Back", to: ~p"/admin/fingerprint_bans"
|
30
lib/philomena_web/templates/admin/forum/_form.html.heex
Normal file
30
lib/philomena_web/templates/admin/forum/_form.html.heex
Normal file
|
@ -0,0 +1,30 @@
|
|||
<%= form_for @changeset, @action, fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= label(f, :name, "Name:") %>
|
||||
<%= text_input(f, :name, class: "input input--wide") %>
|
||||
<%= error_tag(f, :name) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :short_name, "Slug:") %>
|
||||
<%= text_input(f, :short_name, class: "input input--wide") %>
|
||||
<%= error_tag(f, :short_name) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :description, "Description:") %>
|
||||
<%= textarea(f, :description, class: "input input--wide") %>
|
||||
<%= error_tag(f, :description) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :access_level, "Access level:") %>
|
||||
<%= select(f, :access_level, ["normal", "assistant", "staff"], class: "input") %>
|
||||
<%= error_tag(f, :access_level) %>
|
||||
</div>
|
||||
<%= submit("Save Forum", class: "button") %>
|
||||
<% end %>
|
|
@ -1,26 +0,0 @@
|
|||
= form_for @changeset, @action, fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
.field
|
||||
=> label f, :name, "Name:"
|
||||
= text_input f, :name, class: "input input--wide"
|
||||
= error_tag f, :name
|
||||
|
||||
.field
|
||||
=> label f, :short_name, "Slug:"
|
||||
= text_input f, :short_name, class: "input input--wide"
|
||||
= error_tag f, :short_name
|
||||
|
||||
.field
|
||||
=> label f, :description, "Description:"
|
||||
= textarea f, :description, class: "input input--wide"
|
||||
= error_tag f, :description
|
||||
|
||||
.field
|
||||
=> label f, :access_level, "Access level:"
|
||||
= select f, :access_level, ["normal", "assistant", "staff"], class: "input"
|
||||
= error_tag f, :access_level
|
||||
|
||||
= submit "Save Forum", class: "button"
|
5
lib/philomena_web/templates/admin/forum/edit.html.heex
Normal file
5
lib/philomena_web/templates/admin/forum/edit.html.heex
Normal file
|
@ -0,0 +1,5 @@
|
|||
<h2>
|
||||
Edit Forum
|
||||
</h2>
|
||||
<%= render("_form.html", Map.put(assigns, :action, ~p"/admin/forums/#{@forum}")) %>
|
||||
<%= link("Back", to: ~p"/admin/forums") %>
|
|
@ -1,5 +0,0 @@
|
|||
h2 Edit Forum
|
||||
|
||||
= render "_form.html", Map.put(assigns, :action, ~p"/admin/forums/#{@forum}")
|
||||
|
||||
= link "Back", to: ~p"/admin/forums"
|
28
lib/philomena_web/templates/admin/forum/index.html.heex
Normal file
28
lib/philomena_web/templates/admin/forum/index.html.heex
Normal file
|
@ -0,0 +1,28 @@
|
|||
<h2>
|
||||
Listing Forums
|
||||
</h2>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Name
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for forum <- @forums do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= link(forum.name, to: ~p"/forums/#{forum}") %>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<%= link("Edit", to: ~p"/admin/forums/#{forum}/edit") %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<%= link("New Forum", to: ~p"/admin/forums/new") %>
|
|
@ -1,17 +0,0 @@
|
|||
h2 Listing Forums
|
||||
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th Name
|
||||
th Options
|
||||
tbody
|
||||
= for forum <- @forums do
|
||||
tr
|
||||
td
|
||||
= link forum.name, to: ~p"/forums/#{forum}"
|
||||
|
||||
td class="text-right"
|
||||
= link "Edit", to: ~p"/admin/forums/#{forum}/edit"
|
||||
|
||||
= link "New Forum", to: ~p"/admin/forums/new"
|
5
lib/philomena_web/templates/admin/forum/new.html.heex
Normal file
5
lib/philomena_web/templates/admin/forum/new.html.heex
Normal file
|
@ -0,0 +1,5 @@
|
|||
<h2>
|
||||
New Forum
|
||||
</h2>
|
||||
<%= render("_form.html", Map.put(assigns, :action, ~p"/admin/forums")) %>
|
||||
<%= link("Back", to: ~p"/admin/forums") %>
|
|
@ -1,5 +0,0 @@
|
|||
h2 New Forum
|
||||
|
||||
= render "_form.html", Map.put(assigns, :action, ~p"/admin/forums")
|
||||
|
||||
= link "Back", to: ~p"/admin/forums"
|
19
lib/philomena_web/templates/admin/mod_note/_form.html.heex
Normal file
19
lib/philomena_web/templates/admin/mod_note/_form.html.heex
Normal file
|
@ -0,0 +1,19 @@
|
|||
<%= form_for @changeset, @action, fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= label(f, :body, "Note") %>
|
||||
<%= text_input(f, :body, class: "input input--wide", required: true) %>
|
||||
<%= error_tag(f, :body) %>
|
||||
</div>
|
||||
<%= hidden_input(f, :notable_id) %>
|
||||
<%= hidden_input(f, :notable_type) %>
|
||||
<div class="field">
|
||||
<%= submit("Save", class: "button") %>
|
||||
</div>
|
||||
<% end %>
|
|
@ -1,15 +0,0 @@
|
|||
= form_for @changeset, @action, fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
.field
|
||||
=> label f, :body, "Note"
|
||||
= text_input f, :body, class: "input input--wide", required: true
|
||||
= error_tag f, :body
|
||||
|
||||
= hidden_input f, :notable_id
|
||||
= hidden_input f, :notable_type
|
||||
|
||||
.field
|
||||
= submit "Save", class: "button"
|
44
lib/philomena_web/templates/admin/mod_note/_table.html.heex
Normal file
44
lib/philomena_web/templates/admin/mod_note/_table.html.heex
Normal file
|
@ -0,0 +1,44 @@
|
|||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
Object
|
||||
</td>
|
||||
<td>
|
||||
Note
|
||||
</td>
|
||||
<td>
|
||||
Time
|
||||
</td>
|
||||
<td>
|
||||
Moderator
|
||||
</td>
|
||||
<td>
|
||||
Actions
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for {body, note} <- @mod_notes do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= link_to_noted_thing(note.notable) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= body %>
|
||||
</td>
|
||||
<td>
|
||||
<%= pretty_time(note.created_at) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link(note.moderator.name, to: ~p"/profiles/#{note.moderator}") %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Edit", to: ~p"/admin/mod_notes/#{note}/edit") %>
|
||||
•
|
||||
<%= link("Delete", to: ~p"/admin/mod_notes/#{note}", data: [confirm: "Are you really, really sure?", method: "delete"]) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
|
@ -1,27 +0,0 @@
|
|||
table.table
|
||||
thead
|
||||
tr
|
||||
td Object
|
||||
td Note
|
||||
td Time
|
||||
td Moderator
|
||||
td Actions
|
||||
tbody
|
||||
= for {body, note} <- @mod_notes do
|
||||
tr
|
||||
td
|
||||
= link_to_noted_thing(note.notable)
|
||||
|
||||
td
|
||||
= body
|
||||
|
||||
td
|
||||
= pretty_time note.created_at
|
||||
|
||||
td
|
||||
= link note.moderator.name, to: ~p"/profiles/#{note.moderator}"
|
||||
|
||||
td
|
||||
=> link "Edit", to: ~p"/admin/mod_notes/#{note}/edit"
|
||||
' •
|
||||
=> link "Delete", to: ~p"/admin/mod_notes/#{note}", data: [confirm: "Are you really, really sure?", method: "delete"]
|
|
@ -0,0 +1,6 @@
|
|||
<h2>
|
||||
Editing mod note for
|
||||
<%= @mod_note.notable_type %>
|
||||
<%= @mod_note.notable_id %>
|
||||
</h2>
|
||||
<%= render(PhilomenaWeb.Admin.ModNoteView, "_form.html", changeset: @changeset, action: ~p"/admin/mod_notes/#{@mod_note}", conn: @conn) %>
|
|
@ -1,6 +0,0 @@
|
|||
h2
|
||||
' Editing mod note for
|
||||
=> @mod_note.notable_type
|
||||
=> @mod_note.notable_id
|
||||
|
||||
= render PhilomenaWeb.Admin.ModNoteView, "_form.html", changeset: @changeset, action: ~p"/admin/mod_notes/#{@mod_note}", conn: @conn
|
16
lib/philomena_web/templates/admin/mod_note/index.html.heex
Normal file
16
lib/philomena_web/templates/admin/mod_note/index.html.heex
Normal file
|
@ -0,0 +1,16 @@
|
|||
<% route = fn p -> ~p"/admin/mod_notes?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @mod_notes, route: route, conn: @conn) %>
|
||||
<h2>
|
||||
Mod Notes
|
||||
</h2>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<span class="block__header__title">
|
||||
Mod Notes
|
||||
</span>
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<%= render(PhilomenaWeb.Admin.ModNoteView, "_table.html", mod_notes: @mod_notes, conn: @conn) %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,12 +0,0 @@
|
|||
- route = fn p -> ~p"/admin/mod_notes?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @mod_notes, route: route, conn: @conn
|
||||
|
||||
h2 Mod Notes
|
||||
|
||||
.block
|
||||
.block__header
|
||||
span.block__header__title Mod Notes
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
= render PhilomenaWeb.Admin.ModNoteView, "_table.html", mod_notes: @mod_notes, conn: @conn
|
6
lib/philomena_web/templates/admin/mod_note/new.html.heex
Normal file
6
lib/philomena_web/templates/admin/mod_note/new.html.heex
Normal file
|
@ -0,0 +1,6 @@
|
|||
<h2>
|
||||
New mod note for
|
||||
<%= @conn.params["notable_type"] %>
|
||||
<%= @conn.params["notable_id"] %>
|
||||
</h2>
|
||||
<%= render(PhilomenaWeb.Admin.ModNoteView, "_form.html", changeset: @changeset, action: ~p"/admin/mod_notes", conn: @conn) %>
|
|
@ -1,6 +0,0 @@
|
|||
h2
|
||||
' New mod note for
|
||||
=> @conn.params["notable_type"]
|
||||
=> @conn.params["notable_id"]
|
||||
|
||||
= render PhilomenaWeb.Admin.ModNoteView, "_form.html", changeset: @changeset, action: ~p"/admin/mod_notes", conn: @conn
|
78
lib/philomena_web/templates/admin/report/_reports.html.heex
Normal file
78
lib/philomena_web/templates/admin/report/_reports.html.heex
Normal file
|
@ -0,0 +1,78 @@
|
|||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Thing
|
||||
</th>
|
||||
<th>
|
||||
Reason
|
||||
</th>
|
||||
<th>
|
||||
User
|
||||
</th>
|
||||
<th class="hide-mobile">
|
||||
Opened
|
||||
</th>
|
||||
<th>
|
||||
State
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for report <- @reports do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= reported_image(@conn, report.reportable) %>
|
||||
<%= link_to_reported_thing(report.reportable) %>
|
||||
</td>
|
||||
<td>
|
||||
<span title={report.reason}>
|
||||
<%= truncate(report.reason) %>
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<%= if report.user do %>
|
||||
<%= link(report.user.name, to: ~p"/profiles/#{report.user}") %>
|
||||
<% else %>
|
||||
<em>
|
||||
<%= truncated_ip_link(report.ip) %>
|
||||
</em>
|
||||
<%= link_to_fingerprint(@conn, report.fingerprint) %>
|
||||
<% end %>
|
||||
<%= if not is_nil(report.user) and Enum.any?(report.user.linked_tags) do %>
|
||||
<%= render(PhilomenaWeb.TagView, "_tag_list.html", tags: ordered_tags(report.user.linked_tags), conn: @conn) %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="hide-mobile">
|
||||
<%= pretty_time(report.created_at) %>
|
||||
</td>
|
||||
<td class={report_row_class(report)}>
|
||||
<%= pretty_state(report) %>
|
||||
<%= user_abbrv(report.admin) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Show", to: ~p"/admin/reports/#{report}") %>
|
||||
<%= if report.open do %>
|
||||
<%= if report.user do %>
|
||||
•
|
||||
<%= link("Send PM", to: ~p"/conversations/new?#{[recipient: report.user.name]}") %>
|
||||
<% end %>
|
||||
<%= if is_nil(report.admin) and not current?(report.admin, @conn.assigns.current_user) do %>
|
||||
•
|
||||
<%= link("Claim", to: ~p"/admin/reports/#{report}/claim", data: [method: "post"]) %>
|
||||
<% end %>
|
||||
<%= if current?(report.admin, @conn.assigns.current_user) do %>
|
||||
•
|
||||
<%= link("Release", to: ~p"/admin/reports/#{report}/claim", data: [method: "delete"]) %>
|
||||
<% end %>
|
||||
•
|
||||
<%= link("Close", to: ~p"/admin/reports/#{report}/close", data: [method: "post", confirm: "Are you really, really sure?"]) %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
|
@ -1,53 +0,0 @@
|
|||
table.table
|
||||
thead
|
||||
tr
|
||||
th Thing
|
||||
th Reason
|
||||
th User
|
||||
th.hide-mobile Opened
|
||||
th State
|
||||
th Options
|
||||
tbody
|
||||
= for report <- @reports do
|
||||
tr
|
||||
td
|
||||
=> reported_image @conn, report.reportable
|
||||
= link_to_reported_thing report.reportable
|
||||
td
|
||||
span title=report.reason
|
||||
= truncate(report.reason)
|
||||
td
|
||||
= if report.user do
|
||||
= link report.user.name, to: ~p"/profiles/#{report.user}"
|
||||
- else
|
||||
em>
|
||||
= truncated_ip_link(report.ip)
|
||||
= link_to_fingerprint(@conn, report.fingerprint)
|
||||
|
||||
= if not is_nil(report.user) and Enum.any?(report.user.linked_tags) do
|
||||
= render PhilomenaWeb.TagView, "_tag_list.html", tags: ordered_tags(report.user.linked_tags), conn: @conn
|
||||
|
||||
td.hide-mobile
|
||||
= pretty_time report.created_at
|
||||
|
||||
td class=report_row_class(report)
|
||||
=> pretty_state(report)
|
||||
= user_abbrv report.admin
|
||||
td
|
||||
=> link "Show", to: ~p"/admin/reports/#{report}"
|
||||
|
||||
= if report.open do
|
||||
= if report.user do
|
||||
' •
|
||||
=> link "Send PM", to: ~p"/conversations/new?#{[recipient: report.user.name]}"
|
||||
|
||||
= if is_nil(report.admin) and not current?(report.admin, @conn.assigns.current_user) do
|
||||
' •
|
||||
=> link "Claim", to: ~p"/admin/reports/#{report}/claim", data: [method: "post"]
|
||||
|
||||
= if current?(report.admin, @conn.assigns.current_user) do
|
||||
' •
|
||||
=> link "Release", to: ~p"/admin/reports/#{report}/claim", data: [method: "delete"]
|
||||
|
||||
' •
|
||||
=> link "Close", to: ~p"/admin/reports/#{report}/close", data: [method: "post", confirm: "Are you really, really sure?"]
|
62
lib/philomena_web/templates/admin/report/index.html.heex
Normal file
62
lib/philomena_web/templates/admin/report/index.html.heex
Normal file
|
@ -0,0 +1,62 @@
|
|||
<% route = fn p -> ~p"/admin/reports?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", route: route, page: @reports, conn: @conn, params: [rq: @conn.params["rq"] || "*"]) %>
|
||||
<h1>
|
||||
Reports
|
||||
</h1>
|
||||
<%= if Enum.any?(@my_reports) do %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<span class="block__header__title">
|
||||
Your Reports
|
||||
</span>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<%= render(PhilomenaWeb.Admin.ReportView, "_reports.html", reports: @my_reports, conn: @conn) %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<%= if Enum.any?(@system_reports) do %>
|
||||
<div class="block">
|
||||
<div class="block__header block--danger">
|
||||
<span class="block__header__title">
|
||||
System Reports
|
||||
</span>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<%= render(PhilomenaWeb.Admin.ReportView, "_reports.html", reports: @system_reports, conn: @conn) %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<span class="block__header__title">
|
||||
All Reports
|
||||
</span>
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<%= if Enum.any?(@reports) do %>
|
||||
<%= render(PhilomenaWeb.Admin.ReportView, "_reports.html", reports: @reports, conn: @conn) %>
|
||||
<% else %>
|
||||
<p>
|
||||
We couldn't find any reports for you, sorry!
|
||||
</p>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
||||
<%= form_for :report, ~p"/admin/reports", [method: "get", class: "hform"], fn f -> %>
|
||||
<div class="field">
|
||||
<%= text_input(f, :rq, name: :rq, value: @conn.params["rq"], class: "input hform__text", placeholder: "Search reports", autocapitalize: "none") %>
|
||||
<%= submit("Search", class: "hform__button button") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<label for="rq">
|
||||
Searchable fields: id, created_at, reason, state, open, user, user_id, admin, admin_id, ip, fingerprint, reportable_type, reportable_id, image_id
|
||||
<br />
|
||||
Report reason is used if you don't specify a field.
|
||||
</label>
|
||||
</div>
|
|
@ -1,42 +0,0 @@
|
|||
- route = fn p -> ~p"/admin/reports?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", route: route, page: @reports, conn: @conn, params: [rq: @conn.params["rq"] || "*"]
|
||||
|
||||
h1 Reports
|
||||
|
||||
= if Enum.any?(@my_reports) do
|
||||
.block
|
||||
.block__header
|
||||
span.block__header__title Your Reports
|
||||
.block__content
|
||||
= render PhilomenaWeb.Admin.ReportView, "_reports.html", reports: @my_reports, conn: @conn
|
||||
|
||||
= if Enum.any?(@system_reports) do
|
||||
.block
|
||||
.block__header.block--danger
|
||||
span.block__header__title System Reports
|
||||
.block__content
|
||||
= render PhilomenaWeb.Admin.ReportView, "_reports.html", reports: @system_reports, conn: @conn
|
||||
|
||||
.block
|
||||
.block__header
|
||||
span.block__header__title All Reports
|
||||
= pagination
|
||||
.block__content
|
||||
= if Enum.any?(@reports) do
|
||||
= render PhilomenaWeb.Admin.ReportView, "_reports.html", reports: @reports, conn: @conn
|
||||
- else
|
||||
p We couldn't find any reports for you, sorry!
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
||||
|
||||
= form_for :report, ~p"/admin/reports", [method: "get", class: "hform"], fn f ->
|
||||
.field
|
||||
= text_input f, :rq, name: :rq, value: @conn.params["rq"], class: "input hform__text", placeholder: "Search reports", autocapitalize: "none"
|
||||
= submit "Search", class: "hform__button button"
|
||||
|
||||
.field
|
||||
label for="rq"
|
||||
' Searchable fields: id, created_at, reason, state, open, user, user_id, admin, admin_id, ip, fingerprint, reportable_type, reportable_id, image_id
|
||||
br
|
||||
' Report reason is used if you don't specify a field.
|
62
lib/philomena_web/templates/admin/report/show.html.heex
Normal file
62
lib/philomena_web/templates/admin/report/show.html.heex
Normal file
|
@ -0,0 +1,62 @@
|
|||
<h1>
|
||||
Showing Report
|
||||
</h1>
|
||||
<p>
|
||||
<%= link_to_reported_thing(@report.reportable) %>
|
||||
</p>
|
||||
<article class="block communication">
|
||||
<div class="block__content flex flex--no-wrap">
|
||||
<div class="flex__fixed spacing-right">
|
||||
<%= render(PhilomenaWeb.UserAttributionView, "_anon_user_avatar.html", object: @report, conn: @conn) %>
|
||||
</div>
|
||||
<div class="flex__grow communication__body">
|
||||
<span class="communication__body__sender-name">
|
||||
<%= render(PhilomenaWeb.UserAttributionView, "_anon_user.html", object: @report, awards: true, conn: @conn) %>
|
||||
</span>
|
||||
<br />
|
||||
<%= render(PhilomenaWeb.UserAttributionView, "_anon_user_title.html", object: @report, conn: @conn) %>
|
||||
<div class="communication__body__text">
|
||||
<%= @body %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="block__content communication__options">
|
||||
<div class="flex flex--wrap flex--spaced-out">
|
||||
<div>
|
||||
Reported
|
||||
<%= pretty_time(@report.created_at) %>
|
||||
</div>
|
||||
<div class="flex__right">
|
||||
<%= link_to_ip(@conn, @report.ip) %>
|
||||
<%= link_to_fingerprint(@conn, @report.fingerprint) %>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
User-Agent:
|
||||
<code>
|
||||
<%= @report.user_agent %>
|
||||
</code>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<%= if assigns[:mod_notes] do %>
|
||||
<h4>
|
||||
Mod Notes
|
||||
</h4>
|
||||
<%= render(PhilomenaWeb.Admin.ModNoteView, "_table.html", mod_notes: @mod_notes, conn: @conn) %>
|
||||
<%= link("Add New Note", to: ~p"/admin/mod_notes/new?#{[notable_id: @report.id, notable_type: "Report"]}") %>
|
||||
<% end %>
|
||||
<p>
|
||||
<%= if @report.user do %>
|
||||
<%= link("Send PM", to: ~p"/conversations/new?#{[recipient: @report.user.name]}", class: "button button--link") %>
|
||||
<% end %>
|
||||
<%= if @report.open do %>
|
||||
<%= link("Close", to: ~p"/admin/reports/#{@report}/close", class: "button", data: [method: "post"]) %>
|
||||
<%= if current?(@report.admin, @conn.assigns.current_user) do %>
|
||||
<%= link("Release", to: ~p"/admin/reports/#{@report}/claim", class: "button", data: [method: "delete"]) %>
|
||||
<% else %>
|
||||
<%= link("Claim", to: ~p"/admin/reports/#{@report}/claim", class: "button", data: [method: "post"]) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</p>
|
||||
<%= link("Back", to: ~p"/admin/reports", class: "button button-link") %>
|
|
@ -1,48 +0,0 @@
|
|||
h1 Showing Report
|
||||
p
|
||||
= link_to_reported_thing @report.reportable
|
||||
|
||||
article.block.communication
|
||||
.block__content.flex.flex--no-wrap
|
||||
.flex__fixed.spacing-right
|
||||
= render PhilomenaWeb.UserAttributionView, "_anon_user_avatar.html", object: @report, conn: @conn
|
||||
.flex__grow.communication__body
|
||||
span.communication__body__sender-name = render PhilomenaWeb.UserAttributionView, "_anon_user.html", object: @report, awards: true, conn: @conn
|
||||
br
|
||||
= render PhilomenaWeb.UserAttributionView, "_anon_user_title.html", object: @report, conn: @conn
|
||||
.communication__body__text
|
||||
=<> @body
|
||||
|
||||
.block__content.communication__options
|
||||
.flex.flex--wrap.flex--spaced-out
|
||||
div
|
||||
' Reported
|
||||
= pretty_time @report.created_at
|
||||
|
||||
.flex__right
|
||||
=> link_to_ip @conn, @report.ip
|
||||
=> link_to_fingerprint @conn, @report.fingerprint
|
||||
|
||||
div
|
||||
' User-Agent:
|
||||
code
|
||||
= @report.user_agent
|
||||
|
||||
= if assigns[:mod_notes] do
|
||||
h4 Mod Notes
|
||||
= render PhilomenaWeb.Admin.ModNoteView, "_table.html", mod_notes: @mod_notes, conn: @conn
|
||||
= link "Add New Note", to: ~p"/admin/mod_notes/new?#{[notable_id: @report.id, notable_type: "Report"]}"
|
||||
|
||||
p
|
||||
= if @report.user do
|
||||
=> link "Send PM", to: ~p"/conversations/new?#{[recipient: @report.user.name]}", class: "button button--link"
|
||||
|
||||
= if @report.open do
|
||||
=> link "Close", to: ~p"/admin/reports/#{@report}/close", class: "button", data: [method: "post"]
|
||||
|
||||
= if current?(@report.admin, @conn.assigns.current_user) do
|
||||
=> link "Release", to: ~p"/admin/reports/#{@report}/claim", class: "button", data: [method: "delete"]
|
||||
- else
|
||||
=> link "Claim", to: ~p"/admin/reports/#{@report}/claim", class: "button", data: [method: "post"]
|
||||
|
||||
= link "Back", to: ~p"/admin/reports", class: "button button-link"
|
|
@ -0,0 +1,56 @@
|
|||
<%= form_for @changeset, @action, fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= label(f, :title, "Title (the bold bit) for the site notice; keep this short:") %>
|
||||
<%= text_input(f, :title, class: "input input--wide", placeholder: "Title", required: true) %>
|
||||
<%= error_tag(f, :title) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :text, "Main body of the site notice:") %>
|
||||
<%= text_input(f, :text, class: "input input--wide", placeholder: "Text", required: true) %>
|
||||
<%= error_tag(f, :text) %>
|
||||
</div>
|
||||
<h3>
|
||||
Link
|
||||
<small>
|
||||
(optional; leave these two fields blank for no link)
|
||||
</small>
|
||||
</h3>
|
||||
<div class="field">
|
||||
<%= label(f, :link_text, "Text which will contain the link:") %>
|
||||
<%= text_input(f, :link_text, class: "input input--wide", placeholder: "Link text") %>
|
||||
<%= error_tag(f, :link_text) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :link, "Link which the site notice should take users to:") %>
|
||||
<%= text_input(f, :link, class: "input input--wide", placeholder: "Link") %>
|
||||
<%= error_tag(f, :link) %>
|
||||
</div>
|
||||
<h3>
|
||||
Run Time
|
||||
</h3>
|
||||
<div class="field">
|
||||
<%= label(f, :start_time, "Start time for the site notice (usually \"now\"):") %>
|
||||
<%= text_input(f, :start_time, class: "input input--wide", required: true) %>
|
||||
<%= error_tag(f, :start_time) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :finish_time, "Finish time for the site notice (e.g. \"2 weeks from now\"):") %>
|
||||
<%= text_input(f, :finish_time, class: "input input--wide", required: true) %>
|
||||
<%= error_tag(f, :finish_time) %>
|
||||
</div>
|
||||
<h3>
|
||||
Enable
|
||||
</h3>
|
||||
<div class="field">
|
||||
<%= checkbox(f, :live, class: "checkbox") %>
|
||||
<%= label(f, :live, "Live") %>
|
||||
</div>
|
||||
<%= submit("Save Site Notice", class: "button") %>
|
||||
<% end %>
|
|
@ -1,47 +0,0 @@
|
|||
= form_for @changeset, @action, fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
.field
|
||||
=> label f, :title, "Title (the bold bit) for the site notice; keep this short:"
|
||||
= text_input f, :title, class: "input input--wide", placeholder: "Title", required: true
|
||||
= error_tag f, :title
|
||||
|
||||
.field
|
||||
=> label f, :text, "Main body of the site notice:"
|
||||
= text_input f, :text, class: "input input--wide", placeholder: "Text", required: true
|
||||
= error_tag f, :text
|
||||
|
||||
h3
|
||||
' Link
|
||||
small
|
||||
' (optional; leave these two fields blank for no link)
|
||||
|
||||
.field
|
||||
=> label f, :link_text, "Text which will contain the link:"
|
||||
= text_input f, :link_text, class: "input input--wide", placeholder: "Link text"
|
||||
= error_tag f, :link_text
|
||||
|
||||
.field
|
||||
=> label f, :link, "Link which the site notice should take users to:"
|
||||
= text_input f, :link, class: "input input--wide", placeholder: "Link"
|
||||
= error_tag f, :link
|
||||
|
||||
h3 Run Time
|
||||
.field
|
||||
=> label f, :start_time, "Start time for the site notice (usually \"now\"):"
|
||||
= text_input f, :start_time, class: "input input--wide", required: true
|
||||
= error_tag f, :start_time
|
||||
|
||||
.field
|
||||
=> label f, :finish_time, "Finish time for the site notice (e.g. \"2 weeks from now\"):"
|
||||
= text_input f, :finish_time, class: "input input--wide", required: true
|
||||
= error_tag f, :finish_time
|
||||
|
||||
h3 Enable
|
||||
.field
|
||||
=> checkbox f, :live, class: "checkbox"
|
||||
= label f, :live, "Live"
|
||||
|
||||
= submit "Save Site Notice", class: "button"
|
|
@ -0,0 +1,4 @@
|
|||
<h1>
|
||||
Editing site notice
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.SiteNoticeView, "_form.html", changeset: @changeset, action: ~p"/admin/site_notices/#{@site_notice}", conn: @conn) %>
|
|
@ -1,2 +0,0 @@
|
|||
h1 Editing site notice
|
||||
= render PhilomenaWeb.Admin.SiteNoticeView, "_form.html", changeset: @changeset, action: ~p"/admin/site_notices/#{@site_notice}", conn: @conn
|
|
@ -0,0 +1,65 @@
|
|||
<h1>
|
||||
Site Notices
|
||||
</h1>
|
||||
<% route = fn p -> ~p"/admin/site_notices?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @admin_site_notices, route: route, conn: @conn) %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<a href={~p"/admin/site_notices/new"}>
|
||||
<i class="fa fa-plus"></i>
|
||||
New site notice
|
||||
</a>
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Title
|
||||
</th>
|
||||
<th>
|
||||
Start
|
||||
</th>
|
||||
<th>
|
||||
Finish
|
||||
</th>
|
||||
<th>
|
||||
Live?
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for site_notice <- @admin_site_notices do %>
|
||||
<tr>
|
||||
<td>
|
||||
<em>
|
||||
<%= site_notice.title %>
|
||||
</em>
|
||||
</td>
|
||||
<td class={time_column_class(site_notice.start_date)}>
|
||||
<%= pretty_time(site_notice.start_date) %>
|
||||
</td>
|
||||
<td class={time_column_class(site_notice.finish_date)}>
|
||||
<%= pretty_time(site_notice.finish_date) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= live_text(site_notice) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Edit", to: ~p"/admin/site_notices/#{site_notice}/edit") %>
|
||||
•
|
||||
<%= link("Destroy", to: ~p"/admin/site_notices/#{site_notice}", data: [confirm: "Are you really, really sure?", method: "delete"]) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,44 +0,0 @@
|
|||
h1 Site Notices
|
||||
|
||||
- route = fn p -> ~p"/admin/site_notices?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @admin_site_notices, route: route, conn: @conn
|
||||
|
||||
.block
|
||||
.block__header
|
||||
a href=~p"/admin/site_notices/new"
|
||||
i.fa.fa-plus>
|
||||
' New site notice
|
||||
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th Title
|
||||
th Start
|
||||
th Finish
|
||||
th Live?
|
||||
th Options
|
||||
tbody
|
||||
= for site_notice <- @admin_site_notices do
|
||||
tr
|
||||
td
|
||||
em = site_notice.title
|
||||
|
||||
td class=time_column_class(site_notice.start_date)
|
||||
= pretty_time site_notice.start_date
|
||||
|
||||
td class=time_column_class(site_notice.finish_date)
|
||||
= pretty_time site_notice.finish_date
|
||||
|
||||
td
|
||||
= live_text site_notice
|
||||
|
||||
td
|
||||
=> link "Edit", to: ~p"/admin/site_notices/#{site_notice}/edit"
|
||||
' •
|
||||
=> link "Destroy", to: ~p"/admin/site_notices/#{site_notice}", data: [confirm: "Are you really, really sure?", method: "delete"]
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
|
@ -0,0 +1,4 @@
|
|||
<h1>
|
||||
New site notice
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.SiteNoticeView, "_form.html", changeset: @changeset, action: ~p"/admin/site_notices", conn: @conn) %>
|
|
@ -1,2 +0,0 @@
|
|||
h1 New site notice
|
||||
= render PhilomenaWeb.Admin.SiteNoticeView, "_form.html", changeset: @changeset, action: ~p"/admin/site_notices", conn: @conn
|
34
lib/philomena_web/templates/admin/subnet_ban/_form.html.heex
Normal file
34
lib/philomena_web/templates/admin/subnet_ban/_form.html.heex
Normal file
|
@ -0,0 +1,34 @@
|
|||
<%= form_for @changeset, @action, fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= label(f, :specification, "Specification:") %>
|
||||
<%= text_input(f, :specification, class: "input", placeholder: "Specification", required: true) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :reason, "Reason (shown to the banned user, and to staff on the user's profile page):") %>
|
||||
<%= text_input(f, :reason, class: "input input--wide", placeholder: "Reason", required: true) %>
|
||||
<%= error_tag(f, :reason) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :note, "Admin-only note:") %>
|
||||
<%= text_input(f, :note, class: "input input--wide", placeholder: "Note") %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= label(f, :until, "End time relative to now, in simple English (e.g. \"1 week from now\"):") %>
|
||||
<%= text_input(f, :until, class: "input input--wide", placeholder: "Until", required: true) %>
|
||||
<%= error_tag(f, :until) %>
|
||||
</div>
|
||||
<br />
|
||||
<div class="field">
|
||||
<%= checkbox(f, :enabled) %>
|
||||
<%= label(f, :enabled) %>
|
||||
</div>
|
||||
<br />
|
||||
<%= submit("Save Ban", class: "button") %>
|
||||
<% end %>
|
|
@ -1,30 +0,0 @@
|
|||
= form_for @changeset, @action, fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
.field
|
||||
=> label f, :specification, "Specification:"
|
||||
= text_input f, :specification, class: "input", placeholder: "Specification", required: true
|
||||
|
||||
.field
|
||||
=> label f, :reason, "Reason (shown to the banned user, and to staff on the user's profile page):"
|
||||
= text_input f, :reason, class: "input input--wide", placeholder: "Reason", required: true
|
||||
= error_tag f, :reason
|
||||
|
||||
.field
|
||||
=> label f, :note, "Admin-only note:"
|
||||
= text_input f, :note, class: "input input--wide", placeholder: "Note"
|
||||
|
||||
.field
|
||||
=> label f, :until, "End time relative to now, in simple English (e.g. \"1 week from now\"):"
|
||||
= text_input f, :until, class: "input input--wide", placeholder: "Until", required: true
|
||||
= error_tag f, :until
|
||||
|
||||
br
|
||||
.field
|
||||
=> checkbox f, :enabled
|
||||
= label f, :enabled
|
||||
br
|
||||
|
||||
= submit "Save Ban", class: "button"
|
|
@ -0,0 +1,6 @@
|
|||
<h1>
|
||||
Editing ban
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.SubnetBanView, "_form.html", changeset: @changeset, action: ~p"/admin/subnet_bans/#{@subnet}", conn: @conn) %>
|
||||
<br />
|
||||
<%= link("Back", to: ~p"/admin/subnet_bans") %>
|
|
@ -1,6 +0,0 @@
|
|||
h1 Editing ban
|
||||
|
||||
= render PhilomenaWeb.Admin.SubnetBanView, "_form.html", changeset: @changeset, action: ~p"/admin/subnet_bans/#{@subnet}", conn: @conn
|
||||
|
||||
br
|
||||
= link "Back", to: ~p"/admin/subnet_bans"
|
86
lib/philomena_web/templates/admin/subnet_ban/index.html.heex
Normal file
86
lib/philomena_web/templates/admin/subnet_ban/index.html.heex
Normal file
|
@ -0,0 +1,86 @@
|
|||
<h1>
|
||||
Subnet Bans
|
||||
</h1>
|
||||
<% route = fn p -> ~p"/admin/subnet_bans?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @subnet_bans, route: route, params: page_params(@conn.params)) %>
|
||||
<%= form_for :subnet_ban, ~p"/admin/subnet_bans", [method: "get", class: "hform"], fn f -> %>
|
||||
<div class="field">
|
||||
<%= text_input(f, :q, name: "q", class: "hform__text input", placeholder: "Search") %>
|
||||
<%= submit("Search", class: "button hform__button") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<a href={~p"/admin/subnet_bans/new"}>
|
||||
<i class="fa fa-plus"></i>
|
||||
New subnet ban
|
||||
</a>
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Specification
|
||||
</th>
|
||||
<th>
|
||||
Created
|
||||
</th>
|
||||
<th>
|
||||
Expires
|
||||
</th>
|
||||
<th>
|
||||
Reason/Note
|
||||
</th>
|
||||
<th>
|
||||
Ban ID
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for ban <- @subnet_bans do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= link(ban.specification, to: ~p"/ip_profiles/#{to_string(ban.specification)}") %>
|
||||
</td>
|
||||
<td>
|
||||
<%= pretty_time(ban.created_at) %>
|
||||
<%= user_abbrv(ban.banning_user) %>
|
||||
</td>
|
||||
<td class={ban_row_class(ban)}>
|
||||
<%= pretty_time(ban.valid_until) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= ban.reason %>
|
||||
<%= if present?(ban.note) do %>
|
||||
<p class="block block--fixed">
|
||||
<em>
|
||||
Note:
|
||||
<%= ban.note %>
|
||||
</em>
|
||||
</p>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= ban.generated_ban_id %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link("Edit", to: ~p"/admin/subnet_bans/#{ban}/edit") %>
|
||||
<%= if @current_user.role == "admin" do %>
|
||||
•
|
||||
<%= link("Destroy", to: ~p"/admin/subnet_bans/#{ban}", data: [confirm: "Are you really, really sure?", method: "delete"]) %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,62 +0,0 @@
|
|||
h1 Subnet Bans
|
||||
|
||||
- route = fn p -> ~p"/admin/subnet_bans?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @subnet_bans, route: route, params: page_params(@conn.params)
|
||||
|
||||
= form_for :subnet_ban, ~p"/admin/subnet_bans", [method: "get", class: "hform"], fn f ->
|
||||
.field
|
||||
= text_input f, :q, name: "q", class: "hform__text input", placeholder: "Search"
|
||||
= submit "Search", class: "button hform__button"
|
||||
|
||||
.block
|
||||
.block__header
|
||||
a href=~p"/admin/subnet_bans/new"
|
||||
i.fa.fa-plus>
|
||||
' New subnet ban
|
||||
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th Specification
|
||||
th Created
|
||||
th Expires
|
||||
th Reason/Note
|
||||
th Ban ID
|
||||
th Options
|
||||
|
||||
tbody
|
||||
= for ban <- @subnet_bans do
|
||||
tr
|
||||
td
|
||||
= link ban.specification, to: ~p"/ip_profiles/#{to_string(ban.specification)}"
|
||||
|
||||
td
|
||||
=> pretty_time ban.created_at
|
||||
= user_abbrv ban.banning_user
|
||||
|
||||
td class=ban_row_class(ban)
|
||||
= pretty_time ban.valid_until
|
||||
|
||||
td
|
||||
= ban.reason
|
||||
|
||||
= if present?(ban.note) do
|
||||
p.block.block--fixed
|
||||
em
|
||||
' Note:
|
||||
= ban.note
|
||||
|
||||
td
|
||||
= ban.generated_ban_id
|
||||
|
||||
td
|
||||
=> link "Edit", to: ~p"/admin/subnet_bans/#{ban}/edit"
|
||||
= if @current_user.role == "admin" do
|
||||
' •
|
||||
=> link "Destroy", to: ~p"/admin/subnet_bans/#{ban}", data: [confirm: "Are you really, really sure?", method: "delete"]
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
|
@ -0,0 +1,6 @@
|
|||
<h1>
|
||||
New Subnet Ban
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.SubnetBanView, "_form.html", changeset: @changeset, action: ~p"/admin/subnet_bans", conn: @conn) %>
|
||||
<br />
|
||||
<%= link("Back", to: ~p"/admin/subnet_bans") %>
|
|
@ -1,5 +0,0 @@
|
|||
h1 New Subnet Ban
|
||||
= render PhilomenaWeb.Admin.SubnetBanView, "_form.html", changeset: @changeset, action: ~p"/admin/subnet_bans", conn: @conn
|
||||
|
||||
br
|
||||
= link "Back", to: ~p"/admin/subnet_bans"
|
121
lib/philomena_web/templates/admin/user/_form.html.heex
Normal file
121
lib/philomena_web/templates/admin/user/_form.html.heex
Normal file
|
@ -0,0 +1,121 @@
|
|||
<%= form_for @changeset, @action, fn f -> %>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<span class="block__header__title">
|
||||
Essential user details
|
||||
</span>
|
||||
</div>
|
||||
<label class="table-list__label">
|
||||
<div class="table-list__label__text">
|
||||
Name:
|
||||
</div>
|
||||
<div class="table-list__label__input">
|
||||
<%= error_tag(f, :name) %>
|
||||
<%= text_input(f, :name, class: "input") %>
|
||||
</div>
|
||||
</label>
|
||||
<label class="table-list__label">
|
||||
<div class="table-list__label__text">
|
||||
Email:
|
||||
</div>
|
||||
<div class="table-list__label__input">
|
||||
<%= error_tag(f, :email) %>
|
||||
<%= text_input(f, :email, class: "input") %>
|
||||
</div>
|
||||
</label>
|
||||
<label class="table-list__label">
|
||||
<div class="table-list__label__text">
|
||||
Role:
|
||||
</div>
|
||||
<div class="table-list__label__input">
|
||||
<%= select(f, :role, ["user", "assistant", "moderator", "admin"], class: "input") %>
|
||||
</div>
|
||||
</label>
|
||||
<label class="table-list__label">
|
||||
<div class="table-list__label__text">
|
||||
Secondary banner:
|
||||
</div>
|
||||
<div class="table-list__label__input">
|
||||
<%= select(f, :secondary_role, [[key: "-", value: ""], "Site Developer", "Devops", "Philomena Contributor", "Public Relations"], class: "input") %>
|
||||
</div>
|
||||
</label>
|
||||
<label class="table-list__label">
|
||||
<div class="table-list__label__text">
|
||||
Hide staff banner:
|
||||
</div>
|
||||
<div class="table-list__label__input">
|
||||
<%= checkbox(f, :hide_default_role, class: "checkbox") %>
|
||||
</div>
|
||||
</label>
|
||||
<label class="table-list__label">
|
||||
<div class="table-list__label__text">
|
||||
Senior staff:
|
||||
</div>
|
||||
<div class="table-list__label__input">
|
||||
<%= checkbox(f, :senior_staff, class: "checkbox") %>
|
||||
</div>
|
||||
</label>
|
||||
<label class="table-list__label">
|
||||
<div class="table-list__label__text">
|
||||
Bypass rate limits:
|
||||
</div>
|
||||
<div class="table-list__label__input">
|
||||
<%= checkbox(f, :bypass_rate_limits, class: "checkbox") %>
|
||||
</div>
|
||||
</label>
|
||||
<div class="table-list__label">
|
||||
<div class="table-list__label__text">
|
||||
Avatar
|
||||
</div>
|
||||
<div class="table-list__label__input">
|
||||
<%= link("Remove avatar", to: ~p"/admin/users/#{@user}/avatar", class: "button", data: [method: "delete", confirm: "Are you really, really sure?"]) %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<span class="block__header__title">
|
||||
General user flags
|
||||
</span>
|
||||
</div>
|
||||
<ul>
|
||||
<p>
|
||||
<strong>
|
||||
Be careful when issuing these permissions to staff members!
|
||||
</strong>
|
||||
Staff members with relevant roles may have these permissions anyway. Issuing them may break things, such as tag aliasing.
|
||||
</p>
|
||||
</ul>
|
||||
<ul>
|
||||
<%= collection_checkboxes(f, :roles, filtered_roles(general_permissions(), @roles), mapper: &checkbox_mapper/6) %>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="block">
|
||||
<div class="block__header warning">
|
||||
<span class="block__header__title">
|
||||
Special roles for assistants
|
||||
</span>
|
||||
</div>
|
||||
<ul>
|
||||
<%= collection_checkboxes(f, :roles, filtered_roles(assistant_permissions(), @roles), mapper: &checkbox_mapper/6) %>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="block">
|
||||
<div class="block__header danger">
|
||||
<span class="block__header__title">
|
||||
Special roles for moderators
|
||||
</span>
|
||||
</div>
|
||||
<ul>
|
||||
<%= collection_checkboxes(f, :roles, filtered_roles(moderator_permissions(), @roles), mapper: &checkbox_mapper/6) %>
|
||||
</ul>
|
||||
</div>
|
||||
<%= submit("Save User", class: "button") %>
|
||||
<% end %>
|
|
@ -1,58 +0,0 @@
|
|||
= form_for @changeset, @action, fn f ->
|
||||
= if @changeset.action do
|
||||
.alert.alert-danger
|
||||
p Oops, something went wrong! Please check the errors below.
|
||||
|
||||
.block
|
||||
.block__header
|
||||
span.block__header__title Essential user details
|
||||
label.table-list__label
|
||||
.table-list__label__text Name:
|
||||
.table-list__label__input
|
||||
= error_tag f, :name
|
||||
= text_input f, :name, class: "input"
|
||||
label.table-list__label
|
||||
.table-list__label__text Email:
|
||||
.table-list__label__input
|
||||
= error_tag f, :email
|
||||
= text_input f, :email, class: "input"
|
||||
label.table-list__label
|
||||
.table-list__label__text Role:
|
||||
.table-list__label__input = select f, :role, ["user", "assistant", "moderator", "admin"], class: "input"
|
||||
label.table-list__label
|
||||
.table-list__label__text Secondary banner:
|
||||
.table-list__label__input = select f, :secondary_role, [[key: "-", value: ""], "Site Developer", "Devops", "Philomena Contributor", "Public Relations"], class: "input"
|
||||
label.table-list__label
|
||||
.table-list__label__text Hide staff banner:
|
||||
.table-list__label__input = checkbox f, :hide_default_role, class: "checkbox"
|
||||
label.table-list__label
|
||||
.table-list__label__text Senior staff:
|
||||
.table-list__label__input = checkbox f, :senior_staff, class: "checkbox"
|
||||
label.table-list__label
|
||||
.table-list__label__text Bypass rate limits:
|
||||
.table-list__label__input = checkbox f, :bypass_rate_limits, class: "checkbox"
|
||||
.table-list__label
|
||||
.table-list__label__text Avatar
|
||||
.table-list__label__input
|
||||
= link "Remove avatar", to: ~p"/admin/users/#{@user}/avatar", class: "button", data: [method: "delete", confirm: "Are you really, really sure?"]
|
||||
|
||||
.block
|
||||
.block__header
|
||||
span.block__header__title General user flags
|
||||
ul
|
||||
p
|
||||
strong> Be careful when issuing these permissions to staff members!
|
||||
| Staff members with relevant roles may have these permissions anyway. Issuing them may break things, such as tag aliasing.
|
||||
ul = collection_checkboxes f, :roles, filtered_roles(general_permissions(), @roles), mapper: &checkbox_mapper/6
|
||||
|
||||
.block
|
||||
.block__header.warning
|
||||
span.block__header__title Special roles for assistants
|
||||
ul = collection_checkboxes f, :roles, filtered_roles(assistant_permissions(), @roles), mapper: &checkbox_mapper/6
|
||||
|
||||
.block
|
||||
.block__header.danger
|
||||
span.block__header__title Special roles for moderators
|
||||
ul = collection_checkboxes f, :roles, filtered_roles(moderator_permissions(), @roles), mapper: &checkbox_mapper/6
|
||||
|
||||
= submit "Save User", class: "button"
|
4
lib/philomena_web/templates/admin/user/edit.html.heex
Normal file
4
lib/philomena_web/templates/admin/user/edit.html.heex
Normal file
|
@ -0,0 +1,4 @@
|
|||
<h1>
|
||||
Editing user
|
||||
</h1>
|
||||
<%= render(PhilomenaWeb.Admin.UserView, "_form.html", Map.put(assigns, :action, ~p"/admin/users/#{@user}")) %>
|
|
@ -1,3 +0,0 @@
|
|||
h1 Editing user
|
||||
|
||||
= render PhilomenaWeb.Admin.UserView, "_form.html", Map.put(assigns, :action, ~p"/admin/users/#{@user}")
|
|
@ -0,0 +1,12 @@
|
|||
<h1>
|
||||
Force-assigning a filter for user
|
||||
<%= @user.name %>
|
||||
</h1>
|
||||
<%= form_for @changeset, ~p"/admin/users/#{@user}/force_filter", [method: "post"], fn f -> %>
|
||||
<div class="field">
|
||||
<%= text_input(f, :forced_filter_id, placeholder: "Filter ID", class: "input", required: true) %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= submit("Force", class: "button button--state-primary") %>
|
||||
</div>
|
||||
<% end %>
|
|
@ -1,9 +0,0 @@
|
|||
h1
|
||||
' Force-assigning a filter for user
|
||||
= @user.name
|
||||
|
||||
= form_for @changeset, ~p"/admin/users/#{@user}/force_filter", [method: "post"], fn f ->
|
||||
.field
|
||||
=> text_input f, :forced_filter_id, placeholder: "Filter ID", class: "input", required: true
|
||||
.field
|
||||
= submit "Force", class: "button button--state-primary"
|
124
lib/philomena_web/templates/admin/user/index.html.heex
Normal file
124
lib/philomena_web/templates/admin/user/index.html.heex
Normal file
|
@ -0,0 +1,124 @@
|
|||
<h1>
|
||||
Users
|
||||
</h1>
|
||||
<%= form_for :user, ~p"/admin/users", [method: "get", class: "hform"], fn f -> %>
|
||||
<div class="field">
|
||||
<%= text_input(f, :q, name: "q", class: "hform__text input", placeholder: "Search query") %>
|
||||
<%= submit("Search", class: "button hform__button") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<%= link("Site staff", to: ~p"/admin/users?#{[staff: 1]}") %>
|
||||
•
|
||||
<%= link("2FA users", to: ~p"/admin/users?#{[twofactor: 1]}") %>
|
||||
<% route = fn p -> ~p"/admin/users?#{p}" end %>
|
||||
<% pagination = render(PhilomenaWeb.PaginationView, "_pagination.html", page: @users, route: route, conn: @conn, params: page_params(@conn.params)) %>
|
||||
<div class="block">
|
||||
<div class="block__header">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
<div class="block__content"></div>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Name
|
||||
</th>
|
||||
<th>
|
||||
Email
|
||||
</th>
|
||||
<th>
|
||||
Activated
|
||||
</th>
|
||||
<th>
|
||||
Role
|
||||
</th>
|
||||
<th>
|
||||
Created
|
||||
</th>
|
||||
<th>
|
||||
Options
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= for user <- @users do %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= link(user.name, to: ~p"/profiles/#{user}") %>
|
||||
<%= cond do %>
|
||||
<% user.otp_required_for_login -> %>
|
||||
<span class="banner__2fa success">
|
||||
<i class="fas fa-check"></i>
|
||||
2FA
|
||||
</span>
|
||||
<% user.role != "user" and !user.otp_required_for_login -> %>
|
||||
<span class="banner__2fa danger">
|
||||
<i class="fas fa-times"></i>
|
||||
2FA
|
||||
</span>
|
||||
<% true -> %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= if can?(@conn, :edit, Philomena.Users.User) do %>
|
||||
<%= user.email %>
|
||||
<% else %>
|
||||
<i>
|
||||
N/A
|
||||
</i>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= cond do %>
|
||||
<% user.deleted_at -> %>
|
||||
<strong>
|
||||
Deactivated
|
||||
</strong>
|
||||
<%= pretty_time(user.deleted_at) %>
|
||||
<% user.confirmed_at -> %>
|
||||
Active
|
||||
<% true -> %>
|
||||
<strong>
|
||||
Unconfirmed
|
||||
</strong>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= String.capitalize(user.role) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= pretty_time(user.created_at) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= if can?(@conn, :edit, user) do %>
|
||||
<%= link to: ~p"/admin/users/#{user}/edit" do %>
|
||||
<i class="fa fa-fw fa-user-edit"></i>
|
||||
Edit
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% # = if user.deleted_at do %>
|
||||
<% # => link_to 'Reactivate', admin_user_activation_path(user), data: { confirm: t('are_you_sure') }, method: :create %>
|
||||
<% # - else %>
|
||||
<% # => link_to 'Deactivate', admin_user_activation_path(user), data: { confirm: t('are_you_sure') }, method: :delete %>
|
||||
<% # ' • %>
|
||||
<%= if can?(@conn, :index, Philomena.Bans.User) do %>
|
||||
<%= link to: ~p"/admin/user_bans/new?#{[username: user.name]}" do %>
|
||||
<i class="fa fa-fw fa-ban"></i>
|
||||
Ban
|
||||
<% end %>
|
||||
<% end %>
|
||||
<%= if can?(@conn, :edit, Philomena.ArtistLinks.ArtistLink) do %>
|
||||
<%= link to: ~p"/profiles/#{user}/artist_links/new" do %>
|
||||
<i class="fa fa-fw fa-link"></i>
|
||||
Add link
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="block__header block__header--light">
|
||||
<%= pagination %>
|
||||
</div>
|
||||
</div>
|
|
@ -1,94 +0,0 @@
|
|||
h1 Users
|
||||
|
||||
= form_for :user, ~p"/admin/users", [method: "get", class: "hform"], fn f ->
|
||||
.field
|
||||
=> text_input f, :q, name: "q", class: "hform__text input", placeholder: "Search query"
|
||||
= submit "Search", class: "button hform__button"
|
||||
|
||||
=> link "Site staff", to: ~p"/admin/users?#{[staff: 1]}"
|
||||
' •
|
||||
=> link "2FA users", to: ~p"/admin/users?#{[twofactor: 1]}"
|
||||
|
||||
- route = fn p -> ~p"/admin/users?#{p}" end
|
||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @users, route: route, conn: @conn, params: page_params(@conn.params)
|
||||
|
||||
.block
|
||||
.block__header
|
||||
= pagination
|
||||
|
||||
.block__content
|
||||
table.table
|
||||
thead
|
||||
tr
|
||||
th Name
|
||||
th Email
|
||||
th Activated
|
||||
th Role
|
||||
th Created
|
||||
th Options
|
||||
tbody
|
||||
= for user <- @users do
|
||||
tr
|
||||
td
|
||||
= link user.name, to: ~p"/profiles/#{user}"
|
||||
|
||||
= cond do
|
||||
- user.otp_required_for_login ->
|
||||
span.banner__2fa.success
|
||||
i.fas.fa-check>
|
||||
' 2FA
|
||||
|
||||
- user.role != "user" and !user.otp_required_for_login ->
|
||||
span.banner__2fa.danger
|
||||
i.fas.fa-times>
|
||||
' 2FA
|
||||
|
||||
- true ->
|
||||
|
||||
td
|
||||
= if can?(@conn, :edit, Philomena.Users.User) do
|
||||
= user.email
|
||||
- else
|
||||
i N/A
|
||||
|
||||
td
|
||||
= cond do
|
||||
- user.deleted_at ->
|
||||
strong> Deactivated
|
||||
= pretty_time user.deleted_at
|
||||
|
||||
- user.confirmed_at ->
|
||||
' Active
|
||||
|
||||
- true ->
|
||||
strong> Unconfirmed
|
||||
|
||||
td
|
||||
= String.capitalize(user.role)
|
||||
|
||||
td
|
||||
= pretty_time user.created_at
|
||||
|
||||
td
|
||||
= if can?(@conn, :edit, user) do
|
||||
=> link to: ~p"/admin/users/#{user}/edit" do
|
||||
i.fa.fa-fw.fa-user-edit
|
||||
' Edit
|
||||
|
||||
/= if user.deleted_at do
|
||||
/ => link_to 'Reactivate', admin_user_activation_path(user), data: { confirm: t('are_you_sure') }, method: :create
|
||||
/- else
|
||||
/ => link_to 'Deactivate', admin_user_activation_path(user), data: { confirm: t('are_you_sure') }, method: :delete
|
||||
/' •
|
||||
|
||||
= if can?(@conn, :index, Philomena.Bans.User) do
|
||||
=> link to: ~p"/admin/user_bans/new?#{[username: user.name]}" do
|
||||
i.fa.fa-fw.fa-ban
|
||||
' Ban
|
||||
= if can?(@conn, :edit, Philomena.ArtistLinks.ArtistLink) do
|
||||
=> link to: ~p"/profiles/#{user}/artist_links/new" do
|
||||
i.fa.fa-fw.fa-link
|
||||
' Add link
|
||||
|
||||
.block__header.block__header--light
|
||||
= pagination
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue