mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-19 22:30:31 +00:00
feat: remove SET_DASHBOARD_REQUEST_LOADING reducer.
feat: fix dropdown filter. feat: fix fetch resource data.
This commit is contained in:
@@ -4,9 +4,6 @@ import t from 'store/types';
|
||||
export const submitEstimate = ({ form }) => {
|
||||
return (dispatch) =>
|
||||
new Promise((resolve, reject) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
ApiService.post('sales/estimates', form)
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
|
||||
@@ -37,9 +37,6 @@ export const deleteInvoice = ({ id }) => {
|
||||
export const editInvoice = (id, form) => {
|
||||
return (dispatch) =>
|
||||
new Promise((resolve, reject) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
ApiService.post(`sales/invoices/${id}`, form)
|
||||
.then((response) => {
|
||||
resolve(response);
|
||||
|
||||
@@ -60,9 +60,6 @@ export const fetchAccountsTable = ({ query } = {}) => {
|
||||
type: t.ACCOUNTS_TABLE_LOADING,
|
||||
loading: true,
|
||||
});
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
ApiService.get('accounts', { params: { ...pageQuery, ...query } })
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
@@ -105,9 +102,6 @@ export const fetchAccountsDataTable = ({ query }) => {
|
||||
export const submitAccount = ({ form }) => {
|
||||
return (dispatch) =>
|
||||
new Promise((resolve, reject) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
ApiService.post('accounts', form)
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
@@ -136,9 +130,6 @@ export const submitAccount = ({ form }) => {
|
||||
export const editAccount = (id, form) => {
|
||||
return (dispatch) =>
|
||||
new Promise((resolve, reject) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
ApiService.post(`accounts/${id}`, form)
|
||||
.then((response) => {
|
||||
dispatch({ type: t.CLEAR_ACCOUNT_FORM_ERRORS });
|
||||
|
||||
@@ -10,17 +10,12 @@ export const submitCustomer = ({ form }) => {
|
||||
|
||||
ApiService.post('customers', form)
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_COMPLETED,
|
||||
});
|
||||
resolve(response);
|
||||
})
|
||||
.catch((error) => {
|
||||
const { response } = error;
|
||||
const { data } = response;
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_COMPLETED,
|
||||
});
|
||||
|
||||
reject(data?.errors);
|
||||
});
|
||||
});
|
||||
@@ -35,17 +30,12 @@ export const editCustomer = ({ form, id }) => {
|
||||
|
||||
ApiService.post(`customers/${id}`, form)
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_COMPLETED,
|
||||
});
|
||||
resolve(response);
|
||||
})
|
||||
.catch((error) => {
|
||||
const { response } = error;
|
||||
const { data } = response;
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_COMPLETED,
|
||||
});
|
||||
|
||||
reject(data?.errors);
|
||||
});
|
||||
});
|
||||
@@ -59,9 +49,6 @@ export const fetchCustomers = ({ query }) => {
|
||||
type: t.ITEMS_TABLE_LOADING,
|
||||
payload: { loading: true },
|
||||
});
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
ApiService.get(`customers`, { params: { ...pageQuery, ...query } })
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
@@ -79,15 +66,9 @@ export const fetchCustomers = ({ query }) => {
|
||||
type: t.CUSTOMERS_TABLE_LOADING,
|
||||
payload: { loading: false },
|
||||
});
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_COMPLETED,
|
||||
});
|
||||
resolve(response);
|
||||
})
|
||||
.catch((error) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_COMPLETED,
|
||||
});
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,7 +3,7 @@ import { createReducer } from '@reduxjs/toolkit';
|
||||
|
||||
const initialState = {
|
||||
pageTitle: '',
|
||||
pageSubtitle: 'Hello World',
|
||||
pageSubtitle: '',
|
||||
preferencesPageTitle: '',
|
||||
sidebarExpended: true,
|
||||
dialogs: {},
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { createSelector } from "@reduxjs/toolkit";
|
||||
|
||||
const dialogByNameSelector = (dialogName) => (state) => state.dashboard.dialogs?.[dialogName];
|
||||
const dialogByNameSelector = (state, props) => state.dashboard.dialogs?.[props.dialogName];
|
||||
|
||||
export const isDialogOpenFactory = (dialogName) => createSelector(
|
||||
dialogByNameSelector(dialogName),
|
||||
export const isDialogOpenFactory = () => createSelector(
|
||||
dialogByNameSelector,
|
||||
(dialog) => {
|
||||
return dialog && dialog.isOpen;
|
||||
},
|
||||
);
|
||||
|
||||
export const getDialogPayloadFactory = (dialogName) => createSelector(
|
||||
dialogByNameSelector(dialogName),
|
||||
export const getDialogPayloadFactory = () => createSelector(
|
||||
dialogByNameSelector,
|
||||
(dialog) => {
|
||||
return { ...dialog?.payload };
|
||||
},
|
||||
|
||||
@@ -18,9 +18,6 @@ export const fetchItems = ({ query }) => {
|
||||
type: t.ITEMS_TABLE_LOADING,
|
||||
payload: { loading: true },
|
||||
});
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
ApiService.get(`items`, { params: { ...pageQuery, ...query } })
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
|
||||
@@ -4,9 +4,6 @@ import t from 'store/types';
|
||||
export const submitReceipt = ({ form }) => {
|
||||
return (dispatch) =>
|
||||
new Promise((resolve, reject) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
ApiService.post('sales/receipts', form)
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
|
||||
@@ -20,14 +20,11 @@ export const fetchResourceColumns = ({ resourceSlug }) => {
|
||||
export const fetchResourceFields = ({ resourceSlug }) => {
|
||||
return (dispatch) => new Promise((resolve, reject) => {
|
||||
ApiService.get(`resources/${resourceSlug}/fields`).then((response) => {
|
||||
// dispatch({
|
||||
// type: t.RESOURCE_FIELDS_SET,
|
||||
// fields: response.data.resource_fields,
|
||||
// resource_slug: resourceSlug,
|
||||
// });
|
||||
// dispatch({
|
||||
// type: t.SET_DASHBOARD_REQUEST_COMPLETED,
|
||||
// });
|
||||
dispatch({
|
||||
type: t.RESOURCE_FIELDS_SET,
|
||||
fields: response.data.resource_fields,
|
||||
resource_slug: resourceSlug,
|
||||
});
|
||||
resolve(response);
|
||||
}).catch((error) => { reject(error); });
|
||||
});
|
||||
@@ -36,13 +33,13 @@ export const fetchResourceFields = ({ resourceSlug }) => {
|
||||
export const fetchResourceData = ({ resourceSlug }) => {
|
||||
return (dispatch) => new Promise((resolve, reject) => {
|
||||
ApiService.get(`/resources/${resourceSlug}/data`).then((response) => {
|
||||
// dispatch({
|
||||
// type: t.RESOURCE_DATA_SET,
|
||||
// payload: {
|
||||
// data: response.data.data,
|
||||
// resource_key: resourceSlug,
|
||||
// },
|
||||
// });
|
||||
dispatch({
|
||||
type: t.RESOURCE_DATA_SET,
|
||||
payload: {
|
||||
data: response.data.resource_data,
|
||||
resourceKey: resourceSlug,
|
||||
},
|
||||
});
|
||||
resolve(response);
|
||||
}).catch(error => { reject(error); });
|
||||
});
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { createReducer } from "@reduxjs/toolkit";
|
||||
import { createSelector } from 'reselect';
|
||||
import t from 'store/types';
|
||||
import { pickItemsFromIds } from 'store/selectors'
|
||||
|
||||
const initialState = {
|
||||
data: {},
|
||||
data: {
|
||||
resources: {},
|
||||
},
|
||||
fields: {},
|
||||
columns: {},
|
||||
resourceFields: {},
|
||||
@@ -42,79 +42,30 @@ export default createReducer(initialState, {
|
||||
|
||||
[t.RESOURCE_FIELDS_SET]: (state, action) => {
|
||||
const _fields = {};
|
||||
|
||||
|
||||
action.fields.forEach((field) => {
|
||||
_fields[field.id] = field;
|
||||
_fields[field.key] = field;
|
||||
});
|
||||
state.fields = {
|
||||
...state.fields,
|
||||
..._fields,
|
||||
};
|
||||
state.resourceFields[action.resource_slug] = action.fields.map(f => f.id);
|
||||
state.resourceFields[action.resource_slug] = action.fields.map(f => f.key);
|
||||
},
|
||||
|
||||
[t.RESOURCE_DATA_SET]: (state, action) => {
|
||||
const { data, resource_key: resourceKey } = action.payload;
|
||||
const dataMapped = {};
|
||||
const { data, resourceKey } = action.payload;
|
||||
const _data = {};
|
||||
|
||||
data.forEach((item) => { dataMapped[item.id] = item; })
|
||||
state.data[resourceKey] = dataMapped;
|
||||
data.forEach((item) => {
|
||||
_data[item.id] = item;
|
||||
});
|
||||
const order = data.map((item) => item.id);
|
||||
|
||||
state.data.resources[resourceKey] = {
|
||||
...(state.data.resources[resourceKey] || {}),
|
||||
data: _data,
|
||||
order,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
const resourceFieldsIdsSelector = (state, props) => state.resources.resourceFields[props.resourceName];
|
||||
const resourceFieldsItemsSelector = (state) => state.resources.fields;
|
||||
|
||||
/**
|
||||
* Retrieve resource fields of the given resource slug.
|
||||
* @param {Object} state
|
||||
* @param {String} resourceSlug
|
||||
* @return {Array}
|
||||
*/
|
||||
export const getResourceFieldsFactory = () => createSelector(
|
||||
resourceFieldsIdsSelector,
|
||||
resourceFieldsItemsSelector,
|
||||
(fieldsIds, fieldsItems) => {
|
||||
return pickItemsFromIds(fieldsItems, fieldsIds);
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Retrieve resource columns of the given resource slug.
|
||||
* @param {State} state
|
||||
* @param {String} resourceSlug -
|
||||
* @return {Array}
|
||||
*/
|
||||
export const getResourceColumns = (state, resourceSlug) => {
|
||||
const resourceIds = state.resources.resourceColumns[resourceSlug];
|
||||
const items = state.resources.columns;
|
||||
return pickItemsFromIds(items, resourceIds);
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {State} state
|
||||
* @param {Number} fieldId
|
||||
*/
|
||||
export const getResourceField = (state, fieldId) => {
|
||||
return state.resources.fields[fieldId];
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {State} state
|
||||
* @param {Number} columnId
|
||||
*/
|
||||
export const getResourceColumn = (state, columnId) => {
|
||||
return state.resources.columns[columnId];
|
||||
};
|
||||
|
||||
export const getResourceMetadata = (state, resourceSlug) => {
|
||||
return state.resources.metadata[resourceSlug];
|
||||
};
|
||||
|
||||
|
||||
export const getResourceData = (state, resourceSlug) => {
|
||||
return state.resources.data[resourceSlug] || {};
|
||||
};
|
||||
});
|
||||
77
client/src/store/resources/resources.selectors.js
Normal file
77
client/src/store/resources/resources.selectors.js
Normal file
@@ -0,0 +1,77 @@
|
||||
import { createSelector } from 'reselect';
|
||||
import { pickItemsFromIds } from 'store/selectors';
|
||||
|
||||
const resourceDataIdsSelector = (state, props) => {
|
||||
return state.resources.data.resources[props.resourceName]?.order;
|
||||
}
|
||||
const resourceDataSelector = (state, props) => {
|
||||
return state.resources.data.resources[props.resourceName]?.data;
|
||||
}
|
||||
|
||||
const resourceFieldsIdsSelector = (state, props) => state.resources.resourceFields[props.resourceName];
|
||||
const resourceFieldsItemsSelector = (state) => state.resources.fields;
|
||||
|
||||
/**
|
||||
* Retrieve resource fields of the given resource slug.
|
||||
* @param {Object} state
|
||||
* @param {String} resourceSlug
|
||||
* @return {Array}
|
||||
*/
|
||||
export const getResourceFieldsFactory = () => createSelector(
|
||||
resourceFieldsIdsSelector,
|
||||
resourceFieldsItemsSelector,
|
||||
(fieldsIds, fieldsItems) => {
|
||||
return pickItemsFromIds(fieldsItems, fieldsIds);
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Retrieve resource data of the given resource name in component properties.
|
||||
* @return {Array}
|
||||
*/
|
||||
export const getResourceDataFactory = () => createSelector(
|
||||
resourceDataSelector,
|
||||
resourceDataIdsSelector,
|
||||
(resourceData, resourceDataIds) => {
|
||||
return pickItemsFromIds(resourceData, resourceDataIds);
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Retrieve resource columns of the given resource slug.
|
||||
* @param {State} state
|
||||
* @param {String} resourceSlug -
|
||||
* @return {Array}
|
||||
*/
|
||||
export const getResourceColumns = (state, resourceSlug) => {
|
||||
const resourceIds = state.resources.resourceColumns[resourceSlug];
|
||||
const items = state.resources.columns;
|
||||
return pickItemsFromIds(items, resourceIds);
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {State} state
|
||||
* @param {Number} fieldId
|
||||
*/
|
||||
export const getResourceField = (state, fieldId) => {
|
||||
return state.resources.fields[fieldId];
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {State} state
|
||||
* @param {Number} columnId
|
||||
*/
|
||||
export const getResourceColumn = (state, columnId) => {
|
||||
return state.resources.columns[columnId];
|
||||
};
|
||||
|
||||
export const getResourceMetadata = (state, resourceSlug) => {
|
||||
return state.resources.metadata[resourceSlug];
|
||||
};
|
||||
|
||||
|
||||
export const getResourceData = (state, resourceSlug) => {
|
||||
return state.resources.data[resourceSlug] || {};
|
||||
};
|
||||
4
client/src/store/vendors/vendors.actions.js
vendored
4
client/src/store/vendors/vendors.actions.js
vendored
@@ -79,10 +79,6 @@ export const deleteVendor = ({ id }) => {
|
||||
export const submitVendor = ({ form }) => {
|
||||
return (dispatch) =>
|
||||
new Promise((resolve, reject) => {
|
||||
dispatch({
|
||||
type: t.SET_DASHBOARD_REQUEST_LOADING,
|
||||
});
|
||||
|
||||
ApiService.post('vendors', form)
|
||||
.then((response) => {
|
||||
dispatch({
|
||||
|
||||
Reference in New Issue
Block a user