diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-11-11 21:09:10 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-11-11 21:09:10 +0300 |
commit | 6d5a18ac65db79f3a32fb06618a4c4b7a08e777b (patch) | |
tree | 08fa8a2fdcf6bd23ae3a19fce008dcc38629ef2d /app/assets/javascripts/releases | |
parent | 5fc3c77e2b08746bd39bfffae0c5918d63178433 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/releases')
9 files changed, 127 insertions, 13 deletions
diff --git a/app/assets/javascripts/releases/components/app_index.vue b/app/assets/javascripts/releases/components/app_index.vue index 422d8bf630d..5064b7dd6ad 100644 --- a/app/assets/javascripts/releases/components/app_index.vue +++ b/app/assets/javascripts/releases/components/app_index.vue @@ -6,6 +6,7 @@ import { __ } from '~/locale'; import ReleaseBlock from './release_block.vue'; import ReleasesPagination from './releases_pagination.vue'; import ReleaseSkeletonLoader from './release_skeleton_loader.vue'; +import ReleasesSort from './releases_sort.vue'; export default { name: 'ReleasesApp', @@ -16,6 +17,7 @@ export default { ReleaseBlock, ReleasesPagination, ReleaseSkeletonLoader, + ReleasesSort, }, computed: { ...mapState('list', [ @@ -62,16 +64,20 @@ export default { </script> <template> <div class="flex flex-column mt-2"> - <gl-button - v-if="newReleasePath" - :href="newReleasePath" - :aria-describedby="shouldRenderEmptyState && 'releases-description'" - category="primary" - variant="success" - class="align-self-end mb-2 js-new-release-btn" - > - {{ __('New release') }} - </gl-button> + <div class="gl-align-self-end gl-mb-3"> + <releases-sort class="gl-mr-2" @sort:changed="fetchReleases" /> + + <gl-button + v-if="newReleasePath" + :href="newReleasePath" + :aria-describedby="shouldRenderEmptyState && 'releases-description'" + category="primary" + variant="success" + class="js-new-release-btn" + > + {{ __('New release') }} + </gl-button> + </div> <release-skeleton-loader v-if="isLoading" class="js-loading" /> diff --git a/app/assets/javascripts/releases/components/releases_sort.vue b/app/assets/javascripts/releases/components/releases_sort.vue new file mode 100644 index 00000000000..50f6f3c19bd --- /dev/null +++ b/app/assets/javascripts/releases/components/releases_sort.vue @@ -0,0 +1,62 @@ +<script> +import { GlSorting, GlSortingItem } from '@gitlab/ui'; +import { mapState, mapActions } from 'vuex'; +import { ASCENDING_ODER, DESCENDING_ORDER, SORT_OPTIONS } from '../constants'; + +export default { + name: 'ReleasesSort', + components: { + GlSorting, + GlSortingItem, + }, + computed: { + ...mapState('list', { + orderBy: state => state.sorting.orderBy, + sort: state => state.sorting.sort, + }), + sortOptions() { + return SORT_OPTIONS; + }, + sortText() { + const option = this.sortOptions.find(s => s.orderBy === this.orderBy); + return option.label; + }, + isSortAscending() { + return this.sort === ASCENDING_ODER; + }, + }, + methods: { + ...mapActions('list', ['setSorting']), + onDirectionChange() { + const sort = this.isSortAscending ? DESCENDING_ORDER : ASCENDING_ODER; + this.setSorting({ sort }); + this.$emit('sort:changed'); + }, + onSortItemClick(item) { + this.setSorting({ orderBy: item }); + this.$emit('sort:changed'); + }, + isActiveSortItem(item) { + return this.orderBy === item; + }, + }, +}; +</script> + +<template> + <gl-sorting + :text="sortText" + :is-ascending="isSortAscending" + data-testid="releases-sort" + @sortDirectionChange="onDirectionChange" + > + <gl-sorting-item + v-for="item in sortOptions" + :key="item.orderBy" + :active="isActiveSortItem(item.orderBy)" + @click="onSortItemClick(item.orderBy)" + > + {{ item.label }} + </gl-sorting-item> + </gl-sorting> +</template> diff --git a/app/assets/javascripts/releases/constants.js b/app/assets/javascripts/releases/constants.js index 953e7b4189c..8979aa1394d 100644 --- a/app/assets/javascripts/releases/constants.js +++ b/app/assets/javascripts/releases/constants.js @@ -1,3 +1,5 @@ +import { __ } from '~/locale'; + export const MAX_MILESTONES_TO_DISPLAY = 5; export const BACK_URL_PARAM = 'back_url'; @@ -12,3 +14,19 @@ export const ASSET_LINK_TYPE = Object.freeze({ export const DEFAULT_ASSET_LINK_TYPE = ASSET_LINK_TYPE.OTHER; export const PAGE_SIZE = 20; + +export const ASCENDING_ODER = 'asc'; +export const DESCENDING_ORDER = 'desc'; +export const RELEASED_AT = 'released_at'; +export const CREATED_AT = 'created_at'; + +export const SORT_OPTIONS = [ + { + orderBy: RELEASED_AT, + label: __('Released date'), + }, + { + orderBy: CREATED_AT, + label: __('Created date'), + }, +]; diff --git a/app/assets/javascripts/releases/queries/all_releases.query.graphql b/app/assets/javascripts/releases/queries/all_releases.query.graphql index c35306f163d..a07dabb9fd6 100644 --- a/app/assets/javascripts/releases/queries/all_releases.query.graphql +++ b/app/assets/javascripts/releases/queries/all_releases.query.graphql @@ -1,8 +1,15 @@ #import "./release.fragment.graphql" -query allReleases($fullPath: ID!, $first: Int, $last: Int, $before: String, $after: String) { +query allReleases( + $fullPath: ID! + $first: Int + $last: Int + $before: String + $after: String + $sort: ReleaseSort +) { project(fullPath: $fullPath) { - releases(first: $first, last: $last, before: $before, after: $after) { + releases(first: $first, last: $last, before: $before, after: $after, sort: $sort) { nodes { ...Release } diff --git a/app/assets/javascripts/releases/queries/release.fragment.graphql b/app/assets/javascripts/releases/queries/release.fragment.graphql index 4e5f685be84..3a742db7d9e 100644 --- a/app/assets/javascripts/releases/queries/release.fragment.graphql +++ b/app/assets/javascripts/releases/queries/release.fragment.graphql @@ -4,6 +4,7 @@ fragment Release on Release { tagPath descriptionHtml releasedAt + createdAt upcomingRelease assets { count diff --git a/app/assets/javascripts/releases/stores/modules/list/actions.js b/app/assets/javascripts/releases/stores/modules/list/actions.js index 02e67415e63..a62f7c25464 100644 --- a/app/assets/javascripts/releases/stores/modules/list/actions.js +++ b/app/assets/javascripts/releases/stores/modules/list/actions.js @@ -42,6 +42,10 @@ export const fetchReleasesGraphQl = ( ) => { commit(types.REQUEST_RELEASES); + const { sort, orderBy } = state.sorting; + const orderByParam = orderBy === 'created_at' ? 'created' : orderBy; + const sortParams = `${orderByParam}_${sort}`.toUpperCase(); + let paginationParams; if (!before && !after) { paginationParams = { first: PAGE_SIZE }; @@ -60,6 +64,7 @@ export const fetchReleasesGraphQl = ( query: allReleasesQuery, variables: { fullPath: state.projectPath, + sort: sortParams, ...paginationParams, }, }) @@ -80,8 +85,10 @@ export const fetchReleasesGraphQl = ( export const fetchReleasesRest = ({ dispatch, commit, state }, { page }) => { commit(types.REQUEST_RELEASES); + const { sort, orderBy } = state.sorting; + api - .releases(state.projectId, { page }) + .releases(state.projectId, { page, sort, order_by: orderBy }) .then(({ data, headers }) => { const restPageInfo = parseIntPagination(normalizeHeaders(headers)); const camelCasedReleases = convertObjectPropsToCamelCase(data, { deep: true }); @@ -98,3 +105,5 @@ export const receiveReleasesError = ({ commit }) => { commit(types.RECEIVE_RELEASES_ERROR); createFlash(__('An error occurred while fetching the releases. Please try again.')); }; + +export const setSorting = ({ commit }, data) => commit(types.SET_SORTING, data); diff --git a/app/assets/javascripts/releases/stores/modules/list/mutation_types.js b/app/assets/javascripts/releases/stores/modules/list/mutation_types.js index a74bf15c515..669168efb88 100644 --- a/app/assets/javascripts/releases/stores/modules/list/mutation_types.js +++ b/app/assets/javascripts/releases/stores/modules/list/mutation_types.js @@ -1,3 +1,4 @@ export const REQUEST_RELEASES = 'REQUEST_RELEASES'; export const RECEIVE_RELEASES_SUCCESS = 'RECEIVE_RELEASES_SUCCESS'; export const RECEIVE_RELEASES_ERROR = 'RECEIVE_RELEASES_ERROR'; +export const SET_SORTING = 'SET_SORTING'; diff --git a/app/assets/javascripts/releases/stores/modules/list/mutations.js b/app/assets/javascripts/releases/stores/modules/list/mutations.js index 296487cfee2..e1aaa2e2a19 100644 --- a/app/assets/javascripts/releases/stores/modules/list/mutations.js +++ b/app/assets/javascripts/releases/stores/modules/list/mutations.js @@ -39,4 +39,8 @@ export default { state.restPageInfo = {}; state.graphQlPageInfo = {}; }, + + [types.SET_SORTING](state, sorting) { + state.sorting = { ...state.sorting, ...sorting }; + }, }; diff --git a/app/assets/javascripts/releases/stores/modules/list/state.js b/app/assets/javascripts/releases/stores/modules/list/state.js index 0bffaa0f9db..164a496d450 100644 --- a/app/assets/javascripts/releases/stores/modules/list/state.js +++ b/app/assets/javascripts/releases/stores/modules/list/state.js @@ -1,3 +1,5 @@ +import { DESCENDING_ORDER, RELEASED_AT } from '../../../constants'; + export default ({ projectId, projectPath, @@ -16,4 +18,8 @@ export default ({ releases: [], restPageInfo: {}, graphQlPageInfo: {}, + sorting: { + sort: DESCENDING_ORDER, + orderBy: RELEASED_AT, + }, }); |