diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb index d70ade71..9d9cfef8 100644 --- a/app/controllers/api/submissions_controller.rb +++ b/app/controllers/api/submissions_controller.rb @@ -107,7 +107,8 @@ module Api def submissions_params params.permit(submission: [{ submitters: [[:uuid, :name, :email, :role, :completed, :phone, - { values: {}, readonly_fields: [] }]] + { values: {}, readonly_fields: [], + fields: [%i[name default_value readonly validation_pattern invalid_message]] }]] }]) end @@ -116,11 +117,15 @@ module Api Array.wrap(submissions_params).each do |submission| submission[:submitters].each_with_index do |submitter, index| - next if submitter[:values].blank? + default_values = submitter[:values] || {} + + submitter[:fields]&.each { |f| default_values[f[:name]] = f[:default_value] if f[:default_value].present? } + + next if default_values.blank? values, new_attachments = Submitters::NormalizeValues.call(template, - submitter[:values], + default_values, submitter[:role] || template.submitters[index]['name']) attachments.push(*new_attachments) diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue index eea283fe..f231e3d4 100644 --- a/app/javascript/submission_form/form.vue +++ b/app/javascript/submission_form/form.vue @@ -75,6 +75,9 @@ v-model="values[currentField.uuid]" class="base-input !text-2xl w-full" :required="currentField.required" + :pattern="currentField.validation?.pattern" + :oninvalid="currentField.validation?.message ? `this.setCustomValidity(${JSON.stringify(currentField.validation.message)})` : ''" + :oninput="currentField.validation?.message ? `this.setCustomValidity('')` : ''" :placeholder="`${t('type_here')}...${currentField.required ? '' : ` (${t('optional')})`}`" type="text" :name="`values[${currentField.uuid}]`" diff --git a/lib/submissions/create_from_submitters.rb b/lib/submissions/create_from_submitters.rb index c571d6a3..771d5e42 100644 --- a/lib/submissions/create_from_submitters.rb +++ b/lib/submissions/create_from_submitters.rb @@ -29,17 +29,11 @@ module Submissions template_fields = submission.template.fields.deep_dup submitters_attrs.each_with_index do |submitter_attrs, index| - next if submitter_attrs[:readonly_fields].blank? + submitter_uuid = find_submitter_uuid(submission.template, submitter_attrs, index) - uuid = find_submitter_uuid(submission.template, submitter_attrs, index) + process_readonly_fields_param(submitter_attrs[:readonly_fields], template_fields, submitter_uuid) - template_fields.each do |f| - next if f['submitter_uuid'] != uuid || - (!f['name'].in?(submitter_attrs[:readonly_fields]) && - !f['name'].parameterize.underscore.in?(submitter_attrs[:readonly_fields])) - - f['readonly'] = true - end + process_fields_param(submitter_attrs[:fields], template_fields, submitter_uuid) end if template_fields != submission.template.fields @@ -50,6 +44,39 @@ module Submissions submission end + def process_readonly_fields_param(readonly_fields, template_fields, submitter_uuid) + return if readonly_fields.blank? + + template_fields.each do |f| + next if f['submitter_uuid'] != submitter_uuid || + (!f['name'].in?(readonly_fields) && + !f['name'].parameterize.underscore.in?(readonly_fields)) + + f['readonly'] = true + end + end + + def process_fields_param(fields, template_fields, submitter_uuid) + return if fields.blank? + + template_fields.each do |f| + next if f['submitter_uuid'] != submitter_uuid + + field_configs = fields.find { |e| e['name'] == f['name'] || e['name'] == f['name'].parameterize.underscore } + + next if field_configs.blank? + + f['readonly'] = field_configs['readonly'] if field_configs['readonly'].present? + + next if field_configs['validation_pattern'].blank? + + f['validation'] = { + 'pattern' => field_configs['validation_pattern'], + 'message' => field_configs['invalid_message'] + }.compact_blank + end + end + def find_submitter_uuid(template, attrs, index) attrs[:uuid].presence || template.submitters.find { |e| e['name'] == attrs[:role] }&.dig('uuid') ||