Skip to content

Commit

Permalink
Merge pull request #2203 from MushroomObserver/print-obs-label
Browse files Browse the repository at this point in the history
Put a "print label" button on show_obs
  • Loading branch information
nimmolo committed Jun 27, 2024
2 parents 707064b + 0fd26ec commit 1f2d5bb
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 103 deletions.
2 changes: 1 addition & 1 deletion app/helpers/content_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ def panel_block(**args, &block)

tag.div(
class: class_names("panel panel-default", args[:class]),
**args.except(:class, :inner_class, :inner_id, :heading)
**args.except(:class, :inner_class, :inner_id, :heading, :heading_links)
) do
concat(heading)
if content.present?
Expand Down
17 changes: 10 additions & 7 deletions app/helpers/link_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,8 @@ def link_icon(type, title: "")
synonyms: "random",
tracking: "bullhorn",
manage_lists: "indent-left",
observations: "tags"
observations: "tags",
print: "print"
}.freeze

# button to destroy object
Expand Down Expand Up @@ -206,9 +207,10 @@ def edit_button(target:, name: :EDIT.t, **args)
end
end

# Attempts to put together some common button attributes. Overrides available.
def button_atts(action, target, args, name)
if target.is_a?(String)
path = target
if target.is_a?(String) || target.is_a?(Hash) # eg { controller:, action: }
path = target # ignores `action`
identifier = "" # can send one via args[:class]
else
prefix = action == :destroy ? "" : "#{action}_"
Expand Down Expand Up @@ -282,14 +284,15 @@ def patch_button(name:, path:, **, &block)
# NOTE: button_to with block generates a button, not an input #quirksmode
def any_method_button(name:, path:, method: :post, **args, &block)
content = block ? capture(&block) : name
tip = content ? { toggle: "tooltip", placement: "top", title: name } : {}
path, identifier, icon, content = button_atts(method, path, args, name)

html_options = {
method: method,
class: "",
class: class_names(identifier, args[:class]), # usually also btn
form: { data: { turbo: true } },
data: tip
data: { toggle: "tooltip", placement: "top", title: name }
}.merge(args) # currently don't have to merge class arg upstream

button_to(path, html_options) { content }
button_to(path, html_options) { [content, icon].safe_join }
end
end
100 changes: 49 additions & 51 deletions app/helpers/tabs/observations_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,9 @@ def name_links_web(name:)
end

def observation_web_name_tabs(name)
[
mycoportal_name_tab(name),
mycobank_name_search_tab(name),
google_images_for_name_tab(name)
]
[mycoportal_name_tab(name),
mycobank_name_search_tab(name),
google_images_for_name_tab(name)]
end

def observation_hide_thumbnail_map_tab(obs)
Expand Down Expand Up @@ -151,11 +149,9 @@ def observations_at_where_tabs(query)
# undefined location.
return [] unless query.flavor == :at_where

[
define_location_tab(query),
assign_undefined_location_tab(query),
locations_index_tab
]
[define_location_tab(query),
assign_undefined_location_tab(query),
locations_index_tab]
end

# these are from the observations form
Expand All @@ -174,18 +170,16 @@ def assign_undefined_location_tab(query)
end

def observations_index_sorts
[
["rss_log", :sort_by_activity.l],
["date", :sort_by_date.l],
["created_at", :sort_by_posted.l],
# kind of redundant to sort by rss_logs, though not strictly ===
# ["updated_at", :sort_by_updated_at.l],
["name", :sort_by_name.l],
["user", :sort_by_user.l],
["confidence", :sort_by_confidence.l],
["thumbnail_quality", :sort_by_thumbnail_quality.l],
["num_views", :sort_by_num_views.l]
].freeze
[["rss_log", :sort_by_activity.l],
["date", :sort_by_date.l],
["created_at", :sort_by_posted.l],
# kind of redundant to sort by rss_logs, though not strictly ===
# ["updated_at", :sort_by_updated_at.l],
["name", :sort_by_name.l],
["user", :sort_by_user.l],
["confidence", :sort_by_confidence.l],
["thumbnail_quality", :sort_by_thumbnail_quality.l],
["num_views", :sort_by_num_views.l]].freeze
end

def map_observations_tab(query)
Expand All @@ -196,11 +190,9 @@ def map_observations_tab(query)

