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"