[deploy] Extracts DisplayAds from Administrate into admin (#10153)
* Extracts DisplayAds from Administrate into admin * Suggested changes
This commit is contained in:
parent
f82ea80fcf
commit
ada2d0c728
11 changed files with 297 additions and 2 deletions
|
|
@ -13,6 +13,7 @@ module Admin
|
|||
{ name: "chat_channels", controller: "chat_channels" },
|
||||
{ name: "comments", controller: "comments" },
|
||||
{ name: "config", controller: "config" },
|
||||
{ name: "display_ads", controller: "display_ads" },
|
||||
{ name: "events", controller: "events" },
|
||||
{ name: "growth", controller: "growth" },
|
||||
{ name: "listings", controller: "listings" },
|
||||
|
|
|
|||
70
app/controllers/admin/display_ads_controller.rb
Normal file
70
app/controllers/admin/display_ads_controller.rb
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
module Admin
|
||||
class DisplayAdsController < Admin::ApplicationController
|
||||
layout "admin"
|
||||
|
||||
def index
|
||||
@display_ads = DisplayAd.order(id: :desc)
|
||||
.joins(:organization)
|
||||
.includes([:organization])
|
||||
.page(params[:page]).per(50)
|
||||
|
||||
return if params[:search].blank?
|
||||
|
||||
@display_ads = @display_ads.where("organizations.name ILIKE :search", search: "%#{params[:search]}%")
|
||||
end
|
||||
|
||||
def new
|
||||
@display_ad = DisplayAd.new
|
||||
end
|
||||
|
||||
def edit
|
||||
@display_ad = DisplayAd.find(params[:id])
|
||||
end
|
||||
|
||||
def create
|
||||
@display_ad = DisplayAd.new(display_ad_params)
|
||||
|
||||
if @display_ad.save
|
||||
flash[:success] = "Display Ad has been created!"
|
||||
redirect_to admin_display_ads_path
|
||||
else
|
||||
flash[:danger] = @display_ad.errors_as_sentence
|
||||
render new_admin_display_ad_path
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
@display_ad = DisplayAd.find(params[:id])
|
||||
|
||||
if @display_ad.update(display_ad_params)
|
||||
flash[:success] = "Display Ad has been updated!"
|
||||
redirect_to admin_display_ads_path
|
||||
else
|
||||
flash[:danger] = @display_ad.errors_as_sentence
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
@display_ad = DisplayAd.find(params[:id])
|
||||
|
||||
if @display_ad.destroy
|
||||
flash[:success] = "Display Ad has been deleted!"
|
||||
redirect_to admin_display_ads_path
|
||||
else
|
||||
flash[:danger] = "Something went wrong with deleting the Display Ad."
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def display_ad_params
|
||||
params.permit(:organization_id, :body_markdown, :placement_area, :published, :approved)
|
||||
end
|
||||
|
||||
def authorize_admin
|
||||
authorize DisplayAd, :access?, policy_class: InternalPolicy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -22,7 +22,6 @@ class DashboardManifest
|
|||
tags
|
||||
email_messages
|
||||
feedback_messages
|
||||
display_ads
|
||||
badges
|
||||
badge_achievements
|
||||
html_variants
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ module Constants
|
|||
"Resource Admin: Page",
|
||||
"Resource Admin: FeedbackMessage",
|
||||
"Resource Admin: Config",
|
||||
"Resource Admin: Broadcast"].freeze
|
||||
"Resource Admin: Broadcast",
|
||||
"Resource Admin: DisplayAd"].freeze
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
class DisplayAd < ApplicationRecord
|
||||
resourcify
|
||||
|
||||
belongs_to :organization
|
||||
has_many :display_ad_events, dependent: :destroy
|
||||
|
||||
|
|
|
|||
24
app/views/admin/display_ads/_form.html.erb
Normal file
24
app/views/admin/display_ads/_form.html.erb
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<div class="form-group">
|
||||
<%= label_tag :organization_id, "Organization ID:" %>
|
||||
<%= text_field_tag :organization_id, @display_ad.organization_id, class: "form-control" %>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<%= label_tag :body_markdown, "Body Markdown:" %>
|
||||
<%= text_area_tag :body_markdown, @display_ad.body_markdown, size: "100x10", class: "form-control" %>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<%= label_tag :placement_area, "Placement Area:" %>
|
||||
<%= select_tag :placement_area, options_for_select(%w[sidebar_left sidebar_right], selected: @display_ad.placement_area), include_blank: true %>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<%= label_tag :published, "Published:" %>
|
||||
<%= select_tag :published, options_for_select([false, true], selected: @display_ad.published) %>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<%= label_tag :approved, "Approved:" %>
|
||||
<%= select_tag :approved, options_for_select([false, true], selected: @display_ad.approved) %>
|
||||
</div>
|
||||
7
app/views/admin/display_ads/edit.html.erb
Normal file
7
app/views/admin/display_ads/edit.html.erb
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<h2 class="fs-2xl s:fs-3xl mb-6">Edit Display Ad:</h2>
|
||||
<div class="crayons-card p-6">
|
||||
<%= form_for([:admin, @display_ad], method: :patch) do %>
|
||||
<%= render "form" %>
|
||||
<%= submit_tag "Update Display Ad", class: "btn btn-primary" %>
|
||||
<% end %>
|
||||
</div>
|
||||
43
app/views/admin/display_ads/index.html.erb
Normal file
43
app/views/admin/display_ads/index.html.erb
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<nav class="flex mb-4" aria-label="Display Ads navigation">
|
||||
<%= form_tag("/admin/display_ads", method: "get") do %>
|
||||
<%= text_field_tag(:search, params[:search], aria: { label: "Search" }, class: "top-bar--search-input crayons-textfield", placeholder: "Search by Org name") %>
|
||||
<% end %>
|
||||
<div class="ml-auto">
|
||||
<div class="justify-content-end">
|
||||
<%= link_to "Make A New Display Ad", new_admin_display_ad_path, class: "crayons-btn" %>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<%= paginate @display_ads %>
|
||||
|
||||
<table class="crayons-table" width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">ID</th>
|
||||
<th scope="col">Organization</th>
|
||||
<th scope="col">Placement Area</th>
|
||||
<th scope="col">Body Markdown</th>
|
||||
<th scope="col">Published</th>
|
||||
<th scope="col">Approved</th>
|
||||
<th scope="col">Success Rate</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="crayons-card">
|
||||
<% @display_ads.each do |display_ad| %>
|
||||
<tr>
|
||||
<td><%= link_to display_ad.id, edit_admin_display_ad_path(display_ad) %></td>
|
||||
<td><%= link_to display_ad.organization.name, admin_organization_path(display_ad.organization) %></td>
|
||||
<td><%= display_ad.placement_area %></td>
|
||||
<td><%= display_ad.body_markdown.truncate(30) %></td>
|
||||
<td><%= display_ad.published %></td>
|
||||
<td><%= display_ad.approved %></td>
|
||||
<td><%= display_ad.success_rate %></td>
|
||||
<td><%= link_to "Edit", edit_admin_display_ad_path(display_ad), class: "crayons-btn" %></td>
|
||||
<td><%= link_to "Destroy", admin_display_ad_path(display_ad), class: "crayons-btn crayons-btn--danger", method: :delete, data: { confirm: "Are you sure?" } %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<%= paginate @display_ads %>
|
||||
7
app/views/admin/display_ads/new.html.erb
Normal file
7
app/views/admin/display_ads/new.html.erb
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<h2 class="fs-2xl s:fs-3xl mb-6">Make a new Display Ad:</h2>
|
||||
<div class="crayons-card p-6">
|
||||
<%= form_for([:admin, @display_ad], method: :post) do %>
|
||||
<%= render "form" %>
|
||||
<%= submit_tag "Create Display Ad", class: "btn btn-primary" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
|
@ -121,6 +121,7 @@ Rails.application.routes.draw do
|
|||
resources :webhook_endpoints, only: :index
|
||||
resource :config
|
||||
resources :badges, only: %i[index edit update new create]
|
||||
resources :display_ads, only: %i[index edit update new create destroy]
|
||||
# These redirects serve as a safegaurd to prevent 404s for any Admins
|
||||
# who have the old badge_achievement URLs bookmarked.
|
||||
get "/badges/badge_achievements", to: redirect("/admin/badge_achievements")
|
||||
|
|
|
|||
140
spec/requests/admin/display_ads_spec.rb
Normal file
140
spec/requests/admin/display_ads_spec.rb
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
require "rails_helper"
|
||||
require "requests/shared_examples/internal_policy_dependant_request"
|
||||
|
||||
RSpec.describe "/admin/display_ads", type: :request do
|
||||
let(:get_resource) { get "/admin/display_ads" }
|
||||
let(:org) { create(:organization) }
|
||||
let(:params) do
|
||||
{ organization_id: org.id, body_markdown: "[Click here!](https://example.com)", placement_area: "sidebar_left",
|
||||
approved: true, published: true }
|
||||
end
|
||||
let(:post_resource) { post "/admin/display_ads", params: params }
|
||||
|
||||
it_behaves_like "an InternalPolicy dependant request", DisplayAd do
|
||||
let(:request) { get_resource }
|
||||
end
|
||||
|
||||
context "when the user is not an admin" do
|
||||
let(:user) { create(:user) }
|
||||
|
||||
before { sign_in user }
|
||||
|
||||
describe "GET /admin/display_ads" do
|
||||
it "blocks the request" do
|
||||
expect { get_resource }.to raise_error(Pundit::NotAuthorizedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /admin/display_ads" do
|
||||
it "blocks the request" do
|
||||
expect { post_resource }.to raise_error(Pundit::NotAuthorizedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the user is a super admin" do
|
||||
let(:super_admin) { create(:user, :super_admin) }
|
||||
|
||||
before { sign_in super_admin }
|
||||
|
||||
describe "GET /admin/display_ads" do
|
||||
it "allows the request" do
|
||||
get_resource
|
||||
expect(response).to have_http_status(:ok)
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /admin/display_ads" do
|
||||
it "creates a new display_ad" do
|
||||
expect do
|
||||
post_resource
|
||||
end.to change { DisplayAd.all.count }.by(1)
|
||||
end
|
||||
end
|
||||
|
||||
describe "PUT /admin/display_ads" do
|
||||
let!(:display_ad) { create(:display_ad, approved: false) }
|
||||
|
||||
it "updates DisplayAd's approved value" do
|
||||
Timecop.freeze(Time.current) do
|
||||
expect do
|
||||
put "/admin/display_ads/#{display_ad.id}", params: params
|
||||
end.to change { display_ad.reload.approved }.from(false).to(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "DELETE /admin/display_ads/:id" do
|
||||
let!(:display_ad) { create(:display_ad) }
|
||||
|
||||
it "deletes the Display Ad" do
|
||||
expect do
|
||||
delete "/admin/display_ads/#{display_ad.id}"
|
||||
end.to change { DisplayAd.all.count }.by(-1)
|
||||
expect(response.body).to redirect_to "/admin/display_ads"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the user is a single resource admin" do
|
||||
let(:single_resource_admin) { create(:user, :single_resource_admin, resource: DisplayAd) }
|
||||
|
||||
before { sign_in single_resource_admin }
|
||||
|
||||
describe "GET /admin/display_ads" do
|
||||
it "allows the request" do
|
||||
get_resource
|
||||
expect(response).to have_http_status(:ok)
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /admin/display_ads" do
|
||||
it "creates a new display_ad" do
|
||||
expect do
|
||||
post_resource
|
||||
end.to change { DisplayAd.all.count }.by(1)
|
||||
end
|
||||
end
|
||||
|
||||
describe "PUT /admin/display_ads" do
|
||||
let!(:display_ad) { create(:display_ad, approved: false) }
|
||||
|
||||
it "updates DisplayAd's approved value" do
|
||||
Timecop.freeze(Time.current) do
|
||||
expect do
|
||||
put "/admin/display_ads/#{display_ad.id}", params: params
|
||||
end.to change { display_ad.reload.approved }.from(false).to(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "DELETE /admin/display_ads/:id" do
|
||||
let!(:display_ad) { create(:display_ad) }
|
||||
|
||||
it "deletes the Display Ad" do
|
||||
expect do
|
||||
delete "/admin/display_ads/#{display_ad.id}"
|
||||
end.to change { DisplayAd.all.count }.by(-1)
|
||||
expect(response.body).to redirect_to "/admin/display_ads"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the user is the wrong single resource admin" do
|
||||
let(:single_resource_admin) { create(:user, :single_resource_admin, resource: Article) }
|
||||
|
||||
before { sign_in single_resource_admin }
|
||||
|
||||
describe "GET /admin/display_ads" do
|
||||
it "blocks the request" do
|
||||
expect { get_resource }.to raise_error(Pundit::NotAuthorizedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /admin/display_ads" do
|
||||
it "blocks the request" do
|
||||
expect { post_resource }.to raise_error(Pundit::NotAuthorizedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Reference in a new issue