mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-19 22:30:31 +00:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69f16d1977 | ||
|
|
9973693a86 | ||
|
|
3a3dd7a565 | ||
|
|
687dda1e7c | ||
|
|
bfa809c831 | ||
|
|
07145e92ab | ||
|
|
4a46c00a07 | ||
|
|
5c7ac0593d | ||
|
|
fa25fb4ede | ||
|
|
3566d3b855 | ||
|
|
c5da97bce0 | ||
|
|
0cfbe633bd | ||
|
|
55098d7b78 | ||
|
|
78610cd519 | ||
|
|
828a28b976 | ||
|
|
daf5fc8aba | ||
|
|
97d890bcef | ||
|
|
521df8511d | ||
|
|
73ec49b36a |
1
.env.example
Normal file
1
.env.example
Normal file
@@ -0,0 +1 @@
|
|||||||
|
APP_VERSION=$npm_package_version
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
# misc
|
# misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
.env
|
||||||
.env.local
|
.env.local
|
||||||
.env.development.local
|
.env.development.local
|
||||||
.env.test.local
|
.env.test.local
|
||||||
|
|||||||
28
CHANGELOG.md
28
CHANGELOG.md
@@ -2,8 +2,17 @@
|
|||||||
|
|
||||||
All notable changes to Bigcapital server-side will be in this file.
|
All notable changes to Bigcapital server-side will be in this file.
|
||||||
|
|
||||||
|
## [1.5.3] - 03-01-2020
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Localize the global errors.
|
||||||
|
- Expand account name column on trial balance sheet.
|
||||||
|
|
||||||
## [1.5.0] - 20-12-2021
|
## [1.5.0] - 20-12-2021
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Add credit note on sales module.
|
- Add credit note on sales module.
|
||||||
- Add vendor credit on purchases module.
|
- Add vendor credit on purchases module.
|
||||||
- Optimize landed costs on purchase invoices.
|
- Optimize landed costs on purchase invoices.
|
||||||
@@ -16,22 +25,28 @@ All notable changes to Bigcapital server-side will be in this file.
|
|||||||
purchase invoice, expense, manual journal, inventory adjustment and cashflow transaction.
|
purchase invoice, expense, manual journal, inventory adjustment and cashflow transaction.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Dashboard meta boot and authenticated user request query.
|
- Dashboard meta boot and authenticated user request query.
|
||||||
|
- Optimize Arabic localization.
|
||||||
|
|
||||||
## [1.4.0] - 11-09-2021
|
## [1.4.0] - 11-09-2021
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Add SMS notification on sale invoice, receipt, customers payments modules.
|
- Add SMS notification on sale invoice, receipt, customers payments modules.
|
||||||
- Customer quick create in customers list.
|
- Customer quick create in customers list.
|
||||||
- Item quick create in items list.
|
- Item quick create in items list.
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
change: BIG-171 alerts in global scope and lazy loading.
|
|
||||||
|
change: BIG-171 alerts in global scope and lazy loading.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
fix: BIG-140 - Reordering sell, cost and inventory account on item details.
|
|
||||||
fix: BIG-144 - Typo adjustment dialog success message.
|
fix: BIG-140 - Reordering sell, cost and inventory account on item details.
|
||||||
fix: BIG-148 - Items entries ordered by index.
|
fix: BIG-144 - Typo adjustment dialog success message.
|
||||||
fix: BIG-132 AR/AP aging summary report filter by none transactions/zero contacts.
|
fix: BIG-148 - Items entries ordered by index.
|
||||||
|
fix: BIG-132 AR/AP aging summary report filter by none transactions/zero contacts.
|
||||||
|
|
||||||
## [1.2.0-RC] - 03-09-2021
|
## [1.2.0-RC] - 03-09-2021
|
||||||
|
|
||||||
@@ -39,6 +54,7 @@ Here we write upgrading notes for brands. It's a team effort to make them as
|
|||||||
straightforward as possible.
|
straightforward as possible.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Add slidable sub-sidebar to improve user experience instead of sub-menu.
|
- Add slidable sub-sidebar to improve user experience instead of sub-menu.
|
||||||
- Add Subscription guard to ensure the organization's subscription is active or
|
- Add Subscription guard to ensure the organization's subscription is active or
|
||||||
redirect all routes to subscription billing page.
|
redirect all routes to subscription billing page.
|
||||||
@@ -65,11 +81,13 @@ straightforward as possible.
|
|||||||
- Add clickable datatable rows to display each row details.
|
- Add clickable datatable rows to display each row details.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Optimize style of datatable selection checkbox.
|
- Optimize style of datatable selection checkbox.
|
||||||
- Disable animation in dashboard views tabs.
|
- Disable animation in dashboard views tabs.
|
||||||
- Optimize Arabic localization.
|
- Optimize Arabic localization.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- fix: disable submit buttons in pereferences pages.
|
- fix: disable submit buttons in pereferences pages.
|
||||||
- fix: inventory adjustment cost field max/min range to avoid out of range error.
|
- fix: inventory adjustment cost field max/min range to avoid out of range error.
|
||||||
- fix: transactions by customers/vendors report localization.
|
- fix: transactions by customers/vendors report localization.
|
||||||
|
|||||||
779
package-lock.json
generated
779
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "bigcapital-client",
|
"name": "bigcapital-client",
|
||||||
"version": "1.2.0",
|
"version": "1.5.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "7.8.4",
|
"@babel/core": "7.8.4",
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import SidebarContainer from 'components/Sidebar/SidebarContainer';
|
import SidebarContainer from 'components/Sidebar/SidebarContainer';
|
||||||
import SidebarHead from 'components/Sidebar/SidebarHead';
|
import SidebarHead from 'components/Sidebar/SidebarHead';
|
||||||
import SidebarMenu from 'components/Sidebar/SidebarMenu';
|
import SidebarMenu from 'components/Sidebar/SidebarMenu';
|
||||||
@@ -17,7 +18,20 @@ export default function Sidebar({ dashboardContentRef }) {
|
|||||||
<SidebarMenu menu={menu} />
|
<SidebarMenu menu={menu} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="sidebar__version">0.0.1-beta version.</div>
|
<SidebarFooterVersion />
|
||||||
</SidebarContainer>
|
</SidebarContainer>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sidebar footer version.
|
||||||
|
* @returns {React.JSX}
|
||||||
|
*/
|
||||||
|
function SidebarFooterVersion() {
|
||||||
|
const { REACT_APP_VERSION: VERSION } = process.env;
|
||||||
|
|
||||||
|
if (!VERSION) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <div class="sidebar__version">v{VERSION}</div>;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import { Menu, MenuItem, MenuDivider, Intent } from '@blueprintjs/core';
|
import {
|
||||||
|
Menu,
|
||||||
|
MenuItem,
|
||||||
|
MenuDivider,
|
||||||
|
Intent,
|
||||||
|
Tooltip,
|
||||||
|
Position,
|
||||||
|
Classes,
|
||||||
|
} from '@blueprintjs/core';
|
||||||
import clsx from 'classnames';
|
import clsx from 'classnames';
|
||||||
|
|
||||||
import intl from 'react-intl-universal';
|
import intl from 'react-intl-universal';
|
||||||
@@ -79,7 +87,7 @@ export function ActionsMenu({
|
|||||||
* Phone number accessor.
|
* Phone number accessor.
|
||||||
*/
|
*/
|
||||||
export function PhoneNumberAccessor(row) {
|
export function PhoneNumberAccessor(row) {
|
||||||
return <div className={'work_phone'}>{row.work_phone}</div>;
|
return <div className={'work_phone'}>{row.personal_phone}</div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,6 +97,24 @@ export function BalanceAccessor(row) {
|
|||||||
return <Money amount={row.closing_balance} currency={row.currency_code} />;
|
return <Money amount={row.closing_balance} currency={row.currency_code} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note column accessor.
|
||||||
|
*/
|
||||||
|
export function NoteAccessor(row) {
|
||||||
|
return (
|
||||||
|
<If condition={row.note}>
|
||||||
|
<Tooltip
|
||||||
|
className={Classes.TOOLTIP_INDICATOR}
|
||||||
|
content={row.note}
|
||||||
|
position={Position.LEFT_TOP}
|
||||||
|
hoverOpenDelay={50}
|
||||||
|
>
|
||||||
|
<Icon icon={'file-alt'} iconSize={16} />
|
||||||
|
</Tooltip>
|
||||||
|
</If>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve customers table columns.
|
* Retrieve customers table columns.
|
||||||
*/
|
*/
|
||||||
@@ -123,12 +149,20 @@ export function useCustomersTableColumns() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'work_phone',
|
id: 'work_phone',
|
||||||
Header: intl.get('work_phone'),
|
Header: intl.get('phone_number'),
|
||||||
accessor: PhoneNumberAccessor,
|
accessor: PhoneNumberAccessor,
|
||||||
className: 'phone_number',
|
className: 'phone_number',
|
||||||
width: 100,
|
width: 100,
|
||||||
clickable: true,
|
clickable: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'note',
|
||||||
|
Header: intl.get('note'),
|
||||||
|
accessor: NoteAccessor,
|
||||||
|
disableSortBy: true,
|
||||||
|
width: 85,
|
||||||
|
clickable: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'balance',
|
id: 'balance',
|
||||||
Header: intl.get('receivable_balance'),
|
Header: intl.get('receivable_balance'),
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ function MoneyInForm({
|
|||||||
const handleFormSubmit = (values, { setSubmitting, setErrors }) => {
|
const handleFormSubmit = (values, { setSubmitting, setErrors }) => {
|
||||||
const form = {
|
const form = {
|
||||||
...omit(values, ['currency_code']),
|
...omit(values, ['currency_code']),
|
||||||
published: submitPayload.publish,
|
published: true,
|
||||||
};
|
};
|
||||||
setSubmitting(true);
|
setSubmitting(true);
|
||||||
createCashflowTransactionMutate(form)
|
createCashflowTransactionMutate(form)
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ function MoneyOutForm({
|
|||||||
const handleFormSubmit = (values, { setSubmitting, setErrors }) => {
|
const handleFormSubmit = (values, { setSubmitting, setErrors }) => {
|
||||||
const form = {
|
const form = {
|
||||||
...omit(values, ['currency_code']),
|
...omit(values, ['currency_code']),
|
||||||
published: submitPayload.publish,
|
published: true,
|
||||||
};
|
};
|
||||||
setSubmitting(true);
|
setSubmitting(true);
|
||||||
createCashflowTransactionMutate(form)
|
createCashflowTransactionMutate(form)
|
||||||
|
|||||||
@@ -11,8 +11,6 @@ import FinancialLoadingBar from '../FinancialLoadingBar';
|
|||||||
* Retrieve trial balance sheet table columns.
|
* Retrieve trial balance sheet table columns.
|
||||||
*/
|
*/
|
||||||
export const useTrialBalanceTableColumns = () => {
|
export const useTrialBalanceTableColumns = () => {
|
||||||
|
|
||||||
|
|
||||||
// Trial balance sheet context.
|
// Trial balance sheet context.
|
||||||
const {
|
const {
|
||||||
trialBalanceSheet: { tableRows },
|
trialBalanceSheet: { tableRows },
|
||||||
@@ -24,7 +22,7 @@ export const useTrialBalanceTableColumns = () => {
|
|||||||
Header: intl.get('account_name'),
|
Header: intl.get('account_name'),
|
||||||
accessor: (row) => (row.code ? `${row.name} - ${row.code}` : row.name),
|
accessor: (row) => (row.code ? `${row.name} - ${row.code}` : row.name),
|
||||||
className: 'name',
|
className: 'name',
|
||||||
width: 180,
|
width: 350,
|
||||||
textOverview: true,
|
textOverview: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -35,12 +33,14 @@ export const useTrialBalanceTableColumns = () => {
|
|||||||
width: getColumnWidth(tableRows, `credit`, {
|
width: getColumnWidth(tableRows, `credit`, {
|
||||||
minWidth: 80,
|
minWidth: 80,
|
||||||
}),
|
}),
|
||||||
|
textOverview: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Header: intl.get('debit'),
|
Header: intl.get('debit'),
|
||||||
Cell: CellTextSpan,
|
Cell: CellTextSpan,
|
||||||
accessor: 'formatted_debit',
|
accessor: 'formatted_debit',
|
||||||
width: getColumnWidth(tableRows, `debit`, { minWidth: 80 }),
|
width: getColumnWidth(tableRows, `debit`, { minWidth: 80 }),
|
||||||
|
textOverview: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Header: intl.get('balance'),
|
Header: intl.get('balance'),
|
||||||
@@ -50,6 +50,7 @@ export const useTrialBalanceTableColumns = () => {
|
|||||||
width: getColumnWidth(tableRows, `balance`, {
|
width: getColumnWidth(tableRows, `balance`, {
|
||||||
minWidth: 80,
|
minWidth: 80,
|
||||||
}),
|
}),
|
||||||
|
textOverview: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[tableRows],
|
[tableRows],
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ function GlobalErrors({
|
|||||||
if (globalErrors.access_denied) {
|
if (globalErrors.access_denied) {
|
||||||
toastKeySomethingWrong = AppToaster.show(
|
toastKeySomethingWrong = AppToaster.show(
|
||||||
{
|
{
|
||||||
message: 'You do not have permissions to access this page.',
|
message: intl.get('global_error.you_dont_have_permissions'),
|
||||||
intent: Intent.DANGER,
|
intent: Intent.DANGER,
|
||||||
onDismiss: () => {
|
onDismiss: () => {
|
||||||
globalErrorsSet({ access_denied: false });
|
globalErrorsSet({ access_denied: false });
|
||||||
@@ -53,11 +53,10 @@ function GlobalErrors({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (globalErrors.transactionsLocked) {
|
if (globalErrors.transactionsLocked) {
|
||||||
const lockedToDate =
|
|
||||||
globalErrors.transactionsLocked.formatted_locked_to_date;
|
|
||||||
|
|
||||||
AppToaster.show({
|
AppToaster.show({
|
||||||
message: `Transactions before ${lockedToDate} has been locked. Hence action cannot be performed.`,
|
message: intl.get('global_error.transactions_locked', {
|
||||||
|
lockedToDate: globalErrors.transactionsLocked.formatted_locked_to_date,
|
||||||
|
}),
|
||||||
intent: Intent.DANGER,
|
intent: Intent.DANGER,
|
||||||
onDismiss: () => {
|
onDismiss: () => {
|
||||||
globalErrorsSet({ transactionsLocked: false });
|
globalErrorsSet({ transactionsLocked: false });
|
||||||
@@ -66,7 +65,7 @@ function GlobalErrors({
|
|||||||
}
|
}
|
||||||
if (globalErrors.userInactive) {
|
if (globalErrors.userInactive) {
|
||||||
AppToaster.show({
|
AppToaster.show({
|
||||||
message: 'The authorized user is inactive.',
|
message: intl.get('global_error.authorized_user_inactive'),
|
||||||
intent: Intent.DANGER,
|
intent: Intent.DANGER,
|
||||||
onDismiss: () => {
|
onDismiss: () => {
|
||||||
globalErrorsSet({ userInactive: false });
|
globalErrorsSet({ userInactive: false });
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ function VendorFormAfterPrimarySection() {
|
|||||||
{({ field, meta: { error, touched } }) => (
|
{({ field, meta: { error, touched } }) => (
|
||||||
<InputGroup
|
<InputGroup
|
||||||
intent={inputIntent({ error, touched })}
|
intent={inputIntent({ error, touched })}
|
||||||
placeholder={intl.get('Mobile')}
|
placeholder={intl.get('mobile')}
|
||||||
{...field}
|
{...field}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ import {
|
|||||||
MenuItem,
|
MenuItem,
|
||||||
MenuDivider,
|
MenuDivider,
|
||||||
Position,
|
Position,
|
||||||
|
Tooltip,
|
||||||
Intent,
|
Intent,
|
||||||
|
Classes,
|
||||||
} from '@blueprintjs/core';
|
} from '@blueprintjs/core';
|
||||||
import intl from 'react-intl-universal';
|
import intl from 'react-intl-universal';
|
||||||
|
|
||||||
@@ -114,6 +116,24 @@ export function BalanceAccessor({ closing_balance, currency_code }) {
|
|||||||
return <Money amount={closing_balance} currency={currency_code} />;
|
return <Money amount={closing_balance} currency={currency_code} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note column accessor.
|
||||||
|
*/
|
||||||
|
export function NoteAccessor(row) {
|
||||||
|
return (
|
||||||
|
<If condition={row.note}>
|
||||||
|
<Tooltip
|
||||||
|
className={Classes.TOOLTIP_INDICATOR}
|
||||||
|
content={row.note}
|
||||||
|
position={Position.LEFT_TOP}
|
||||||
|
hoverOpenDelay={50}
|
||||||
|
>
|
||||||
|
<Icon icon={'file-alt'} iconSize={16} />
|
||||||
|
</Tooltip>
|
||||||
|
</If>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the vendors table columns.
|
* Retrieve the vendors table columns.
|
||||||
*/
|
*/
|
||||||
@@ -148,12 +168,20 @@ export function useVendorsTableColumns() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'work_phone',
|
id: 'work_phone',
|
||||||
Header: intl.get('work_phone'),
|
Header: intl.get('phone_number'),
|
||||||
accessor: PhoneNumberAccessor,
|
accessor: PhoneNumberAccessor,
|
||||||
className: 'work_phone',
|
className: 'work_phone',
|
||||||
width: 100,
|
width: 100,
|
||||||
clickable: true,
|
clickable: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'note',
|
||||||
|
Header: intl.get('note'),
|
||||||
|
accessor: NoteAccessor,
|
||||||
|
disableSortBy: true,
|
||||||
|
width: 85,
|
||||||
|
clickable: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'balance',
|
id: 'balance',
|
||||||
Header: intl.get('receivable_balance'),
|
Header: intl.get('receivable_balance'),
|
||||||
|
|||||||
@@ -78,7 +78,7 @@
|
|||||||
"new": "جديد",
|
"new": "جديد",
|
||||||
"invite_user": "دعوة مستخدم",
|
"invite_user": "دعوة مستخدم",
|
||||||
"your_access_to_your_team": "سيتلقى زميلك في الفريق رسالة بريد إلكتروني تتيح له الوصول إلى فريقك.",
|
"your_access_to_your_team": "سيتلقى زميلك في الفريق رسالة بريد إلكتروني تتيح له الوصول إلى فريقك.",
|
||||||
"invite": "التصنيف",
|
"invite": "دعوة",
|
||||||
"count": "العدد",
|
"count": "العدد",
|
||||||
"item_type": "نوع المنتج",
|
"item_type": "نوع المنتج",
|
||||||
"item_name": "اسم المنتج",
|
"item_name": "اسم المنتج",
|
||||||
@@ -1753,5 +1753,9 @@
|
|||||||
"payment_receive.drawer.title": "تفاصيل سند الزبون ({number})",
|
"payment_receive.drawer.title": "تفاصيل سند الزبون ({number})",
|
||||||
"payment_made.drawer.title": "تفاصيل سند المورد {number}",
|
"payment_made.drawer.title": "تفاصيل سند المورد {number}",
|
||||||
"manual_journal.drawer.title": "تفاصيل قيد يدوي ({number})",
|
"manual_journal.drawer.title": "تفاصيل قيد يدوي ({number})",
|
||||||
"expense.drawer.title": " تفاصيل المصروف"
|
"expense.drawer.title": " تفاصيل المصروف",
|
||||||
|
|
||||||
|
"global_error.you_dont_have_permissions": "ليس لديك صلاحية الوصول إلى هذه الصفحة.",
|
||||||
|
"global_error.transactions_locked": "تم قفل المعاملات التي تمت قبل {lockedToDate}. ومن ثم لا يمكن القيام بأي عمل.",
|
||||||
|
"global_error.authorized_user_inactive": "المستخدم المصرح له تم تعطيلة."
|
||||||
}
|
}
|
||||||
@@ -1733,5 +1733,9 @@
|
|||||||
"payment_receive.drawer.title": "Payment receive details ({number})",
|
"payment_receive.drawer.title": "Payment receive details ({number})",
|
||||||
"payment_made.drawer.title": "Payment made details {number}",
|
"payment_made.drawer.title": "Payment made details {number}",
|
||||||
"manual_journal.drawer.title": "Manual journal details ({number})",
|
"manual_journal.drawer.title": "Manual journal details ({number})",
|
||||||
"expense.drawer.title": "Expense details"
|
"expense.drawer.title": "Expense details",
|
||||||
|
|
||||||
|
"global_error.you_dont_have_permissions": "You do not have permissions to access this page.",
|
||||||
|
"global_error.transactions_locked": "Transactions before {lockedToDate} has been locked. Hence action cannot be performed.",
|
||||||
|
"global_error.authorized_user_inactive": "The authorized user is inactive."
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user