From 179ab17e4ce0b19b9d56708093a852f183937a0d Mon Sep 17 00:00:00 2001
From: Tom Robinson <tlrobinson@gmail.com>
Date: Fri, 14 Apr 2017 16:10:41 -0700
Subject: [PATCH] Add 'warnings' support to settings. Implement for email
 'corrections'

---
 frontend/src/metabase/admin/admin.js              |  2 ++
 .../settings/components/SettingsEmailForm.jsx     | 15 +++++++++++----
 .../admin/settings/components/SettingsSetting.jsx |  3 +++
 frontend/src/metabase/admin/settings/selectors.js | 10 +++++++++-
 frontend/src/metabase/admin/settings/settings.js  | 15 +++++++++++++--
 5 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/frontend/src/metabase/admin/admin.js b/frontend/src/metabase/admin/admin.js
index 6e8a68eff7d..3fafa57f7ed 100644
--- a/frontend/src/metabase/admin/admin.js
+++ b/frontend/src/metabase/admin/admin.js
@@ -6,6 +6,7 @@ import people from "metabase/admin/people/people";
 import databases from "metabase/admin/databases/database";
 import datamodel from "metabase/admin/datamodel/datamodel";
 import permissions from "metabase/admin/permissions/permissions";
+import settings from "metabase/admin/settings/settings";
 
 import { combineReducers } from "metabase/lib/redux";
 
@@ -14,4 +15,5 @@ export default combineReducers({
     datamodel,
     people,
     permissions,
+    settings
 })
diff --git a/frontend/src/metabase/admin/settings/components/SettingsEmailForm.jsx b/frontend/src/metabase/admin/settings/components/SettingsEmailForm.jsx
index de3639693cb..a74be885760 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsEmailForm.jsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsEmailForm.jsx
@@ -31,12 +31,19 @@ export default class SettingsEmailForm extends Component {
 
     componentWillMount() {
         // this gives us an opportunity to load up our formData with any existing values for elements
+        this.updateFormData(this.props);
+    }
+
+    componentWillReceiveProps(nextProps) {
+        this.updateFormData(nextProps);
+    }
+
+    updateFormData(props) {
         let formData = {};
-        this.props.elements.forEach(function(element) {
+        for (const element of props.elements) {
             formData[element.key] = element.value;
-        });
-
-        this.setState({formData});
+        }
+        this.setState({ formData });
     }
 
     componentDidMount() {
diff --git a/frontend/src/metabase/admin/settings/components/SettingsSetting.jsx b/frontend/src/metabase/admin/settings/components/SettingsSetting.jsx
index 8e5498b759b..998b5a826fc 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsSetting.jsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsSetting.jsx
@@ -45,6 +45,9 @@ export default class SettingsSetting extends Component {
                 { errorMessage &&
                     <div className="text-error text-bold pt1">{errorMessage}</div>
                 }
+                { setting.warning &&
+                    <div className="text-gold text-bold pt1">{setting.warning}</div>
+                }
             </li>
         );
     }
diff --git a/frontend/src/metabase/admin/settings/selectors.js b/frontend/src/metabase/admin/settings/selectors.js
index 7d58874a02b..1303d13df83 100644
--- a/frontend/src/metabase/admin/settings/selectors.js
+++ b/frontend/src/metabase/admin/settings/selectors.js
@@ -270,7 +270,15 @@ for (const section of SECTIONS) {
     section.slug = slugify(section.name);
 }
 
-export const getSettings = state => state.settings.settings;
+export const getSettings = createSelector(
+    state => state.settings.settings,
+    state => state.admin.settings.warnings,
+    (settings, warnings) =>
+        settings.map(setting => warnings[setting.key] ?
+            { ...setting, warning: warnings[setting.key] } :
+            setting
+        )
+)
 
 export const getSettingValues = createSelector(
     getSettings,
diff --git a/frontend/src/metabase/admin/settings/settings.js b/frontend/src/metabase/admin/settings/settings.js
index a8ecc16bccd..cc63d4829c5 100644
--- a/frontend/src/metabase/admin/settings/settings.js
+++ b/frontend/src/metabase/admin/settings/settings.js
@@ -1,5 +1,5 @@
 
-import { createThunkAction } from "metabase/lib/redux";
+import { createThunkAction, handleActions, combineReducers } from "metabase/lib/redux";
 
 import { SettingsApi, EmailApi, SlackApi } from "metabase/services";
 
@@ -36,8 +36,9 @@ export const UPDATE_EMAIL_SETTINGS = "metabase/admin/settings/UPDATE_EMAIL_SETTI
 export const updateEmailSettings = createThunkAction(UPDATE_EMAIL_SETTINGS, function(settings) {
     return async function(dispatch, getState) {
         try {
-            await EmailApi.updateSettings(settings);
+            const result = await EmailApi.updateSettings(settings);
             await dispatch(refreshSiteSettings());
+            return result;
         } catch(error) {
             console.log("error updating email settings", settings, error);
             throw error;
@@ -76,3 +77,13 @@ export const reloadSettings = createThunkAction(RELOAD_SETTINGS, function() {
         await dispatch(refreshSiteSettings());
     }
 });
+
+// REDUCERS
+
+export const warnings = handleActions({
+    [UPDATE_EMAIL_SETTINGS]: { next: (state, { payload }) => payload["with-corrections"] }
+}, {});
+
+export default combineReducers({
+    warnings
+});
-- 
GitLab