This commit is contained in:
a.bouhuolia
2021-02-21 19:36:06 +02:00
41 changed files with 2112 additions and 226 deletions

View File

@@ -13,7 +13,7 @@ export function openDialog(name, payload) {
name: name,
payload: payload,
};
};
}
export function closeDialog(name, payload) {
return {
@@ -24,7 +24,7 @@ export function closeDialog(name, payload) {
}
export function openAlert(name, payload) {
return {
return {
type: t.OPEN_ALERT,
name,
payload,
@@ -32,9 +32,24 @@ export function openAlert(name, payload) {
}
export function closeAlert(name, payload) {
return {
return {
type: t.CLOSE_ALERT,
name,
payload,
};
}
}
export function openDrawer(name, payload) {
return {
type: t.OPEN_DRAWER,
name,
payload,
};
}
export function closeDrawer(name, payload) {
return {
type: t.CLOSE_DRAWER,
name,
payload,
};
}

View File

@@ -1,7 +1,7 @@
import t from 'store/types';
import { createReducer } from '@reduxjs/toolkit';
import { persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage' // defaults to localStorage for web
import { persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage'; // defaults to localStorage for web
const initialState = {
pageTitle: '',
@@ -12,6 +12,7 @@ const initialState = {
previousSidebarExpended: null,
dialogs: {},
alerts: {},
drawers: {},
topbarEditViewId: null,
requestsLoading: 0,
backLink: false,
@@ -61,10 +62,19 @@ const reducerInstance = createReducer(initialState, {
isOpen: false,
};
},
[t.CLOSE_ALL_DIALOGS]: (state, action) => {
[t.OPEN_DRAWER]: (state, action) => {
state.drawers[action.name] = {
isOpen: true,
payload: action.payload || {},
};
},
[t.CLOSE_DRAWER]: (state, action) => {
state.drawers[action.name] = {
...state.drawers[action.name],
isOpen: false,
};
},
[t.CLOSE_ALL_DIALOGS]: (state, action) => {},
[t.SET_TOPBAR_EDIT_VIEW]: (state, action) => {
state.topbarEditViewId = action.id;
@@ -102,27 +112,31 @@ const reducerInstance = createReducer(initialState, {
[t.SET_DASHBOARD_BACK_LINK]: (state, action) => {
const { backLink } = action.payload;
state.backLink = backLink;
}
},
});
export default persistReducer({
key: 'bigcapital:dashboard',
blacklist: [
'pageTitle',
'pageSubtitle',
'pageHint',
'preferencesPageTitle',
'topbarEditViewId',
'backLink'
],
storage,
}, reducerInstance);
export default persistReducer(
{
key: 'bigcapital:dashboard',
blacklist: [
'pageTitle',
'pageSubtitle',
'pageHint',
'preferencesPageTitle',
'topbarEditViewId',
'backLink',
],
storage,
},
reducerInstance,
);
export const getDialogPayload = (state, dialogName) => {
return typeof state.dashboard.dialogs[dialogName] !== 'undefined'
? state.dashboard.dialogs[dialogName].payload : {};
? state.dashboard.dialogs[dialogName].payload
: {};
};
export const getDialogActiveStatus = (state, dialogName) => {
return true;
};
};

View File

@@ -1,33 +1,40 @@
import { createSelector } from "@reduxjs/toolkit";
import { createSelector } from '@reduxjs/toolkit';
const dialogByNameSelector = (state, props) => state.dashboard.dialogs?.[props.dialogName];
const dialogByNameSelector = (state, props) =>
state.dashboard.dialogs?.[props.dialogName];
export const isDialogOpenFactory = () => createSelector(
dialogByNameSelector,
(dialog) => {
export const isDialogOpenFactory = () =>
createSelector(dialogByNameSelector, (dialog) => {
return dialog && dialog.isOpen;
},
);
});
export const getDialogPayloadFactory = () => createSelector(
dialogByNameSelector,
(dialog) => {
export const getDialogPayloadFactory = () =>
createSelector(dialogByNameSelector, (dialog) => {
return { ...dialog?.payload };
},
);
});
const alertByNameSelector = (state, props) => state.dashboard.alerts?.[props.name];
const alertByNameSelector = (state, props) =>
state.dashboard.alerts?.[props.name];
export const isAlertOpenFactory = () => createSelector(
alertByNameSelector,
(alert) => {
export const isAlertOpenFactory = () =>
createSelector(alertByNameSelector, (alert) => {
return alert && alert.isOpen;
},
);
});
export const getAlertPayloadFactory = () => createSelector(
alertByNameSelector,
(alert) => {
export const getAlertPayloadFactory = () =>
createSelector(alertByNameSelector, (alert) => {
return { ...alert?.payload };
},
);
});
const drawerByNameSelector = (state, props) =>
state.dashboard.drawers?.[props.name];
export const isDrawerOpenFactory = () =>
createSelector(drawerByNameSelector, (drawer) => {
return drawer && drawer.isOpen;
});
export const getDrawerPayloadFactory = () =>
createSelector(drawerByNameSelector, (drawer) => {
return { ...drawer?.payload };
});

View File

@@ -1,4 +1,3 @@
export default {
OPEN_DIALOG: 'OPEN_DIALOG',
CLOSE_DIALOG: 'CLOSE_DIALOG',
@@ -6,6 +5,8 @@ export default {
CLOSE_ALERT: 'CLOSE_ALERT',
CLOSE_ALL_DIALOGS: 'CLOSE_ALL_DIALOGS',
CLOSE_ALL_ALERTS: 'CLOSE_ALL_ALERTS',
OPEN_DRAWER: 'OPEN_DRAWER',
CLOSE_DRAWER: 'CLOSE_DRAWER',
CHANGE_DASHBOARD_PAGE_TITLE: 'CHANGE_DASHBOARD_PAGE_TITLE',
CHANGE_DASHBOARD_PAGE_HINT: 'CHANGE_DASHBOARD_PAGE_HINT',
CHANGE_PREFERENCES_PAGE_TITLE: 'CHANGE_PREFERENCES_PAGE_TITLE',
@@ -18,5 +19,5 @@ export default {
SIDEBAR_SHRINK: 'SIDEBAR_SHRINK',
RESET_SIDEBAR_PREVIOUS_EXPAND: 'RESET_SIDEBAR_PREVIOUS_EXPAND',
RECORD_SIDEBAR_PREVIOUS_EXPAND: 'RECORD_SIDEBAR_PREVIOUS_EXPAND',
SET_DASHBOARD_BACK_LINK: 'SET_DASHBOARD_BACK_LINK'
};
SET_DASHBOARD_BACK_LINK: 'SET_DASHBOARD_BACK_LINK',
};

View File

@@ -1,185 +1,266 @@
import ApiService from "services/ApiService";
import ApiService from 'services/ApiService';
import t from 'store/types';
export const balanceSheetRefresh = (refresh) => {
return dispatch => dispatch({
type: 'BALANCE_SHEET_REFRESH',
payload: { refresh },
});
return (dispatch) =>
dispatch({
type: 'BALANCE_SHEET_REFRESH',
payload: { refresh },
});
};
export const fetchGeneralLedger = ({ query }) => {
return (dispatch) => new Promise((resolve, reject) => {
dispatch({
type: t.GENERAL_LEDGER_SHEET_LOADING,
loading: true,
});
ApiService.get('/financial_statements/general_ledger', { params: query }).then((response) => {
dispatch({
type: t.GENERAL_LEDGER_STATEMENT_SET,
data: response.data,
});
return (dispatch) =>
new Promise((resolve, reject) => {
dispatch({
type: t.GENERAL_LEDGER_SHEET_LOADING,
loading: false,
loading: true,
});
resolve(response);
}).catch((error) => { reject(error); });
});
ApiService.get('/financial_statements/general_ledger', { params: query })
.then((response) => {
dispatch({
type: t.GENERAL_LEDGER_STATEMENT_SET,
data: response.data,
});
dispatch({
type: t.GENERAL_LEDGER_SHEET_LOADING,
loading: false,
});
resolve(response);
})
.catch((error) => {
reject(error);
});
});
};
export const refreshGeneralLedgerSheet = (refresh) => {
return (dispatch) => dispatch({
type: t.GENERAL_LEDGER_REFRESH,
payload: { refresh },
});
return (dispatch) =>
dispatch({
type: t.GENERAL_LEDGER_REFRESH,
payload: { refresh },
});
};
export const fetchBalanceSheet = ({ query }) => {
return (dispatch) => new Promise((resolve, reject) => {
dispatch({
type: t.BALANCE_SHEET_LOADING,
loading: true,
});
ApiService.get('/financial_statements/balance_sheet', { params: query }).then((response) => {
dispatch({
type: t.BALANCE_SHEET_STATEMENT_SET,
data: response.data,
query: query,
});
return (dispatch) =>
new Promise((resolve, reject) => {
dispatch({
type: t.BALANCE_SHEET_LOADING,
loading: false,
loading: true,
});
dispatch({
type: t.SET_DASHBOARD_REQUEST_COMPLETED,
});
resolve(response);
}).catch((error) => { reject(error); });
});
ApiService.get('/financial_statements/balance_sheet', { params: query })
.then((response) => {
dispatch({
type: t.BALANCE_SHEET_STATEMENT_SET,
data: response.data,
query: query,
});
dispatch({
type: t.BALANCE_SHEET_LOADING,
loading: false,
});
dispatch({
type: t.SET_DASHBOARD_REQUEST_COMPLETED,
});
resolve(response);
})
.catch((error) => {
reject(error);
});
});
};
export const fetchTrialBalanceSheet = ({ query }) => {
return (dispatch) => new Promise((resolve, reject) => {
dispatch({
type: t.TRIAL_BALANCE_SHEET_LOADING,
loading: true,
});
ApiService.get('/financial_statements/trial_balance_sheet', { params: query }).then((response) => {
dispatch({
type: t.TRAIL_BALANCE_STATEMENT_SET,
data: response.data,
});
return (dispatch) =>
new Promise((resolve, reject) => {
dispatch({
type: t.TRIAL_BALANCE_SHEET_LOADING,
loading: false,
loading: true,
});
resolve(response.data);
}).catch((error) => { reject(error); })
})
ApiService.get('/financial_statements/trial_balance_sheet', {
params: query,
})
.then((response) => {
dispatch({
type: t.TRAIL_BALANCE_STATEMENT_SET,
data: response.data,
});
dispatch({
type: t.TRIAL_BALANCE_SHEET_LOADING,
loading: false,
});
resolve(response.data);
})
.catch((error) => {
reject(error);
});
});
};
export const trialBalanceRefresh = (refresh) => {
return (dispatch) => dispatch({
type: t.TRIAL_BALANCE_REFRESH,
payload: { refresh },
});
return (dispatch) =>
dispatch({
type: t.TRIAL_BALANCE_REFRESH,
payload: { refresh },
});
};
export const fetchProfitLossSheet = ({ query }) => {
return (dispatch) => new Promise((resolve, reject) => {
dispatch({
type: t.PROFIT_LOSS_SHEET_LOADING,
loading: true,
});
ApiService.get('/financial_statements/profit_loss_sheet', { params: query }).then((response) => {
dispatch({
type: t.PROFIT_LOSS_SHEET_SET,
profitLoss: response.data.data,
columns: response.data.columns,
query: response.data.query,
});
return (dispatch) =>
new Promise((resolve, reject) => {
dispatch({
type: t.PROFIT_LOSS_SHEET_LOADING,
loading: false,
loading: true,
});
resolve(response.data);
}).catch((error) => { reject(error); });
})
ApiService.get('/financial_statements/profit_loss_sheet', {
params: query,
})
.then((response) => {
dispatch({
type: t.PROFIT_LOSS_SHEET_SET,
profitLoss: response.data.data,
columns: response.data.columns,
query: response.data.query,
});
dispatch({
type: t.PROFIT_LOSS_SHEET_LOADING,
loading: false,
});
resolve(response.data);
})
.catch((error) => {
reject(error);
});
});
};
export const profitLossRefresh = (refresh) => {
return dispatch => dispatch({
type: t.PROFIT_LOSS_REFRESH,
payload: { refresh },
});
}
return (dispatch) =>
dispatch({
type: t.PROFIT_LOSS_REFRESH,
payload: { refresh },
});
};
export const fetchJournalSheet = ({ query }) => {
return (dispatch) => new Promise((resolve, reject) => {
dispatch({
type: t.JOURNAL_SHEET_LOADING,
loading: true,
});
ApiService.get('/financial_statements/journal', { params: query }).then((response) => {
dispatch({
type: t.JOURNAL_SHEET_SET,
data: response.data,
query: response.data.query,
});
return (dispatch) =>
new Promise((resolve, reject) => {
dispatch({
type: t.JOURNAL_SHEET_LOADING,
loading: false,
loading: true,
});
resolve(response.data);
}).catch(error => { reject(error); });
});
ApiService.get('/financial_statements/journal', { params: query })
.then((response) => {
dispatch({
type: t.JOURNAL_SHEET_SET,
data: response.data,
query: response.data.query,
});
dispatch({
type: t.JOURNAL_SHEET_LOADING,
loading: false,
});
resolve(response.data);
})
.catch((error) => {
reject(error);
});
});
};
export const refreshJournalSheet = (refresh) => {
return dispatch => dispatch({
type: t.JOURNAL_SHEET_REFRESH,
payload: { refresh },
});
}
return (dispatch) =>
dispatch({
type: t.JOURNAL_SHEET_REFRESH,
payload: { refresh },
});
};
export const fetchReceivableAgingSummary = ({ query }) => {
return (dispatch) => new Promise((resolve, reject) => {
dispatch({
type: t.RECEIVABLE_AGING_SUMMARY_LOADING,
payload: {
loading: true,
},
});
ApiService
.get('/financial_statements/receivable_aging_summary', { params: query })
.then((response) => {
dispatch({
type: t.RECEIVABLE_AGING_SUMMARY_SET,
payload: {
customers: response.data.data.customers,
total: response.data.data.total,
columns: response.data.columns,
query,
},
});
dispatch({
type: t.RECEIVABLE_AGING_SUMMARY_LOADING,
payload: {
loading: false,
},
});
resolve(response);
})
.catch((error) => {
reject(error);
return (dispatch) =>
new Promise((resolve, reject) => {
dispatch({
type: t.RECEIVABLE_AGING_SUMMARY_LOADING,
payload: {
loading: true,
},
});
});
}
ApiService.get('/financial_statements/receivable_aging_summary', {
params: query,
})
.then((response) => {
dispatch({
type: t.RECEIVABLE_AGING_SUMMARY_SET,
payload: {
customers: response.data.data.customers,
total: response.data.data.total,
columns: response.data.columns,
query,
},
});
dispatch({
type: t.RECEIVABLE_AGING_SUMMARY_LOADING,
payload: {
loading: false,
},
});
resolve(response);
})
.catch((error) => {
reject(error);
});
});
};
export const receivableAgingSummaryRefresh = (refresh) => {
return (dispatch) => dispatch({
type: t.RECEIVABLE_AGING_SUMMARY_REFRESH,
payload: { refresh },
});
}
return (dispatch) =>
dispatch({
type: t.RECEIVABLE_AGING_SUMMARY_REFRESH,
payload: { refresh },
});
};
export const fetchPayableAginSummary = ({ query }) => {
return (dispatch) =>
new Promise((resolve, reject) => {
dispatch({
type: t.PAYABLE_AGING_SUMMARY_LOADING,
payload: {
loading: true,
},
});
ApiService.get('/financial_statements/payable_aging_summary', {
params: query,
})
.then((response) => {
dispatch({
type: t.PAYABLE_AGING_SUMMARY_SET,
payload: {
vendors: response.data.data.vendors,
total: response.data.data.total,
columns: response.data.columns,
query,
},
});
dispatch({
type: t.PAYABLE_AGING_SUMMARY_LOADING,
payload: {
loading: false,
},
});
resolve(response);
})
.catch((error) => {
reject(error);
});
});
};
export const payableAgingSummaryRefresh = (refresh) => {
return (dispatch) =>
dispatch({
type: t.PAYABLE_AGING_SUMMARY_REFRESH,
payload: { refresh },
});
};

View File

@@ -6,6 +6,7 @@ import {
generalLedgerToTableRows,
profitLossToTableRowsMapper,
ARAgingSummaryTableRowsMapper,
APAgingSummaryTableRowsMapper,
mapTrialBalanceSheetToRows,
} from './financialStatements.mappers';
@@ -48,6 +49,13 @@ const initialState = {
filter: true,
refresh: false,
},
payableAgingSummary: {
sheet: {},
loading: false,
tableRows: [],
filter: true,
refresh: false,
},
};
const financialStatementFilterToggle = (financialName, statePath) => {
@@ -172,7 +180,7 @@ export default createReducer(initialState, {
const { refresh } = action.payload;
state.receivableAgingSummary.refresh = !!refresh;
},
[t.RECEIVABLE_AGING_SUMMARY_LOADING]: (state, action) => {
[t.RECEIVABLE_AGING_SUMMARY_LOADING]: (state, action) => {
const { loading } = action.payload;
state.receivableAgingSummary.loading = loading;
},
@@ -180,4 +188,29 @@ export default createReducer(initialState, {
'RECEIVABLE_AGING_SUMMARY',
'receivableAgingSummary',
),
[t.PAYABLE_AGING_SUMMARY_SET]: (state, action) => {
const { vendors, total, columns, query } = action.payload;
const receivableSheet = {
query,
columns,
vendors,
total,
tableRows: APAgingSummaryTableRowsMapper({ vendors, columns, total }),
};
state.payableAgingSummary.sheet = receivableSheet;
},
[t.PAYABLE_AGING_SUMMARY_REFRESH]: (state, action) => {
const { refresh } = action.payload;
state.payableAgingSummary.refresh = !!refresh;
},
[t.PAYABLE_AGING_SUMMARY_LOADING]: (state, action) => {
const { loading } = action.payload;
state.payableAgingSummary.loading = loading;
},
...financialStatementFilterToggle(
'PAYABLE_AGING_SUMMARY',
'payableAgingSummary',
),
});

View File

@@ -1,5 +1,3 @@
export default {
GENERAL_LEDGER_STATEMENT_SET: 'GENERAL_LEDGER_STATEMENT_SET',
GENERAL_LEDGER_SHEET_LOADING: 'GENERAL_LEDGER_SHEET_LOADING',
@@ -25,4 +23,8 @@ export default {
RECEIVABLE_AGING_SUMMARY_SET: 'RECEIVABLE_AGING_SUMMARY_SET',
RECEIVABLE_AGING_REFRECH: 'RECEIVABLE_AGING_REFRECH',
RECEIVABLE_AGING_SUMMARY_REFRESH: 'RECEIVABLE_AGING_SUMMARY_REFRESH',
}
PAYABLE_AGING_SUMMARY_LOADING: 'PAYABLE_AGING_SUMMARY_LOADING',
PAYABLE_AGING_SUMMARY_SET: 'PAYABLE_AGING_SUMMARY_SET',
PAYABLE_AGING_SUMMARY_REFRESH: 'PAYABLE_AGING_SUMMARY_REFRESH',
};