From 8cf0d0e67720922cf04e7b1583d78ab0b01ef2d5 Mon Sep 17 00:00:00 2001
From: Nathan Wilson
+ Observation:
+ <%= field_slip.observation_id %>
+
+ Project:
+ <%= field_slip.project_id %>
+
+ Identifier:
+ <%= field_slip.identifier %>
+ <%= notice %>
+ <%= link_to "Show this field slip", field_slip %>
+ <%= notice %><%= pluralize(field_slip.errors.count, "error") %> prohibited this field_slip from being saved:
+
+
+ <% field_slip.errors.each do |error| %>
+
+ Editing field slip
+
+<%= render "form", field_slip: @field_slip %>
+
+
+
+Field slips
+
+New field slip
+
+<%= render "form", field_slip: @field_slip %>
+
+
+
+
- Identifier: - <%= field_slip.identifier %> + Code: + <%= field_slip.code %>
diff --git a/app/views/field_slips/_field_slip.json.jbuilder b/app/views/field_slips/_field_slip.json.jbuilder index aa892c410e..5d3fa43823 100644 --- a/app/views/field_slips/_field_slip.json.jbuilder +++ b/app/views/field_slips/_field_slip.json.jbuilder @@ -1,2 +1,2 @@ -json.extract! field_slip, :id, :observation_id, :project_id, :identifier, :created_at, :updated_at +json.extract! field_slip, :id, :observation_id, :project_id, :code, :created_at, :updated_at json.url field_slip_url(field_slip, format: :json) diff --git a/app/views/field_slips/_form.html.erb b/app/views/field_slips/_form.html.erb index 485c9ef810..6afddc9991 100644 --- a/app/views/field_slips/_form.html.erb +++ b/app/views/field_slips/_form.html.erb @@ -22,8 +22,8 @@Observation: - <%= field_slip.observation_id %> -
- -
+ <%= link_to(field_slip.observation.unique_format_name.t, observation_path(field_slip.observation)) %>
+
Project:
- <%= field_slip.project_id %>
-
+ <%= link_to_object(field_slip.project) %>
+
Code:
<%= field_slip.code %>
<%= :show_project_created_at.t %>: <%= @project.created_at.web_date %>
+<%= :show_project_field_slip_prefix.t %>: <%= @project.field_slip_prefix %>
<% if @project.observations.any? %>
<%= link_to("#{@project.observations.length} #{:OBSERVATIONS.t}",
diff --git a/config/locales/en.txt b/config/locales/en.txt
index 4799622a59..89b9ca40d8 100644
--- a/config/locales/en.txt
+++ b/config/locales/en.txt
@@ -493,6 +493,8 @@
email_address: email address
EMAIL_ADDRESSS: Email Addresses
email_addresss: email addresses
+ FIELD_SLIP_PREFIX: Field Slip Prefix
+ field_slip_prefix: field slip prefix
FULL_NAME: Full Name
full_name: full name
FULL_NAMES: Full Names
@@ -3244,6 +3246,7 @@
show_project_destroy: Destroy Project
show_project_drafts: Drafts
show_project_edit: Edit Project
+ show_project_field_slip_prefix: Field Slip Prefix
show_project_join: Join Project
show_project_location: Location
show_project_leave: Leave Project
diff --git a/db/migrate/20240310132813_create_field_slips.rb b/db/migrate/20240310132813_create_field_slips.rb
index f944ae6b18..3ddfa757f0 100644
--- a/db/migrate/20240310132813_create_field_slips.rb
+++ b/db/migrate/20240310132813_create_field_slips.rb
@@ -5,9 +5,10 @@ def change
create_table(:field_slips) do |t|
t.integer(:observation_id)
t.integer(:project_id)
- t.string(:code)
+ t.string(:code, null: false)
t.timestamps
end
+ add_index(:field_slips, :code, unique: true)
end
end
diff --git a/db/schema.rb b/db/schema.rb
index 4d5fb8a8f2..b385a34db7 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.1].define(version: 2024_03_10_132813) do
+ActiveRecord::Schema[7.1].define(version: 2024_03_12_231729) do
create_table "api_keys", id: :integer, charset: "utf8mb3", force: :cascade do |t|
t.datetime "created_at", precision: nil
t.datetime "last_used", precision: nil
@@ -88,9 +88,10 @@
create_table "field_slips", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.integer "observation_id"
t.integer "project_id"
- t.string "code"
+ t.string "code", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.index ["code"], name: "index_field_slips_on_code", unique: true
end
create_table "glossary_term_images", charset: "utf8mb3", force: :cascade do |t|
@@ -536,6 +537,8 @@
t.integer "image_id"
t.date "start_date"
t.date "end_date"
+ t.string "field_slip_prefix"
+ t.index ["field_slip_prefix"], name: "index_projects_on_field_slip_prefix", unique: true
end
create_table "publications", id: :integer, charset: "utf8mb3", force: :cascade do |t|
diff --git a/test/controllers/projects_controller_test.rb b/test/controllers/projects_controller_test.rb
index 5b2f57d5ee..026dd3bc28 100644
--- a/test/controllers/projects_controller_test.rb
+++ b/test/controllers/projects_controller_test.rb
@@ -11,6 +11,7 @@ def build_params(
project: {
title: title,
summary: summary,
+ field_slip_prefix: "",
place_name: "",
open_membership: false,
"start_date(1i)" => start_date&.year,
diff --git a/test/fixtures/projects.yml b/test/fixtures/projects.yml
index f459f71217..a2a82d7486 100644
--- a/test/fixtures/projects.yml
+++ b/test/fixtures/projects.yml
@@ -21,6 +21,7 @@ eol_project:
admin_group: eol_admins
title: EOL Project
summary: Project to make names for EOL
+ field_slip_prefix: EOL
created_at: 2008-09-24 21:33:30
updated_at: 2008-09-24 21:33:30
open_membership: false
@@ -39,6 +40,7 @@ bolete_project:
admin_group: bolete_admins
title: Bolete Project
summary: Project about Boletes
+ field_slip_prefix: BLT
created_at: 2008-09-25 07:00:50
updated_at: 2008-09-25 07:00:55
images: in_situ_image, turned_over_image
@@ -73,6 +75,7 @@ open_membership_project:
admin_group: burbank_admins
title: Burbank Project
summary: Project about Fungi of Burbank
+ field_slip_prefix: BURB
created_at: 2008-09-25 07:00:50
updated_at: 2008-09-25 07:00:55
observations: owner_accepts_general_questions, unknown_with_lat_long, trusted_hidden, untrusted_hidden, reused_observation
From f3b1b7441361e0a0cbab13f36e28b0ffe08e1793 Mon Sep 17 00:00:00 2001
From: Nathan Wilson <%= notice %> <%= notice %>
- <%= link_to "Show this field slip", field_slip %>
+ <%= link_to :field_slip_show.t, field_slip %>
<%= notice %> <%= notice %>
Observation:
- <%= link_to(field_slip.observation.unique_format_name.t, observation_path(field_slip.observation)) %>
+ <% if field_slip.observation %>
+ <%= link_to(field_slip.observation.unique_format_name.t, observation_path(field_slip.observation)) %>
+ <% else %>
+ <%= :field_slip_no_observation.t %>
+ <% end %>
<%= notice %> <%= notice %> <%= notice %> <%= notice %>
- Observation:
- <% if field_slip.observation %>
- <%= link_to(field_slip.observation.unique_format_name.t, observation_path(field_slip.observation)) %>
- <% else %>
- <%= :field_slip_no_observation.t %>
- <% end %>
- <%= notice %>
- <%= link_to :field_slip_show.t, field_slip %>
- <%= notice %> <%= notice %> <%= notice %><%= pluralize(field_slip.errors.count, "error") %> prohibited this field_slip from being saved:
+
+ <%= "#{pluralize(field_slip.errors.count,
+ :error.t, plural: :errors.t)} #{:field_slip_errors.t}" %>
+
<% field_slip.errors.each do |error| %>
diff --git a/app/views/field_slips/index.html.erb b/app/views/field_slips/index.html.erb
index de116a18ee..e477bcda2e 100644
--- a/app/views/field_slips/index.html.erb
+++ b/app/views/field_slips/index.html.erb
@@ -1,4 +1,4 @@
-
Field slips
@@ -6,9 +6,9 @@
<% @field_slips.each do |field_slip| %>
<%= render field_slip %>
Project:
- <%= link_to_object(field_slip.project) %>
+ <% if field_slip.project %>
+ <%= link_to_object(field_slip.project) %>
+ <% else %>
+ <%= :field_slip_no_project.t %>
+ <% end %>
Code:
<%= field_slip.code %>
Field slips
diff --git a/app/views/field_slips/show.html.erb b/app/views/field_slips/show.html.erb
index 2f4a97d32e..46d00decaa 100644
--- a/app/views/field_slips/show.html.erb
+++ b/app/views/field_slips/show.html.erb
@@ -1,4 +1,6 @@
-<%= pluralize(visual_model.errors.count, "error") %> prohibited this visual_model from being saved:
-
+ <%= "#{pluralize(visual_model.errors.count,
+ :error.t, plural: :errors.t)} #{:visual_model_errors.t}" %>:
<% visual_model.errors.each do |error| %>
- <%= "#{pluralize(field_slip.errors.count,
- :error.t, plural: :errors.t)} #{:field_slip_errors.t}" %>
-
-
+ <%= "#{pluralize(field_slip.errors.count,
+ :error.t, plural: :errors.t)} #{:field_slip_errors.t}" %>:
<% field_slip.errors.each do |error| %>
- Project:
+ <%= :PROJECT.t %>:
<% if field_slip.project %>
<%= link_to_object(field_slip.project) %>
<% else %>
<%= :field_slip_no_project.t %>
<% end %>
- Code:
- <%= field_slip.code %>
+ <%= :OBSERVATION.t %>:
+ <% if field_slip.observation %>
+ <%= link_to(field_slip.observation.unique_format_name.t, observation_path(field_slip.observation)) %>
+
+ <%= render(partial: "shared/matrix_box",
+ locals: { object: field_slip.observation, columns: "col-xs-12" }) %>
+
+ <% else %>
+ <%= :field_slip_no_observation.t %>
+ <% end %>
+
+
+ <% obs = last_observation
+ if obs %>
+
+
+ Field slips
+<%= :FIELD_SLIPS.t %>
<% end %>
<%= "#{:FIELD_SLIP.t}: #{@field_slip.code}" %>
+
<%= render @field_slip %>
+ <%= image_tag(Image.url(:thumbnail, obs.thumb_image_id)) %>
+ <%= link_to(obs.unique_format_name.t, observation_path(obs)) %>
@@ -41,5 +43,6 @@
Editing field slip
+<%= :field_slip_editing.t %>
<%= render "form", field_slip: @field_slip %>
+ <% if field_slip&.observation
+ current = field_slip.observation %>
+
+ <%= image_tag(Image.url(:thumbnail, current.thumb_image_id)) %>
+ <%= link_to(current.unique_format_name.t, observation_path(current)) %>
+
+ <%= form.submit :field_slip_keep_obs.t %>
+
+
+ <% end %>
+
+
+
-
<% if field_slip&.observation
current = field_slip.observation %>
+ <%= :field_slip_creator.t %>:
+ <%= link_to(field_slip.user.legal_name, user_path(field_slip.user_id)) %>
<%= :OBSERVATION.t %>:
<% if field_slip.observation %>
<%= link_to(field_slip.observation.unique_format_name.t, observation_path(field_slip.observation)) %>
diff --git a/config/locales/en.txt b/config/locales/en.txt
index fbfa5a806d..58dc861f68 100644
--- a/config/locales/en.txt
+++ b/config/locales/en.txt
@@ -2760,6 +2760,7 @@
field_slip_code_format_error: code must have non-numeric characters other than period (.) and dash (-)
field_slip_created: Field slip was successfully created.
field_slip_create_obs: Create New Observation
+ field_slip_creator: Creator
field_slip_destroy: Destroy this field slip
field_slip_destroyed: Field slip was successfully destroyed.
field_slip_edit: Edit this field slip
@@ -2773,6 +2774,7 @@
field_slip_no_project: Project not found
field_slip_show: Show this field slip
field_slip_updated: Field slip was successfully updated.
+ field_slip_welcome: "Welcome to the [TITLE] project!"
##############################################################################
diff --git a/test/controllers/field_slips_controller_test.rb b/test/controllers/field_slips_controller_test.rb
index eb80da1333..13cc53b74b 100644
--- a/test/controllers/field_slips_controller_test.rb
+++ b/test/controllers/field_slips_controller_test.rb
@@ -45,6 +45,28 @@ class FieldSlipsControllerTest < FunctionalTestCase
assert_equal(FieldSlip.last.observation, ObservationView.last(User.current))
end
+ test "should create field_slip and join project" do
+ user = @field_slip.user
+ login(user.login)
+ project = projects(:open_membership_project)
+ assert_not(project.member?(user))
+ ObservationView.update_view_stats(@field_slip.observation_id,
+ @field_slip.user_id)
+ assert_difference("FieldSlip.count") do
+ post(:create,
+ params: {
+ commit: :field_slip_last_obs.t,
+ field_slip: {
+ code: "#{project.field_slip_prefix}-0001",
+ project: project
+ }
+ })
+ end
+
+ assert_redirected_to field_slip_url(FieldSlip.last)
+ assert(project.member?(user))
+ end
+
test "should create field_slip and redirect to create obs" do
login(@field_slip.user.login)
assert_difference("FieldSlip.count") do
From ef9cf8b0a24a91aeb2e84a57ba86ec222f0bc5a6 Mon Sep 17 00:00:00 2001
From: Nathan Wilson
+ <%= text_field_with_label(form: form, field: :code) %>
-
- <%= form.submit :field_slip_keep_obs.t %>
+ <%= submit_button(form: form, button: :field_slip_keep_obs.t) %>
<% end %>
@@ -40,7 +37,7 @@
@@ -57,7 +54,7 @@
New field slip
+<%= :field_slip_new.t %>
<%= render "form", field_slip: @field_slip %>
- <%= image_tag(Image.url(:thumbnail, current.thumb_image_id)) %>
+ <% if current.thumb_image_id %>
+ <%= image_tag(Image.url(:thumbnail, current.thumb_image_id)) %>
+ <% end %>
<%= link_to(current.unique_format_name.t, observation_path(current)) %>
@@ -47,7 +49,9 @@
if obs %>
- <%= image_tag(Image.url(:thumbnail, obs.thumb_image_id)) %>
+ <% if obs.thumb_image_id %>
+ <%= image_tag(Image.url(:thumbnail, obs.thumb_image_id)) %>
+ <% end %>
<%= link_to(obs.unique_format_name.t, observation_path(obs)) %>
<%= :field_slip_editing.t %>
+<% add_page_title(:field_slip_editing.t) %>
<%= render "form", field_slip: @field_slip %>
diff --git a/app/views/field_slips/index.html.erb b/app/views/field_slips/index.html.erb
index aba67f2024..7d5d005e47 100644
--- a/app/views/field_slips/index.html.erb
+++ b/app/views/field_slips/index.html.erb
@@ -1,9 +1,9 @@
+<% add_page_title(:FIELD_SLIPS.t) %>
+
<% if notice %>
<%= :FIELD_SLIPS.t %>
-
<%= :field_slip_new.t %>
+<% add_page_title(:field_slip_new.t) %>
<%= render "form", field_slip: @field_slip %>
diff --git a/app/views/field_slips/show.html.erb b/app/views/field_slips/show.html.erb
index 938ec309dc..217f358a5e 100644
--- a/app/views/field_slips/show.html.erb
+++ b/app/views/field_slips/show.html.erb
@@ -1,3 +1,5 @@
+<% add_page_title(@field_slip.code) %>
+
<% if notice %>
- <%= :field_slip_creator.t %>:
- <%= link_to(field_slip.user.legal_name, user_path(field_slip.user_id)) %>
+ <% if field_slip.user %>
+ <%= :field_slip_creator.t %>:
+ <%= link_to(field_slip.user.legal_name, user_path(field_slip.user_id)) %>
+ <% end %>
<%= :OBSERVATION.t %>:
<% if field_slip.observation %>
<%= link_to(field_slip.observation.unique_format_name.t, observation_path(field_slip.observation)) %>
diff --git a/test/fixtures/field_slips.yml b/test/fixtures/field_slips.yml
index 221ab368c5..ad8d396b19 100644
--- a/test/fixtures/field_slips.yml
+++ b/test/fixtures/field_slips.yml
@@ -20,3 +20,4 @@ field_slip_no_obs:
field_slip_falmouth_one:
project: falmouth_2023_09_project
code: FAL-0001
+ user: rolf
diff --git a/test/system/field_slips_test.rb b/test/system/field_slips_test.rb
index 078da77d62..c5dcb78c8a 100644
--- a/test/system/field_slips_test.rb
+++ b/test/system/field_slips_test.rb
@@ -16,30 +16,27 @@ class FieldSlipsTest < ApplicationSystemTestCase
test "navigate to should field slip" do
login!(mary)
visit field_slips_url
- click_on :field_slip_show.t
+ find(:xpath, '//*[@id="field_slips"]/a[1]').click
assert_text :field_slip_index.t
- click_on "Back"
end
- test "should update Field slip" do
+ test "should update field slip" do
login!(mary)
visit field_slip_url(@field_slip)
- click_on "Edit this field slip", match: :first
+ click_on :field_slip_edit.t, match: :first
- fill_in "Code", with: @field_slip.code
- fill_in "Observation", with: @field_slip.observation_id
- fill_in "Project", with: @field_slip.project_id
- click_on "Update Field slip"
+ fill_in :field_slip_code.t, with: @field_slip.code
+ select(@field_slip.project.title, from: :PROJECT.t)
+ click_on :field_slip_keep_obs.t
- assert_text "Field slip was successfully updated"
- click_on "Back"
+ assert_text :field_slip_updated.t
end
- test "should destroy Field slip" do
+ test "should destroy field slip" do
login!(mary)
visit field_slip_url(@field_slip)
click_on :field_slip_destroy.t, match: :first
- assert_text "Field slip was successfully destroyed"
+ assert_text :field_slip_destroyed.t
end
end
From 2914b7fd34b9f62c543e11b727231102c829195a Mon Sep 17 00:00:00 2001
From: Nathan Wilson
<%= render(partial: "shared/matrix_box",
- locals: { object: field_slip.observation, columns: "col-xs-12" }) %>
+ locals: { object: field_slip.observation,
+ columns: "col-xs-12" }) %>
<% else %>
<%= :field_slip_no_observation.t %>
diff --git a/app/views/field_slips/_field_slip.json.jbuilder b/app/views/controllers/field_slips/_field_slip.json.jbuilder
similarity index 100%
rename from app/views/field_slips/_field_slip.json.jbuilder
rename to app/views/controllers/field_slips/_field_slip.json.jbuilder
diff --git a/app/views/controllers/field_slips/_form.html.erb b/app/views/controllers/field_slips/_form.html.erb
new file mode 100644
index 0000000000..689a3678c1
--- /dev/null
+++ b/app/views/controllers/field_slips/_form.html.erb
@@ -0,0 +1,49 @@
+<%= form_with(model: field_slip) do |form| %>
+ <% if field_slip.errors.any? %>
+
+ <% field_slip.errors.each do |error| %>
+
+
+ <%= render(partial: "shared/matrix_box",
+ locals: { object: field_slip.observation, votes: false,
+ footer: panel_block_footer(footer: btn),
+ columns: "col-xs-12" }) %>
+
+
+ <%= render(partial: "shared/matrix_box",
+ locals: { object: last_observation, votes: false,
+ footer: panel_block_footer(footer: btn),
+ columns: "col-xs-12" }) %>
+
+
- <% field_slip.errors.each do |error| %>
-
-
- <% if current.thumb_image_id %>
- <%= image_tag(Image.url(:thumbnail, current.thumb_image_id)) %>
- <% end %>
- <%= link_to(current.unique_format_name.t, observation_path(current)) %>
-
- <%= submit_button(form: form, button: :field_slip_keep_obs.t) %>
-
-
- <% end %>
-
-
-
-
-
-
- <% obs = last_observation
- if obs %>
-
- <% if obs.thumb_image_id %>
- <%= image_tag(Image.url(:thumbnail, obs.thumb_image_id)) %>
- <% end %>
- <%= link_to(obs.unique_format_name.t, observation_path(obs)) %>
-
-
-
- <%= render(partial: "shared/matrix_box",
- locals: { object: field_slip.observation, votes: false,
- footer: panel_block_footer(footer: btn),
- columns: "col-xs-12" }) %>
-
+ <%= render(partial: "field_slips/obs_thumbnail",
+ locals: { obs: field_slip.observation, form: form,
+ button: :field_slip_keep_obs.t }) %>
- <%= render(partial: "shared/matrix_box",
- locals: { object: last_observation, votes: false,
- footer: panel_block_footer(footer: btn),
- columns: "col-xs-12" }) %>
-
+ <%= render(partial: "field_slips/obs_thumbnail",
+ locals: { obs: last_observation, form: form,
+ button: :field_slip_last_obs.t }) %>