mirror of
https://github.com/Steffo99/todocolors.git
synced 2024-11-22 16:24:19 +00:00
Refactor BoardHeader
This commit is contained in:
parent
cef77aea85
commit
a280dbb6fd
2 changed files with 134 additions and 41 deletions
|
@ -27,7 +27,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.boardButtons {
|
.buttonsArea {
|
||||||
width: auto;
|
width: auto;
|
||||||
min-width: unset;
|
min-width: unset;
|
||||||
|
|
||||||
|
@ -35,34 +35,24 @@
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.boardButtonsLeft {
|
.titleArea {
|
||||||
grid-area: left;
|
|
||||||
justify-self: start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.boardButtonsRight {
|
|
||||||
grid-area: right;
|
|
||||||
justify-self: end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.boardTitle {
|
|
||||||
grid-area: title;
|
grid-area: title;
|
||||||
height: 80px;
|
height: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.boardTitle div {
|
.titleDisplay {
|
||||||
padding-top: 0.125em;
|
padding-top: 0.125em;
|
||||||
padding-right: 0.75ex;
|
padding-right: 0.75ex;
|
||||||
padding-left: 0.75ex;
|
padding-left: 0.75ex;
|
||||||
padding-bottom: calc(0.125em + 2px);
|
padding-bottom: calc(0.125em + 2px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.boardTitle input {
|
.titleInput {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.boardButtons button {
|
.buttonsArea button {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
@ -77,3 +67,13 @@
|
||||||
width: 36px;
|
width: 36px;
|
||||||
height: 36px;
|
height: 36px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.leftButtonsArea {
|
||||||
|
grid-area: left;
|
||||||
|
justify-self: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rightButtonsArea {
|
||||||
|
grid-area: right;
|
||||||
|
justify-self: end;
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import {useRouter} from "next/navigation"
|
||||||
|
import {ReactNode, useCallback} from "react"
|
||||||
import style from "./BoardHeader.module.css"
|
import style from "./BoardHeader.module.css"
|
||||||
import {useManagedBoard} from "@/app/board/[board]/BoardManager"
|
import {useManagedBoard} from "@/app/board/[board]/BoardManager"
|
||||||
import {faArrowDownWideShort, faHouse, faPencil, faTableColumns} from "@fortawesome/free-solid-svg-icons"
|
import {faArrowDownWideShort, faHouse, faPencil, faTableColumns} from "@fortawesome/free-solid-svg-icons"
|
||||||
|
@ -6,35 +8,126 @@ import cn from "classnames"
|
||||||
|
|
||||||
|
|
||||||
export function BoardHeader() {
|
export function BoardHeader() {
|
||||||
const {title, isEditingTitle, editTitle, setEditTitle, toggleEditingTitle, nextGrouper, nextSorter, websocketState} = useManagedBoard();
|
const {isEditingTitle} = useManagedBoard();
|
||||||
|
|
||||||
const isReady = websocketState === WebSocket.OPEN
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header className={style.boardHeader}>
|
<header className={style.boardHeader}>
|
||||||
<div className={cn(style.boardButtons, style.boardButtonsLeft)}>
|
<TitleArea>
|
||||||
<button title={"Home"}>
|
{isEditingTitle ? <TitleInput/> : <TitleDisplay/>}
|
||||||
<FontAwesomeIcon icon={faHouse}/>
|
</TitleArea>
|
||||||
</button>
|
<LeftButtonsArea>
|
||||||
<button className={cn({fade: !isReady})} disabled={!isReady} title={"Modifica titolo"} onClick={isReady ? toggleEditingTitle : undefined}>
|
<HomeButton/>
|
||||||
<FontAwesomeIcon icon={faPencil}/>
|
<EditTitleButton/>
|
||||||
</button>
|
</LeftButtonsArea>
|
||||||
</div>
|
<RightButtonsArea>
|
||||||
<h1 className={cn({fade: !isReady, [style.boardTitle]: true})}>
|
<CycleGroupButton/>
|
||||||
{isEditingTitle ?
|
<CycleSortButton/>
|
||||||
<input type={"text"} placeholder={"Titolo"} onChange={(e) => setEditTitle(e.target.value)} value={editTitle}/>
|
</RightButtonsArea>
|
||||||
:
|
|
||||||
<div>{title}</div>
|
|
||||||
}
|
|
||||||
</h1>
|
|
||||||
<div className={cn(style.boardButtons, style.boardButtonsRight)}>
|
|
||||||
<button title={"Cambia raggruppamento orizzontale"} onClick={nextGrouper}>
|
|
||||||
<FontAwesomeIcon icon={faTableColumns}/>
|
|
||||||
</button>
|
|
||||||
<button title={"Cambia ordinamento verticale"} onClick={nextSorter}>
|
|
||||||
<FontAwesomeIcon icon={faArrowDownWideShort}/>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</header>
|
</header>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function TitleArea({children}: {children: ReactNode}) {
|
||||||
|
return (
|
||||||
|
<h1 className={style.titleArea}>
|
||||||
|
{children}
|
||||||
|
</h1>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function TitleInput() {
|
||||||
|
const {editTitle, setEditTitle} = useManagedBoard()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<input
|
||||||
|
className={style.titleInput}
|
||||||
|
type={"text"}
|
||||||
|
placeholder={"Titolo"}
|
||||||
|
onChange={(e) => setEditTitle(e.target.value)}
|
||||||
|
value={editTitle}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function TitleDisplay() {
|
||||||
|
const {title} = useManagedBoard()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={style.titleDisplay}
|
||||||
|
>
|
||||||
|
{title}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function LeftButtonsArea({children}: {children: ReactNode}) {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={cn(style.buttonsArea, style.leftButtonsArea)}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function HomeButton() {
|
||||||
|
const router = useRouter()
|
||||||
|
const goHome = useCallback(() => router.push("/"), [router])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button title={"Pagina principale"} onClick={goHome}>
|
||||||
|
<FontAwesomeIcon icon={faHouse}/>
|
||||||
|
</button>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function EditTitleButton() {
|
||||||
|
const {websocketState, toggleEditingTitle} = useManagedBoard()
|
||||||
|
|
||||||
|
if(websocketState != WebSocket.OPEN) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button title={"Modifica titolo"} onClick={toggleEditingTitle}>
|
||||||
|
<FontAwesomeIcon icon={faPencil}/>
|
||||||
|
</button>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function RightButtonsArea({children}: {children: ReactNode}) {
|
||||||
|
return (
|
||||||
|
<div className={cn(style.buttonsArea, style.rightButtonsArea)}>
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function CycleGroupButton() {
|
||||||
|
const {websocketState, nextGrouper} = useManagedBoard()
|
||||||
|
|
||||||
|
if(websocketState != WebSocket.OPEN) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button title={"Cambia raggruppamento"} onClick={nextGrouper}>
|
||||||
|
<FontAwesomeIcon icon={faTableColumns}/>
|
||||||
|
</button>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function CycleSortButton() {
|
||||||
|
const {websocketState, nextSorter} = useManagedBoard()
|
||||||
|
|
||||||
|
if(websocketState != WebSocket.OPEN) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button title={"Cambia ordinamento"} onClick={nextSorter}>
|
||||||
|
<FontAwesomeIcon icon={faArrowDownWideShort}/>
|
||||||
|
</button>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue