From 6f35c4dd4bb2e7261d82efbed006d926495fc133 Mon Sep 17 00:00:00 2001 From: florian-boubou Date: Mon, 6 Jan 2020 17:30:40 +0100 Subject: [PATCH 1/5] Remove obsolete frontend sources --- client/src/actions/book/create.js | 45 ----- client/src/actions/book/delete.js | 29 --- client/src/actions/book/list.js | 85 --------- client/src/actions/book/show.js | 78 -------- client/src/actions/book/update.js | 131 ------------- client/src/actions/propertysale/create.js | 45 ----- client/src/actions/propertysale/delete.js | 29 --- client/src/actions/propertysale/list.js | 85 --------- client/src/actions/propertysale/show.js | 78 -------- client/src/actions/propertysale/update.js | 131 ------------- client/src/actions/review/create.js | 45 ----- client/src/actions/review/delete.js | 29 --- client/src/actions/review/list.js | 85 --------- client/src/actions/review/show.js | 78 -------- client/src/actions/review/update.js | 131 ------------- client/src/components/book/Create.js | 64 ------- client/src/components/book/Form.js | 102 ----------- client/src/components/book/List.js | 182 ------------------- client/src/components/book/Show.js | 144 --------------- client/src/components/book/Update.js | 123 ------------- client/src/components/book/index.js | 6 - client/src/components/propertysale/Create.js | 64 ------- client/src/components/propertysale/Form.js | 98 ---------- client/src/components/propertysale/List.js | 180 ------------------ client/src/components/propertysale/Show.js | 140 -------------- client/src/components/propertysale/Update.js | 123 ------------- client/src/components/review/Create.js | 64 ------- client/src/components/review/Form.js | 96 ---------- client/src/components/review/List.js | 180 ------------------ client/src/components/review/Show.js | 140 -------------- client/src/components/review/Update.js | 123 ------------- client/src/components/review/index.js | 6 - client/src/reducers/book/create.js | 33 ---- client/src/reducers/book/delete.js | 33 ---- client/src/reducers/book/index.js | 8 - client/src/reducers/book/list.js | 74 -------- client/src/reducers/book/show.js | 59 ------ client/src/reducers/book/update.js | 106 ----------- client/src/reducers/propertysale/create.js | 33 ---- client/src/reducers/propertysale/delete.js | 33 ---- client/src/reducers/propertysale/list.js | 74 -------- client/src/reducers/propertysale/show.js | 59 ------ client/src/reducers/propertysale/update.js | 106 ----------- client/src/reducers/review/create.js | 33 ---- client/src/reducers/review/delete.js | 33 ---- client/src/reducers/review/index.js | 8 - client/src/reducers/review/list.js | 74 -------- client/src/reducers/review/show.js | 59 ------ client/src/reducers/review/update.js | 106 ----------- client/src/routes/book.js | 11 -- client/src/routes/review.js | 11 -- 51 files changed, 3892 deletions(-) delete mode 100644 client/src/actions/book/create.js delete mode 100644 client/src/actions/book/delete.js delete mode 100644 client/src/actions/book/list.js delete mode 100644 client/src/actions/book/show.js delete mode 100644 client/src/actions/book/update.js delete mode 100644 client/src/actions/propertysale/create.js delete mode 100644 client/src/actions/propertysale/delete.js delete mode 100644 client/src/actions/propertysale/list.js delete mode 100644 client/src/actions/propertysale/show.js delete mode 100644 client/src/actions/propertysale/update.js delete mode 100644 client/src/actions/review/create.js delete mode 100644 client/src/actions/review/delete.js delete mode 100644 client/src/actions/review/list.js delete mode 100644 client/src/actions/review/show.js delete mode 100644 client/src/actions/review/update.js delete mode 100644 client/src/components/book/Create.js delete mode 100644 client/src/components/book/Form.js delete mode 100644 client/src/components/book/List.js delete mode 100644 client/src/components/book/Show.js delete mode 100644 client/src/components/book/Update.js delete mode 100644 client/src/components/book/index.js delete mode 100644 client/src/components/propertysale/Create.js delete mode 100644 client/src/components/propertysale/Form.js delete mode 100644 client/src/components/propertysale/List.js delete mode 100644 client/src/components/propertysale/Show.js delete mode 100644 client/src/components/propertysale/Update.js delete mode 100644 client/src/components/review/Create.js delete mode 100644 client/src/components/review/Form.js delete mode 100644 client/src/components/review/List.js delete mode 100644 client/src/components/review/Show.js delete mode 100644 client/src/components/review/Update.js delete mode 100644 client/src/components/review/index.js delete mode 100644 client/src/reducers/book/create.js delete mode 100644 client/src/reducers/book/delete.js delete mode 100644 client/src/reducers/book/index.js delete mode 100644 client/src/reducers/book/list.js delete mode 100644 client/src/reducers/book/show.js delete mode 100644 client/src/reducers/book/update.js delete mode 100644 client/src/reducers/propertysale/create.js delete mode 100644 client/src/reducers/propertysale/delete.js delete mode 100644 client/src/reducers/propertysale/list.js delete mode 100644 client/src/reducers/propertysale/show.js delete mode 100644 client/src/reducers/propertysale/update.js delete mode 100644 client/src/reducers/review/create.js delete mode 100644 client/src/reducers/review/delete.js delete mode 100644 client/src/reducers/review/index.js delete mode 100644 client/src/reducers/review/list.js delete mode 100644 client/src/reducers/review/show.js delete mode 100644 client/src/reducers/review/update.js delete mode 100644 client/src/routes/book.js delete mode 100644 client/src/routes/review.js diff --git a/client/src/actions/book/create.js b/client/src/actions/book/create.js deleted file mode 100644 index 376ca52..0000000 --- a/client/src/actions/book/create.js +++ /dev/null @@ -1,45 +0,0 @@ -import { SubmissionError } from 'redux-form'; -import { fetch } from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'BOOK_CREATE_ERROR', error }; -} - -export function loading(loading) { - return { type: 'BOOK_CREATE_LOADING', loading }; -} - -export function success(created) { - return { type: 'BOOK_CREATE_SUCCESS', created }; -} - -export function create(values) { - return dispatch => { - dispatch(loading(true)); - - return fetch('books', { method: 'POST', body: JSON.stringify(values) }) - .then(response => { - dispatch(loading(false)); - - return response.json(); - }) - .then(retrieved => dispatch(success(retrieved))) - .catch(e => { - dispatch(loading(false)); - - if (e instanceof SubmissionError) { - dispatch(error(e.errors._error)); - throw e; - } - - dispatch(error(e.message)); - }); - }; -} - -export function reset() { - return dispatch => { - dispatch(loading(false)); - dispatch(error(null)); - }; -} diff --git a/client/src/actions/book/delete.js b/client/src/actions/book/delete.js deleted file mode 100644 index dd164b0..0000000 --- a/client/src/actions/book/delete.js +++ /dev/null @@ -1,29 +0,0 @@ -import { fetch } from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'BOOK_DELETE_ERROR', error }; -} - -export function loading(loading) { - return { type: 'BOOK_DELETE_LOADING', loading }; -} - -export function success(deleted) { - return { type: 'BOOK_DELETE_SUCCESS', deleted }; -} - -export function del(item) { - return dispatch => { - dispatch(loading(true)); - - return fetch(item['@id'], { method: 'DELETE' }) - .then(() => { - dispatch(loading(false)); - dispatch(success(item)); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} diff --git a/client/src/actions/book/list.js b/client/src/actions/book/list.js deleted file mode 100644 index 6133330..0000000 --- a/client/src/actions/book/list.js +++ /dev/null @@ -1,85 +0,0 @@ -import { - fetch, - normalize, - extractHubURL, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; -import { success as deleteSuccess } from './delete'; - -export function error(error) { - return { type: 'BOOK_LIST_ERROR', error }; -} - -export function loading(loading) { - return { type: 'BOOK_LIST_LOADING', loading }; -} - -export function success(retrieved) { - return { type: 'BOOK_LIST_SUCCESS', retrieved }; -} - -export function list(page = 'books') { - return dispatch => { - dispatch(loading(true)); - dispatch(error('')); - - fetch(page) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(loading(false)); - dispatch(success(retrieved)); - - if (hubURL && retrieved['hydra:member'].length) - dispatch( - mercureSubscribe( - hubURL, - retrieved['hydra:member'].map(i => i['@id']) - ) - ); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'BOOK_LIST_RESET' }); - dispatch(deleteSuccess(null)); - }; -} - -export function mercureSubscribe(hubURL, topics) { - return dispatch => { - const eventSource = subscribe(hubURL, topics); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'BOOK_LIST_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'BOOK_LIST_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'BOOK_LIST_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/actions/book/show.js b/client/src/actions/book/show.js deleted file mode 100644 index f9c5ff7..0000000 --- a/client/src/actions/book/show.js +++ /dev/null @@ -1,78 +0,0 @@ -import { - fetch, - extractHubURL, - normalize, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'BOOK_SHOW_ERROR', error }; -} - -export function loading(loading) { - return { type: 'BOOK_SHOW_LOADING', loading }; -} - -export function success(retrieved) { - return { type: 'BOOK_SHOW_SUCCESS', retrieved }; -} - -export function retrieve(id) { - return dispatch => { - dispatch(loading(true)); - - return fetch(id) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(loading(false)); - dispatch(success(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'BOOK_SHOW_RESET' }); - dispatch(error(null)); - dispatch(loading(false)); - }; -} - -export function mercureSubscribe(hubURL, topic) { - return dispatch => { - const eventSource = subscribe(hubURL, [topic]); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'BOOK_SHOW_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'BOOK_SHOW_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'BOOK_SHOW_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/actions/book/update.js b/client/src/actions/book/update.js deleted file mode 100644 index d109c3b..0000000 --- a/client/src/actions/book/update.js +++ /dev/null @@ -1,131 +0,0 @@ -import { SubmissionError } from 'redux-form'; -import { - fetch, - extractHubURL, - normalize, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; -import { success as createSuccess } from './create'; -import { loading, error } from './delete'; - -export function retrieveError(retrieveError) { - return { type: 'BOOK_UPDATE_RETRIEVE_ERROR', retrieveError }; -} - -export function retrieveLoading(retrieveLoading) { - return { type: 'BOOK_UPDATE_RETRIEVE_LOADING', retrieveLoading }; -} - -export function retrieveSuccess(retrieved) { - return { type: 'BOOK_UPDATE_RETRIEVE_SUCCESS', retrieved }; -} - -export function retrieve(id) { - return dispatch => { - dispatch(retrieveLoading(true)); - - return fetch(id) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(retrieveLoading(false)); - dispatch(retrieveSuccess(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(retrieveLoading(false)); - dispatch(retrieveError(e.message)); - }); - }; -} - -export function updateError(updateError) { - return { type: 'BOOK_UPDATE_UPDATE_ERROR', updateError }; -} - -export function updateLoading(updateLoading) { - return { type: 'BOOK_UPDATE_UPDATE_LOADING', updateLoading }; -} - -export function updateSuccess(updated) { - return { type: 'BOOK_UPDATE_UPDATE_SUCCESS', updated }; -} - -export function update(item, values) { - return dispatch => { - dispatch(updateError(null)); - dispatch(createSuccess(null)); - dispatch(updateLoading(true)); - - return fetch(item['@id'], { - method: 'PUT', - headers: new Headers({ 'Content-Type': 'application/ld+json' }), - body: JSON.stringify(values) - }) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(updateLoading(false)); - dispatch(updateSuccess(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(updateLoading(false)); - - if (e instanceof SubmissionError) { - dispatch(updateError(e.errors._error)); - throw e; - } - - dispatch(updateError(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'BOOK_UPDATE_RESET' }); - dispatch(error(null)); - dispatch(loading(false)); - dispatch(createSuccess(null)); - }; -} - -export function mercureSubscribe(hubURL, topic) { - return dispatch => { - const eventSource = subscribe(hubURL, [topic]); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'BOOK_UPDATE_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'BOOK_UPDATE_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'BOOK_UPDATE_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/actions/propertysale/create.js b/client/src/actions/propertysale/create.js deleted file mode 100644 index 3552a91..0000000 --- a/client/src/actions/propertysale/create.js +++ /dev/null @@ -1,45 +0,0 @@ -import { SubmissionError } from 'redux-form'; -import { fetch } from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'PROPERTYSALE_CREATE_ERROR', error }; -} - -export function loading(loading) { - return { type: 'PROPERTYSALE_CREATE_LOADING', loading }; -} - -export function success(created) { - return { type: 'PROPERTYSALE_CREATE_SUCCESS', created }; -} - -export function create(values) { - return dispatch => { - dispatch(loading(true)); - - return fetch('property_sales', { method: 'POST', body: JSON.stringify(values) }) - .then(response => { - dispatch(loading(false)); - - return response.json(); - }) - .then(retrieved => dispatch(success(retrieved))) - .catch(e => { - dispatch(loading(false)); - - if (e instanceof SubmissionError) { - dispatch(error(e.errors._error)); - throw e; - } - - dispatch(error(e.message)); - }); - }; -} - -export function reset() { - return dispatch => { - dispatch(loading(false)); - dispatch(error(null)); - }; -} diff --git a/client/src/actions/propertysale/delete.js b/client/src/actions/propertysale/delete.js deleted file mode 100644 index 635b194..0000000 --- a/client/src/actions/propertysale/delete.js +++ /dev/null @@ -1,29 +0,0 @@ -import { fetch } from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'PROPERTYSALE_DELETE_ERROR', error }; -} - -export function loading(loading) { - return { type: 'PROPERTYSALE_DELETE_LOADING', loading }; -} - -export function success(deleted) { - return { type: 'PROPERTYSALE_DELETE_SUCCESS', deleted }; -} - -export function del(item) { - return dispatch => { - dispatch(loading(true)); - - return fetch(item['@id'], { method: 'DELETE' }) - .then(() => { - dispatch(loading(false)); - dispatch(success(item)); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} diff --git a/client/src/actions/propertysale/list.js b/client/src/actions/propertysale/list.js deleted file mode 100644 index 9297b42..0000000 --- a/client/src/actions/propertysale/list.js +++ /dev/null @@ -1,85 +0,0 @@ -import { - fetch, - normalize, - extractHubURL, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; -import { success as deleteSuccess } from './delete'; - -export function error(error) { - return { type: 'PROPERTYSALE_LIST_ERROR', error }; -} - -export function loading(loading) { - return { type: 'PROPERTYSALE_LIST_LOADING', loading }; -} - -export function success(retrieved) { - return { type: 'PROPERTYSALE_LIST_SUCCESS', retrieved }; -} - -export function list(page = 'property_sales') { - return dispatch => { - dispatch(loading(true)); - dispatch(error('')); - - fetch(page) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(loading(false)); - dispatch(success(retrieved)); - - if (hubURL && retrieved['hydra:member'].length) - dispatch( - mercureSubscribe( - hubURL, - retrieved['hydra:member'].map(i => i['@id']) - ) - ); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'PROPERTYSALE_LIST_RESET' }); - dispatch(deleteSuccess(null)); - }; -} - -export function mercureSubscribe(hubURL, topics) { - return dispatch => { - const eventSource = subscribe(hubURL, topics); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'PROPERTYSALE_LIST_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'PROPERTYSALE_LIST_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'PROPERTYSALE_LIST_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/actions/propertysale/show.js b/client/src/actions/propertysale/show.js deleted file mode 100644 index b0a84a6..0000000 --- a/client/src/actions/propertysale/show.js +++ /dev/null @@ -1,78 +0,0 @@ -import { - fetch, - extractHubURL, - normalize, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'PROPERTYSALE_SHOW_ERROR', error }; -} - -export function loading(loading) { - return { type: 'PROPERTYSALE_SHOW_LOADING', loading }; -} - -export function success(retrieved) { - return { type: 'PROPERTYSALE_SHOW_SUCCESS', retrieved }; -} - -export function retrieve(id) { - return dispatch => { - dispatch(loading(true)); - - return fetch(id) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(loading(false)); - dispatch(success(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'PROPERTYSALE_SHOW_RESET' }); - dispatch(error(null)); - dispatch(loading(false)); - }; -} - -export function mercureSubscribe(hubURL, topic) { - return dispatch => { - const eventSource = subscribe(hubURL, [topic]); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'PROPERTYSALE_SHOW_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'PROPERTYSALE_SHOW_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'PROPERTYSALE_SHOW_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/actions/propertysale/update.js b/client/src/actions/propertysale/update.js deleted file mode 100644 index c9caa10..0000000 --- a/client/src/actions/propertysale/update.js +++ /dev/null @@ -1,131 +0,0 @@ -import { SubmissionError } from 'redux-form'; -import { - fetch, - extractHubURL, - normalize, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; -import { success as createSuccess } from './create'; -import { loading, error } from './delete'; - -export function retrieveError(retrieveError) { - return { type: 'PROPERTYSALE_UPDATE_RETRIEVE_ERROR', retrieveError }; -} - -export function retrieveLoading(retrieveLoading) { - return { type: 'PROPERTYSALE_UPDATE_RETRIEVE_LOADING', retrieveLoading }; -} - -export function retrieveSuccess(retrieved) { - return { type: 'PROPERTYSALE_UPDATE_RETRIEVE_SUCCESS', retrieved }; -} - -export function retrieve(id) { - return dispatch => { - dispatch(retrieveLoading(true)); - - return fetch(id) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(retrieveLoading(false)); - dispatch(retrieveSuccess(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(retrieveLoading(false)); - dispatch(retrieveError(e.message)); - }); - }; -} - -export function updateError(updateError) { - return { type: 'PROPERTYSALE_UPDATE_UPDATE_ERROR', updateError }; -} - -export function updateLoading(updateLoading) { - return { type: 'PROPERTYSALE_UPDATE_UPDATE_LOADING', updateLoading }; -} - -export function updateSuccess(updated) { - return { type: 'PROPERTYSALE_UPDATE_UPDATE_SUCCESS', updated }; -} - -export function update(item, values) { - return dispatch => { - dispatch(updateError(null)); - dispatch(createSuccess(null)); - dispatch(updateLoading(true)); - - return fetch(item['@id'], { - method: 'PUT', - headers: new Headers({ 'Content-Type': 'application/ld+json' }), - body: JSON.stringify(values) - }) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(updateLoading(false)); - dispatch(updateSuccess(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(updateLoading(false)); - - if (e instanceof SubmissionError) { - dispatch(updateError(e.errors._error)); - throw e; - } - - dispatch(updateError(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'PROPERTYSALE_UPDATE_RESET' }); - dispatch(error(null)); - dispatch(loading(false)); - dispatch(createSuccess(null)); - }; -} - -export function mercureSubscribe(hubURL, topic) { - return dispatch => { - const eventSource = subscribe(hubURL, [topic]); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'PROPERTYSALE_UPDATE_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'PROPERTYSALE_UPDATE_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'PROPERTYSALE_UPDATE_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/actions/review/create.js b/client/src/actions/review/create.js deleted file mode 100644 index f51ddb2..0000000 --- a/client/src/actions/review/create.js +++ /dev/null @@ -1,45 +0,0 @@ -import { SubmissionError } from 'redux-form'; -import { fetch } from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'REVIEW_CREATE_ERROR', error }; -} - -export function loading(loading) { - return { type: 'REVIEW_CREATE_LOADING', loading }; -} - -export function success(created) { - return { type: 'REVIEW_CREATE_SUCCESS', created }; -} - -export function create(values) { - return dispatch => { - dispatch(loading(true)); - - return fetch('reviews', { method: 'POST', body: JSON.stringify(values) }) - .then(response => { - dispatch(loading(false)); - - return response.json(); - }) - .then(retrieved => dispatch(success(retrieved))) - .catch(e => { - dispatch(loading(false)); - - if (e instanceof SubmissionError) { - dispatch(error(e.errors._error)); - throw e; - } - - dispatch(error(e.message)); - }); - }; -} - -export function reset() { - return dispatch => { - dispatch(loading(false)); - dispatch(error(null)); - }; -} diff --git a/client/src/actions/review/delete.js b/client/src/actions/review/delete.js deleted file mode 100644 index e464f97..0000000 --- a/client/src/actions/review/delete.js +++ /dev/null @@ -1,29 +0,0 @@ -import { fetch } from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'REVIEW_DELETE_ERROR', error }; -} - -export function loading(loading) { - return { type: 'REVIEW_DELETE_LOADING', loading }; -} - -export function success(deleted) { - return { type: 'REVIEW_DELETE_SUCCESS', deleted }; -} - -export function del(item) { - return dispatch => { - dispatch(loading(true)); - - return fetch(item['@id'], { method: 'DELETE' }) - .then(() => { - dispatch(loading(false)); - dispatch(success(item)); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} diff --git a/client/src/actions/review/list.js b/client/src/actions/review/list.js deleted file mode 100644 index d909969..0000000 --- a/client/src/actions/review/list.js +++ /dev/null @@ -1,85 +0,0 @@ -import { - fetch, - normalize, - extractHubURL, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; -import { success as deleteSuccess } from './delete'; - -export function error(error) { - return { type: 'REVIEW_LIST_ERROR', error }; -} - -export function loading(loading) { - return { type: 'REVIEW_LIST_LOADING', loading }; -} - -export function success(retrieved) { - return { type: 'REVIEW_LIST_SUCCESS', retrieved }; -} - -export function list(page = 'reviews') { - return dispatch => { - dispatch(loading(true)); - dispatch(error('')); - - fetch(page) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(loading(false)); - dispatch(success(retrieved)); - - if (hubURL && retrieved['hydra:member'].length) - dispatch( - mercureSubscribe( - hubURL, - retrieved['hydra:member'].map(i => i['@id']) - ) - ); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'REVIEW_LIST_RESET' }); - dispatch(deleteSuccess(null)); - }; -} - -export function mercureSubscribe(hubURL, topics) { - return dispatch => { - const eventSource = subscribe(hubURL, topics); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'REVIEW_LIST_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'REVIEW_LIST_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'REVIEW_LIST_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/actions/review/show.js b/client/src/actions/review/show.js deleted file mode 100644 index 3276b60..0000000 --- a/client/src/actions/review/show.js +++ /dev/null @@ -1,78 +0,0 @@ -import { - fetch, - extractHubURL, - normalize, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; - -export function error(error) { - return { type: 'REVIEW_SHOW_ERROR', error }; -} - -export function loading(loading) { - return { type: 'REVIEW_SHOW_LOADING', loading }; -} - -export function success(retrieved) { - return { type: 'REVIEW_SHOW_SUCCESS', retrieved }; -} - -export function retrieve(id) { - return dispatch => { - dispatch(loading(true)); - - return fetch(id) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(loading(false)); - dispatch(success(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(loading(false)); - dispatch(error(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'REVIEW_SHOW_RESET' }); - dispatch(error(null)); - dispatch(loading(false)); - }; -} - -export function mercureSubscribe(hubURL, topic) { - return dispatch => { - const eventSource = subscribe(hubURL, [topic]); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'REVIEW_SHOW_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'REVIEW_SHOW_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'REVIEW_SHOW_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/actions/review/update.js b/client/src/actions/review/update.js deleted file mode 100644 index 6dd1581..0000000 --- a/client/src/actions/review/update.js +++ /dev/null @@ -1,131 +0,0 @@ -import { SubmissionError } from 'redux-form'; -import { - fetch, - extractHubURL, - normalize, - mercureSubscribe as subscribe -} from '../../utils/dataAccess'; -import { success as createSuccess } from './create'; -import { loading, error } from './delete'; - -export function retrieveError(retrieveError) { - return { type: 'REVIEW_UPDATE_RETRIEVE_ERROR', retrieveError }; -} - -export function retrieveLoading(retrieveLoading) { - return { type: 'REVIEW_UPDATE_RETRIEVE_LOADING', retrieveLoading }; -} - -export function retrieveSuccess(retrieved) { - return { type: 'REVIEW_UPDATE_RETRIEVE_SUCCESS', retrieved }; -} - -export function retrieve(id) { - return dispatch => { - dispatch(retrieveLoading(true)); - - return fetch(id) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(retrieveLoading(false)); - dispatch(retrieveSuccess(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(retrieveLoading(false)); - dispatch(retrieveError(e.message)); - }); - }; -} - -export function updateError(updateError) { - return { type: 'REVIEW_UPDATE_UPDATE_ERROR', updateError }; -} - -export function updateLoading(updateLoading) { - return { type: 'REVIEW_UPDATE_UPDATE_LOADING', updateLoading }; -} - -export function updateSuccess(updated) { - return { type: 'REVIEW_UPDATE_UPDATE_SUCCESS', updated }; -} - -export function update(item, values) { - return dispatch => { - dispatch(updateError(null)); - dispatch(createSuccess(null)); - dispatch(updateLoading(true)); - - return fetch(item['@id'], { - method: 'PUT', - headers: new Headers({ 'Content-Type': 'application/ld+json' }), - body: JSON.stringify(values) - }) - .then(response => - response - .json() - .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) })) - ) - .then(({ retrieved, hubURL }) => { - retrieved = normalize(retrieved); - - dispatch(updateLoading(false)); - dispatch(updateSuccess(retrieved)); - - if (hubURL) dispatch(mercureSubscribe(hubURL, retrieved['@id'])); - }) - .catch(e => { - dispatch(updateLoading(false)); - - if (e instanceof SubmissionError) { - dispatch(updateError(e.errors._error)); - throw e; - } - - dispatch(updateError(e.message)); - }); - }; -} - -export function reset(eventSource) { - return dispatch => { - if (eventSource) eventSource.close(); - - dispatch({ type: 'REVIEW_UPDATE_RESET' }); - dispatch(error(null)); - dispatch(loading(false)); - dispatch(createSuccess(null)); - }; -} - -export function mercureSubscribe(hubURL, topic) { - return dispatch => { - const eventSource = subscribe(hubURL, [topic]); - dispatch(mercureOpen(eventSource)); - eventSource.addEventListener('message', event => - dispatch(mercureMessage(normalize(JSON.parse(event.data)))) - ); - }; -} - -export function mercureOpen(eventSource) { - return { type: 'REVIEW_UPDATE_MERCURE_OPEN', eventSource }; -} - -export function mercureMessage(retrieved) { - return dispatch => { - if (1 === Object.keys(retrieved).length) { - dispatch({ type: 'REVIEW_UPDATE_MERCURE_DELETED', retrieved }); - return; - } - - dispatch({ type: 'REVIEW_UPDATE_MERCURE_MESSAGE', retrieved }); - }; -} diff --git a/client/src/components/book/Create.js b/client/src/components/book/Create.js deleted file mode 100644 index 87550ce..0000000 --- a/client/src/components/book/Create.js +++ /dev/null @@ -1,64 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import Form from './Form'; -import { create, reset } from '../../actions/book/create'; - -class Create extends Component { - static propTypes = { - error: PropTypes.string, - loading: PropTypes.bool.isRequired, - created: PropTypes.object, - create: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentWillUnmount() { - this.props.reset(); - } - - render() { - if (this.props.created) - return ( - - ); - - return ( -
-

New Book

- - {this.props.loading && ( -
- Loading... -
- )} - {this.props.error && ( -
-
- )} - -
- - Back to list - -
- ); - } -} - -const mapStateToProps = state => { - const { created, error, loading } = state.book.create; - return { created, error, loading }; -}; - -const mapDispatchToProps = dispatch => ({ - create: values => dispatch(create(values)), - reset: () => dispatch(reset()) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Create); diff --git a/client/src/components/book/Form.js b/client/src/components/book/Form.js deleted file mode 100644 index 9cbb4e0..0000000 --- a/client/src/components/book/Form.js +++ /dev/null @@ -1,102 +0,0 @@ -import React, { Component } from 'react'; -import { Field, reduxForm } from 'redux-form'; -import PropTypes from 'prop-types'; - -class Form extends Component { - static propTypes = { - handleSubmit: PropTypes.func.isRequired, - error: PropTypes.string - }; - - renderField = data => { - data.input.className = 'form-control'; - - const isInvalid = data.meta.touched && !!data.meta.error; - if (isInvalid) { - data.input.className += ' is-invalid'; - data.input['aria-invalid'] = true; - } - - if (this.props.error && data.meta.touched && !data.meta.error) { - data.input.className += ' is-valid'; - } - - return ( -
- - - {isInvalid &&
{data.meta.error}
} -
- ); - }; - - render() { - return ( - - - - - - - (v === '' ? [] : v.split(','))} - /> - - - - ); - } -} - -export default reduxForm({ - form: 'book', - enableReinitialize: true, - keepDirtyOnReinitialize: true -})(Form); diff --git a/client/src/components/book/List.js b/client/src/components/book/List.js deleted file mode 100644 index 202a74b..0000000 --- a/client/src/components/book/List.js +++ /dev/null @@ -1,182 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { list, reset } from '../../actions/book/list'; - -class List extends Component { - static propTypes = { - retrieved: PropTypes.object, - loading: PropTypes.bool.isRequired, - error: PropTypes.string, - eventSource: PropTypes.instanceOf(EventSource), - deletedItem: PropTypes.object, - list: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.list( - this.props.match.params.page && - decodeURIComponent(this.props.match.params.page) - ); - } - - componentWillReceiveProps(nextProps) { - if (this.props.match.params.page !== nextProps.match.params.page) - nextProps.list( - nextProps.match.params.page && - decodeURIComponent(nextProps.match.params.page) - ); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - render() { - return ( -
-

Book List

- - {this.props.loading && ( -
Loading...
- )} - {this.props.deletedItem && ( -
- {this.props.deletedItem['@id']} deleted. -
- )} - {this.props.error && ( -
{this.props.error}
- )} - -

- - Create - -

- - - - - - - - - - - - - - - {this.props.retrieved && - this.props.retrieved['hydra:member'].map(item => ( - - - - - - - - - - - - ))} - -
idisbntitledescriptionauthorpublicationDatereviews -
- - {item['@id']} - - {item['isbn']}{item['title']}{item['description']}{item['author']}{item['publicationDate']}{this.renderLinks('reviews', item['reviews'])} - - - -
- - {this.pagination()} -
- ); - } - - pagination() { - const view = this.props.retrieved && this.props.retrieved['hydra:view']; - if (!view) return; - - const { - 'hydra:first': first, - 'hydra:previous': previous, - 'hydra:next': next, - 'hydra:last': last - } = view; - - return ( - - ); - } - - renderLinks = (type, items) => { - if (Array.isArray(items)) { - return items.map((item, i) => ( -
{this.renderLinks(type, item)}
- )); - } - - return ( - {items} - ); - }; -} - -const mapStateToProps = state => { - const { - retrieved, - loading, - error, - eventSource, - deletedItem - } = state.book.list; - return { retrieved, loading, error, eventSource, deletedItem }; -}; - -const mapDispatchToProps = dispatch => ({ - list: page => dispatch(list(page)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(List); diff --git a/client/src/components/book/Show.js b/client/src/components/book/Show.js deleted file mode 100644 index 42c3e70..0000000 --- a/client/src/components/book/Show.js +++ /dev/null @@ -1,144 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { retrieve, reset } from '../../actions/book/show'; -import { del } from '../../actions/book/delete'; - -class Show extends Component { - static propTypes = { - retrieved: PropTypes.object, - loading: PropTypes.bool.isRequired, - error: PropTypes.string, - eventSource: PropTypes.instanceOf(EventSource), - retrieve: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired, - deleteError: PropTypes.string, - deleteLoading: PropTypes.bool.isRequired, - deleted: PropTypes.object, - del: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.retrieve(decodeURIComponent(this.props.match.params.id)); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - del = () => { - if (window.confirm('Are you sure you want to delete this item?')) - this.props.del(this.props.retrieved); - }; - - render() { - if (this.props.deleted) return ; - - const item = this.props.retrieved; - - return ( -
-

Show {item && item['@id']}

- - {this.props.loading && ( -
- Loading... -
- )} - {this.props.error && ( -
-
- )} - {this.props.deleteError && ( -
-
- )} - - {item && ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldValue
isbn{item['isbn']}
title{item['title']}
description{item['description']}
author{item['author']}
publicationDate{item['publicationDate']}
reviews{this.renderLinks('reviews', item['reviews'])}
- )} - - Back to list - - {item && ( - - - - )} - -
- ); - } - - renderLinks = (type, items) => { - if (Array.isArray(items)) { - return items.map((item, i) => ( -
{this.renderLinks(type, item)}
- )); - } - - return ( - - {items} - - ); - }; -} - -const mapStateToProps = state => ({ - retrieved: state.book.show.retrieved, - error: state.book.show.error, - loading: state.book.show.loading, - eventSource: state.book.show.eventSource, - deleteError: state.book.del.error, - deleteLoading: state.book.del.loading, - deleted: state.book.del.deleted -}); - -const mapDispatchToProps = dispatch => ({ - retrieve: id => dispatch(retrieve(id)), - del: item => dispatch(del(item)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Show); diff --git a/client/src/components/book/Update.js b/client/src/components/book/Update.js deleted file mode 100644 index ac13d32..0000000 --- a/client/src/components/book/Update.js +++ /dev/null @@ -1,123 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import Form from './Form'; -import { retrieve, update, reset } from '../../actions/book/update'; -import { del } from '../../actions/book/delete'; - -class Update extends Component { - static propTypes = { - retrieved: PropTypes.object, - retrieveLoading: PropTypes.bool.isRequired, - retrieveError: PropTypes.string, - updateLoading: PropTypes.bool.isRequired, - updateError: PropTypes.string, - deleteLoading: PropTypes.bool.isRequired, - deleteError: PropTypes.string, - updated: PropTypes.object, - deleted: PropTypes.object, - eventSource: PropTypes.instanceOf(EventSource), - retrieve: PropTypes.func.isRequired, - update: PropTypes.func.isRequired, - del: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.retrieve(decodeURIComponent(this.props.match.params.id)); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - del = () => { - if (window.confirm('Are you sure you want to delete this item?')) - this.props.del(this.props.retrieved); - }; - - render() { - if (this.props.deleted) return ; - - const item = this.props.updated ? this.props.updated : this.props.retrieved; - - return ( -
-

Edit {item && item['@id']}

- - {this.props.created && ( -
- {this.props.created['@id']} created. -
- )} - {this.props.updated && ( -
- {this.props.updated['@id']} updated. -
- )} - {(this.props.retrieveLoading || - this.props.updateLoading || - this.props.deleteLoading) && ( -
- Loading... -
- )} - {this.props.retrieveError && ( -
-
- )} - {this.props.updateError && ( -
-
- )} - {this.props.deleteError && ( -
-
- )} - - {item && ( -
this.props.update(item, values)} - initialValues={item} - /> - )} - - Back to list - - -
- ); - } -} - -const mapStateToProps = state => ({ - retrieved: state.book.update.retrieved, - retrieveError: state.book.update.retrieveError, - retrieveLoading: state.book.update.retrieveLoading, - updateError: state.book.update.updateError, - updateLoading: state.book.update.updateLoading, - deleteError: state.book.del.error, - deleteLoading: state.book.del.loading, - eventSource: state.book.update.eventSource, - created: state.book.create.created, - deleted: state.book.del.deleted, - updated: state.book.update.updated -}); - -const mapDispatchToProps = dispatch => ({ - retrieve: id => dispatch(retrieve(id)), - update: (item, values) => dispatch(update(item, values)), - del: item => dispatch(del(item)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Update); diff --git a/client/src/components/book/index.js b/client/src/components/book/index.js deleted file mode 100644 index e936e55..0000000 --- a/client/src/components/book/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import Create from './Create'; -import List from './List'; -import Update from './Update'; -import Show from './Show'; - -export { Create, List, Update, Show }; diff --git a/client/src/components/propertysale/Create.js b/client/src/components/propertysale/Create.js deleted file mode 100644 index 24a4e14..0000000 --- a/client/src/components/propertysale/Create.js +++ /dev/null @@ -1,64 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import Form from './Form'; -import { create, reset } from '../../actions/propertysale/create'; - -class Create extends Component { - static propTypes = { - error: PropTypes.string, - loading: PropTypes.bool.isRequired, - created: PropTypes.object, - create: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentWillUnmount() { - this.props.reset(); - } - - render() { - if (this.props.created) - return ( - - ); - - return ( -
-

New PropertySale

- - {this.props.loading && ( -
- Loading... -
- )} - {this.props.error && ( -
-
- )} - - - - Back to list - -
- ); - } -} - -const mapStateToProps = state => { - const { created, error, loading } = state.propertysale.create; - return { created, error, loading }; -}; - -const mapDispatchToProps = dispatch => ({ - create: values => dispatch(create(values)), - reset: () => dispatch(reset()) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Create); diff --git a/client/src/components/propertysale/Form.js b/client/src/components/propertysale/Form.js deleted file mode 100644 index 2bf266c..0000000 --- a/client/src/components/propertysale/Form.js +++ /dev/null @@ -1,98 +0,0 @@ -import React, { Component } from 'react'; -import { Field, reduxForm } from 'redux-form'; -import PropTypes from 'prop-types'; - -class Form extends Component { - static propTypes = { - handleSubmit: PropTypes.func.isRequired, - error: PropTypes.string - }; - - renderField = data => { - data.input.className = 'form-control'; - - const isInvalid = data.meta.touched && !!data.meta.error; - if (isInvalid) { - data.input.className += ' is-invalid'; - data.input['aria-invalid'] = true; - } - - if (this.props.error && data.meta.touched && !data.meta.error) { - data.input.className += ' is-valid'; - } - - return ( -
- - - {isInvalid &&
{data.meta.error}
} -
- ); - }; - - render() { - return ( - - parseFloat(v)} - /> - parseFloat(v)} - /> - - - - - - - ); - } -} - -export default reduxForm({ - form: 'propertysale', - enableReinitialize: true, - keepDirtyOnReinitialize: true -})(Form); diff --git a/client/src/components/propertysale/List.js b/client/src/components/propertysale/List.js deleted file mode 100644 index 6d4ae87..0000000 --- a/client/src/components/propertysale/List.js +++ /dev/null @@ -1,180 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { list, reset } from '../../actions/propertysale/list'; - -class List extends Component { - static propTypes = { - retrieved: PropTypes.object, - loading: PropTypes.bool.isRequired, - error: PropTypes.string, - eventSource: PropTypes.instanceOf(EventSource), - deletedItem: PropTypes.object, - list: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.list( - this.props.match.params.page && - decodeURIComponent(this.props.match.params.page) - ); - } - - componentWillReceiveProps(nextProps) { - if (this.props.match.params.page !== nextProps.match.params.page) - nextProps.list( - nextProps.match.params.page && - decodeURIComponent(nextProps.match.params.page) - ); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - render() { - return ( -
-

PropertySale List

- - {this.props.loading && ( -
Loading...
- )} - {this.props.deletedItem && ( -
- {this.props.deletedItem['@id']} deleted. -
- )} - {this.props.error && ( -
{this.props.error}
- )} - -

- - Create - -

- - - - - - - - - - - - - - {this.props.retrieved && - this.props.retrieved['hydra:member'].map(item => ( - - - - - - - - - - - ))} - -
idpricesurfacedatedepartmentregion -
- - {item['@id']} - - {item['price']}{item['surface']}{item['date']}{item['department']}{item['region']} - - - -
- - {this.pagination()} -
- ); - } - - pagination() { - const view = this.props.retrieved && this.props.retrieved['hydra:view']; - if (!view) return; - - const { - 'hydra:first': first, - 'hydra:previous': previous, - 'hydra:next': next, - 'hydra:last': last - } = view; - - return ( - - ); - } - - renderLinks = (type, items) => { - if (Array.isArray(items)) { - return items.map((item, i) => ( -
{this.renderLinks(type, item)}
- )); - } - - return ( - {items} - ); - }; -} - -const mapStateToProps = state => { - const { - retrieved, - loading, - error, - eventSource, - deletedItem - } = state.propertysale.list; - return { retrieved, loading, error, eventSource, deletedItem }; -}; - -const mapDispatchToProps = dispatch => ({ - list: page => dispatch(list(page)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(List); diff --git a/client/src/components/propertysale/Show.js b/client/src/components/propertysale/Show.js deleted file mode 100644 index 10b3d74..0000000 --- a/client/src/components/propertysale/Show.js +++ /dev/null @@ -1,140 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { retrieve, reset } from '../../actions/propertysale/show'; -import { del } from '../../actions/propertysale/delete'; - -class Show extends Component { - static propTypes = { - retrieved: PropTypes.object, - loading: PropTypes.bool.isRequired, - error: PropTypes.string, - eventSource: PropTypes.instanceOf(EventSource), - retrieve: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired, - deleteError: PropTypes.string, - deleteLoading: PropTypes.bool.isRequired, - deleted: PropTypes.object, - del: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.retrieve(decodeURIComponent(this.props.match.params.id)); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - del = () => { - if (window.confirm('Are you sure you want to delete this item?')) - this.props.del(this.props.retrieved); - }; - - render() { - if (this.props.deleted) return ; - - const item = this.props.retrieved; - - return ( -
-

Show {item && item['@id']}

- - {this.props.loading && ( -
- Loading... -
- )} - {this.props.error && ( -
-
- )} - {this.props.deleteError && ( -
-
- )} - - {item && ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldValue
price{item['price']}
surface{item['surface']}
date{item['date']}
department{item['department']}
region{item['region']}
- )} - - Back to list - - {item && ( - - - - )} - -
- ); - } - - renderLinks = (type, items) => { - if (Array.isArray(items)) { - return items.map((item, i) => ( -
{this.renderLinks(type, item)}
- )); - } - - return ( - - {items} - - ); - }; -} - -const mapStateToProps = state => ({ - retrieved: state.propertysale.show.retrieved, - error: state.propertysale.show.error, - loading: state.propertysale.show.loading, - eventSource: state.propertysale.show.eventSource, - deleteError: state.propertysale.del.error, - deleteLoading: state.propertysale.del.loading, - deleted: state.propertysale.del.deleted -}); - -const mapDispatchToProps = dispatch => ({ - retrieve: id => dispatch(retrieve(id)), - del: item => dispatch(del(item)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Show); diff --git a/client/src/components/propertysale/Update.js b/client/src/components/propertysale/Update.js deleted file mode 100644 index 9c04a2b..0000000 --- a/client/src/components/propertysale/Update.js +++ /dev/null @@ -1,123 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import Form from './Form'; -import { retrieve, update, reset } from '../../actions/propertysale/update'; -import { del } from '../../actions/propertysale/delete'; - -class Update extends Component { - static propTypes = { - retrieved: PropTypes.object, - retrieveLoading: PropTypes.bool.isRequired, - retrieveError: PropTypes.string, - updateLoading: PropTypes.bool.isRequired, - updateError: PropTypes.string, - deleteLoading: PropTypes.bool.isRequired, - deleteError: PropTypes.string, - updated: PropTypes.object, - deleted: PropTypes.object, - eventSource: PropTypes.instanceOf(EventSource), - retrieve: PropTypes.func.isRequired, - update: PropTypes.func.isRequired, - del: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.retrieve(decodeURIComponent(this.props.match.params.id)); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - del = () => { - if (window.confirm('Are you sure you want to delete this item?')) - this.props.del(this.props.retrieved); - }; - - render() { - if (this.props.deleted) return ; - - const item = this.props.updated ? this.props.updated : this.props.retrieved; - - return ( -
-

Edit {item && item['@id']}

- - {this.props.created && ( -
- {this.props.created['@id']} created. -
- )} - {this.props.updated && ( -
- {this.props.updated['@id']} updated. -
- )} - {(this.props.retrieveLoading || - this.props.updateLoading || - this.props.deleteLoading) && ( -
- Loading... -
- )} - {this.props.retrieveError && ( -
-
- )} - {this.props.updateError && ( -
-
- )} - {this.props.deleteError && ( -
-
- )} - - {item && ( -
this.props.update(item, values)} - initialValues={item} - /> - )} - - Back to list - - -
- ); - } -} - -const mapStateToProps = state => ({ - retrieved: state.propertysale.update.retrieved, - retrieveError: state.propertysale.update.retrieveError, - retrieveLoading: state.propertysale.update.retrieveLoading, - updateError: state.propertysale.update.updateError, - updateLoading: state.propertysale.update.updateLoading, - deleteError: state.propertysale.del.error, - deleteLoading: state.propertysale.del.loading, - eventSource: state.propertysale.update.eventSource, - created: state.propertysale.create.created, - deleted: state.propertysale.del.deleted, - updated: state.propertysale.update.updated -}); - -const mapDispatchToProps = dispatch => ({ - retrieve: id => dispatch(retrieve(id)), - update: (item, values) => dispatch(update(item, values)), - del: item => dispatch(del(item)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Update); diff --git a/client/src/components/review/Create.js b/client/src/components/review/Create.js deleted file mode 100644 index b5a7330..0000000 --- a/client/src/components/review/Create.js +++ /dev/null @@ -1,64 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import Form from './Form'; -import { create, reset } from '../../actions/review/create'; - -class Create extends Component { - static propTypes = { - error: PropTypes.string, - loading: PropTypes.bool.isRequired, - created: PropTypes.object, - create: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentWillUnmount() { - this.props.reset(); - } - - render() { - if (this.props.created) - return ( - - ); - - return ( -
-

New Review

- - {this.props.loading && ( -
- Loading... -
- )} - {this.props.error && ( -
-
- )} - - - - Back to list - -
- ); - } -} - -const mapStateToProps = state => { - const { created, error, loading } = state.review.create; - return { created, error, loading }; -}; - -const mapDispatchToProps = dispatch => ({ - create: values => dispatch(create(values)), - reset: () => dispatch(reset()) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Create); diff --git a/client/src/components/review/Form.js b/client/src/components/review/Form.js deleted file mode 100644 index 304121a..0000000 --- a/client/src/components/review/Form.js +++ /dev/null @@ -1,96 +0,0 @@ -import React, { Component } from 'react'; -import { Field, reduxForm } from 'redux-form'; -import PropTypes from 'prop-types'; - -class Form extends Component { - static propTypes = { - handleSubmit: PropTypes.func.isRequired, - error: PropTypes.string - }; - - renderField = data => { - data.input.className = 'form-control'; - - const isInvalid = data.meta.touched && !!data.meta.error; - if (isInvalid) { - data.input.className += ' is-invalid'; - data.input['aria-invalid'] = true; - } - - if (this.props.error && data.meta.touched && !data.meta.error) { - data.input.className += ' is-valid'; - } - - return ( -
- - - {isInvalid &&
{data.meta.error}
} -
- ); - }; - - render() { - return ( - - parseFloat(v)} - /> - - - - - - - - ); - } -} - -export default reduxForm({ - form: 'review', - enableReinitialize: true, - keepDirtyOnReinitialize: true -})(Form); diff --git a/client/src/components/review/List.js b/client/src/components/review/List.js deleted file mode 100644 index 0e20cda..0000000 --- a/client/src/components/review/List.js +++ /dev/null @@ -1,180 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { list, reset } from '../../actions/review/list'; - -class List extends Component { - static propTypes = { - retrieved: PropTypes.object, - loading: PropTypes.bool.isRequired, - error: PropTypes.string, - eventSource: PropTypes.instanceOf(EventSource), - deletedItem: PropTypes.object, - list: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.list( - this.props.match.params.page && - decodeURIComponent(this.props.match.params.page) - ); - } - - componentWillReceiveProps(nextProps) { - if (this.props.match.params.page !== nextProps.match.params.page) - nextProps.list( - nextProps.match.params.page && - decodeURIComponent(nextProps.match.params.page) - ); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - render() { - return ( -
-

Review List

- - {this.props.loading && ( -
Loading...
- )} - {this.props.deletedItem && ( -
- {this.props.deletedItem['@id']} deleted. -
- )} - {this.props.error && ( -
{this.props.error}
- )} - -

- - Create - -

- - - - - - - - - - - - - - {this.props.retrieved && - this.props.retrieved['hydra:member'].map(item => ( - - - - - - - - - - - ))} - -
idratingbodyauthorpublicationDatebook -
- - {item['@id']} - - {item['rating']}{item['body']}{item['author']}{item['publicationDate']}{this.renderLinks('books', item['book'])} - - - -
- - {this.pagination()} -
- ); - } - - pagination() { - const view = this.props.retrieved && this.props.retrieved['hydra:view']; - if (!view) return; - - const { - 'hydra:first': first, - 'hydra:previous': previous, - 'hydra:next': next, - 'hydra:last': last - } = view; - - return ( - - ); - } - - renderLinks = (type, items) => { - if (Array.isArray(items)) { - return items.map((item, i) => ( -
{this.renderLinks(type, item)}
- )); - } - - return ( - {items} - ); - }; -} - -const mapStateToProps = state => { - const { - retrieved, - loading, - error, - eventSource, - deletedItem - } = state.review.list; - return { retrieved, loading, error, eventSource, deletedItem }; -}; - -const mapDispatchToProps = dispatch => ({ - list: page => dispatch(list(page)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(List); diff --git a/client/src/components/review/Show.js b/client/src/components/review/Show.js deleted file mode 100644 index 919d2ee..0000000 --- a/client/src/components/review/Show.js +++ /dev/null @@ -1,140 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { retrieve, reset } from '../../actions/review/show'; -import { del } from '../../actions/review/delete'; - -class Show extends Component { - static propTypes = { - retrieved: PropTypes.object, - loading: PropTypes.bool.isRequired, - error: PropTypes.string, - eventSource: PropTypes.instanceOf(EventSource), - retrieve: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired, - deleteError: PropTypes.string, - deleteLoading: PropTypes.bool.isRequired, - deleted: PropTypes.object, - del: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.retrieve(decodeURIComponent(this.props.match.params.id)); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - del = () => { - if (window.confirm('Are you sure you want to delete this item?')) - this.props.del(this.props.retrieved); - }; - - render() { - if (this.props.deleted) return ; - - const item = this.props.retrieved; - - return ( -
-

Show {item && item['@id']}

- - {this.props.loading && ( -
- Loading... -
- )} - {this.props.error && ( -
-
- )} - {this.props.deleteError && ( -
-
- )} - - {item && ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldValue
rating{item['rating']}
body{item['body']}
author{item['author']}
publicationDate{item['publicationDate']}
book{this.renderLinks('books', item['book'])}
- )} - - Back to list - - {item && ( - - - - )} - -
- ); - } - - renderLinks = (type, items) => { - if (Array.isArray(items)) { - return items.map((item, i) => ( -
{this.renderLinks(type, item)}
- )); - } - - return ( - - {items} - - ); - }; -} - -const mapStateToProps = state => ({ - retrieved: state.review.show.retrieved, - error: state.review.show.error, - loading: state.review.show.loading, - eventSource: state.review.show.eventSource, - deleteError: state.review.del.error, - deleteLoading: state.review.del.loading, - deleted: state.review.del.deleted -}); - -const mapDispatchToProps = dispatch => ({ - retrieve: id => dispatch(retrieve(id)), - del: item => dispatch(del(item)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Show); diff --git a/client/src/components/review/Update.js b/client/src/components/review/Update.js deleted file mode 100644 index d6a3862..0000000 --- a/client/src/components/review/Update.js +++ /dev/null @@ -1,123 +0,0 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { Link, Redirect } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import Form from './Form'; -import { retrieve, update, reset } from '../../actions/review/update'; -import { del } from '../../actions/review/delete'; - -class Update extends Component { - static propTypes = { - retrieved: PropTypes.object, - retrieveLoading: PropTypes.bool.isRequired, - retrieveError: PropTypes.string, - updateLoading: PropTypes.bool.isRequired, - updateError: PropTypes.string, - deleteLoading: PropTypes.bool.isRequired, - deleteError: PropTypes.string, - updated: PropTypes.object, - deleted: PropTypes.object, - eventSource: PropTypes.instanceOf(EventSource), - retrieve: PropTypes.func.isRequired, - update: PropTypes.func.isRequired, - del: PropTypes.func.isRequired, - reset: PropTypes.func.isRequired - }; - - componentDidMount() { - this.props.retrieve(decodeURIComponent(this.props.match.params.id)); - } - - componentWillUnmount() { - this.props.reset(this.props.eventSource); - } - - del = () => { - if (window.confirm('Are you sure you want to delete this item?')) - this.props.del(this.props.retrieved); - }; - - render() { - if (this.props.deleted) return ; - - const item = this.props.updated ? this.props.updated : this.props.retrieved; - - return ( -
-

Edit {item && item['@id']}

- - {this.props.created && ( -
- {this.props.created['@id']} created. -
- )} - {this.props.updated && ( -
- {this.props.updated['@id']} updated. -
- )} - {(this.props.retrieveLoading || - this.props.updateLoading || - this.props.deleteLoading) && ( -
- Loading... -
- )} - {this.props.retrieveError && ( -
-
- )} - {this.props.updateError && ( -
-
- )} - {this.props.deleteError && ( -
-
- )} - - {item && ( -
this.props.update(item, values)} - initialValues={item} - /> - )} - - Back to list - - -
- ); - } -} - -const mapStateToProps = state => ({ - retrieved: state.review.update.retrieved, - retrieveError: state.review.update.retrieveError, - retrieveLoading: state.review.update.retrieveLoading, - updateError: state.review.update.updateError, - updateLoading: state.review.update.updateLoading, - deleteError: state.review.del.error, - deleteLoading: state.review.del.loading, - eventSource: state.review.update.eventSource, - created: state.review.create.created, - deleted: state.review.del.deleted, - updated: state.review.update.updated -}); - -const mapDispatchToProps = dispatch => ({ - retrieve: id => dispatch(retrieve(id)), - update: (item, values) => dispatch(update(item, values)), - del: item => dispatch(del(item)), - reset: eventSource => dispatch(reset(eventSource)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Update); diff --git a/client/src/components/review/index.js b/client/src/components/review/index.js deleted file mode 100644 index e936e55..0000000 --- a/client/src/components/review/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import Create from './Create'; -import List from './List'; -import Update from './Update'; -import Show from './Show'; - -export { Create, List, Update, Show }; diff --git a/client/src/reducers/book/create.js b/client/src/reducers/book/create.js deleted file mode 100644 index 8994ad0..0000000 --- a/client/src/reducers/book/create.js +++ /dev/null @@ -1,33 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'BOOK_CREATE_ERROR': - return action.error; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'BOOK_CREATE_LOADING': - return action.loading; - - default: - return state; - } -} - -export function created(state = null, action) { - switch (action.type) { - case 'BOOK_CREATE_SUCCESS': - return action.created; - - default: - return state; - } -} - -export default combineReducers({ error, loading, created }); diff --git a/client/src/reducers/book/delete.js b/client/src/reducers/book/delete.js deleted file mode 100644 index 7b469db..0000000 --- a/client/src/reducers/book/delete.js +++ /dev/null @@ -1,33 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'BOOK_DELETE_ERROR': - return action.error; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'BOOK_DELETE_LOADING': - return action.loading; - - default: - return state; - } -} - -export function deleted(state = null, action) { - switch (action.type) { - case 'BOOK_DELETE_SUCCESS': - return action.deleted; - - default: - return state; - } -} - -export default combineReducers({ error, loading, deleted }); diff --git a/client/src/reducers/book/index.js b/client/src/reducers/book/index.js deleted file mode 100644 index d57c1ad..0000000 --- a/client/src/reducers/book/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import { combineReducers } from 'redux'; -import list from './list'; -import create from './create'; -import update from './update'; -import del from './delete'; -import show from './show'; - -export default combineReducers({ list, create, update, del, show }); diff --git a/client/src/reducers/book/list.js b/client/src/reducers/book/list.js deleted file mode 100644 index ad96e1a..0000000 --- a/client/src/reducers/book/list.js +++ /dev/null @@ -1,74 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'BOOK_LIST_ERROR': - return action.error; - - case 'BOOK_LIST_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'BOOK_LIST_RESET': - return null; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'BOOK_LIST_LOADING': - return action.loading; - - case 'BOOK_LIST_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'BOOK_LIST_SUCCESS': - return action.retrieved; - - case 'BOOK_LIST_RESET': - return null; - - case 'BOOK_LIST_MERCURE_MESSAGE': - return { - ...state, - 'hydra:member': state['hydra:member'].map(item => - item['@id'] === action.retrieved['@id'] ? action.retrieved : item - ) - }; - - case 'BOOK_LIST_MERCURE_DELETED': - return { - ...state, - 'hydra:member': state['hydra:member'].filter( - item => item['@id'] !== action.retrieved['@id'] - ) - }; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'BOOK_LIST_MERCURE_OPEN': - return action.eventSource; - - case 'BOOK_LIST_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ error, loading, retrieved, eventSource }); diff --git a/client/src/reducers/book/show.js b/client/src/reducers/book/show.js deleted file mode 100644 index 36d993b..0000000 --- a/client/src/reducers/book/show.js +++ /dev/null @@ -1,59 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'BOOK_SHOW_ERROR': - return action.error; - - case 'BOOK_SHOW_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'BOOK_SHOW_RESET': - return null; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'BOOK_SHOW_LOADING': - return action.loading; - - case 'BOOK_SHOW_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'BOOK_SHOW_SUCCESS': - case 'BOOK_SHOW_MERCURE_MESSAGE': - return action.retrieved; - - case 'BOOK_SHOW_RESET': - return null; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'BOOK_SHOW_MERCURE_OPEN': - return action.eventSource; - - case 'BOOK_SHOW_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ error, loading, retrieved, eventSource }); diff --git a/client/src/reducers/book/update.js b/client/src/reducers/book/update.js deleted file mode 100644 index 171ab10..0000000 --- a/client/src/reducers/book/update.js +++ /dev/null @@ -1,106 +0,0 @@ -import { combineReducers } from 'redux'; - -export function retrieveError(state = null, action) { - switch (action.type) { - case 'BOOK_UPDATE_RETRIEVE_ERROR': - return action.retrieveError; - - case 'BOOK_UPDATE_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'BOOK_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function retrieveLoading(state = false, action) { - switch (action.type) { - case 'BOOK_UPDATE_RETRIEVE_LOADING': - return action.retrieveLoading; - - case 'BOOK_UPDATE_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'BOOK_UPDATE_RETRIEVE_SUCCESS': - case 'BOOK_UPDATE_MERCURE_MESSAGE': - return action.retrieved; - - case 'BOOK_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function updateError(state = null, action) { - switch (action.type) { - case 'BOOK_UPDATE_UPDATE_ERROR': - return action.updateError; - - case 'BOOK_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function updateLoading(state = false, action) { - switch (action.type) { - case 'BOOK_UPDATE_UPDATE_LOADING': - return action.updateLoading; - - case 'BOOK_UPDATE_RESET': - return false; - - default: - return state; - } -} - -export function updated(state = null, action) { - switch (action.type) { - case 'BOOK_UPDATE_UPDATE_SUCCESS': - return action.updated; - - case 'BOOK_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'BOOK_UPDATE_MERCURE_OPEN': - return action.eventSource; - - case 'BOOK_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ - retrieveError, - retrieveLoading, - retrieved, - updateError, - updateLoading, - updated, - eventSource -}); diff --git a/client/src/reducers/propertysale/create.js b/client/src/reducers/propertysale/create.js deleted file mode 100644 index de17f03..0000000 --- a/client/src/reducers/propertysale/create.js +++ /dev/null @@ -1,33 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_CREATE_ERROR': - return action.error; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'PROPERTYSALE_CREATE_LOADING': - return action.loading; - - default: - return state; - } -} - -export function created(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_CREATE_SUCCESS': - return action.created; - - default: - return state; - } -} - -export default combineReducers({ error, loading, created }); diff --git a/client/src/reducers/propertysale/delete.js b/client/src/reducers/propertysale/delete.js deleted file mode 100644 index 17762bb..0000000 --- a/client/src/reducers/propertysale/delete.js +++ /dev/null @@ -1,33 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_DELETE_ERROR': - return action.error; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'PROPERTYSALE_DELETE_LOADING': - return action.loading; - - default: - return state; - } -} - -export function deleted(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_DELETE_SUCCESS': - return action.deleted; - - default: - return state; - } -} - -export default combineReducers({ error, loading, deleted }); diff --git a/client/src/reducers/propertysale/list.js b/client/src/reducers/propertysale/list.js deleted file mode 100644 index c510c47..0000000 --- a/client/src/reducers/propertysale/list.js +++ /dev/null @@ -1,74 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_LIST_ERROR': - return action.error; - - case 'PROPERTYSALE_LIST_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'PROPERTYSALE_LIST_RESET': - return null; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'PROPERTYSALE_LIST_LOADING': - return action.loading; - - case 'PROPERTYSALE_LIST_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_LIST_SUCCESS': - return action.retrieved; - - case 'PROPERTYSALE_LIST_RESET': - return null; - - case 'PROPERTYSALE_LIST_MERCURE_MESSAGE': - return { - ...state, - 'hydra:member': state['hydra:member'].map(item => - item['@id'] === action.retrieved['@id'] ? action.retrieved : item - ) - }; - - case 'PROPERTYSALE_LIST_MERCURE_DELETED': - return { - ...state, - 'hydra:member': state['hydra:member'].filter( - item => item['@id'] !== action.retrieved['@id'] - ) - }; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_LIST_MERCURE_OPEN': - return action.eventSource; - - case 'PROPERTYSALE_LIST_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ error, loading, retrieved, eventSource }); diff --git a/client/src/reducers/propertysale/show.js b/client/src/reducers/propertysale/show.js deleted file mode 100644 index 0359bd9..0000000 --- a/client/src/reducers/propertysale/show.js +++ /dev/null @@ -1,59 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_SHOW_ERROR': - return action.error; - - case 'PROPERTYSALE_SHOW_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'PROPERTYSALE_SHOW_RESET': - return null; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'PROPERTYSALE_SHOW_LOADING': - return action.loading; - - case 'PROPERTYSALE_SHOW_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_SHOW_SUCCESS': - case 'PROPERTYSALE_SHOW_MERCURE_MESSAGE': - return action.retrieved; - - case 'PROPERTYSALE_SHOW_RESET': - return null; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_SHOW_MERCURE_OPEN': - return action.eventSource; - - case 'PROPERTYSALE_SHOW_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ error, loading, retrieved, eventSource }); diff --git a/client/src/reducers/propertysale/update.js b/client/src/reducers/propertysale/update.js deleted file mode 100644 index d3188f4..0000000 --- a/client/src/reducers/propertysale/update.js +++ /dev/null @@ -1,106 +0,0 @@ -import { combineReducers } from 'redux'; - -export function retrieveError(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_UPDATE_RETRIEVE_ERROR': - return action.retrieveError; - - case 'PROPERTYSALE_UPDATE_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'PROPERTYSALE_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function retrieveLoading(state = false, action) { - switch (action.type) { - case 'PROPERTYSALE_UPDATE_RETRIEVE_LOADING': - return action.retrieveLoading; - - case 'PROPERTYSALE_UPDATE_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_UPDATE_RETRIEVE_SUCCESS': - case 'PROPERTYSALE_UPDATE_MERCURE_MESSAGE': - return action.retrieved; - - case 'PROPERTYSALE_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function updateError(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_UPDATE_UPDATE_ERROR': - return action.updateError; - - case 'PROPERTYSALE_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function updateLoading(state = false, action) { - switch (action.type) { - case 'PROPERTYSALE_UPDATE_UPDATE_LOADING': - return action.updateLoading; - - case 'PROPERTYSALE_UPDATE_RESET': - return false; - - default: - return state; - } -} - -export function updated(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_UPDATE_UPDATE_SUCCESS': - return action.updated; - - case 'PROPERTYSALE_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'PROPERTYSALE_UPDATE_MERCURE_OPEN': - return action.eventSource; - - case 'PROPERTYSALE_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ - retrieveError, - retrieveLoading, - retrieved, - updateError, - updateLoading, - updated, - eventSource -}); diff --git a/client/src/reducers/review/create.js b/client/src/reducers/review/create.js deleted file mode 100644 index 61c637e..0000000 --- a/client/src/reducers/review/create.js +++ /dev/null @@ -1,33 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'REVIEW_CREATE_ERROR': - return action.error; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'REVIEW_CREATE_LOADING': - return action.loading; - - default: - return state; - } -} - -export function created(state = null, action) { - switch (action.type) { - case 'REVIEW_CREATE_SUCCESS': - return action.created; - - default: - return state; - } -} - -export default combineReducers({ error, loading, created }); diff --git a/client/src/reducers/review/delete.js b/client/src/reducers/review/delete.js deleted file mode 100644 index 0ed4bee..0000000 --- a/client/src/reducers/review/delete.js +++ /dev/null @@ -1,33 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'REVIEW_DELETE_ERROR': - return action.error; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'REVIEW_DELETE_LOADING': - return action.loading; - - default: - return state; - } -} - -export function deleted(state = null, action) { - switch (action.type) { - case 'REVIEW_DELETE_SUCCESS': - return action.deleted; - - default: - return state; - } -} - -export default combineReducers({ error, loading, deleted }); diff --git a/client/src/reducers/review/index.js b/client/src/reducers/review/index.js deleted file mode 100644 index d57c1ad..0000000 --- a/client/src/reducers/review/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import { combineReducers } from 'redux'; -import list from './list'; -import create from './create'; -import update from './update'; -import del from './delete'; -import show from './show'; - -export default combineReducers({ list, create, update, del, show }); diff --git a/client/src/reducers/review/list.js b/client/src/reducers/review/list.js deleted file mode 100644 index af488ec..0000000 --- a/client/src/reducers/review/list.js +++ /dev/null @@ -1,74 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'REVIEW_LIST_ERROR': - return action.error; - - case 'REVIEW_LIST_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'REVIEW_LIST_RESET': - return null; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'REVIEW_LIST_LOADING': - return action.loading; - - case 'REVIEW_LIST_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'REVIEW_LIST_SUCCESS': - return action.retrieved; - - case 'REVIEW_LIST_RESET': - return null; - - case 'REVIEW_LIST_MERCURE_MESSAGE': - return { - ...state, - 'hydra:member': state['hydra:member'].map(item => - item['@id'] === action.retrieved['@id'] ? action.retrieved : item - ) - }; - - case 'REVIEW_LIST_MERCURE_DELETED': - return { - ...state, - 'hydra:member': state['hydra:member'].filter( - item => item['@id'] !== action.retrieved['@id'] - ) - }; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'REVIEW_LIST_MERCURE_OPEN': - return action.eventSource; - - case 'REVIEW_LIST_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ error, loading, retrieved, eventSource }); diff --git a/client/src/reducers/review/show.js b/client/src/reducers/review/show.js deleted file mode 100644 index 4926be3..0000000 --- a/client/src/reducers/review/show.js +++ /dev/null @@ -1,59 +0,0 @@ -import { combineReducers } from 'redux'; - -export function error(state = null, action) { - switch (action.type) { - case 'REVIEW_SHOW_ERROR': - return action.error; - - case 'REVIEW_SHOW_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'REVIEW_SHOW_RESET': - return null; - - default: - return state; - } -} - -export function loading(state = false, action) { - switch (action.type) { - case 'REVIEW_SHOW_LOADING': - return action.loading; - - case 'REVIEW_SHOW_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'REVIEW_SHOW_SUCCESS': - case 'REVIEW_SHOW_MERCURE_MESSAGE': - return action.retrieved; - - case 'REVIEW_SHOW_RESET': - return null; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'REVIEW_SHOW_MERCURE_OPEN': - return action.eventSource; - - case 'REVIEW_SHOW_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ error, loading, retrieved, eventSource }); diff --git a/client/src/reducers/review/update.js b/client/src/reducers/review/update.js deleted file mode 100644 index c76a84b..0000000 --- a/client/src/reducers/review/update.js +++ /dev/null @@ -1,106 +0,0 @@ -import { combineReducers } from 'redux'; - -export function retrieveError(state = null, action) { - switch (action.type) { - case 'REVIEW_UPDATE_RETRIEVE_ERROR': - return action.retrieveError; - - case 'REVIEW_UPDATE_MERCURE_DELETED': - return `${action.retrieved['@id']} has been deleted by another user.`; - - case 'REVIEW_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function retrieveLoading(state = false, action) { - switch (action.type) { - case 'REVIEW_UPDATE_RETRIEVE_LOADING': - return action.retrieveLoading; - - case 'REVIEW_UPDATE_RESET': - return false; - - default: - return state; - } -} - -export function retrieved(state = null, action) { - switch (action.type) { - case 'REVIEW_UPDATE_RETRIEVE_SUCCESS': - case 'REVIEW_UPDATE_MERCURE_MESSAGE': - return action.retrieved; - - case 'REVIEW_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function updateError(state = null, action) { - switch (action.type) { - case 'REVIEW_UPDATE_UPDATE_ERROR': - return action.updateError; - - case 'REVIEW_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function updateLoading(state = false, action) { - switch (action.type) { - case 'REVIEW_UPDATE_UPDATE_LOADING': - return action.updateLoading; - - case 'REVIEW_UPDATE_RESET': - return false; - - default: - return state; - } -} - -export function updated(state = null, action) { - switch (action.type) { - case 'REVIEW_UPDATE_UPDATE_SUCCESS': - return action.updated; - - case 'REVIEW_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export function eventSource(state = null, action) { - switch (action.type) { - case 'REVIEW_UPDATE_MERCURE_OPEN': - return action.eventSource; - - case 'REVIEW_UPDATE_RESET': - return null; - - default: - return state; - } -} - -export default combineReducers({ - retrieveError, - retrieveLoading, - retrieved, - updateError, - updateLoading, - updated, - eventSource -}); diff --git a/client/src/routes/book.js b/client/src/routes/book.js deleted file mode 100644 index 664f79a..0000000 --- a/client/src/routes/book.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { Route } from 'react-router-dom'; -import { List, Create, Update, Show } from '../components/book/'; - -export default [ - , - , - , - , - -]; diff --git a/client/src/routes/review.js b/client/src/routes/review.js deleted file mode 100644 index 9df1244..0000000 --- a/client/src/routes/review.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { Route } from 'react-router-dom'; -import { List, Create, Update, Show } from '../components/review/'; - -export default [ - , - , - , - , - -]; -- GitLab From e4dc79f790e1cdba18f5be763e738a799ec4bc31 Mon Sep 17 00:00:00 2001 From: florian-boubou Date: Mon, 6 Jan 2020 17:32:39 +0100 Subject: [PATCH 2/5] Average surface price actions and reducers --- .../propertysale/average_surface_price.js | 32 +++++++++++++++++ .../propertysale/averageSurfacePrice.js | 34 +++++++++++++++++++ client/src/reducers/propertysale/index.js | 11 +++--- 3 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 client/src/actions/propertysale/average_surface_price.js create mode 100644 client/src/reducers/propertysale/averageSurfacePrice.js diff --git a/client/src/actions/propertysale/average_surface_price.js b/client/src/actions/propertysale/average_surface_price.js new file mode 100644 index 0000000..5f59065 --- /dev/null +++ b/client/src/actions/propertysale/average_surface_price.js @@ -0,0 +1,32 @@ +import { fetch } from '../../utils/dataAccess'; + +export function loading(loading) { + return { type: 'PROPERTY_SALE_AVERAGE_SURFACE_PRICE_LOADING', loading }; +} + +export function success(retrieved) { + return { type: 'PROPERTY_SALE_AVERAGE_SURFACE_PRICE_SUCCESS', retrieved }; +} + +export function error(error) { + return { type: 'PROPERTY_SALE_AVERAGE_SURFACE_PRICE_ERROR', error }; +} + +export function fetch_data() { + return dispatch => { + dispatch(loading(true)); + + return fetch("property_sales/average_surface_price", { method: "GET" }) + .then(res => { + dispatch(loading(false)); + + return res.json(); + }) + .then(retrieved => dispatch(success(retrieved["hydra:member"]))) + .catch(e => { + dispatch(loading(false)); + + dispatch(error(e.message)); + }); + }; +} diff --git a/client/src/reducers/propertysale/averageSurfacePrice.js b/client/src/reducers/propertysale/averageSurfacePrice.js new file mode 100644 index 0000000..5436f05 --- /dev/null +++ b/client/src/reducers/propertysale/averageSurfacePrice.js @@ -0,0 +1,34 @@ +import { combineReducers } from 'redux'; + +function data(state = [], action) { + switch(action.type) { + case "PROPERTY_SALE_AVERAGE_SURFACE_PRICE_SUCCESS": + return action.retrieved; + default: + return state; + } +} + +function error(state = null, action) { + switch(action.type) { + case "PROPERTY_SALE_AVERAGE_SURFACE_PRICE_ERROR": + return action.error; + default: + return state; + } +} + +function loading(state = false, action) { + switch(action.type) { + case "PROPERTY_SALE_AVERAGE_SURFACE_PRICE_LOADING": + return action.loading; + default: + return state; + } +} + +export default combineReducers({ + data, + error, + loading, +}); \ No newline at end of file diff --git a/client/src/reducers/propertysale/index.js b/client/src/reducers/propertysale/index.js index d57c1ad..05cd1ea 100644 --- a/client/src/reducers/propertysale/index.js +++ b/client/src/reducers/propertysale/index.js @@ -1,8 +1,7 @@ import { combineReducers } from 'redux'; -import list from './list'; -import create from './create'; -import update from './update'; -import del from './delete'; -import show from './show'; -export default combineReducers({ list, create, update, del, show }); +import averageSurfacePrice from "./averageSurfacePrice"; + +export default combineReducers({ + averageSurfacePrice, +}); \ No newline at end of file -- GitLab From c8754d3ea1d4e42f44ccea68efdb8d59cf09ace7 Mon Sep 17 00:00:00 2001 From: florian-boubou Date: Mon, 6 Jan 2020 17:37:11 +0100 Subject: [PATCH 3/5] Average surface price component Hooked with redux's store, will need to refactor LineChart component to make it usable with React --- .../propertysale/AverageSurfacePrice.js | 56 +++++++++++++++++++ client/src/components/propertysale/index.js | 7 +-- client/src/routes/propertysale.js | 8 +-- 3 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 client/src/components/propertysale/AverageSurfacePrice.js diff --git a/client/src/components/propertysale/AverageSurfacePrice.js b/client/src/components/propertysale/AverageSurfacePrice.js new file mode 100644 index 0000000..4323f47 --- /dev/null +++ b/client/src/components/propertysale/AverageSurfacePrice.js @@ -0,0 +1,56 @@ +import React from "react"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; + +import LineChart from "../LineChart"; + +import * as actions from "../../actions/propertysale/average_surface_price"; + +class AverageSurfacePrice extends React.Component { + static propTypes = { + error: PropTypes.string, + loading: PropTypes.bool.isRequired, + data: PropTypes.array, + fetch_data: PropTypes.func.isRequired, + }; + + componentDidMount() { + this.props.fetch_data(); + } + + render() { + return
+

Evolution du prix du m² moyen

+ { + this.props.error && +

{this.props.error}

+ } + { + this.props.loading ? +

Chargement...

+ : + + } +
; + } +} + +const mapStateToProps = state => { + const { + propertysale: { + averageSurfacePrice: { + data, + loading, + error, + } = {}, + } = {}, + } = state; + + return { data, loading, error }; +} + +const mapDispatchToProps = dispatch => ({ + fetch_data: () => dispatch(actions.fetch_data()), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(AverageSurfacePrice); \ No newline at end of file diff --git a/client/src/components/propertysale/index.js b/client/src/components/propertysale/index.js index e936e55..8c6249a 100644 --- a/client/src/components/propertysale/index.js +++ b/client/src/components/propertysale/index.js @@ -1,6 +1,3 @@ -import Create from './Create'; -import List from './List'; -import Update from './Update'; -import Show from './Show'; +import AverageSurfacePrice from "./AverageSurfacePrice"; -export { Create, List, Update, Show }; +export { AverageSurfacePrice }; diff --git a/client/src/routes/propertysale.js b/client/src/routes/propertysale.js index 91f60a6..9162a6c 100644 --- a/client/src/routes/propertysale.js +++ b/client/src/routes/propertysale.js @@ -1,11 +1,7 @@ import React from 'react'; import { Route } from 'react-router-dom'; -import { List, Create, Update, Show } from '../components/propertysale/'; +import { AverageSurfacePrice } from '../components/propertysale'; export default [ - , - , - , - , - + , ]; -- GitLab From 79d58229eb95a52f6bc3f8c23c0a9747a78658ba Mon Sep 17 00:00:00 2001 From: florian-boubou Date: Mon, 6 Jan 2020 20:53:55 +0100 Subject: [PATCH 4/5] Reactify LineChart And create average surface price component/page --- client/src/components/LineChart.js | 201 ++++++++---------- .../propertysale/AverageSurfacePrice.js | 7 +- client/src/homepage.js | 5 + client/src/index.js | 2 +- 4 files changed, 97 insertions(+), 118 deletions(-) diff --git a/client/src/components/LineChart.js b/client/src/components/LineChart.js index 0b5c7a5..78e0306 100644 --- a/client/src/components/LineChart.js +++ b/client/src/components/LineChart.js @@ -1,147 +1,116 @@ import React, { Component } from 'react'; +import ReactDOM from "react-dom"; +import PropTypes from "prop-types"; import * as d3 from 'd3'; class LineChart extends Component { + static propTypes = { + yLabel: PropTypes.string, + xLabel: PropTypes.string, + width: PropTypes.number.isRequired, + height: PropTypes.number.isRequired, + data: PropTypes.array.isRequired, + }; - componentDidMount() { - this.drawChart(); - } - - componentDidUpdate() { - this.drawChart(); - } - - // - - - - - - - - - - - - drawChart() { - const data = [ - { date: "10/25/2018", value: 1 }, - { date: "10/26/2018", value: 3 }, - { date: "10/27/2018", value: 0 }, - { date: "10/28/2018", value: 0 }, - { date: "10/29/2018", value: 5 }, - { date: "10/30/2018", value: 8 }, - { date: "10/31/2018", value: 7 }, - { date: "11/01/2018", value: 11 }, - { date: "11/02/2018", value: 23 }, - { date: "11/03/2018", value: 13 }, - { date: "11/04/2018", value: 15 }, - { date: "11/05/2018", value: 37 }, - { date: "11/06/2018", value: 32 }, - { date: "11/07/2018", value: 38 }, - { date: "11/08/2018", value: 42 }, - { date: "11/09/2018", value: 43 }, - { date: "11/10/2018", value: 21 }, - { date: "11/11/2018", value: 24 }, - { date: "11/12/2018", value: 50 }, - { date: "11/13/2018", value: 53 }, - { date: "11/14/2018", value: 59 }, - { date: "11/15/2018", value: 61 }, - { date: "11/16/2018", value: 62 } - ]; - - - const margin = { top: 50, right: 40, bottom: 10, left: 100 }; + render() { + const margin = { top: 50, right: 40, bottom: 10, left: 50 }; const padding = { top: 10, right: 10, bottom: 10, left: 10 }; - const x = 800; - const y = 600; - const width = 20 + x - margin.right - margin.left; + const x = this.props.width; + const y = this.props.height; + const width = x - margin.right - margin.left; const height = padding.top + padding.right + padding.bottom + padding.left + y + margin.top + margin.bottom; - // Line generator. - const line = d3 - .line() - .x((d) => xScale(d.date)) - .y((d) => yScale(d.value)) - .curve(d3.curveMonotoneX); + const parseTime = d3.timeParse("%Y-%m-%d %H:%M:%S"); - var parseTime = d3.timeParse("%m/%d/%Y"); + const plotData = this.props.data.map(({month, value}) => ({ + x: parseTime(month), + y: parseFloat(value) / 1000, + })); - data.forEach(function(d) { - d.date = parseTime(d.date); - }); + const xExtent = d3.extent(plotData, ({x}) => x); + const yExtent = d3.extent(plotData, ({y}) => y); + + yExtent[1] += 0.15 * (yExtent[1] - yExtent[0]); + + console.log(yExtent) const xScale = d3 .scaleTime() - .domain(d3.extent(data, function(d) { return d.date; })) + .domain(xExtent) .range([0, width]); + console.log(yExtent); + const yScale = d3 .scaleLinear() - .domain(d3.extent(data, function(d) { return d.value })) + .domain(yExtent) .range([height, 0]); - // - - - - - - - - - - - - // Main SVG - const svg = d3.select("#app") - .append("svg") - .attr("width", width + 100) - .attr("height", height + 100) - .style("margin-top", margin.top) - .style("margin-left", margin.left) - .style("border", "1px solid black") - .append('g') - .attr('transform', `translate(${margin.left}, ${margin.top})`); + // Line generator. + const line = d3.line() + .x(({x}) => xScale(x)) + .y(({y}) => yScale(y)) + .curve(d3.curveMonotoneX); - const xAxis = d3.axisBottom(xScale) - .tickSizeOuter(0) - .tickFormat(d3.timeFormat("%d %m %Y")); - - const xAxisDraw = svg - .append('g') - .attr('transform', `translate(0, ${height})`) - .attr('class', 'x axis') - .call(xAxis); - - // Draw y axis. const yAxis = d3 .axisLeft(yScale) - .ticks(3) .tickSizeOuter(0) .tickSizeInner(-width); - const yAxisDraw = svg - .append('g') - .attr('class', 'y axis') - .style("color", "#999") - .call(yAxis); - - const chartGroup = svg.append('g').attr('class', 'line-chart'); - - // - - - - - - - - - - - - svg.append("path") - .data([data]) - .attr("class", "line") - .attr("fill", "none") - .attr("stroke", "red") - .attr("d", line) - - - // - - - - - - - - - - - - // Draw header. - const header = svg - .append('g') - .attr('class', 'line-chart-header') - .attr('transform', `translate(${width / 2 }, ${0})`) - .append('text'); - - header.append('tspan').text('Prix Moyen du M²'); - - const yLabel = svg - .append('g') - .attr('class', 'yLabel') - .attr('transform', `translate(${ -80 },${height / 2})`) - .append('text') - .attr('dy', '1em') - .style('font-size', '2.0em') - .style('fill', '#555') - .text('K€'); - - - svg.exit().remove() + const xAxis = d3.axisBottom(xScale) + .tickFormat(d3.timeFormat("%m/%Y")); + + return + {this.props.yLabel} + {this.props.xLabel} + + + + + + ; + } +} + +class Axis extends React.Component { + static propTypes = { + h: PropTypes.number, + axis: PropTypes.func, + axisType: PropTypes.oneOf(['x','y']) + }; + + componentDidUpdate() { + this.renderAxis(); + } + + componentDidMount() { + this.renderAxis(); + } + + renderAxis() { + var node = ReactDOM.findDOMNode(this); + d3.select(node).call(this.props.axis); } render() { - return
+ var translate = "translate(0,"+(this.props.h)+")"; + + return ( + + ); } } diff --git a/client/src/components/propertysale/AverageSurfacePrice.js b/client/src/components/propertysale/AverageSurfacePrice.js index 4323f47..c3d540b 100644 --- a/client/src/components/propertysale/AverageSurfacePrice.js +++ b/client/src/components/propertysale/AverageSurfacePrice.js @@ -29,7 +29,12 @@ class AverageSurfacePrice extends React.Component { this.props.loading ?

Chargement...

: - + } ; } diff --git a/client/src/homepage.js b/client/src/homepage.js index 2b6b5df..669cbc2 100644 --- a/client/src/homepage.js +++ b/client/src/homepage.js @@ -6,6 +6,11 @@ const homepage = () => (