diff --git a/.rubocop.yml b/.rubocop.yml index ac9797608..1edaa3623 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -14,12 +14,12 @@ AllCops: Layout/AccessModifierIndentation: EnforcedStyle: indent -Layout/AlignHash: +Layout/HashAlignment: EnforcedHashRocketStyle: key EnforcedColonStyle: key EnforcedLastArgumentHashStyle: ignore_implicit -Layout/AlignParameters: +Layout/ParameterAlignment: EnforcedStyle: with_first_parameter Style/AndOr: @@ -83,7 +83,7 @@ Naming/FileName: Enabled: false Exclude: [] -Layout/IndentFirstParameter: +Layout/FirstParameterIndentation: EnforcedStyle: consistent Style/For: @@ -111,10 +111,10 @@ Layout/IndentationConsistency: Layout/IndentationWidth: Width: 2 -Layout/IndentFirstArrayElement: +Layout/FirstArrayElementIndentation: EnforcedStyle: special_inside_parentheses -Layout/IndentFirstHashElement: +Layout/FirstHashElementIndentation: EnforcedStyle: special_inside_parentheses Style/Next: @@ -197,9 +197,9 @@ Naming/PredicateName: - is_ - has_ - have_ - NamePrefixBlacklist: + ForbiddenPrefixes: - is_ - NameWhitelist: + AllowedMethods: - is_a? Exclude: - spec/**/* @@ -282,7 +282,7 @@ Style/TernaryParentheses: EnforcedStyle: require_no_parentheses AllowSafeAssignment: true -Layout/TrailingBlankLines: +Layout/TrailingEmptyLines: EnforcedStyle: final_newline Style/TrailingCommaInArguments: @@ -411,7 +411,7 @@ Lint/UnusedMethodArgument: Lint/EachWithObjectArgument: Enabled: true -Lint/HandleExceptions: +Lint/SuppressedException: Enabled: false Lint/LiteralAsCondition: diff --git a/app/assets/javascripts/repositories/renderers/edit_renderers.js b/app/assets/javascripts/repositories/renderers/edit_renderers.js index f7c41cf9d..88a69fbb3 100644 --- a/app/assets/javascripts/repositories/renderers/edit_renderers.js +++ b/app/assets/javascripts/repositories/renderers/edit_renderers.js @@ -117,3 +117,20 @@ $.fn.dataTable.render.editRepositoryChecklistValue = function(formId, columnId, var currentValue = $cell.find('.checklist-options').data('checklist-items'); ChecklistColumnHelper.initialChecklistEditMode(formId, columnId, $cell, currentValue); }; + +$.fn.dataTable.render.editRepositoryNumberValue = function(formId, columnId, cell, $header) { + let $cell = $(cell.node()); + let decimals = Number($header.data('metadata-decimals')); + let number = parseFloat(Number($cell.text()).toFixed(decimals)); + + $cell.html(` +
+ +
`); +}; diff --git a/app/assets/javascripts/repositories/renderers/new_renderers.js b/app/assets/javascripts/repositories/renderers/new_renderers.js index daff044cb..9439b0aad 100644 --- a/app/assets/javascripts/repositories/renderers/new_renderers.js +++ b/app/assets/javascripts/repositories/renderers/new_renderers.js @@ -68,3 +68,20 @@ $.fn.dataTable.render.newRepositoryStatusValue = function(formId, columnId, $cel $.fn.dataTable.render.newRepositoryChecklistValue = function(formId, columnId, $cell) { ChecklistColumnHelper.initialChecklistEditMode(formId, columnId, $cell); }; + +$.fn.dataTable.render.newRepositoryNumberValue = function(formId, columnId, $cell, $header) { + let decimals = Number($header.data('metadata-decimals')); + + $cell.html(` +
+ +
`); + + SmartAnnotation.init($cell.find('input')); +}; diff --git a/app/assets/javascripts/repositories/renderers/view_renderers.js b/app/assets/javascripts/repositories/renderers/view_renderers.js index d9d5f5b42..acb1bf6b6 100644 --- a/app/assets/javascripts/repositories/renderers/view_renderers.js +++ b/app/assets/javascripts/repositories/renderers/view_renderers.js @@ -5,12 +5,12 @@ $.fn.dataTable.render.RepositoryAssetValue = function(data) { return `
${asset.icon_html} - ${asset.file_name} @@ -113,7 +113,7 @@ $.fn.dataTable.render.RepositoryChecklistValue = function(data) { }); render = ` - + ${options.length} ${I18n.t('libraries.manange_modal_column.checklist_type.multiple_options')} @@ -126,3 +126,11 @@ $.fn.dataTable.render.RepositoryChecklistValue = function(data) { $.fn.dataTable.render.defaultRepositoryChecklistValue = function() { return '—'; }; + +$.fn.dataTable.render.defaultRepositoryNumberValue = function() { + return ''; +}; + +$.fn.dataTable.render.RepositoryNumberValue = function(data) { + return parseFloat(Number(data.value).toFixed(data.value_decimals)); +}; diff --git a/app/assets/javascripts/repositories/row_editor.js b/app/assets/javascripts/repositories/row_editor.js index b859cfba3..b57c66cb5 100644 --- a/app/assets/javascripts/repositories/row_editor.js +++ b/app/assets/javascripts/repositories/row_editor.js @@ -81,9 +81,9 @@ var RepositoryDatatableRowEditor = (function() { if (!$input.data('is-empty')) { // set hidden field for deletion only if original value has been set on rendering $input .prev('.file-hidden-field-container') - .html(``); } }); @@ -146,7 +146,7 @@ var RepositoryDatatableRowEditor = (function() { } else { let dataType = $header.data('type'); if (dataType) { - $.fn.dataTable.render['new' + dataType](formId, columnId, $cell); + $.fn.dataTable.render['new' + dataType](formId, columnId, $cell, $header); } } }); @@ -186,7 +186,7 @@ var RepositoryDatatableRowEditor = (function() { if (columnId === NAME_COLUMN_ID) { $.fn.dataTable.render.editRowName(formId, cell); } else if (dataType) { - $.fn.dataTable.render['edit' + dataType](formId, columnId, cell); + $.fn.dataTable.render['edit' + dataType](formId, columnId, cell, $header); } return true; @@ -205,4 +205,3 @@ var RepositoryDatatableRowEditor = (function() { addNewRow: addNewRow }); }()); - diff --git a/app/assets/javascripts/repositories/validators/base_validator.js b/app/assets/javascripts/repositories/validators/base_validator.js index 145a67c87..26a0942a6 100644 --- a/app/assets/javascripts/repositories/validators/base_validator.js +++ b/app/assets/javascripts/repositories/validators/base_validator.js @@ -33,3 +33,7 @@ $.fn.dataTable.render.RepositoryAssetValueValidator = function($input) { $.fn.dataTable.render.RepositoryChecklistValueValidator = function() { return true; }; + +$.fn.dataTable.render.RepositoryNumberValueValidator = function() { + return true; +}; diff --git a/app/helpers/repository_datatable_helper.rb b/app/helpers/repository_datatable_helper.rb index 08500cbd3..a96e8d103 100644 --- a/app/helpers/repository_datatable_helper.rb +++ b/app/helpers/repository_datatable_helper.rb @@ -68,6 +68,6 @@ module RepositoryDatatableHelper def display_cell_value(cell) "RepositoryDatatable::#{cell.repository_column.data_type}Serializer" - .constantize.new(cell).serializable_hash + .constantize.new(cell.value).serializable_hash end end diff --git a/app/models/repository_number_value.rb b/app/models/repository_number_value.rb index 824f6230a..e037cc3ce 100644 --- a/app/models/repository_number_value.rb +++ b/app/models/repository_number_value.rb @@ -16,4 +16,20 @@ class RepositoryNumberValue < ApplicationRecord def formatted data end + + def data_changed?(new_data) + new_data.to_f != data + end + + def update_data!(new_data, user) + self.data = new_data.to_f + self.last_modified_by = user + save! + end + + def self.new_with_payload(payload, attributes) + value = new(attributes) + value.data = payload.to_f + value + end end diff --git a/app/serializers/repository_datatable/repository_asset_value_serializer.rb b/app/serializers/repository_datatable/repository_asset_value_serializer.rb index 1349bb04b..675b7b0ca 100644 --- a/app/serializers/repository_datatable/repository_asset_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_asset_value_serializer.rb @@ -1,13 +1,11 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryAssetValueSerializer < ActiveModel::Serializer + class RepositoryAssetValueSerializer < RepositoryBaseValueSerializer include Rails.application.routes.url_helpers - attributes :value, :value_type - def value - asset = object.repository_asset_value.asset + asset = object.asset { id: asset.id, url: rails_blob_path(asset.file, disposition: 'attachment'), diff --git a/app/serializers/repository_datatable/repository_base_value_serializer.rb b/app/serializers/repository_datatable/repository_base_value_serializer.rb new file mode 100644 index 000000000..60756431b --- /dev/null +++ b/app/serializers/repository_datatable/repository_base_value_serializer.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module RepositoryDatatable + class RepositoryBaseValueSerializer < ActiveModel::Serializer + attributes :value, :value_type + + def value + raise NotImplementedError + end + + def value_type + object.class.name + end + end +end diff --git a/app/serializers/repository_datatable/repository_checklist_value_serializer.rb b/app/serializers/repository_datatable/repository_checklist_value_serializer.rb index 34da62770..4e784376d 100644 --- a/app/serializers/repository_datatable/repository_checklist_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_checklist_value_serializer.rb @@ -1,11 +1,9 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryChecklistValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryChecklistValueSerializer < RepositoryBaseValueSerializer def value - object.repository_checklist_value.data + object.data end end end diff --git a/app/serializers/repository_datatable/repository_date_range_value_serializer.rb b/app/serializers/repository_datatable/repository_date_range_value_serializer.rb index cfdd3019a..6c6817155 100644 --- a/app/serializers/repository_datatable/repository_date_range_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_date_range_value_serializer.rb @@ -1,12 +1,9 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryDateRangeValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryDateRangeValueSerializer < RepositoryBaseValueSerializer def value - cell = object.repository_date_time_range_value - I18n.l(cell.start_time, format: :full_date) + ' - ' + I18n.l(cell.end_time, format: :full_date) + I18n.l(object.start_time, format: :full_date) + ' - ' + I18n.l(object.end_time, format: :full_date) end end end diff --git a/app/serializers/repository_datatable/repository_date_time_range_value_serializer.rb b/app/serializers/repository_datatable/repository_date_time_range_value_serializer.rb index b672fe9cb..d439c8270 100644 --- a/app/serializers/repository_datatable/repository_date_time_range_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_date_time_range_value_serializer.rb @@ -1,12 +1,9 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryDateTimeRangeValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryDateTimeRangeValueSerializer < RepositoryBaseValueSerializer def value - cell = object.repository_date_time_range_value - I18n.l(cell.start_time, format: :full_with_comma) + ' - ' + I18n.l(cell.end_time, format: :full_with_comma) + I18n.l(object.start_time, format: :full_with_comma) + ' - ' + I18n.l(object.end_time, format: :full_with_comma) end end end diff --git a/app/serializers/repository_datatable/repository_date_time_value_serializer.rb b/app/serializers/repository_datatable/repository_date_time_value_serializer.rb index 3f7d1b50c..a58f84cf3 100644 --- a/app/serializers/repository_datatable/repository_date_time_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_date_time_value_serializer.rb @@ -1,12 +1,9 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryDateTimeValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryDateTimeValueSerializer < RepositoryBaseValueSerializer def value - cell = object.repository_date_time_value - I18n.l(cell.data, format: :full_with_comma) + I18n.l(object.data, format: :full_with_comma) end end end diff --git a/app/serializers/repository_datatable/repository_date_value_serializer.rb b/app/serializers/repository_datatable/repository_date_value_serializer.rb index 2dc01895d..a70ca09ec 100644 --- a/app/serializers/repository_datatable/repository_date_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_date_value_serializer.rb @@ -1,12 +1,9 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryDateValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryDateValueSerializer < RepositoryBaseValueSerializer def value - cell = object.repository_date_time_value - I18n.l(cell.data, format: :full_date) + I18n.l(object.data, format: :full_date) end end end diff --git a/app/serializers/repository_datatable/repository_list_value_serializer.rb b/app/serializers/repository_datatable/repository_list_value_serializer.rb index c7d0da176..d47deb4d3 100644 --- a/app/serializers/repository_datatable/repository_list_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_list_value_serializer.rb @@ -1,13 +1,11 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryListValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryListValueSerializer < RepositoryBaseValueSerializer def value { - id: object.repository_list_value.repository_list_item.id, - text: object.repository_list_value.data + id: object.repository_list_item.id, + text: object.data } end end diff --git a/app/serializers/repository_datatable/repository_number_value_serializer.rb b/app/serializers/repository_datatable/repository_number_value_serializer.rb index 2fb8a6200..5fff5a97e 100644 --- a/app/serializers/repository_datatable/repository_number_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_number_value_serializer.rb @@ -1,11 +1,18 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryNumberValueSerializer < ActiveModel::Serializer - attributes :value, :value_type + class RepositoryNumberValueSerializer < RepositoryBaseValueSerializer + attributes :value_decimals def value - object.repository_number_value.data + object.data + end + + def value_decimals + object.repository_cell + .repository_column + .metadata + .fetch('decimals') { Constants::REPOSITORY_NUMBER_TYPE_DEFAULT_DECIMALS } end end end diff --git a/app/serializers/repository_datatable/repository_status_value_serializer.rb b/app/serializers/repository_datatable/repository_status_value_serializer.rb index 2df453cbf..c2c39e632 100644 --- a/app/serializers/repository_datatable/repository_status_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_status_value_serializer.rb @@ -1,14 +1,12 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryStatusValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryStatusValueSerializer < RepositoryBaseValueSerializer def value { - id: object.repository_status_value.repository_status_item.id, - icon: object.repository_status_value.repository_status_item.icon, - status: object.repository_status_value.repository_status_item.status + id: object.repository_status_item.id, + icon: object.repository_status_item.icon, + status: object.repository_status_item.status } end end diff --git a/app/serializers/repository_datatable/repository_text_value_serializer.rb b/app/serializers/repository_datatable/repository_text_value_serializer.rb index 0980457c5..14c3319b3 100644 --- a/app/serializers/repository_datatable/repository_text_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_text_value_serializer.rb @@ -1,9 +1,7 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryTextValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryTextValueSerializer < RepositoryBaseValueSerializer def value object.repository_text_value.data end diff --git a/app/serializers/repository_datatable/repository_time_range_value_serializer.rb b/app/serializers/repository_datatable/repository_time_range_value_serializer.rb index e6cd3c058..5bbfb700d 100644 --- a/app/serializers/repository_datatable/repository_time_range_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_time_range_value_serializer.rb @@ -1,12 +1,9 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryTimeRangeValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryTimeRangeValueSerializer < RepositoryBaseValueSerializer def value - cell = object.repository_date_time_range_value - I18n.l(cell.start_time, format: :time) + ' - ' + I18n.l(cell.end_time, format: :time) + I18n.l(object.start_time, format: :time) + ' - ' + I18n.l(object.end_time, format: :time) end end end diff --git a/app/serializers/repository_datatable/repository_time_value_serializer.rb b/app/serializers/repository_datatable/repository_time_value_serializer.rb index eb74e6d89..28edaf57e 100644 --- a/app/serializers/repository_datatable/repository_time_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_time_value_serializer.rb @@ -1,12 +1,9 @@ # frozen_string_literal: true module RepositoryDatatable - class RepositoryTimeValueSerializer < ActiveModel::Serializer - attributes :value, :value_type - + class RepositoryTimeValueSerializer < RepositoryBaseValueSerializer def value - cell = object.repository_date_time_value - I18n.l(cell.data, format: :time) + I18n.l(object.data, format: :time) end end end diff --git a/app/services/repository_rows/update_repository_row_service.rb b/app/services/repository_rows/update_repository_row_service.rb index 75ce739c1..bace70cc7 100644 --- a/app/services/repository_rows/update_repository_row_service.rb +++ b/app/services/repository_rows/update_repository_row_service.rb @@ -25,18 +25,19 @@ module RepositoryRows cell = @repository_row.repository_cells.find_by(repository_column_id: column.id) - if cell && value.empty? + if cell.present? && value.blank? cell.destroy! @record_updated = true next + elsif cell.blank? + RepositoryCell.create_with_value!(@repository_row, column, value, @user) + @record_updated = true + next end - if cell&.value&.data_changed?(value) + if cell.value.data_changed?(value) cell.value.update_data!(value, @user) @record_updated = true - elsif !value.empty? - RepositoryCell.create_with_value!(@repository_row, column, value, @user) - @record_updated = true end end diff --git a/app/views/repositories/_repository_table.html.erb b/app/views/repositories/_repository_table.html.erb index e0ed5b9bd..3d4f83842 100644 --- a/app/views/repositories/_repository_table.html.erb +++ b/app/views/repositories/_repository_table.html.erb @@ -31,10 +31,13 @@ <%= t("repositories.table.added_on") %> <%= t("repositories.table.added_by") %> <% repository.repository_columns.order(:id).each do |column| %> - + <%= "data-metadata-#{k}=#{v}" %> + <% end %> <%= "data-items-url=#{items_repository_repository_columns_checklist_column_path(repository, column)}" if column.data_type == 'RepositoryChecklistValue' %> <%= "data-items-url=#{items_repository_repository_columns_list_column_path(repository, column)}" if column.data_type == 'RepositoryListValue' %> > diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index 45dc23bcb..3cb939143 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -977,7 +977,8 @@ class Constants REPOSITORY_LIST_ITEMS_PER_COLUMN = 500 REPOSITORY_CHECKLIST_ITEMS_PER_COLUMN = 50 - REPOSITORY_NUMBER_TYPE_MAX_DECIMALS = 11 + REPOSITORY_NUMBER_TYPE_DEFAULT_DECIMALS = 2 + REPOSITORY_NUMBER_TYPE_MAX_DECIMALS = 10 REPOSITORY_LIST_ITEMS_DELIMITERS_MAP = { return: "\n",