From b52df8dad72c10025f6207cc0f0ff88f75cc8c14 Mon Sep 17 00:00:00 2001 From: Kyle Rockman Date: Sat, 16 Sep 2017 20:45:50 -0500 Subject: [PATCH] QOL fixes - local dev not auto migrates and loads root user - fix error message handeling on non_field_errors so proper messages show up in the notif - persist login to localstorage - allow multi-tab aware login state via localstorage - fix tab cycle on modal so that submit comes next after last modal form field (if active) --- .gitignore | 1 + estate/assets/js/api/messages.js | 16 +++++++++++----- estate/assets/js/components/Modal.jsx | 2 +- estate/assets/js/index.jsx | 18 ++++++++++++++++++ estate/assets/js/reducers/auth.js | 20 +++++++++++++++++++- estate/local.sh | 5 +++-- 6 files changed, 53 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 5134235..a8bef8f 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,4 @@ ENV/ webpack-stats.json reports local.py +estate/settings/custom.py diff --git a/estate/assets/js/api/messages.js b/estate/assets/js/api/messages.js index 840bbc7..8587867 100644 --- a/estate/assets/js/api/messages.js +++ b/estate/assets/js/api/messages.js @@ -31,18 +31,24 @@ export function error(message) { } export function handleResponseError(err) { - if (err.response) { + if (err.response || err.errors) { + var data = err.response.data + console.log(data) var message = "" - if (isArray(err.response.data.errors)) { - each(err.response.data.errors, (item) => { + if (isArray(data.errors)) { + each(data.errors, (item) => { message += item.detail + "\n" }) + } else if (data.errors.non_field_errors) { + each(data.errors.non_field_errors, (item) => { + message += item + "\n" + }) } else { - message += err.response.data.errors.detail + message += data.errors.detail } dispatch(Notifications.show({ uid: count++, - title: `[${err.response.data.status_code}] ${err.response.data.status_text}`, + title: `[${data.status_code}] ${data.status_text}`, message: message, position: "tl", autoDismiss: 0, diff --git a/estate/assets/js/components/Modal.jsx b/estate/assets/js/components/Modal.jsx index 007050d..dee585a 100644 --- a/estate/assets/js/components/Modal.jsx +++ b/estate/assets/js/components/Modal.jsx @@ -73,7 +73,7 @@ class Modal extends React.Component { { this.props.children }
- +
diff --git a/estate/assets/js/index.jsx b/estate/assets/js/index.jsx index c1e0c54..cad65c3 100644 --- a/estate/assets/js/index.jsx +++ b/estate/assets/js/index.jsx @@ -13,6 +13,24 @@ import "./estate.css" axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"; axios.defaults.xsrfCookieName = "csrftoken"; +if (localStorage.authToken) { + axios.defaults.headers = {'Authorization': 'Token ' + localStorage.authToken} +} +window.addEventListener("storage", function(e) { + if (e.key === "authToken"){ + if (e.newValue) { + window.dispatch({ + type: "CONFIRM_LOGIN", + payload: {token: e.newValue} + }) + } else { + window.dispatch({ + type: "CONFIRM_LOGOUT", + payload: {token: e.newValue} + }) + } + } +}) window.jsyaml = require("js-yaml") // eslint-disable-line no-undef diff --git a/estate/assets/js/reducers/auth.js b/estate/assets/js/reducers/auth.js index ceba702..281129e 100644 --- a/estate/assets/js/reducers/auth.js +++ b/estate/assets/js/reducers/auth.js @@ -4,7 +4,7 @@ import axios from "axios" var initialState = { authenticating: false, - token: null, + token: localStorage.authToken || null, } export default createReducer(initialState, { @@ -14,6 +14,16 @@ export default createReducer(initialState, { }, ["FINISH_LOGIN"]: (state, action) => { + state = set(["authenticating"])(false)(state) + state = set(["token"])(action.payload.token)(state) + if (action.payload.token) { + localStorage.authToken = action.payload.token + axios.defaults.headers = {'Authorization': 'Token ' + action.payload.token} + } + return state + }, + + ["CONFIRM_LOGIN"]: (state, action) => { state = set(["authenticating"])(false)(state) state = set(["token"])(action.payload.token)(state) axios.defaults.headers = {'Authorization': 'Token ' + action.payload.token} @@ -21,6 +31,14 @@ export default createReducer(initialState, { }, ["DO_LOGOUT"]: (state, action) => { + state = set(["authenticating"])(false)(state) + state = set(["token"])(null)(state) + localStorage.removeItem("authToken") + axios.defaults.headers = {} + return state + }, + + ["CONFIRM_LOGOUT"]: (state, action) => { state = set(["authenticating"])(false)(state) state = set(["token"])(null)(state) axios.defaults.headers = {} diff --git a/estate/local.sh b/estate/local.sh index af306f8..bef2e8e 100755 --- a/estate/local.sh +++ b/estate/local.sh @@ -8,10 +8,11 @@ until psql -c "select 1" > /dev/null 2>&1 || [ $RETRIES -eq 0 ]; do echo "Waiting for postgres server, $((RETRIES--)) remaining attempts..." sleep 1 done +echo "Preparing database for local development" +django-admin migrate > /dev/null +django-admin loaddata initial_data > /dev/null echo "Starting Webpack Server" webpack-dev-server --config webpack/webpack.local.config.js & echo "Starting Django Server" -django-admin migrate -django-admin loaddata initial_data exec django-admin runserver 0.0.0.0:8000