Skip to content

Commit

Permalink
Add display messages
Browse files Browse the repository at this point in the history
  • Loading branch information
jcoyne committed Jun 29, 2020
1 parent f7e030e commit 3e164aa
Show file tree
Hide file tree
Showing 23 changed files with 500 additions and 10 deletions.
4 changes: 4 additions & 0 deletions app/controllers/catalog_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,10 @@ class CatalogController < ApplicationController

def index
@presenter = HomeTextPresenter.new(current_user)
unless has_search_parameters?
@presenter.primary_messages = ContentBlock.active.primary
@presenter.secondary_messages = ContentBlock.active.secondary
end
super
end

Expand Down
42 changes: 42 additions & 0 deletions app/controllers/content_blocks_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# frozen_string_literal: true

class ContentBlocksController < ApplicationController
before_action :set_content_block, only: %i[create update destroy]
authorize_resource

# GET /content_blocks
def index
@unexpired_blocks = ContentBlock.unexpired
@expired_blocks = ContentBlock.expired
end

# POST /content_blocks
def create
@content_block.save!
redirect_to content_blocks_path
end

# PATCH/PUT /content_blocks/1
def update
@content_block.save!
redirect_to content_blocks_path
end

# DELETE /content_blocks/1
def destroy
@content_block.destroy
redirect_to content_blocks_path
end

private

# Use callbacks to share common setup or constraints between actions.
def set_content_block
@content_block = params[:id] ? ContentBlock.find(params[:id]) : ContentBlock.new
return unless params[:content_block]

start_at = params[:content_block][:start_at].in_time_zone('America/Los_Angeles')
end_at = params[:content_block][:end_at].in_time_zone('America/Los_Angeles').end_of_day
@content_block.attributes = { end_at: end_at, start_at: start_at, ordinal: params[:content_block][:ordinal], value: params[:content_block][:value] }
end
end
5 changes: 5 additions & 0 deletions app/javascript/argo.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import Form from 'modules/apo_form'
import CollectionEditor from 'controllers/collection_editor'
import ContentBlockNew from 'controllers/content_block_new'
import ContentBlockEdit from 'controllers/content_block_edit'

import BulkActions from 'controllers/bulk_actions'
import BulkUpload from 'controllers/bulk_upload'
import FacetFilter from 'controllers/facet_filter'
Expand Down Expand Up @@ -46,6 +49,8 @@ export default class Argo {
application.register("facet-filter", FacetFilter)
application.register("workflow-grid", WorkflowGrid)
application.register("collection-editor", CollectionEditor)
application.register("content-block-new", ContentBlockNew)
application.register("content-block-edit", ContentBlockEdit)
application.register("tokens", Tokens)
}

Expand Down
43 changes: 43 additions & 0 deletions app/javascript/controllers/content_block_edit.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { Controller } from 'stimulus'

export default class extends Controller {
static targets = [ "value", "ordinal", "startAt", "endAt" ]

display(event) {
event.preventDefault()

// Save the old HTML so we can cancel.
this.existingHTML = this.element.innerHTML

// Display the editor
let template = document.getElementById('edit-row')
this.element.innerHTML = template.innerHTML

// Populate the form with the values for this row
this.valueTarget.value = this.data.get('value')
this.ordinalTarget.value = this.data.get('ordinal')
this.startAtTarget.value = this.data.get('start_at')
this.endAtTarget.value = this.data.get('end_at')
}

save(event) {
// remove the new form fields
document.querySelector('[data-target="content-block-new.form"').remove()

// Update the form so it updates the current item.
let form = document.querySelector('[data-target="content-block-form"]')
form.action = this.data.get('url')

// Set the patch method on the form
var input = document.createElement("input");
input.type = 'hidden'
input.name = '_method'
input.value = 'patch'
form.appendChild(input)
}

cancel(event) {
event.preventDefault()
this.element.innerHTML = this.existingHTML
}
}
23 changes: 23 additions & 0 deletions app/javascript/controllers/content_block_new.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { Controller } from 'stimulus'

export default class extends Controller {
static targets = [ "button", "form", "headerRow" ]

display(event) {
event.preventDefault()
this.formTarget.classList.remove('d-none')
// The header row doesn't display if there are no existing records, so display it now.
this.headerRowTarget.classList.remove('d-none')
this.buttonTarget.classList.add('d-none')
}

cancel(event) {
event.preventDefault()
this.hideForm()
}

hideForm() {
this.formTarget.classList.add('d-none')
this.buttonTarget.classList.remove('d-none')
}
}
5 changes: 5 additions & 0 deletions app/javascript/style/application.scss
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
@import 'variables';
@import 'bootstrap/scss/bootstrap';
@import 'bootstrap-overrides';

