mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-11 23:54:43 +08:00
Make repositories more extendable [SCI-3528]
This commit is contained in:
parent
d553fee2b3
commit
8920d38a02
8 changed files with 54 additions and 77 deletions
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class RepositoryAssetValue < ApplicationRecord
|
||||
belongs_to :created_by,
|
||||
foreign_key: :created_by_id,
|
||||
|
@ -15,6 +17,9 @@ class RepositoryAssetValue < ApplicationRecord
|
|||
|
||||
validates :asset, :repository_cell, presence: true
|
||||
|
||||
SORTABLE_COLUMN_NAME = 'assets.file_file_name'
|
||||
SORTABLE_VALUE_INCLUDE = { repository_asset_value: :asset }.freeze
|
||||
|
||||
def formatted
|
||||
asset.file_file_name
|
||||
end
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class RepositoryDateValue < ApplicationRecord
|
||||
belongs_to :created_by,
|
||||
foreign_key: :created_by_id,
|
||||
|
@ -14,6 +16,9 @@ class RepositoryDateValue < ApplicationRecord
|
|||
validates :data,
|
||||
presence: true
|
||||
|
||||
SORTABLE_COLUMN_NAME = 'repository_date_values.data'
|
||||
SORTABLE_VALUE_INCLUDE = :repository_date_value
|
||||
|
||||
def formatted
|
||||
data
|
||||
end
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class RepositoryListValue < ApplicationRecord
|
||||
belongs_to :repository_list_item
|
||||
belongs_to :created_by,
|
||||
|
@ -17,6 +19,9 @@ class RepositoryListValue < ApplicationRecord
|
|||
.repository_list_items
|
||||
end)
|
||||
|
||||
SORTABLE_COLUMN_NAME = 'repository_list_items.data'
|
||||
SORTABLE_VALUE_INCLUDE = { repository_list_value: :repository_list_item }.freeze
|
||||
|
||||
def formatted
|
||||
data.to_s
|
||||
end
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class RepositoryTextValue < ApplicationRecord
|
||||
belongs_to :created_by,
|
||||
foreign_key: :created_by_id,
|
||||
|
@ -15,6 +17,9 @@ class RepositoryTextValue < ApplicationRecord
|
|||
presence: true,
|
||||
length: { maximum: Constants::TEXT_MAX_LENGTH }
|
||||
|
||||
SORTABLE_COLUMN_NAME = 'repository_text_values.data'
|
||||
SORTABLE_VALUE_INCLUDE = :repository_text_value
|
||||
|
||||
def formatted
|
||||
data
|
||||
end
|
||||
|
|
|
@ -10,7 +10,7 @@ module RepositoryActions
|
|||
end
|
||||
|
||||
def call
|
||||
self.send("duplicate_#{@cell.value_type.underscore}")
|
||||
__send__("duplicate_#{@cell.value_type.split('::').last.underscore}")
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -119,9 +119,18 @@ class RepositoryDatatableService
|
|||
end
|
||||
elsif sortable_columns[column_id - 1] == 'repository_cell.value'
|
||||
id = @mappings.key(column_id.to_s)
|
||||
type = RepositoryColumn.find_by_id(id)
|
||||
return records unless type
|
||||
return select_type(type.data_type, records, id, dir)
|
||||
sorting_column = RepositoryColumn.find_by_id(id)
|
||||
return records unless sorting_column
|
||||
|
||||
sorting_data_type = sorting_column.data_type.constantize
|
||||
|
||||
cells = RepositoryCell.joins(sorting_data_type::SORTABLE_VALUE_INCLUDE)
|
||||
.where('repository_cells.repository_column_id': sorting_column.id)
|
||||
.select("repository_cells.repository_row_id,
|
||||
#{sorting_data_type::SORTABLE_COLUMN_NAME} AS value")
|
||||
|
||||
records.joins("LEFT OUTER JOIN (#{cells.to_sql}) AS values ON values.repository_row_id = repository_rows.id")
|
||||
.order("values.value #{dir}")
|
||||
elsif sortable_columns[column_id - 1] == 'users.full_name'
|
||||
# We don't need join user table, because it already joined in fetch_row method
|
||||
return records.order("users.full_name #{dir}")
|
||||
|
@ -151,61 +160,7 @@ class RepositoryDatatableService
|
|||
records.order(order_by_index)
|
||||
end
|
||||
|
||||
def select_type(type, records, id, dir)
|
||||
case type
|
||||
when 'RepositoryTextValue'
|
||||
filter_by_text_value(records, id, dir)
|
||||
when 'RepositoryListValue'
|
||||
filter_by_list_value(records, id, dir)
|
||||
when 'RepositoryAssetValue'
|
||||
filter_by_asset_value(records, id, dir)
|
||||
else
|
||||
records
|
||||
end
|
||||
end
|
||||
|
||||
def sort_null_direction(val)
|
||||
val == 'ASC' ? 'LAST' : 'FIRST'
|
||||
end
|
||||
|
||||
def filter_by_asset_value(records, id, dir)
|
||||
records.joins(
|
||||
"LEFT OUTER JOIN (SELECT repository_cells.repository_row_id,
|
||||
assets.file_file_name AS value
|
||||
FROM repository_cells
|
||||
INNER JOIN repository_asset_values
|
||||
ON repository_asset_values.id = repository_cells.value_id
|
||||
INNER JOIN assets
|
||||
ON repository_asset_values.asset_id = assets.id
|
||||
WHERE repository_cells.repository_column_id = #{id}) AS values
|
||||
ON values.repository_row_id = repository_rows.id"
|
||||
).order("values.value #{dir}")
|
||||
end
|
||||
|
||||
def filter_by_text_value(records, id, dir)
|
||||
records.joins(
|
||||
"LEFT OUTER JOIN (SELECT repository_cells.repository_row_id,
|
||||
repository_text_values.data AS value
|
||||
FROM repository_cells
|
||||
INNER JOIN repository_text_values
|
||||
ON repository_text_values.id = repository_cells.value_id
|
||||
WHERE repository_cells.repository_column_id = #{id}) AS values
|
||||
ON values.repository_row_id = repository_rows.id"
|
||||
).order("values.value #{dir}")
|
||||
end
|
||||
|
||||
def filter_by_list_value(records, id, dir)
|
||||
records.joins(
|
||||
"LEFT OUTER JOIN (SELECT repository_cells.repository_row_id,
|
||||
repository_list_items.data AS value
|
||||
FROM repository_cells
|
||||
INNER JOIN repository_list_values
|
||||
ON repository_list_values.id = repository_cells.value_id
|
||||
INNER JOIN repository_list_items
|
||||
ON repository_list_values.repository_list_item_id =
|
||||
repository_list_items.id
|
||||
WHERE repository_cells.repository_column_id = #{id}) AS values
|
||||
ON values.repository_row_id = repository_rows.id"
|
||||
).order("values.value #{dir}")
|
||||
end
|
||||
end
|
||||
|
|
|
@ -14,7 +14,7 @@ module RepositoryImportParser
|
|||
|
||||
def get_value(value, record_row)
|
||||
return unless @column
|
||||
send("new_#{@column.data_type.underscore}", value, record_row)
|
||||
__send__("new_#{@column.data_type.split('::').last.underscore}", value, record_row)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -25,24 +25,26 @@
|
|||
<%= f.text_field :name %>
|
||||
<%= f.form_group :data_type, label: { text: t('libraries.manange_modal_column.colum_type') } do %>
|
||||
<br />
|
||||
<%= f.radio_button :data_type,
|
||||
'RepositoryTextValue'.freeze,
|
||||
label: t('libraries.manange_modal_column.labels.text'),
|
||||
inline: true,
|
||||
checked: checked?(@repository_column, 'RepositoryTextValue'.freeze),
|
||||
disabled: disabled?(@repository_column, 'RepositoryTextValue'.freeze) %>
|
||||
<%= f.radio_button :data_type,
|
||||
'RepositoryAssetValue'.freeze,
|
||||
label: t('libraries.manange_modal_column.labels.file'),
|
||||
inline: true,
|
||||
checked: checked?(@repository_column, 'RepositoryAssetValue'.freeze),
|
||||
disabled: disabled?(@repository_column, 'RepositoryAssetValue'.freeze) %>
|
||||
<%= f.radio_button :data_type,
|
||||
'RepositoryListValue'.freeze,
|
||||
label: t('libraries.manange_modal_column.labels.dropdown'),
|
||||
inline: true,
|
||||
checked: checked?(@repository_column, 'RepositoryListValue'.freeze),
|
||||
disabled: disabled?(@repository_column, 'RepositoryListValue'.freeze) %>
|
||||
<span id="repository-column-types-list">
|
||||
<%= f.radio_button :data_type,
|
||||
'RepositoryTextValue'.freeze,
|
||||
label: t('libraries.manange_modal_column.labels.text'),
|
||||
inline: true,
|
||||
checked: checked?(@repository_column, 'RepositoryTextValue'.freeze),
|
||||
disabled: disabled?(@repository_column, 'RepositoryTextValue'.freeze) %>
|
||||
<%= f.radio_button :data_type,
|
||||
'RepositoryAssetValue'.freeze,
|
||||
label: t('libraries.manange_modal_column.labels.file'),
|
||||
inline: true,
|
||||
checked: checked?(@repository_column, 'RepositoryAssetValue'.freeze),
|
||||
disabled: disabled?(@repository_column, 'RepositoryAssetValue'.freeze) %>
|
||||
<%= f.radio_button :data_type,
|
||||
'RepositoryListValue'.freeze,
|
||||
label: t('libraries.manange_modal_column.labels.dropdown'),
|
||||
inline: true,
|
||||
checked: checked?(@repository_column, 'RepositoryListValue'.freeze),
|
||||
disabled: disabled?(@repository_column, 'RepositoryListValue'.freeze) %>
|
||||
</span>
|
||||
<% end %>
|
||||
<input class="form-control"
|
||||
data-role="tagsinput"
|
||||
|
|
Loading…
Add table
Reference in a new issue