Skip to content

Commit 78223b1

Browse files
authored
Merge pull request #3203 from sul-dlss/submit-draft
Start tracking drafts vs completed requests in the forms
2 parents c447d46 + e1f1c95 commit 78223b1

10 files changed

+71
-9
lines changed

app/components/accordion_step_component.html.erb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818

1919
<% if submit? %>
2020
<div class="mt-3 form-group d-flex justify-content-end gap-1">
21+
<%= footer %>
2122
<% if cancel? %>
2223
<%= link_to 'Cancel', new_patron_request_path(instance_hrid:, origin_location_code:), class: 'btn btn-outline-primary', data: { action: 'analytics#send', 'analytics-category-param': 'Request', 'analytics-action-param': 'Cancel' } %>
2324
<% end %>
2425
<%= submit_tag submit_text, class: 'btn btn-primary', data: { 'next-step-button': true, action: 'analytics#send', 'analytics-category-param': 'Request', 'analytics-action-param': 'Submit' } %>
2526
</div>
2627
<% else %>
2728
<div class="mt-3 d-flex justify-content-end gap-1">
29+
<%= footer %>
2830
<button class="btn btn-primary" type="button" data-action="click->accordion-form#nextStep analytics#send" data-analytics-category-param="Accordion" data-analytics-action-param="Continue" data-next-step-button="true">Continue</button>
2931
</div>
3032
<% end %>

app/components/accordion_step_component.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
class AccordionStepComponent < ViewComponent::Base
55
renders_one :title
66
renders_one :body
7+
renders_one :footer
78

89
attr_reader :step_index, :id, :classes, :data, :patron_request_data, :form_id, :request
910

app/components/aeon/appointment_form_item_component.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<%= f.select :appointment_id,
1313
appointment_options_for_select,
1414
{ prompt: placeholder },
15-
{ class: 'form-select appt_dropdown', required: true, data: { controller: 'appointment-select' } } %>
15+
{ class: 'form-select appt_dropdown', data: { controller: 'appointment-select', 'required-for-submit': true } } %>
1616
<span class="create-appointment-section">
1717
<span class="fw-semibold mx-2">OR</span>
1818
<%= link_to new_appointment_path, class: 'btn btn-primary btn-sm', data: { action: 'modal#open' } do %>

app/components/aeon/digitization_form_item_component.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<div class="accordion-body">
1414
<div class="mb-3">
1515
<%= f.label :requested_pages, class: 'form-label fw-semibold redesign-required-label' %>
16-
<%= f.text_field :requested_pages, placeholder: 'e.g. 100-150, 167, 170-180 or Chapter 5', class: 'form-control', required: true %>
16+
<%= f.text_field :requested_pages, placeholder: 'e.g. 100-150, 167, 170-180 or Chapter 5', class: 'form-control', data: { 'required-for-submit': true } %>
1717
</div>
1818

1919
<div class="mb-3">

app/javascript/controllers/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,6 @@ application.register("modal", ModalController)
4545

4646
import SelectedItemFormController from "./selected_item_form_controller"
4747
application.register("selected-item-form", SelectedItemFormController)
48+
49+
import StatusCounterController from "./status_counter_controller"
50+
application.register("status-counter", StatusCounterController)

app/javascript/controllers/selected_item_form_controller.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,22 @@ import { Collapse } from "bootstrap"
33

