diff --git a/app/assets/stylesheets/repository/filters.scss b/app/assets/stylesheets/repository/filters.scss index e7e26f57e..c598b9630 100644 --- a/app/assets/stylesheets/repository/filters.scss +++ b/app/assets/stylesheets/repository/filters.scss @@ -173,11 +173,16 @@ } } + &.stock-filter-attributes { + grid-template-columns: min-content auto 100px; + } + .number-range-selector { align-items: center; display: grid; gap: .5em; grid-auto-flow: column; + height: 2em; } .dropdown-selector-container { diff --git a/app/javascript/vue/repository_filter/filter.vue b/app/javascript/vue/repository_filter/filter.vue index c98365cce..1869d135c 100644 --- a/app/javascript/vue/repository_filter/filter.vue +++ b/app/javascript/vue/repository_filter/filter.vue @@ -35,6 +35,7 @@ import RepositoryStatusValue from 'vue/repository_filter/filters/repositoryStatusValue.vue' import RepositoryChecklistValue from 'vue/repository_filter/filters/repositoryChecklistValue.vue' import RepositoryUserValue from 'vue/repository_filter/filters/repositoryUserValue.vue' + import RepositoryStockValue from 'vue/repository_filter/filters/repositoryStockValue.vue' import DropdownSelector from 'vue/shared/dropdown_selector.vue' @@ -61,7 +62,8 @@ RepositoryStatusValue, RepositoryChecklistValue, RepositoryListValue, - RepositoryUserValue + RepositoryUserValue, + RepositoryStockValue }, methods: { updateFilter(value) { diff --git a/app/javascript/vue/repository_filter/filters/repositoryStockValue.vue b/app/javascript/vue/repository_filter/filters/repositoryStockValue.vue new file mode 100644 index 000000000..21f280869 --- /dev/null +++ b/app/javascript/vue/repository_filter/filters/repositoryStockValue.vue @@ -0,0 +1,127 @@ + + + diff --git a/app/models/repository_column.rb b/app/models/repository_column.rb index 614f75aee..4000808e5 100644 --- a/app/models/repository_column.rb +++ b/app/models/repository_column.rb @@ -123,6 +123,7 @@ class RepositoryColumn < ApplicationRecord def items items_method_name = "#{data_type.chomp('Value').underscore}_items" + items_method_name = 'repository_stock_unit_items' if data_type == 'RepositoryStockValue' __send__(items_method_name) if respond_to?(items_method_name, true) end diff --git a/app/models/repository_stock_unit_item.rb b/app/models/repository_stock_unit_item.rb index 2bae73d24..defe741f9 100644 --- a/app/models/repository_stock_unit_item.rb +++ b/app/models/repository_stock_unit_item.rb @@ -14,7 +14,6 @@ class RepositoryStockUnitItem < ApplicationRecord validates :data, presence: true, uniqueness: { scope: :repository_column_id }, length: { maximum: Constants::NAME_MAX_LENGTH } - private def validate_per_column_limit diff --git a/app/models/repository_stock_value.rb b/app/models/repository_stock_value.rb index 9562ba52f..bdf4e5d80 100644 --- a/app/models/repository_stock_value.rb +++ b/app/models/repository_stock_value.rb @@ -24,6 +24,44 @@ class RepositoryStockValue < ApplicationRecord amount <= low_stock_threshold end + def self.add_filter_condition(repository_rows, join_alias, filter_element) + parameters = filter_element.parameters + if filter_element.operator == 'between' + return repository_rows if parameters['from'].blank? || parameters['to'].blank? + elsif parameters['value'].blank? + return repository_rows + end + + repository_rows = case parameters['stock_unit'] + when 'all' + repository_rows.where("#{join_alias}.repository_stock_unit_item_id IS NOT NULL") + when 'none' + repository_rows.where("#{join_alias}.repository_stock_unit_item_id IS NULL") + else + repository_rows.where("#{join_alias}.repository_stock_unit_item_id = ?", parameters['stock_unit']) + end + + case filter_element.operator + when 'equal_to' + repository_rows.where("#{join_alias}.amount = ?", parameters['value'].to_d) + when 'unequal_to' + repository_rows.where.not("#{join_alias}.amount = ?", parameters['value'].to_d) + when 'greater_than' + repository_rows.where("#{join_alias}.amount > ?", parameters['value'].to_d) + when 'greater_than_or_equal_to' + repository_rows.where("#{join_alias}.amount >= ?", parameters['value'].to_d) + when 'less_than' + repository_rows.where("#{join_alias}.amount < ?", parameters['value'].to_d) + when 'less_than_or_equal_to' + repository_rows.where("#{join_alias}.amount <= ?", parameters['value'].to_d) + when 'between' + repository_rows + .where("#{join_alias}.amount > ? AND #{join_alias}.amount < ?", parameters['from'].to_d, parameters['to'].to_d) + else + raise ArgumentError, 'Wrong operator for RepositoryStockValue!' + end + end + def data_changed?(new_data) BigDecimal(new_data.to_s) != data end diff --git a/config/initializers/extends.rb b/config/initializers/extends.rb index a6d155f21..3994641ff 100644 --- a/config/initializers/extends.rb +++ b/config/initializers/extends.rb @@ -117,6 +117,8 @@ class Extends table_name: :repository_date_time_values }, RepositoryTimeRangeValue: { table_name: :repository_date_time_range_values + }, RepositoryStockValue: { + table_name: :repository_stock_values } } @@ -139,6 +141,7 @@ class Extends RepositoryDateRangeValue RepositoryTimeValue RepositoryTimeRangeValue + RepositoryStockValue ) # Array of preload relations used in search query for repository rows diff --git a/config/locales/en.yml b/config/locales/en.yml index 70c1ac98c..52c7fbcbf 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1504,6 +1504,12 @@ en: select_placeholder: "Select user" multiple_selected: "users selected" all_selected: "All users selected" + RepositoryStockValue: + input_placeholder: "Enter numeric value" + to_placeholder: "To" + from_placeholder: "From" + all_units: "All units" + no_unit: "No unit" bmt_search: bmt_filter: "Biomolecule filter" save_filters: "Save filters"