mirror of
https://gitlab.com/MrFry/qmining-page
synced 2025-04-01 20:23:44 +02:00
Grouping: added uncategorized
This commit is contained in:
parent
bc776b3307
commit
68c5ca8166
4 changed files with 98 additions and 87 deletions
|
@ -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>
|
||||||
)
|
)
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue