diff --git a/app/javascript/application.js b/app/javascript/application.js
index a32018e2..533cc9c3 100644
--- a/app/javascript/application.js
+++ b/app/javascript/application.js
@@ -124,6 +124,7 @@ safeRegisterElement('import-list', class extends HTMLElement {
this.app = createApp(ImportList, {
template: JSON.parse(this.dataset.template),
+ multitenant: this.dataset.multitenant === 'true',
authenticityToken: document.querySelector('meta[name="csrf-token"]')?.content
})
diff --git a/app/javascript/template_builder/import_list.vue b/app/javascript/template_builder/import_list.vue
index a08fd29f..b8b3c109 100644
--- a/app/javascript/template_builder/import_list.vue
+++ b/app/javascript/template_builder/import_list.vue
@@ -146,14 +146,14 @@
Total entries: {{ submissionsData.length }}
-
+
/ 1000
@@ -239,6 +239,11 @@ export default {
type: Object,
required: true
},
+ multitenant: {
+ type: Boolean,
+ required: false,
+ default: false
+ },
authenticityToken: {
type: String,
required: false,
@@ -269,7 +274,11 @@ export default {
if (['name', 'email', 'phone', 'external_id'].includes(mapping.field_name.toLowerCase())) {
submittersIndex[mapping.submitter_uuid][mapping.field_name.toLowerCase()] = row[mapping.column_index]
- } else {
+ }
+
+ const fieldType = this.fieldTypesIndex[mapping.submitter_uuid][mapping.field_name]
+
+ if (fieldType && fieldType !== 'phone') {
submittersIndex[mapping.submitter_uuid].fields.push({
name: mapping.field_name, default_value: row[mapping.column_index], readonly: true
})
@@ -306,6 +315,17 @@ export default {
submitters () {
return this.template.submitters
},
+ fieldTypesIndex () {
+ return this.template.fields.reduce((acc, field) => {
+ acc[field.submitter_uuid] ||= {}
+
+ if (field.name) {
+ acc[field.submitter_uuid][field.name] = field.type
+ }
+
+ return acc
+ }, {})
+ },
columns () {
return this.table[0]
},
diff --git a/lib/submitters/normalize_values.rb b/lib/submitters/normalize_values.rb
index 7c9863b5..31a72855 100644
--- a/lib/submitters/normalize_values.rb
+++ b/lib/submitters/normalize_values.rb
@@ -11,6 +11,9 @@ module Submitters
UnknownSubmitterName = Class.new(BaseError)
UnableToDownload = Class.new(BaseError)
+ TRUE_VALUES = ['1', 'true', true, 'TRUE', 'True', 'yes', 'YES', 'Yes'].freeze
+ FALSE_VALUES = ['0', 'false', false, 'FALSE', 'False', 'no', 'NO', 'No'].freeze
+
module_function
def call(template, values, submitter_name: nil, for_submitter: nil, throw_errors: false)
@@ -50,21 +53,32 @@ module Submitters
end
def normalize_value(field, value)
- if field['type'] == 'text' && value.present?
+ if field['type'] == 'checkbox'
+ return true if TRUE_VALUES.include?(value)
+ return false if FALSE_VALUES.include?(value)
+ end
+
+ return nil if value.blank?
+
+ if field['type'] == 'text'
value.to_s
- elsif field['type'] == 'number' && value.present?
+ elsif field['type'] == 'number'
(value.to_f % 1).zero? ? value.to_i : value.to_f
- elsif field['type'] == 'date' && value.present? && value != '{{date}}'
- if value.is_a?(Integer)
- Time.zone.at(value.to_s.first(10).to_i).to_date.to_s
- elsif value.gsub(/\w/, '0') == field.dig('preferences', 'format').to_s.gsub(/\w/, '0')
- TimeUtils.parse_date_string(value, field.dig('preferences', 'format')).to_s
- else
- Date.parse(value).to_s
- end
+ elsif field['type'] == 'date' && value != '{{date}}'
+ normalize_date(field, value)
else
value
end
+ end
+
+ def normalize_date(field, value)
+ if value.is_a?(Integer)
+ Time.zone.at(value.to_s.first(10).to_i).to_date.to_s
+ elsif value.gsub(/\w/, '0') == field.dig('preferences', 'format').to_s.gsub(/\w/, '0')
+ TimeUtils.parse_date_string(value, field.dig('preferences', 'format')).to_s
+ else
+ Date.parse(value).to_s
+ end
rescue Date::Error => e
Rollbar.warning(e) if defined?(Rollbar)