diff --git a/frontend/app/components/Dashboard/NewDashboard.tsx b/frontend/app/components/Dashboard/NewDashboard.tsx index 252e8bc53..11b2313e5 100644 --- a/frontend/app/components/Dashboard/NewDashboard.tsx +++ b/frontend/app/components/Dashboard/NewDashboard.tsx @@ -1,11 +1,12 @@ import React, { useEffect } from 'react'; import { Switch, Route, Redirect } from 'react-router'; import withPageTitle from 'HOCs/withPageTitle'; -import { observer } from "mobx-react-lite"; +import { observer, useObserver } from "mobx-react-lite"; import { withDashboardStore } from './store/store'; import { withRouter } from 'react-router-dom'; import DashboardView from './components/DashboardView'; import { dashboardSelected, dashboardMetric, withSiteId } from 'App/routes'; +import DashboardSideMenu from './components/DashboardSideMenu'; function NewDashboard(props) { const { store, match: { params: { siteId, dashboardId, metricId } } } = props; @@ -20,10 +21,10 @@ function NewDashboard(props) { } }, [dashboardId]); - return ( + return useObserver(() => (
- MENU +
@@ -37,9 +38,9 @@ function NewDashboard(props) {
- ); + )); } export default withPageTitle('New Dashboard')( - withRouter(withDashboardStore(observer(NewDashboard))) + withRouter(withDashboardStore(NewDashboard)) ); \ No newline at end of file diff --git a/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx b/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx new file mode 100644 index 000000000..850423c66 --- /dev/null +++ b/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx @@ -0,0 +1,48 @@ +import { useObserver } from 'mobx-react-lite'; +import React from 'react'; +import { SideMenuitem, SideMenuHeader } from 'UI'; +import { withDashboardStore } from '../../store/store'; + +function DashboardSideMenu(props) { + const { store } = props; + const { selectedDashboard } = store; + + const onItemClick = (dashboard) => { + store.selectDashboardById(dashboard.dashboardId); + }; + + return useObserver(() => ( +
+ + {store.dashboards.map(item => ( + onItemClick(item)} + /> + ))} +
+
+ setShowAlerts(true)} + /> +
+
+
+ setShowAlerts(true)} + /> +
+
+ )); +} + +export default withDashboardStore(DashboardSideMenu); \ No newline at end of file diff --git a/frontend/app/components/Dashboard/components/DashboardSideMenu/index.ts b/frontend/app/components/Dashboard/components/DashboardSideMenu/index.ts new file mode 100644 index 000000000..7d83f5bed --- /dev/null +++ b/frontend/app/components/Dashboard/components/DashboardSideMenu/index.ts @@ -0,0 +1 @@ +export { default } from './DashboardSideMenu'; \ No newline at end of file diff --git a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx index 850726789..ce56053d8 100644 --- a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx +++ b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx @@ -2,19 +2,23 @@ import React from 'react'; import WidgetWrapper from '../../WidgetWrapper'; import { observer } from 'mobx-react-lite'; import { withDashboardStore } from '../../store/store'; +import { Button, PageTitle } from 'UI'; function DashboardView(props) { const { store } = props; const dashboard = store.selectedDashboard const list = dashboard?.widgets; - return dashboard ? ( + return (
- test {dashboard.dashboardId} +
+ + +
{list && list.map(item => )}
- ) :

Loading...

; + ) } export default withDashboardStore(observer(DashboardView)); \ No newline at end of file diff --git a/frontend/app/components/Dashboard/store/dashboardStore.ts b/frontend/app/components/Dashboard/store/dashboardStore.ts index 1227b5611..0fc775e1e 100644 --- a/frontend/app/components/Dashboard/store/dashboardStore.ts +++ b/frontend/app/components/Dashboard/store/dashboardStore.ts @@ -5,7 +5,7 @@ import Widget from "./widget"; export default class DashboardStore { dashboards: Dashboard[] = [] - selectedDashboard: Dashboard | null = null + selectedDashboard: Dashboard | null = new Dashboard() isLoading: boolean = false siteId: any = null @@ -194,10 +194,14 @@ export default class DashboardStore { selectDefaultDashboard = () => { const pinnedDashboard = this.dashboards.find(d => d.isPinned) - if (pinnedDashboard) { - this.selectedDashboard = pinnedDashboard + if (this.dashboards.length > 0) { + if (pinnedDashboard) { + this.selectedDashboard = pinnedDashboard + } else { + this.selectedDashboard = this.dashboards[0] + } } else { - this.selectedDashboard = this.dashboards[0] + this.selectedDashboard = new Dashboard() } } } @@ -228,6 +232,4 @@ const sampleDashboards = [ getRandomDashboard(), getRandomDashboard(), getRandomDashboard(), - getRandomDashboard(), - getRandomDashboard(), ] \ No newline at end of file diff --git a/frontend/app/components/ui/PageTitle/PageTitle.tsx b/frontend/app/components/ui/PageTitle/PageTitle.tsx new file mode 100644 index 000000000..6ee102c0d --- /dev/null +++ b/frontend/app/components/ui/PageTitle/PageTitle.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import cn from 'classnames'; + +function PageTitle({ title, className = '' }) { + return ( +

+ {title} +

+ ); +} + +export default PageTitle; \ No newline at end of file diff --git a/frontend/app/components/ui/PageTitle/index.ts b/frontend/app/components/ui/PageTitle/index.ts new file mode 100644 index 000000000..6c6e0d2c8 --- /dev/null +++ b/frontend/app/components/ui/PageTitle/index.ts @@ -0,0 +1 @@ +export { default } from './PageTitle'; \ No newline at end of file diff --git a/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx b/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx new file mode 100644 index 000000000..2a5ccd6fa --- /dev/null +++ b/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import cn from 'classnames'; +import stl from './sideMenuHeader.css'; + +function SideMenuHeader(props) { + const { text, className } = props; + return ( +
+ { text } +
+ ) +} + +export default SideMenuHeader; \ No newline at end of file diff --git a/frontend/app/components/ui/SideMenuHeader/index.ts b/frontend/app/components/ui/SideMenuHeader/index.ts new file mode 100644 index 000000000..b61e683de --- /dev/null +++ b/frontend/app/components/ui/SideMenuHeader/index.ts @@ -0,0 +1 @@ +export { default } from './SideMenuHeader'; \ No newline at end of file diff --git a/frontend/app/components/ui/SideMenuHeader/sideMenuHeader.css b/frontend/app/components/ui/SideMenuHeader/sideMenuHeader.css new file mode 100644 index 000000000..5dce4e250 --- /dev/null +++ b/frontend/app/components/ui/SideMenuHeader/sideMenuHeader.css @@ -0,0 +1,4 @@ +.label { + letter-spacing: 0.2em; + color: gray; +} \ No newline at end of file diff --git a/frontend/app/components/ui/SideMenuitem/SideMenuitem.js b/frontend/app/components/ui/SideMenuitem/SideMenuitem.js index f1649934b..978e02fbd 100644 --- a/frontend/app/components/ui/SideMenuitem/SideMenuitem.js +++ b/frontend/app/components/ui/SideMenuitem/SideMenuitem.js @@ -3,7 +3,7 @@ import { Icon, Popup } from 'UI'; import cn from 'classnames'; import stl from './sideMenuItem.css'; -function SideMenuitem({ iconBg = false, iconColor = "gray-dark", iconSize = 18, className, iconName = 'info', title, active = false, disabled = false, onClick, deleteHandler, ...props }) { +function SideMenuitem({ iconBg = false, iconColor = "gray-dark", iconSize = 18, className, iconName = null, title, active = false, disabled = false, onClick, deleteHandler, ...props }) { return (
-
-
- -
+ { iconName && ( +
+
+ +
+ )} { title }
{deleteHandler && diff --git a/frontend/app/components/ui/SideMenuitem/sideMenuItem.css b/frontend/app/components/ui/SideMenuitem/sideMenuItem.css index 6b7d0743e..f666a1477 100644 --- a/frontend/app/components/ui/SideMenuitem/sideMenuItem.css +++ b/frontend/app/components/ui/SideMenuitem/sideMenuItem.css @@ -28,7 +28,6 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - margin-left: 10px; margin-top: 1px; } diff --git a/frontend/app/components/ui/index.js b/frontend/app/components/ui/index.js index 1e0088720..d770c5aa1 100644 --- a/frontend/app/components/ui/index.js +++ b/frontend/app/components/ui/index.js @@ -55,5 +55,7 @@ export { default as HighlightCode } from './HighlightCode'; export { default as NoPermission } from './NoPermission'; export { default as NoSessionPermission } from './NoSessionPermission'; export { default as HelpText } from './HelpText'; +export { default as SideMenuHeader } from './SideMenuHeader'; +export { default as PageTitle } from './PageTitle'; export { Input, Modal, Form, Message, Card } from 'semantic-ui-react'; diff --git a/frontend/app/svg/icons/bar-chart-line.svg b/frontend/app/svg/icons/bar-chart-line.svg new file mode 100644 index 000000000..e3f0cf255 --- /dev/null +++ b/frontend/app/svg/icons/bar-chart-line.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file