44
export default class extends Controller {
55
static targets = ["status", "nextButton", "charCounter"]
6+
static values = { status: String }
67

78
connect() {
89
this.updateStatus();
910
}
1011

1112
updateStatus() {
1213
if (this.emptyFields()) {
14+
this.statusValue = 'incomplete';
15+
} else {
16+
this.statusValue = 'complete';
17+
}
18+
}
19+
20+
statusValueChanged() {
21+
if (this.statusValue === 'incomplete') {
1322
this.statusTarget.classList.remove('bi-check2-circle', 'text-green');
1423
this.statusTarget.classList.add('bi-circle');
1524
if (this.hasNextButtonTarget) this.nextButtonTarget.disabled = true;
@@ -18,6 +27,8 @@ export default class extends Controller {
1827
this.statusTarget.classList.add('bi-check2-circle', 'text-green');
1928
if (this.hasNextButtonTarget) this.nextButtonTarget.disabled = false;
2029
}
30+
31+
this.dispatch('status-changed', { detail: { status: this.statusValue } });
2132
}
2233

2334
updateCharCounter(event) {
@@ -30,7 +41,7 @@ export default class extends Controller {
3041

3142
emptyFields() {
3243
const formData = new FormData(this.element.closest('form'));
33-
return Array.from(this.element.querySelectorAll('[required],[data-required]')).find(x => formData.getAll(x.name).every(x => !x))
44+
return Array.from(this.element.querySelectorAll('[required],[data-required],[data-required-for-submit]')).find(x => formData.getAll(x.name).every(x => !x))
3445
}
3546

3647
nextItem(event) {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Controller } from "@hotwired/stimulus"
2+
3+
export default class extends Controller {
4+
static targets = ['counter']
5+
6+
connect() {
7+
this.update();
8+
}
9+
10+
update(event) {
11+
const completeCount = this.element.querySelectorAll('[data-selected-item-form-status-value="complete"]').length;
12+
const draftCount =this.element.querySelectorAll('[data-selected-item-form-status-value="incomplete"]').length;
13+
14+
this.counterTarget.innerHTML = `${completeCount} complete · ${draftCount} drafts`;
15+
}
16+
}

app/jobs/submit_aeon_patron_request_job.rb

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def as_aeon_create_ead_request_data(patron_request, volume_params) # rubocop:dis
3535
AeonClient::RequestData.with_defaults.with(
3636
call_number: "#{patron_request.ead_doc.identifier} #{volume_params['series']}",
3737
ead_number: patron_request.ead_doc.identifier,
38-
appointment_id: volume_params['appointment_id'].to_i,
38+
appointment_id: volume_params['appointment_id'].presence&.to_i,
3939
for_publication: volume_params['for_publication'] == 'yes',
4040
item_author: patron_request.ead_doc.author,
4141
item_info1: patron_request.ead_doc.item_url,
@@ -56,7 +56,7 @@ def as_aeon_create_ead_request_data(patron_request, volume_params) # rubocop:dis
5656
# and reading room id.
5757
def as_aeon_create_request_data(patron_request, folio_item, volume_params) # rubocop:disable Metrics/AbcSize
5858
AeonClient::RequestData.with_defaults.with(
59-
appointment_id: volume_params['appointment_id'].to_i,
59+
appointment_id: volume_params['appointment_id'].presence&.to_i,
6060
call_number: folio_item.callnumber,
6161
document_type: 'Monograph',
6262
format: nil,
@@ -78,6 +78,23 @@ def as_aeon_create_request_data(patron_request, folio_item, volume_params) # rub
7878
# rubocop:enable Metrics/MethodLength
7979

8080
def submit_aeon_request(aeon_payload)
81-
AeonClient.new.create_request(aeon_payload)
81+
response = aeon_client.create_request(aeon_payload)
82+
83+
return response if complete?(aeon_payload)
84+
85+
aeon_client.update_request_route(transaction_number: response.transaction_number,
86+
status: Settings.aeon.queue_names.draft.transaction.first)
87+
end
88+
89+
def aeon_client
90+
@aeon_client ||= AeonClient.new
91+
end
92+
93+
def complete?(payload)
94+
if payload.shipping_option == 'Electronic Delivery'
95+
payload.item_info5.present?
96+
else
97+
payload.appointment_id.present?
98+
end
8299
end
83100
end

app/views/patron_requests/new.html+aeonredesign.erb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,32 @@
8787

8888
<!-- aeon reading room request -->
8989
<!-- removed any 'can do this' part for both -->
90-
<%= render AccordionStepComponent.new(request: f.object, id: 'reading', classes: ['d-none'], step_index: (scan_or_pickup_step ||= step_enum.next), form_id: f.id, data: { 'patronrequest-forRequestType': 'pickup' }, submit: true) do |c| %>
90+
<%= render AccordionStepComponent.new(request: f.object, id: 'reading', classes: ['d-none'], step_index: (scan_or_pickup_step ||= step_enum.next), form_id: f.id, data: { controller: 'status-counter', action: 'selected-item-form:status-changed->status-counter#update', 'patronrequest-forRequestType': 'pickup' }, submit: true) do |c| %>
9191
<% c.with_title.with_content('Reading room') %>
9292
<% c.with_body do %>
9393
<%= render 'reading_options', f: %>
9494
<% end %>
95+
<% c.with_footer do %>
96+
<span class="px-2 py-1" data-status-counter-target="counter">
97+
0 complete
98+
0 drafts
99+
</span>
100+
<% end %>
95101
<% end %>
96102

97103
<!-- aeon digitization request -->
98104

99-
<%= render AccordionStepComponent.new(request: f.object, id: 'digitization', classes: ['d-none'], step_index: (scan_or_pickup_step ||= step_enum.next), form_id: f.id, data: { 'patronrequest-forRequestType': 'scan' }, submit: true) do |c| %>
105+
<%= render AccordionStepComponent.new(request: f.object, id: 'digitization', classes: ['d-none'], step_index: (scan_or_pickup_step ||= step_enum.next), form_id: f.id, data: { controller: 'status-counter', action: 'selected-item-form:status-changed->status-counter#update', 'patronrequest-forRequestType': 'scan' }, submit: true) do |c| %>
100106
<% c.with_title.with_content('Digitization') %>
101107
<% c.with_body do %>
102108
<%= render 'digitization_options', f: %>
103109
<% end %>
110+
<% c.with_footer do %>
111+
<span class="px-2 py-1" data-status-counter-target="counter">
112+
0 complete
113+
0 drafts
114+
</span>
115+
<% end %>
104116
<% end %>
105117

106118
<% end %>

spec/jobs/submit_aeon_patron_request_job_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
origin_location_code: 'SPEC-STACKS', data:, user: build(:sso_user))
1313
end
1414
let(:folio_instance) { build(:special_collections_single_holding) }
15-
let(:stub_aeon_client) { instance_double(AeonClient, find_user: stub_aeon_user, create_request: {}) }
15+
let(:stub_aeon_client) { instance_double(AeonClient, find_user: stub_aeon_user, create_request: Aeon::Request.new, update_request_route: nil) }
1616
let(:stub_aeon_user) { instance_double(Aeon::User, username: 'aeon_user') }
1717

1818
before do

0 commit comments

Comments
 (0)