diff --git a/app/assets/javascripts/my_modules/repositories.js b/app/assets/javascripts/my_modules/repositories.js index 6cf2d443f5..0b25a13801 100644 --- a/app/assets/javascripts/my_modules/repositories.js +++ b/app/assets/javascripts/my_modules/repositories.js @@ -210,6 +210,9 @@ var MyModuleRepositories = (function() { } function renderSimpleTable(tableContainer) { + console.log(tableContainer.attr('data-element')) + window.mountRepositoryTable(tableContainer.attr('data-element')); + return if (SIMPLE_TABLE) SIMPLE_TABLE.destroy(); SIMPLE_TABLE = $(tableContainer).DataTable({ dom: "Rt<'pagination-row'<'version-label'><'pagination-actions'p>>", @@ -265,6 +268,15 @@ var MyModuleRepositories = (function() { } function renderFullViewTable(tableContainer, options = {}) { + renderFullViewRepositoryName( + tableContainer.attr('data-repository-name'), + tableContainer.attr('data-repository-snapshot-created'), + options.assign_mode + ); + updateFullViewRowsCount(tableContainer.attr('data-assigned-items-count')); + window.mountRepositoryTable(); + return + if (FULL_VIEW_TABLE) FULL_VIEW_TABLE.destroy(); SELECTED_ROWS = {}; FULL_VIEW_TABLE_SCROLLBAR = false; @@ -448,7 +460,7 @@ var MyModuleRepositories = (function() { repositoryTable.attr('data-version-label', $(this).data('footer-label')); repositoryTable.attr('data-name-column-id', $(this).data('name-column-id')); repositoryTable.attr('data-stock-management', $(this).data('data-stock-management')); - repositoryContainer.html(repositoryTable); + //repositoryContainer.html(repositoryTable); renderSimpleTable(repositoryTable); }); @@ -591,6 +603,7 @@ var MyModuleRepositories = (function() { }); FULL_VIEW_MODAL.on('hidden.bs.modal', function() { + return FULL_VIEW_MODAL.find('.repository-versions-sidebar').empty(); FULL_VIEW_MODAL.find('.modal-content').removeClass('show-sidebar'); FULL_VIEW_MODAL.find('#showVersionsSidebar').removeClass('active'); diff --git a/app/controllers/my_module_repositories_controller.rb b/app/controllers/my_module_repositories_controller.rb index b2a201544f..69ed0c8d94 100644 --- a/app/controllers/my_module_repositories_controller.rb +++ b/app/controllers/my_module_repositories_controller.rb @@ -11,34 +11,38 @@ class MyModuleRepositoriesController < ApplicationController before_action :check_assign_repository_records_permissions, only: %i(update create) def index_dt - @draw = params[:draw].to_i - per_page = params[:length].to_i < 1 ? Constants::REPOSITORY_DEFAULT_PAGE_SIZE : params[:length].to_i - page = (params[:start].to_i / per_page) + 1 - datatable_service = RepositoryDatatableService.new(@repository, params, current_user, @my_module) - - @datatable_params = { - view_mode: params[:view_mode], - my_module: @my_module, - include_stock_consumption: @repository.has_stock_management? && params[:assigned].present?, - disable_stock_management: true # stock management is always disabled in MyModule context - } - - @all_rows_count = datatable_service.all_count - @columns_mappings = datatable_service.mappings - - if params[:simple_view] - repository_rows = datatable_service.repository_rows - rows_view = 'repository_rows/simple_view_index' - else - repository_rows = datatable_service.repository_rows - .preload(:repository_columns, - :created_by, - repository_cells: { value: @repository.cell_preload_includes }) - rows_view = 'repository_rows/index' - end - @repository_rows = repository_rows.page(page).per(per_page) - - render rows_view + repository_rows = Lists::RepositoryRowsService.new(@repository, params, current_user, @my_module).call + render json: repository_rows, each_serializer: Lists::RepositoryRowSerializer, user: current_user, my_module: @my_module, + meta: pagination_dict(repository_rows) + + # @draw = params[:draw].to_i + # per_page = params[:length].to_i < 1 ? Constants::REPOSITORY_DEFAULT_PAGE_SIZE : params[:length].to_i + # page = (params[:start].to_i / per_page) + 1 + # datatable_service = RepositoryDatatableService.new(@repository, params, current_user, @my_module) + + # @datatable_params = { + # view_mode: params[:view_mode], + # my_module: @my_module, + # include_stock_consumption: @repository.has_stock_management? && params[:assigned].present?, + # disable_stock_management: true # stock management is always disabled in MyModule context + # } + + # @all_rows_count = datatable_service.all_count + # @columns_mappings = datatable_service.mappings + + # if params[:simple_view] + # repository_rows = datatable_service.repository_rows + # rows_view = 'repository_rows/simple_view_index' + # else + # repository_rows = datatable_service.repository_rows + # .preload(:repository_columns, + # :created_by, + # repository_cells: { value: @repository.cell_preload_includes }) + # rows_view = 'repository_rows/index' + # end + # @repository_rows = repository_rows.page(page).per(per_page) + + # render rows_view end def create diff --git a/app/controllers/repository_columns_controller.rb b/app/controllers/repository_columns_controller.rb index 057ff09b66..30c341d8f2 100644 --- a/app/controllers/repository_columns_controller.rb +++ b/app/controllers/repository_columns_controller.rb @@ -17,6 +17,11 @@ def index } end + def index_new + columns = @repository.repository_columns + render json: columns, each_serializer: RepositoryColumnSerializer + end + def new @repository_column = RepositoryColumn.new render json: { diff --git a/app/controllers/repository_rows_controller.rb b/app/controllers/repository_rows_controller.rb index a9c8b11e14..0d365a474c 100644 --- a/app/controllers/repository_rows_controller.rb +++ b/app/controllers/repository_rows_controller.rb @@ -42,6 +42,12 @@ def index render json: { custom_error: I18n.t('repositories.show.repository_filter.errors.value_not_found') } end + def index_new + repository_rows = Lists::RepositoryRowsService.new(@repository, params, current_user).call + render json: repository_rows, each_serializer: Lists::RepositoryRowSerializer, user: current_user, + meta: pagination_dict(repository_rows) + end + def show respond_to do |format| format.html do @@ -339,7 +345,7 @@ def actions_toolbar actions: Toolbars::RepositoryRowsService.new( current_user, - repository_row_ids: params[:repository_row_ids].split(',') + repository_row_ids: JSON.parse(params[:items]).map { |i| i['id'] } ).actions } end diff --git a/app/helpers/my_modules_helper.rb b/app/helpers/my_modules_helper.rb index fecd5cb24a..b61ad09288 100644 --- a/app/helpers/my_modules_helper.rb +++ b/app/helpers/my_modules_helper.rb @@ -64,12 +64,12 @@ def grouped_by_prj_exp(my_modules) end end - def assigned_repository_full_view_table_path(my_module, repository) + def assigned_repository_full_view_table_path(my_module, repository, assigned = nil) if repository.is_a?(RepositorySnapshot) - return full_view_table_my_module_repository_snapshot_path(my_module, repository) + return full_view_table_my_module_repository_snapshot_path(my_module, repository, assigned: assigned) end - full_view_table_my_module_repository_path(my_module, repository) + full_view_table_my_module_repository_path(my_module, repository, assigned: assigned) end def assigned_repository_simple_view_index_path(my_module, repository) diff --git a/app/javascript/packs/vue/repository_table.js b/app/javascript/packs/vue/repository_table.js new file mode 100644 index 0000000000..ee8572702d --- /dev/null +++ b/app/javascript/packs/vue/repository_table.js @@ -0,0 +1,16 @@ +import { createApp } from 'vue/dist/vue.esm-bundler.js'; +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import RepositoryTable from '../../vue/repository/table.vue'; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; + +window.mountRepositoryTable = (el = '#repositoryTable') => { + const app = createApp(); + app.component('RepositoryTable', RepositoryTable); + app.config.globalProperties.i18n = window.I18n; + app.use(PerfectScrollbar); + if (document.getElementById('repositoryTable') || el !== '#repositoryTable') { + mountWithTurbolinks(app, el); + } +}; + +window.mountRepositoryTable(); diff --git a/app/javascript/vue/experiments/list.vue b/app/javascript/vue/experiments/list.vue index d4b126ed88..52f7d46a48 100644 --- a/app/javascript/vue/experiments/list.vue +++ b/app/javascript/vue/experiments/list.vue @@ -157,9 +157,7 @@ export default { field: 'description', headerName: this.i18n.t('experiments.card.description'), sortable: true, - cellStyle: { 'white-space': 'normal' }, cellRenderer: DescriptionRenderer, - autoHeight: true, minWidth: 110 }); diff --git a/app/javascript/vue/repository/renderers/asset_value.vue b/app/javascript/vue/repository/renderers/asset_value.vue new file mode 100644 index 0000000000..1d0c2aeef6 --- /dev/null +++ b/app/javascript/vue/repository/renderers/asset_value.vue @@ -0,0 +1,16 @@ + + + {{ params.value.value.file_name }} + + + + diff --git a/app/javascript/vue/repository/renderers/assigned.vue b/app/javascript/vue/repository/renderers/assigned.vue new file mode 100644 index 0000000000..a5c96be9a7 --- /dev/null +++ b/app/javascript/vue/repository/renderers/assigned.vue @@ -0,0 +1,16 @@ + + + {{ params.value.tasks }} + + + + diff --git a/app/javascript/vue/repository/renderers/checklist_value.vue b/app/javascript/vue/repository/renderers/checklist_value.vue new file mode 100644 index 0000000000..5153e55dd7 --- /dev/null +++ b/app/javascript/vue/repository/renderers/checklist_value.vue @@ -0,0 +1,30 @@ + + + + + {{ params.value.value.length }} + {{ i18n.t('libraries.manange_modal_column.checklist_type.multiple_options') }} + + + + {{ option.label }} + + + + + + + diff --git a/app/javascript/vue/repository/renderers/date_range_value.vue b/app/javascript/vue/repository/renderers/date_range_value.vue new file mode 100644 index 0000000000..992029ce33 --- /dev/null +++ b/app/javascript/vue/repository/renderers/date_range_value.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/javascript/vue/repository/renderers/date_time_range_value.vue b/app/javascript/vue/repository/renderers/date_time_range_value.vue new file mode 100644 index 0000000000..7b18aa5ebe --- /dev/null +++ b/app/javascript/vue/repository/renderers/date_time_range_value.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/javascript/vue/repository/renderers/date_time_value.vue b/app/javascript/vue/repository/renderers/date_time_value.vue new file mode 100644 index 0000000000..b9c148e2ad --- /dev/null +++ b/app/javascript/vue/repository/renderers/date_time_value.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/javascript/vue/repository/renderers/date_value.vue b/app/javascript/vue/repository/renderers/date_value.vue new file mode 100644 index 0000000000..324549c41d --- /dev/null +++ b/app/javascript/vue/repository/renderers/date_value.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/javascript/vue/repository/renderers/list_value.vue b/app/javascript/vue/repository/renderers/list_value.vue new file mode 100644 index 0000000000..b677553464 --- /dev/null +++ b/app/javascript/vue/repository/renderers/list_value.vue @@ -0,0 +1,51 @@ + + + + + + {{ value.text }} + + + + diff --git a/app/javascript/vue/repository/renderers/number_value.vue b/app/javascript/vue/repository/renderers/number_value.vue new file mode 100644 index 0000000000..268c2feac2 --- /dev/null +++ b/app/javascript/vue/repository/renderers/number_value.vue @@ -0,0 +1,16 @@ + + + {{ params.value.value }} + + + + diff --git a/app/javascript/vue/repository/renderers/renders_mixin.js b/app/javascript/vue/repository/renderers/renders_mixin.js new file mode 100644 index 0000000000..cc59f529e3 --- /dev/null +++ b/app/javascript/vue/repository/renderers/renders_mixin.js @@ -0,0 +1,17 @@ +import { vOnClickOutside } from '@vueuse/components'; + +export default { + props: { + params: { + required: true + } + }, + directives: { + 'click-outside': vOnClickOutside + }, + computed: { + updateUrl() { + return this.params.data.urls.update && !this.params.colDef.readOnly; + } + } +}; diff --git a/app/javascript/vue/repository/renderers/status_value.vue b/app/javascript/vue/repository/renderers/status_value.vue new file mode 100644 index 0000000000..3232eb805b --- /dev/null +++ b/app/javascript/vue/repository/renderers/status_value.vue @@ -0,0 +1,33 @@ + + + + {{ params.value.value.icon }} + {{ params.value.value.status }} + + + + + diff --git a/app/javascript/vue/repository/renderers/stock_value.vue b/app/javascript/vue/repository/renderers/stock_value.vue new file mode 100644 index 0000000000..c1a99b414e --- /dev/null +++ b/app/javascript/vue/repository/renderers/stock_value.vue @@ -0,0 +1,16 @@ + + + {{ params.value.value?.stock_formatted }} + + + + diff --git a/app/javascript/vue/repository/renderers/text_value.vue b/app/javascript/vue/repository/renderers/text_value.vue new file mode 100644 index 0000000000..b1e3eaf383 --- /dev/null +++ b/app/javascript/vue/repository/renderers/text_value.vue @@ -0,0 +1,85 @@ + + + + + + + + + + diff --git a/app/javascript/vue/repository/renderers/time_range_value.vue b/app/javascript/vue/repository/renderers/time_range_value.vue new file mode 100644 index 0000000000..6c1165e7c8 --- /dev/null +++ b/app/javascript/vue/repository/renderers/time_range_value.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/javascript/vue/repository/renderers/time_value.vue b/app/javascript/vue/repository/renderers/time_value.vue new file mode 100644 index 0000000000..6d7d6ae4d7 --- /dev/null +++ b/app/javascript/vue/repository/renderers/time_value.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/javascript/vue/repository/shared/date_time.vue b/app/javascript/vue/repository/shared/date_time.vue new file mode 100644 index 0000000000..ac2eefad04 --- /dev/null +++ b/app/javascript/vue/repository/shared/date_time.vue @@ -0,0 +1,28 @@ + + + + {{ params.value.value.start_time.formatted }} + - + {{ params.value.value.end_time.formatted }} + + + {{ params.value.value.formatted }} + + + + + diff --git a/app/javascript/vue/repository/table.vue b/app/javascript/vue/repository/table.vue new file mode 100644 index 0000000000..81dc3464ca --- /dev/null +++ b/app/javascript/vue/repository/table.vue @@ -0,0 +1,219 @@ + + + + + + + diff --git a/app/javascript/vue/shared/datatable/table.vue b/app/javascript/vue/shared/datatable/table.vue index 4c7697200e..3fd45287aa 100644 --- a/app/javascript/vue/shared/datatable/table.vue +++ b/app/javascript/vue/shared/datatable/table.vue @@ -5,6 +5,7 @@ :class="{'overflow-y-hidden pb-20': currentViewRender === 'cards'}" > `e2e-TB-row-${params.data.code || params.data.id}` }; }, diff --git a/app/javascript/vue/shared/select_dropdown.vue b/app/javascript/vue/shared/select_dropdown.vue index 2335eac527..15d6661a20 100644 --- a/app/javascript/vue/shared/select_dropdown.vue +++ b/app/javascript/vue/shared/select_dropdown.vue @@ -48,7 +48,7 @@ - @@ -144,13 +144,13 @@ export default { sizeClass() { switch (this.size) { case 'xs': - return 'min-h-[36px]'; + return 'h-[36px]'; case 'sm': - return 'min-h-[40px]'; + return 'h-[40px]'; case 'md': - return 'min-h-[44px]'; + return 'h-[44px]'; default: - return 'min-h-[44px]'; + return 'h-[44px]'; } }, canClear() { diff --git a/app/serializers/lists/repository_row_serializer.rb b/app/serializers/lists/repository_row_serializer.rb new file mode 100644 index 0000000000..7d3f937618 --- /dev/null +++ b/app/serializers/lists/repository_row_serializer.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true + +class Lists::RepositoryRowSerializer < ActiveModel::Serializer + include Rails.application.routes.url_helpers + include Canaid::Helpers::PermissionsHelper + + attributes :id, :name, :code + + attribute :assigned do + { + tasks: object.assigned_my_modules_count, + experiments: object.assigned_experiments_count, + projects: object.assigned_projects_count, + task_list_url: assigned_task_list_repository_repository_row_path(object.repository, object) + } + end + + attribute :connections do + "#{object.parent_connections_count || 0} / #{object.child_connections_count || 0}" + end + + attribute :created_at do + I18n.l(object.created_at, format: :full) + end + + attribute :created_by do + object.created_by.full_name + end + + attribute :archived_on do + object.archived_on ? I18n.l(object.archived_on, format: :full) : '' + end + + attribute :archived_by do + object.archived_by&.full_name + end + + attribute :urls do + urls_list = {} + if can_manage_repository_rows?(object.repository) + urls_list[:update] = update_cell_repository_repository_row_path(object.repository, object) + end + urls_list + end + + def attributes(_options = {}) + data = super + repository = object.repository + team = repository.team + reminders_enabled = Repository.reminders_enabled? + has_stock_management = repository.has_stock_management? + stock_managable = has_stock_management && + can_manage_repository_stock?(repository) + custom_cells = object.repository_cells.filter { |cell| cell.value_type != 'RepositoryStockValue' } + + custom_cells.each do |cell| + serializer_class = "RepositoryDatatable::#{cell.repository_column.data_type}Serializer".constantize + data["col_#{cell.repository_column.id}"] = serializer_class.new( + cell.value, + scope: { + team: team, + user: current_user, + column: cell.repository_column, + repository: repository, + options: {reminders_enabled: reminders_enabled} + } + ).serializable_hash + end + + if has_stock_management + stock_cell = object.repository_cells.find { |cell| cell.value_type == 'RepositoryStockValue' } + stock_column = repository.repository_columns.find_by(data_type: 'RepositoryStockValue') + col_key = 'col_' + stock_column.id.to_s + data[col_key] = if stock_cell.present? + RepositoryDatatable::RepositoryStockValueSerializer.new( + stock_cell.value, + scope: { + team: team, + user: current_user, + column: stock_cell.repository_column, + repository: repository, + options: {reminders_enabled: reminders_enabled} + } + ).serializable_hash + else + { stock_url: new_repository_stock_repository_repository_row_url(repository, object) } + end + data[col_key][:stock_managable] = stock_managable && object.active? + data[col_key][:display_warnings] = display_stock_warnings?(repository) + data[col_key][:stock_status] = stock_cell&.value&.status + data[col_key][:value_type] = 'RepositoryStockValue' + end + + data + end + + private + + def display_stock_warnings?(repository) + !repository.is_a?(RepositorySnapshot) + end + + def stock_consumption_managable?(record, repository, my_module) + return false unless my_module + return false if repository.archived? || record.archived? + + true + end +end diff --git a/app/serializers/repository_column_serializer.rb b/app/serializers/repository_column_serializer.rb index 9427f026e4..201b784fd6 100644 --- a/app/serializers/repository_column_serializer.rb +++ b/app/serializers/repository_column_serializer.rb @@ -4,7 +4,19 @@ class RepositoryColumnSerializer < ActiveModel::Serializer include Rails.application.routes.url_helpers include InputSanitizeHelper - attributes :message + attributes :message, :name, :data_type, :metadata, :column_items + + def column_items + if object.data_type == 'RepositoryListValue' + object.repository_list_items.map do |item| + { id: item.id, label: item.data } + end + elsif object.data_type == 'RepositoryChecklistValue' + object.repository_checklist_items.map do |item| + { id: item.id, label: item.data } + end + end + end def message if instance_options[:creating] diff --git a/app/serializers/repository_datatable/repository_text_value_serializer.rb b/app/serializers/repository_datatable/repository_text_value_serializer.rb index f1d174f5a1..59fe99eded 100644 --- a/app/serializers/repository_datatable/repository_text_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_text_value_serializer.rb @@ -9,7 +9,7 @@ class RepositoryTextValueSerializer < RepositoryBaseValueSerializer def value @user = scope[:user] { - view: custom_auto_link(value_object.data, simple_format: true, team: scope[:team]), + view: custom_auto_link(value_object.data, simple_format: false, team: scope[:team]), edit: value_object.data } end diff --git a/app/services/lists/repository_rows_service.rb b/app/services/lists/repository_rows_service.rb new file mode 100644 index 0000000000..721fcc5c1e --- /dev/null +++ b/app/services/lists/repository_rows_service.rb @@ -0,0 +1,545 @@ +# frozen_string_literal: true + +module Lists + class RepositoryRowsService + include MyModulesHelper + attr_reader :repository_rows, :all_count, :mappings + + PREDEFINED_COLUMNS = %w(row_id row_name added_on added_by archived_on archived_by assigned relationships).freeze + + def initialize(repository, params, user, my_module = nil) + @repository = repository + @user = user + @my_module = my_module + @params = params + @assigned_view = @params[:assigned].in?(%w(assigned assigned_simple)) + #@sortable_columns = build_sortable_columns + #create_columns_mappings + @repository_rows = process_query + end + + def call + paginate_records + @repository_rows + end + + private + + def paginate_records + @repository_rows = @repository_rows.page(@params[:page]).per(@params[:per_page]) + end + + def create_columns_mappings + # Make mappings of custom columns, so we have same id for every + # column + #index = @repository.default_columns_count + #@mappings = {} + #@repository.repository_columns.order(:id).each do |column| + # @mappings[column.id] = index.to_s + # index += 1 + #end + end + + def process_query + # search_value = @params[:search][:value] + # order_params = @params[:order].first + + # order_by_column = { column: order_params[:column].to_i, dir: order_params[:dir] } + + repository_rows = fetch_rows + + # filter only rows with reminders if filter param is present + # repository_rows = repository_rows.with_active_reminders(@user) if @params[:only_reminders] + + # Aliased my_module_repository_rows join for consistent assigned counts + repository_rows = + repository_rows.joins( + 'LEFT OUTER JOIN "my_module_repository_rows" AS "all_my_module_repository_rows" ON '\ + '"all_my_module_repository_rows"."repository_row_id" = "repository_rows"."id"' + ) + + # Adding assigned counters + if @my_module + if @assigned_view + repository_rows = repository_rows.joins(:my_module_repository_rows) + .where(my_module_repository_rows: { my_module_id: @my_module }) + if @repository.has_stock_management? + repository_rows = repository_rows + .select('SUM(DISTINCT my_module_repository_rows.stock_consumption) AS "consumed_stock"') + end + else + repository_rows = repository_rows + .joins(:repository) + .joins('LEFT OUTER JOIN "my_module_repository_rows" "current_my_module_repository_rows"'\ + 'ON "current_my_module_repository_rows"."repository_row_id" = "repository_rows"."id" '\ + 'AND "current_my_module_repository_rows"."my_module_id" = ' + @my_module.id.to_s) + .where('current_my_module_repository_rows.id IS NOT NULL '\ + 'OR (repository_rows.archived = FALSE AND repositories.archived = FALSE)') + .select('CASE WHEN current_my_module_repository_rows.id IS NOT NULL '\ + 'THEN true ELSE false END as row_assigned') + .group('current_my_module_repository_rows.id') + end + end + repository_rows = repository_rows + .left_outer_joins(my_module_repository_rows: { my_module: :experiment }) + .select('COUNT(DISTINCT all_my_module_repository_rows.id) AS "assigned_my_modules_count"') + .select('COUNT(DISTINCT my_modules.experiment_id) AS "assigned_experiments_count"') + .select('COUNT(DISTINCT experiments.project_id) AS "assigned_projects_count"') + .select('COALESCE(parent_connections_count, 0) + COALESCE(child_connections_count, 0) + AS "relationships_count"') + repository_rows = repository_rows.preload(Extends::REPOSITORY_ROWS_PRELOAD_RELATIONS) + + # sort_rows(order_by_column, repository_rows) + repository_rows + end + + def fetch_rows(search_value = nil) + repository_rows = @repository.repository_rows + if @params[:view_mode] && !@repository.archived? + repository_rows = repository_rows.where(archived: @params[:view_mode] == 'archived') + end + + @all_count = if @my_module && @assigned_view + repository_rows.joins(:my_module_repository_rows) + .where(my_module_repository_rows: { my_module_id: @my_module }) + .count + else + repository_rows.count + end + + + repository_rows = repository_rows.where(external_id: @params[:external_ids]) if @params[:external_ids] + + # if search_value.present? + # if @repository.default_search_fileds.include?('users.full_name') + # repository_rows = repository_rows.joins(:created_by) + # end + # repository_row_matches = repository_rows.where_attributes_like(@repository.default_search_fileds, search_value) + # results = repository_rows.where(id: repository_row_matches) + + # data_types = @repository.repository_columns.pluck(:data_type).uniq + + # Extends::REPOSITORY_EXTRA_SEARCH_ATTR.each do |data_type, config| + # next unless data_types.include?(data_type.to_s) + + # custom_cell_matches = repository_rows.joins(config[:includes]) + # .where_attributes_like(config[:field], search_value) + # results = results.or(repository_rows.where(id: custom_cell_matches)) + # end + + # repository_rows = results + # end + + # repository_rows = repository_rows.where(id: advanced_search(repository_rows)) if @params[:advanced_search].present? + + repository_rows.left_outer_joins(:created_by, :archived_by) + .select('repository_rows.*') + .select('COUNT("repository_rows"."id") OVER() AS filtered_count') + .group('repository_rows.id') + end + + # def advanced_search(repository_rows) + # adv_search_params = @params[:advanced_search] + # filter = @repository.repository_table_filters.new + # adv_search_params[:filter_elements].each_with_index do |filter_element_params, index| + # repository_rows = + # if PREDEFINED_COLUMNS.include?(filter_element_params[:repository_column_id]) + # add_predefined_column_filter_condition(repository_rows, filter_element_params) + # else + # add_custom_column_filter_condition(repository_rows, filter, index, filter_element_params) + # end + # end + + # repository_rows + # end + + # def add_predefined_column_filter_condition(repository_rows, filter_element_params) + # case filter_element_params[:repository_column_id] + # when 'row_id' + # build_row_id_filter_condition(repository_rows, filter_element_params) + # when 'row_name' + # build_name_filter_condition(repository_rows, filter_element_params) + # when 'relationships' + # build_relationship_filter_condition(repository_rows, filter_element_params) + # when 'added_on' + # build_added_on_filter_condition(repository_rows, filter_element_params) + # when 'added_by' + # build_added_by_filter_condition(repository_rows, filter_element_params) + # when 'archived_by' + # build_archived_by_filter_condition(repository_rows, filter_element_params) + # when 'archived_on' + # build_archived_on_filter_condition(repository_rows, filter_element_params) + # when 'assigned' + # build_assigned_filter_condition(repository_rows, filter_element_params) + # else + # repository_rows + # end + # end + + # def build_row_id_filter_condition(repository_rows, filter_element_params) + # return repository_rows if filter_element_params.dig(:parameters, :text).blank? + + # case filter_element_params[:operator] + # when 'contains' + # repository_rows + # .where("(#{RepositoryRow::PREFIXED_ID_SQL})::text ILIKE ?", + # "%#{ActiveRecord::Base.sanitize_sql_like(filter_element_params.dig(:parameters, :text))}%") + # when 'doesnt_contain' + # repository_rows + # .where.not("(#{RepositoryRow::PREFIXED_ID_SQL})::text ILIKE ?", + # "%#{ActiveRecord::Base.sanitize_sql_like(filter_element_params.dig(:parameters, :text))}%") + # else + # raise ArgumentError, 'Wrong operator for RepositoryRow ID!' + # end + # end + + # def build_name_filter_condition(repository_rows, filter_element_params) + # return repository_rows if filter_element_params.dig(:parameters, :text).blank? + + # case filter_element_params[:operator] + # when 'contains' + # repository_rows.where('repository_rows.name ILIKE ?', + # "%#{ActiveRecord::Base.sanitize_sql_like(filter_element_params.dig(:parameters, :text))}%") + # when 'doesnt_contain' + # repository_rows + # .where.not('repository_rows.name ILIKE ?', + # "%#{ActiveRecord::Base.sanitize_sql_like(filter_element_params.dig(:parameters, :text))}%") + # else + # raise ArgumentError, 'Wrong operator for RepositoryRow Name!' + # end + # end + + # def build_relationship_filter_condition(repository_rows, filter_element_params) + # case filter_element_params[:operator] + # when 'contains' + # text = "%#{ActiveRecord::Base.sanitize_sql_like(filter_element_params.dig(:parameters, :text))}%" + + # repository_rows.where( + # id: repository_rows.left_outer_joins(:parent_repository_rows, :child_repository_rows) + # .where("trim_html_tags(child_repository_rows_repository_rows.name)::text ILIKE ? OR + # trim_html_tags(parent_repository_rows_repository_rows.name)::text ILIKE ? OR + # ('#{RepositoryRow::ID_PREFIX}' || + # child_repository_rows_repository_rows.id)::text ILIKE ? OR + # ('#{RepositoryRow::ID_PREFIX}' || + # parent_repository_rows_repository_rows.id)::text ILIKE ?", + # text, text, text, text).select(:id) + # ) + # when 'contains_relationship' + # repository_rows = repository_rows.left_outer_joins(:parent_connections, :child_connections) + # repository_rows.where.not(parent_connections: { id: nil }) + # .or(repository_rows.where.not(child_connections: { id: nil })) + # when 'doesnt_contain_relationship' + # repository_rows.where.missing(:parent_connections, :child_connections) + # else + # raise ArgumentError, 'Wrong operator for RepositoryRow Relationship!' + # end + # end + + # def build_added_on_filter_condition(repository_rows, filter_element_params) + # case filter_element_params[:operator] + # when 'today' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"created_at\") >= ? AND " \ + # "date_trunc('minute', \"repository_rows\".\"created_at\") < ?", + # Time.zone.now.beginning_of_day, + # Time.zone.now.end_of_day + # ) + # when 'yesterday' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"created_at\") >= ? AND "\ + # "date_trunc('minute', \"repository_rows\".\"created_at\") < ?", + # Time.zone.now.beginning_of_day - 1.day, Time.zone.now.beginning_of_day + # ) + # when 'last_week' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"created_at\") >= ? AND "\ + # "date_trunc('minute', \"repository_rows\".\"created_at\") < ?", + # Time.zone.now.beginning_of_week - 1.week, Time.zone.now.beginning_of_week + # ) + # when 'this_month' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"created_at\") >= ? AND date_trunc('minute', \"repository_rows\".\"created_at\") <= ?", + # Time.zone.now.beginning_of_month, + # Time.zone.now.end_of_month + # ) + # when 'last_year' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"created_at\") >= ? AND "\ + # "date_trunc('minute', \"repository_rows\".\"created_at\") < ?", + # Time.zone.now.beginning_of_year - 1.year, Time.zone.now.beginning_of_year + # ) + # when 'this_year' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"created_at\") >= ? AND "\ + # "date_trunc('minute', \"repository_rows\".\"created_at\") <= ?", + # Time.zone.now.beginning_of_year, + # Time.zone.now.end_of_year + # ) + # when 'equal_to' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"created_at\") = ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'unequal_to' + # repository_rows.where.not("date_trunc('minute', \"repository_rows\".\"created_at\") = ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'greater_than' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"created_at\") > ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'greater_than_or_equal_to' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"created_at\") >= ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'less_than' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"created_at\") < ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'less_than_or_equal_to' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"created_at\") <= ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'between' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"created_at\") > ? AND "\ + # "date_trunc('minute', \"repository_rows\".\"created_at\") < ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :start_datetime)), + # Time.zone.parse(filter_element_params.dig(:parameters, :end_datetime)) + # ) + # else + # raise ArgumentError, 'Wrong operator for RepositoryRow Added On!' + # end + # end + + # def build_archived_on_filter_condition(repository_rows, filter_element_params) + # return repository_rows unless @params[:archived] + + # case filter_element_params[:operator] + # when 'today' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") >= ? AND date_trunc('minute', \"repository_rows\".\"archived_on\") <= ?", + # Time.zone.now.beginning_of_day, Time.zone.now.end_of_day) + # when 'yesterday' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") >= ? AND date_trunc('minute', \"repository_rows\".\"archived_on\") < ?", + # Time.zone.now.beginning_of_day - 1.day, Time.zone.now.beginning_of_day) + # when 'last_week' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") >= ? AND date_trunc('minute', \"repository_rows\".\"archived_on\") < ?", + # Time.zone.now.beginning_of_week - 1.week, Time.zone.now.beginning_of_week) + # when 'this_month' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"archived_on\") >= ? AND date_trunc('minute', \"repository_rows\".\"archived_on\") <= ?", + # Time.zone.now.beginning_of_month, + # Time.zone.now.end_of_month + # ) + # when 'last_year' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") >= ? AND date_trunc('minute', \"repository_rows\".\"archived_on\") < ?", + # Time.zone.now.beginning_of_year - 1.year, Time.zone.now.beginning_of_year) + # when 'this_year' + # repository_rows.where( + # "date_trunc('minute', \"repository_rows\".\"archived_on\") >= ? AND "\ + # "date_trunc('minute', \"repository_rows\".\"archived_on\") <= ?", + # Time.zone.now.beginning_of_year, + # Time.zone.now.end_of_year + # ) + # when 'equal_to' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") = ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'unequal_to' + # repository_rows.where.not("date_trunc('minute', \"repository_rows\".\"archived_on\") = ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'greater_than' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") > ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'greater_than_or_equal_to' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") >= ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'less_than' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") < ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'less_than_or_equal_to' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") <= ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :datetime))) + # when 'between' + # repository_rows.where("date_trunc('minute', \"repository_rows\".\"archived_on\") > ? AND date_trunc('minute', \"repository_rows\".\"archived_on\") < ?", + # Time.zone.parse(filter_element_params.dig(:parameters, :start_datetime)), + # Time.zone.parse(filter_element_params.dig(:parameters, :end_datetime))) + # else + # raise ArgumentError, 'Wrong operator for RepositoryRow Archived On!' + # end + # end + + # def build_added_by_filter_condition(repository_rows, filter_element_params) + # case filter_element_params[:operator] + # when 'any_of' + # repository_rows.joins(:created_by) + # .where(created_by: { id: filter_element_params.dig(:parameters, :user_ids) }) + # when 'none_of' + # repository_rows.joins(:created_by) + # .where.not(created_by: { id: filter_element_params.dig(:parameters, :user_ids) }) + # else + # raise ArgumentError, 'Wrong operator for RepositoryRow Added By!' + # end + # end + + # def build_archived_by_filter_condition(repository_rows, filter_element_params) + # return repository_rows unless @params[:archived] + + # case filter_element_params[:operator] + # when 'any_of' + # repository_rows.joins(:archived_by) + # .where(archived_by: { id: filter_element_params.dig(:parameters, :user_ids) }) + # when 'none_of' + # repository_rows.joins(:archived_by) + # .where.not(archived_by: { id: filter_element_params.dig(:parameters, :user_ids) }) + # else + # raise ArgumentError, 'Wrong operator for RepositoryRow Archived By!' + # end + # end + + # def build_assigned_filter_condition(repository_rows, filter_element_params) + # return repository_rows if filter_element_params.dig(:parameters, :my_module_ids).blank? + + # case filter_element_params[:operator] + # when 'any_of' + # repository_rows.joins(:my_modules) + # .where(my_modules: { id: filter_element_params.dig(:parameters, :my_module_ids) }) + # when 'none_of' + # repository_rows.where('NOT EXISTS (SELECT NULL FROM my_module_repository_rows + # WHERE my_module_repository_rows.repository_row_id = repository_rows.id AND + # my_module_repository_rows.my_module_id IN (?))', filter_element_params.dig(:parameters, :my_module_ids)) + # when 'all_of' + # repository_rows + # .joins(:my_modules) + # .where(my_modules: { id: filter_element_params.dig(:parameters, :my_module_ids) }) + # .having('COUNT(my_modules.id) = ?', filter_element_params.dig(:parameters, :my_module_ids).count) + # .group(:id) + # else + # raise ArgumentError, 'Wrong operator for RepositoryRow Assigned To!' + # end + # end + + # def add_custom_column_filter_condition(repository_rows, filter, index, filter_element_params) + # repository_column = @repository.repository_columns.find_by(id: filter_element_params['repository_column_id']) + # raise RepositoryFilters::ColumnNotFoundException unless repository_column + + # filter_element = filter.repository_table_filter_elements.new( + # repository_column: repository_column, + # operator: filter_element_params[:operator], + # parameters: filter_element_params[:parameters] + # ) + # config = Extends::REPOSITORY_ADVANCED_SEARCH_ATTR[filter_element.repository_column.data_type.to_sym] + # join_cells_alias = "repository_cells_#{index}" + # join_values_alias = "repository_values_#{index}" + + # enforce_referenced_value_existence!(filter_element) + + # repository_rows = + # repository_rows + # .joins( + # "LEFT OUTER JOIN \"repository_cells\" AS \"#{join_cells_alias}\"" \ + # " ON \"repository_rows\".\"id\" = \"#{join_cells_alias}\".\"repository_row_id\"" \ + # " AND \"#{join_cells_alias}\".\"repository_column_id\" = '#{filter_element.repository_column.id}'" + # ).joins( + # "LEFT OUTER JOIN \"#{config[:table_name]}\" AS \"#{join_values_alias}\"" \ + # " ON \"#{join_values_alias}\".\"id\" = \"#{join_cells_alias}\".\"value_id\"" + # ) + + # if %w(empty file_not_attached).include?(filter_element_params[:operator]) + # repository_rows.where(join_values_alias => { id: nil }) + # else + # value_klass = filter_element.repository_column.data_type.constantize + # value_klass.add_filter_condition(repository_rows, join_values_alias, filter_element) + # end + # end + + # def enforce_referenced_value_existence!(filter_element) + # relation_method = + # Extends::REPOSITORY_ADVANCED_SEARCH_REFERENCED_VALUE_RELATIONS[ + # filter_element.repository_column.data_type.to_sym + # ] + + # return unless relation_method + + # relation = filter_element.repository_column.public_send(relation_method) + # value_item_ids = filter_element.parameters['item_ids'] + # raise RepositoryFilters::ValueNotFoundException if relation.where(id: value_item_ids).count != value_item_ids.length + # end + + # def build_sortable_columns + # array = @repository.default_sortable_columns + # @repository.repository_columns.count.times do + # array << 'repository_cell.value' + # end + + # array << 'consumed_stock' if @repository.has_stock_management? && @assigned_view + # array + # end + + # def map_simple_view_column(index) + # return assigned_repository_simple_view_name_column_id(@repository) unless @repository.has_stock_management? + + # case index + # when 0 + # assigned_repository_simple_view_name_column_id(@repository) + # when 1 + # @mappings[@repository.repository_stock_column.id] + # when 2 + # @sortable_columns.length + # end + # end + + # def sort_rows(column_obj, records) + # dir = %w(DESC ASC).find do |direction| + # direction == column_obj[:dir].upcase + # end || 'ASC' + + # column_index = column_obj[:column] + # service = RepositoryTableStateService.new(@user, @repository) + # col_order = service.load_state.state['ColReorder'] + # column_id = case @params[:assigned] + # when 'assigned_simple' + # map_simple_view_column(column_index).to_i + # else + # @params[:draw].to_i == 1 ? column_index.to_i : col_order[column_index].to_i + # end + + # case @sortable_columns[column_id - 1] + # when 'assigned' + # return records if @my_module && @assigned_view + + # records.order("assigned_my_modules_count #{dir}") + # when 'repository_cell.value' + # id = @mappings.key(column_id.to_s) + # sorting_column = @repository.repository_columns.find_by(id: id) + # return records unless sorting_column + + # sorting_data_type = sorting_column.data_type.constantize + # cells = sorting_data_type.joins( + # "INNER JOIN repository_cells AS repository_sort_cells "\ + # "ON repository_sort_cells.value_id = #{sorting_data_type.table_name}.id "\ + # "AND repository_sort_cells.value_type = '#{sorting_data_type.base_class.name}'" + # ).where('repository_sort_cells.repository_column_id': sorting_column.id) + + # if sorting_data_type.const_defined?('EXTRA_SORTABLE_VALUE_INCLUDE') + # cells = cells.joins(sorting_data_type::EXTRA_SORTABLE_VALUE_INCLUDE) + # end + + # cells = if sorting_column.repository_checklist_value? + # cells + # .select("repository_sort_cells.repository_row_id, \ + # STRING_AGG(#{sorting_data_type::SORTABLE_COLUMN_NAME}, ' ' \ + # ORDER BY #{sorting_data_type::SORTABLE_COLUMN_NAME}) AS value") + # .group('repository_sort_cells.repository_row_id') + # else + # cells + # .select("repository_sort_cells.repository_row_id, #{sorting_data_type::SORTABLE_COLUMN_NAME} AS value") + # end + + # records.joins("LEFT OUTER JOIN (#{cells.to_sql}) AS values ON values.repository_row_id = repository_rows.id") + # .group('values.value') + # .order("values.value #{dir}") + # when 'users.full_name' + # records.group('users.full_name').order("users.full_name #{dir}") + # when 'consumed_stock' + # records.order("#{@sortable_columns[column_id - 1]} #{dir}") + # when 'relationships' + # records.order("relationships_count #{dir}") + # else + # records.group(@sortable_columns[column_id - 1]).order("#{@sortable_columns[column_id - 1]} #{dir}") + # end + # end + end +end diff --git a/app/services/toolbars/repository_rows_service.rb b/app/services/toolbars/repository_rows_service.rb index ad09247276..7e52c234cf 100644 --- a/app/services/toolbars/repository_rows_service.rb +++ b/app/services/toolbars/repository_rows_service.rb @@ -50,9 +50,7 @@ def restore_action name: 'restore', label: I18n.t('repositories.restore_record'), icon: 'sn-icon sn-icon-restore', - button_class: 'resotre-repository-row-btn', - button_id: 'restoreRepositoryRecords', - type: :legacy + type: :emit } end @@ -65,9 +63,7 @@ def edit_action name: 'edit', label: I18n.t('repositories.edit_record'), icon: 'sn-icon sn-icon-edit', - button_class: 'edit-repository-row-btn', - button_id: 'editRepositoryRecord', - type: :legacy + type: :emit } end @@ -80,9 +76,7 @@ def assign_action name: 'assign', label: I18n.t('repositories.assign_record'), icon: 'sn-icon sn-icon-assign-to-task', - button_class: 'assign-repository-rows-btn', - button_id: 'assignRepositoryRecords', - type: :legacy + type: :emit } end @@ -95,9 +89,7 @@ def duplicate_action name: 'duplicate', label: I18n.t('repositories.copy_record'), icon: 'sn-icon sn-icon-duplicate', - button_class: 'copy-repository-row-btn', - button_id: 'copyRepositoryRecords', - type: :legacy + type: :emit } end @@ -108,9 +100,7 @@ def export_items_action name: 'export_records', label: I18n.t('repositories.exports.records'), icon: 'sn-icon sn-icon-export', - button_class: 'export-repository-row-btn', - button_id: 'exportRepositoryRowsButton', - type: :legacy + type: :emit } end @@ -121,10 +111,8 @@ def export_consumption_action name: 'export_consumption', label: I18n.t('repositories.exports.stock_consumption'), icon: 'sn-icon sn-icon-reports', - button_class: 'export-consumption-button', - button_id: 'exportStockConsumptionButton', item_id: @repository.id, - type: :legacy + type: :emit } end @@ -144,9 +132,7 @@ def print_label_action name: 'print_label', label: I18n.t('repositories.print_label'), icon: 'sn-icon sn-icon-printer', - button_class: 'print-label-button', - button_id: 'toolbarPrintLabel', - type: :legacy + type: :emit } end @@ -159,9 +145,7 @@ def archive_action name: 'archive', label: I18n.t('repositories.archive_record'), icon: 'sn-icon sn-icon-archive', - button_class: 'resotre-repository-row-btn', - button_id: 'archiveRepositoryRecordsButton', - type: :legacy + type: :emit } end @@ -174,9 +158,7 @@ def delete_action name: 'delete', label: I18n.t('repositories.delete_record'), icon: 'sn-icon sn-icon-delete', - button_class: 'resotre-repository-row-btn', - button_id: 'deleteRepositoryRecords', - type: :legacy + type: :emit } end end diff --git a/app/views/my_modules/repositories/_full_view_modal.html.erb b/app/views/my_modules/repositories/_full_view_modal.html.erb index 2a898a4b3c..545183d670 100644 --- a/app/views/my_modules/repositories/_full_view_modal.html.erb +++ b/app/views/my_modules/repositories/_full_view_modal.html.erb @@ -18,20 +18,6 @@ - - - - - - <%= t('my_modules.repository.snapshots.full_view.versions_sidebar_button') %> - - - - <%= t('my_modules.repository.snapshots.full_view.export_button') %> - - - - diff --git a/app/views/my_modules/repositories/_full_view_table.html.erb b/app/views/my_modules/repositories/_full_view_table.html.erb index 9d435494f4..3f2cf8adac 100644 --- a/app/views/my_modules/repositories/_full_view_table.html.erb +++ b/app/views/my_modules/repositories/_full_view_table.html.erb @@ -1,3 +1,20 @@ + + + + + + + + diff --git a/app/views/my_modules/repositories/_repositories_list.html.erb b/app/views/my_modules/repositories/_repositories_list.html.erb index cb6d3c2039..560fec7cad 100644 --- a/app/views/my_modules/repositories/_repositories_list.html.erb +++ b/app/views/my_modules/repositories/_repositories_list.html.erb @@ -16,17 +16,30 @@ <% end %> - + - + + + + + <%= render 'shared/dialog', id: "snapshot-error-#{repository.id}", @@ -55,3 +69,5 @@ %> <% end %> + +<%= javascript_include_tag 'vue_repository_table' %> diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 53c02ff6f6..6ff373e025 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -62,6 +62,21 @@ + + + + + + <%= javascript_include_tag 'vue_repository_table' %> <%= render partial: 'repositories/import_repository_records_modal', diff --git a/config/initializers/extends.rb b/config/initializers/extends.rb index 5604e3274b..ca5235b5a0 100644 --- a/config/initializers/extends.rb +++ b/config/initializers/extends.rb @@ -647,6 +647,8 @@ class Extends ReportTemplates_archived_state Repositories_active_state Repositories_archived_state + Repository_active_state + Repository_archived_state ).freeze end diff --git a/config/routes.rb b/config/routes.rb index 0d24122b4f..0e1e3cdf30 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -466,7 +466,7 @@ resources :repositories, controller: :my_module_repositories, only: %i(update create) do member do get :full_view_table - post :index_dt, defaults: { format: 'json' } + get :index_dt, defaults: { format: 'json' } post :export_repository get :assign_repository_records_modal, as: :assign_modal get :update_repository_records_modal, as: :update_modal @@ -719,6 +719,7 @@ resources :repository_columns, only: %i(index new edit destroy) do collection do + get :index_new get :describe_all end end @@ -732,6 +733,7 @@ end collection do + get :index_new get :actions_toolbar end diff --git a/config/webpack/webpack.config.js b/config/webpack/webpack.config.js index 593146faeb..5273d73404 100644 --- a/config/webpack/webpack.config.js +++ b/config/webpack/webpack.config.js @@ -55,6 +55,7 @@ const entryList = { vue_design_system_select: './app/javascript/packs/vue/design_system/select.js', vue_protocols_list: './app/javascript/packs/vue/protocols_list.js', vue_repositories_table: './app/javascript/packs/vue/repositories_table.js', + vue_repository_table: './app/javascript/packs/vue/repository_table.js', vue_reports_table: './app/javascript/packs/vue/reports_table.js', vue_open_locally_menu: './app/javascript/packs/vue/open_locally_menu.js', vue_scinote_edit_download: './app/javascript/packs/vue/scinote_edit_download.js',