]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10853 align ux for deprecated and internal flags on web api page
authorStas Vilchik <stas.vilchik@sonarsource.com>
Wed, 19 Dec 2018 10:52:49 +0000 (11:52 +0100)
committerSonarTech <sonartech@sonarsource.com>
Fri, 21 Dec 2018 19:21:01 +0000 (20:21 +0100)
server/sonar-web/src/main/js/apps/web-api/components/Action.tsx
server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx
server/sonar-web/src/main/js/apps/web-api/components/__tests__/__snapshots__/Action-test.tsx.snap
server/sonar-web/src/main/js/apps/web-api/utils.ts
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index c0e65191ee8945acc3a5ecb9c4b4c2cdc17626ed..fb7baf5f0a76976cc0b1ab474725e77ae63de73c 100644 (file)
@@ -25,7 +25,7 @@ import ResponseExample from './ResponseExample';
 import ActionChangelog from './ActionChangelog';
 import DeprecatedBadge from './DeprecatedBadge';
 import InternalBadge from './InternalBadge';
-import { getActionKey } from '../utils';
+import { getActionKey, serializeQuery } from '../utils';
 import LinkIcon from '../../../components/icons-components/LinkIcon';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 
@@ -133,7 +133,13 @@ export default class Action extends React.PureComponent<Props, State> {
         <header className="web-api-action-header boxed-group-header">
           <Link
             className="spacer-right link-no-underline"
-            to={{ pathname: '/web_api/' + actionKey }}>
+            to={{
+              pathname: '/web_api/' + actionKey,
+              query: serializeQuery({
+                deprecated: Boolean(action.deprecatedSince),
+                internal: Boolean(action.internal)
+              })
+            }}>
             <LinkIcon />
           </Link>
 
index 8cb09db5f21894f3306b27f93124852a908b599c..ce164dd22b35a01c7feef14966ba5a43328c37dd 100644 (file)
@@ -57,7 +57,7 @@ class WebApiApp extends React.PureComponent<Props, State> {
   }
 
   componentDidUpdate() {
-    this.toggleInternalInitially();
+    this.enforceFlags();
     this.scrollToAction();
   }
 
@@ -100,21 +100,20 @@ class WebApiApp extends React.PureComponent<Props, State> {
     this.props.router.push({ pathname: this.props.location.pathname, query });
   };
 
-  toggleInternalInitially() {
+  enforceFlags() {
     const splat = this.props.params.splat || '';
     const { domains } = this.state;
     const query = parseQuery(this.props.location.query);
 
-    if (!query.internal && splat) {
-      const domain = domains.find(domain => domain.path.startsWith(splat));
-      if (domain) {
-        let action;
-        if (domain.path !== splat) {
-          action = domain.actions.find(action => getActionKey(domain.path, action.key) === splat);
-        }
-        if (domain.internal || (action && action.internal)) {
-          this.updateQuery({ internal: true });
-        }
+    const domain = domains.find(domain => splat.startsWith(domain.path));
+    if (domain) {
+      const action = domain.actions.find(action => getActionKey(domain.path, action.key) === splat);
+      const internal = Boolean(!query.internal && (domain.internal || (action && action.internal)));
+      const deprecated = Boolean(
+        !query.deprecated && (domain.deprecatedSince || (action && action.deprecatedSince))
+      );
+      if (internal || deprecated) {
+        this.updateQuery({ internal, deprecated });
       }
     }
   }
@@ -123,27 +122,29 @@ class WebApiApp extends React.PureComponent<Props, State> {
     this.updateQuery({ search });
   };
 
-  handleToggleInternal = () => {
+  toggleFlag(flag: 'deprecated' | 'internal', domainFlag: 'deprecatedSince' | 'internal') {
     const splat = this.props.params.splat || '';
     const { domains } = this.state;
     const domain = domains.find(domain => isDomainPathActive(domain.path, splat));
     const query = parseQuery(this.props.location.query);
-    const internal = !query.internal;
+    const value = !query[flag];
 
-    if (domain && domain.internal && !internal) {
+    if (domain && domain[domainFlag] && !value) {
       this.props.router.push({
         pathname: '/web_api',
-        query: { ...serializeQuery(query), internal: false }
+        query: serializeQuery({ ...query, [flag]: false })
       });
-      return;
+    } else {
+      this.updateQuery({ [flag]: value });
     }
+  }
 
-    this.updateQuery({ internal });
+  handleToggleInternal = () => {
+    this.toggleFlag('internal', 'internal');
   };
 
   handleToggleDeprecated = () => {
-    const query = parseQuery(this.props.location.query);
-    this.updateQuery({ deprecated: !query.deprecated });
+    this.toggleFlag('deprecated', 'deprecatedSince');
   };
 
   render() {
@@ -202,9 +203,9 @@ function getLatestDeprecatedAction(domain: Pick<T.WebApi.Domain, 'actions'>) {
   );
   const latestDeprecation =
     allActionsDeprecated &&
-    (maxBy(domain.actions, action => {
+    maxBy(domain.actions, action => {
       const version = (action.deprecatedSince && parseVersion(action.deprecatedSince)) || noVersion;
       return version.major * 1024 + version.minor;
-    }) as T.WebApi.Action);
+    });
   return latestDeprecation || undefined;
 }
index ac543cd86e35ecadb3db0deeeeeb3c1cb29dd560..5d5142d1c66a88cbb82db1817300a9cd77c282a1 100644 (file)
@@ -104,6 +104,7 @@ exports[`should render correctly 1`] = `
       to={
         Object {
           "pathname": "/web_api/foo/foo",
+          "query": Object {},
         }
       }
     >
index c4058d5c27d676d7414c11c6f9ec0c4775e7256e..e060cd557ddaf21b2a70f6d68043f323621714ea 100644 (file)
@@ -72,7 +72,7 @@ export const parseQuery = memoize(
 );
 
 export const serializeQuery = memoize(
-  (query: Query): RawQuery =>
+  (query: Partial<Query>): RawQuery =>
     cleanQuery({
       query: query.search ? serializeString(query.search) : undefined,
       deprecated: query.deprecated || undefined,
index 4048b41092133a1917652e27ec5d4a03df528373..5d9e42082a1919bc1afcc8bfd767e502e0a49bcb 100644 (file)
@@ -81,6 +81,7 @@ info=Info
 issue=Issue
 issues=Issues
 inheritance=Inheritance
+internal=internal
 key=Key
 language=Language
 last_analysis=Last Analysis