diff --git a/ui/src/Components/Grid/AlertGrid/index.js b/ui/src/Components/Grid/AlertGrid/index.js
index a4cb10ac5..5a498e7ea 100644
--- a/ui/src/Components/Grid/AlertGrid/index.js
+++ b/ui/src/Components/Grid/AlertGrid/index.js
@@ -10,6 +10,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCircleNotch } from "@fortawesome/free-solid-svg-icons/faCircleNotch";
import { AlertStore } from "Stores/AlertStore";
+import { Settings } from "Stores/Settings";
import { AlertGroup } from "./AlertGroup";
import { GridSizesConfig } from "./Constants";
@@ -18,7 +19,8 @@ import "./index.css";
const AlertGrid = observer(
class AlertGrid extends Component {
static propTypes = {
- alertStore: PropTypes.instanceOf(AlertStore).isRequired
+ alertStore: PropTypes.instanceOf(AlertStore).isRequired,
+ settingsStore: PropTypes.instanceOf(Settings).isRequired
};
// store reference to generated masonry component so we can call it
@@ -70,7 +72,7 @@ const AlertGrid = observer(
}
render() {
- const { alertStore } = this.props;
+ const { alertStore, settingsStore } = this.props;
return (
@@ -102,6 +104,7 @@ const AlertGrid = observer(
alertStore.data.upstreams.instances.length > 1
}
afterUpdate={this.masonryRepack}
+ settingsStore={settingsStore}
/>
))}
diff --git a/ui/src/Components/Grid/index.js b/ui/src/Components/Grid/index.js
index e629afc89..c175f1446 100644
--- a/ui/src/Components/Grid/index.js
+++ b/ui/src/Components/Grid/index.js
@@ -4,6 +4,7 @@ import PropTypes from "prop-types";
import { observer } from "mobx-react";
import { AlertStore } from "Stores/AlertStore";
+import { Settings } from "Stores/Settings";
import { AlertGrid } from "./AlertGrid";
import { FatalError } from "./FatalError";
import { UpstreamError } from "./UpstreamError";
@@ -11,11 +12,12 @@ import { UpstreamError } from "./UpstreamError";
const Grid = observer(
class Grid extends Component {
static propTypes = {
- alertStore: PropTypes.instanceOf(AlertStore).isRequired
+ alertStore: PropTypes.instanceOf(AlertStore).isRequired,
+ settingsStore: PropTypes.instanceOf(Settings).isRequired
};
render() {
- const { alertStore } = this.props;
+ const { alertStore, settingsStore } = this.props;
if (alertStore.status.error) {
return ;
@@ -33,7 +35,7 @@ const Grid = observer(
/>
))}
-
+
);
}
diff --git a/ui/src/Components/MainModal/Configuration/AlertGroupConfiguration.js b/ui/src/Components/MainModal/Configuration/AlertGroupConfiguration.js
new file mode 100644
index 000000000..3f80f46a4
--- /dev/null
+++ b/ui/src/Components/MainModal/Configuration/AlertGroupConfiguration.js
@@ -0,0 +1,61 @@
+import React, { Component } from "react";
+import PropTypes from "prop-types";
+
+import { observable, action, toJS } from "mobx";
+import { observer } from "mobx-react";
+
+import InputRange from "react-input-range";
+
+import { Settings } from "Stores/Settings";
+
+import "./InputRange.css";
+
+const AlertGroupConfiguration = observer(
+ class AlertGroupConfiguration extends Component {
+ static propTypes = {
+ settingsStore: PropTypes.instanceOf(Settings).isRequired
+ };
+
+ constructor(props) {
+ super(props);
+
+ this.config = observable({
+ defaultRenderCount: toJS(
+ props.settingsStore.alertGroupConfig.config.defaultRenderCount
+ )
+ });
+ }
+
+ onChange = action(value => {
+ this.config.defaultRenderCount = value;
+ });
+
+ onChangeComplete = action(value => {
+ const { settingsStore } = this.props;
+
+ settingsStore.alertGroupConfig.update({ defaultRenderCount: value });
+ });
+
+ render() {
+ return (
+
+
+ Default number of alerts to show per group
+
+
+
+ );
+ }
+ }
+);
+
+export { AlertGroupConfiguration };
diff --git a/ui/src/Components/MainModal/Configuration.js b/ui/src/Components/MainModal/Configuration/FetchConfiguration.js
similarity index 57%
rename from ui/src/Components/MainModal/Configuration.js
rename to ui/src/Components/MainModal/Configuration/FetchConfiguration.js
index edab86199..7fdd68d74 100644
--- a/ui/src/Components/MainModal/Configuration.js
+++ b/ui/src/Components/MainModal/Configuration/FetchConfiguration.js
@@ -8,10 +8,10 @@ import InputRange from "react-input-range";
import { Settings } from "Stores/Settings";
-import "./Configuration.css";
+import "./InputRange.css";
-const Configuration = observer(
- class Configuration extends Component {
+const FetchConfiguration = observer(
+ class FetchConfiguration extends Component {
static propTypes = {
settingsStore: PropTypes.instanceOf(Settings).isRequired
};
@@ -40,24 +40,22 @@ const Configuration = observer(
render() {
return (
-
+
+ Refresh interval
+
+
);
}
}
);
-export { Configuration };
+export { FetchConfiguration };
diff --git a/ui/src/Components/MainModal/Configuration.css b/ui/src/Components/MainModal/Configuration/InputRange.css
similarity index 100%
rename from ui/src/Components/MainModal/Configuration.css
rename to ui/src/Components/MainModal/Configuration/InputRange.css
diff --git a/ui/src/Components/MainModal/Configuration.scss b/ui/src/Components/MainModal/Configuration/InputRange.scss
similarity index 100%
rename from ui/src/Components/MainModal/Configuration.scss
rename to ui/src/Components/MainModal/Configuration/InputRange.scss
diff --git a/ui/src/Components/MainModal/Configuration/index.js b/ui/src/Components/MainModal/Configuration/index.js
new file mode 100644
index 000000000..d7dc6af4f
--- /dev/null
+++ b/ui/src/Components/MainModal/Configuration/index.js
@@ -0,0 +1,19 @@
+import React from "react";
+import PropTypes from "prop-types";
+
+import { Settings } from "Stores/Settings";
+import { FetchConfiguration } from "./FetchConfiguration";
+import { AlertGroupConfiguration } from "./AlertGroupConfiguration";
+
+const Configuration = ({ settingsStore }) => (
+
+);
+Configuration.propTypes = {
+ settingsStore: PropTypes.instanceOf(Settings).isRequired
+};
+
+export { Configuration };
diff --git a/ui/src/Stores/Settings.js b/ui/src/Stores/Settings.js
index 3e53dd987..c838533f3 100644
--- a/ui/src/Stores/Settings.js
+++ b/ui/src/Stores/Settings.js
@@ -32,10 +32,25 @@ class FetchConfig {
});
}
+class AlertGroupConfig {
+ config = localStored(
+ "alertGroupConfig",
+ { defaultRenderCount: 5 },
+ { delay: 100 }
+ );
+
+ update = action(data => {
+ for (const [key, val] of Object.entries(data)) {
+ this.config[key] = val;
+ }
+ });
+}
+
class Settings {
constructor() {
this.savedFilters = new SavedFilters();
this.fetchConfig = new FetchConfig();
+ this.alertGroupConfig = new AlertGroupConfig();
}
}