diff --git a/src/components/nav/TopBar.jsx b/src/components/nav/TopBar.jsx
index 3906bc4e..5aee8c32 100644
--- a/src/components/nav/TopBar.jsx
+++ b/src/components/nav/TopBar.jsx
@@ -1,4 +1,4 @@
-import React, { useRef } from 'react';
+import React, { useRef, useEffect } from 'react';
// import PropTypes from 'prop-types';
import {
ChevronRight, User, Settings, HelpCircle, ToggleRight, Clipboard, File,
@@ -10,34 +10,48 @@ import TopBarSearch from 'components/nav/TopBarSearch';
import getBreadcrumbName from 'const/breadcrumbsNames';
import { useTranslation } from 'react-i18next';
import Notifications from 'components/nav/Notifications';
-
+import { setBreadcrumbs } from '../../store/breadcrubms/actionCreators';
+import LoadingIcon from '../LoadingIcon';
// TODO: finish this
const TopBar = () => {
const { t } = useTranslation();
const dispatch = useDispatch();
const user = useSelector((store) => store.user);
+ const breadcrumbs = useSelector((store) => store.breadcrumbs);
const { pathname } = useLocation();
- const breadcrumbsNodes = pathname.split('/')
- .filter((path) => !!path)
- .map((name, i, array) => {
- const path = `/${array.slice(0, i + 1).join('/')}/`;
- return (
-
- {getBreadcrumbName(name) || name}
-
- );
- })
- .reduce((r, el) => r.concat(
- , el,
- ), [])
- .slice(1);
+ useEffect(() => {
+ const breadcrumbsNodes = pathname.split('/')
+ .filter((path) => !!path)
+ .map((name, i, array) => {
+ const path = `/${array.slice(0, i + 1).join('/')}/`;
+ return {
+ name: getBreadcrumbName(name) || name,
+ link: path,
+ };
+ });
+ dispatch(setBreadcrumbs(breadcrumbsNodes));
+ }, [pathname]);
+
+ breadcrumbs.forEach((item) => {
+ if (!Number.isNaN(parseInt(item.name, 10))) {
+ item.name = ;
+ }
+ });
+
+ const breadcrumbsNodes = breadcrumbs.map((breadcrumb, i, array) => (
+
+ {breadcrumb.name}
+
+ )).reduce((r, el) => r.concat(
+ , el,
+ ), []).slice(1);
const userDropdownRef = useRef();
diff --git a/src/components/pages/payment/InvoicesTable.jsx b/src/components/pages/payment/InvoicesTable.jsx
index 4beaf21a..f47d302e 100644
--- a/src/components/pages/payment/InvoicesTable.jsx
+++ b/src/components/pages/payment/InvoicesTable.jsx
@@ -9,6 +9,8 @@ import { Eye, Printer } from 'react-feather';
import Button from 'components/form-components/Button';
import { BlankModal } from 'components/modals';
import UserStatusForm from 'components/pages/profile/UserStatusForm';
+import { useDispatch } from 'react-redux';
+import { changeCrumbName } from '../../../store/breadcrubms/actionCreators';
const InvoicesTable = (props) => {
const { match } = props;
@@ -17,6 +19,7 @@ const InvoicesTable = (props) => {
const [invoices, setInvoices] = useState([]);
const [subData, setSubData] = useState({});
const [selectedInvoice, setSelectedInvoice] = useState({});
+ const dispatch = useDispatch();
const customSubscriptionModalRef = useRef();
@@ -27,6 +30,8 @@ const InvoicesTable = (props) => {
Api.get(`payment/project-subscription/${subscriptionId}/`)
.then((resp) => {
setSubData(resp.data);
+ dispatch(changeCrumbName(3, resp.data.project.name));
+ dispatch(changeCrumbName(5, resp.data.subscription.name));
});
} else {
url = 'payment/invoices/';
diff --git a/src/components/pages/payment/ProjectDetail.jsx b/src/components/pages/payment/ProjectDetail.jsx
index e4cc9c17..64928734 100644
--- a/src/components/pages/payment/ProjectDetail.jsx
+++ b/src/components/pages/payment/ProjectDetail.jsx
@@ -19,11 +19,14 @@ import Form from 'components/form-components/Form';
import { p2sStatus, u2pRole, u2pStatus } from 'const/projects';
import toast from 'utils/toast';
import moment from 'moment';
+import { useDispatch } from 'react-redux';
+import { changeCrumbName } from '../../../store/breadcrubms/actionCreators';
const ProjectDetail = (props) => {
const { match, history } = props;
const projectId = match.params.id;
+ const dispatch = useDispatch();
const { t } = useTranslation();
const addUserModalRef = useRef();
const refreshTokenModalRef = useRef();
@@ -50,6 +53,7 @@ const ProjectDetail = (props) => {
Api.get(`payment/project/${projectId}/`)
.then((resp) => {
setProject(resp.data);
+ dispatch(changeCrumbName(3, resp.data.name));
});
};
diff --git a/src/store/breadcrubms/actionCreators.js b/src/store/breadcrubms/actionCreators.js
new file mode 100644
index 00000000..7780d836
--- /dev/null
+++ b/src/store/breadcrubms/actionCreators.js
@@ -0,0 +1,11 @@
+import { SET_BREADCRUBMS, CHANGE_CRUMB_NAME } from './actions';
+
+export const setBreadcrumbs = (breadcrumbs) => ({
+ type: SET_BREADCRUBMS,
+ payload: breadcrumbs,
+});
+
+export const changeCrumbName = (index, name) => ({
+ type: CHANGE_CRUMB_NAME,
+ payload: { index, name },
+});
diff --git a/src/store/breadcrubms/actions.js b/src/store/breadcrubms/actions.js
new file mode 100644
index 00000000..763a3886
--- /dev/null
+++ b/src/store/breadcrubms/actions.js
@@ -0,0 +1,2 @@
+export const SET_BREADCRUBMS = 'SET_BREADCRUBMS';
+export const CHANGE_CRUMB_NAME = 'CHANGE_CRUMB_NAME';
diff --git a/src/store/breadcrubms/breadrumbsReducer.js b/src/store/breadcrubms/breadrumbsReducer.js
new file mode 100644
index 00000000..2dccbcef
--- /dev/null
+++ b/src/store/breadcrubms/breadrumbsReducer.js
@@ -0,0 +1,18 @@
+import { SET_BREADCRUBMS, CHANGE_CRUMB_NAME } from './actions';
+
+
+const breadcrumbsReducer = (state = [], action) => {
+ switch (action.type) {
+ case SET_BREADCRUBMS:
+ return action.payload;
+
+ case CHANGE_CRUMB_NAME:
+ state[action.payload.index].name = action.payload.name;
+ return [...state];
+
+ default:
+ return state;
+ }
+};
+
+export default breadcrumbsReducer;
diff --git a/src/store/mainReducer.js b/src/store/mainReducer.js
index 8335ae4e..da1b1619 100644
--- a/src/store/mainReducer.js
+++ b/src/store/mainReducer.js
@@ -1,8 +1,10 @@
import { combineReducers } from 'redux';
import userReducer from 'store/user/reducer';
+import breadcrumbsReducer from 'store/breadcrubms/breadrumbsReducer';
const mainReducer = combineReducers({
user: userReducer,
+ breadcrumbs: breadcrumbsReducer,
});
export default mainReducer;
diff --git a/src/styles/index.scss b/src/styles/index.scss
index 8a49bb9a..246d57b1 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -114,3 +114,9 @@
margin-right: 0;
}
+.breadcrumb a {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ max-width: 7rem;
+}