Add view/edit renderers for numeric data type [SCI-4166]

This commit is contained in:
Oleksii Kriuchykhin 2019-12-18 11:55:12 +01:00
parent 2da7eeaedd
commit e24bc2775a
24 changed files with 147 additions and 87 deletions

View file

@ -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:

View file

@ -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(`
<div class="form-group">
<input class="form-control editing"
form="${formId}"
type="number"
name="repository_cells[${columnId}]"
value="${number}"
onchange="if (this.value !== '') { this.value = parseFloat(Number(this.value).toFixed(${decimals})); }"
data-type="RepositoryNumberValue">
</div>`);
};

View file

@ -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(`
<div class="form-group">
<input class="form-control editing"
form="${formId}"
type="number"
name="repository_cells[${columnId}]"
value=""
onchange="if (this.value !== '') { this.value = parseFloat(Number(this.value).toFixed(${decimals})); }"
data-type="RepositoryNumberValue">
</div>`);
SmartAnnotation.init($cell.find('input'));
};

View file

@ -126,3 +126,11 @@ $.fn.dataTable.render.RepositoryChecklistValue = function(data) {
$.fn.dataTable.render.defaultRepositoryChecklistValue = function() {
return '&#8212;';
};
$.fn.dataTable.render.defaultRepositoryNumberValue = function() {
return '';
};
$.fn.dataTable.render.RepositoryNumberValue = function(data) {
return parseFloat(Number(data.value).toFixed(data.value_decimals));
};

View file

@ -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
});
}());

View file

@ -33,3 +33,7 @@ $.fn.dataTable.render.RepositoryAssetValueValidator = function($input) {
$.fn.dataTable.render.RepositoryChecklistValueValidator = function() {
return true;
};
$.fn.dataTable.render.RepositoryNumberValueValidator = function() {
return true;
};

View file

@ -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

View file

@ -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

View file

@ -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'),

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -35,6 +35,9 @@
class="repository-column"
id="<%= column.id %>"
data-type="<%= column.data_type %>"
<% column.metadata.each do |k, v| %>
<%= "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' %>
>

View file

@ -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",