aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/apps/issues/actions.ts
blob: 76da57eb2fe0a571006fb0124ee24475bd230a28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 * SonarQube
 * Copyright (C) 2009-2018 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 { State } from './components/App';
import { allLocationsEmpty } from './utils';

export function enableLocationsNavigator(state: State) {
  const { openIssue, selectedLocationIndex } = state;
  if (openIssue && (openIssue.secondaryLocations.length > 0 || openIssue.flows.length > 0)) {
    const selectedFlowIndex =
      state.selectedFlowIndex || (openIssue.flows.length > 0 ? 0 : undefined);

    if (!allLocationsEmpty(openIssue, selectedFlowIndex)) {
      return {
        locationsNavigator: true,
        selectedFlowIndex,
        // Also reset index = -1 to 0, we don't want to start on the issue when enabling the location navigator
        selectedLocationIndex:
          !selectedLocationIndex || selectedLocationIndex < 0 ? 0 : selectedLocationIndex
      };
    }
  }
  return null;
}

export function disableLocationsNavigator() {
  return { locationsNavigator: false };
}

export function selectLocation(nextIndex: number | undefined) {
  return (state: State) => {
    const { selectedLocationIndex: index, openIssue } = state;
    if (openIssue) {
      if (!state.locationsNavigator) {
        if (nextIndex !== undefined) {
          return { locationsNavigator: true, selectedLocationIndex: nextIndex };
        }
      } else if (index !== undefined) {
        // disable locations when selecting (clicking) the same location
        return {
          locationsNavigator: nextIndex !== index,
          selectedLocationIndex: nextIndex
        };
      }
    }
    return null;
  };
}

export function selectNextLocation(state: State) {
  const { selectedFlowIndex, selectedLocationIndex: index, openIssue } = state;
  if (openIssue) {
    const locations =
      selectedFlowIndex !== undefined
        ? openIssue.flows[selectedFlowIndex]
        : openIssue.secondaryLocations;
    const lastLocationIdx = locations.length - 1;
    if (index === lastLocationIdx) {
      // -1 to jump back to the issue itself
      return { selectedLocationIndex: -1 };
    }
    return {
      selectedLocationIndex: index !== undefined && index < lastLocationIdx ? index + 1 : index
    };
  }
  return null;
}

export function selectPreviousLocation(state: State) {
  const { selectedFlowIndex, selectedLocationIndex: index, openIssue } = state;
  if (openIssue) {
    if (index === -1) {
      const locations =
        selectedFlowIndex !== undefined
          ? openIssue.flows[selectedFlowIndex]
          : openIssue.secondaryLocations;
      const lastLocationIdx = locations.length - 1;
      return { selectedLocationIndex: lastLocationIdx };
    }
    return { selectedLocationIndex: index !== undefined && index > 0 ? index - 1 : index };
  }
  return null;
}

export function selectFlow(nextIndex?: number) {
  return () => {
    return { selectedFlowIndex: nextIndex, selectedLocationIndex: 0 };
  };
}

export function selectNextFlow(state: State) {
  const { openIssue, selectedFlowIndex } = state;
  if (
    openIssue &&
    selectedFlowIndex !== undefined &&
    openIssue.flows.length > selectedFlowIndex + 1
  ) {
    return { selectedFlowIndex: selectedFlowIndex + 1, selectedLocationIndex: 0 };
  }
  return null;
}

export function selectPreviousFlow(state: State) {
  const { openIssue, selectedFlowIndex } = state;
  if (openIssue && selectedFlowIndex !== undefined && selectedFlowIndex > 0) {
    return { selectedFlowIndex: selectedFlowIndex - 1, selectedLocationIndex: 0 };
  }
  return null;
}