diff --git a/app/controllers/repository_rows_controller.rb b/app/controllers/repository_rows_controller.rb index 239d751f7..fff4a0c87 100644 --- a/app/controllers/repository_rows_controller.rb +++ b/app/controllers/repository_rows_controller.rb @@ -59,6 +59,7 @@ class RepositoryRowsController < ApplicationController @assigned_modules = @repository_row.my_modules.joins(experiment: :project) @viewable_modules = @assigned_modules.viewable_by_user(current_user, current_user.teams) + @reminders_present = @repository_row.repository_cells.with_active_reminder(@current_user).any? end def create diff --git a/app/javascript/vue/repository_item_sidebar/RepositoryItemSidebar.vue b/app/javascript/vue/repository_item_sidebar/RepositoryItemSidebar.vue index 1d18aad95..4731f8c9f 100644 --- a/app/javascript/vue/repository_item_sidebar/RepositoryItemSidebar.vue +++ b/app/javascript/vue/repository_item_sidebar/RepositoryItemSidebar.vue @@ -93,7 +93,10 @@ {{ i18n.t('repositories.item_card.custom_columns_label') }}
-
+
+ + + @@ -193,10 +196,12 @@ import RepositoryDateRangeValue from './repository_values/RepositoryDateRangeVal import RepositoryTimeRangeValue from './repository_values/RepositoryTimeRangeValue.vue' import RepositoryTimeValue from './repository_values/RepositoryTimeValue.vue' import ScrollSpy from './repository_values/ScrollSpy.vue'; +import Reminder from './reminder.vue' export default { name: 'RepositoryItemSidebar', components: { + Reminder, RepositoryStockValue, RepositoryTextValue, RepositoryNumberValue, diff --git a/app/javascript/vue/repository_item_sidebar/reminder.vue b/app/javascript/vue/repository_item_sidebar/reminder.vue new file mode 100644 index 000000000..4c0a52502 --- /dev/null +++ b/app/javascript/vue/repository_item_sidebar/reminder.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/serializers/repository_datatable/repository_date_time_value_serializer.rb b/app/serializers/repository_datatable/repository_date_time_value_serializer.rb index 32989a920..ded1c5eb5 100644 --- a/app/serializers/repository_datatable/repository_date_time_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_date_time_value_serializer.rb @@ -12,9 +12,22 @@ module RepositoryDatatable if scope.dig(:options, :reminders_enabled) && !scope[:repository].is_a?(RepositorySnapshot) && - scope[:column].reminder_value.present? && scope[:column].reminder_unit.present? + scope[:column].reminder_value.present? && + scope[:column].reminder_unit.present? reminder_delta = scope[:column].reminder_value.to_i * scope[:column].reminder_unit.to_i data[:reminder] = reminder_delta + DateTime.now.to_i >= value_object.data.to_i + data[:reminder_message] = scope[:column].reminder_message + days_left = ((value_object.data - Time.now.utc) / 1.day).ceil + if data[:reminder] && days_left.positive? + data[:days_left] = days_left + date_expiration = + "#{days_left} #{I18n.t("repositories.item_card.reminders.day.#{days_left == 1 ? 'one' : 'other'}")}" + data[:text] = + "#{I18n.t('repositories.item_card.reminders.date_expiration', date_expiration: date_expiration)}\n + #{data[:reminder_message]}" + elsif data[:reminder] + data[:text] = "#{I18n.t('repositories.item_card.reminders.item_expired')}\n#{data[:reminder_message]}" + end end data diff --git a/app/serializers/repository_datatable/repository_date_value_serializer.rb b/app/serializers/repository_datatable/repository_date_value_serializer.rb index 54963518f..2b9464eb7 100644 --- a/app/serializers/repository_datatable/repository_date_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_date_value_serializer.rb @@ -10,11 +10,23 @@ module RepositoryDatatable if scope.dig(:options, :reminders_enabled) && !scope[:repository].is_a?(RepositorySnapshot) && - scope[:column].reminder_value.present? && scope[:column].reminder_unit.present? + scope[:column].reminder_value.present? && + scope[:column].reminder_unit.present? reminder_delta = scope[:column].reminder_value.to_i * scope[:column].reminder_unit.to_i data[:reminder] = reminder_delta + DateTime.now.to_i >= value_object.data.to_i + data[:reminder_message] = scope[:column].reminder_message + days_left = ((value_object.data - Time.now.utc) / 1.day).ceil + if data[:reminder] && days_left.positive? + data[:days_left] = days_left + date_expiration = + "#{days_left} #{I18n.t("repositories.item_card.reminders.day.#{days_left == 1 ? 'one' : 'other'}")}" + data[:text] = + "#{I18n.t('repositories.item_card.reminders.date_expiration', date_expiration: date_expiration)}\n + #{data[:reminder_message]}" + elsif data[:reminder] + data[:text] = "#{I18n.t('repositories.item_card.reminders.item_expired')}\n#{data[:reminder_message]}" + end end - data end end diff --git a/app/serializers/repository_datatable/repository_stock_value_serializer.rb b/app/serializers/repository_datatable/repository_stock_value_serializer.rb index 40bf57d3a..796f2a96e 100644 --- a/app/serializers/repository_datatable/repository_stock_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_stock_value_serializer.rb @@ -5,11 +5,23 @@ module RepositoryDatatable include Canaid::Helpers::PermissionsHelper def value - { + data = { stock_formatted: value_object.formatted, stock_amount: value_object.data, low_stock_threshold: value_object.low_stock_threshold } + if scope.dig(:options, :reminders_enabled) && + !scope[:repository].is_a?(RepositorySnapshot) && + value_object.data.present? && + value_object.low_stock_threshold.present? + data[:reminder] = value_object.low_stock_threshold > value_object.data + if data[:reminder] && (data[:stock_amount]).positive? + data[:text] = I18n.t('repositories.item_card.reminders.stock_low', stock_formated: data[:stock_formatted]) + elsif data[:reminder] + data[:text] = I18n.t('repositories.item_card.reminders.stock_empty') + end + end + data end end end diff --git a/app/views/repository_rows/show.json.jbuilder b/app/views/repository_rows/show.json.jbuilder index 8278793f3..e6feb098d 100644 --- a/app/views/repository_rows/show.json.jbuilder +++ b/app/views/repository_rows/show.json.jbuilder @@ -14,9 +14,9 @@ json.default_columns do end json.custom_columns do json.array! @repository_row.repository_cells do |repository_cell| - json.merge! serialize_repository_cell_value(repository_cell, @repository.team, @repository).merge( - repository_cell.repository_column.as_json(only: %i(id name data_type)) - ) + json.merge!(**serialize_repository_cell_value( + repository_cell, @repository.team, @repository, reminders_enabled: @reminders_present + ), **repository_cell.repository_column.as_json(only: %i(id name data_type))) end end diff --git a/config/locales/en.yml b/config/locales/en.yml index a6a399056..1d833c8a2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2240,9 +2240,17 @@ en: added_on: "Added on" added_at: "Added at" added_by: "Added by" - custom_columns_label: "Custom columns" + reminders: + stock_low: "Only %{stock_formated} left." + stock_empty: "No stock left" + date_expiration: "This item is expiring in %{date_expiration}." + item_expired: "This item has expired." + day: + one: "day" + other: "days" stock_export: "Export" - no_custom_columns_label: 'This item has no custom columns' + custom_columns_label: "Custom columns" + no_custom_columns_label: "This item has no custom columns" repository_time_range_value: no_time_range: 'No time range' repository_text_value: