From a9c668de22950d06fe4dc6ee5ae70f800842c3a1 Mon Sep 17 00:00:00 2001 From: Andrej Date: Thu, 24 Apr 2025 14:42:13 +0200 Subject: [PATCH] Update projects filters [SCI-11796] --- app/controllers/projects_controller.rb | 10 ++++- app/javascript/vue/projects/list.vue | 40 +++++++++++++++++-- .../vue/projects/renderers/status.vue | 11 +---- app/services/lists/projects_service.rb | 29 +++++++++++--- app/views/projects/index.html.erb | 1 + config/locales/en.yml | 6 +++ config/routes.rb | 1 + 7 files changed, 79 insertions(+), 19 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 7597a47d0..e4651bc63 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -19,7 +19,7 @@ class ProjectsController < ApplicationController before_action :load_current_folder, only: :index before_action :check_view_permissions, except: %i(index create update archive_group restore_group inventory_assigning_project_filter - actions_toolbar user_roles users_filter) + actions_toolbar user_roles users_filter head_of_project_users_list) before_action :check_create_permissions, only: :create before_action :check_manage_permissions, only: :update before_action :set_folder_inline_name_editing, only: %i(index cards) @@ -272,6 +272,14 @@ class ProjectsController < ApplicationController render json: { data: users }, status: :ok end + def head_of_project_users_list + users = User.where(id: current_team.projects.select(:supervised_by_id)).map do |u| + [u.id, u.name, { avatar_url: avatar_path(u, :icon_small) }] + end + + render json: { data: users }, status: :ok + end + def assigned_users_list users = User.where(id: @project.user_assignments.select(:user_id)).order('full_name ASC') diff --git a/app/javascript/vue/projects/list.vue b/app/javascript/vue/projects/list.vue index 555d63bbd..70bfa8d95 100644 --- a/app/javascript/vue/projects/list.vue +++ b/app/javascript/vue/projects/list.vue @@ -125,6 +125,7 @@ export default { archivedPageUrl: { type: String }, currentViewMode: { type: String, required: true }, usersFilterUrl: { type: String }, + headOfProjectUsersListUrl: { type: String }, userRolesUrl: { type: String }, currentFolderId: { type: String }, foldersTreeUrl: { type: String }, @@ -142,7 +143,12 @@ export default { exportLimitExceded: false, folderDeleteDescription: '', exportDescription: '', - descriptionModalObject: null + descriptionModalObject: null, + statusesList: [ + ['not_started', this.i18n.t('projects.index.status.not_started')], + ['started', this.i18n.t('projects.index.status.started')], + ['completed', this.i18n.t('projects.index.status.completed')] + ] }; }, computed: { @@ -164,6 +170,9 @@ export default { headerName: this.i18n.t('projects.index.card.status'), sortable: true, cellRenderer: StatusRenderer, + cellRendererParams: { + statusesList: this.statusesList + }, notSelectable: true }, { @@ -287,9 +296,16 @@ export default { type: 'Text' }, { - key: 'created_at', + key: 'start_on', type: 'DateRange', - label: this.i18n.t('filters_modal.created_on.label') + label: this.i18n.t('filters_modal.created_on.label'), + mode: 'date' + }, + { + key: 'due_date', + type: 'DateRange', + label: this.i18n.t('filters_modal.due_date.label'), + mode: 'date' } ]; @@ -311,6 +327,24 @@ export default { placeholder: this.i18n.t('projects.index.filters_modal.members.placeholder') }); + filters.push({ + key: 'head_of_project', + type: 'Select', + optionsUrl: this.headOfProjectUsersListUrl, + optionRenderer: this.usersFilterRenderer, + labelRenderer: this.usersFilterRenderer, + label: this.i18n.t('projects.index.filters_modal.head_of_project.label'), + placeholder: this.i18n.t('projects.index.filters_modal.head_of_project.placeholder') + }); + + filters.push({ + key: 'statuses', + type: 'Select', + options: this.statusesList, + label: this.i18n.t('projects.index.filters_modal.status.label'), + placeholder: this.i18n.t('projects.index.filters_modal.status.placeholder') + }); + filters.push({ key: 'folder_search', type: 'Checkbox', diff --git a/app/javascript/vue/projects/renderers/status.vue b/app/javascript/vue/projects/renderers/status.vue index cb1c4c3b7..fb9ca5599 100644 --- a/app/javascript/vue/projects/renderers/status.vue +++ b/app/javascript/vue/projects/renderers/status.vue @@ -1,7 +1,7 @@