Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-09-04 00:09:54 +00:00
parent a50ba8dc15
commit 02bb524d05
6 changed files with 85 additions and 90 deletions

View File

@ -143,6 +143,8 @@ export default {
hideText: __('Hide values'), hideText: __('Hide values'),
}, },
formElementClasses: 'md:gl-mr-3 gl-mb-3 gl-basis-1/4 gl-shrink-0 gl-flex-grow-0', formElementClasses: 'md:gl-mr-3 gl-mb-3 gl-basis-1/4 gl-shrink-0 gl-flex-grow-0',
// it's used to prevent the overwrite if 'gl-h-7' or '!gl-h-7' were used
textAreaStyle: { height: '32px' },
computed: { computed: {
dropdownTranslations() { dropdownTranslations() {
return { return {
@ -374,7 +376,7 @@ export default {
<div v-for="(variable, index) in variables" :key="`var-${index}`"> <div v-for="(variable, index) in variables" :key="`var-${index}`">
<div <div
v-if="!variable.destroy" v-if="!variable.destroy"
class="gl-mb-3 gl-flex gl-flex-col gl-items-stretch gl-pb-2 md:gl-flex-row" class="gl-mb-3 gl-flex gl-flex-col gl-items-stretch gl-pb-2 md:gl-flex-row md:gl-items-start"
data-testid="ci-variable-row" data-testid="ci-variable-row"
> >
<gl-collapsible-listbox <gl-collapsible-listbox
@ -399,7 +401,6 @@ export default {
value="*****************" value="*****************"
disabled disabled
class="gl-mb-3 !gl-h-7" class="gl-mb-3 !gl-h-7"
:no-resize="false"
data-testid="pipeline-form-ci-variable-hidden-value" data-testid="pipeline-form-ci-variable-hidden-value"
/> />
@ -407,7 +408,8 @@ export default {
v-else v-else
v-model="variable.value" v-model="variable.value"
:placeholder="s__('CiVariables|Input variable value')" :placeholder="s__('CiVariables|Input variable value')"
class="gl-mb-3 !gl-h-7" class="gl-mb-3 gl-min-h-7"
:style="$options.textAreaStyle"
:no-resize="false" :no-resize="false"
data-testid="pipeline-form-ci-variable-value" data-testid="pipeline-form-ci-variable-value"
@change="resetVariable(index)" @change="resetVariable(index)"

View File

@ -11,6 +11,8 @@ import {
getDefaultWorkItemTypes, getDefaultWorkItemTypes,
getInitialPageParams, getInitialPageParams,
getTypeTokenOptions, getTypeTokenOptions,
getFilterTokens,
convertToUrlParams,
} from 'ee_else_ce/issues/list/utils'; } from 'ee_else_ce/issues/list/utils';
import { TYPENAME_USER } from '~/graphql_shared/constants'; import { TYPENAME_USER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils'; import { convertToGraphQLId } from '~/graphql_shared/utils';
@ -22,10 +24,20 @@ import {
WORKSPACE_PROJECT, WORKSPACE_PROJECT,
} from '~/issues/constants'; } from '~/issues/constants';
import { AutocompleteCache } from '~/issues/dashboard/utils'; import { AutocompleteCache } from '~/issues/dashboard/utils';
import {
CREATED_DESC,
PARAM_FIRST_PAGE_SIZE,
PARAM_LAST_PAGE_SIZE,
PARAM_PAGE_AFTER,
PARAM_PAGE_BEFORE,
PARAM_STATE,
PARAM_SORT,
} from '~/issues/list/constants';
import searchLabelsQuery from '~/issues/list/queries/search_labels.query.graphql'; import searchLabelsQuery from '~/issues/list/queries/search_labels.query.graphql';
import setSortPreferenceMutation from '~/issues/list/queries/set_sort_preference.mutation.graphql'; import setSortPreferenceMutation from '~/issues/list/queries/set_sort_preference.mutation.graphql';
import { fetchPolicies } from '~/lib/graphql'; import { fetchPolicies } from '~/lib/graphql';
import { scrollUp } from '~/lib/utils/scroll_utils'; import { scrollUp } from '~/lib/utils/scroll_utils';
import { isPositiveInteger } from '~/lib/utils/number_utils';
import { __, s__ } from '~/locale'; import { __, s__ } from '~/locale';
import { import {
OPERATORS_IS, OPERATORS_IS,
@ -53,6 +65,7 @@ import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_ro
import WorkItemDrawer from '~/work_items/components/work_item_drawer.vue'; import WorkItemDrawer from '~/work_items/components/work_item_drawer.vue';
import { DEFAULT_PAGE_SIZE, issuableListTabs } from '~/vue_shared/issuable/list/constants'; import { DEFAULT_PAGE_SIZE, issuableListTabs } from '~/vue_shared/issuable/list/constants';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { getParameterByName } from '~/lib/utils/url_utility';
import { STATE_CLOSED, STATE_OPEN, WORK_ITEM_TYPE_ENUM_EPIC } from '../constants'; import { STATE_CLOSED, STATE_OPEN, WORK_ITEM_TYPE_ENUM_EPIC } from '../constants';
import getWorkItemsQuery from '../graphql/list/get_work_items.query.graphql'; import getWorkItemsQuery from '../graphql/list/get_work_items.query.graphql';
import getWorkItemStateCountsQuery from '../graphql/list/get_work_item_state_counts.query.graphql'; import getWorkItemStateCountsQuery from '../graphql/list/get_work_item_state_counts.query.graphql';
@ -114,9 +127,9 @@ export default {
hasAnyIssues: false, hasAnyIssues: false,
isInitialLoadComplete: false, isInitialLoadComplete: false,
pageInfo: {}, pageInfo: {},
pageParams: getInitialPageParams(), pageParams: {},
pageSize: DEFAULT_PAGE_SIZE, pageSize: DEFAULT_PAGE_SIZE,
sortKey: deriveSortKey({ sort: this.initialSort, sortMap: urlSortParams }), sortKey: CREATED_DESC,
state: STATUS_OPEN, state: STATUS_OPEN,
workItems: [], workItems: [],
workItemStateCounts: {}, workItemStateCounts: {},
@ -241,7 +254,6 @@ export default {
isProject: !this.isGroup, isProject: !this.isGroup,
recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-assignee`, recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-assignee`,
preloadedUsers, preloadedUsers,
multiSelect: this.glFeatures.groupMultiSelectTokens,
}, },
{ {
type: TOKEN_TYPE_AUTHOR, type: TOKEN_TYPE_AUTHOR,
@ -255,7 +267,6 @@ export default {
isProject: !this.isGroup, isProject: !this.isGroup,
recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-author`, recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-author`,
preloadedUsers, preloadedUsers,
multiSelect: this.glFeatures.groupMultiSelectTokens,
}, },
{ {
type: TOKEN_TYPE_GROUP, type: TOKEN_TYPE_GROUP,
@ -275,7 +286,6 @@ export default {
fetchLabels: this.fetchLabels, fetchLabels: this.fetchLabels,
fetchLatestLabels: this.glFeatures.frontendCaching ? this.fetchLatestLabels : null, fetchLatestLabels: this.glFeatures.frontendCaching ? this.fetchLatestLabels : null,
recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-label`, recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-label`,
multiSelect: this.glFeatures.groupMultiSelectTokens,
}, },
{ {
type: TOKEN_TYPE_MILESTONE, type: TOKEN_TYPE_MILESTONE,
@ -362,6 +372,20 @@ export default {
hasQualityManagementFeature: this.hasQualityManagementFeature, hasQualityManagementFeature: this.hasQualityManagementFeature,
}); });
}, },
urlFilterParams() {
return convertToUrlParams(this.filterTokens);
},
urlParams() {
return {
sort: urlSortParams[this.sortKey],
state: this.state,
...this.urlFilterParams,
first_page_size: this.pageParams.firstPageSize,
last_page_size: this.pageParams.lastPageSize,
page_after: this.pageParams.afterCursor ?? undefined,
page_before: this.pageParams.beforeCursor ?? undefined,
};
},
}, },
watch: { watch: {
eeWorkItemUpdateCount() { eeWorkItemUpdateCount() {
@ -371,8 +395,14 @@ export default {
} }
this.$apollo.queries.workItems.refetch(); this.$apollo.queries.workItems.refetch();
}, },
$route(newValue, oldValue) {
if (newValue.fullPath !== oldValue.fullPath) {
this.updateData(getParameterByName(PARAM_SORT));
}
},
}, },
created() { created() {
this.updateData(this.initialSort);
this.autocompleteCache = new AutocompleteCache(); this.autocompleteCache = new AutocompleteCache();
}, },
methods: { methods: {
@ -417,10 +447,14 @@ export default {
this.state = state; this.state = state;
this.pageParams = getInitialPageParams(this.pageSize); this.pageParams = getInitialPageParams(this.pageSize);
this.$router.push({ query: this.urlParams });
}, },
handleFilter(tokens) { handleFilter(tokens) {
this.filterTokens = tokens; this.filterTokens = tokens;
this.pageParams = getInitialPageParams(this.pageSize); this.pageParams = getInitialPageParams(this.pageSize);
this.$router.push({ query: this.urlParams });
}, },
handleNextPage() { handleNextPage() {
this.pageParams = { this.pageParams = {
@ -428,11 +462,15 @@ export default {
firstPageSize: this.pageSize, firstPageSize: this.pageSize,
}; };
scrollUp(); scrollUp();
this.$router.push({ query: this.urlParams });
}, },
handlePageSizeChange(pageSize) { handlePageSizeChange(pageSize) {
this.pageSize = pageSize; this.pageSize = pageSize;
this.pageParams = getInitialPageParams(pageSize); this.pageParams = getInitialPageParams(pageSize);
scrollUp(); scrollUp();
this.$router.push({ query: this.urlParams });
}, },
handlePreviousPage() { handlePreviousPage() {
this.pageParams = { this.pageParams = {
@ -440,6 +478,8 @@ export default {
lastPageSize: this.pageSize, lastPageSize: this.pageSize,
}; };
scrollUp(); scrollUp();
this.$router.push({ query: this.urlParams });
}, },
handleSort(sortKey) { handleSort(sortKey) {
if (this.sortKey === sortKey) { if (this.sortKey === sortKey) {
@ -452,6 +492,8 @@ export default {
if (this.isSignedIn) { if (this.isSignedIn) {
this.saveSortPreference(sortKey); this.saveSortPreference(sortKey);
} }
this.$router.push({ query: this.urlParams });
}, },
saveSortPreference(sortKey) { saveSortPreference(sortKey) {
this.$apollo this.$apollo
@ -485,6 +527,26 @@ export default {
await this.$apollo.queries.workItems.refetch(); await this.$apollo.queries.workItems.refetch();
this.isRefetching = false; this.isRefetching = false;
}, },
updateData(sort) {
const firstPageSize = getParameterByName(PARAM_FIRST_PAGE_SIZE);
const lastPageSize = getParameterByName(PARAM_LAST_PAGE_SIZE);
const state = getParameterByName(PARAM_STATE);
this.filterTokens = getFilterTokens(window.location.search);
this.pageParams = getInitialPageParams(
this.pageSize,
isPositiveInteger(firstPageSize) ? parseInt(firstPageSize, 10) : undefined,
isPositiveInteger(lastPageSize) ? parseInt(lastPageSize, 10) : undefined,
getParameterByName(PARAM_PAGE_AFTER) ?? undefined,
getParameterByName(PARAM_PAGE_BEFORE) ?? undefined,
);
// Trigger pageSize UI component update based on URL changes
this.pageSize = this.pageParams.firstPageSize;
this.sortKey = deriveSortKey({ sort, sortMap: urlSortParams });
this.state = state || STATUS_OPEN;
},
}, },
}; };
</script> </script>
@ -508,6 +570,7 @@ export default {
:error="error" :error="error"
:has-next-page="pageInfo.hasNextPage" :has-next-page="pageInfo.hasNextPage"
:has-previous-page="pageInfo.hasPreviousPage" :has-previous-page="pageInfo.hasPreviousPage"
:initial-filter-value="filterTokens"
:initial-sort-by="sortKey" :initial-sort-by="sortKey"
:issuables="workItems" :issuables="workItems"
:issuables-loading="isLoading" :issuables-loading="isLoading"
@ -520,6 +583,7 @@ export default {
:show-pagination-controls="showPaginationControls" :show-pagination-controls="showPaginationControls"
show-work-item-type-icon show-work-item-type-icon
:sort-options="$options.sortOptions" :sort-options="$options.sortOptions"
sync-filter-and-sort
:tab-counts="tabCounts" :tab-counts="tabCounts"
:tabs="$options.issuableListTabs" :tabs="$options.issuableListTabs"
use-keyset-pagination use-keyset-pagination

View File

@ -4,39 +4,6 @@
border: 1px solid $gray-100; border: 1px solid $gray-100;
border-radius: $gl-border-radius-base; border-radius: $gl-border-radius-base;
.card.card-body-segment {
padding: $gl-padding;
&:not(:last-of-type) {
border-bottom: 1px solid $gray-100;
}
&.borderless {
border-bottom: 0;
}
&.branch-info {
.commit-sha,
.commit-info {
margin-left: 4px;
.fork-svg {
margin-right: 4px;
vertical-align: bottom;
}
}
.ref-name {
font-size: 12px;
}
}
&.admin-well h4 {
border-bottom: 1px solid $border-color;
padding-bottom: 8px;
}
}
.icon-container { .icon-container {
display: inline-block; display: inline-block;
margin: 0 0.5rem 0 0.25rem; margin: 0 0.5rem 0 0.25rem;
@ -57,10 +24,6 @@
} }
} }
.label-gray {
background-color: $well-expand-item;
}
.branches { .branches {
display: inline; display: inline;
} }
@ -69,11 +32,3 @@
vertical-align: text-top; vertical-align: text-top;
} }
} }
.card.card-body-centered {
h1 {
font-weight: $gl-font-weight-normal;
text-align: center;
font-size: 48px;
}
}

View File

@ -162,10 +162,6 @@
.generic-commit-status { .generic-commit-status {
a { a {
color: $gl-text-color; color: $gl-text-color;
&.autodevops-badge {
color: $white;
}
} }
.commit-row-description { .commit-row-description {
@ -232,29 +228,3 @@
font-weight: $gl-font-weight-normal; font-weight: $gl-font-weight-normal;
line-height: 1.5; line-height: 1.5;
} }
.gpg-popover-icon {
// same margin as .s32.avatar
margin-right: $btn-side-margin;
&.valid {
svg {
border: 1px solid $brand-success;
fill: $brand-success;
}
}
&.invalid {
svg {
border: 1px solid $gray-200;
fill: $gray-200;
}
}
svg {
width: 32px;
height: 32px;
border-radius: 50%;
vertical-align: middle;
}
}

View File

@ -267,7 +267,7 @@ Using the [rails console](../../../administration/operations/rails_console.md#st
```ruby ```ruby
p = Project.find_by_full_path('project/path') p = Project.find_by_full_path('project/path')
p.events.pushed_action.last(100).each do |e| p.events.pushed_action.last(100).each do |e|
puts "%-20.20s %8s...%8s (%s)", e.push_event_payload[:ref], e.push_event_payload[:commit_from], e.push_event_payload[:commit_to], e.author.try(:username) printf "%-20.20s %8s...%8s (%s)", e.push_event_payload[:ref], e.push_event_payload[:commit_from], e.push_event_payload[:commit_to], e.author.try(:username)
end ; nil end ; nil
``` ```

View File

@ -3,6 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import { cloneDeep } from 'lodash'; import { cloneDeep } from 'lodash';
import Vue, { nextTick } from 'vue'; import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo'; import VueApollo from 'vue-apollo';
import VueRouter from 'vue-router';
import * as Sentry from '~/sentry/sentry_browser_wrapper'; import * as Sentry from '~/sentry/sentry_browser_wrapper';
import IssueCardStatistics from 'ee_else_ce/issues/list/components/issue_card_statistics.vue'; import IssueCardStatistics from 'ee_else_ce/issues/list/components/issue_card_statistics.vue';
import IssueCardTimeInfo from 'ee_else_ce/issues/list/components/issue_card_time_info.vue'; import IssueCardTimeInfo from 'ee_else_ce/issues/list/components/issue_card_time_info.vue';
@ -39,6 +40,7 @@ import getWorkItemStateCountsQuery from '~/work_items/graphql/list/get_work_item
import getWorkItemsQuery from '~/work_items/graphql/list/get_work_items.query.graphql'; import getWorkItemsQuery from '~/work_items/graphql/list/get_work_items.query.graphql';
import WorkItemDrawer from '~/work_items/components/work_item_drawer.vue'; import WorkItemDrawer from '~/work_items/components/work_item_drawer.vue';
import { STATE_CLOSED } from '~/work_items/constants'; import { STATE_CLOSED } from '~/work_items/constants';
import { createRouter } from '~/work_items/router';
import { import {
groupWorkItemsQueryResponse, groupWorkItemsQueryResponse,
groupWorkItemStateCountsQueryResponse, groupWorkItemStateCountsQueryResponse,
@ -58,6 +60,7 @@ describeSkipVue3(skipReason, () => {
let wrapper; let wrapper;
Vue.use(VueApollo); Vue.use(VueApollo);
Vue.use(VueRouter);
const defaultQueryHandler = jest.fn().mockResolvedValue(groupWorkItemsQueryResponse); const defaultQueryHandler = jest.fn().mockResolvedValue(groupWorkItemsQueryResponse);
const countsQueryHandler = jest.fn().mockResolvedValue(groupWorkItemStateCountsQueryResponse); const countsQueryHandler = jest.fn().mockResolvedValue(groupWorkItemStateCountsQueryResponse);
@ -74,6 +77,7 @@ describeSkipVue3(skipReason, () => {
sortPreferenceMutationResponse = mutationHandler, sortPreferenceMutationResponse = mutationHandler,
} = {}) => { } = {}) => {
wrapper = shallowMount(WorkItemsListApp, { wrapper = shallowMount(WorkItemsListApp, {
router: createRouter({ fullPath: '/work_item' }),
apolloProvider: createMockApollo([ apolloProvider: createMockApollo([
[getWorkItemsQuery, queryHandler], [getWorkItemsQuery, queryHandler],
[getWorkItemStateCountsQuery, countsQueryHandler], [getWorkItemStateCountsQuery, countsQueryHandler],
@ -182,7 +186,6 @@ describeSkipVue3(skipReason, () => {
includeDescendants: true, includeDescendants: true,
sort: CREATED_DESC, sort: CREATED_DESC,
state: STATUS_OPEN, state: STATUS_OPEN,
firstPageSize: 20,
types: type, types: type,
}); });
}); });
@ -213,7 +216,6 @@ describeSkipVue3(skipReason, () => {
describe('when eeCreatedWorkItemsCount is updated', () => { describe('when eeCreatedWorkItemsCount is updated', () => {
it('refetches work items', async () => { it('refetches work items', async () => {
mountComponent(); mountComponent();
await waitForPromises();
expect(defaultQueryHandler).toHaveBeenCalledTimes(1); expect(defaultQueryHandler).toHaveBeenCalledTimes(1);
@ -478,17 +480,20 @@ describeSkipVue3(skipReason, () => {
}); });
it('refetches and resets when work item is deleted', async () => { it('refetches and resets when work item is deleted', async () => {
expect(defaultQueryHandler).toHaveBeenCalledTimes(2);
findDrawer().vm.$emit('workItemDeleted'); findDrawer().vm.$emit('workItemDeleted');
await nextTick(); await nextTick();
checkThatDrawerPropsAreEmpty(); checkThatDrawerPropsAreEmpty();
// first call when mounted, second call after deletion expect(defaultQueryHandler).toHaveBeenCalledTimes(3);
expect(defaultQueryHandler).toHaveBeenCalledTimes(2);
}); });
it('refetches when the selected work item is closed', async () => { it('refetches when the selected work item is closed', async () => {
expect(defaultQueryHandler).toHaveBeenCalledTimes(2);
// component displays open work items by default // component displays open work items by default
findDrawer().vm.$emit('work-item-updated', { findDrawer().vm.$emit('work-item-updated', {
state: STATE_CLOSED, state: STATE_CLOSED,
@ -496,8 +501,7 @@ describeSkipVue3(skipReason, () => {
await nextTick(); await nextTick();
// first call when mounted, second call after update expect(defaultQueryHandler).toHaveBeenCalledTimes(3);
expect(defaultQueryHandler).toHaveBeenCalledTimes(2);
}); });
}); });
}); });