Grouping: added uncategorized

This commit is contained in:
mrfry 2020-12-21 13:20:35 +01:00
parent bc776b3307
commit 68c5ca8166
4 changed files with 98 additions and 87 deletions

View file

@ -1,12 +1,18 @@
import React, { useState } from 'react' import React 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, namedGroups } = props const {
const [selectedGroup, setSelectedGroup] = useState(null) columns,
cards,
userId,
categories,
onCardClick,
selectedGroup,
} = props
const clickableTypes = Object.keys(columns).reduce((acc, key) => { const clickableTypes = Object.keys(columns).reduce((acc, key) => {
const col = columns[key] const col = columns[key]
@ -16,52 +22,8 @@ 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]
@ -69,23 +31,27 @@ export default function TodoBoard(props) {
<div className={styles.tableCol} key={key}> <div className={styles.tableCol} key={key}>
<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) { const shouldHide =
if (selectedGroup && card.group !== selectedGroup) { card.state !== key ||
return null (selectedGroup !== null &&
} selectedGroup !== 'uncat' &&
return ( card.group !== selectedGroup) ||
<TodoCard (selectedGroup === 'uncat' && card.group !== undefined)
key={i}
cardData={card} if (shouldHide) {
userId={userId}
categories={categories}
onClick={onCardClick}
clickable={clickableTypes.includes(key)}
/>
)
} else {
return null return null
} }
return (
<TodoCard
key={i}
cardData={card}
userId={userId}
categories={categories}
onClick={onCardClick}
clickable={clickableTypes.includes(key)}
/>
)
})} })}
</div> </div>
) )

View file

@ -21,25 +21,3 @@
.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

@ -5,7 +5,7 @@ import TodoRow from './todoRow.js'
import styles from './todoTable.module.css' import styles from './todoTable.module.css'
export default function TodoBoard(props) { export default function TodoBoard(props) {
const { tables, cards, userId, categories, onClick } = props const { tables, cards, userId, categories, onClick, selectedGroup } = props
return ( return (
<div className={styles.tableContainer}> <div className={styles.tableContainer}>
@ -21,6 +21,17 @@ export default function TodoBoard(props) {
<div className={styles.container} key={key}> <div className={styles.container} key={key}>
<div className={styles.title}>{table.name}</div> <div className={styles.title}>{table.name}</div>
{tableCards.map((card, i) => { {tableCards.map((card, i) => {
const shouldHide =
card.state !== key ||
(selectedGroup !== null &&
selectedGroup !== 'uncat' &&
card.group !== selectedGroup) ||
(selectedGroup === 'uncat' && card.group !== undefined)
if (shouldHide) {
return null
}
return ( return (
<TodoRow <TodoRow
onClick={onClick} onClick={onClick}

View file

@ -7,6 +7,7 @@ import TodoSidebar from './todoSidebar.js'
import Sidebar from '../sidebar.js' import Sidebar from '../sidebar.js'
import styles from './todo.module.css'
// import styles from './todos.module.css' // import styles from './todos.module.css'
import constants from '../../constants.json' import constants from '../../constants.json'
@ -21,7 +22,8 @@ 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) const [namedGroups, setGroups] = useState(null)
const [selectedGroup, setSelectedGroup] = useState(null)
useEffect(() => { useEffect(() => {
console.info('Fetching todos') console.info('Fetching todos')
@ -83,6 +85,58 @@ export default function Todos() {
} }
}) })
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} ${'uncat' === selectedGroup &&
styles.selectedGroup}`}
onClick={() => {
setSelectedGroup('uncat')
}}
>
{'Kategorizálatlan'}
</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> <div>
{sidebarCard && ( {sidebarCard && (
@ -112,6 +166,7 @@ export default function Todos() {
/> />
</Sidebar> </Sidebar>
)} )}
{renderGrouper()}
<div <div
style={{ style={{
// width: '100%', // width: '100%',
@ -124,7 +179,7 @@ export default function Todos() {
userId={userId} userId={userId}
categories={categories} categories={categories}
onCardClick={onClick} onCardClick={onClick}
namedGroups={groups} selectedGroup={selectedGroup}
/> />
<TodoTable <TodoTable
tables={tables} tables={tables}
@ -132,6 +187,7 @@ export default function Todos() {
userId={userId} userId={userId}
categories={categories} categories={categories}
onClick={onClick} onClick={onClick}
selectedGroup={selectedGroup}
/> />
</div> </div>
</div> </div>