- feat: Update react-query package to V 2.1.1.

- feat: Favicon setup.
- feat: Fix accounts inactivate/activate 1 account.
- feat: Seed accounts, expenses and manual journals resource fields.
- feat: Validate make journal receivable/payable without contact.
- feat: Validate make journal contact without receivable or payable.
- feat: More components abstractions.
- feat: Use reselect.js to memorize components properties.
- fix: Journal type of manual journal.
- fix: Sidebar style optimization.
- fix: Data-table check-box style optimization.
- fix: Data-table spinner style dimensions.
- fix: Submit journal with contact_id and contact_type.
This commit is contained in:
Ahmed Bouhuolia
2020-07-01 12:51:12 +02:00
parent 111aa83908
commit 4718f63c94
94 changed files with 1706 additions and 1001 deletions

View File

@@ -1,3 +1,4 @@
import { omit } from 'lodash';
import ApiService from 'services/ApiService';
import t from 'store/types';
@@ -107,19 +108,27 @@ export const publishManualJournal = ({ id }) => {
export const fetchManualJournalsTable = ({ query } = {}) => {
return (dispatch, getState) =>
new Promise((resolve, reject) => {
let pageQuery = getState().manualJournals.tableQuery;
if (pageQuery.filter_roles) {
pageQuery = {
...omit(pageQuery, ['filter_roles']),
stringified_filter_roles: JSON.stringify(pageQuery.filter_roles) || '',
};
}
dispatch({
type: t.MANUAL_JOURNALS_TABLE_LOADING,
loading: true,
});
ApiService.get('accounting/manual-journals', {
params: { ...query },
params: { ...pageQuery, ...query },
})
.then((response) => {
dispatch({
type: t.MANUAL_JOURNALS_PAGE_SET,
payload: {
manualJournals: response.data.manualJournals.results,
customViewId: response.data.customViewId || -1,
customViewId: response.data.manualJournals?.viewMeta?.customViewId || -1,
pagination: response.data.manualJournals.pagination,
}
});
@@ -131,6 +140,7 @@ export const fetchManualJournalsTable = ({ query } = {}) => {
type: 'MANUAL_JOURNALS_PAGINATION_SET',
payload: {
pagination: response.data.manualJournals.pagination,
customViewId: response.data.manualJournals?.viewMeta?.customViewId || -1,
},
});
dispatch({

View File

@@ -30,7 +30,7 @@ const reducer = createReducer(initialState, {
[t.MANUAL_JOURNAL_PUBLISH]: (state, action) => {
const { id } = action.payload;
const item = state.items[id] || {};
const item = state.items[id] || {}
state.items[id] = { ...item, status: 1 };
},
@@ -72,7 +72,8 @@ const reducer = createReducer(initialState, {
},
[t.MANUAL_JOURNALS_SET_CURRENT_VIEW]: (state, action) => {
state.currentViewId = action.currentViewId;
const { currentViewId } = action.payload;
state.currentViewId = currentViewId;
},
[t.MANUAL_JOURNAL_REMOVE]: (state, action) => {
@@ -93,19 +94,26 @@ const reducer = createReducer(initialState, {
},
[t.MANUAL_JOURNALS_PAGINATION_SET]: (state, action) => {
const { pagination } = action.payload;
const { pagination, customViewId } = action.payload;
const mapped = {
pageSize: parseInt(pagination.pageSize, 10),
page: parseInt(pagination.page, 10),
total: parseInt(pagination.total, 10),
};
state.paginationMeta = {
...state.paginationMeta,
const paginationMeta = {
...mapped,
pagesCount: Math.ceil(mapped.total / mapped.pageSize),
pageIndex: Math.max(mapped.page - 1, 0),
};
state.views = {
...state.views,
[customViewId]: {
...(state.views?.[customViewId] || {}),
paginationMeta,
},
};
}
});

View File

@@ -1,11 +1,44 @@
import { pickItemsFromIds } from 'store/selectors';
import { createSelector } from 'reselect';
import { pickItemsFromIds, paginationLocationQuery } from 'store/selectors';
export const getManualJournalsItems = (state, viewId, pageNumber) => {
const accountsViewPages = state.manualJournals.views[viewId || -1];
const accountsView = accountsViewPages?.pages?.[pageNumber]?.ids || {};
const accountsItems = state.manualJournals.items;
return typeof accountsView === 'object'
? pickItemsFromIds(accountsItems, accountsView) || []
: [];
const manualJournalsPageSelector = (state, props, query) => {
const viewId = state.manualJournals.currentViewId;
return state.manualJournals.views?.[viewId]?.pages?.[query.page];
};
const manualJournalsPaginationSelector = (state, props) => {
const viewId = state.manualJournals.currentViewId;
return state.manualJournals.views?.[viewId];
};
const manualJournalsTableQuery = (state) => state.manualJournals.tableQuery;
const manualJournalsDataSelector = (state) => state.manualJournals.items;
export const getManualJournalsItems = createSelector(
manualJournalsPageSelector,
manualJournalsDataSelector,
(manualJournalsPage, manualJournalsItems) => {
return typeof manualJournalsPage === 'object'
? pickItemsFromIds(manualJournalsItems, manualJournalsPage.ids) || []
: [];
},
);
export const getManualJournalsPagination = createSelector(
manualJournalsPaginationSelector,
(manualJournalsPage) => {
return manualJournalsPage?.paginationMeta || {};
},
);
export const getManualJournalsTableQuery = createSelector(
paginationLocationQuery,
manualJournalsTableQuery,
(locationQuery, tableQuery) => {
return {
...locationQuery,
...tableQuery,
};
},
);