diff --git a/app/models/metadata_has_one.rb b/app/models/metadata_has_one.rb new file mode 100644 index 00000000..d1705e7d --- /dev/null +++ b/app/models/metadata_has_one.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +class MetadataHasOne < MetadataBelongsTo + alias has_one belongs_to + alias had_one belonged_to + + def save + # XXX: DRY + if !changed? + self[:value] = document_value + + return true + end + + self[:value] = sanitize value + + return true unless changed? + return true unless inverse? + + had_one[inverse]&.value = '' if had_one + has_one[inverse]&.value = post.uuid.value if has_one + + true + end + + def related_methods + @related_methods ||= %i[has_one had_one].freeze + end +end diff --git a/app/views/posts/attribute_ro/_has_one.haml b/app/views/posts/attribute_ro/_has_one.haml new file mode 100644 index 00000000..425e659e --- /dev/null +++ b/app/views/posts/attribute_ro/_has_one.haml @@ -0,0 +1,6 @@ +%tr{ id: attribute } + %th= post_label_t(attribute, post: post) + %td{ dir: dir, lang: locale } + - p = metadata.has_one + - if p + = link_to p.title.value, site_post_path(site, p.id) diff --git a/app/views/posts/attributes/_has_one.haml b/app/views/posts/attributes/_has_one.haml new file mode 100644 index 00000000..b0d21f35 --- /dev/null +++ b/app/views/posts/attributes/_has_one.haml @@ -0,0 +1,7 @@ +.form-group + = label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post) + = select_tag(plain_field_name_for(base, attribute), + options_for_select(metadata.values, metadata.value), + **field_options(attribute, metadata), include_blank: t('.empty')) + = render 'posts/attribute_feedback', + post: post, attribute: attribute, metadata: metadata