From 09664d3d491159cc70689fd03e4d4910e2cca4ea Mon Sep 17 00:00:00 2001 From: Chen Charnolevsky Date: Sun, 29 Jun 2025 22:41:31 +0300 Subject: [PATCH 1/7] Add grouping option to the key of the filtered-search + FF called security_inventory_filtering --- .../filtered_search_bar/constants.js | 11 ++ .../javascripts/vue_shared/constants.js | 5 + ...nventory_dashboard_filtered_search_bar.vue | 163 +++++++++++++++++- .../components/tokens/custom_title_option.vue | 19 ++ .../components/tokens/generic_token.vue | 24 +++ .../components/tokens/header_options.vue | 20 +++ .../security_inventory/constants.js | 30 +++- .../groups/security/inventory_controller.rb | 1 + .../beta/security_inventory_filtering.yml | 10 ++ ...tory_dashboard_filtered_search_bar_spec.js | 52 +++++- .../tokens/custom_title_option_spec.js | 53 ++++++ .../components/tokens/generic_token_spec.js | 39 +++++ .../components/tokens/header_options_spec.js | 42 +++++ locale/gitlab.pot | 51 ++++++ 14 files changed, 510 insertions(+), 10 deletions(-) create mode 100644 ee/app/assets/javascripts/security_inventory/components/tokens/custom_title_option.vue create mode 100644 ee/app/assets/javascripts/security_inventory/components/tokens/generic_token.vue create mode 100644 ee/app/assets/javascripts/security_inventory/components/tokens/header_options.vue create mode 100644 ee/config/feature_flags/beta/security_inventory_filtering.yml create mode 100644 ee/spec/frontend/security_inventory/components/tokens/custom_title_option_spec.js create mode 100644 ee/spec/frontend/security_inventory/components/tokens/generic_token_spec.js create mode 100644 ee/spec/frontend/security_inventory/components/tokens/header_options_spec.js diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js index 016e3c4546b965..13e0a9a36f5522 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js @@ -21,12 +21,23 @@ export const OPERATOR_AFTER = '≥'; export const OPERATOR_AFTER_TEXT = __('on or after'); export const OPERATOR_BEFORE = '<'; export const OPERATOR_BEFORE_TEXT = __('before'); +export const OPERATOR_BIGGER_THAN_OR_EQUAL = '=>'; +export const OPERATOR_BIGGER_THAN_OR_EQUAL_TEXT = __('bigger than'); +export const OPERATOR_LESS_THAN_OR_EQUAL = '=<'; +export const OPERATOR_LESS_THAN_OR_EQUAL_TEXT = __('lower than'); export const OPERATORS_IS = [{ value: OPERATOR_IS, description: OPERATOR_IS_TEXT }]; export const OPERATORS_NOT = [{ value: OPERATOR_NOT, description: OPERATOR_NOT_TEXT }]; export const OPERATORS_OR = [{ value: OPERATOR_OR, description: OPERATOR_OR_TEXT }]; export const OPERATORS_AFTER = [{ value: OPERATOR_AFTER, description: OPERATOR_AFTER_TEXT }]; export const OPERATORS_BEFORE = [{ value: OPERATOR_BEFORE, description: OPERATOR_BEFORE_TEXT }]; +export const OPERATORS_BIGGER_THAN_OR_EQUAL = [ + { value: OPERATOR_BIGGER_THAN_OR_EQUAL, description: OPERATOR_BIGGER_THAN_OR_EQUAL_TEXT }, +]; +export const OPERATORS_LESS_THAN_OR_EQUAL = [ + { value: OPERATOR_LESS_THAN_OR_EQUAL, description: OPERATOR_LESS_THAN_OR_EQUAL_TEXT }, +]; + export const OPERATORS_IS_NOT = [...OPERATORS_IS, ...OPERATORS_NOT]; export const OPERATORS_IS_NOT_OR = [...OPERATORS_IS, ...OPERATORS_NOT, ...OPERATORS_OR]; export const OPERATORS_AFTER_BEFORE = [...OPERATORS_AFTER, ...OPERATORS_BEFORE]; diff --git a/app/assets/javascripts/vue_shared/constants.js b/app/assets/javascripts/vue_shared/constants.js index 81e179630ba7cb..4c5db3e5339c64 100644 --- a/app/assets/javascripts/vue_shared/constants.js +++ b/app/assets/javascripts/vue_shared/constants.js @@ -116,6 +116,7 @@ export const SEVERITY_LEVEL_UNKNOWN = 'unknown'; export const SEVERITY_LEVEL_MEDIUM = 'medium'; export const SEVERITY_LEVEL_LOW = 'low'; export const SEVERITY_LEVEL_INFO = 'info'; +export const SEVERITY_LEVEL_ANY_SEVERITY = 'any_severity'; export const SEVERITY_LEVELS = { [SEVERITY_LEVEL_CRITICAL]: s__('severity|Critical'), @@ -125,3 +126,7 @@ export const SEVERITY_LEVELS = { [SEVERITY_LEVEL_INFO]: s__('severity|Info'), [SEVERITY_LEVEL_UNKNOWN]: s__('severity|Unknown'), }; + +export const SEVERITY_LEVELS_ANY_SEVERITY = { + [SEVERITY_LEVEL_ANY_SEVERITY]: s__('severity|Any severity'), +}; diff --git a/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue b/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue index 8d5891905c29a8..2f2225975bbbde 100644 --- a/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue +++ b/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue @@ -1,13 +1,60 @@ diff --git a/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js b/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js index 8cde7c45e1a196..7cc3ca52022cfd 100644 --- a/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js +++ b/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js @@ -1,7 +1,7 @@ import { shallowMount } from '@vue/test-utils'; import { nextTick } from 'vue'; +import { GlFilteredSearchToken } from '@gitlab/ui'; import InventoryDashboardFilteredSearchBar from 'ee/security_inventory/components/inventory_dashboard_filtered_search_bar.vue'; -import GenericToken from 'ee/security_inventory/components/tokens/generic_token.vue'; import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue'; import { queryToObject } from '~/lib/utils/url_utility'; import HeaderOptions from 'ee/security_inventory/components/tokens/header_options.vue'; @@ -159,8 +159,15 @@ describe('InventoryDashboardFilteredSearchBar', () => { }); describe('when `securityInventoryFiltering` is enabled', () => { - it('renders all tokens', () => { + it('renders all tokens', async () => { createComponent({ securityInventoryFiltering: true }); + findFilteredSearch().vm.$emit('onInput', [ + { + type: 'filtered-search-term', + value: { data: '' }, + }, + ]); + await nextTick(); expect(findFilteredSearch().props('tokens')).toMatchObject( expect.arrayContaining([ expect.objectContaining( @@ -168,12 +175,12 @@ describe('InventoryDashboardFilteredSearchBar', () => { type: 'vulnerability-count-', title: 'Vulnerability count', optionComponent: HeaderOptions, - customKey: { hasComponent: true }, + customKey: { useOptionComponentForKey: true }, }, { type: 'vulnerability-count-critical', title: 'Vulnerability count critical', - token: GenericToken, + token: GlFilteredSearchToken, unique: true, optionComponent: customTitleOption, operators: [ -- GitLab From 437d10f32f31c946aff4684ac558c1de2e1ed3c5 Mon Sep 17 00:00:00 2001 From: Chen Charnolevsky Date: Thu, 10 Jul 2025 14:35:44 +0300 Subject: [PATCH 6/7] CR changes --- .../components/inventory_dashboard_filtered_search_bar.vue | 7 +++---- .../inventory_dashboard_filtered_search_bar_spec.js | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue b/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue index efc98fae8eba38..04e911bedfdc3d 100644 --- a/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue +++ b/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue @@ -129,20 +129,19 @@ export default { type: TOKEN_PREFIXES.VULNERABILITY_COUNT, title: s__('SecurityInventory|Vulnerability count'), optionComponent: HeaderOptions, - customKey: { useOptionComponentForKey: true }, + customKey: { component: HeaderOptions }, }, ...this.vulnerabilityCountKeys, { type: 'divider', title: s__('SecurityInventory|Divider'), optionComponent: GlDropdownDivider, - customKey: { useOptionComponentForKey: true }, + customKey: { component: GlDropdownDivider }, }, { type: TOKEN_PREFIXES.TOOL_COVERAGE, title: s__('SecurityInventory|Tool coverage'), - optionComponent: HeaderOptions, - customKey: { useOptionComponentForKey: true }, + customKey: { component: HeaderOptions }, }, ...this.toolCoverageKeys, ]; diff --git a/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js b/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js index 7cc3ca52022cfd..9fbe6867f9301a 100644 --- a/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js +++ b/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js @@ -174,8 +174,7 @@ describe('InventoryDashboardFilteredSearchBar', () => { { type: 'vulnerability-count-', title: 'Vulnerability count', - optionComponent: HeaderOptions, - customKey: { useOptionComponentForKey: true }, + customKey: { component: HeaderOptions }, }, { type: 'vulnerability-count-critical', -- GitLab From f24827424012ccf51e0d0565f24b90d9828ceb2c Mon Sep 17 00:00:00 2001 From: Chen Charnolevsky Date: Sun, 20 Jul 2025 18:43:34 +0300 Subject: [PATCH 7/7] CR changes --- .../filtered_search_bar/constants.js | 8 +- .../javascripts/vue_shared/constants.js | 6 +- ...nventory_dashboard_filtered_search_bar.vue | 100 ++++++++++++------ .../components/tokens/custom_title_option.vue | 2 +- ...tory_dashboard_filtered_search_bar_spec.js | 4 +- .../tokens/custom_title_option_spec.js | 12 +-- locale/gitlab.pot | 14 +-- 7 files changed, 90 insertions(+), 56 deletions(-) diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js index 13e0a9a36f5522..0733e9ab1b1826 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js @@ -21,10 +21,10 @@ export const OPERATOR_AFTER = '≥'; export const OPERATOR_AFTER_TEXT = __('on or after'); export const OPERATOR_BEFORE = '<'; export const OPERATOR_BEFORE_TEXT = __('before'); -export const OPERATOR_BIGGER_THAN_OR_EQUAL = '=>'; -export const OPERATOR_BIGGER_THAN_OR_EQUAL_TEXT = __('bigger than'); -export const OPERATOR_LESS_THAN_OR_EQUAL = '=<'; -export const OPERATOR_LESS_THAN_OR_EQUAL_TEXT = __('lower than'); +export const OPERATOR_BIGGER_THAN_OR_EQUAL = '>='; +export const OPERATOR_BIGGER_THAN_OR_EQUAL_TEXT = __('greater than or equal'); +export const OPERATOR_LESS_THAN_OR_EQUAL = '<='; +export const OPERATOR_LESS_THAN_OR_EQUAL_TEXT = __('less than or equal'); export const OPERATORS_IS = [{ value: OPERATOR_IS, description: OPERATOR_IS_TEXT }]; export const OPERATORS_NOT = [{ value: OPERATOR_NOT, description: OPERATOR_NOT_TEXT }]; diff --git a/app/assets/javascripts/vue_shared/constants.js b/app/assets/javascripts/vue_shared/constants.js index 4c5db3e5339c64..9ba865fe068a9b 100644 --- a/app/assets/javascripts/vue_shared/constants.js +++ b/app/assets/javascripts/vue_shared/constants.js @@ -116,7 +116,7 @@ export const SEVERITY_LEVEL_UNKNOWN = 'unknown'; export const SEVERITY_LEVEL_MEDIUM = 'medium'; export const SEVERITY_LEVEL_LOW = 'low'; export const SEVERITY_LEVEL_INFO = 'info'; -export const SEVERITY_LEVEL_ANY_SEVERITY = 'any_severity'; +export const SEVERITY_LEVEL_ANY = 'any'; export const SEVERITY_LEVELS = { [SEVERITY_LEVEL_CRITICAL]: s__('severity|Critical'), @@ -127,6 +127,6 @@ export const SEVERITY_LEVELS = { [SEVERITY_LEVEL_UNKNOWN]: s__('severity|Unknown'), }; -export const SEVERITY_LEVELS_ANY_SEVERITY = { - [SEVERITY_LEVEL_ANY_SEVERITY]: s__('severity|Any severity'), +export const SEVERITY_LEVELS_ANY = { + [SEVERITY_LEVEL_ANY]: s__('severity|Any'), }; diff --git a/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue b/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue index 04e911bedfdc3d..380e55a73529c0 100644 --- a/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue +++ b/ee/app/assets/javascripts/security_inventory/components/inventory_dashboard_filtered_search_bar.vue @@ -15,7 +15,7 @@ import { SCANNER_FILTER_LABELS, } from 'ee/security_inventory/constants'; import { s__, sprintf } from '~/locale'; -import { SEVERITY_LEVELS_ANY_SEVERITY, SEVERITY_LEVELS } from '~/vue_shared/constants'; +import { SEVERITY_LEVELS, SEVERITY_LEVELS_ANY } from '~/vue_shared/constants'; import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import customTitleOption from './tokens/custom_title_option.vue'; import HeaderOptions from './tokens/header_options.vue'; @@ -26,12 +26,12 @@ const TOKEN_PREFIXES = { }; const TOKEN_TYPES_TO_LABELS = { - [TOKEN_PREFIXES.VULNERABILITY_COUNT]: { ...SEVERITY_LEVELS, ...SEVERITY_LEVELS_ANY_SEVERITY }, + [TOKEN_PREFIXES.VULNERABILITY_COUNT]: { ...SEVERITY_LEVELS, ...SEVERITY_LEVELS_ANY }, [TOKEN_PREFIXES.TOOL_COVERAGE]: SCANNER_FILTER_LABELS, }; const VULNERABILITY_COUNT_TYPES = { - ANY_SEVERITY: `${TOKEN_PREFIXES.VULNERABILITY_COUNT}any-severity`, + ANY: `${TOKEN_PREFIXES.VULNERABILITY_COUNT}any`, CRITICAL: `${TOKEN_PREFIXES.VULNERABILITY_COUNT}critical`, HIGH: `${TOKEN_PREFIXES.VULNERABILITY_COUNT}high`, MEDIUM: `${TOKEN_PREFIXES.VULNERABILITY_COUNT}medium`, @@ -82,28 +82,27 @@ export default { return this.glFeatures.securityInventoryFiltering; }, vulnerabilityCountKeys() { - return [ - ...Object.entries(SEVERITY_LEVELS), - ...Object.entries(SEVERITY_LEVELS_ANY_SEVERITY), - ].map(([level, key]) => { - return { - type: VULNERABILITY_COUNT_TYPES[level.toUpperCase()], - title: sprintf(s__('SecurityInventory|Vulnerability count %{level}'), { - level: key.toLowerCase(), - }), - token: GlFilteredSearchToken, - unique: true, - optionComponent: customTitleOption, - operators: [ - ...OPERATORS_LESS_THAN_OR_EQUAL, - ...OPERATORS_IS, - ...OPERATORS_BIGGER_THAN_OR_EQUAL, - ], - customKey: { - title: key, - }, - }; - }); + return [...Object.entries(SEVERITY_LEVELS), ...Object.entries(SEVERITY_LEVELS_ANY)].map( + ([level, key]) => { + return { + type: VULNERABILITY_COUNT_TYPES[level.toUpperCase()], + title: sprintf(s__('SecurityInventory|Vulnerability count %{level}'), { + level: key.toLowerCase(), + }), + token: GlFilteredSearchToken, + unique: true, + optionComponent: customTitleOption, + operators: [ + ...OPERATORS_LESS_THAN_OR_EQUAL, + ...OPERATORS_IS, + ...OPERATORS_BIGGER_THAN_OR_EQUAL, + ], + customKeyToken: { + title: key, + }, + }; + }, + ); }, toolCoverageKeys() { return Object.entries(SCANNER_FILTER_LABELS).map(([tool, key]) => { @@ -129,19 +128,19 @@ export default { type: TOKEN_PREFIXES.VULNERABILITY_COUNT, title: s__('SecurityInventory|Vulnerability count'), optionComponent: HeaderOptions, - customKey: { component: HeaderOptions }, + customKeyToken: { component: HeaderOptions }, }, ...this.vulnerabilityCountKeys, { type: 'divider', title: s__('SecurityInventory|Divider'), optionComponent: GlDropdownDivider, - customKey: { component: GlDropdownDivider }, + customKeyToken: { component: GlDropdownDivider }, }, { type: TOKEN_PREFIXES.TOOL_COVERAGE, title: s__('SecurityInventory|Tool coverage'), - customKey: { component: HeaderOptions }, + customKeyToken: { component: HeaderOptions }, }, ...this.toolCoverageKeys, ]; @@ -178,8 +177,22 @@ export default { // when user search in the search bar this.searchValue = this.getSearchValue(searchedTokens); if (this.searchValue !== '') { - return !Object.values(TOKEN_TYPES_TO_LABELS[type]).some((title) => - title.toLowerCase().includes(this.searchValue.toLowerCase()), + const originalLabels = Object.values(TOKEN_TYPES_TO_LABELS[type]); + + // filter out labels based on existing searched tokens + const filteredLabels = originalLabels.filter( + (label) => + !searchedTokens.some( + (searchedToken) => + searchedToken.type.includes(type) && + searchedToken.type.includes(label.toLowerCase()), + ), + ); + + return ( + !filteredLabels.filter((title) => + title.toLowerCase().includes(this.searchValue.toLowerCase()), + ).length > 0 ); } @@ -198,11 +211,32 @@ export default { .map((prefix) => TOKEN_TYPES_TO_LABELS[prefix]) .map(Object.values); + // filter out labels based on existing searched tokens + const filteredFirstLabels = firstLabels.filter( + (label) => + !searchedTokens.some( + (searchedToken) => + childrenTypes.includes(searchedToken.type) && + searchedToken.type.includes(label.toLowerCase()), + ), + ); + + const filteredSecondLabels = secondLabels.filter( + (label) => + !searchedTokens.some( + (searchedToken) => + childrenTypes.includes(searchedToken.type) && + searchedToken.type.includes(label.toLowerCase()), + ), + ); + return !( - firstLabels.some((label) => + filteredFirstLabels.some((label) => label.toLowerCase().includes(this.searchValue.toLowerCase()), ) && - secondLabels.some((label) => label.toLowerCase().includes(this.searchValue.toLowerCase())) + filteredSecondLabels.some((label) => + label.toLowerCase().includes(this.searchValue.toLowerCase()), + ) ); } @@ -231,7 +265,7 @@ export default { return anyPrefixFullySelected; }, disableRegularToken(availableToken, searchedTokens) { - const titleToCheck = availableToken.customKey?.title || availableToken.title; + const titleToCheck = availableToken.customKeyToken?.title || availableToken.title; // when user search in the search bar this.searchValue = this.getSearchValue(searchedTokens); diff --git a/ee/app/assets/javascripts/security_inventory/components/tokens/custom_title_option.vue b/ee/app/assets/javascripts/security_inventory/components/tokens/custom_title_option.vue index 8873cc8ce20c42..80ac13054fd998 100644 --- a/ee/app/assets/javascripts/security_inventory/components/tokens/custom_title_option.vue +++ b/ee/app/assets/javascripts/security_inventory/components/tokens/custom_title_option.vue @@ -8,7 +8,7 @@ export default { }, computed: { title() { - return this.option?.customKey?.title || this.option?.title; + return this.option?.customKeyToken?.title || this.option?.title; }, }, }; diff --git a/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js b/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js index 9fbe6867f9301a..0d16d805ebb808 100644 --- a/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js +++ b/ee/spec/frontend/security_inventory/components/inventory_dashboard_filtered_search_bar_spec.js @@ -174,7 +174,7 @@ describe('InventoryDashboardFilteredSearchBar', () => { { type: 'vulnerability-count-', title: 'Vulnerability count', - customKey: { component: HeaderOptions }, + customKeyToken: { component: HeaderOptions }, }, { type: 'vulnerability-count-critical', @@ -187,7 +187,7 @@ describe('InventoryDashboardFilteredSearchBar', () => { ...OPERATORS_IS, ...OPERATORS_BIGGER_THAN_OR_EQUAL, ], - customKey: { + customKeyToken: { title: 'critical', }, }, diff --git a/ee/spec/frontend/security_inventory/components/tokens/custom_title_option_spec.js b/ee/spec/frontend/security_inventory/components/tokens/custom_title_option_spec.js index a70818b5c220bb..34faeac1a5e46a 100644 --- a/ee/spec/frontend/security_inventory/components/tokens/custom_title_option_spec.js +++ b/ee/spec/frontend/security_inventory/components/tokens/custom_title_option_spec.js @@ -7,7 +7,7 @@ describe('CustomTitleOption', () => { const createComponent = (props = {}) => { wrapper = shallowMount(CustomTitleOption, { propsData: { - option: { title: 'Original Title', customKey: { title: 'Custom Title' } }, + option: { title: 'Original Title', customKeyToken: { title: 'Custom Title' } }, ...props, }, }); @@ -22,14 +22,14 @@ describe('CustomTitleOption', () => { expect(wrapper.text()).toBe('Original Title'); }); - it('renders customKey title when available', () => { + it('renders customKeyToken title when available', () => { createComponent(); expect(wrapper.text()).toBe('Custom Title'); }); - it('renders customKey when title not exists', () => { + it('renders customKeyToken when title not exists', () => { const option = { - customKey: { title: 'Custom Title' }, + customKeyToken: { title: 'Custom Title' }, }; createComponent({ option }); expect(wrapper.text()).toBe('Custom Title'); @@ -41,10 +41,10 @@ describe('CustomTitleOption', () => { expect(wrapper.text()).toBe(''); }); - it('renders customKey title when customKey exists but title is undefined', () => { + it('renders customKeyToken title when customKeyToken exists but title is undefined', () => { const option = { title: 'Original Title', - customKey: { title: undefined }, + customKeyToken: { title: undefined }, }; createComponent({ option }); expect(wrapper.text()).toBe('Original Title'); diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 21214945cba2a8..2a7d588593611a 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -73888,9 +73888,6 @@ msgstr "" msgid "before" msgstr "" -msgid "bigger than" -msgstr "" - msgid "blocks" msgstr "" @@ -74703,6 +74700,9 @@ msgstr[1] "" msgid "frontmatter" msgstr "" +msgid "greater than or equal" +msgstr "" + msgid "group" msgstr "" @@ -74996,6 +74996,9 @@ msgstr "" msgid "less than a minute" msgstr "" +msgid "less than or equal" +msgstr "" + msgid "level: %{level}" msgstr "" @@ -75021,9 +75024,6 @@ msgstr "" msgid "locked by %{path_lock_user_name} %{created_at}" msgstr "" -msgid "lower than" -msgstr "" - msgid "main" msgstr "" @@ -75951,7 +75951,7 @@ msgstr "" msgid "service accounts" msgstr "" -msgid "severity|Any severity" +msgid "severity|Any" msgstr "" msgid "severity|Blocker" -- GitLab