Added groups

This commit is contained in:
mrfry 2020-12-21 10:59:16 +01:00
parent c09bb64b2a
commit bc776b3307
8 changed files with 94 additions and 14 deletions

View file

@ -1,11 +1,12 @@
import React from 'react' import React, { useState } from 'react'
import TodoCard from './todoCard.js' import TodoCard from './todoCard.js'
import styles from './todoBoard.module.css' import styles from './todoBoard.module.css'
export default function TodoBoard(props) { export default function TodoBoard(props) {
const { columns, cards, userId, categories, onCardClick } = props const { columns, cards, userId, categories, onCardClick, namedGroups } = props
const [selectedGroup, setSelectedGroup] = useState(null)
const clickableTypes = Object.keys(columns).reduce((acc, key) => { const clickableTypes = Object.keys(columns).reduce((acc, key) => {
const col = columns[key] const col = columns[key]
@ -15,8 +16,52 @@ export default function TodoBoard(props) {
return acc return acc
}, []) }, [])
const groups = cards.reduce((acc, card) => {
if (!acc.includes(card.group) && card.group) {
acc.push(card.group)
}
return acc
}, [])
const renderGrouper = () => {
const sg = namedGroups[selectedGroup]
return (
<>
<div className={styles.groupContainer}>
{groups.map((group) => {
const namedGroup = namedGroups[group]
return (
<div
className={`${styles.group} ${group === selectedGroup &&
styles.selectedGroup}`}
key={group}
onClick={() => {
setSelectedGroup(group)
}}
>
{namedGroup ? namedGroup.name : group}
</div>
)
})}
<div
className={styles.group}
onClick={() => {
setSelectedGroup(null)
}}
>
{'Összes'}
</div>
</div>
{sg && sg.description ? (
<div className={styles.groupDescription}>{sg.description}</div>
) : null}
</>
)
}
return ( return (
<div className={styles.tableContainer}> <div className={styles.tableContainer}>
{renderGrouper()}
<div className={styles.table}> <div className={styles.table}>
{Object.keys(columns).map((key) => { {Object.keys(columns).map((key) => {
const category = columns[key] const category = columns[key]
@ -25,7 +70,9 @@ export default function TodoBoard(props) {
<div className={styles.categoryName}>{category.name}</div> <div className={styles.categoryName}>{category.name}</div>
{cards.map((card, i) => { {cards.map((card, i) => {
if (card.state === key) { if (card.state === key) {
// TODO: determine if clickable here if (selectedGroup && card.group !== selectedGroup) {
return null
}
return ( return (
<TodoCard <TodoCard
key={i} key={i}

View file

@ -21,3 +21,25 @@
.tableCol { .tableCol {
flex: 1; flex: 1;
} }
.groupDescription {
font-size: 16px;
padding: 4px;
}
.groupContainer {
display: flex;
}
.group {
padding: 8px 16px;
cursor: pointer;
}
.group:hover {
background-color: #333;
}
.selectedGroup {
background-color: #444;
}

View file

@ -4,12 +4,15 @@ import styles from './todoCard.module.css'
export default function TodoCard(props) { export default function TodoCard(props) {
const { categories, onClick, userId } = props const { categories, onClick, userId } = props
const { name, category, points, votes, id } = props.cardData const { name, category, points, votes, id, group } = props.cardData
const voted = votes.includes(userId) const voted = votes.includes(userId)
return ( return (
<div <div
className={`${styles.card} ${voted && styles.voted}`} className={styles.card}
style={{
border: `2px solid ${group || '#99f'}`,
}}
onClick={() => { onClick={() => {
onClick(props.cardData) onClick(props.cardData)
}} }}
@ -31,7 +34,7 @@ export default function TodoCard(props) {
</span> </span>
</div> </div>
<div className={styles.numbers}> <div className={styles.numbers}>
<div> <div className={`${voted && styles.voted}`}>
<div>{`Votes: ${votes.length}`}</div> <div>{`Votes: ${votes.length}`}</div>
</div> </div>
<div>{points}</div> <div>{points}</div>

View file

@ -1,5 +1,4 @@
.card { .card {
border: 2px solid #99f;
border-radius: 2px; border-radius: 2px;
padding: 5px; padding: 5px;
margin: 6px 3px; margin: 6px 3px;
@ -7,7 +6,7 @@
} }
.voted { .voted {
border: 2px solid #cf9; color: #cf9;
} }
.card:hover { .card:hover {
@ -26,8 +25,8 @@
} }
.category { .category {
word-break: break-all;
font-size: 10px; font-size: 10px;
white-space: nowrap;
} }
.numbers { .numbers {

View file

@ -4,7 +4,7 @@ import styles from './todoRow.module.css'
export default function TodoRow(props) { export default function TodoRow(props) {
const { categories, userId, onClick } = props const { categories, userId, onClick } = props
const { name, category, votes, id } = props.rowData const { name, category, votes, id, group } = props.rowData
const voted = votes.includes(userId) const voted = votes.includes(userId)
return ( return (
@ -12,7 +12,10 @@ export default function TodoRow(props) {
onClick={() => { onClick={() => {
onClick(props.rowData) onClick(props.rowData)
}} }}
className={`${styles.row} ${voted && styles.voted}`} className={styles.row}
style={{
border: `2px solid ${group || '#99f'}`,
}}
> >
<div className={styles.id}>{`#${id}`}</div> <div className={styles.id}>{`#${id}`}</div>
<div className={styles.description}>{name}</div> <div className={styles.description}>{name}</div>
@ -30,7 +33,9 @@ export default function TodoRow(props) {
{categories[category].name} {categories[category].name}
</div> </div>
</div> </div>
<div className={styles.votes}>{`Votes: ${votes.length}`}</div> <div
className={`${styles.votes} ${voted && styles.voted}`}
>{`Votes: ${votes.length}`}</div>
</div> </div>
) )
} }

View file

@ -33,7 +33,7 @@
} }
.voted { .voted {
border: 2px solid #cf9; color: #cf9;
} }
.catName { .catName {
@ -41,6 +41,6 @@
} }
.category { .category {
word-break: break-all;
font-size: 10px; font-size: 10px;
white-space: nowrap;
} }

View file

@ -20,6 +20,7 @@ export default function Todos({ card, userId, categories, columns, voteOn }) {
color: 'white', color: 'white',
borderRadius: '2px', borderRadius: '2px',
padding: '0px 2px', padding: '0px 2px',
whiteSpace: 'nowrap',
}} }}
> >
{categories[category].name} {categories[category].name}

View file

@ -21,6 +21,7 @@ export default function Todos() {
const [categories, setCategories] = useState(null) const [categories, setCategories] = useState(null)
const [userId, setUserId] = useState(null) const [userId, setUserId] = useState(null)
const [sidebarCard, setSidebarCard] = useState(null) const [sidebarCard, setSidebarCard] = useState(null)
const [groups, setGroups] = useState(null)
useEffect(() => { useEffect(() => {
console.info('Fetching todos') console.info('Fetching todos')
@ -37,6 +38,7 @@ export default function Todos() {
const setTodos = (data) => { const setTodos = (data) => {
setCategories(data.todos.categories) setCategories(data.todos.categories)
setGroups(data.todos.groups)
setUserId(data.userId) setUserId(data.userId)
setCards(data.todos.cards) setCards(data.todos.cards)
@ -122,6 +124,7 @@ export default function Todos() {
userId={userId} userId={userId}
categories={categories} categories={categories}
onCardClick={onClick} onCardClick={onClick}
namedGroups={groups}
/> />
<TodoTable <TodoTable
tables={tables} tables={tables}