diff --git a/app/javascript/template_builder/area.vue b/app/javascript/template_builder/area.vue
index d323d664..c5a1cfc4 100644
--- a/app/javascript/template_builder/area.vue
+++ b/app/javascript/template_builder/area.vue
@@ -140,6 +140,7 @@ import FieldSubmitter from './field_submitter'
import FieldType from './field_type'
import Field from './field'
import { IconX } from '@tabler/icons-vue'
+import { v4 } from 'uuid'
export default {
name: 'FieldArea',
@@ -303,7 +304,7 @@ export default {
}
if (['select', 'multiple', 'radio'].includes(this.field.type)) {
- this.field.options ||= ['']
+ this.field.options ||= [{ value: '', uuid: v4() }]
}
(this.field.areas || []).forEach((area) => {
diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue
index 809f6fe1..248e3122 100644
--- a/app/javascript/template_builder/builder.vue
+++ b/app/javascript/template_builder/builder.vue
@@ -429,7 +429,7 @@ export default {
}
if (['select', 'multiple', 'radio'].includes(type)) {
- field.options = ['']
+ field.options = [{ value: '', uuid: v4() }]
}
this.drawField = field
@@ -592,7 +592,7 @@ export default {
}
if (['select', 'multiple', 'radio'].includes(field.type)) {
- field.options = ['']
+ field.options = [{ value: '', uuid: v4() }]
}
const fieldArea = {
diff --git a/app/javascript/template_builder/field.vue b/app/javascript/template_builder/field.vue
index eb99836a..3fa0abf7 100644
--- a/app/javascript/template_builder/field.vue
+++ b/app/javascript/template_builder/field.vue
@@ -194,17 +194,19 @@
{{ index + 1 }}.
+ Add option
@@ -233,6 +235,7 @@
import Contenteditable from './contenteditable'
import FieldType from './field_type'
import { IconShape, IconNewSection, IconTrashX, IconCopy, IconSettings } from '@tabler/icons-vue'
+import { v4 } from 'uuid'
export default {
name: 'TemplateField',
@@ -309,6 +312,11 @@ export default {
closeDropdown () {
document.activeElement.blur()
},
+ addOption () {
+ this.field.options.push({ value: '', uuid: v4() })
+
+ this.save()
+ },
maybeUpdateOptions () {
delete this.field.default_value
@@ -317,7 +325,7 @@ export default {
}
if (['radio', 'multiple', 'select'].includes(this.field.type)) {
- this.field.options ||= ['']
+ this.field.options ||= [{ value: '', uuid: v4() }]
}
(this.field.areas || []).forEach((area) => {
diff --git a/app/javascript/template_builder/fields.vue b/app/javascript/template_builder/fields.vue
index 81ede9c4..793120d7 100644
--- a/app/javascript/template_builder/fields.vue
+++ b/app/javascript/template_builder/fields.vue
@@ -252,7 +252,7 @@ export default {
}
if (['select', 'multiple', 'radio'].includes(type)) {
- field.options = ['']
+ field.options = [{ value: '', uuid: v4() }]
}
this.fields.push(field)
diff --git a/db/migrate/20231112224432_update_field_options.rb b/db/migrate/20231112224432_update_field_options.rb
new file mode 100644
index 00000000..b72db381
--- /dev/null
+++ b/db/migrate/20231112224432_update_field_options.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+class UpdateFieldOptions < ActiveRecord::Migration[7.0]
+ class MigrationTemplate < ApplicationRecord
+ self.table_name = 'templates'
+ end
+
+ class MigrationSubmission < ApplicationRecord
+ self.table_name = 'submissions'
+ end
+
+ # rubocop:disable Metrics
+ def up
+ MigrationTemplate.find_each do |template|
+ next if template.fields.blank?
+
+ template_fields = JSON.parse(template.fields)
+
+ new_fields = template_fields.deep_dup
+
+ new_fields.each do |field|
+ if field['options'].present? && !field['options'].first.is_a?(Hash)
+ field['options'] = field['options'].map { |o| { value: o || '', uuid: SecureRandom.uuid } }
+ end
+ end
+
+ template.update_columns(fields: new_fields.to_json) if template_fields != new_fields
+ end
+
+ MigrationSubmission.find_each do |submission|
+ next if submission.template_fields.blank?
+
+ template_fields = JSON.parse(submission.template_fields)
+
+ new_fields = template_fields.deep_dup
+
+ new_fields.each do |field|
+ if field['options'].present? && !field['options'].first.is_a?(Hash)
+ field['options'] = field['options'].map { |o| { value: o || '', uuid: SecureRandom.uuid } }
+ end
+ end
+
+ submission.update_columns(template_fields: new_fields.to_json) if template_fields != new_fields
+ end
+ end
+ # rubocop:enable Metrics
+
+ def down
+ nil
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 512178c1..ce043569 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.0].define(version: 2023_11_02_171817) do
+ActiveRecord::Schema[7.0].define(version: 2023_11_12_224432) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"