diff --git a/client/src/actions/book/create.js b/client/src/actions/book/create.js deleted file mode 100644 index 376ca525fd1646f08f99293c6692305f2c5b4676..0000000000000000000000000000000000000000 --- 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 dd164b068db6880c151a611585bead7ceb3dc0a0..0000000000000000000000000000000000000000 --- 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 613333002570bc9b2a35fe49c797ecdc28583b23..0000000000000000000000000000000000000000 --- 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 f9c5ff784ad20f1642eaec7193c6a51c3fcefdb8..0000000000000000000000000000000000000000 --- 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 d109c3bd07ee248febd294df48a297dd343c1278..0000000000000000000000000000000000000000 --- 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/average_surface_price.js b/client/src/actions/propertysale/average_surface_price.js new file mode 100644 index 0000000000000000000000000000000000000000..5f590653e221f41d2917e6412e629c41a927a243 --- /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/actions/propertysale/create.js b/client/src/actions/propertysale/create.js deleted file mode 100644 index 3552a91bdcd3f0e53b474bdcc99d1e0f34a9eb6a..0000000000000000000000000000000000000000 --- 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 635b194a905512396862bd0481e9edb8f938c01b..0000000000000000000000000000000000000000 --- 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 9297b42c17c7894143fa6fdf117df8ac0630d77e..0000000000000000000000000000000000000000 --- 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 b0a84a6c418b262e86189b29c9a5bb61f1044cfe..0000000000000000000000000000000000000000 --- 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 c9caa1087458a25e40d92bc525dc50fb4dba6372..0000000000000000000000000000000000000000 --- 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 f51ddb28a2a2167dc7af19b30f4f6527bf7e50f4..0000000000000000000000000000000000000000 --- 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 e464f970ca352d4428e4bec6cddeb02117380f8a..0000000000000000000000000000000000000000 --- 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 d90996974f76c0a590a4b6fab41b0dceddbd1c3b..0000000000000000000000000000000000000000 --- 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 3276b6065cebd5305590215a5c7f54a549a540c2..0000000000000000000000000000000000000000 --- 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 6dd158129e9c31ecff669b2878b8eebc5b3a2f4d..0000000000000000000000000000000000000000 --- 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/LineChart.js b/client/src/components/LineChart.js index 0b5c7a580d73211402976403fe51d776f6ee9aa5..f4a3f799febf671808a01a624eb940f45d36e491 100644 --- a/client/src/components/LineChart.js +++ b/client/src/components/LineChart.js @@ -1,147 +1,112 @@ 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"); + + const plotData = this.props.data.map(({month, value}) => ({ + x: parseTime(month), + y: parseFloat(value) / 1000, + })); - var parseTime = d3.timeParse("%m/%d/%Y"); + const xExtent = d3.extent(plotData, ({x}) => x); + const yExtent = d3.extent(plotData, ({y}) => y); - data.forEach(function(d) { - d.date = parseTime(d.date); - }); + yExtent[1] += 0.15 * (yExtent[1] - yExtent[0]); const xScale = d3 .scaleTime() - .domain(d3.extent(data, function(d) { return d.date; })) + .domain(xExtent) .range([0, width]); 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})`); - - const xAxis = d3.axisBottom(xScale) - .tickSizeOuter(0) - .tickFormat(d3.timeFormat("%d %m %Y")); + // Line generator. + const line = d3.line() + .x(({x}) => xScale(x)) + .y(({y}) => yScale(y)) + .curve(d3.curveMonotoneX); - 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€'); - + const xAxis = d3.axisBottom(xScale) + .tickFormat(d3.timeFormat("%m/%Y")); + + return + {this.props.yLabel} + {this.props.xLabel} + + + + + + ; + } +} - svg.exit().remove() +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/book/Create.js b/client/src/components/book/Create.js deleted file mode 100644 index 87550ce752bb212abc2a5570fdf3aa1bb2530d86..0000000000000000000000000000000000000000 --- 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 9cbb4e00b529c9363cd9ca330e1f4e1769bf4b2e..0000000000000000000000000000000000000000 --- 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 202a74b359f48e6b246df72c6c92f2a126c522c9..0000000000000000000000000000000000000000 --- 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 42c3e70c0a0ea47f8779e0dc8cfd680de6fee0cc..0000000000000000000000000000000000000000 --- 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 ac13d32c20bbe48a249e88d3c85de447334cbd3f..0000000000000000000000000000000000000000 --- 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 e936e55eaff8d79ab2499834fa8ac4907938769b..0000000000000000000000000000000000000000 --- 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/AverageSurfacePrice.js b/client/src/components/propertysale/AverageSurfacePrice.js new file mode 100644 index 0000000000000000000000000000000000000000..c3d540be2605c5f8bde05a2bd0ab436c89d2c688 --- /dev/null +++ b/client/src/components/propertysale/AverageSurfacePrice.js @@ -0,0 +1,61 @@ +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/Create.js b/client/src/components/propertysale/Create.js deleted file mode 100644 index 24a4e14e08bf1f53e84a5f81d2e208d518c15c6d..0000000000000000000000000000000000000000 --- 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 2bf266c417df9e767e6c4777b607f6830992e09d..0000000000000000000000000000000000000000 --- 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 6d4ae8734b90f3fd95da0d5c8f18e9bf2761e265..0000000000000000000000000000000000000000 --- 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 10b3d746a6cbd81e291eff4bf08a28717af34ad2..0000000000000000000000000000000000000000 --- 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 9c04a2baf9e08a9d14581fdd98c69d7c10c2758f..0000000000000000000000000000000000000000 --- 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/propertysale/index.js b/client/src/components/propertysale/index.js index e936e55eaff8d79ab2499834fa8ac4907938769b..8c6249ae17c757e2c118264caffedf24dbba4f70 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/components/review/Create.js b/client/src/components/review/Create.js deleted file mode 100644 index b5a73301230ac41dd536c44800c5e3d18e9eabe6..0000000000000000000000000000000000000000 --- 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 304121a8b66274986d361e9888007e580d2951e3..0000000000000000000000000000000000000000 --- 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 0e20cda0baf0e4e195999893501e98f7d74adb61..0000000000000000000000000000000000000000 --- 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 919d2ee858c6f482593402b61efcd2147571b835..0000000000000000000000000000000000000000 --- 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 d6a3862aeb0af935dc994f47f12334857fc225ca..0000000000000000000000000000000000000000 --- 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 e936e55eaff8d79ab2499834fa8ac4907938769b..0000000000000000000000000000000000000000 --- 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/homepage.js b/client/src/homepage.js index 2b6b5df7fa4ccc02579d0ae1ff07b80f889b57c0..669cbc2a8fe4ea2fe3b98c6b49251c6c071aa30f 100644 --- a/client/src/homepage.js +++ b/client/src/homepage.js @@ -6,6 +6,11 @@ const homepage = () => (