mirror of
https://gitlab.com/MrFry/qmining-page
synced 2025-04-01 20:23:44 +02:00
Merge branch 'master' into multiple_dbs
This commit is contained in:
commit
91e4e24ff7
9 changed files with 139 additions and 26 deletions
22
src/components/todoStuff/todo.module.css
Normal file
22
src/components/todoStuff/todo.module.css
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
.groupDescription {
|
||||||
|
font-size: 16px;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.groupContainer {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group {
|
||||||
|
padding: 8px 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group:hover {
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selectedGroup {
|
||||||
|
background-color: #444;
|
||||||
|
}
|
|
@ -5,7 +5,14 @@ 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,
|
||||||
|
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]
|
||||||
|
@ -24,8 +31,17 @@ 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 =
|
||||||
// TODO: determine if clickable here
|
card.state !== key ||
|
||||||
|
(selectedGroup !== null &&
|
||||||
|
selectedGroup !== 'uncat' &&
|
||||||
|
card.group !== selectedGroup) ||
|
||||||
|
(selectedGroup === 'uncat' && card.group !== undefined)
|
||||||
|
|
||||||
|
if (shouldHide) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TodoCard
|
<TodoCard
|
||||||
key={i}
|
key={i}
|
||||||
|
@ -36,9 +52,6 @@ export default function TodoBoard(props) {
|
||||||
clickable={clickableTypes.includes(key)}
|
clickable={clickableTypes.includes(key)}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
} else {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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,6 +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 [namedGroups, setGroups] = useState(null)
|
||||||
|
const [selectedGroup, setSelectedGroup] = useState(null)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.info('Fetching todos')
|
console.info('Fetching todos')
|
||||||
|
@ -37,6 +40,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)
|
||||||
|
@ -81,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 && (
|
||||||
|
@ -110,6 +166,7 @@ export default function Todos() {
|
||||||
/>
|
/>
|
||||||
</Sidebar>
|
</Sidebar>
|
||||||
)}
|
)}
|
||||||
|
{renderGrouper()}
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
// width: '100%',
|
// width: '100%',
|
||||||
|
@ -122,6 +179,7 @@ export default function Todos() {
|
||||||
userId={userId}
|
userId={userId}
|
||||||
categories={categories}
|
categories={categories}
|
||||||
onCardClick={onClick}
|
onCardClick={onClick}
|
||||||
|
selectedGroup={selectedGroup}
|
||||||
/>
|
/>
|
||||||
<TodoTable
|
<TodoTable
|
||||||
tables={tables}
|
tables={tables}
|
||||||
|
@ -129,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