2022-08-26 09:34:15 +02:00
|
|
|
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'
|
2022-08-26 09:34:15 +02:00
|
|
|
import { useState } from 'preact/hooks'
|
2022-09-03 21:35:36 +02:00
|
|
|
import { GRID_H_SNAP, GRID_WIDTH } from '../../constants'
|
2022-08-26 09:34:15 +02:00
|
|
|
import { useDashboardContext } from '../../contexts/DashboardContext'
|
|
|
|
|
import { DashboardFilters } from './components/DashboardFilters'
|
2022-09-04 10:53:47 +02:00
|
|
|
import { DashboardHeaderFilterToggle } from './components/DashboardHeaderFilterToggle'
|
2022-09-01 08:12:46 +02:00
|
|
|
import { DashboardSwitch } from './components/DashboardSwitch'
|
2022-08-26 09:34:15 +02:00
|
|
|
|
2022-09-03 21:35:36 +02:00
|
|
|
export const DashboardHeader = () => {
|
|
|
|
|
const { verticalMode, boxes, setBoxes, setFilter } = useDashboardContext()
|
2022-08-26 09:34:15 +02:00
|
|
|
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])
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-26 09:34:15 +02:00
|
|
|
return (
|
2022-09-03 22:05:27 +02:00
|
|
|
<div className={cn('dashboard-head', verticalMode && 'vertical')}>
|
2022-08-26 09:34:15 +02:00
|
|
|
{verticalMode && (
|
|
|
|
|
<>
|
2022-09-03 21:35:36 +02:00
|
|
|
<button className="icon" onClick={handleNewBox}>
|
2022-08-26 09:34:15 +02:00
|
|
|
<PlusIcon />
|
|
|
|
|
</button>
|
2022-09-03 21:35:36 +02:00
|
|
|
<button className="icon" onClick={handleRefresh}>
|
2022-08-26 09:34:15 +02:00
|
|
|
<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>
|
2022-08-26 09:34:15 +02:00
|
|
|
)}
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
{!verticalMode && (
|
|
|
|
|
<>
|
2022-09-01 08:12:46 +02:00
|
|
|
<DashboardSwitch />
|
2022-09-03 21:35:36 +02:00
|
|
|
<button onClick={handleNewBox}>Add box</button>
|
2022-09-04 10:53:47 +02:00
|
|
|
<DashboardHeaderFilterToggle />
|
2022-09-03 21:35:36 +02:00
|
|
|
<button onClick={handleRefresh}>
|
2022-08-26 09:34:15 +02:00
|
|
|
<RefreshIcon /> Refresh all
|
|
|
|
|
</button>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
}
|