# NOTE: coerced_query_tab returns an array
def observations_coerced_query_tabs(query)
[
coerced_location_query_tab(query),
coerced_name_query_tab(query),
coerced_image_query_tab(query)
]
[coerced_location_query_tab(query),
coerced_name_query_tab(query),
coerced_image_query_tab(query)]
end

def observations_add_to_list_tab(query)
Expand All @@ -227,10 +219,8 @@ def observation_form_edit_tabs(obs:)
end

def observation_maps_tabs(query:)
[
coerced_observation_query_tab(query),
coerced_location_query_tab(query)
]
[coerced_observation_query_tab(query),
coerced_location_query_tab(query)]
end

def naming_form_new_title(obs:)
Expand Down Expand Up @@ -262,25 +252,19 @@ def observation_images_edit_tabs(image:)
end

def observation_images_new_tabs(obs:)
[
object_return_tab(obs),
edit_observation_tab(obs)
]
[object_return_tab(obs),
edit_observation_tab(obs)]
end

# Note this takes `obj:` not `obs:`
def observation_images_remove_tabs(obj:)
[
object_return_tab(obj),
edit_observation_tab(obj)
]
[object_return_tab(obj),
edit_observation_tab(obj)]
end

def observation_images_reuse_tabs(obs:)
[
object_return_tab(obs),
edit_observation_tab(obs)
]
[object_return_tab(obs),
edit_observation_tab(obs)]
end

def observation_download_tabs
Expand All @@ -296,20 +280,23 @@ def observations_index_tab
def obs_change_tabs(obs)
return unless check_permission(obs)

[
edit_observation_tab(obs),
destroy_observation_tab(obs)
]
[edit_observation_tab(obs),
destroy_observation_tab(obs)]
end

def obs_details_links(obs)
return unless check_permission(obs)

[print_labels_button(obs),
obs_change_links(obs)].safe_join(" | ")
end

# Buttons in "Details" panel header
def obs_change_links(obs)
return unless check_permission(obs)

[
edit_button(target: obs, icon: :edit),
destroy_button(target: obs, icon: :delete)
].safe_join(" | ")
[edit_button(target: obs, icon: :edit),
destroy_button(target: obs, icon: :delete)].safe_join(" | ")
end

def edit_observation_tab(obs)
Expand All @@ -321,5 +308,16 @@ def edit_observation_tab(obs)
def destroy_observation_tab(obs)
[nil, obs, { button: :destroy }]
end

# for show_obs - query is for a single obs label
def print_labels_button(obs)
name = :download_observations_print_labels.l
query = Query.lookup(Observation, :in_set, ids: [obs.id])
path = add_query_param(observations_downloads_path(commit: name), query)

post_button(name: name, path: path, icon: :print,
class: "print_label_observation_#{obs.id}",
form: { data: { turbo: false } })
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<%= panel_block(id: "observation_details",
heading: :show_observation_details.l,
heading_links: obs_change_links(obs),
heading_links: obs_details_links(obs),
class: "name-section") do %>
<%= observation_details_when_where_who(obs: obs) %>
Expand Down
120 changes: 77 additions & 43 deletions test/system/observation_show_system_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,30 @@
require("application_system_test_case")

class ObservationShowSystemTest < ApplicationSystemTestCase
def test_add_and_edit_associated_records
obs = observations(:peltigera_obs)
setup do
@obs = observations(:peltigera_obs)
end

# browser = page.driver.browser
def test_visit_show_observation
# # browser = page.driver.browser
rolf = users("rolf")
login!(rolf)

assert_link("Your Observations")
click_on("Your Observations")
# obs = observations(:peltigera_obs)

