mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-04 04:04:36 +08:00
Add view/edit renderers for numeric data type [SCI-4166]
This commit is contained in:
parent
2da7eeaedd
commit
e24bc2775a
24 changed files with 147 additions and 87 deletions
18
.rubocop.yml
18
.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:
|
||||
|
|
|
@ -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>`);
|
||||
};
|
||||
|
|
|
@ -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'));
|
||||
};
|
||||
|
|
|
@ -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));
|
||||
};
|
||||
|
|
|
@ -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
|
||||
});
|
||||
}());
|
||||
|
||||
|
|
|
@ -33,3 +33,7 @@ $.fn.dataTable.render.RepositoryAssetValueValidator = function($input) {
|
|||
$.fn.dataTable.render.RepositoryChecklistValueValidator = function() {
|
||||
return true;
|
||||
};
|
||||
|
||||
$.fn.dataTable.render.RepositoryNumberValueValidator = function() {
|
||||
return true;
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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' %>
|
||||
>
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Add table
Reference in a new issue