graphicek/client/src/pages/dashboard/components/DashboardHeader/DashboardHeader.tsx

99 lines
2.4 KiB
TypeScript
Raw Normal View History

import { CancelIcon, FiltersIcon, PlusIcon, RefreshIcon } from '@/icons'
2022-09-03 22:05:27 +02:00
import { cn } from '@/utils/cn'
2022-09-03 21:35:36 +02:00
import { intervalToRange } from '@/utils/intervalToRange'
import { useState } from 'preact/hooks'
2022-09-03 21:35:36 +02:00
import { GRID_H_SNAP, GRID_WIDTH } from '../../constants'
import { useDashboardContext } from '../../contexts/DashboardContext'
import { DashboardFilters } from './components/DashboardFilters'
import { DashboardHeaderFilterToggle } from './components/DashboardHeaderFilterToggle'
import { DashboardSwitch } from './components/DashboardSwitch'
2022-09-03 21:35:36 +02:00
export const DashboardHeader = () => {
const { verticalMode, boxes, setBoxes, setFilter } = useDashboardContext()
const [filtersShown, setFiltersShown] = useState(false)
2022-09-03 21:35:36 +02:00
const handleRefresh = () => {
// @TODO: This is duplicate code, unify it somehow with dashboard filters
setFilter((v) => {
const range = intervalToRange(v.interval, v.customFrom, v.customTo)
return {
...v,
customFrom: range[0],
customTo: range[1],
}
})
}
const handleNewBox = () => {
const box = {
id: new Date().getTime().toString(),
x: 0,
y: 0,
w: GRID_WIDTH,
h: GRID_H_SNAP * 20,
}
const otherBoxes = boxes.map((b) => {
b.y += 200
return b
})
setBoxes(() => [box, ...otherBoxes])
}
return (
2022-09-03 22:05:27 +02:00
<div className={cn('dashboard-head', verticalMode && 'vertical')}>
{verticalMode && (
<>
2022-09-03 21:35:36 +02:00
<button className="icon" onClick={handleNewBox}>
<PlusIcon />
</button>
2022-09-03 21:35:36 +02:00
<button className="icon" onClick={handleRefresh}>
<RefreshIcon />
</button>
<div className="filter-button" onClick={() => setFiltersShown(true)}>
<FiltersIcon />
</div>
2024-03-28 15:58:28 +01:00
<div
className="filters-panel"
style={{ right: !filtersShown ? '-20rem' : '0' }}
>
<div className="shadow" />
<div className="inner">
2022-09-03 22:05:27 +02:00
<div
2024-03-28 15:58:28 +01:00
className="filter-close"
2022-09-03 22:05:27 +02:00
onClick={() => setFiltersShown(false)}
2024-03-28 15:58:28 +01:00
>
<CancelIcon />
</div>
<DashboardSwitch />
<DashboardFilters onClose={() => setFiltersShown(false)} />
</div>
</div>
{filtersShown && (
<div
className="menu-overlay"
onClick={() => setFiltersShown(false)}
></div>
)}
</>
)}
{!verticalMode && (
<>
<DashboardSwitch />
2022-09-03 21:35:36 +02:00
<button onClick={handleNewBox}>Add box</button>
<DashboardHeaderFilterToggle />
2022-09-03 21:35:36 +02:00
<button onClick={handleRefresh}>
<RefreshIcon /> Refresh all
</button>
</>
)}
</div>
)
}