@blaze-cms/plugin-admin-core-ui 0.132.0 → 0.133.0-project-admin-customisations.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +97 -0
- package/lib/components/Header/Header.js +3 -3
- package/lib/components/Header/Header.js.map +1 -1
- package/lib/components/Layout/Background.js +26 -0
- package/lib/components/Layout/Background.js.map +1 -0
- package/lib/components/Layout/Layout.js +10 -6
- package/lib/components/Layout/Layout.js.map +1 -1
- package/lib/components/Layout/components/Grid/Grid.js +10 -86
- package/lib/components/Layout/components/Grid/Grid.js.map +1 -1
- package/lib/components/Menu/Icons/ChevronDown.js +27 -0
- package/lib/components/Menu/Icons/ChevronDown.js.map +1 -0
- package/lib/components/Menu/Icons/ChevronUp.js +27 -0
- package/lib/components/Menu/Icons/ChevronUp.js.map +1 -0
- package/lib/components/Menu/Items/MenuActionItem.js +37 -0
- package/lib/components/Menu/Items/MenuActionItem.js.map +1 -0
- package/lib/components/Menu/Items/MenuItem.js +73 -0
- package/lib/components/Menu/Items/MenuItem.js.map +1 -0
- package/lib/components/Menu/Items/MenuLinkItem.js +36 -0
- package/lib/components/Menu/Items/MenuLinkItem.js.map +1 -0
- package/lib/components/Menu/Menu.js +86 -0
- package/lib/components/Menu/Menu.js.map +1 -0
- package/lib/components/Menu/Section/MenuSection.js +28 -0
- package/lib/components/Menu/Section/MenuSection.js.map +1 -0
- package/lib/components/Menu/Section/MenuSectionCollapsible.js +91 -0
- package/lib/components/Menu/Section/MenuSectionCollapsible.js.map +1 -0
- package/lib/components/Menu/Section/MenuSectionItem.js +40 -0
- package/lib/components/Menu/Section/MenuSectionItem.js.map +1 -0
- package/lib/components/Menu/Section/MenuSectionItems.js +33 -0
- package/lib/components/Menu/Section/MenuSectionItems.js.map +1 -0
- package/lib/components/Menu/index.js +12 -0
- package/lib/components/Menu/index.js.map +1 -0
- package/lib/components/SideBar/SideBar.js +4 -19
- package/lib/components/SideBar/SideBar.js.map +1 -1
- package/lib/constants.js +1 -1
- package/lib/constants.js.map +1 -1
- package/lib/containers/Home/Home.js +1 -1
- package/lib/containers/Home/Home.js.map +1 -1
- package/lib/index.js +13 -9
- package/lib/index.js.map +1 -1
- package/lib/utils/menu-handler-singleton.js +114 -0
- package/lib/utils/menu-handler-singleton.js.map +1 -0
- package/lib-es/components/Header/Header.js +3 -3
- package/lib-es/components/Header/Header.js.map +1 -1
- package/lib-es/components/Layout/Background.js +16 -0
- package/lib-es/components/Layout/Background.js.map +1 -0
- package/lib-es/components/Layout/Layout.js +10 -6
- package/lib-es/components/Layout/Layout.js.map +1 -1
- package/lib-es/components/Layout/components/Grid/Grid.js +14 -52
- package/lib-es/components/Layout/components/Grid/Grid.js.map +1 -1
- package/lib-es/components/Menu/Icons/ChevronDown.js +16 -0
- package/lib-es/components/Menu/Icons/ChevronDown.js.map +1 -0
- package/lib-es/components/Menu/Icons/ChevronUp.js +16 -0
- package/lib-es/components/Menu/Icons/ChevronUp.js.map +1 -0
- package/lib-es/components/Menu/Items/MenuActionItem.js +31 -0
- package/lib-es/components/Menu/Items/MenuActionItem.js.map +1 -0
- package/lib-es/components/Menu/Items/MenuItem.js +64 -0
- package/lib-es/components/Menu/Items/MenuItem.js.map +1 -0
- package/lib-es/components/Menu/Items/MenuLinkItem.js +28 -0
- package/lib-es/components/Menu/Items/MenuLinkItem.js.map +1 -0
- package/lib-es/components/Menu/Menu.js +40 -0
- package/lib-es/components/Menu/Menu.js.map +1 -0
- package/lib-es/components/Menu/Section/MenuSection.js +18 -0
- package/lib-es/components/Menu/Section/MenuSection.js.map +1 -0
- package/lib-es/components/Menu/Section/MenuSectionCollapsible.js +67 -0
- package/lib-es/components/Menu/Section/MenuSectionCollapsible.js.map +1 -0
- package/lib-es/components/Menu/Section/MenuSectionItem.js +30 -0
- package/lib-es/components/Menu/Section/MenuSectionItem.js.map +1 -0
- package/lib-es/components/Menu/Section/MenuSectionItems.js +20 -0
- package/lib-es/components/Menu/Section/MenuSectionItems.js.map +1 -0
- package/lib-es/components/Menu/index.js +3 -0
- package/lib-es/components/Menu/index.js.map +1 -0
- package/lib-es/components/SideBar/SideBar.js +3 -12
- package/lib-es/components/SideBar/SideBar.js.map +1 -1
- package/lib-es/constants.js +1 -1
- package/lib-es/constants.js.map +1 -1
- package/lib-es/containers/Home/Home.js +1 -1
- package/lib-es/containers/Home/Home.js.map +1 -1
- package/lib-es/index.js +9 -9
- package/lib-es/index.js.map +1 -1
- package/lib-es/utils/menu-handler-singleton.js +55 -0
- package/lib-es/utils/menu-handler-singleton.js.map +1 -0
- package/package.json +9 -8
- package/src/components/Header/Header.js +9 -7
- package/src/components/Layout/Background.js +16 -0
- package/src/components/Layout/Layout.js +23 -8
- package/src/components/Layout/bg.svg +22 -0
- package/src/components/Layout/components/Grid/Grid.js +13 -52
- package/src/components/Menu/Icons/ChevronDown.js +16 -0
- package/src/components/Menu/Icons/ChevronUp.js +16 -0
- package/src/components/Menu/Items/MenuActionItem.js +30 -0
- package/src/components/Menu/Items/MenuItem.js +49 -0
- package/src/components/Menu/Items/MenuLinkItem.js +25 -0
- package/src/components/Menu/Menu.js +48 -0
- package/src/components/Menu/Section/MenuSection.js +16 -0
- package/src/components/Menu/Section/MenuSectionCollapsible.js +59 -0
- package/src/components/Menu/Section/MenuSectionItem.js +28 -0
- package/src/components/Menu/Section/MenuSectionItems.js +17 -0
- package/src/components/Menu/index.js +3 -0
- package/src/components/SideBar/SideBar.js +5 -9
- package/src/constants.js +3 -1
- package/src/containers/Home/Home.js +1 -1
- package/src/index.js +7 -6
- package/src/utils/menu-handler-singleton.js +64 -0
|
@@ -1,66 +1,27 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import { useApolloClient } from '@apollo/client';
|
|
4
|
-
import { getQuery, MainContextProvider } from '@blaze-cms/admin-ui-utils';
|
|
5
3
|
import SideBar from '../../../SideBar';
|
|
6
4
|
|
|
7
|
-
const Grid = ({ children, isOpenMenu, onMenuClick, userData }) =>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
data: { getMenuItems }
|
|
16
|
-
} = await client.query({ query: getQuery('GET_MENU_ITEMS') });
|
|
17
|
-
|
|
18
|
-
const parsedMenuItems = getMenuItems.map(([key, { header, items }]) => [
|
|
19
|
-
key,
|
|
20
|
-
{
|
|
21
|
-
header,
|
|
22
|
-
items: items.map(item => ({ ...item, isDisplayedPrompt: true }))
|
|
23
|
-
}
|
|
24
|
-
]);
|
|
25
|
-
|
|
26
|
-
if (!menuItems) {
|
|
27
|
-
setMenuItems(parsedMenuItems);
|
|
28
|
-
}
|
|
29
|
-
})();
|
|
30
|
-
},
|
|
31
|
-
[client, menuItems]
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
const updateItems = items => {
|
|
35
|
-
setMenuItems(items);
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
return menuItems ? (
|
|
39
|
-
<MainContextProvider value={{ menuItems, setMenuItems: items => updateItems(items) }}>
|
|
40
|
-
<div className="main-content grid grid--main-content">
|
|
41
|
-
<SideBar
|
|
42
|
-
isOpenMenu={isOpenMenu}
|
|
43
|
-
menuItems={menuItems}
|
|
44
|
-
onMenuClick={onMenuClick}
|
|
45
|
-
userData={userData}
|
|
46
|
-
/>
|
|
47
|
-
{children}
|
|
48
|
-
</div>
|
|
49
|
-
</MainContextProvider>
|
|
50
|
-
) : (
|
|
51
|
-
'loading'
|
|
52
|
-
);
|
|
53
|
-
};
|
|
5
|
+
const Grid = ({ children, isOpenMenu, onMenuClick, userData, simpleLayout }) => (
|
|
6
|
+
<div className="main-content grid grid--main-content">
|
|
7
|
+
{!simpleLayout && (
|
|
8
|
+
<SideBar isOpenMenu={isOpenMenu} onMenuClick={onMenuClick} userData={userData} />
|
|
9
|
+
)}
|
|
10
|
+
{children}
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
54
13
|
|
|
55
14
|
Grid.propTypes = {
|
|
56
15
|
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,
|
|
57
16
|
isOpenMenu: PropTypes.bool.isRequired,
|
|
58
17
|
onMenuClick: PropTypes.func.isRequired,
|
|
59
|
-
userData: PropTypes.object
|
|
18
|
+
userData: PropTypes.object,
|
|
19
|
+
simpleLayout: PropTypes.bool
|
|
60
20
|
};
|
|
61
21
|
|
|
62
22
|
Grid.defaultProps = {
|
|
63
|
-
userData: {}
|
|
23
|
+
userData: {},
|
|
24
|
+
simpleLayout: false
|
|
64
25
|
};
|
|
65
26
|
|
|
66
27
|
export default Grid;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const ChevronDown = () => (
|
|
4
|
+
<svg
|
|
5
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
6
|
+
fill="none"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
strokeWidth={1.5}
|
|
9
|
+
width="20"
|
|
10
|
+
height="20"
|
|
11
|
+
stroke="currentColor">
|
|
12
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5" />
|
|
13
|
+
</svg>
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export default ChevronDown;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const ChevronUp = () => (
|
|
4
|
+
<svg
|
|
5
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
6
|
+
fill="none"
|
|
7
|
+
viewBox="0 0 22 22"
|
|
8
|
+
strokeWidth={1.5}
|
|
9
|
+
width="20"
|
|
10
|
+
height="20"
|
|
11
|
+
stroke="currentColor">
|
|
12
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M4.5 15.75l7.5-7.5 7.5 7.5" />
|
|
13
|
+
</svg>
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export default ChevronUp;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Link } from 'react-router-dom';
|
|
3
|
+
|
|
4
|
+
const MenuActionItem = ({ item }) => {
|
|
5
|
+
const { label, icon: MenuSectionIcon, onClick, uri } = item;
|
|
6
|
+
|
|
7
|
+
const modifier = MenuSectionIcon ? '' : 'side-nav__list-link--noIcon';
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<li className="side-nav__list--item" key={item.label}>
|
|
11
|
+
<Link
|
|
12
|
+
to={uri}
|
|
13
|
+
className={`side-nav__list-link ${modifier}`}
|
|
14
|
+
onClick={() => {
|
|
15
|
+
if (onClick) {
|
|
16
|
+
onClick();
|
|
17
|
+
}
|
|
18
|
+
}}>
|
|
19
|
+
{MenuSectionIcon && (
|
|
20
|
+
<div className="side-nav__list-link--icon">
|
|
21
|
+
<MenuSectionIcon />
|
|
22
|
+
</div>
|
|
23
|
+
)}
|
|
24
|
+
<div className="side-nav__list-label">{label}</div>
|
|
25
|
+
</Link>
|
|
26
|
+
</li>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default MenuActionItem;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useLocation } from 'react-router-dom';
|
|
3
|
+
import MenuLinkItem from './MenuLinkItem';
|
|
4
|
+
|
|
5
|
+
const MenuItem = ({ item, RenderItems }) => {
|
|
6
|
+
const location = useLocation();
|
|
7
|
+
const { label, items, uri } = item;
|
|
8
|
+
|
|
9
|
+
if (label && uri) {
|
|
10
|
+
const isActive = location.pathname === uri;
|
|
11
|
+
return <MenuLinkItem item={item} isActive={isActive} root />;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (label && items && Object.values(items).length > 0) {
|
|
15
|
+
const childrenMenu = Object.keys(items).map(key => items[key]);
|
|
16
|
+
|
|
17
|
+
const childrenComponents = childrenMenu.map(child => {
|
|
18
|
+
const { label: childLabel, uri: childUri } = child;
|
|
19
|
+
const isActive = location.pathname === childUri;
|
|
20
|
+
|
|
21
|
+
if (childLabel && childUri) {
|
|
22
|
+
return <MenuLinkItem item={child} isActive={isActive} root={false} />;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return null;
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return <RenderItems item={item}>{childrenComponents}</RenderItems>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (!label && items) {
|
|
32
|
+
const childrenMenu = Object.keys(items).map(key => items[key]);
|
|
33
|
+
|
|
34
|
+
return childrenMenu.map(child => {
|
|
35
|
+
const { label: childLabel, uri: childUri } = child;
|
|
36
|
+
const isActive = location.pathname === childUri;
|
|
37
|
+
|
|
38
|
+
if (childLabel && childUri) {
|
|
39
|
+
return <MenuLinkItem item={child} isActive={isActive} root />;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return null;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return null;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export default MenuItem;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Link } from 'react-router-dom';
|
|
3
|
+
|
|
4
|
+
const MenuLinkItem = ({ item, isActive, root = true }) => {
|
|
5
|
+
const { label, icon: MenuSectionIcon, uri } = item;
|
|
6
|
+
|
|
7
|
+
const modifier = MenuSectionIcon ? '' : 'side-nav__list-link--noIcon';
|
|
8
|
+
|
|
9
|
+
const activeModifier = isActive ? 'side-nav__list-link--active' : '';
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<li className="side-nav__list--item" key={item.label}>
|
|
13
|
+
<Link to={uri} className={`side-nav__list-link ${modifier} ${activeModifier}`}>
|
|
14
|
+
{MenuSectionIcon && (
|
|
15
|
+
<div className="side-nav__list-link--icon">
|
|
16
|
+
<MenuSectionIcon />
|
|
17
|
+
</div>
|
|
18
|
+
)}
|
|
19
|
+
<div className="side-nav__list-link--label">{label}</div>
|
|
20
|
+
</Link>
|
|
21
|
+
</li>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default MenuLinkItem;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import menuHandler from '../../utils/menu-handler-singleton';
|
|
4
|
+
import MenuSection from './Section/MenuSection';
|
|
5
|
+
|
|
6
|
+
const Menu = ({ children }) => {
|
|
7
|
+
const [config, setConfig] = useState();
|
|
8
|
+
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const loadConfig = async () => {
|
|
11
|
+
await menuHandler.loadConfig();
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
loadConfig().then(() => setConfig(menuHandler.getAll()));
|
|
15
|
+
}, []);
|
|
16
|
+
|
|
17
|
+
const MenuSections = () => {
|
|
18
|
+
if (!config) return null;
|
|
19
|
+
|
|
20
|
+
return config.map(sections => {
|
|
21
|
+
if (!sections || !Array.isArray(sections) || !sections.length) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const menuSections = sections.filter(section => section.items);
|
|
26
|
+
|
|
27
|
+
return menuSections.map(menuSection => <MenuSection items={menuSection} />);
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<div className="side-nav__block">
|
|
33
|
+
<ul className="side-nav__list">
|
|
34
|
+
<MenuSections />
|
|
35
|
+
</ul>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
Menu.propTypes = {
|
|
41
|
+
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
Menu.defaultProps = {
|
|
45
|
+
children: null
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export default Menu;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import PropTypes from 'prop-types';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import MenuSectionItems from './MenuSectionItems';
|
|
4
|
+
|
|
5
|
+
const MenuSection = ({ items, children }) => <MenuSectionItems sectionItems={items} />;
|
|
6
|
+
|
|
7
|
+
MenuSection.propTypes = {
|
|
8
|
+
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
|
|
9
|
+
items: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
MenuSection.defaultProps = {
|
|
13
|
+
children: null
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default MenuSection;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import ChevronDown from '../Icons/ChevronDown';
|
|
3
|
+
import ChevronUp from '../Icons/ChevronUp';
|
|
4
|
+
|
|
5
|
+
const capitalise = s => {
|
|
6
|
+
if (typeof s !== 'string') return '';
|
|
7
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const MenuSectionCollapsible = ({ name, item, children }) => {
|
|
11
|
+
const { label, loadOpen, icon: MenuSectionIcon, items } = item;
|
|
12
|
+
const [collapsed, setCollapsed] = useState(!loadOpen);
|
|
13
|
+
|
|
14
|
+
const CollapseIcon = () => (collapsed ? <ChevronDown /> : <ChevronUp />);
|
|
15
|
+
|
|
16
|
+
const handleClick = () => {
|
|
17
|
+
setCollapsed(!collapsed);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const modifier = collapsed ? 'side-nav__list--item' : 'side-nav__list--item__selected';
|
|
21
|
+
|
|
22
|
+
const buttonModifier = collapsed ? 'side-nav__list-link' : 'side-nav__list-link--selected';
|
|
23
|
+
|
|
24
|
+
if (name) {
|
|
25
|
+
return (
|
|
26
|
+
<li className={modifier}>
|
|
27
|
+
<button type="button" className={buttonModifier} onClick={handleClick}>
|
|
28
|
+
<div className="side-nav__list-link--icon">{MenuSectionIcon && <MenuSectionIcon />}</div>
|
|
29
|
+
<div className="side-nav__list-link--wrapper">
|
|
30
|
+
<div className="side-nav__list-link--label">{capitalise(name)}</div>
|
|
31
|
+
<div className="side-nav__list-link--toggleCollapseIcon" role="button">
|
|
32
|
+
<CollapseIcon />
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</button>
|
|
36
|
+
<div className="side-nav__list-link--children">{collapsed ? null : children}</div>
|
|
37
|
+
</li>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (label && items && Object.keys(items).length > 0) {
|
|
42
|
+
return <li className={modifier}>{children}</li>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (label && items && Object.keys(items).length === 0) {
|
|
46
|
+
return (
|
|
47
|
+
<li className={modifier}>
|
|
48
|
+
<button type="button" className="side-nav__list-link" onClick={handleClick}>
|
|
49
|
+
<div className="side-nav__list-link--icon">{MenuSectionIcon && <MenuSectionIcon />}</div>
|
|
50
|
+
<div className="side-nav__list-label">{label}</div>
|
|
51
|
+
</button>
|
|
52
|
+
</li>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return null;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export default MenuSectionCollapsible;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import MenuItem from '../Items/MenuItem';
|
|
4
|
+
import MenuSectionCollapsible from './MenuSectionCollapsible';
|
|
5
|
+
|
|
6
|
+
const MenuSectionItem = ({ name, item }) => {
|
|
7
|
+
if (!item) return null;
|
|
8
|
+
|
|
9
|
+
if (item.uri) {
|
|
10
|
+
return <MenuItem item={item} RenderItems={MenuSectionCollapsible} />;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (Object.values(item.items).length === 0) return null;
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<MenuSectionCollapsible name={name} item={item}>
|
|
17
|
+
<MenuItem item={item} RenderItems={MenuSectionCollapsible} />
|
|
18
|
+
</MenuSectionCollapsible>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default MenuSectionItem;
|
|
23
|
+
|
|
24
|
+
MenuSectionItem.propTypes = {
|
|
25
|
+
name: PropTypes.string.isRequired,
|
|
26
|
+
item: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node, PropTypes.object])
|
|
27
|
+
.isRequired
|
|
28
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import MenuSectionItem from './MenuSectionItem';
|
|
4
|
+
|
|
5
|
+
const MenuSectionItems = ({ sectionItems }) => {
|
|
6
|
+
const { items } = sectionItems;
|
|
7
|
+
|
|
8
|
+
const menuSections = Object.entries(items).sort((a, b) => a[1].order - b[1].order);
|
|
9
|
+
|
|
10
|
+
return menuSections.map(menuItem => <MenuSectionItem name={menuItem[0]} item={menuItem[1]} />);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default MenuSectionItems;
|
|
14
|
+
|
|
15
|
+
MenuSectionItems.propTypes = {
|
|
16
|
+
sectionItems: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired
|
|
17
|
+
};
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Link } from 'react-router-dom';
|
|
3
2
|
import classnames from 'classnames';
|
|
4
3
|
import PropTypes from 'prop-types';
|
|
5
4
|
import { useApolloClient } from '@apollo/client';
|
|
6
5
|
import Avatar from '@blaze-react/avatar';
|
|
7
6
|
import { handleLogout } from '@blaze-cms/core-auth-ui';
|
|
8
|
-
import
|
|
7
|
+
import Menu from '../Menu';
|
|
9
8
|
|
|
10
|
-
const SideBar = ({
|
|
9
|
+
const SideBar = ({ isOpenMenu, onMenuClick, userData }) => {
|
|
11
10
|
const client = useApolloClient();
|
|
12
11
|
|
|
13
12
|
const { firstname, lastname } = userData;
|
|
@@ -31,13 +30,11 @@ const SideBar = ({ menuItems, isOpenMenu, onMenuClick, userData }) => {
|
|
|
31
30
|
onClick={onMenuClick}>
|
|
32
31
|
<i className="material-icons">keyboard_arrow_left</i>
|
|
33
32
|
</div>
|
|
34
|
-
<Link to="/" className="side-nav__block-home">
|
|
33
|
+
{/* <Link to="/" className="side-nav__block-home">
|
|
35
34
|
Dashboard
|
|
36
|
-
</Link>
|
|
35
|
+
</Link> */}
|
|
37
36
|
<div className={sideNavWrapperClassname} data-testid="sidenav" id="side-nav__wrapper">
|
|
38
|
-
|
|
39
|
-
? menuItems.map(([, data]) => <SideBlock key={data.header} {...data} />)
|
|
40
|
-
: 'Not available content types'}
|
|
37
|
+
<Menu />
|
|
41
38
|
</div>
|
|
42
39
|
<div className="side-nav__user">
|
|
43
40
|
<div className="side-nav__user--info">
|
|
@@ -63,7 +60,6 @@ const SideBar = ({ menuItems, isOpenMenu, onMenuClick, userData }) => {
|
|
|
63
60
|
};
|
|
64
61
|
|
|
65
62
|
SideBar.propTypes = {
|
|
66
|
-
menuItems: PropTypes.array.isRequired,
|
|
67
63
|
isOpenMenu: PropTypes.bool.isRequired,
|
|
68
64
|
onMenuClick: PropTypes.func.isRequired,
|
|
69
65
|
userData: PropTypes.object.isRequired
|
package/src/constants.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const PLUGIN_NAME = 'admin-core-ui';
|
|
2
|
-
const LOGO_PROPS = {
|
|
2
|
+
const LOGO_PROPS = {
|
|
3
|
+
src: process.env.BLAZE_ADMIN_HEAD_LOGO_URL || 'https://images.thisisblaze.com/logo-98-148.png'
|
|
4
|
+
};
|
|
3
5
|
|
|
4
6
|
const DEFAULT_LABEL = {
|
|
5
7
|
text: 'See more',
|
package/src/index.js
CHANGED
|
@@ -2,26 +2,27 @@ import React from 'react';
|
|
|
2
2
|
import { Layout } from './components';
|
|
3
3
|
import pkg from '../package.json';
|
|
4
4
|
import { PLUGIN_NAME } from './constants';
|
|
5
|
-
import
|
|
5
|
+
import menuHandler from './utils/menu-handler-singleton';
|
|
6
6
|
|
|
7
7
|
const Home = React.lazy(() => import(/* webpackChunkName: 'Home' */ './containers'));
|
|
8
8
|
|
|
9
|
-
async function load(app) {
|
|
9
|
+
async function load(app, options = {}) {
|
|
10
10
|
const home = {
|
|
11
11
|
path: '/',
|
|
12
12
|
exact: true,
|
|
13
13
|
key: 'home',
|
|
14
14
|
component: Home
|
|
15
15
|
};
|
|
16
|
+
|
|
16
17
|
app.addRoute(home);
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
menuHandler.setApp(app);
|
|
19
20
|
|
|
20
21
|
app.setLayout(Layout);
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
});
|
|
23
|
+
const { menuConfig = {} } = options;
|
|
24
|
+
|
|
25
|
+
app.events.once('admin:menu:config:load:after', ({ addConfig }) => addConfig(menuConfig));
|
|
25
26
|
|
|
26
27
|
return {
|
|
27
28
|
name: PLUGIN_NAME,
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import merge from 'lodash.merge';
|
|
2
|
+
|
|
3
|
+
let instance;
|
|
4
|
+
|
|
5
|
+
export class MenuHandler {
|
|
6
|
+
menuSections = new Map();
|
|
7
|
+
|
|
8
|
+
menuConfig;
|
|
9
|
+
|
|
10
|
+
app;
|
|
11
|
+
|
|
12
|
+
constructor(app) {
|
|
13
|
+
if (instance) {
|
|
14
|
+
throw new Error('You can only create one instance!');
|
|
15
|
+
}
|
|
16
|
+
instance = this;
|
|
17
|
+
this.menuConfig = {};
|
|
18
|
+
this.app = null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
setApp(app) {
|
|
22
|
+
this.app = app;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get app() {
|
|
26
|
+
return this.app;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get menuConfig() {
|
|
30
|
+
return this.menuConfig;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
addConfig(newConfig) {
|
|
34
|
+
this.menuConfig = merge(this.menuConfig, newConfig);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async loadConfig() {
|
|
38
|
+
const addConfig = newConfig => {
|
|
39
|
+
this.addConfig(newConfig);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const { menuConfig } = this;
|
|
43
|
+
|
|
44
|
+
if (this.app && this.app.events) {
|
|
45
|
+
await this.app.events.emitAsync('admin:menu:config:load', { addConfig });
|
|
46
|
+
await this.app.events.emitAsync('admin:menu:config:load:after', { addConfig, menuConfig });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
getInstance() {
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
getAll() {
|
|
55
|
+
const sortedByOrder = Object.entries(this.menuConfig).sort(
|
|
56
|
+
(a, b) => (a.order > b.order ? 1 : -1)
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
return sortedByOrder;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const menuHandler = new MenuHandler();
|
|
64
|
+
export default menuHandler;
|