mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-11 23:54:43 +08:00
Add FormRepositoryRowsFieldValue type [SCI-11720]
This commit is contained in:
parent
c25ae031ce
commit
c3671e7f15
4 changed files with 95 additions and 2 deletions
34
app/models/form_repository_rows_field_value.rb
Normal file
34
app/models/form_repository_rows_field_value.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class FormRepositoryRowsFieldValue < FormFieldValue
|
||||
def value=(repository_row_ids)
|
||||
# removes repository row snapshots if they are not present in the new id array,
|
||||
# keeps already existing snapshots intact, and
|
||||
# adds new snapshots if not yet present
|
||||
self.data ||= []
|
||||
|
||||
removed_repository_row_ids = data.pluck('id') - repository_row_ids
|
||||
existing_repository_row_ids = data.pluck('id') & repository_row_ids
|
||||
|
||||
self.data =
|
||||
data.filter { |r| removed_repository_row_ids.exclude?(r['id']) } +
|
||||
repository_row_snapshots(repository_row_ids - existing_repository_row_ids)
|
||||
end
|
||||
|
||||
def value
|
||||
data
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def repository_row_snapshots(repository_row_ids)
|
||||
RepositoryRow.includes(repository_cells: %i(repository_column value)).where(id: repository_row_ids).map do |repository_row|
|
||||
repository_row.as_json(include: { repository_cells: { include: %i(repository_column value) } }).merge(
|
||||
{
|
||||
'snapshot_at' => DateTime.current,
|
||||
'snapshot_by_id' => created_by_id
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -40,20 +40,29 @@ class FormResponse < ApplicationRecord
|
|||
|
||||
def create_value!(created_by, form_field, value, not_applicable: false)
|
||||
ActiveRecord::Base.transaction(requires_new: true) do
|
||||
current_form_field_value = form_field_values.where(latest: true).last
|
||||
|
||||
form_field_values.where(form_field: form_field).find_each do |form_field_value|
|
||||
form_field_value.update!(latest: false)
|
||||
end
|
||||
|
||||
"Form#{form_field.data['type']}Value".constantize.create!(
|
||||
new_form_field_value = "Form#{form_field.data['type']}Value".constantize.new(
|
||||
form_field: form_field,
|
||||
form_response: self,
|
||||
# these can change if the form_response is reset, as submitted_by will be kept the same, but created_by will change
|
||||
created_by: created_by,
|
||||
submitted_by: created_by,
|
||||
submitted_at: DateTime.current,
|
||||
value: value,
|
||||
not_applicable: not_applicable
|
||||
)
|
||||
|
||||
# for RepositoryRowsField we need to directly set previous data to the new value,
|
||||
# before save, to perserve existing repository row snapshots
|
||||
new_form_field_value.data = current_form_field_value&.data if form_field.data['type'] == 'RepositoryRowsField'
|
||||
|
||||
new_form_field_value.update!(value: value)
|
||||
|
||||
new_form_field_value
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddDataToFormFieldValues < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
add_column :form_field_values, :data, :jsonb
|
||||
end
|
||||
end
|
43
spec/models/form_repository_rows_field_value.rb
Normal file
43
spec/models/form_repository_rows_field_value.rb
Normal file
|
@ -0,0 +1,43 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe FormRepositoryRowsFieldValue, type: :model do
|
||||
let!(:repository) { create :repository }
|
||||
let!(:repository_row_1) { create :repository_row, repository: repository }
|
||||
let!(:repository_row_2) { create :repository_row, repository: repository }
|
||||
let!(:repository_row_3) { create :repository_row, repository: repository }
|
||||
|
||||
let(:form) { create :form }
|
||||
let(:form_field) { create :form_field, form: form, data: { type: 'FormRepositoryRowsFieldValue', validations: {} } }
|
||||
let(:form_field_value) { (create :form_field_value, type: 'FormRepositoryRowsFieldValue').becomes(FormRepositoryRowsFieldValue) }
|
||||
|
||||
it 'adds new repository row snapshots' do
|
||||
form_field_value.update(value: [repository_row_1.id, repository_row_2.id])
|
||||
expect(form_field_value.data.pluck('id')).to eq [repository_row_1.id, repository_row_2.id]
|
||||
expect(form_field_value.data[0]['snapshot_by_id']).to eq form_field_value.created_by_id
|
||||
end
|
||||
|
||||
it 'removes repository row snapshots' do
|
||||
form_field_value.update(value: [repository_row_1.id, repository_row_2.id, repository_row_3.id])
|
||||
expect(form_field_value.data.pluck('id')).to eq [repository_row_1.id, repository_row_2.id, repository_row_3.id]
|
||||
|
||||
form_field_value.update(value: [repository_row_1.id, repository_row_2.id])
|
||||
expect(form_field_value.data.pluck('id')).to eq [repository_row_1.id, repository_row_2.id]
|
||||
end
|
||||
|
||||
it 'keeps existing repository row snapshots intact' do
|
||||
form_field_value.update(value: [repository_row_1.id, repository_row_2.id])
|
||||
|
||||
existing_snapshot_timestamp = form_field_value.data[0]['snapshot_at']
|
||||
existing_snapshot_name = form_field_value.data[0]['name']
|
||||
|
||||
repository_row_1.update(name: "New name!")
|
||||
|
||||
form_field_value.update(value: [repository_row_1.id, repository_row_2.id, repository_row_3.id])
|
||||
expect(form_field_value.data.pluck('id')).to eq [repository_row_1.id, repository_row_2.id, repository_row_3.id]
|
||||
|
||||
expect(form_field_value.data[0]['snapshot_at']).to eq existing_snapshot_timestamp
|
||||
expect(form_field_value.data[0]['name']).to eq existing_snapshot_name
|
||||
end
|
||||
end
|
Loading…
Add table
Reference in a new issue