diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index b04412be8..48faa3c95 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -42,6 +42,21 @@ class SearchController < ApplicationController next_page: results.try(:next_page) } return + when 'reports' + @report_search_count = fetch_cached_count Report + search_reports + results = if params[:preview] == 'true' + @report_results.limit(Constants::GLOBAL_SEARCH_PREVIEW_LIMIT) + else + @report_results.page(params[:page]).per(Constants::SEARCH_LIMIT) + end + render json: results.includes(:team, :project, :user), + each_serializer: GlobalSearch::ReportSerializer, + meta: { + total: @search_count, + next_page: results.try(:next_page) + } + return when 'experiments' @experiment_search_count = fetch_cached_count Experiment search_experiments @@ -348,7 +363,7 @@ class SearchController < ApplicationController end def search_reports - @report_results = [] + @report_results = Report.none @report_results = search_by_name(Report) if @report_search_count.positive? @search_count = @report_search_count end diff --git a/app/javascript/vue/global_search/groups/reports.vue b/app/javascript/vue/global_search/groups/reports.vue index a6c72d74a..31485882e 100644 --- a/app/javascript/vue/global_search/groups/reports.vue +++ b/app/javascript/vue/global_search/groups/reports.vue @@ -1,14 +1,66 @@ diff --git a/app/javascript/vue/reports/table.vue b/app/javascript/vue/reports/table.vue index e6472244c..b9bf950f9 100644 --- a/app/javascript/vue/reports/table.vue +++ b/app/javascript/vue/reports/table.vue @@ -48,6 +48,9 @@ import UpdateReportModal from './modals/update.vue'; export default { name: 'ReportsTable', + provide() { + return { initSearchValue: this.initSearchValue }; + }, components: { DataTable, DocxRenderer, @@ -61,6 +64,10 @@ export default { type: String, required: true }, + initSearchValue: { + type: String, + default: '' + }, actionsUrl: { type: String, required: true diff --git a/app/javascript/vue/shared/datatable/table.vue b/app/javascript/vue/shared/datatable/table.vue index 750f7abe5..353f94cfa 100644 --- a/app/javascript/vue/shared/datatable/table.vue +++ b/app/javascript/vue/shared/datatable/table.vue @@ -120,6 +120,7 @@ import RowMenuRenderer from './row_menu_renderer.vue'; export default { name: 'App', + inject: ['initSearchValue'], props: { withCheckboxes: { type: Boolean, @@ -334,6 +335,9 @@ export default { mounted() { this.navigatorCollapsed = document.querySelector('.sci--layout').getAttribute('data-navigator-collapsed') === 'true'; this.setGridColsClass(); + if (this.initSearchValue) { + this.searchValue = this.initSearchValue; + } window.addEventListener('resize', this.resize); }, diff --git a/app/javascript/vue/shared/datatable/toolbar.vue b/app/javascript/vue/shared/datatable/toolbar.vue index 71e7edfd4..96d9089a8 100644 --- a/app/javascript/vue/shared/datatable/toolbar.vue +++ b/app/javascript/vue/shared/datatable/toolbar.vue @@ -174,6 +174,11 @@ export default { type: Object } }, + mounted() { + if (this.searchValue.length > 0) { + this.openSearch(); + } + }, components: { MenuDropdown, FilterDropdown, diff --git a/app/serializers/global_search/report_serializer.rb b/app/serializers/global_search/report_serializer.rb new file mode 100644 index 000000000..3ba4cb59c --- /dev/null +++ b/app/serializers/global_search/report_serializer.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module GlobalSearch + class ReportSerializer < ActiveModel::Serializer + include Rails.application.routes.url_helpers + + attributes :id, :name, :code, :created_at, :updated_at, :created_by, :team, :project, :url + + def team + { + name: object.team.name, + url: projects_path(team: object.team) + } + end + + def project + { + name: object.project.name, + url: project_experiments_path(project_id: object.project.id) + } + end + + def created_by + { + name: object.created_by.name, + avatar_url: avatar_path(object.created_by, :icon_small) + } + end + + def created_at + I18n.l(object.created_at, format: :full_date) + end + + def updated_at + I18n.l(object.updated_at, format: :full_date) + end + + def url + reports_path(search: object.code) + end + end +end diff --git a/app/views/reports/index.html.erb b/app/views/reports/index.html.erb index 149eb3772..925444199 100644 --- a/app/views/reports/index.html.erb +++ b/app/views/reports/index.html.erb @@ -17,6 +17,7 @@ available-columns-url="<%= available_asset_type_columns_path %>" available-rows-url="<%= available_rows_repositories_path %>" data-source="<%= reports_path(format: :json) %>" + init-search-value="<%= params[:search] %>" create-url="<%= new_report_path if can_create_reports?(current_team) %>" />