[
{
- id: 'branch_name',
+ id: 'name',
Header: intl.get('branches.column.branch_name'),
- accessor: 'branch_name',
- className: 'branch_name',
+ accessor: 'name',
+ className: 'name',
width: '120',
disableSortBy: true,
textOverview: true,
},
+ {
+ id: 'code',
+ Header: intl.get('branches.column.code'),
+ accessor: 'code',
+ className: 'code',
+ width: '100',
+ disableSortBy: true,
+ textOverview: true,
+ },
{
Header: intl.get('branches.column.address'),
accessor: 'address',
diff --git a/src/hooks/query/branches.js b/src/hooks/query/branches.js
new file mode 100644
index 000000000..b4cbb7daf
--- /dev/null
+++ b/src/hooks/query/branches.js
@@ -0,0 +1,99 @@
+import { useQueryClient, useMutation } from 'react-query';
+import { useRequestQuery } from '../useQueryRequest';
+import useApiRequest from '../useRequest';
+import t from './types';
+
+// Common invalidate queries.
+const commonInvalidateQueries = (queryClient) => {
+ // Invalidate warehouses.
+ queryClient.invalidateQueries(t.BRANCHES);
+ queryClient.invalidateQueries(t.BRANCH);
+};
+
+/**
+ * Create a new branch.
+ */
+export function useCreateBranch(props) {
+ const queryClient = useQueryClient();
+ const apiRequest = useApiRequest();
+
+ return useMutation((values) => apiRequest.post('branches', values), {
+ onSuccess: (res, values) => {
+ // Common invalidate queries.
+ commonInvalidateQueries(queryClient);
+ },
+ ...props,
+ });
+}
+
+/**
+ * Edits the given branch.
+ */
+export function useEditBranch(props) {
+ const queryClient = useQueryClient();
+ const apiRequest = useApiRequest();
+
+ return useMutation(
+ ([id, values]) => apiRequest.post(`branches/${id}`, values),
+ {
+ onSuccess: (res, [id, values]) => {
+ // Invalidate specific branch.
+ queryClient.invalidateQueries([t.BRANCH, id]);
+
+ // Common invalidate queries.
+ commonInvalidateQueries(queryClient);
+ },
+ ...props,
+ },
+ );
+}
+
+/**
+ * Deletes the given branch.
+ */
+export function useDeleteBranch(props) {
+ const queryClient = useQueryClient();
+ const apiRequest = useApiRequest();
+
+ return useMutation((id) => apiRequest.delete(`branches/${id}`), {
+ onSuccess: (res, id) => {
+ // Invalidate specific branch.
+ queryClient.invalidateQueries([t.BRANCH, id]);
+
+ // Common invalidate queries.
+ commonInvalidateQueries(queryClient);
+ },
+ ...props,
+ });
+}
+
+/**
+ * Retrieve Branches list.
+ */
+export function useBranches(query, props) {
+ return useRequestQuery(
+ [t.BRANCHES, query],
+ { method: 'get', url: 'branches', params: query },
+ {
+ select: (res) => res.data.branches,
+ defaultData: [],
+ ...props,
+ },
+ );
+}
+
+/**
+ * Retrieve the branch details.
+ * @param {number}
+ */
+export function useBranch(id, props, requestProps) {
+ return useRequestQuery(
+ [t.BRANCH, id],
+ { method: 'get', url: `branches/${id}`, ...requestProps },
+ {
+ select: (res) => res.data.branch,
+ defaultData: {},
+ ...props,
+ },
+ );
+}
diff --git a/src/hooks/query/index.js b/src/hooks/query/index.js
index b27ebd2b5..1d4fa2f8d 100644
--- a/src/hooks/query/index.js
+++ b/src/hooks/query/index.js
@@ -34,3 +34,4 @@ export * from './creditNote';
export * from './vendorCredit';
export * from './transactionsLocking';
export * from './warehouses'
+export * from './branches';
diff --git a/src/hooks/query/types.js b/src/hooks/query/types.js
index 1bd1584b3..dd3f7d3e4 100644
--- a/src/hooks/query/types.js
+++ b/src/hooks/query/types.js
@@ -202,6 +202,11 @@ const WAREHOUSE_TRANSFERS = {
WAREHOUSE_TRANSFERS: 'WAREHOUSE_TRANSFERS',
};
+const BRANCHES = {
+ BRANCHES: 'BRANCHES',
+ BRANCH: 'BRANCH',
+};
+
export default {
...ACCOUNTS,
...BILLS,
@@ -231,4 +236,5 @@ export default {
...TARNSACTIONS_LOCKING,
...WAREHOUSES,
...WAREHOUSE_TRANSFERS,
+ ...BRANCHES,
};
diff --git a/src/lang/en/index.json b/src/lang/en/index.json
index 904427d0a..dc1d99646 100644
--- a/src/lang/en/index.json
+++ b/src/lang/en/index.json
@@ -1826,20 +1826,25 @@
"credit_note_preview.dialog.title": "Credit Note PDF Preview",
"payment_receive_preview.dialog.title": "Payment Receive PDF Preview",
"branches.label": "Branches",
- "branches.label.new_branche": "New Branch",
+ "branches.label.new_branch": "New Branch",
"branches.action.edit_branch": "Edit Branch",
- "branches.action.delete_branch": "Edit Branch",
+ "branches.action.delete_branch": "Delete Branch",
"branches.column.branch_name": "Branch name",
"branches.column.address": "Address",
"branches.column.phone_number": "Phone number",
- "branch.dialog.label": "New Branch",
+ "branches.column.code": "Code",
+ "branch.dialog.label_new_branch": "New Branch",
+ "branch.dialog.label_edit_branch": "New Branch",
"branch.dialog.label.branch_name": "Branch Name",
+ "branch.dialog.label.branch_code": "Code",
"branch.dialog.label.branch_address": "Branch Address",
- "branch.dialog.label.address_1": "Address 1",
- "branch.dialog.label.address_2": "Address 2",
+ "branch.dialog.label.address_1": "Address",
"branch.dialog.label.city": "City",
"branch.dialog.label.country": "Country",
"branch.dialog.label.phone_number": "Phone Number",
"branch.dialog.label.email": "Email",
- "branch.dialog.label.website": "Website"
+ "branch.dialog.label.website": "Website",
+ "branch.dialog.success_message": "The branch has been created successfully.",
+ "branch.alert.delete_message":"The branch has been deleted successfully",
+ "branch.once_delete_this_branch":"Once you delete this branch, you won't be able to restore it later. Are you sure you want to delete this branch?"
}
\ No newline at end of file
From 3036b232b599413c5130fb0fd86a9870ef5a28b6 Mon Sep 17 00:00:00 2001
From: elforjani13 <39470382+elforjani13@users.noreply.github.com>
Date: Thu, 3 Feb 2022 22:47:38 +0200
Subject: [PATCH 048/207] feat(RealizedGainorLoss): add realized gain or loss.
---
src/config/sidebarMenu.js | 4 +
.../RealizedGainOrLoss/RealizedGainOrLoss.js | 67 ++++++++++
.../RealizedGainOrLossActionsBar.js | 122 ++++++++++++++++++
.../RealizedGainOrLossGeneralPanel.js | 17 +++
.../RealizedGainOrLossHeader.js | 108 ++++++++++++++++
.../RealizedGainOrLossProvider.js | 22 ++++
.../RealizedGainOrLossTable.js | 21 +++
.../RealizedGainOrLoss/components.js | 18 +++
.../withRealizedGainOrLoss.js | 12 ++
.../withRealizedGainOrLossActions.js | 9 ++
src/hooks/query/types.js | 2 +-
src/routes/dashboard.js | 14 ++
.../financialStatements.actions.js | 15 ++-
.../financialStatements.reducer.js | 5 +
.../financialStatements.selectors.js | 14 ++
.../financialStatements.types.js | 1 +
16 files changed, 449 insertions(+), 2 deletions(-)
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLoss.js
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossActionsBar.js
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossGeneralPanel.js
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossHeader.js
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossProvider.js
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossTable.js
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/components.js
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/withRealizedGainOrLoss.js
create mode 100644 src/containers/FinancialStatements/RealizedGainOrLoss/withRealizedGainOrLossActions.js
diff --git a/src/config/sidebarMenu.js b/src/config/sidebarMenu.js
index 84fece5ab..bf82e5fe2 100644
--- a/src/config/sidebarMenu.js
+++ b/src/config/sidebarMenu.js
@@ -641,6 +641,10 @@ export default [
ability: ReportsAction.READ_AP_AGING_SUMMARY,
},
},
+ {
+ text:
,
+ href: '/financial-reports/realized-gain-loss',
+ },
{
text:
,
label: true,
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLoss.js b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLoss.js
new file mode 100644
index 000000000..529f2a376
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLoss.js
@@ -0,0 +1,67 @@
+import React from 'react';
+
+import { FinancialStatement } from 'components';
+
+import DashboardPageContent from 'components/Dashboard/DashboardPageContent';
+
+import RealizedGainOrLossHeader from './RealizedGainOrLossHeader';
+import RealizedGainOrLossTable from './RealizedGainOrLossTable';
+import RealizedGainOrLossActionsBar from './RealizedGainOrLossActionsBar';
+
+import withCurrentOrganization from '../../Organization/withCurrentOrganization';
+import withRealizedGainOrLossActions from './withRealizedGainOrLossActions';
+import { RealizedGainOrLossProvider } from './RealizedGainOrLossProvider';
+import { RealizedGainOrLossLoadingBar } from './components';
+
+import { compose } from 'utils';
+
+/**
+ * Realized Gain or Loss.
+ */
+function RealizedGainOrLoss({
+ // #withPreferences
+ organizationName,
+
+ //#withRealizedGainOrLossActions
+ toggleRealizedGainOrLossFilterDrawer,
+}) {
+ // Handle refetch realized Gain or Loss after filter change.
+ const handleFilterSubmit = (filter) => {};
+
+ // Handle format number submit.
+ const handleNumberFormatSubmit = (values) => {};
+
+ React.useEffect(
+ () => () => {
+ toggleRealizedGainOrLossFilterDrawer(false);
+ },
+ [toggleRealizedGainOrLossFilterDrawer],
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default compose(
+ withCurrentOrganization(({ organization }) => ({
+ organizationName: organization.name,
+ })),
+ withRealizedGainOrLossActions,
+)(RealizedGainOrLoss);
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossActionsBar.js b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossActionsBar.js
new file mode 100644
index 000000000..4b9ca3c9e
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossActionsBar.js
@@ -0,0 +1,122 @@
+import React from 'react';
+import {
+ NavbarGroup,
+ NavbarDivider,
+ Button,
+ Classes,
+ Popover,
+ PopoverInteractionKind,
+ Position,
+} from '@blueprintjs/core';
+import { FormattedMessage as T, Icon } from 'components';
+import classNames from 'classnames';
+
+import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar';
+import NumberFormatDropdown from 'components/NumberFormatDropdown';
+
+import { useRealizedGainOrLossContext } from './RealizedGainOrLossProvider';
+import withRealizedGainOrLoss from './withRealizedGainOrLoss';
+import withRealizedGainOrLossActions from './withRealizedGainOrLossActions';
+
+import { compose, saveInvoke } from 'utils';
+
+/**
+ * Realized Gain or Loss actions bar.
+ */
+function RealizedGainOrLossActionsBar({
+ //#withRealizedGainOrLoss
+ isFilterDrawerOpen,
+
+ //#withRealizedGainOrLossActions
+ toggleRealizedGainOrLossFilterDrawer,
+
+ //#ownProps
+ numberFormat,
+ onNumberFormatSubmit,
+}) {
+ // Handle filter toggle click.
+ const handleFilterToggleClick = () => {
+ toggleRealizedGainOrLossFilterDrawer();
+ };
+
+ // Handle recalculate report button.
+ const handleRecalculateReport = () => {};
+
+ // handle number format form submit.
+ const handleNumberFormatSubmit = (values) =>
+ saveInvoke(onNumberFormatSubmit, values);
+
+ return (
+
+
+ }
+ onClick={handleRecalculateReport}
+ icon={ }
+ />
+
+
+
+ }
+ text={
+ isFilterDrawerOpen ? (
+
+ ) : (
+
+ )
+ }
+ onClick={handleFilterToggleClick}
+ active={isFilterDrawerOpen}
+ />
+
+
+
+ }
+ minimal={true}
+ interactionKind={PopoverInteractionKind.CLICK}
+ position={Position.BOTTOM_LEFT}
+ >
+ }
+ icon={ }
+ />
+
+
+ }
+ icon={ }
+ />
+
+
+ }
+ text={ }
+ />
+ }
+ text={ }
+ />
+
+
+ );
+}
+
+export default compose(
+ withRealizedGainOrLoss(({ realizedGainOrLossDrawerFilter }) => ({
+ isFilterDrawerOpen: realizedGainOrLossDrawerFilter,
+ })),
+ withRealizedGainOrLossActions,
+)(RealizedGainOrLossActionsBar);
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossGeneralPanel.js b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossGeneralPanel.js
new file mode 100644
index 000000000..f08938a29
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossGeneralPanel.js
@@ -0,0 +1,17 @@
+import React from 'react';
+
+import { Row, Col } from '../../../components';
+import FinancialStatementDateRange from 'containers/FinancialStatements/FinancialStatementDateRange';
+import SelectDisplayColumnsBy from '../SelectDisplayColumnsBy';
+
+/**
+ * Realized Gain or Loss header - General panel.
+ */
+export default function RealizedGainOrLossGeneralPanel() {
+ return (
+
+
+
+
+ );
+}
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossHeader.js b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossHeader.js
new file mode 100644
index 000000000..a13c08166
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossHeader.js
@@ -0,0 +1,108 @@
+import React from 'react';
+import moment from 'moment';
+import * as Yup from 'yup';
+import intl from 'react-intl-universal';
+import { Formik, Form } from 'formik';
+import { Tabs, Tab, Button, Intent } from '@blueprintjs/core';
+import { FormattedMessage as T } from 'components';
+
+import FinancialStatementHeader from 'containers/FinancialStatements/FinancialStatementHeader';
+import RealizedGainOrLossGeneralPanel from './RealizedGainOrLossGeneralPanel';
+
+import withRealizedGainOrLoss from './withRealizedGainOrLoss';
+import withRealizedGainOrLossActions from './withRealizedGainOrLossActions';
+
+import { compose, transformToForm } from 'utils';
+
+/**
+ * Realized Gain or Loss.header.
+ */
+function RealizedGainOrLossHeader({
+ // #ownProps
+ onSubmitFilter,
+ pageFilter,
+
+ //#withRealizedGainOrLoss
+ isFilterDrawerOpen,
+
+ //#withRealizedGainOrLossActions
+ toggleRealizedGainOrLossFilterDrawer,
+}) {
+ // Filter form default values.
+ const defaultValues = {
+ fromDate: moment().toDate(),
+ toDate: moment().toDate(),
+ };
+
+ // Initial form values.
+ const initialValues = transformToForm(
+ {
+ ...pageFilter,
+ fromDate: moment(pageFilter.fromDate).toDate(),
+ toDate: moment(pageFilter.toDate).toDate(),
+ },
+ defaultValues,
+ );
+
+ // Validation schema.
+ const validationSchema = Yup.object().shape({
+ dateRange: Yup.string().optional(),
+ fromDate: Yup.date().required().label(intl.get('fromDate')),
+ toDate: Yup.date()
+ .min(Yup.ref('fromDate'))
+ .required()
+ .label(intl.get('toDate')),
+ displayColumnsType: Yup.string(),
+ });
+
+ // Handle form submit.
+ const handleSubmit = (values, { setSubmitting }) => {
+ onSubmitFilter(values);
+ toggleRealizedGainOrLossFilterDrawer(false);
+ setSubmitting(false);
+ };
+
+ // Handle drawer close action.
+ const handleDrawerClose = () => {
+ toggleRealizedGainOrLossFilterDrawer(false);
+ };
+
+ return (
+
+
+
+
+
+ );
+}
+
+export default compose(
+ withRealizedGainOrLoss(({ realizedGainOrLossDrawerFilter }) => ({
+ isFilterDrawerOpen: realizedGainOrLossDrawerFilter,
+ })),
+ withRealizedGainOrLossActions,
+)(RealizedGainOrLossHeader);
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossProvider.js b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossProvider.js
new file mode 100644
index 000000000..0c8fb18fc
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossProvider.js
@@ -0,0 +1,22 @@
+import React from 'react';
+import FinancialReportPage from '../FinancialReportPage';
+
+const RealizedGainOrLossContext = React.createContext();
+
+/**
+ * Realized Gain or Loss provider.
+ */
+function RealizedGainOrLossProvider({ filter, ...props }) {
+ const provider = {};
+
+ return (
+
+
+
+ );
+}
+
+const useRealizedGainOrLossContext = () =>
+ React.useContext(RealizedGainOrLossContext);
+
+export { RealizedGainOrLossProvider, useRealizedGainOrLossContext };
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossTable.js b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossTable.js
new file mode 100644
index 000000000..426a0997a
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLossTable.js
@@ -0,0 +1,21 @@
+import React from 'react';
+import intl from 'react-intl-universal';
+
+import { DataTable } from 'components';
+import FinancialSheet from 'components/FinancialSheet';
+
+/**
+ * Realized Gain or Loss table.
+ */
+export default function RealizedGainOrLossTable({
+ // #ownProps
+ companyName,
+}) {
+ return (
+
+ );
+}
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/components.js b/src/containers/FinancialStatements/RealizedGainOrLoss/components.js
new file mode 100644
index 000000000..217b440de
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/components.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import { Button } from '@blueprintjs/core';
+import { Icon, If } from 'components';
+import { FormattedMessage as T } from 'components';
+
+import { useRealizedGainOrLossContext } from './RealizedGainOrLossProvider';
+import FinancialLoadingBar from '../FinancialLoadingBar';
+
+/**
+ * Realized Gain or Loss loading bar.
+ */
+export function RealizedGainOrLossLoadingBar() {
+ return (
+
+
+
+ );
+}
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/withRealizedGainOrLoss.js b/src/containers/FinancialStatements/RealizedGainOrLoss/withRealizedGainOrLoss.js
new file mode 100644
index 000000000..5f923884a
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/withRealizedGainOrLoss.js
@@ -0,0 +1,12 @@
+import { connect } from 'react-redux';
+import { getRealizedGainOrLossFilterDrawer } from '../../../store/financialStatement/financialStatements.selectors';
+
+export default (mapState) => {
+ const mapStateToProps = (state, props) => {
+ const mapped = {
+ realizedGainOrLossDrawerFilter: getRealizedGainOrLossFilterDrawer(state),
+ };
+ return mapState ? mapState(mapped, state, props) : mapped;
+ };
+ return connect(mapStateToProps);
+};
diff --git a/src/containers/FinancialStatements/RealizedGainOrLoss/withRealizedGainOrLossActions.js b/src/containers/FinancialStatements/RealizedGainOrLoss/withRealizedGainOrLossActions.js
new file mode 100644
index 000000000..95feefac5
--- /dev/null
+++ b/src/containers/FinancialStatements/RealizedGainOrLoss/withRealizedGainOrLossActions.js
@@ -0,0 +1,9 @@
+import { connect } from 'react-redux';
+import { toggleRealizedGainOrLossFilterDrawer } from '../../../store/financialStatement/financialStatements.actions';
+
+const mapDispatchToProps = (dispatch) => ({
+ toggleRealizedGainOrLossFilterDrawer: (toggle) =>
+ dispatch(toggleRealizedGainOrLossFilterDrawer(toggle)),
+});
+
+export default connect(null, mapDispatchToProps);
diff --git a/src/hooks/query/types.js b/src/hooks/query/types.js
index dd3f7d3e4..cad5be4d3 100644
--- a/src/hooks/query/types.js
+++ b/src/hooks/query/types.js
@@ -24,6 +24,7 @@ const FINANCIAL_REPORTS = {
CASH_FLOW_STATEMENT: 'CASH_FLOW_STATEMENT',
INVENTORY_ITEM_DETAILS: 'INVENTORY_ITEM_DETAILS',
TRANSACTIONS_BY_REFERENCE: 'TRANSACTIONS_BY_REFERENCE',
+ REALIZED_GAIN_OR_LOSS: 'REALIZED_GAIN_OR_LOSS',
};
const BILLS = {
@@ -196,7 +197,6 @@ const WAREHOUSES = {
WAREHOUSE: 'WAREHOUSE',
WAREHOUSES: 'WAREHOUSES',
};
-
const WAREHOUSE_TRANSFERS = {
WAREHOUSE_TRANSFER: 'WAREHOUSE_TRANSFER',
WAREHOUSE_TRANSFERS: 'WAREHOUSE_TRANSFERS',
diff --git a/src/routes/dashboard.js b/src/routes/dashboard.js
index 8877b2396..866c6d30a 100644
--- a/src/routes/dashboard.js
+++ b/src/routes/dashboard.js
@@ -376,6 +376,20 @@ export const getDashboardRoutes = () => [
sidebarExpand: false,
subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
},
+ {
+ path: `/financial-reports/realized-gain-loss`,
+ component: lazy(() =>
+ import(
+ '../containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLoss'
+ ),
+ ),
+
+ breadcrumb: intl.get('realized_gain_or_loss.label'),
+ pageTitle: intl.get('realized_gain_or_loss.label'),
+ backLink: true,
+ sidebarExpand: false,
+ subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
+ },
{
path: '/financial-reports',
component: lazy(() =>
diff --git a/src/store/financialStatement/financialStatements.actions.js b/src/store/financialStatement/financialStatements.actions.js
index 0ef8f9a41..b1229fd9e 100644
--- a/src/store/financialStatement/financialStatements.actions.js
+++ b/src/store/financialStatement/financialStatements.actions.js
@@ -196,7 +196,7 @@ export function toggleCashFlowStatementFilterDrawer(toggle) {
* Toggles display of the inventory item details filter drawer.
* @param {boolean} toggle
*/
- export function toggleInventoryItemDetailsFilterDrawer(toggle) {
+export function toggleInventoryItemDetailsFilterDrawer(toggle) {
return {
type: `${t.INVENTORY_ITEM_DETAILS}/${t.DISPLAY_FILTER_DRAWER_TOGGLE}`,
payload: {
@@ -204,3 +204,16 @@ export function toggleCashFlowStatementFilterDrawer(toggle) {
},
};
}
+
+/**
+ * Toggle display of the Realized Gain or Loss filter drawer.
+ * @param {boolean} toggle
+ */
+export function toggleRealizedGainOrLossCilterDrawer(toggle) {
+ return {
+ type: `${t.REALIZED_GAIN_OR_LOSS}/${t.DISPLAY_FILTER_DRAWER_TOGGLE}`,
+ payload: {
+ toggle,
+ },
+ };
+}
diff --git a/src/store/financialStatement/financialStatements.reducer.js b/src/store/financialStatement/financialStatements.reducer.js
index 63fea46b2..9c6e0a1ff 100644
--- a/src/store/financialStatement/financialStatements.reducer.js
+++ b/src/store/financialStatement/financialStatements.reducer.js
@@ -51,6 +51,9 @@ const initialState = {
inventoryItemDetails: {
displayFilterDrawer: false,
},
+ realizedGainOrLoss: {
+ displayFilterDrawer: false,
+ },
};
/**
@@ -102,4 +105,6 @@ export default createReducer(initialState, {
t.INVENTORY_ITEM_DETAILS,
'inventoryItemDetails',
),
+ ...financialStatementFilterToggle(t.REALIZED_GAIN_OR_LOSS, 'realizedGainOrLoss'),
+
});
diff --git a/src/store/financialStatement/financialStatements.selectors.js b/src/store/financialStatement/financialStatements.selectors.js
index f19337fa2..83de44342 100644
--- a/src/store/financialStatement/financialStatements.selectors.js
+++ b/src/store/financialStatement/financialStatements.selectors.js
@@ -73,6 +73,10 @@ export const inventoryItemDetailsDrawerFilter = (state) => {
return filterDrawerByTypeSelector('inventoryItemDetails')(state);
};
+export const realizedGainOrLossFilterDrawerSelector = (state) => {
+ return filterDrawerByTypeSelector('realizedGainOrLoss')(state);
+};
+
/**
* Retrieve balance sheet filter drawer.
*/
@@ -239,3 +243,13 @@ export const getInventoryItemDetailsFilterDrawer = createSelector(
return isOpen;
},
);
+
+/**
+ * Retrieve Realized Gain or Loss filter drawer.
+ */
+export const getRealizedGainOrLossFilterDrawer = createSelector(
+ realizedGainOrLossFilterDrawerSelector,
+ (isOpen) => {
+ return isOpen;
+ },
+);
diff --git a/src/store/financialStatement/financialStatements.types.js b/src/store/financialStatement/financialStatements.types.js
index ef82d5b92..cdda1f369 100644
--- a/src/store/financialStatement/financialStatements.types.js
+++ b/src/store/financialStatement/financialStatements.types.js
@@ -16,4 +16,5 @@ export default {
VENDORS_TRANSACTIONS: 'VENDORS TRANSACTIONS',
CASH_FLOW_STATEMENT: 'CASH FLOW STATEMENT',
INVENTORY_ITEM_DETAILS: 'INVENTORY ITEM DETAILS',
+ REALIZED_GAIN_OR_LOSS: 'REALIZED GAIN OR LOSS',
};
From e1fe28736e2de6f0531c5545e20690d769d33975 Mon Sep 17 00:00:00 2001
From: elforjani13 <39470382+elforjani13@users.noreply.github.com>
Date: Thu, 3 Feb 2022 22:47:56 +0200
Subject: [PATCH 049/207] feat(UnrealizedGainorLoss): add Unrealized gain or
loss.
---
src/config/sidebarMenu.js | 4 +
.../UnrealizedGainOrLoss.js | 65 ++++++++++
.../UnrealizedGainOrLossActionsBar.js | 122 ++++++++++++++++++
.../UnrealizedGainOrLossGeneralPanel.js | 17 +++
.../UnrealizedGainOrLossHeader.js | 108 ++++++++++++++++
.../UnrealizedGainOrLossProvider.js | 22 ++++
.../UnrealizedGainOrLossTable.js | 21 +++
.../UnrealizedGainOrLoss/components.js | 18 +++
.../withUnrealizedGainOrLoss.js | 12 ++
.../withUnrealizedGainOrLossActions.js | 9 ++
src/hooks/query/types.js | 1 +
src/lang/en/index.json | 4 +-
src/routes/dashboard.js | 14 +-
.../financialStatements.actions.js | 15 ++-
.../financialStatements.reducer.js | 4 +
.../financialStatements.selectors.js | 13 ++
.../financialStatements.types.js | 1 +
17 files changed, 447 insertions(+), 3 deletions(-)
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLoss.js
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossActionsBar.js
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossGeneralPanel.js
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossHeader.js
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossProvider.js
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossTable.js
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/components.js
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/withUnrealizedGainOrLoss.js
create mode 100644 src/containers/FinancialStatements/UnrealizedGainOrLoss/withUnrealizedGainOrLossActions.js
diff --git a/src/config/sidebarMenu.js b/src/config/sidebarMenu.js
index bf82e5fe2..480fa72e8 100644
--- a/src/config/sidebarMenu.js
+++ b/src/config/sidebarMenu.js
@@ -645,6 +645,10 @@ export default [
text:
,
href: '/financial-reports/realized-gain-loss',
},
+ {
+ text:
,
+ href: '/financial-reports/unrealized-gain-loss',
+ },
{
text:
,
label: true,
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLoss.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLoss.js
new file mode 100644
index 000000000..a8f20c4ed
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLoss.js
@@ -0,0 +1,65 @@
+import React from 'react';
+
+import { FinancialStatement } from 'components';
+import DashboardPageContent from 'components/Dashboard/DashboardPageContent';
+
+import UnrealizedGainOrLossHeader from './UnrealizedGainOrLossHeader';
+import UnrealizedGainOrLossTable from './UnrealizedGainOrLossTable';
+import UnrealizedGainOrLossActionsBar from './UnrealizedGainOrLossActionsBar';
+
+import withCurrentOrganization from '../../Organization/withCurrentOrganization';
+import withUnrealizedGainOrLossActions from './withUnrealizedGainOrLossActions';
+import { UnrealizedGainOrLossProvider } from './UnrealizedGainOrLossProvider';
+import { UnrealizedGainOrLossLoadingBar } from './components';
+
+import { compose } from 'utils';
+
+/**
+ * Unrealized Gain or Loss
+ */
+function UnrealizedGainOrLoss({
+ // #withPreferences
+ organizationName,
+
+ //#withUnrealizedGainOrLossActions
+ toggleUnrealizedGainOrLossFilterDrawer,
+}) {
+ // Handle refetch unrealized Gain or Loss after filter change.
+ const handleFilterSubmit = (filter) => {};
+
+ // Handle format number submit.
+ const handleNumberFormatSubmit = (values) => {};
+
+ React.useEffect(
+ () => () => {
+ toggleUnrealizedGainOrLossFilterDrawer(false);
+ },
+ [toggleUnrealizedGainOrLossFilterDrawer],
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default compose(
+ withCurrentOrganization(({ organization }) => ({
+ organizationName: organization.name,
+ })),
+ withUnrealizedGainOrLossActions,
+)(UnrealizedGainOrLoss);
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossActionsBar.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossActionsBar.js
new file mode 100644
index 000000000..7e342ce3e
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossActionsBar.js
@@ -0,0 +1,122 @@
+import React from 'react';
+import {
+ NavbarGroup,
+ NavbarDivider,
+ Button,
+ Classes,
+ Popover,
+ PopoverInteractionKind,
+ Position,
+} from '@blueprintjs/core';
+import { FormattedMessage as T, Icon } from 'components';
+import classNames from 'classnames';
+
+import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar';
+import NumberFormatDropdown from 'components/NumberFormatDropdown';
+
+import { useUnrealizedGainOrLossContext } from './UnrealizedGainOrLossProvider';
+import withUnrealizedGainOrLoss from './withUnrealizedGainOrLoss';
+import withUnrealizedGainOrLossActions from './withUnrealizedGainOrLossActions';
+
+import { compose, saveInvoke } from 'utils';
+
+/**
+ * unrealized Gain or Loss actions bar.
+ */
+function UnrealizedGainOrLossActionsBar({
+ //#withRealizedGainOrLoss
+ isFilterDrawerOpen,
+
+ //#withRealizedGainOrLossActions
+ toggleUnrealizedGainOrLossFilterDrawer,
+
+ //#ownProps
+ numberFormat,
+ onNumberFormatSubmit,
+}) {
+ // Handle filter toggle click.
+ const handleFilterToggleClick = () => {
+ toggleUnrealizedGainOrLossFilterDrawer();
+ };
+
+ // Handle recalculate report button.
+ const handleRecalculateReport = () => {};
+
+ // handle number format form submit.
+ const handleNumberFormatSubmit = (values) =>
+ saveInvoke(onNumberFormatSubmit, values);
+
+ return (
+
+
+ }
+ onClick={handleRecalculateReport}
+ icon={ }
+ />
+
+
+
+ }
+ text={
+ isFilterDrawerOpen ? (
+
+ ) : (
+
+ )
+ }
+ onClick={handleFilterToggleClick}
+ active={isFilterDrawerOpen}
+ />
+
+
+
+ }
+ minimal={true}
+ interactionKind={PopoverInteractionKind.CLICK}
+ position={Position.BOTTOM_LEFT}
+ >
+ }
+ icon={ }
+ />
+
+
+ }
+ icon={ }
+ />
+
+
+ }
+ text={ }
+ />
+ }
+ text={ }
+ />
+
+
+ );
+}
+
+export default compose(
+ withUnrealizedGainOrLoss(({ unrealizedGainOrLossDrawerFilter }) => ({
+ isFilterDrawerOpen: unrealizedGainOrLossDrawerFilter,
+ })),
+ withUnrealizedGainOrLossActions,
+)(UnrealizedGainOrLossActionsBar);
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossGeneralPanel.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossGeneralPanel.js
new file mode 100644
index 000000000..7bb912da0
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossGeneralPanel.js
@@ -0,0 +1,17 @@
+import React from 'react';
+
+import { Row, Col } from '../../../components';
+import FinancialStatementDateRange from 'containers/FinancialStatements/FinancialStatementDateRange';
+import SelectDisplayColumnsBy from '../SelectDisplayColumnsBy';
+
+/**
+ * Unrealized Gain or Loss header - General panel.
+ */
+export default function UnrealizedGainOrLossGeneralPanel() {
+ return (
+
+
+
+
+ );
+}
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossHeader.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossHeader.js
new file mode 100644
index 000000000..a17bce086
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossHeader.js
@@ -0,0 +1,108 @@
+import React from 'react';
+import moment from 'moment';
+import * as Yup from 'yup';
+import intl from 'react-intl-universal';
+import { Formik, Form } from 'formik';
+import { Tabs, Tab, Button, Intent } from '@blueprintjs/core';
+import { FormattedMessage as T } from 'components';
+
+import FinancialStatementHeader from 'containers/FinancialStatements/FinancialStatementHeader';
+import UnrealizedGainOrLossGeneralPanel from './UnrealizedGainOrLossGeneralPanel';
+
+import withUnrealizedGainOrLoss from './withUnrealizedGainOrLoss';
+import withUnrealizedGainOrLossActions from './withUnrealizedGainOrLossActions';
+
+import { compose, transformToForm } from 'utils';
+
+/**
+ * Unrealized Gain or Loss.header.
+ */
+function UnrealizedGainOrLossHeader({
+ // #ownProps
+ onSubmitFilter,
+ pageFilter,
+
+ //#withUnrealizedGainOrLoss
+ isFilterDrawerOpen,
+
+ //#withUnrealizedGainOrLossActions
+ toggleUnrealizedGainOrLossFilterDrawer,
+}) {
+ // Filter form default values.
+ const defaultValues = {
+ fromDate: moment().toDate(),
+ toDate: moment().toDate(),
+ };
+
+ // Initial form values.
+ const initialValues = transformToForm(
+ {
+ ...pageFilter,
+ fromDate: moment(pageFilter.fromDate).toDate(),
+ toDate: moment(pageFilter.toDate).toDate(),
+ },
+ defaultValues,
+ );
+
+ // Validation schema.
+ const validationSchema = Yup.object().shape({
+ dateRange: Yup.string().optional(),
+ fromDate: Yup.date().required().label(intl.get('fromDate')),
+ toDate: Yup.date()
+ .min(Yup.ref('fromDate'))
+ .required()
+ .label(intl.get('toDate')),
+ displayColumnsType: Yup.string(),
+ });
+
+ // Handle form submit.
+ const handleSubmit = (values, { setSubmitting }) => {
+ onSubmitFilter(values);
+ toggleUnrealizedGainOrLossFilterDrawer(false);
+ setSubmitting(false);
+ };
+
+ // Handle drawer close action.
+ const handleDrawerClose = () => {
+ toggleUnrealizedGainOrLossFilterDrawer(false);
+ };
+
+ return (
+
+
+
+
+
+ );
+}
+
+export default compose(
+ withUnrealizedGainOrLoss(({ unrealizedGainOrLossDrawerFilter }) => ({
+ isFilterDrawerOpen: unrealizedGainOrLossDrawerFilter,
+ })),
+ withUnrealizedGainOrLossActions,
+)(UnrealizedGainOrLossHeader);
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossProvider.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossProvider.js
new file mode 100644
index 000000000..a9400489a
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossProvider.js
@@ -0,0 +1,22 @@
+import React from 'react';
+
+import FinancialReportPage from '../FinancialReportPage';
+
+const UnrealizedGainOrLossContext = React.createContext();
+
+/**
+ * Unrealized Gain or Loss provider.
+ */
+function UnrealizedGainOrLossProvider({ filter, ...props }) {
+ const provider = {};
+ return (
+
+
+
+ );
+}
+
+const useUnrealizedGainOrLossContext = () =>
+ React.useContext(UnrealizedGainOrLossContext);
+
+export { UnrealizedGainOrLossProvider, useUnrealizedGainOrLossContext };
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossTable.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossTable.js
new file mode 100644
index 000000000..a5a99558c
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLossTable.js
@@ -0,0 +1,21 @@
+import React from 'react';
+import intl from 'react-intl-universal';
+
+import { DataTable } from 'components';
+import FinancialSheet from 'components/FinancialSheet';
+
+/**
+ * Unrealized Gain or Loss table.
+ */
+export default function UnrealizedGainOrLossTable({
+ // #ownProps
+ companyName,
+}) {
+ return (
+
+ );
+}
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/components.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/components.js
new file mode 100644
index 000000000..25d754b58
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/components.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import { Button } from '@blueprintjs/core';
+import { Icon, If } from 'components';
+import { FormattedMessage as T } from 'components';
+
+import { useUnrealizedGainOrLossContext } from './UnrealizedGainOrLossProvider';
+import FinancialLoadingBar from '../FinancialLoadingBar';
+
+/**
+ * Unrealized Gain or Loss loading bar.
+ */
+export function UnrealizedGainOrLossLoadingBar() {
+ return (
+
+
+
+ );
+}
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/withUnrealizedGainOrLoss.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/withUnrealizedGainOrLoss.js
new file mode 100644
index 000000000..4017486dd
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/withUnrealizedGainOrLoss.js
@@ -0,0 +1,12 @@
+import { connect } from 'react-redux';
+import { getUnrealizedGainOrLossFilterDrawer } from '../../../store/financialStatement/financialStatements.selectors';
+
+export default (mapState) => {
+ const mapStateToProps = (state, props) => {
+ const mapped = {
+ unrealizedGainOrLossDrawerFilter: getUnrealizedGainOrLossFilterDrawer(state),
+ };
+ return mapState ? mapState(mapped, state, props) : mapped;
+ };
+ return connect(mapStateToProps);
+};
diff --git a/src/containers/FinancialStatements/UnrealizedGainOrLoss/withUnrealizedGainOrLossActions.js b/src/containers/FinancialStatements/UnrealizedGainOrLoss/withUnrealizedGainOrLossActions.js
new file mode 100644
index 000000000..4c51a85dc
--- /dev/null
+++ b/src/containers/FinancialStatements/UnrealizedGainOrLoss/withUnrealizedGainOrLossActions.js
@@ -0,0 +1,9 @@
+import { connect } from 'react-redux';
+import { toggleUnrealizedGainOrLossFilterDrawer } from '../../../store/financialStatement/financialStatements.actions';
+
+const mapDispatchToProps = (dispatch) => ({
+ toggleUnrealizedGainOrLossFilterDrawer: (toggle) =>
+ dispatch(toggleUnrealizedGainOrLossFilterDrawer(toggle)),
+});
+
+export default connect(null, mapDispatchToProps);
diff --git a/src/hooks/query/types.js b/src/hooks/query/types.js
index cad5be4d3..85c9c26f1 100644
--- a/src/hooks/query/types.js
+++ b/src/hooks/query/types.js
@@ -25,6 +25,7 @@ const FINANCIAL_REPORTS = {
INVENTORY_ITEM_DETAILS: 'INVENTORY_ITEM_DETAILS',
TRANSACTIONS_BY_REFERENCE: 'TRANSACTIONS_BY_REFERENCE',
REALIZED_GAIN_OR_LOSS: 'REALIZED_GAIN_OR_LOSS',
+ UNREALIZED_GAIN_OR_LOSS: 'UNREALIZED_GAIN_OR_LOSS',
};
const BILLS = {
diff --git a/src/lang/en/index.json b/src/lang/en/index.json
index dc1d99646..51c53548b 100644
--- a/src/lang/en/index.json
+++ b/src/lang/en/index.json
@@ -1846,5 +1846,7 @@
"branch.dialog.label.website": "Website",
"branch.dialog.success_message": "The branch has been created successfully.",
"branch.alert.delete_message":"The branch has been deleted successfully",
- "branch.once_delete_this_branch":"Once you delete this branch, you won't be able to restore it later. Are you sure you want to delete this branch?"
+ "branch.once_delete_this_branch":"Once you delete this branch, you won't be able to restore it later. Are you sure you want to delete this branch?",
+ "realized_gain_or_loss.label":"Realized Gain or Loss",
+ "unrealized_gain_or_loss.label":"Unrealized Gain or Loss"
}
\ No newline at end of file
diff --git a/src/routes/dashboard.js b/src/routes/dashboard.js
index 866c6d30a..b68457202 100644
--- a/src/routes/dashboard.js
+++ b/src/routes/dashboard.js
@@ -383,13 +383,25 @@ export const getDashboardRoutes = () => [
'../containers/FinancialStatements/RealizedGainOrLoss/RealizedGainOrLoss'
),
),
-
breadcrumb: intl.get('realized_gain_or_loss.label'),
pageTitle: intl.get('realized_gain_or_loss.label'),
backLink: true,
sidebarExpand: false,
subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
},
+ {
+ path: `/financial-reports/unrealized-gain-loss`,
+ component: lazy(() =>
+ import(
+ '../containers/FinancialStatements/UnrealizedGainOrLoss/UnrealizedGainOrLoss'
+ ),
+ ),
+ breadcrumb: intl.get('unrealized_gain_or_loss.label'),
+ pageTitle: intl.get('unrealized_gain_or_loss.label'),
+ backLink: true,
+ sidebarExpand: false,
+ subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
+ },
{
path: '/financial-reports',
component: lazy(() =>
diff --git a/src/store/financialStatement/financialStatements.actions.js b/src/store/financialStatement/financialStatements.actions.js
index b1229fd9e..7e6abef03 100644
--- a/src/store/financialStatement/financialStatements.actions.js
+++ b/src/store/financialStatement/financialStatements.actions.js
@@ -209,7 +209,7 @@ export function toggleInventoryItemDetailsFilterDrawer(toggle) {
* Toggle display of the Realized Gain or Loss filter drawer.
* @param {boolean} toggle
*/
-export function toggleRealizedGainOrLossCilterDrawer(toggle) {
+export function toggleRealizedGainOrLossFilterDrawer(toggle) {
return {
type: `${t.REALIZED_GAIN_OR_LOSS}/${t.DISPLAY_FILTER_DRAWER_TOGGLE}`,
payload: {
@@ -217,3 +217,16 @@ export function toggleRealizedGainOrLossCilterDrawer(toggle) {
},
};
}
+
+/**
+ * Toggle display of the Unrealized Gain or Loss filter drawer.
+ * @param {boolean} toggle
+ */
+export function toggleUnrealizedGainOrLossFilterDrawer(toggle) {
+ return {
+ type: `${t.UNREALIZED_GAIN_OR_LOSS}/${t.DISPLAY_FILTER_DRAWER_TOGGLE}`,
+ payload: {
+ toggle,
+ },
+ };
+}
diff --git a/src/store/financialStatement/financialStatements.reducer.js b/src/store/financialStatement/financialStatements.reducer.js
index 9c6e0a1ff..8f206db6c 100644
--- a/src/store/financialStatement/financialStatements.reducer.js
+++ b/src/store/financialStatement/financialStatements.reducer.js
@@ -54,6 +54,9 @@ const initialState = {
realizedGainOrLoss: {
displayFilterDrawer: false,
},
+ unrealizedGainOrLoss: {
+ displayFilterDrawer: false,
+ },
};
/**
@@ -106,5 +109,6 @@ export default createReducer(initialState, {
'inventoryItemDetails',
),
...financialStatementFilterToggle(t.REALIZED_GAIN_OR_LOSS, 'realizedGainOrLoss'),
+ ...financialStatementFilterToggle(t.UNREALIZED_GAIN_OR_LOSS, 'unrealizedGainOrLoss'),
});
diff --git a/src/store/financialStatement/financialStatements.selectors.js b/src/store/financialStatement/financialStatements.selectors.js
index 83de44342..a554ebb37 100644
--- a/src/store/financialStatement/financialStatements.selectors.js
+++ b/src/store/financialStatement/financialStatements.selectors.js
@@ -77,6 +77,10 @@ export const realizedGainOrLossFilterDrawerSelector = (state) => {
return filterDrawerByTypeSelector('realizedGainOrLoss')(state);
};
+export const unrealizedGainOrLossFilterDrawerSelector = (state) => {
+ return filterDrawerByTypeSelector('unrealizedGainOrLoss')(state);
+};
+
/**
* Retrieve balance sheet filter drawer.
*/
@@ -253,3 +257,12 @@ export const getRealizedGainOrLossFilterDrawer = createSelector(
return isOpen;
},
);
+/**
+ * Retrieve Unrealized Gain or Loss filter drawer.
+ */
+export const getUnrealizedGainOrLossFilterDrawer = createSelector(
+ unrealizedGainOrLossFilterDrawerSelector,
+ (isOpen) => {
+ return isOpen;
+ },
+);
diff --git a/src/store/financialStatement/financialStatements.types.js b/src/store/financialStatement/financialStatements.types.js
index cdda1f369..98d37a1d5 100644
--- a/src/store/financialStatement/financialStatements.types.js
+++ b/src/store/financialStatement/financialStatements.types.js
@@ -17,4 +17,5 @@ export default {
CASH_FLOW_STATEMENT: 'CASH FLOW STATEMENT',
INVENTORY_ITEM_DETAILS: 'INVENTORY ITEM DETAILS',
REALIZED_GAIN_OR_LOSS: 'REALIZED GAIN OR LOSS',
+ UNREALIZED_GAIN_OR_LOSS: 'UNREALIZED GAIN OR LOSS',
};
From 2a61a3de475e1e5d1c5742a3e2b8dca54511112e Mon Sep 17 00:00:00 2001
From: elforjani13 <39470382+elforjani13@users.noreply.github.com>
Date: Sun, 6 Feb 2022 09:58:38 +0200
Subject: [PATCH 050/207] Revert "feat(warehouse) add warehouse propover."
This reverts commit 2aa26959e924af32a49bb943f2e5877dfede0ae9.
---
.../DataTableCells/NumericInputCell.js | 4 +-
.../DataTableCells/RadioFieldCell.js | 44 -----------
src/components/DataTableCells/index.js | 2 -
.../WarehouseListPopover/WarehousesList.js | 75 -------------------
.../WarehouseListPopover/components.js | 38 ----------
src/containers/WarehouseListPopover/index.js | 36 ---------
6 files changed, 1 insertion(+), 198 deletions(-)
delete mode 100644 src/components/DataTableCells/RadioFieldCell.js
delete mode 100644 src/containers/WarehouseListPopover/WarehousesList.js
delete mode 100644 src/containers/WarehouseListPopover/components.js
delete mode 100644 src/containers/WarehouseListPopover/index.js
diff --git a/src/components/DataTableCells/NumericInputCell.js b/src/components/DataTableCells/NumericInputCell.js
index 5e6c5d245..eaf933fb8 100644
--- a/src/components/DataTableCells/NumericInputCell.js
+++ b/src/components/DataTableCells/NumericInputCell.js
@@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react';
import { FormGroup, NumericInput, Intent } from '@blueprintjs/core';
import classNames from 'classnames';
import { CLASSES } from 'common/classes';
-import WarehouseListPopover from '../../containers/WarehouseListPopover';
/**
* Numeric input table cell.
@@ -37,8 +36,7 @@ export default function NumericInputCell({
onValueChange={handleValueChange}
onBlur={onBlur}
fill={true}
- buttonPosition={'none'}
- rightElement={
}
+ buttonPosition={"none"}
/>
);
diff --git a/src/components/DataTableCells/RadioFieldCell.js b/src/components/DataTableCells/RadioFieldCell.js
deleted file mode 100644
index 7471fb56c..000000000
--- a/src/components/DataTableCells/RadioFieldCell.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react';
-import classNames from 'classnames';
-import { FormGroup, Intent, Classes, Radio } from '@blueprintjs/core';
-
-const RadioEditableCell = ({
- row: { index, original },
- column: { id, radioProps },
- cell: { value: initialValue },
- payload,
-}) => {
- const [value, setValue] = React.useState(initialValue);
-
- const onChange = (e) => {
- const newValue = e.target.checked;
- debugger;
- setValue(newValue);
- payload.updateData(index, id, newValue);
- };
-
- React.useEffect(() => {
- setValue(initialValue);
- }, [initialValue]);
-
- const error = payload.errors?.[index]?.[id];
-
- return (
-
-
-
- );
-};
-
-export default RadioEditableCell;
diff --git a/src/components/DataTableCells/index.js b/src/components/DataTableCells/index.js
index 4e0a42835..fed349eed 100644
--- a/src/components/DataTableCells/index.js
+++ b/src/components/DataTableCells/index.js
@@ -9,7 +9,6 @@ import NumericInputCell from './NumericInputCell';
import CheckBoxFieldCell from './CheckBoxFieldCell';
import SwitchFieldCell from './SwitchFieldCell';
import TextAreaCell from './TextAreaCell';
-import RadioFieldCell from './RadioFieldCell';
export {
AccountsListFieldCell,
@@ -24,5 +23,4 @@ export {
CheckBoxFieldCell,
SwitchFieldCell,
TextAreaCell,
- RadioFieldCell,
};
diff --git a/src/containers/WarehouseListPopover/WarehousesList.js b/src/containers/WarehouseListPopover/WarehousesList.js
deleted file mode 100644
index 15c85743c..000000000
--- a/src/containers/WarehouseListPopover/WarehousesList.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-
-import { CLASSES } from 'common/classes';
-import { TableStyle } from '../../common';
-import { DataTableEditable, DataTable } from 'components';
-import { compose, saveInvoke, updateTableCell } from 'utils';
-import { useWarehouseEntriesColumns } from './components';
-
-export default function IntegrateWarehousesTable({
- // #ownProps
- initialWarehouse,
- selectedWarehouseId,
- onUpdateData,
- entries,
- errors,
-}) {
- const [rows, setRows] = React.useState(initialWarehouse);
-
- // warehouses entries columns.
- const columns = useWarehouseEntriesColumns();
-
- // Handle update data.
- const handleUpdateData = React.useCallback(
- (rowIndex, columnId, value) => {
- const newRows = compose(updateTableCell(rowIndex, columnId, value))(
- entries,
- );
- onUpdateData(newRows);
- },
- [onUpdateData, entries],
- );
-
- const DATA = [
- {
- warehouse_name: true,
- quantity: '9,444',
- availiable_for_sale: 0,
- },
- {
- warehouse_name: false,
- quantity: '19,444',
- availiable_for_sale: 0,
- },
- ];
-
- return (
-
- );
-}
-
-const WarehouseDataTableRoot = styled(DataTable)`
- width: 600px;
-
- .table {
- border: 1px solid #000000;
- .thead .th {
- background: transparent;
- color: #222222;
- border-bottom: 1px solid #000000;
- padding: 0.5rem;
- }
- .tbody .tr .td {
- padding: 0.2rem 0.2rem;
- border-bottom: 1px solid #cecbcb;
- }
- }
-`;
diff --git a/src/containers/WarehouseListPopover/components.js b/src/containers/WarehouseListPopover/components.js
deleted file mode 100644
index 1429a87e6..000000000
--- a/src/containers/WarehouseListPopover/components.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import React from 'react';
-
-import { RadioFieldCell } from 'components/DataTableCells';
-
-/**
- * Retrieve warehouse entries columns.
- */
-export function useWarehouseEntriesColumns() {
- return React.useMemo(
- () => [
- {
- Header: 'Warehouse Name',
- accessor: 'warehouse_name',
- Cell: RadioFieldCell,
- width: 120,
- disableSortBy: true,
- className: 'name',
- },
- {
- id: 'quantity',
- Header: 'Quantity on Hand',
- accessor: 'quantity',
- disableSortBy: true,
- align: 'right',
- width: '100',
- },
- {
- id: 'availiable_for_sale',
- Header: 'Availiable for Sale',
- accessor: 'availiable_for_sale',
- disableSortBy: true,
- align: 'right',
- width: '100',
- },
- ],
- [],
- );
-}
diff --git a/src/containers/WarehouseListPopover/index.js b/src/containers/WarehouseListPopover/index.js
deleted file mode 100644
index d2026f8ec..000000000
--- a/src/containers/WarehouseListPopover/index.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-import { PopoverInteractionKind, Position, Button } from '@blueprintjs/core';
-import { Popover2 } from '@blueprintjs/popover2';
-import WarehousesList from './WarehousesList';
-import { Icon, FormattedMessage as T, ButtonLink } from 'components';
-
-export default function IntegrateWarehouseTable() {
- return (
-
}
- interactionKind={PopoverInteractionKind.CLICK}
- position={Position.BOTTOM_LEFT}
- modifiers={{
- offset: { offset: '0, 4' },
- }}
- >
-
→
-
- );
-}
-
-const PopoverLink = styled.button`
- border: 0;
- cursor: pointer;
- background: transparent;
- margin-top: 18px;
- padding-right: 0px;
- color: #0052cc;
-
- &:hover,
- &:active {
- text-decoration: underline;
- }
-`;
From 03782efe88587e1882ed48bac793925aa783105e Mon Sep 17 00:00:00 2001
From: elforjani13 <39470382+elforjani13@users.noreply.github.com>
Date: Mon, 7 Feb 2022 13:16:46 +0200
Subject: [PATCH 051/207] feat(invoice): add branch & warehouse.
---
src/components/CustomSelectList.js | 103 +++++++
src/components/index.js | 2 +
.../Invoices/InvoiceForm/BaseCurrency.js | 34 +++
.../Sales/Invoices/InvoiceForm/FlagKit.js | 20 ++
.../Sales/Invoices/InvoiceForm/InvoiceForm.js | 2 +
.../InvoiceForm/InvoiceFormHeaderFields.js | 275 ++++++++++++------
.../InvoiceForm/InvoiceFormProvider.js | 12 +
.../Invoices/InvoiceForm/InvoiceFormTopBar.js | 55 ++++
src/static/json/icons.js | 12 +
src/static/svg/AD.svg | 35 +++
src/static/svg/AE.svg | 33 +++
src/static/svg/AF.svg | 34 +++
src/static/svg/AG.svg | 44 +++
src/static/svg/AI.svg | 50 ++++
src/static/svg/AL.svg | 27 ++
src/static/svg/AM.svg | 32 ++
src/static/svg/AO.svg | 37 +++
src/static/svg/AR.svg | 26 ++
src/static/svg/AS.svg | 36 +++
src/static/svg/AT.svg | 24 ++
src/static/svg/AU.svg | 36 +++
src/static/svg/AW.svg | 30 ++
src/static/svg/AX.svg | 32 ++
src/static/svg/AZ.svg | 33 +++
src/static/svg/BA.svg | 32 ++
src/static/svg/BB.svg | 38 +++
src/static/svg/BD.svg | 27 ++
src/static/svg/BE.svg | 32 ++
src/static/svg/BF.svg | 28 ++
src/static/svg/BG.svg | 28 ++
src/static/svg/BH.svg | 23 ++
src/static/svg/BI.svg | 36 +++
src/static/svg/BJ.svg | 32 ++
src/static/svg/BL.svg | 42 +++
src/static/svg/BM.svg | 49 ++++
src/static/svg/BN.svg | 28 ++
src/static/svg/BO.svg | 32 ++
src/static/svg/BR.svg | 35 +++
src/static/svg/BS.svg | 33 +++
src/static/svg/BT.svg | 27 ++
src/static/svg/BV.svg | 28 ++
src/static/svg/BW.svg | 29 ++
src/static/svg/BY.svg | 30 ++
src/static/svg/BZ.svg | 30 ++
src/static/svg/CA.svg | 25 ++
src/static/svg/CC.svg | 33 +++
src/static/svg/CD.svg | 31 ++
src/static/svg/CF.svg | 43 +++
src/static/svg/CG.svg | 34 +++
src/static/svg/CH.svg | 23 ++
src/static/svg/CI.svg | 28 ++
src/static/svg/CK.svg | 31 ++
src/static/svg/CL.svg | 29 ++
src/static/svg/CM.svg | 38 +++
src/static/svg/CN.svg | 32 ++
src/static/svg/CO.svg | 32 ++
src/static/svg/CR.svg | 29 ++
src/static/svg/CU.svg | 32 ++
src/static/svg/CV.svg | 30 ++
src/static/svg/CW.svg | 29 ++
src/static/svg/CX.svg | 38 +++
src/static/svg/CY.svg | 24 ++
src/static/svg/CZ.svg | 28 ++
src/static/svg/DE.svg | 32 ++
src/static/svg/DJ.svg | 33 +++
src/static/svg/DK.svg | 23 ++
src/static/svg/DM.svg | 41 +++
src/static/svg/DO.svg | 33 +++
src/static/svg/DZ.svg | 29 ++
src/static/svg/EC.svg | 39 +++
src/static/svg/EE.svg | 28 ++
src/static/svg/EG.svg | 30 ++
src/static/svg/ER.svg | 40 +++
src/static/svg/ES.svg | 34 +++
src/static/svg/ET.svg | 42 +++
src/static/svg/EU.svg | 27 ++
src/static/svg/FI.svg | 22 ++
src/static/svg/FJ.svg | 51 ++++
src/static/svg/FK.svg | 58 ++++
src/static/svg/FM.svg | 23 ++
src/static/svg/FO.svg | 27 ++
src/static/svg/FR.svg | 28 ++
src/static/svg/GA.svg | 32 ++
src/static/svg/GB-ENG.svg | 22 ++
src/static/svg/GB-NIR.svg | 41 +++
src/static/svg/GB-SCT.svg | 23 ++
src/static/svg/GB-WLS.svg | 28 ++
src/static/svg/GB-ZET.svg | 23 ++
src/static/svg/GB.svg | 32 ++
src/static/svg/GD.svg | 49 ++++
src/static/svg/GE.svg | 26 ++
src/static/svg/GF.svg | 32 ++
src/static/svg/GG.svg | 27 ++
src/static/svg/GH.svg | 37 +++
src/static/svg/GI.svg | 38 +++
src/static/svg/GL.svg | 33 +++
src/static/svg/GM.svg | 33 +++
src/static/svg/GN.svg | 32 ++
src/static/svg/GP.svg | 40 +++
src/static/svg/GQ.svg | 34 +++
src/static/svg/GR.svg | 22 ++
src/static/svg/GS.svg | 112 +++++++
src/static/svg/GT.svg | 26 ++
src/static/svg/GU.svg | 65 +++++
src/static/svg/GW.svg | 37 +++
src/static/svg/GY.svg | 42 +++
src/static/svg/HK.svg | 23 ++
src/static/svg/HM.svg | 36 +++
src/static/svg/HN.svg | 33 +++
src/static/svg/HR.svg | 35 +++
src/static/svg/HT.svg | 46 +++
src/static/svg/HU.svg | 28 ++
src/static/svg/ID.svg | 23 ++
src/static/svg/IE.svg | 28 ++
src/static/svg/IL.svg | 26 ++
src/static/svg/IM.svg | 30 ++
src/static/svg/IN.svg | 31 ++
src/static/svg/IO.svg | 33 +++
src/static/svg/IQ.svg | 33 +++
src/static/svg/IR.svg | 31 ++
src/static/svg/IS.svg | 28 ++
src/static/svg/IT.svg | 28 ++
src/static/svg/JE.svg | 32 ++
src/static/svg/JM.svg | 33 +++
src/static/svg/JO.svg | 34 +++
src/static/svg/JP.svg | 22 ++
src/static/svg/KE.svg | 43 +++
src/static/svg/KG.svg | 28 ++
src/static/svg/KH.svg | 29 ++
src/static/svg/KI.svg | 35 +++
src/static/svg/KM.svg | 39 +++
src/static/svg/KN.svg | 39 +++
src/static/svg/KP.svg | 30 ++
src/static/svg/KR.svg | 38 +++
src/static/svg/KW.svg | 33 +++
src/static/svg/KY.svg | 44 +++
src/static/svg/KZ.svg | 29 ++
src/static/svg/LA.svg | 29 ++
src/static/svg/LB.svg | 29 ++
src/static/svg/LC.svg | 33 +++
src/static/svg/LGBT.svg | 42 +++
src/static/svg/LI.svg | 27 ++
src/static/svg/LK.svg | 43 +++
src/static/svg/LR.svg | 36 +++
src/static/svg/LS.svg | 34 +++
src/static/svg/LT.svg | 32 ++
src/static/svg/LU.svg | 28 ++
src/static/svg/LV.svg | 24 ++
src/static/svg/LY.svg | 33 +++
src/static/svg/MA.svg | 23 ++
src/static/svg/MC.svg | 23 ++
src/static/svg/MD.svg | 42 +++
src/static/svg/ME.svg | 29 ++
src/static/svg/MF.svg | 28 ++
src/static/svg/MG.svg | 28 ++
src/static/svg/MH.svg | 29 ++
src/static/svg/MK.svg | 29 ++
src/static/svg/ML.svg | 32 ++
src/static/svg/MM.svg | 33 +++
src/static/svg/MN.svg | 33 +++
src/static/svg/MO.svg | 26 ++
src/static/svg/MP.svg | 29 ++
src/static/svg/MQ.svg | 27 ++
src/static/svg/MR.svg | 27 ++
src/static/svg/MS.svg | 47 +++
src/static/svg/MT.svg | 29 ++
src/static/svg/MU.svg | 37 +++
src/static/svg/MV.svg | 28 ++
src/static/svg/MW.svg | 33 +++
src/static/svg/MX.svg | 30 ++
src/static/svg/MY.svg | 32 ++
src/static/svg/MZ.svg | 43 +++
src/static/svg/NA.svg | 75 +++++
src/static/svg/NC.svg | 42 +++
src/static/svg/NE.svg | 33 +++
src/static/svg/NF.svg | 29 ++
src/static/svg/NG.svg | 24 ++
src/static/svg/NI.svg | 26 ++
src/static/svg/NL.svg | 28 ++
src/static/svg/NO.svg | 28 ++
src/static/svg/NP.svg | 35 +++
src/static/svg/NR.svg | 28 ++
src/static/svg/NU.svg | 41 +++
src/static/svg/NZ.svg | 34 +++
src/static/svg/OM.svg | 29 ++
src/static/svg/PA.svg | 30 ++
src/static/svg/PE.svg | 24 ++
src/static/svg/PF.svg | 52 ++++
src/static/svg/PG.svg | 36 +++
src/static/svg/PH.svg | 33 +++
src/static/svg/PK.svg | 32 ++
src/static/svg/PL.svg | 23 ++
src/static/svg/PM.svg | 66 +++++
src/static/svg/PN.svg | 51 ++++
src/static/svg/PR.svg | 30 ++
src/static/svg/PS.svg | 33 +++
src/static/svg/PT.svg | 38 +++
src/static/svg/PW.svg | 27 ++
src/static/svg/PY.svg | 30 ++
src/static/svg/QA.svg | 23 ++
src/static/svg/RE.svg | 28 ++
src/static/svg/RO.svg | 32 ++
src/static/svg/RS.svg | 39 +++
src/static/svg/RU.svg | 28 ++
src/static/svg/RW.svg | 37 +++
src/static/svg/SA.svg | 26 ++
src/static/svg/SB.svg | 39 +++
src/static/svg/SC.svg | 43 +++
src/static/svg/SD.svg | 33 +++
src/static/svg/SE.svg | 27 ++
src/static/svg/SG.svg | 24 ++
src/static/svg/SH.svg | 53 ++++
src/static/svg/SI.svg | 28 ++
src/static/svg/SJ.svg | 28 ++
src/static/svg/SK.svg | 46 +++
src/static/svg/SL.svg | 28 ++
src/static/svg/SM.svg | 25 ++
src/static/svg/SN.svg | 33 +++
src/static/svg/SO.svg | 23 ++
src/static/svg/SR.svg | 34 +++
src/static/svg/SS.svg | 44 +++
src/static/svg/ST.svg | 39 +++
src/static/svg/SV.svg | 30 ++
src/static/svg/SX.svg | 45 +++
src/static/svg/SY.svg | 34 +++
src/static/svg/SZ.svg | 47 +++
src/static/svg/TC.svg | 40 +++
src/static/svg/TD.svg | 32 ++
src/static/svg/TF.svg | 35 +++
src/static/svg/TG.svg | 33 +++
src/static/svg/TH.svg | 29 ++
src/static/svg/TJ.svg | 29 ++
src/static/svg/TK.svg | 31 ++
src/static/svg/TL.svg | 33 +++
src/static/svg/TM.svg | 74 +++++
src/static/svg/TN.svg | 23 ++
src/static/svg/TO.svg | 28 ++
src/static/svg/TR.svg | 23 ++
src/static/svg/TT.svg | 28 ++
src/static/svg/TV.svg | 36 +++
src/static/svg/TW.svg | 28 ++
src/static/svg/TZ.svg | 37 +++
src/static/svg/UA.svg | 27 ++
src/static/svg/UG.svg | 37 +++
src/static/svg/UM.svg | 28 ++
src/static/svg/US-CA.svg | 33 +++
src/static/svg/US.svg | 28 ++
src/static/svg/UY.svg | 29 ++
src/static/svg/UZ.svg | 29 ++
src/static/svg/VA.svg | 39 +++
src/static/svg/VC.svg | 37 +++
src/static/svg/VE.svg | 33 +++
src/static/svg/VG.svg | 42 +++
src/static/svg/VI.svg | 49 ++++
src/static/svg/VN.svg | 27 ++
src/static/svg/VU.svg | 38 +++
src/static/svg/WF.svg | 28 ++
src/static/svg/WS.svg | 28 ++
src/static/svg/XK.svg | 28 ++
src/static/svg/YE.svg | 28 ++
src/static/svg/YT.svg | 77 +++++
src/static/svg/ZA.svg | 44 +++
src/static/svg/ZM.svg | 42 +++
src/static/svg/ZW.svg | 43 +++
src/style/pages/Dashboard/Dashboard.scss | 36 ++-
src/style/pages/SaleInvoice/PageForm.scss | 22 ++
266 files changed, 9061 insertions(+), 88 deletions(-)
create mode 100644 src/components/CustomSelectList.js
create mode 100644 src/containers/Sales/Invoices/InvoiceForm/BaseCurrency.js
create mode 100644 src/containers/Sales/Invoices/InvoiceForm/FlagKit.js
create mode 100644 src/containers/Sales/Invoices/InvoiceForm/InvoiceFormTopBar.js
create mode 100644 src/static/svg/AD.svg
create mode 100644 src/static/svg/AE.svg
create mode 100644 src/static/svg/AF.svg
create mode 100644 src/static/svg/AG.svg
create mode 100644 src/static/svg/AI.svg
create mode 100644 src/static/svg/AL.svg
create mode 100644 src/static/svg/AM.svg
create mode 100644 src/static/svg/AO.svg
create mode 100644 src/static/svg/AR.svg
create mode 100644 src/static/svg/AS.svg
create mode 100644 src/static/svg/AT.svg
create mode 100644 src/static/svg/AU.svg
create mode 100644 src/static/svg/AW.svg
create mode 100644 src/static/svg/AX.svg
create mode 100644 src/static/svg/AZ.svg
create mode 100644 src/static/svg/BA.svg
create mode 100644 src/static/svg/BB.svg
create mode 100644 src/static/svg/BD.svg
create mode 100644 src/static/svg/BE.svg
create mode 100644 src/static/svg/BF.svg
create mode 100644 src/static/svg/BG.svg
create mode 100644 src/static/svg/BH.svg
create mode 100644 src/static/svg/BI.svg
create mode 100644 src/static/svg/BJ.svg
create mode 100644 src/static/svg/BL.svg
create mode 100644 src/static/svg/BM.svg
create mode 100644 src/static/svg/BN.svg
create mode 100644 src/static/svg/BO.svg
create mode 100644 src/static/svg/BR.svg
create mode 100644 src/static/svg/BS.svg
create mode 100644 src/static/svg/BT.svg
create mode 100644 src/static/svg/BV.svg
create mode 100644 src/static/svg/BW.svg
create mode 100644 src/static/svg/BY.svg
create mode 100644 src/static/svg/BZ.svg
create mode 100644 src/static/svg/CA.svg
create mode 100644 src/static/svg/CC.svg
create mode 100644 src/static/svg/CD.svg
create mode 100644 src/static/svg/CF.svg
create mode 100644 src/static/svg/CG.svg
create mode 100644 src/static/svg/CH.svg
create mode 100644 src/static/svg/CI.svg
create mode 100644 src/static/svg/CK.svg
create mode 100644 src/static/svg/CL.svg
create mode 100644 src/static/svg/CM.svg
create mode 100644 src/static/svg/CN.svg
create mode 100644 src/static/svg/CO.svg
create mode 100644 src/static/svg/CR.svg
create mode 100644 src/static/svg/CU.svg
create mode 100644 src/static/svg/CV.svg
create mode 100644 src/static/svg/CW.svg
create mode 100644 src/static/svg/CX.svg
create mode 100644 src/static/svg/CY.svg
create mode 100644 src/static/svg/CZ.svg
create mode 100644 src/static/svg/DE.svg
create mode 100644 src/static/svg/DJ.svg
create mode 100644 src/static/svg/DK.svg
create mode 100644 src/static/svg/DM.svg
create mode 100644 src/static/svg/DO.svg
create mode 100644 src/static/svg/DZ.svg
create mode 100644 src/static/svg/EC.svg
create mode 100644 src/static/svg/EE.svg
create mode 100644 src/static/svg/EG.svg
create mode 100644 src/static/svg/ER.svg
create mode 100644 src/static/svg/ES.svg
create mode 100644 src/static/svg/ET.svg
create mode 100644 src/static/svg/EU.svg
create mode 100644 src/static/svg/FI.svg
create mode 100644 src/static/svg/FJ.svg
create mode 100644 src/static/svg/FK.svg
create mode 100644 src/static/svg/FM.svg
create mode 100644 src/static/svg/FO.svg
create mode 100644 src/static/svg/FR.svg
create mode 100644 src/static/svg/GA.svg
create mode 100644 src/static/svg/GB-ENG.svg
create mode 100644 src/static/svg/GB-NIR.svg
create mode 100644 src/static/svg/GB-SCT.svg
create mode 100644 src/static/svg/GB-WLS.svg
create mode 100644 src/static/svg/GB-ZET.svg
create mode 100644 src/static/svg/GB.svg
create mode 100644 src/static/svg/GD.svg
create mode 100644 src/static/svg/GE.svg
create mode 100644 src/static/svg/GF.svg
create mode 100644 src/static/svg/GG.svg
create mode 100644 src/static/svg/GH.svg
create mode 100644 src/static/svg/GI.svg
create mode 100644 src/static/svg/GL.svg
create mode 100644 src/static/svg/GM.svg
create mode 100644 src/static/svg/GN.svg
create mode 100644 src/static/svg/GP.svg
create mode 100644 src/static/svg/GQ.svg
create mode 100644 src/static/svg/GR.svg
create mode 100644 src/static/svg/GS.svg
create mode 100644 src/static/svg/GT.svg
create mode 100644 src/static/svg/GU.svg
create mode 100644 src/static/svg/GW.svg
create mode 100644 src/static/svg/GY.svg
create mode 100644 src/static/svg/HK.svg
create mode 100644 src/static/svg/HM.svg
create mode 100644 src/static/svg/HN.svg
create mode 100644 src/static/svg/HR.svg
create mode 100644 src/static/svg/HT.svg
create mode 100644 src/static/svg/HU.svg
create mode 100644 src/static/svg/ID.svg
create mode 100644 src/static/svg/IE.svg
create mode 100644 src/static/svg/IL.svg
create mode 100644 src/static/svg/IM.svg
create mode 100644 src/static/svg/IN.svg
create mode 100644 src/static/svg/IO.svg
create mode 100644 src/static/svg/IQ.svg
create mode 100644 src/static/svg/IR.svg
create mode 100644 src/static/svg/IS.svg
create mode 100644 src/static/svg/IT.svg
create mode 100644 src/static/svg/JE.svg
create mode 100644 src/static/svg/JM.svg
create mode 100644 src/static/svg/JO.svg
create mode 100644 src/static/svg/JP.svg
create mode 100644 src/static/svg/KE.svg
create mode 100644 src/static/svg/KG.svg
create mode 100644 src/static/svg/KH.svg
create mode 100644 src/static/svg/KI.svg
create mode 100644 src/static/svg/KM.svg
create mode 100644 src/static/svg/KN.svg
create mode 100644 src/static/svg/KP.svg
create mode 100644 src/static/svg/KR.svg
create mode 100644 src/static/svg/KW.svg
create mode 100644 src/static/svg/KY.svg
create mode 100644 src/static/svg/KZ.svg
create mode 100644 src/static/svg/LA.svg
create mode 100644 src/static/svg/LB.svg
create mode 100644 src/static/svg/LC.svg
create mode 100644 src/static/svg/LGBT.svg
create mode 100644 src/static/svg/LI.svg
create mode 100644 src/static/svg/LK.svg
create mode 100644 src/static/svg/LR.svg
create mode 100644 src/static/svg/LS.svg
create mode 100644 src/static/svg/LT.svg
create mode 100644 src/static/svg/LU.svg
create mode 100644 src/static/svg/LV.svg
create mode 100644 src/static/svg/LY.svg
create mode 100644 src/static/svg/MA.svg
create mode 100644 src/static/svg/MC.svg
create mode 100644 src/static/svg/MD.svg
create mode 100644 src/static/svg/ME.svg
create mode 100644 src/static/svg/MF.svg
create mode 100644 src/static/svg/MG.svg
create mode 100644 src/static/svg/MH.svg
create mode 100644 src/static/svg/MK.svg
create mode 100644 src/static/svg/ML.svg
create mode 100644 src/static/svg/MM.svg
create mode 100644 src/static/svg/MN.svg
create mode 100644 src/static/svg/MO.svg
create mode 100644 src/static/svg/MP.svg
create mode 100644 src/static/svg/MQ.svg
create mode 100644 src/static/svg/MR.svg
create mode 100644 src/static/svg/MS.svg
create mode 100644 src/static/svg/MT.svg
create mode 100644 src/static/svg/MU.svg
create mode 100644 src/static/svg/MV.svg
create mode 100644 src/static/svg/MW.svg
create mode 100644 src/static/svg/MX.svg
create mode 100644 src/static/svg/MY.svg
create mode 100644 src/static/svg/MZ.svg
create mode 100644 src/static/svg/NA.svg
create mode 100644 src/static/svg/NC.svg
create mode 100644 src/static/svg/NE.svg
create mode 100644 src/static/svg/NF.svg
create mode 100644 src/static/svg/NG.svg
create mode 100644 src/static/svg/NI.svg
create mode 100644 src/static/svg/NL.svg
create mode 100644 src/static/svg/NO.svg
create mode 100644 src/static/svg/NP.svg
create mode 100644 src/static/svg/NR.svg
create mode 100644 src/static/svg/NU.svg
create mode 100644 src/static/svg/NZ.svg
create mode 100644 src/static/svg/OM.svg
create mode 100644 src/static/svg/PA.svg
create mode 100644 src/static/svg/PE.svg
create mode 100644 src/static/svg/PF.svg
create mode 100644 src/static/svg/PG.svg
create mode 100644 src/static/svg/PH.svg
create mode 100644 src/static/svg/PK.svg
create mode 100644 src/static/svg/PL.svg
create mode 100644 src/static/svg/PM.svg
create mode 100644 src/static/svg/PN.svg
create mode 100644 src/static/svg/PR.svg
create mode 100644 src/static/svg/PS.svg
create mode 100644 src/static/svg/PT.svg
create mode 100644 src/static/svg/PW.svg
create mode 100644 src/static/svg/PY.svg
create mode 100644 src/static/svg/QA.svg
create mode 100644 src/static/svg/RE.svg
create mode 100644 src/static/svg/RO.svg
create mode 100644 src/static/svg/RS.svg
create mode 100644 src/static/svg/RU.svg
create mode 100644 src/static/svg/RW.svg
create mode 100644 src/static/svg/SA.svg
create mode 100644 src/static/svg/SB.svg
create mode 100644 src/static/svg/SC.svg
create mode 100644 src/static/svg/SD.svg
create mode 100644 src/static/svg/SE.svg
create mode 100644 src/static/svg/SG.svg
create mode 100644 src/static/svg/SH.svg
create mode 100644 src/static/svg/SI.svg
create mode 100644 src/static/svg/SJ.svg
create mode 100644 src/static/svg/SK.svg
create mode 100644 src/static/svg/SL.svg
create mode 100644 src/static/svg/SM.svg
create mode 100644 src/static/svg/SN.svg
create mode 100644 src/static/svg/SO.svg
create mode 100644 src/static/svg/SR.svg
create mode 100644 src/static/svg/SS.svg
create mode 100644 src/static/svg/ST.svg
create mode 100644 src/static/svg/SV.svg
create mode 100644 src/static/svg/SX.svg
create mode 100644 src/static/svg/SY.svg
create mode 100644 src/static/svg/SZ.svg
create mode 100644 src/static/svg/TC.svg
create mode 100644 src/static/svg/TD.svg
create mode 100644 src/static/svg/TF.svg
create mode 100644 src/static/svg/TG.svg
create mode 100644 src/static/svg/TH.svg
create mode 100644 src/static/svg/TJ.svg
create mode 100644 src/static/svg/TK.svg
create mode 100644 src/static/svg/TL.svg
create mode 100644 src/static/svg/TM.svg
create mode 100644 src/static/svg/TN.svg
create mode 100644 src/static/svg/TO.svg
create mode 100644 src/static/svg/TR.svg
create mode 100644 src/static/svg/TT.svg
create mode 100644 src/static/svg/TV.svg
create mode 100644 src/static/svg/TW.svg
create mode 100644 src/static/svg/TZ.svg
create mode 100644 src/static/svg/UA.svg
create mode 100644 src/static/svg/UG.svg
create mode 100644 src/static/svg/UM.svg
create mode 100644 src/static/svg/US-CA.svg
create mode 100644 src/static/svg/US.svg
create mode 100644 src/static/svg/UY.svg
create mode 100644 src/static/svg/UZ.svg
create mode 100644 src/static/svg/VA.svg
create mode 100644 src/static/svg/VC.svg
create mode 100644 src/static/svg/VE.svg
create mode 100644 src/static/svg/VG.svg
create mode 100644 src/static/svg/VI.svg
create mode 100644 src/static/svg/VN.svg
create mode 100644 src/static/svg/VU.svg
create mode 100644 src/static/svg/WF.svg
create mode 100644 src/static/svg/WS.svg
create mode 100644 src/static/svg/XK.svg
create mode 100644 src/static/svg/YE.svg
create mode 100644 src/static/svg/YT.svg
create mode 100644 src/static/svg/ZA.svg
create mode 100644 src/static/svg/ZM.svg
create mode 100644 src/static/svg/ZW.svg
diff --git a/src/components/CustomSelectList.js b/src/components/CustomSelectList.js
new file mode 100644
index 000000000..2b0ad4bad
--- /dev/null
+++ b/src/components/CustomSelectList.js
@@ -0,0 +1,103 @@
+import React from 'react';
+import {
+ Button,
+ MenuItem,
+ PopoverInteractionKind,
+ Position,
+} from '@blueprintjs/core';
+import { defaultTo } from 'lodash';
+import { Select } from '@blueprintjs/select';
+import { FormattedMessage as T, Icon } from 'components';
+
+/**
+ * warehouse & branches select list.
+ * @returns
+ */
+export default function CustomSelectList({
+ // #ownProps
+ items,
+ initialItemId,
+ selectedItemId,
+ text,
+ onItemSelected,
+ buttonProps,
+}) {
+ const initialItem = React.useMemo(
+ () => items.find((a) => a.id === initialItemId),
+ [initialItemId, items],
+ );
+
+ const [selecetedItem, setSelectedItem] = React.useState(initialItem || null);
+
+ React.useEffect(() => {
+ if (typeof selectedItemId !== 'undefined') {
+ const item = selectedItemId
+ ? items.find((a) => a.id === selectedItemId)
+ : null;
+ setSelectedItem(item);
+ }
+ }, [selectedItemId, items, setSelectedItem]);
+
+ // Menu items renderer.
+ const itemRenderer = (item, { handleClick, modifiers, query }) => (
+
+ );
+
+ // Filters items items.
+ const filterItemsPredicater = (query, item, _index, exactMatch) => {
+ const normalizedTitle = item.name.toLowerCase();
+ const normalizedQuery = query.toLowerCase();
+
+ if (exactMatch) {
+ return normalizedTitle === normalizedQuery;
+ } else {
+ return `${item.code} ${normalizedTitle}`.indexOf(normalizedQuery) >= 0;
+ }
+ };
+
+ const handleItemMenuSelect = React.useCallback(
+ (item) => {
+ if (item.id) {
+ setSelectedItem({ ...item });
+ onItemSelected && onItemSelected(item);
+ }
+ },
+ [onItemSelected, setSelectedItem],
+ );
+
+ return (
+
} />}
+ itemRenderer={itemRenderer}
+ itemPredicate={filterItemsPredicater}
+ onItemSelect={handleItemMenuSelect}
+ popoverProps={{
+ minimal: true,
+ position: Position.BOTTOM_LEFT,
+ interactionKind: PopoverInteractionKind.CLICK,
+ modifiers: {
+ offset: { offset: '0, 4' },
+ },
+ }}
+ >
+
+
+ );
+}
diff --git a/src/components/index.js b/src/components/index.js
index cdf278b7b..d24fccb58 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -54,6 +54,7 @@ import AvaterCell from './AvaterCell';
import { ItemsMultiSelect } from './Items';
import MoreMenuItems from './MoreMenutItems';
+import CustomSelectList from './CustomSelectList'
export * from './Dialog';
export * from './Menu';
@@ -161,4 +162,5 @@ export {
ItemsMultiSelect,
AvaterCell,
MoreMenuItems,
+ CustomSelectList
};
diff --git a/src/containers/Sales/Invoices/InvoiceForm/BaseCurrency.js b/src/containers/Sales/Invoices/InvoiceForm/BaseCurrency.js
new file mode 100644
index 000000000..c4f72e7cc
--- /dev/null
+++ b/src/containers/Sales/Invoices/InvoiceForm/BaseCurrency.js
@@ -0,0 +1,34 @@
+import React from 'react';
+import * as R from 'ramda';
+import styled from 'styled-components';
+
+import { CurrencyTag } from 'components';
+import withCurrentOrganization from 'containers/Organization/withCurrentOrganization';
+
+/**
+ * base currency sign.
+ */
+function BaseCurrency({
+ // #withCurrentOrganization
+ organization: { base_currency = '' },
+}) {
+ // if (base_currency.length <= 0) {
+ // return null;
+ // }
+
+ return (
+
+ {base_currency}
+
+ );
+}
+
+export default R.compose(withCurrentOrganization())(BaseCurrency);
+
+const BaseCurrencySign = styled.div`
+ font-size: 10px;
+ margin-left: 5px;
+ span {
+ background: #5c7080;
+ }
+`;
diff --git a/src/containers/Sales/Invoices/InvoiceForm/FlagKit.js b/src/containers/Sales/Invoices/InvoiceForm/FlagKit.js
new file mode 100644
index 000000000..0a64a8ad6
--- /dev/null
+++ b/src/containers/Sales/Invoices/InvoiceForm/FlagKit.js
@@ -0,0 +1,20 @@
+import React from 'react';
+import styled from 'styled-components';
+
+export default function FlagKit({ flage }) {
+ return (
+
+
+
+ );
+}
+
+const Img = styled.img`
+ display: inline-block;
+ object-fit: cover;
+ object-position: center;
+ margin: 0 5px;
+`;
diff --git a/src/containers/Sales/Invoices/InvoiceForm/InvoiceForm.js b/src/containers/Sales/Invoices/InvoiceForm/InvoiceForm.js
index 8c2f96c8c..b83f15072 100644
--- a/src/containers/Sales/Invoices/InvoiceForm/InvoiceForm.js
+++ b/src/containers/Sales/Invoices/InvoiceForm/InvoiceForm.js
@@ -16,6 +16,7 @@ import InvoiceItemsEntriesEditorField from './InvoiceItemsEntriesEditorField';
import InvoiceFloatingActions from './InvoiceFloatingActions';
import InvoiceFormFooter from './InvoiceFormFooter';
import InvoiceFormDialogs from './InvoiceFormDialogs';
+import InvoiceFormTopBar from './InvoiceFormTopBar';
import withDashboardActions from 'containers/Dashboard/withDashboardActions';
import withMediaActions from 'containers/Media/withMediaActions';
@@ -166,6 +167,7 @@ function InvoiceForm({
onSubmit={handleSubmit}
>
);
}
const useBranchesContext = () => React.useContext(BranchesContext);
export { BranchesProvider, useBranchesContext };
-
-const BrachesPreferencesCard = styled(Card)`
- padding: 0;
-`;
diff --git a/src/containers/Preferences/Warehouses/WarehousesList.js b/src/containers/Preferences/Warehouses/WarehousesList.js
index fc6051b3a..d23f20632 100644
--- a/src/containers/Preferences/Warehouses/WarehousesList.js
+++ b/src/containers/Preferences/Warehouses/WarehousesList.js
@@ -1,5 +1,8 @@
import React from 'react';
+import styled from 'styled-components';
import intl from 'react-intl-universal';
+
+import '../../../style/pages/Preferences/warehousesList.scss';
import Warehouses from './Warehouses';
import WarehousesEmptyStatus from './WarehousesEmptyStatus';
import withDashboardActions from 'containers/Dashboard/withDashboardActions';
@@ -18,7 +21,17 @@ function WarehousesList({
// return