assert_selector("body.observations__index")
assert_link(text: /#{obs.text_name}/)
click_link(text: /#{obs.text_name}/)
assert_link(text: /#{@obs.text_name}/)
click_link(text: /#{@obs.text_name}/)
assert_selector("body.observations__show")

assert_selector(".print_label_observation_#{@obs.id}")
end

def test_add_and_edit_collection_numbers
rolf = users("rolf")
login!(rolf)
visit(observation_path(@obs))
assert_selector("body.observations__show")

scroll_to(find("#observation_collection_numbers"), align: :center)
Expand Down Expand Up @@ -57,6 +67,28 @@ def test_add_and_edit_associated_records

assert_equal(c_n.reload.number, "021345")

# try remove links
# collection_number
within("#observation_collection_numbers") do
assert_link(:REMOVE.l)
find(:css, ".remove_collection_number_link_#{c_n.id}").trigger("click")
end
# confirm is in modal
assert_selector("#modal_collection_number_observation")
within("#modal_collection_number_observation") do
assert_button(:REMOVE.l)
find(:css, ".remove_collection_number_link_#{c_n.id}").trigger("click")
end
assert_no_selector("#modal_collection_number_observation")
assert_no_link(text: /021345/)
end

def test_add_and_edit_herbarium_records
rolf = users("rolf")
login!(rolf)
visit(observation_path(@obs))
assert_selector("body.observations__show")

# Has a fungarium record: :field_museum_record. Try edit
fmr = herbarium_records(:field_museum_record)
within("#observation_herbarium_records") do
Expand All @@ -78,6 +110,28 @@ def test_add_and_edit_associated_records
assert_link(text: /6234234/)
end

# try remove links
# herbarium_record
within("#observation_herbarium_records") do
assert_link(:REMOVE.l)
find(:css, ".remove_herbarium_record_link_#{fmr.id}").trigger("click")
end
# confirm is in modal
assert_selector("#modal_herbarium_record_observation")
within("#modal_herbarium_record_observation") do
assert_button(:REMOVE.l)
find(:css, ".remove_herbarium_record_link_#{fmr.id}").trigger("click")
end
assert_no_selector("#modal_herbarium_record_observation")
assert_no_link(text: /6234234/)
end

def test_add_and_edit_sequences
rolf = users("rolf")
login!(rolf)
visit(observation_path(@obs))
assert_selector("body.observations__show")

# new sequence
assert_link(:show_observation_add_sequence.l)
find(:css, ".new_sequence_link").trigger("click")
Expand Down Expand Up @@ -124,6 +178,23 @@ def test_add_and_edit_associated_records
assert_equal(seq.reload.notes, "Oh yea.")
assert_no_selector("#modal_sequence_#{seq.id}")

# try remove links
# sequence
within("#observation_sequences") do
assert_button(:destroy_object.t(type: :sequence))
accept_confirm do
find(:css, ".destroy_sequence_link_#{seq.id}").trigger("click")
end
assert_no_link(text: /LSU/)
end
end

def test_add_and_edit_external_links
rolf = users("rolf")
login!(rolf)
visit(observation_path(@obs))
assert_selector("body.observations__show")

# new external link
site = external_sites(:mycoportal)
within("#observation_external_links") do
Expand Down Expand Up @@ -157,43 +228,6 @@ def test_add_and_edit_associated_records
assert_equal(link.reload.url, "https://wedont.validatethese.urls/yet")

# try remove links
# collection_number
within("#observation_collection_numbers") do
assert_link(:REMOVE.l)
find(:css, ".remove_collection_number_link_#{c_n.id}").trigger("click")
end
# confirm is in modal
assert_selector("#modal_collection_number_observation")
within("#modal_collection_number_observation") do
assert_button(:REMOVE.l)
find(:css, ".remove_collection_number_link_#{c_n.id}").trigger("click")
end
assert_no_selector("#modal_collection_number_observation")
assert_no_link(text: /021345/)

# herbarium_record
within("#observation_herbarium_records") do
assert_link(:REMOVE.l)
find(:css, ".remove_herbarium_record_link_#{fmr.id}").trigger("click")
end
# confirm is in modal
assert_selector("#modal_herbarium_record_observation")
within("#modal_herbarium_record_observation") do
assert_button(:REMOVE.l)
find(:css, ".remove_herbarium_record_link_#{fmr.id}").trigger("click")
end
assert_no_selector("#modal_herbarium_record_observation")
assert_no_link(text: /6234234/)

# sequence
within("#observation_sequences") do
assert_button(:destroy_object.t(type: :sequence))
accept_confirm do
find(:css, ".destroy_sequence_link_#{seq.id}").trigger("click")
end
assert_no_link(text: /LSU/)
end

# external_link
within("#observation_external_links") do
assert_button(text: :destroy_object.t(type: :external_link))
Expand Down

0 comments on commit 1f2d5bb

Please sign in to comment.