|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +class Dossiers::ChangesComponent < ApplicationComponent |
| 4 | + attr_reader :changed_columns |
| 5 | + |
| 6 | + def initialize(changed_columns:) |
| 7 | + @changed_columns = changed_columns |
| 8 | + end |
| 9 | + |
| 10 | + def render? = changed_columns.present? |
| 11 | + |
| 12 | + private |
| 13 | + |
| 14 | + def change_content(changed_column) |
| 15 | + case changed_column.type |
| 16 | + when :geojson |
| 17 | + tag.em(t('.geojson_changed')) |
| 18 | + when :attachments |
| 19 | + attachments_change(changed_column) |
| 20 | + when :enums |
| 21 | + enums_change(changed_column) |
| 22 | + else |
| 23 | + simple_change(changed_column) |
| 24 | + end |
| 25 | + end |
| 26 | + |
| 27 | + def simple_change(changed_column) |
| 28 | + value = changed_column.value |
| 29 | + return tag.em(t('.removed')) if value.nil? |
| 30 | + |
| 31 | + tag.strong(format_value(changed_column, value)) |
| 32 | + end |
| 33 | + |
| 34 | + def format_value(column, value) |
| 35 | + case column.type |
| 36 | + when :boolean |
| 37 | + value ? t('utils.yes') : t('utils.no') |
| 38 | + when :enum |
| 39 | + column.label_for_value(value) |
| 40 | + when :date |
| 41 | + value = Date.parse(value) if value.is_a?(String) |
| 42 | + I18n.l(value, format: :short) |
| 43 | + when :datetime |
| 44 | + value = Time.zone.parse(value) if value.is_a?(String) |
| 45 | + I18n.l(value, format: :short_with_time) |
| 46 | + else |
| 47 | + value.to_s |
| 48 | + end |
| 49 | + end |
| 50 | + |
| 51 | + def attachments_change(changed_column) |
| 52 | + current = attachment_filenames(changed_column.value) |
| 53 | + previous = attachment_filenames(changed_column.previous_value) |
| 54 | + |
| 55 | + diff_list(added: current - previous, removed: previous - current) |
| 56 | + end |
| 57 | + |
| 58 | + def enums_change(changed_column) |
| 59 | + current = Array(changed_column.value) |
| 60 | + previous = Array(changed_column.previous_value) |
| 61 | + |
| 62 | + diff_list( |
| 63 | + added: (current - previous).map { changed_column.label_for_value(it) }, |
| 64 | + removed: (previous - current).map { changed_column.label_for_value(it) } |
| 65 | + ) |
| 66 | + end |
| 67 | + |
| 68 | + def diff_list(added:, removed:) |
| 69 | + lines = [] |
| 70 | + lines << diff_line(t('.added'), added) if added.present? |
| 71 | + lines << diff_line(t('.removed_values'), removed) if removed.present? |
| 72 | + return tag.em(t('.changed')) if lines.empty? |
| 73 | + |
| 74 | + safe_join(lines, tag.br) |
| 75 | + end |
| 76 | + |
| 77 | + def diff_line(label, values) |
| 78 | + safe_join([label, ' ', tag.strong(values.to_sentence)]) |
| 79 | + end |
| 80 | + |
| 81 | + def attachment_filenames(value) |
| 82 | + Array(value).map { it.blob.filename.to_s } |
| 83 | + end |
| 84 | +end |
0 commit comments