AlertListStore.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { types, getEnv, flow } from 'mobx-state-tree';
  2. import { AlertRule as AlertRuleModel } from './AlertRule';
  3. import { setStateFields } from './helpers';
  4. type AlertRuleType = typeof AlertRuleModel.Type;
  5. export interface AlertRule extends AlertRuleType {}
  6. export const AlertListStore = types
  7. .model('AlertListStore', {
  8. rules: types.array(AlertRuleModel),
  9. stateFilter: types.optional(types.string, 'all'),
  10. search: types.optional(types.string, ''),
  11. })
  12. .views(self => ({
  13. get filteredRules() {
  14. let regex = new RegExp(self.search, 'i');
  15. return self.rules.filter(alert => {
  16. return regex.test(alert.name) || regex.test(alert.stateText) || regex.test(alert.info);
  17. });
  18. },
  19. }))
  20. .actions(self => ({
  21. loadRules: flow(function* load(filters) {
  22. const backendSrv = getEnv(self).backendSrv;
  23. self.stateFilter = filters.state; // store state filter used in api query
  24. const apiRules = yield backendSrv.get('/api/alerts', filters);
  25. self.rules.clear();
  26. for (let rule of apiRules) {
  27. setStateFields(rule, rule.state);
  28. if (rule.state !== 'paused') {
  29. if (rule.executionError) {
  30. rule.info = 'Execution Error: ' + rule.executionError;
  31. }
  32. if (rule.evalData && rule.evalData.noData) {
  33. rule.info = 'Query returned no data';
  34. }
  35. }
  36. self.rules.push(AlertRuleModel.create(rule));
  37. }
  38. }),
  39. setSearchQuery(query: string) {
  40. self.search = query;
  41. },
  42. }));