From e0e129ae4493bea608e79176c63a68d133948a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Caplette?= Date: Wed, 3 Dec 2025 14:44:32 -0500 Subject: [PATCH] Disable Agent when no more credits In work items, when the user tries to assign an agent to it but has not more credit, we are going to receive a property from graphql. When set, we disable the selection with a message as to why we disabled it. --- .gitignore | 4 + .../user_autocomplete_status.fragment.graphql | 9 ++ ...workspace_autocomplete_users.query.graphql | 3 + .../assignees/sidebar_participant.vue | 15 ++- .../work_item_sidebar_dropdown_widget.vue | 16 ++- .../components/work_item_assignees.vue | 65 ++++++----- .../stylesheets/page_bundles/work_items.scss | 13 +++ .../reporting/git_abuse_settings/mock_data.js | 12 ++- locale/gitlab.pot | 3 + .../assignees/sidebar_participant_spec.js | 22 ++++ spec/frontend/sidebar/mock_data.js | 68 +++++++++++- .../user_select/user_select_spec.js | 101 ++++++++++-------- .../components/work_item_assignees_spec.js | 49 +++++---- spec/frontend/work_items/mock_data.js | 27 ++++- 14 files changed, 302 insertions(+), 105 deletions(-) create mode 100644 app/assets/javascripts/graphql_shared/fragments/user_autocomplete_status.fragment.graphql diff --git a/.gitignore b/.gitignore index dae85edce94ba5..cb4cbb42d80e9c 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,7 @@ config/helpers/tailwind/css_in_js.js # Rubocop cop documentation generation .yardoc + +# yalc for temporary testing +.yalc +yalc.lock diff --git a/app/assets/javascripts/graphql_shared/fragments/user_autocomplete_status.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/user_autocomplete_status.fragment.graphql new file mode 100644 index 00000000000000..20d5496f5c1698 --- /dev/null +++ b/app/assets/javascripts/graphql_shared/fragments/user_autocomplete_status.fragment.graphql @@ -0,0 +1,9 @@ +# @graphql-eslint/eslint-plugin@4.0.0 reports missing IDs in `FragmentDefinition`. +# Field `id` does not exist on AutocompleteUserStatus yet the linter asks us for it. +# eslint-disable-next-line @graphql-eslint/require-selections +fragment AutocompleteUserStatus on User { + status { + disabledForDuoUsage @gl_introduced(version: "18.7.0") + disabledForDuoUsageReason @gl_introduced(version: "18.7.0") + } +} diff --git a/app/assets/javascripts/graphql_shared/queries/workspace_autocomplete_users.query.graphql b/app/assets/javascripts/graphql_shared/queries/workspace_autocomplete_users.query.graphql index 796797c569c49d..9ddd2e0f3ca5ea 100644 --- a/app/assets/javascripts/graphql_shared/queries/workspace_autocomplete_users.query.graphql +++ b/app/assets/javascripts/graphql_shared/queries/workspace_autocomplete_users.query.graphql @@ -1,5 +1,6 @@ #import "../fragments/user.fragment.graphql" #import "~/graphql_shared/fragments/user_availability.fragment.graphql" +#import "~/graphql_shared/fragments/user_autocomplete_status.fragment.graphql" query workspaceAutocompleteUsersSearch( $search: String! @@ -12,6 +13,7 @@ query workspaceAutocompleteUsersSearch( compositeIdentityEnforced @gl_introduced(version: "18.7.0") ...User ...UserAvailability + ...AutocompleteUserStatus } } workspace: project(fullPath: $fullPath) { @@ -20,6 +22,7 @@ query workspaceAutocompleteUsersSearch( compositeIdentityEnforced @gl_introduced(version: "18.7.0") ...User ...UserAvailability + ...AutocompleteUserStatus } } } diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue index 85781d8520b818..8890ae38b198fd 100644 --- a/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue +++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue @@ -1,7 +1,7 @@