$fa-font-path: '~@fortawesome/fontawesome-free/webfonts';
@import "@fortawesome/fontawesome-free/scss/fontawesome.scss";
@import "@fortawesome/fontawesome-free/scss/solid.scss";

// Override before importing Blacklight
$logo-image: "../images/logo.png";
@import 'blacklight-frontend/app/assets/stylesheets/blacklight/blacklight';
Expand Down
11 changes: 11 additions & 0 deletions app/javascript/style/bootstrap-overrides.scss
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,14 @@
color: $body-color;
opacity: 1.0;
}

.alert-warning {
@include alert-variant(theme-color-level('warning', $alert-bg-level), $gamboge, $body-color);

.fa-exclamation-circle {
color: $gamboge;
font-size: 2em;
margin-right: .5em;
vertical-align: middle;
}
}
1 change: 1 addition & 0 deletions app/javascript/style/variables.scss
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
$barley-corn: #b3995d;
$floral-white: #f9f6ef;
$tahuna-sands: #d2c295;
$gamboge: #eaab01;
$tea: #b6b1a9;
$silver: #c5c5c5;

Expand Down
28 changes: 28 additions & 0 deletions app/models/content_block.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

class ContentBlock < ApplicationRecord
ORDINAL_STRING = { 1 => 'Primary', 2 => 'Secondary' }.freeze
scope :expired, -> { where('end_at < ?', current_time) }
scope :unexpired, -> { where('end_at >= ?', current_time) }
scope :active, -> { where('start_at < ? AND end_at >= ?', current_time, current_time) }
scope :primary, -> { where(ordinal: 1) }
scope :secondary, -> { where(ordinal: 2) }

validates :ordinal, presence: true, inclusion: { in: [1, 2] }

def self.current_time
Time.now.in_time_zone('America/Los_Angeles')
end

def ordinal_string
ORDINAL_STRING.fetch(ordinal)
end

def pacific_start
start_at.in_time_zone('America/Los_Angeles')
end

def pacific_end
end_at.in_time_zone('America/Los_Angeles')
end
end
4 changes: 4 additions & 0 deletions app/presenters/home_text_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@
class HomeTextPresenter
def initialize(current_user)
@current_user = current_user
@primary_messages = []
@secondary_messages = []
end

# @return [Boolean] true if this user has permissions to see anything in Argo
def view_something?
admin? || manager? || viewer? || permitted_apos.any?
end

attr_accessor :primary_messages, :secondary_messages

private

attr_reader :current_user
Expand Down
19 changes: 19 additions & 0 deletions app/views/catalog/_home_text.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,23 @@
You do not appear to have permission to view any items in Argo. Please contact an administrator.
</p>
<% end %>

<% @presenter.primary_messages.each do |block| %>
<div class="alert alert-warning" role="alert">
<span class="fas fa-exclamation-circle" aria-hidden="true"></span>
<%= block.value %>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<% end %>

<% if @presenter.secondary_messages.present? %>
<h4>Messages from the Argo team</h4>
<ul>
<% @presenter.secondary_messages.each do |block| %>
<li><%= block.value %></li>
<% end %>
</ul>
<% end %>
</div>
124 changes: 124 additions & 0 deletions app/views/content_blocks/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<h1>Message alerts</h1>

<p class="text-muted font-italic">Primary messages will appear in a yellow box at the top of the homepage. Secondary messages
will display below the yellow primary messages boxes in a bulleted list. Max 1,000 characters per message.</p>
<%= form_with(model: ContentBlock.new, local: true, data: { controller: 'content-block-new', target: 'content-block-form' }) do |form| %>
<template id="edit-row">
<td class="field">
<%= form.label :value, class: 'sr-only' %>
<%= form.text_area :value, data: { target: 'content-block-edit.value' }, class: 'form-control' %>
</td>

<td class="field">
<%= form.label :ordinal, class: 'sr-only' %>
<%= form.select :ordinal, [['Primary', 1], ['Secondary', 2]], {}, class: 'form-control', data: { target: 'content-block-edit.ordinal' } %>
</td>

<td class="field">
<%= form.label :start_at, class: 'sr-only' %>
<%= form.date_field :start_at, data: { target: 'content-block-edit.startAt' }, class: 'form-control' %>
</td>

<td class="field">
<%= form.label :end_at, class: 'sr-only' %>
<%= form.date_field :end_at, data: { target: 'content-block-edit.endAt' }, class: 'form-control' %>
</td>

