From: Grégoire Aubert Date: Thu, 2 May 2019 13:22:48 +0000 (+0200) Subject: SONAR-11955 Fix travis error 'lodash/flatten' doesn't exist X-Git-Tag: 7.8~284 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=1e4bc11f4515f0239d43abe9531bbac3a69cfd00;p=sonarqube.git SONAR-11955 Fix travis error 'lodash/flatten' doesn't exist --- diff --git a/server/sonar-web/src/main/js/apps/documentation/components/Menu.tsx b/server/sonar-web/src/main/js/apps/documentation/components/Menu.tsx index 188eba9e078..07e5c42e5ea 100644 --- a/server/sonar-web/src/main/js/apps/documentation/components/Menu.tsx +++ b/server/sonar-web/src/main/js/apps/documentation/components/Menu.tsx @@ -19,14 +19,14 @@ */ import * as React from 'react'; import { DocNavigationItem } from 'Docs/@types/types'; +import MenuBlock from './MenuBlock'; +import { MenuItem } from './MenuItem'; +import { MenuExternalLink } from './MenuExternalLink'; import { isDocsNavigationBlock, isDocsNavigationExternalLink, getOpenChainFromPath -} from 'Docs/components/navTreeUtils'; -import MenuBlock from './MenuBlock'; -import { MenuItem } from './MenuItem'; -import { MenuExternalLink } from './MenuExternalLink'; +} from '../navTreeUtils'; import { DocumentationEntry, getNodeFromUrl } from '../utils'; interface Props { diff --git a/server/sonar-web/src/main/js/apps/documentation/components/MenuBlock.tsx b/server/sonar-web/src/main/js/apps/documentation/components/MenuBlock.tsx index 0a350e98ce3..8b3f500ead4 100644 --- a/server/sonar-web/src/main/js/apps/documentation/components/MenuBlock.tsx +++ b/server/sonar-web/src/main/js/apps/documentation/components/MenuBlock.tsx @@ -20,11 +20,11 @@ import * as React from 'react'; import * as classNames from 'classnames'; import { DocsNavigationBlock, DocNavigationItem } from 'Docs/@types/types'; -import { isDocsNavigationBlock } from 'Docs/components/navTreeUtils'; import { MenuItem } from './MenuItem'; +import { isDocsNavigationBlock } from '../navTreeUtils'; +import { DocumentationEntry, getNodeFromUrl } from '../utils'; import OpenCloseIcon from '../../../components/icons-components/OpenCloseIcon'; import { ButtonLink } from '../../../components/ui/buttons'; -import { DocumentationEntry, getNodeFromUrl } from '../utils'; interface Props { block: DocsNavigationBlock; diff --git a/server/sonar-web/src/main/js/apps/documentation/components/MenuItem.tsx b/server/sonar-web/src/main/js/apps/documentation/components/MenuItem.tsx index 61a82f4ca0a..688175c0dc8 100644 --- a/server/sonar-web/src/main/js/apps/documentation/components/MenuItem.tsx +++ b/server/sonar-web/src/main/js/apps/documentation/components/MenuItem.tsx @@ -20,7 +20,7 @@ import * as React from 'react'; import * as classNames from 'classnames'; import { Link } from 'react-router'; -import { testPathAgainstUrl } from 'Docs/components/navTreeUtils'; +import { testPathAgainstUrl } from '../navTreeUtils'; import { DocumentationEntry } from '../utils'; interface Props { diff --git a/server/sonar-web/src/main/js/apps/documentation/components/SearchResults.tsx b/server/sonar-web/src/main/js/apps/documentation/components/SearchResults.tsx index 70756e20ab0..909a80e9123 100644 --- a/server/sonar-web/src/main/js/apps/documentation/components/SearchResults.tsx +++ b/server/sonar-web/src/main/js/apps/documentation/components/SearchResults.tsx @@ -20,9 +20,9 @@ import * as React from 'react'; import lunr, { LunrBuilder, LunrIndex, LunrToken } from 'lunr'; import { sortBy } from 'lodash'; -import { getUrlsList } from 'Docs/components/navTreeUtils'; import { DocNavigationItem } from 'Docs/@types/types'; import SearchResultEntry, { SearchResult } from './SearchResultEntry'; +import { getUrlsList } from '../navTreeUtils'; import { DocumentationEntry } from '../utils'; interface Props { diff --git a/server/sonar-web/src/main/js/apps/documentation/navTreeUtils.ts b/server/sonar-web/src/main/js/apps/documentation/navTreeUtils.ts new file mode 100644 index 00000000000..963d8a0aedd --- /dev/null +++ b/server/sonar-web/src/main/js/apps/documentation/navTreeUtils.ts @@ -0,0 +1,94 @@ +/* + * SonarQube + * Copyright (C) 2009-2019 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import { flatten } from 'lodash'; +import { + DocNavigationItem, + DocsNavigationBlock, + DocsNavigationExternalLink +} from 'Docs/@types/types'; +import NavigationTree from 'Docs/../static/SonarQubeNavigationTree.json'; + +export function getNavTree() { + return NavigationTree as DocNavigationItem[]; +} + +export function getUrlsList(navTree: DocNavigationItem[]): string[] { + return flatten( + navTree.map(leaf => { + if (isDocsNavigationBlock(leaf)) { + return getUrlsList(leaf.children); + } + if (isDocsNavigationExternalLink(leaf)) { + return [leaf.url]; + } + return [leaf]; + }) + ); +} + +export function getOpenChainFromPath(pathname: string, navTree: DocNavigationItem[]) { + let chain: DocNavigationItem[] = []; + + let found = false; + const walk = (leaf: DocNavigationItem, parents: DocNavigationItem[] = []) => { + if (found) { + return; + } + + parents = parents.concat(leaf); + + if (isDocsNavigationBlock(leaf)) { + leaf.children.forEach(child => { + if (typeof child === 'string' && testPathAgainstUrl(child, pathname)) { + chain = parents.concat(child); + found = true; + } else { + walk(child, parents); + } + }); + } else if (typeof leaf === 'string' && testPathAgainstUrl(leaf, pathname)) { + chain = parents; + found = true; + } + }; + + navTree.forEach(leaf => walk(leaf)); + + return chain; +} + +export function isDocsNavigationBlock(leaf?: DocNavigationItem): leaf is DocsNavigationBlock { + return typeof leaf === 'object' && (leaf as DocsNavigationBlock).children !== undefined; +} + +export function isDocsNavigationExternalLink( + leaf?: DocNavigationItem +): leaf is DocsNavigationExternalLink { + return typeof leaf === 'object' && (leaf as DocsNavigationExternalLink).url !== undefined; +} + +export function testPathAgainstUrl(path: string, url: string) { + const leadingRegEx = /^\//; + const trailingRegEx = /\/$/; + return ( + path.replace(leadingRegEx, '').replace(trailingRegEx, '') === + url.replace(leadingRegEx, '').replace(trailingRegEx, '') + ); +}