debian-mirror-gitlab/app/assets/javascripts/search/sidebar/components/scope_navigation.vue

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

88 lines
2.4 KiB
Vue
Raw Normal View History

2023-01-13 00:05:48 +05:30
<script>
2023-03-04 22:38:38 +05:30
import { GlNav, GlNavItem, GlIcon } from '@gitlab/ui';
2023-01-13 00:05:48 +05:30
import { mapActions, mapState } from 'vuex';
2023-03-04 22:38:38 +05:30
import { formatNumber, s__ } from '~/locale';
2023-01-13 00:05:48 +05:30
import Tracking from '~/tracking';
2023-03-04 22:38:38 +05:30
import {
NAV_LINK_DEFAULT_CLASSES,
NUMBER_FORMATING_OPTIONS,
NAV_LINK_COUNT_DEFAULT_CLASSES,
} from '../constants';
2023-01-13 00:05:48 +05:30
export default {
name: 'ScopeNavigation',
2023-03-04 22:38:38 +05:30
i18n: {
countOverLimitLabel: s__('GlobalSearch|Result count is over limit.'),
},
2023-01-13 00:05:48 +05:30
components: {
GlNav,
GlNavItem,
2023-03-04 22:38:38 +05:30
GlIcon,
2023-01-13 00:05:48 +05:30
},
mixins: [Tracking.mixin()],
computed: {
...mapState(['navigation', 'urlQuery']),
},
created() {
this.fetchSidebarCount();
},
methods: {
...mapActions(['fetchSidebarCount']),
showFormatedCount(count) {
if (!count) {
return '0';
}
const countNumber = parseInt(count.replace(/,/g, ''), 10);
return formatNumber(countNumber, NUMBER_FORMATING_OPTIONS);
},
2023-03-04 22:38:38 +05:30
isCountOverLimit(count) {
return count.includes('+');
},
2023-01-13 00:05:48 +05:30
handleClick(scope) {
this.track('click_menu_item', { label: `vertical_navigation_${scope}` });
},
2023-03-04 22:38:38 +05:30
linkClasses(isHighlighted) {
return [...this.$options.NAV_LINK_DEFAULT_CLASSES, { 'gl-font-weight-bold': isHighlighted }];
},
countClasses(isHighlighted) {
2023-01-13 00:05:48 +05:30
return [
2023-03-04 22:38:38 +05:30
...this.$options.NAV_LINK_COUNT_DEFAULT_CLASSES,
isHighlighted ? 'gl-text-gray-900' : 'gl-text-gray-500',
2023-01-13 00:05:48 +05:30
];
},
2023-03-04 22:38:38 +05:30
isActive(scope, index) {
return this.urlQuery.scope ? this.urlQuery.scope === scope : index === 0;
},
2023-01-13 00:05:48 +05:30
},
NAV_LINK_DEFAULT_CLASSES,
2023-03-04 22:38:38 +05:30
NAV_LINK_COUNT_DEFAULT_CLASSES,
2023-01-13 00:05:48 +05:30
};
</script>
<template>
<nav data-testid="search-filter">
<gl-nav vertical pills>
<gl-nav-item
v-for="(item, scope, index) in navigation"
:key="scope"
2023-03-04 22:38:38 +05:30
:link-classes="linkClasses(isActive(scope, index))"
2023-01-13 00:05:48 +05:30
class="gl-mb-1"
:href="item.link"
2023-03-04 22:38:38 +05:30
:active="isActive(scope, index)"
2023-01-13 00:05:48 +05:30
@click="handleClick(scope)"
><span>{{ item.label }}</span
2023-03-04 22:38:38 +05:30
><span v-if="item.count" :class="countClasses(isActive(scope, index))">
{{ showFormatedCount(item.count)
}}<gl-icon
v-if="isCountOverLimit(item.count)"
name="plus"
:aria-label="$options.i18n.countOverLimitLabel"
:size="8"
/>
2023-01-13 00:05:48 +05:30
</span>
</gl-nav-item>
</gl-nav>
<hr class="gl-mt-5 gl-mb-0 gl-border-gray-100 gl-md-display-none" />
</nav>
</template>