From: Wouter Admiraal Date: Tue, 15 Aug 2023 07:32:41 +0000 (+0200) Subject: SONAR-20023 Update naming for facet fields to be compatible with api X-Git-Tag: 10.2.0.77647~173 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a932ac03d4cd9a3aae7bfc8c9e9a477e66116e27;p=sonarqube.git SONAR-20023 Update naming for facet fields to be compatible with api --- diff --git a/server/sonar-web/src/main/js/api/issues.ts b/server/sonar-web/src/main/js/api/issues.ts index 43191fea418..23e47c35d88 100644 --- a/server/sonar-web/src/main/js/api/issues.ts +++ b/server/sonar-web/src/main/js/api/issues.ts @@ -52,13 +52,6 @@ type FacetName = | 'types'; export function searchIssues(query: RequestData): Promise { - // TODO: Remove this before final merge. Needed because backend sends an error - if (query.facets) { - query.facets = query.facets - .replace(/cleanCodeAttributeCategory/, '') - .replace(/impactSoftwareQuality/, '') - .replace(/impactSeverity/, ''); - } return getJSON('/api/issues/search', query).catch(throwGlobalError); } diff --git a/server/sonar-web/src/main/js/api/mocks/IssuesServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/IssuesServiceMock.ts index fea034216dd..f40177f5444 100644 --- a/server/sonar-web/src/main/js/api/mocks/IssuesServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/IssuesServiceMock.ts @@ -270,7 +270,7 @@ export default class IssuesServiceMock { mockFacetDetailResponse = (query: RequestData): RawFacet[] => { const facets = (query.facets ?? '').split(','); const cleanCodeCategories: CleanCodeAttributeCategory[] = ( - query.cleanCodeAttributeCategory ?? Object.values(CleanCodeAttributeCategory).join(',') + query.cleanCodeAttributeCategories ?? Object.values(CleanCodeAttributeCategory).join(',') ).split(','); return facets.map((name: string): RawFacet => { if (name === 'owaspTop10-2021') { @@ -337,9 +337,9 @@ export default class IssuesServiceMock { types: ISSUE_TYPES, scopes: SOURCE_SCOPES.map(({ scope }) => scope), projects: ['org.project1', 'org.project2'], - impactSoftwareQuality: Object.values(SoftwareQuality), - impactSeverity: Object.values(SoftwareImpactSeverity), - cleanCodeAttributeCategory: cleanCodeCategories, + impactSoftwareQualities: Object.values(SoftwareQuality), + impactSeverities: Object.values(SoftwareImpactSeverity), + cleanCodeAttributeCategories: cleanCodeCategories, tags: ['unused', 'confusing'], rules: ['simpleRuleId', 'advancedRuleId', 'other'], assignees: ['email1@sonarsource.com', 'email2@sonarsource.com'], @@ -385,30 +385,30 @@ export default class IssuesServiceMock { // Filter list (only supports assignee, type and severity) const filteredList = this.list .filter((item) => { - if (!query.cleanCodeAttributeCategory) { + if (!query.cleanCodeAttributeCategories) { return true; } - return query.cleanCodeAttributeCategory + return query.cleanCodeAttributeCategories .split(',') .includes(item.issue.cleanCodeAttributeCategory); }) .filter((item) => { - if (!query.impactSoftwareQuality) { + if (!query.impactSoftwareQualities) { return true; } return item.issue.impacts.some(({ softwareQuality }) => - query.impactSoftwareQuality.split(',').includes(softwareQuality) + query.impactSoftwareQualities.split(',').includes(softwareQuality) ); }) .filter((item) => { - if (!query.impactSeverity) { + if (!query.impactSeverities) { return true; } return item.issue.impacts.some(({ severity }) => - query.impactSeverity.split(',').includes(severity) + query.impactSeverities.split(',').includes(severity) ); }) .filter((item) => { diff --git a/server/sonar-web/src/main/js/apps/issues/__tests__/utils-test.ts b/server/sonar-web/src/main/js/apps/issues/__tests__/utils-test.ts index 6546cbc0b20..6f9dd64af3e 100644 --- a/server/sonar-web/src/main/js/apps/issues/__tests__/utils-test.ts +++ b/server/sonar-web/src/main/js/apps/issues/__tests__/utils-test.ts @@ -42,9 +42,9 @@ describe('serialize/deserialize', () => { assigned: true, assignees: ['a', 'b'], author: ['a', 'b'], - cleanCodeAttributeCategory: [CleanCodeAttributeCategory.Responsible], - impactSeverity: [SoftwareImpactSeverity.High], - impactSoftwareQuality: [SoftwareQuality.Security], + cleanCodeAttributeCategories: [CleanCodeAttributeCategory.Responsible], + impactSeverities: [SoftwareImpactSeverity.High], + impactSoftwareQualities: [SoftwareQuality.Security], codeVariants: ['variant1', 'variant2'], createdAfter: new Date(1000000), createdAt: 'a', @@ -77,9 +77,9 @@ describe('serialize/deserialize', () => { ).toStrictEqual({ assignees: 'a,b', author: ['a', 'b'], - cleanCodeAttributeCategory: CleanCodeAttributeCategory.Responsible, - impactSeverity: SoftwareImpactSeverity.High, - impactSoftwareQuality: SoftwareQuality.Security, + cleanCodeAttributeCategories: CleanCodeAttributeCategory.Responsible, + impactSeverities: SoftwareImpactSeverity.High, + impactSoftwareQualities: SoftwareQuality.Security, codeVariants: 'variant1,variant2', createdAt: 'a', createdBefore: '1970-01-01', @@ -115,16 +115,16 @@ describe('serialize/deserialize', () => { assigned: 'true', assignees: 'first,second', author: ['author'], - cleanCodeAttributeCategory: 'CONSISTENT', - impactSeverity: 'LOW', + cleanCodeAttributeCategories: 'CONSISTENT', + impactSeverities: 'LOW', severities: 'CRITICAL,MAJOR', - impactSoftwareQuality: 'MAINTAINABILITY', + impactSoftwareQualities: 'MAINTAINABILITY', }) ).toStrictEqual({ assigned: true, assignees: ['first', 'second'], author: ['author'], - cleanCodeAttributeCategory: [CleanCodeAttributeCategory.Consistent], + cleanCodeAttributeCategories: [CleanCodeAttributeCategory.Consistent], codeVariants: [], createdAfter: undefined, createdAt: '', @@ -133,12 +133,12 @@ describe('serialize/deserialize', () => { cwe: [], directories: [], files: [], - impactSeverity: [ + impactSeverities: [ SoftwareImpactSeverity.Low, SoftwareImpactSeverity.High, SoftwareImpactSeverity.Medium, ], - impactSoftwareQuality: [SoftwareQuality.Maintainability], + impactSoftwareQualities: [SoftwareQuality.Maintainability], inNewCodePeriod: false, issues: [], languages: [], diff --git a/server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx b/server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx index f600c62e668..a89cac0e8c8 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx @@ -180,8 +180,8 @@ export class App extends React.PureComponent { query, SecurityStandard.OWASP_TOP10_2021 ), - cleanCodeAttributeCategory: true, - impactSoftwareQuality: true, + cleanCodeAttributeCategories: true, + impactSoftwareQualities: true, sonarsourceSecurity: shouldOpenSonarSourceSecurityFacet({}, query), standards: shouldOpenStandardsFacet({}, query), }, diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/AttributeCategoryFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/AttributeCategoryFacet.tsx index 4797ecb36ad..30ba17e814d 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/AttributeCategoryFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/AttributeCategoryFacet.tsx @@ -33,7 +33,7 @@ export function AttributeCategoryFacet(props: Props) { return ( -

{translate('issues.facet.impactSeverity.help.line1')}

-

{translate('issues.facet.impactSeverity.help.line2')}

+

{translate('issues.facet.impactSeverities.help.line1')}

+

{translate('issues.facet.impactSeverities.help.line2')}

} links={[ diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx index b9a274df52d..82f02d48729 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx @@ -183,24 +183,24 @@ export class SidebarClass extends React.PureComponent { )} @@ -208,12 +208,12 @@ export class SidebarClass extends React.PureComponent { {!needIssueSync && ( <> diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/SoftwareQualityFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/SoftwareQualityFacet.tsx index 2851cc06a60..fc829f08cc9 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/SoftwareQualityFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/SoftwareQualityFacet.tsx @@ -33,7 +33,7 @@ export function SoftwareQualityFacet(props: Props) { return ( { renderSidebar({ component: mockComponent({ qualifier: ComponentQualifier.Application }) }); expect(screen.getAllByRole('button').map((button) => button.textContent)).toStrictEqual([ - 'issues.facet.cleanCodeAttributeCategory', - 'issues.facet.impactSoftwareQuality', - 'issues.facet.impactSeveritytooltip_is_interactiveissues.facet.impactSeverity.help.line1issues.facet.impactSeverity.help.line2opens_in_new_windowlearn_more', + 'issues.facet.cleanCodeAttributeCategories', + 'issues.facet.impactSoftwareQualities', + 'issues.facet.impactSeveritiestooltip_is_interactiveissues.facet.impactSeverities.help.line1issues.facet.impactSeverities.help.line2opens_in_new_windowlearn_more', 'issues.facet.types', 'issues.facet.scopes', 'issues.facet.resolutions', @@ -55,9 +55,9 @@ it('should render correct facets for Portfolio', () => { renderSidebar({ component: mockComponent({ qualifier: ComponentQualifier.Portfolio }) }); expect(screen.getAllByRole('button').map((button) => button.textContent)).toStrictEqual([ - 'issues.facet.cleanCodeAttributeCategory', - 'issues.facet.impactSoftwareQuality', - 'issues.facet.impactSeveritytooltip_is_interactiveissues.facet.impactSeverity.help.line1issues.facet.impactSeverity.help.line2opens_in_new_windowlearn_more', + 'issues.facet.cleanCodeAttributeCategories', + 'issues.facet.impactSoftwareQualities', + 'issues.facet.impactSeveritiestooltip_is_interactiveissues.facet.impactSeverities.help.line1issues.facet.impactSeverities.help.line2opens_in_new_windowlearn_more', 'issues.facet.types', 'issues.facet.scopes', 'issues.facet.resolutions', @@ -78,9 +78,9 @@ it('should render correct facets for SubPortfolio', () => { renderSidebar({ component: mockComponent({ qualifier: ComponentQualifier.SubPortfolio }) }); expect(screen.getAllByRole('button').map((button) => button.textContent)).toStrictEqual([ - 'issues.facet.cleanCodeAttributeCategory', - 'issues.facet.impactSoftwareQuality', - 'issues.facet.impactSeveritytooltip_is_interactiveissues.facet.impactSeverity.help.line1issues.facet.impactSeverity.help.line2opens_in_new_windowlearn_more', + 'issues.facet.cleanCodeAttributeCategories', + 'issues.facet.impactSoftwareQualities', + 'issues.facet.impactSeveritiestooltip_is_interactiveissues.facet.impactSeverities.help.line1issues.facet.impactSeverities.help.line2opens_in_new_windowlearn_more', 'issues.facet.types', 'issues.facet.scopes', 'issues.facet.resolutions', diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/SimpleListStyleFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/SimpleListStyleFacet-test.tsx index 35b4dbf5c16..35890aa9839 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/SimpleListStyleFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/SimpleListStyleFacet-test.tsx @@ -27,7 +27,7 @@ import { SimpleListStyleFacet } from '../SimpleListStyleFacet'; it('handles single & multiple selections', async () => { const user = userEvent.setup(); - renderSidebar(); + renderSimpleListStyleFacet(); const firstCheckbox = byRole('checkbox', { name: 'prefix.first' }).get(); const secondCheckbox = byRole('checkbox', { name: 'prefix.second' }).get(); @@ -52,7 +52,7 @@ it('handles single & multiple selections', async () => { expect(secondCheckbox).not.toBeChecked(); }); -function renderSidebar(props: Partial> = {}) { +function renderSimpleListStyleFacet(props: Partial> = {}) { function Wrapper(props: Partial> = {}) { const [selectedItems, setItems] = React.useState([]); @@ -62,12 +62,12 @@ function renderSidebar(props: Partial> = {} fetching={false} needIssueSync={false} onToggle={jest.fn()} - property="impactSeverity" + property="impactSeverities" itemNamePrefix="prefix" listItems={['first', 'second', 'third']} stats={{ first: 1, second: 2 }} {...props} - onChange={(query) => setItems(query.impactSeverity ?? [])} + onChange={(query) => setItems(query.impactSeverities ?? [])} selectedItems={selectedItems} /> ); diff --git a/server/sonar-web/src/main/js/apps/issues/test-utils.tsx b/server/sonar-web/src/main/js/apps/issues/test-utils.tsx index 6fba1751ba3..0079ffca4b2 100644 --- a/server/sonar-web/src/main/js/apps/issues/test-utils.tsx +++ b/server/sonar-web/src/main/js/apps/issues/test-utils.tsx @@ -78,15 +78,15 @@ export const ui = { tagFacet: byRole('button', { name: 'issues.facet.tags' }), typeFacet: byRole('button', { name: 'issues.facet.types' }), cleanCodeAttributeCategoryFacet: byRole('button', { - name: 'issues.facet.cleanCodeAttributeCategory', + name: 'issues.facet.cleanCodeAttributeCategories', }), softwareQualityFacet: byRole('button', { - name: 'issues.facet.impactSoftwareQuality', + name: 'issues.facet.impactSoftwareQualities', }), - severityFacet: byRole('button', { name: 'issues.facet.impactSeverity' }), + severityFacet: byRole('button', { name: 'issues.facet.impactSeverities' }), - clearCodeCategoryFacet: byTestId('clear-issues.facet.cleanCodeAttributeCategory'), - clearSoftwareQualityFacet: byTestId('clear-issues.facet.impactSoftwareQuality'), + clearCodeCategoryFacet: byTestId('clear-issues.facet.cleanCodeAttributeCategories'), + clearSoftwareQualityFacet: byTestId('clear-issues.facet.impactSoftwareQualities'), clearAssigneeFacet: byTestId('clear-issues.facet.assignees'), clearAuthorFacet: byTestId('clear-issues.facet.authors'), clearCodeVariantsFacet: byTestId('clear-issues.facet.codeVariants'), @@ -96,7 +96,7 @@ export const ui = { clearResolutionFacet: byTestId('clear-issues.facet.resolutions'), clearRuleFacet: byTestId('clear-issues.facet.rules'), clearScopeFacet: byTestId('clear-issues.facet.scopes'), - clearSeverityFacet: byTestId('clear-issues.facet.impactSeverity'), + clearSeverityFacet: byTestId('clear-issues.facet.impactSeverities'), clearStatusFacet: byTestId('clear-issues.facet.statuses'), clearTagFacet: byTestId('clear-issues.facet.tags'), diff --git a/server/sonar-web/src/main/js/apps/issues/utils.ts b/server/sonar-web/src/main/js/apps/issues/utils.ts index e2344d58013..83a0507cc38 100644 --- a/server/sonar-web/src/main/js/apps/issues/utils.ts +++ b/server/sonar-web/src/main/js/apps/issues/utils.ts @@ -51,7 +51,7 @@ export interface Query { assigned: boolean; assignees: string[]; author: string[]; - cleanCodeAttributeCategory: CleanCodeAttributeCategory[]; + cleanCodeAttributeCategories: CleanCodeAttributeCategory[]; codeVariants: string[]; createdAfter: Date | undefined; createdAt: string; @@ -60,8 +60,8 @@ export interface Query { cwe: string[]; directories: string[]; files: string[]; - impactSeverity: SoftwareImpactSeverity[]; - impactSoftwareQuality: SoftwareQuality[]; + impactSeverities: SoftwareImpactSeverity[]; + impactSoftwareQualities: SoftwareQuality[]; issues: string[]; languages: string[]; owaspTop10: string[]; @@ -95,8 +95,8 @@ export function parseQuery(query: RawQuery): Query { assigned: parseAsBoolean(query.assigned), assignees: parseAsArray(query.assignees, parseAsString), author: isArray(query.author) ? query.author : [query.author].filter(isDefined), - cleanCodeAttributeCategory: parseAsArray( - query.cleanCodeAttributeCategory, + cleanCodeAttributeCategories: parseAsArray( + query.cleanCodeAttributeCategories, parseAsString ), createdAfter: parseAsDate(query.createdAfter), @@ -106,9 +106,9 @@ export function parseQuery(query: RawQuery): Query { cwe: parseAsArray(query.cwe, parseAsString), directories: parseAsArray(query.directories, parseAsString), files: parseAsArray(query.files, parseAsString), - impactSeverity: parseImpactSeverityQuery(query.impactSeverity, query.severities), - impactSoftwareQuality: parseAsArray( - query.impactSoftwareQuality, + impactSeverities: parseImpactSeverityQuery(query.impactSeverities, query.severities), + impactSoftwareQualities: parseAsArray( + query.impactSoftwareQualities, parseAsString ), inNewCodePeriod: parseAsBoolean(query.inNewCodePeriod, false), @@ -174,7 +174,7 @@ export function serializeQuery(query: Query): RawQuery { assigned: query.assigned ? undefined : 'false', assignees: serializeStringArray(query.assignees), author: query.author, - cleanCodeAttributeCategory: serializeStringArray(query.cleanCodeAttributeCategory), + cleanCodeAttributeCategories: serializeStringArray(query.cleanCodeAttributeCategories), createdAfter: serializeDateShort(query.createdAfter), createdAt: serializeString(query.createdAt), createdBefore: serializeDateShort(query.createdBefore), @@ -197,8 +197,8 @@ export function serializeQuery(query: Query): RawQuery { s: serializeString(query.sort), scopes: serializeStringArray(query.scopes), severities: undefined, - impactSeverity: serializeStringArray(query.impactSeverity), - impactSoftwareQuality: serializeStringArray(query.impactSoftwareQuality), + impactSeverities: serializeStringArray(query.impactSeverities), + impactSoftwareQualities: serializeStringArray(query.impactSoftwareQualities), inNewCodePeriod: query.inNewCodePeriod ? 'true' : undefined, sonarsourceSecurity: serializeStringArray(query.sonarsourceSecurity), statuses: serializeStringArray(query.statuses), diff --git a/server/sonar-web/src/main/js/components/SourceViewer/helpers/__tests__/__snapshots__/loadIssues-test.ts.snap b/server/sonar-web/src/main/js/components/SourceViewer/helpers/__tests__/__snapshots__/loadIssues-test.ts.snap index 698b7a9aab1..20f82563531 100644 --- a/server/sonar-web/src/main/js/components/SourceViewer/helpers/__tests__/__snapshots__/loadIssues-test.ts.snap +++ b/server/sonar-web/src/main/js/components/SourceViewer/helpers/__tests__/__snapshots__/loadIssues-test.ts.snap @@ -10,8 +10,6 @@ exports[`loadIssues should load issues with listIssues if re-indexing 1`] = ` ], "assignee": "luke", "author": "luke@sonarsource.com", - "cleanCodeAttribute": "LAWFUL", - "cleanCodeAttributeCategory": "RESPONSIBLE", "comments": [], "component": "foo.java", "componentEnabled": true, @@ -24,12 +22,6 @@ exports[`loadIssues should load issues with listIssues if re-indexing 1`] = ` "flows": [], "flowsWithType": [], "hash": "78417dcee7ba927b7e7c9161e29e02b8", - "impacts": [ - { - "severity": "HIGH", - "softwareQuality": "MAINTAINABILITY", - }, - ], "key": "AWaqVGl3tut9VbnJvk6M", "line": 62, "message": "Make sure this file handling is safe here.", @@ -75,8 +67,6 @@ exports[`loadIssues should load issues with searchIssues if not re-indexing 1`] "assigneeLogin": "luke", "assigneeName": "Luke", "author": "luke@sonarsource.com", - "cleanCodeAttribute": "LAWFUL", - "cleanCodeAttributeCategory": "RESPONSIBLE", "comments": [], "component": "foo.java", "componentEnabled": true, @@ -89,12 +79,6 @@ exports[`loadIssues should load issues with searchIssues if not re-indexing 1`] "flows": [], "flowsWithType": [], "hash": "78417dcee7ba927b7e7c9161e29e02b8", - "impacts": [ - { - "severity": "HIGH", - "softwareQuality": "MAINTAINABILITY", - }, - ], "key": "AWaqVGl3tut9VbnJvk6M", "line": 62, "message": "Make sure this file handling is safe here.", diff --git a/server/sonar-web/src/main/js/components/issue/__tests__/Issue-it.tsx b/server/sonar-web/src/main/js/components/issue/__tests__/Issue-it.tsx index 50bce2d40af..b99f1ced825 100644 --- a/server/sonar-web/src/main/js/components/issue/__tests__/Issue-it.tsx +++ b/server/sonar-web/src/main/js/components/issue/__tests__/Issue-it.tsx @@ -59,7 +59,7 @@ describe('rendering', () => { expect(ui.effort('2 days').get()).toBeInTheDocument(); expect(ui.issueMessageLink.get()).toHaveAttribute( 'href', - '/issues?scopes=MAIN&impactSeverities=MINOR&types=VULNERABILITY&open=AVsae-CQS-9G3txfbFN2' + '/issues?scopes=MAIN&impactSeverities=LOW&types=VULNERABILITY&open=AVsae-CQS-9G3txfbFN2' ); await ui.clickIssueMessage(); @@ -411,7 +411,7 @@ function renderIssue( } return renderAppRoutes( - 'issues?scopes=MAIN&impactSeverity=LOW&types=VULNERABILITY', + 'issues?scopes=MAIN&impactSeverities=LOW&types=VULNERABILITY', () => ( = {}): Query { assigned: false, assignees: [], author: [], - cleanCodeAttributeCategory: [], + cleanCodeAttributeCategories: [], codeVariants: [], createdAfter: undefined, createdAt: '', @@ -104,8 +104,8 @@ export function mockQuery(overrides: Partial = {}): Query { rules: [], scopes: [], severities: [], - impactSeverity: [], - impactSoftwareQuality: [], + impactSeverities: [], + impactSoftwareQualities: [], inNewCodePeriod: false, sonarsourceSecurity: [], sort: '', diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index 75c058e9e81..f930730bd56 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -1165,8 +1165,8 @@ issues.facet.tags=Tag issues.facet.rules=Rule issues.facet.resolutions=Resolution issues.facet.languages=Language -issues.facet.cleanCodeAttributeCategory=Clean Code Attribute -issues.facet.impactSoftwareQuality=Software Quality +issues.facet.cleanCodeAttributeCategories=Clean Code Attribute +issues.facet.impactSoftwareQualities=Software Quality issues.facet.codeVariants=Code Variant issues.facet.createdAt=Creation Date issues.facet.createdAt.all=All @@ -1175,9 +1175,9 @@ issues.facet.createdAt.last_month=Last month issues.facet.createdAt.last_year=Last year issues.facet.createdAt.bar_description={0} issues from {1} to {2} issues.facet.authors=Author -issues.facet.impactSeverity=Severity -issues.facet.impactSeverity.help.line1=Severities are now directly tied to the software quality impacted. This means that one software quality impacted has one severity. -issues.facet.impactSeverity.help.line2=There are three only 3 levels: high, medium, and low. +issues.facet.impactSeverities=Severity +issues.facet.impactSeverities.help.line1=Severities are now directly tied to the software quality impacted. This means that one software quality impacted has one severity. +issues.facet.impactSeverities.help.line2=There are three only 3 levels: high, medium, and low. issues.facet.issues=Issue Key issues.facet.mode=Display Mode issues.facet.mode.count=Issues