From 9c6dac339e4343623028758f729bed8267df545e Mon Sep 17 00:00:00 2001 From: sboursen-scinote Date: Tue, 26 Mar 2024 16:42:36 +0100 Subject: [PATCH 1/4] Implement global search results component for Protocol templates [SCI-10477] --- app/controllers/search_controller.rb | 20 +++++++- .../vue/global_search/groups/protocols.vue | 46 ++++++++++++++++++- .../global_search/protocol_serializer.rb | 35 ++++++++++++++ config/locales/en.yml | 2 + 4 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 app/serializers/global_search/protocol_serializer.rb diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 5b55c1536..7ba3e1e47 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -13,10 +13,10 @@ class SearchController < ApplicationController case params[:group] when 'projects' - @project_search_count = fetch_cached_count Project + @project_search_count = fetch_cached_count(Project) search_projects if params[:preview] == 'true' - results = @project_results.limit(4) + results = @project_results&.limit(4) || [] else results = @project_results.page(params[:page]).per(Constants::SEARCH_LIMIT) end @@ -28,6 +28,22 @@ class SearchController < ApplicationController next_page: (results.next_page if results.respond_to?(:next_page)), } return + when 'protocols' + @protocol_search_count = fetch_cached_count(Protocol) + search_protocols + results = if params[:preview] == 'true' + @protocol_results&.limit(4) || [] + else + @protocol_results.page(params[:page]).per(Constants::SEARCH_LIMIT) + end + + render json: results, + each_serializer: GlobalSearch::ProtocolSerializer, + meta: { + total: @search_count, + next_page: (results.next_page if results.respond_to?(:next_page)), + } + return end #@search_id = params[:search_id] ? params[:search_id] : generate_search_id diff --git a/app/javascript/vue/global_search/groups/protocols.vue b/app/javascript/vue/global_search/groups/protocols.vue index 8055dc1de..6b6d8dc43 100644 --- a/app/javascript/vue/global_search/groups/protocols.vue +++ b/app/javascript/vue/global_search/groups/protocols.vue @@ -3,12 +3,56 @@

{{ i18n.t('search.index.protocol_templates') }} + [{{ total }}]

+
+
+ +
+
+ +
+
diff --git a/app/serializers/global_search/protocol_serializer.rb b/app/serializers/global_search/protocol_serializer.rb new file mode 100644 index 000000000..feac6d3fd --- /dev/null +++ b/app/serializers/global_search/protocol_serializer.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module GlobalSearch + class ProtocolSerializer < ActiveModel::Serializer + include Rails.application.routes.url_helpers + + attributes :id, :name, :code, :created_at, :updated_at, :created_by, :team, :archived, :url + + def team + { + name: object.team.name, + url: protocols_path(team: object.team) + } + 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 + protocol_path(object) + end + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 3aa90769e..faf6df1c0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -457,6 +457,8 @@ en: clear_filters: "Clear filters" id: "ID" created_at: "Created on" + created_by: "Created by" + updated_at: "Updated on" team: "Team" folder: "Folder" comments: From 1f7566ae73c423b3636159a354333d2329ab599c Mon Sep 17 00:00:00 2001 From: wandji20 Date: Wed, 27 Mar 2024 11:44:52 +0100 Subject: [PATCH 2/4] Add project folders group to global search page [SCI-10470] --- .../javascripts/sitewide/constants.js.erb | 1 + app/controllers/search_controller.rb | 21 +++++++-- .../vue/global_search/groups/folders.vue | 45 ++++++++++++++++++- .../vue/global_search/groups/projects.vue | 2 +- .../vue/global_search/groups/search_mixin.js | 4 ++ .../project_folder_serializer.rb | 33 ++++++++++++++ config/initializers/constants.rb | 2 + 7 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 app/serializers/global_search/project_folder_serializer.rb diff --git a/app/assets/javascripts/sitewide/constants.js.erb b/app/assets/javascripts/sitewide/constants.js.erb index 6d3eeff90..b88b22bd5 100644 --- a/app/assets/javascripts/sitewide/constants.js.erb +++ b/app/assets/javascripts/sitewide/constants.js.erb @@ -18,4 +18,5 @@ const GLOBAL_CONSTANTS = { SLOW_STATUS_POLLING_INTERVAL: <%= Constants::SLOW_STATUS_POLLING_INTERVAL %>, ASSET_POLLING_INTERVAL: <%= Constants::ASSET_POLLING_INTERVAL %>, ASSET_SYNC_URL: '<%= Constants::ASSET_SYNC_URL %>', + GLOBAL_SEARCH_PREVIEW_LIMIT: <%= Constants::GLOBAL_SEARCH_PREVIEW_LIMIT %> }; diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 7ba3e1e47..a7d8c6cfb 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -21,12 +21,27 @@ class SearchController < ApplicationController results = @project_results.page(params[:page]).per(Constants::SEARCH_LIMIT) end - render json: results, + render json: results.includes(:team, :project_folder), each_serializer: GlobalSearch::ProjectSerializer, meta: { total: @search_count, next_page: (results.next_page if results.respond_to?(:next_page)), } + when 'project_folders' + @project_folder_search_count = fetch_cached_count ProjectFolder + search_project_folders + results = if params[:preview] == 'true' + @project_folder_results.limit(Constants::GLOBAL_SEARCH_PREVIEW_LIMIT) + else + @project_folder_results.page(params[:page]).per(Constants::SEARCH_LIMIT) + end + render json: results.includes(:team, :parent_folder), + each_serializer: GlobalSearch::ProjectFolderSerializer, + meta: { + total: @search_count, + next_page: results.try(:next_page) + } + else return when 'protocols' @protocol_search_count = fetch_cached_count(Protocol) @@ -267,13 +282,13 @@ class SearchController < ApplicationController end def search_projects - @project_results = [] + @project_results = Project.none @project_results = search_by_name(Project) if @project_search_count.positive? @search_count = @project_search_count end def search_project_folders - @project_folder_results = [] + @project_folder_results = ProjectFolder.none @project_folder_results = search_by_name(ProjectFolder) if @project_folder_search_count.positive? @search_count = @project_folder_search_count end diff --git a/app/javascript/vue/global_search/groups/folders.vue b/app/javascript/vue/global_search/groups/folders.vue index 15ea2f7f0..3b1a441c4 100644 --- a/app/javascript/vue/global_search/groups/folders.vue +++ b/app/javascript/vue/global_search/groups/folders.vue @@ -1,14 +1,55 @@ diff --git a/app/javascript/vue/global_search/groups/projects.vue b/app/javascript/vue/global_search/groups/projects.vue index f98dbf54a..e30786e65 100644 --- a/app/javascript/vue/global_search/groups/projects.vue +++ b/app/javascript/vue/global_search/groups/projects.vue @@ -1,5 +1,5 @@