<td class="actions">
<button class="btn btn-link"
data-action="click->content-block-edit#cancel">Cancel</button>
<button class="btn btn-primary"
data-action="click->content-block-edit#save">Save</button>
</td>
</template>

<table class="table">
<thead class="thead-light<%= ' d-none' if @unexpired_blocks.empty? %>" data-target="content-block-new.headerRow">
<tr>
<th scope="col">Message alerts</th>
<th scope="col">Primary/Secondary</th>
<th scope="col">Start date</th>
<th scope="col">Expiration date</th>
<th></th>
</tr>
</thead>

<tbody>
<% @unexpired_blocks.each do |block| %>
<tr data-controller="content-block-edit"
data-content-block-edit-url="<%= content_block_path(block) %>"
data-content-block-edit-value="<%= block.value %>"
data-content-block-edit-ordinal="<%= block.ordinal %>"
data-content-block-edit-start_at="<%= block.pacific_start.to_date %>"
data-content-block-edit-end_at="<%= block.pacific_end.to_date %>">
<td><%= block.value %></td>
<td><%= block.ordinal_string %></td>
<td><%= block.pacific_start.to_date %></td>
<td><%= block.pacific_end.to_date %></td>
<td>
<button class="btn" data-action="click->content-block-edit#display">
<span class="fas fa-pen" role="img" aria-label="Edit"></span>
</button>
<%= link_to block, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn' do %>
<span class="fas fa-times" role="img" aria-label="Delete"></span>
<% end %>
</td>
</tr>
<% end %>

<tr class="d-none" data-target="content-block-new.form">
<td class="field">
<%= form.label :value, 'Text', class: 'sr-only' %>
<%= form.text_area :value, class: 'form-control' %>
</td>

<td class="field">
<%= form.label :ordinal, 'Primary/Secondary', class: 'sr-only' %>
<%= form.select :ordinal, [['Primary', 1], ['Secondary', 2]], {}, class: 'form-control' %>
</td>

<td class="field">
<%= form.label :start_at, 'Start date', class: 'sr-only' %>
<%= form.date_field :start_at, value: Time.zone.today, class: 'form-control' %>
</td>

<td class="field">
<%= form.label :end_at, 'Expiration date', class: 'sr-only' %>
<%= form.date_field :end_at, value: Time.zone.today + 3.months, class: 'form-control' %>
</td>

<td class="actions">
<button class="btn btn-link"
data-action="click->content-block-new#cancel">Cancel</button>
<%= form.submit 'Save', class: 'btn btn-primary' %>
</td>
</tr>
</tbody>
</table>

<button class="btn btn-outline-secondary"
data-action="click->content-block-new#display"
data-target="content-block-new.button">Add another message</button>
<% end %>

<table class="table mt-5">
<thead class="thead-light<%= ' d-none' if @unexpired_blocks.empty? %>" data-target="content-block-new.headerRow">
<tr>
<th scope="col">Expired message alerts</th>
<th scope="col">Primary/Secondary</th>
<th scope="col">Start date</th>
<th scope="col">Expiration date</th>
</tr>
</thead>

<tbody>
<% @expired_blocks.each do |block| %>
<tr>
<td><%= block.value %></td>
<td><%= block.ordinal_string %></td>
<td><%= block.start_at.to_date %></td>
<td><%= block.end_at.to_date %></td>
</tr>
<% end %>
</tbody>
</table>
13 changes: 10 additions & 3 deletions app/views/shared/_user_util_links.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,16 @@
</li>
</ul>
</li>
<% elsif can? :impersonate, User %>
<li class="nav-item">
<%= link_to 'Impersonate', auth_groups_path, class: 'nav-link' %>
<% elsif can?(:impersonate, User) || can?(:index, ContentBlock) %>
<li class='nav-item dropdown'>
<a href='#' class='nav-link dropdown-toggle' id="adminDropdown" data-toggle='dropdown' role='button' aria-haspopup='true' aria-expanded='false'>
Admin
<span class='caret'></span>
</a>
<div class="dropdown-menu" aria-labelledby="adminDropdown">
<%= link_to 'Impersonate', auth_groups_path, class: 'dropdown-item' if can?(:impersonate, User) %>
<%= link_to 'Message alerts', content_blocks_path, class: 'dropdown-item' if can?(:index, ContentBlock) %>
</div>
</li>
<% end %>

Expand Down
2 changes: 2 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

get '/is_it_working' => 'ok_computer/ok_computer#show', defaults: { check: 'default' }

resources :content_blocks, only: %i[new create edit update destroy index]

resources :bulk_actions, except: %i[edit show update] do
member do
get :file
Expand Down
Loading

0 comments on commit 3e164aa

Please sign in to comment.