From 38f98259f57f76c2d3072a5c2a3c06dd02c5891a Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 26 Jun 2025 12:11:59 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- GITLAB_KAS_VERSION | 2 +- GITLAB_ZOEKT_VERSION | 2 +- .../admin/groups/index/components/app.vue | 7 + .../admin/groups/index/constants.js | 4 + .../queries/group_counts.query.graphql | 10 + .../boards/components/board_list.vue | 5 +- .../kubernetes/kubernetes_agent_info.vue | 69 ++++-- .../kubernetes/kubernetes_overview.vue | 44 +--- .../components/kubernetes/pod_logs_button.vue | 5 +- .../import_groups/components/import_table.vue | 63 ++---- .../components/workload_table.vue | 71 +++--- .../kubernetes_dashboard/constants.js | 13 +- .../notes/components/note_header.vue | 29 +-- .../javascripts/projects/upload_file.js | 13 +- .../assignees/assignee_avatar_link.vue | 36 +-- .../components/participants/participants.vue | 39 ++-- app/assets/javascripts/user_popovers.js | 6 +- .../components/user_popover/user_popover.vue | 1 - .../components/notes/work_item_note.vue | 31 +-- .../work_item_change_type_modal.vue | 10 +- .../components/work_item_created_updated.vue | 4 +- .../work_items/pages/work_items_list_app.vue | 4 +- .../groups/milestones_controller.rb | 4 - .../projects/milestones_controller.rb | 4 - app/helpers/timeboxes_helper.rb | 9 +- app/models/concerns/milestoneish.rb | 4 +- app/models/group.rb | 4 - app/models/project.rb | 4 - app/presenters/project_presenter.rb | 3 +- .../shared/milestones/_issuables.html.haml | 5 +- .../shared/milestones/_issues_tab.html.haml | 23 +- .../shared/milestones/_sidebar.html.haml | 19 +- app/views/shared/milestones/_tabs.html.haml | 8 +- .../beta/work_item_epic_milestones.yml | 10 - db/click_house/main.sql | 31 ++- .../20250625053417_adjust_siphon_issues.rb | 55 +++++ ...20250625061106_adjust_siphon_namespaces.rb | 15 ++ ...0625061624_adjust_siphon_merge_requests.rb | 47 ++++ .../schema_migrations/main/20250625053417 | 1 + .../schema_migrations/main/20250625061106 | 1 + .../schema_migrations/main/20250625061624 | 1 + db/docs/ai_catalog_items.yml | 12 + .../20250619122935_create_ai_catalog_items.rb | 17 ++ ...add_organization_fk_to_ai_catalog_items.rb | 16 ++ ...1706_add_project_fk_to_ai_catalog_items.rb | 16 ++ ...e_project_ids_to_unarchived_project_ids.rb | 17 ++ db/schema_migrations/20250619122935 | 1 + db/schema_migrations/20250619211342 | 1 + db/schema_migrations/20250619211706 | 1 + db/schema_migrations/20250624063009 | 1 + db/structure.sql | 211 +++++++++++++++--- doc/integration/saml.md | 13 +- doc/user/analytics/ai_impact_analytics.md | 5 +- gems/gitlab-schema-validation/Gemfile.lock | 16 +- .../adapters/column_structure_sql_adapter.rb | 17 +- lib/click_house/migration.rb | 17 ++ locale/gitlab.pot | 48 +--- .../pipeline_with_protected_variable_spec.rb | 2 +- spec/db/clickhouse_siphon_tables_spec.rb | 2 +- .../import_export/connect_instance_spec.rb | 1 - .../milestones/user_creates_milestone_spec.rb | 3 +- .../milestones/user_views_milestone_spec.rb | 14 -- .../projects/milestones/milestone_spec.rb | 20 +- .../admin/groups/index/components/app_spec.js | 5 + spec/frontend/boards/board_list_spec.js | 41 ++++ .../components/deployment_aside_spec.js | 3 +- .../kubernetes/kubernetes_agent_info_spec.js | 40 +++- .../kubernetes/kubernetes_overview_spec.js | 45 +--- .../kubernetes/pod_logs_button_spec.js | 8 + .../components/import_table_spec.js | 33 --- .../components/workload_table_spec.js | 36 +-- .../assignees/assignee_avatar_link_spec.js | 2 +- .../components/assignees/assignees_spec.js | 9 +- .../work_item_change_type_modal_spec.js | 5 - .../components/work_items_list_app_spec.js | 76 ++----- spec/models/concerns/milestoneish_spec.rb | 1 - spec/presenters/project_presenter_spec.rb | 3 +- ...request_approval_policy_shared_examples.rb | 98 ++++++++ ...request_approval_policy_shared_examples.rb | 30 +++ .../security/policies_shared_examples.rb | 72 ------ 80 files changed, 979 insertions(+), 695 deletions(-) create mode 100644 app/assets/javascripts/admin/groups/index/graphql/queries/group_counts.query.graphql delete mode 100644 config/feature_flags/beta/work_item_epic_milestones.yml create mode 100644 db/click_house/migrate/main/20250625053417_adjust_siphon_issues.rb create mode 100644 db/click_house/migrate/main/20250625061106_adjust_siphon_namespaces.rb create mode 100644 db/click_house/migrate/main/20250625061624_adjust_siphon_merge_requests.rb create mode 100644 db/click_house/schema_migrations/main/20250625053417 create mode 100644 db/click_house/schema_migrations/main/20250625061106 create mode 100644 db/click_house/schema_migrations/main/20250625061624 create mode 100644 db/docs/ai_catalog_items.yml create mode 100644 db/migrate/20250619122935_create_ai_catalog_items.rb create mode 100644 db/migrate/20250619211342_add_organization_fk_to_ai_catalog_items.rb create mode 100644 db/migrate/20250619211706_add_project_fk_to_ai_catalog_items.rb create mode 100644 db/migrate/20250624063009_rename_namespace_descendants_active_project_ids_to_unarchived_project_ids.rb create mode 100644 db/schema_migrations/20250619122935 create mode 100644 db/schema_migrations/20250619211342 create mode 100644 db/schema_migrations/20250619211706 create mode 100644 db/schema_migrations/20250624063009 create mode 100644 spec/support/shared_examples/security/creating_merge_request_approval_policy_shared_examples.rb create mode 100644 spec/support/shared_examples/security/editing_merge_request_approval_policy_shared_examples.rb diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION index fbbf04fee7f..ecfb0895868 100644 --- a/GITLAB_KAS_VERSION +++ b/GITLAB_KAS_VERSION @@ -1 +1 @@ -19cdf695f882cf538ff87ab175d9f7b782b5ee75 +1cbd47b2d0b60cd21113a713680c6859450a2db5 diff --git a/GITLAB_ZOEKT_VERSION b/GITLAB_ZOEKT_VERSION index 885415662ff..610e28725be 100644 --- a/GITLAB_ZOEKT_VERSION +++ b/GITLAB_ZOEKT_VERSION @@ -1 +1 @@ -0.21.0 +0.23.1 diff --git a/app/assets/javascripts/admin/groups/index/components/app.vue b/app/assets/javascripts/admin/groups/index/components/app.vue index 5fd871d5bad..e280f678c99 100644 --- a/app/assets/javascripts/admin/groups/index/components/app.vue +++ b/app/assets/javascripts/admin/groups/index/components/app.vue @@ -6,6 +6,7 @@ import { TIMESTAMP_TYPE_CREATED_AT, TIMESTAMP_TYPE_UPDATED_AT, } from '~/vue_shared/components/resource_lists/constants'; +import adminGroupCountsQuery from '../graphql/queries/group_counts.query.graphql'; import { ADMIN_GROUPS_TABS, SORT_OPTIONS, @@ -13,6 +14,7 @@ import { SORT_OPTION_CREATED, FILTERED_SEARCH_TERM_KEY, FILTERED_SEARCH_NAMESPACE, + FIRST_TAB_ROUTE_NAMES, } from '../constants'; export default { @@ -22,11 +24,13 @@ export default { FILTERED_SEARCH_TERM_KEY, FILTERED_SEARCH_NAMESPACE, RECENT_SEARCHES_STORAGE_KEY_GROUPS, + FIRST_TAB_ROUTE_NAMES, timestampTypeMap: { [SORT_OPTION_CREATED.value]: TIMESTAMP_TYPE_CREATED_AT, [SORT_OPTION_UPDATED.value]: TIMESTAMP_TYPE_UPDATED_AT, }, PAGINATION_TYPE_KEYSET, + tabCountsQuery: adminGroupCountsQuery, name: 'AdminGroupsApp', components: { TabsWithList }, }; @@ -44,5 +48,8 @@ export default { :timestamp-type-map="$options.timestampTypeMap" initial-sort="" :pagination-type="$options.PAGINATION_TYPE_KEYSET" + :tab-counts-query="$options.tabCountsQuery" + :tab-counts-query-error-message="__('An error occurred loading the group counts.')" + :first-tab-route-names="$options.FIRST_TAB_ROUTE_NAMES" /> diff --git a/app/assets/javascripts/admin/groups/index/constants.js b/app/assets/javascripts/admin/groups/index/constants.js index ea66059a806..166d92cd1c9 100644 --- a/app/assets/javascripts/admin/groups/index/constants.js +++ b/app/assets/javascripts/admin/groups/index/constants.js @@ -33,6 +33,7 @@ export const ACTIVE_TAB = { text: __('Active'), value: 'active', variables: { active: true }, + countsQueryPath: 'active', }; export const INACTIVE_TAB = { @@ -40,6 +41,7 @@ export const INACTIVE_TAB = { text: __('Inactive'), value: 'inactive', variables: { active: false }, + countsQueryPath: 'inactive', }; export const SORT_OPTION_NAME = { @@ -75,5 +77,7 @@ export const BASE_ROUTE = '/admin/groups'; export const ADMIN_GROUPS_ROUTE_NAME = 'admin-groups'; +export const FIRST_TAB_ROUTE_NAMES = [ADMIN_GROUPS_ROUTE_NAME]; + export const FILTERED_SEARCH_TERM_KEY = 'search'; export const FILTERED_SEARCH_NAMESPACE = 'admin-groups'; diff --git a/app/assets/javascripts/admin/groups/index/graphql/queries/group_counts.query.graphql b/app/assets/javascripts/admin/groups/index/graphql/queries/group_counts.query.graphql new file mode 100644 index 00000000000..f8c8e831aea --- /dev/null +++ b/app/assets/javascripts/admin/groups/index/graphql/queries/group_counts.query.graphql @@ -0,0 +1,10 @@ +# Since GraphQL doesn't support string comparison in @skip(if:) +# we use the naming convention of skip${tabValue} in camelCase +query adminGroupCountsQuery($skipActive: Boolean = false, $skipInactive: Boolean = false) { + active: groups(allAvailable: true, active: true) @skip(if: $skipActive) { + count + } + inactive: groups(allAvailable: true, active: false) @skip(if: $skipInactive) { + count + } +} diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue index f1ef83b6754..34a5331a61a 100644 --- a/app/assets/javascripts/boards/components/board_list.vue +++ b/app/assets/javascripts/boards/components/board_list.vue @@ -685,7 +685,10 @@ export default { }); } finally { this.addItemToListInProgress = false; - this.setActiveWorkItem(issuable); + // Only open the drawer if issue creation was successful (default iid of '-1' indicates failure) + if (issuable && issuable?.iid !== '-1') { + this.setActiveWorkItem(issuable); + } } }, setActiveWorkItem(boardItem) { diff --git a/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue index 638615f1e4e..a14d904d039 100644 --- a/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue +++ b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue @@ -1,10 +1,10 @@ diff --git a/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_overview.vue b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_overview.vue index 10c23c48a49..e9c0274d678 100644 --- a/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_overview.vue +++ b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_overview.vue @@ -1,13 +1,5 @@ diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue index 08f28fc465a..30dfc2159e3 100644 --- a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue +++ b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue @@ -246,14 +246,6 @@ export default { return this.filter.length > 0 && !this.hasGroups; }, - statusMessage() { - return this.filter.length === 0 - ? s__('BulkImport|Showing %{start}-%{end} of %{total} that you own from %{link}') - : s__( - 'BulkImport|Showing %{start}-%{end} of %{total} that you own matching filter "%{filter}" from %{link}', - ); - }, - paginationInfo() { const { page, perPage, total } = this.bulkImportSourceGroups?.pageInfo ?? { page: 1, @@ -679,18 +671,21 @@ export default { @@ -745,41 +740,9 @@ export default { -
- - - - - - - - - - - - - - -
-
+
-import { - GlTable, - GlBadge, - GlPagination, - GlDisclosureDropdown, - GlButton, - GlTooltipDirective, -} from '@gitlab/ui'; +import { GlTable, GlBadge, GlPagination, GlButton, GlTooltipDirective } from '@gitlab/ui'; import { __ } from '~/locale'; import PodLogsButton from '~/environments/environment_details/components/kubernetes/pod_logs_button.vue'; import { @@ -21,7 +14,6 @@ export default { GlBadge, GlPagination, PodLogsButton, - GlDisclosureDropdown, GlButton, }, directives: { @@ -69,22 +61,14 @@ export default { this.selectedItem = item; this.$emit('select-item', item); }, - getActions(item) { + getDeleteAction(item) { const actions = item.actions || []; - return actions.map((action) => { - return { - text: action.text, - extraAttrs: { class: action.class }, - action: () => { - this.$emit(action.name, item); - }, - }; - }); + + return actions.find((action) => action.name === 'delete-pod') || null; }, }, i18n: { emptyText: __('No results found'), - actions: __('Actions'), }, WORKLOAD_STATUS_BADGE_VARIANTS, }; @@ -100,17 +84,22 @@ export default { :empty-text="$options.i18n.emptyText" primary-key="name" show-empty - stacked="md" + stacked="lg" > - - diff --git a/app/assets/javascripts/kubernetes_dashboard/constants.js b/app/assets/javascripts/kubernetes_dashboard/constants.js index c02a6ddb72a..bd866410909 100644 --- a/app/assets/javascripts/kubernetes_dashboard/constants.js +++ b/app/assets/javascripts/kubernetes_dashboard/constants.js @@ -73,30 +73,25 @@ export const PODS_TABLE_FIELDS = [ { key: 'name', label: s__('KubernetesDashboard|Name'), - tdClass: 'md:gl-w-1/4 gl-break-anywhere', + tdClass: 'lg:gl-w-1/4 gl-break-anywhere', }, { key: 'status', label: s__('KubernetesDashboard|Status'), - tdClass: 'md:gl-w-1/6', + tdClass: 'lg:gl-w-1/6', }, { key: 'namespace', label: s__('KubernetesDashboard|Namespace'), - tdClass: 'md:gl-w-1/4 gl-break-anywhere', + tdClass: 'lg:gl-w-1/4 gl-break-anywhere', }, { key: 'age', label: s__('KubernetesDashboard|Age'), }, - { - key: 'logs', - label: s__('KubernetesDashboard|Logs'), - sortable: false, - }, { key: 'actions', - label: '', + label: s__('KubernetesDashboard|Actions'), sortable: false, }, ]; diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue index 9e277fbc8bd..b8153a60ff1 100644 --- a/app/assets/javascripts/notes/components/note_header.vue +++ b/app/assets/javascripts/notes/components/note_header.vue @@ -156,20 +156,21 @@ export default { data-testid="author-name" v-text="authorName" > - - - + + + + + { if (!uploadFileTriggerEl) return false; - const { targetBranch, originalBranch, canPushCode, canPushToBranch, path, projectPath } = - uploadFileTriggerEl.dataset; + const { + targetBranch, + originalBranch, + canPushCode, + canPushToBranch, + path, + projectPath, + fullName, + } = uploadFileTriggerEl.dataset; return new Vue({ el: uploadFileTriggerEl, - router: createRouter(projectPath, originalBranch), + router: createRouter(projectPath, originalBranch, fullName), provide: { targetBranch, originalBranch, diff --git a/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue b/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue index 7c4e9f0e488..b5f3c2ed87b 100644 --- a/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue +++ b/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue @@ -1,4 +1,5 @@ @@ -99,23 +103,24 @@ export default {
- - - + + + + +
diff --git a/app/assets/javascripts/work_items/components/notes/work_item_note.vue b/app/assets/javascripts/work_items/components/notes/work_item_note.vue index 31315434134..1e0c13300a3 100644 --- a/app/assets/javascripts/work_items/components/notes/work_item_note.vue +++ b/app/assets/javascripts/work_items/components/notes/work_item_note.vue @@ -1,5 +1,5 @@