mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-22 07:40:32 +00:00
fix: menu item nested text.
This commit is contained in:
@@ -1,9 +1,10 @@
|
|||||||
import React, { useCallback, useState, useEffect, useMemo } from 'react';
|
import React, { useCallback, useState, useEffect, useMemo } from 'react';
|
||||||
import { MenuItem, Button } from '@blueprintjs/core';
|
import { MenuItem, Button } from '@blueprintjs/core';
|
||||||
import { Select } from '@blueprintjs/select';
|
import { Select } from '@blueprintjs/select';
|
||||||
import { FormattedMessage as T } from 'components';
|
import { MenuItemNestedText, FormattedMessage as T } from 'components';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { filterAccountsByQuery } from './utils';
|
import { filterAccountsByQuery } from './utils';
|
||||||
|
import { nestedArrayToflatten } from 'utils';
|
||||||
import { CLASSES } from 'common/classes';
|
import { CLASSES } from 'common/classes';
|
||||||
|
|
||||||
export default function AccountsSelectList({
|
export default function AccountsSelectList({
|
||||||
@@ -22,9 +23,14 @@ export default function AccountsSelectList({
|
|||||||
|
|
||||||
buttonProps = {},
|
buttonProps = {},
|
||||||
}) {
|
}) {
|
||||||
|
const flattenAccounts = useMemo(
|
||||||
|
() => nestedArrayToflatten(accounts),
|
||||||
|
[accounts],
|
||||||
|
);
|
||||||
|
|
||||||
// Filters accounts based on filter props.
|
// Filters accounts based on filter props.
|
||||||
const filteredAccounts = useMemo(() => {
|
const filteredAccounts = useMemo(() => {
|
||||||
let filteredAccounts = filterAccountsByQuery(accounts, {
|
let filteredAccounts = filterAccountsByQuery(flattenAccounts, {
|
||||||
filterByRootTypes,
|
filterByRootTypes,
|
||||||
filterByParentTypes,
|
filterByParentTypes,
|
||||||
filterByTypes,
|
filterByTypes,
|
||||||
@@ -32,7 +38,7 @@ export default function AccountsSelectList({
|
|||||||
});
|
});
|
||||||
return filteredAccounts;
|
return filteredAccounts;
|
||||||
}, [
|
}, [
|
||||||
accounts,
|
flattenAccounts,
|
||||||
filterByRootTypes,
|
filterByRootTypes,
|
||||||
filterByParentTypes,
|
filterByParentTypes,
|
||||||
filterByTypes,
|
filterByTypes,
|
||||||
@@ -62,7 +68,7 @@ export default function AccountsSelectList({
|
|||||||
const accountItem = useCallback((item, { handleClick, modifiers, query }) => {
|
const accountItem = useCallback((item, { handleClick, modifiers, query }) => {
|
||||||
return (
|
return (
|
||||||
<MenuItem
|
<MenuItem
|
||||||
text={item.htmlName || item.name}
|
text={<MenuItemNestedText level={item.level} text={item.name} />}
|
||||||
label={item.code}
|
label={item.code}
|
||||||
key={item.id}
|
key={item.id}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
|
|||||||
@@ -6,8 +6,9 @@ import intl from 'react-intl-universal';
|
|||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { CLASSES } from 'common/classes';
|
import { CLASSES } from 'common/classes';
|
||||||
|
|
||||||
import { FormattedMessage as T } from 'components';
|
import { MenuItemNestedText, FormattedMessage as T } from 'components';
|
||||||
import { filterAccountsByQuery } from './utils';
|
import { filterAccountsByQuery } from './utils';
|
||||||
|
import { nestedArrayToflatten } from 'utils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accounts suggest field.
|
* Accounts suggest field.
|
||||||
@@ -27,9 +28,14 @@ export default function AccountsSuggestField({
|
|||||||
|
|
||||||
...suggestProps
|
...suggestProps
|
||||||
}) {
|
}) {
|
||||||
|
const flattenAccounts = useMemo(
|
||||||
|
() => nestedArrayToflatten(accounts),
|
||||||
|
[accounts],
|
||||||
|
);
|
||||||
|
|
||||||
// Filters accounts based on filter props.
|
// Filters accounts based on filter props.
|
||||||
const filteredAccounts = useMemo(() => {
|
const filteredAccounts = useMemo(() => {
|
||||||
let filteredAccounts = filterAccountsByQuery(accounts, {
|
let filteredAccounts = filterAccountsByQuery(flattenAccounts, {
|
||||||
filterByRootTypes,
|
filterByRootTypes,
|
||||||
filterByParentTypes,
|
filterByParentTypes,
|
||||||
filterByTypes,
|
filterByTypes,
|
||||||
@@ -37,7 +43,7 @@ export default function AccountsSuggestField({
|
|||||||
});
|
});
|
||||||
return filteredAccounts;
|
return filteredAccounts;
|
||||||
}, [
|
}, [
|
||||||
accounts,
|
flattenAccounts,
|
||||||
filterByRootTypes,
|
filterByRootTypes,
|
||||||
filterByParentTypes,
|
filterByParentTypes,
|
||||||
filterByTypes,
|
filterByTypes,
|
||||||
@@ -84,7 +90,7 @@ export default function AccountsSuggestField({
|
|||||||
const accountItem = useCallback((item, { handleClick, modifiers, query }) => {
|
const accountItem = useCallback((item, { handleClick, modifiers, query }) => {
|
||||||
return (
|
return (
|
||||||
<MenuItem
|
<MenuItem
|
||||||
text={item.htmlName || item.name}
|
text={<MenuItemNestedText level={item.level} text={item.name} />}
|
||||||
label={item.code}
|
label={item.code}
|
||||||
key={item.id}
|
key={item.id}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
|
|||||||
16
client/src/components/Menu/index.js
Normal file
16
client/src/components/Menu/index.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Menu item nested text.
|
||||||
|
*/
|
||||||
|
export function MenuItemNestedText({ level, text }) {
|
||||||
|
const whitespaces = [...Array(level - 1)].map((e, i) => (
|
||||||
|
<span key={i} className={'menu-item-space'}></span>
|
||||||
|
));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{whitespaces} {text}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -61,6 +61,8 @@ import Card from './Card';
|
|||||||
|
|
||||||
import { ItemsMultiSelect } from './Items';
|
import { ItemsMultiSelect } from './Items';
|
||||||
|
|
||||||
|
export * from './Menu';
|
||||||
|
|
||||||
const Hint = FieldHint;
|
const Hint = FieldHint;
|
||||||
|
|
||||||
const T = FormattedMessage;
|
const T = FormattedMessage;
|
||||||
|
|||||||
@@ -172,13 +172,13 @@ function AccountFormDialogFields({
|
|||||||
|
|
||||||
<div className={Classes.DIALOG_FOOTER}>
|
<div className={Classes.DIALOG_FOOTER}>
|
||||||
<div className={Classes.DIALOG_FOOTER_ACTIONS}>
|
<div className={Classes.DIALOG_FOOTER_ACTIONS}>
|
||||||
<Button onClick={onClose} style={{ minWidth: '75px' }}>
|
<Button disabled={isSubmitting} onClick={onClose} style={{ minWidth: '75px' }}>
|
||||||
<T id={'close'} />
|
<T id={'close'} />
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
intent={Intent.PRIMARY}
|
intent={Intent.PRIMARY}
|
||||||
disabled={isSubmitting}
|
loading={isSubmitting}
|
||||||
style={{ minWidth: '75px' }}
|
style={{ minWidth: '75px' }}
|
||||||
type="submit"
|
type="submit"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
@import 'components/Tooltip';
|
@import 'components/Tooltip';
|
||||||
@import 'components/Postbox';
|
@import 'components/Postbox';
|
||||||
@import 'components/Overlay';
|
@import 'components/Overlay';
|
||||||
|
@import 'components/Menu';
|
||||||
@import 'components/SidebarOverlay';
|
@import 'components/SidebarOverlay';
|
||||||
|
|
||||||
// Pages
|
// Pages
|
||||||
|
|||||||
7
client/src/style/components/Menu.scss
Normal file
7
client/src/style/components/Menu.scss
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.bp3-menu-item {
|
||||||
|
|
||||||
|
.menu-item-space {
|
||||||
|
width: 6px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -672,7 +672,6 @@ export const defaultFastFieldShouldUpdate = (props, prevProps) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export const ensureEntriesHasEmptyLine = R.curry(
|
export const ensureEntriesHasEmptyLine = R.curry(
|
||||||
(minLinesNumber, defaultEntry, entries) => {
|
(minLinesNumber, defaultEntry, entries) => {
|
||||||
if (entries.length >= minLinesNumber) {
|
if (entries.length >= minLinesNumber) {
|
||||||
@@ -683,5 +682,34 @@ export const ensureEntriesHasEmptyLine = R.curry(
|
|||||||
);
|
);
|
||||||
|
|
||||||
export const transfromViewsToTabs = (views) => {
|
export const transfromViewsToTabs = (views) => {
|
||||||
return views.map(view => ({ ..._.pick(view, ['slug', 'name']) }))
|
return views.map((view) => ({ ..._.pick(view, ['slug', 'name']) }));
|
||||||
|
};
|
||||||
|
|
||||||
|
export function nestedArrayToflatten(
|
||||||
|
collection,
|
||||||
|
property = 'children',
|
||||||
|
parseItem = (a, level) => a,
|
||||||
|
level = 1,
|
||||||
|
) {
|
||||||
|
const parseObject = (obj) => parseItem({
|
||||||
|
..._.omit(obj, [property]),
|
||||||
|
level,
|
||||||
|
}, level);
|
||||||
|
|
||||||
|
return collection.reduce((items, currentValue, index) => {
|
||||||
|
let localItems = [...items];
|
||||||
|
const parsedItem = parseObject(currentValue, level);
|
||||||
|
localItems.push(parsedItem);
|
||||||
|
|
||||||
|
if (Array.isArray(currentValue[property])) {
|
||||||
|
const flattenArray = nestedArrayToflatten(
|
||||||
|
currentValue[property],
|
||||||
|
property,
|
||||||
|
parseItem,
|
||||||
|
level + 1,
|
||||||
|
);
|
||||||
|
localItems = _.concat(localItems, flattenArray);
|
||||||
|
}
|
||||||
|
return localItems;
|
||||||
|
}, []);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user