reducers.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { AlertRuleDTO, AlertRule, AlertRulesState } from 'app/types';
  2. import { Action, ActionTypes } from './actions';
  3. import alertDef from './alertDef';
  4. import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
  5. export const initialState: AlertRulesState = { items: [], searchQuery: '', isLoading: false };
  6. function convertToAlertRule(rule, state): AlertRule {
  7. const stateModel = alertDef.getStateDisplayModel(state);
  8. rule.stateText = stateModel.text;
  9. rule.stateIcon = stateModel.iconClass;
  10. rule.stateClass = stateModel.stateClass;
  11. rule.stateAge = dateTime(rule.newStateDate)
  12. .fromNow()
  13. .replace(' ago', '');
  14. if (rule.state !== 'paused') {
  15. if (rule.executionError) {
  16. rule.info = 'Execution Error: ' + rule.executionError;
  17. }
  18. if (rule.evalData && rule.evalData.noData) {
  19. rule.info = 'Query returned no data';
  20. }
  21. }
  22. return rule;
  23. }
  24. export const alertRulesReducer = (state = initialState, action: Action): AlertRulesState => {
  25. switch (action.type) {
  26. case ActionTypes.LoadAlertRules: {
  27. return { ...state, isLoading: true };
  28. }
  29. case ActionTypes.LoadedAlertRules: {
  30. const alertRules: AlertRuleDTO[] = action.payload;
  31. const alertRulesViewModel: AlertRule[] = alertRules.map(rule => {
  32. return convertToAlertRule(rule, rule.state);
  33. });
  34. return { ...state, items: alertRulesViewModel, isLoading: false };
  35. }
  36. case ActionTypes.SetSearchQuery:
  37. return { ...state, searchQuery: action.payload };
  38. }
  39. return state;
  40. };
  41. export default {
  42. alertRules: alertRulesReducer,
  43. };