Merge branch 'master' of gitlab.com:MrFry/qmining-page into master

This commit is contained in:
MrFry 2020-11-10 16:31:56 +01:00
commit 90a04b61b3
2 changed files with 127 additions and 41 deletions

View file

@ -13,10 +13,49 @@ const selectOptions = {
count: { name: 'Megoldott tesztek' }, count: { name: 'Megoldott tesztek' },
} }
async function getListFromServer() { const sinceOptions = {
all: {
name: 'All time',
},
monthly: { name: 'Havi' },
weekly: { name: 'Heti' },
daily: { name: 'Napi' },
}
function getTimeString(date) {
return (
date.getFullYear() +
'-' +
('0' + (date.getMonth() + 1)).slice(-2) +
'-' +
('0' + date.getDate()).slice(-2)
)
}
function getSinceDate(keyword) {
if (keyword === 'all') {
return null
}
const date = new Date()
if (keyword === 'daily') {
date.setDate(date.getDate() - 1)
} else if (keyword === 'weekly') {
date.setDate(date.getDate() - 7)
} else if (keyword === 'monthly') {
date.setDate(date.getDate() - 30)
}
return date
}
async function getListFromServer(since) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
console.info('Fetching data') console.info('Fetching data')
fetch(`${constants.apiUrl}ranklist`, { let query = ''
if (since && since !== 'all') {
query = `?since=${getTimeString(getSinceDate(since))}`
}
fetch(`${constants.apiUrl}ranklist${query}`, {
credentials: 'include', credentials: 'include',
Accept: 'application/json', Accept: 'application/json',
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@ -47,14 +86,18 @@ function sortDataBy(data, key) {
export default function RankList() { export default function RankList() {
const [ranklist, setRanklist] = useState(null) const [ranklist, setRanklist] = useState(null)
const [selfUserId, setSelfUserId] = useState(null) const [selfUserId, setSelfUserId] = useState('...')
const [key, setKey] = useState('newQuestions') const [key, setKey] = useState('newQuestions')
const [since, setSince] = useState('all')
const [sum, setSum] = useState({})
const getList = () => { const getList = () => {
setSum({})
setRanklist(null) setRanklist(null)
getListFromServer(key) getListFromServer(since)
.then((data) => { .then((data) => {
setRanklist(data.list) setRanklist(data.list)
setSum(data.sum)
setSelfUserId(data.selfuserId) setSelfUserId(data.selfuserId)
}) })
.catch((error) => { .catch((error) => {
@ -67,11 +110,15 @@ export default function RankList() {
getList() getList()
}, []) }, [])
if (!ranklist) { useEffect(() => {
return <LoadingIndicator /> getList()
} }, [since])
const list = sortDataBy(ranklist, key) const list = ranklist && sortDataBy(ranklist, key)
const updateSince = (keyword) => {
setSince(keyword)
}
return ( return (
<div> <div>
@ -84,6 +131,25 @@ export default function RankList() {
frissülnek. frissülnek.
</div> </div>
<Sleep /> <Sleep />
<div className={styles.sinceTable}>
<div className={styles.sinceHeaderRow}>
{Object.keys(sinceOptions).map((key) => {
const val = sinceOptions[key]
return (
<div
key={key}
className={`${styles.clickable} ${key === since &&
styles.selected}`}
onClick={() => {
updateSince(key)
}}
>
{val.name}
</div>
)
})}
</div>
</div>
<div className={styles.table}> <div className={styles.table}>
<div className={styles.headerRow}> <div className={styles.headerRow}>
<div>{'Rank'}</div> <div>{'Rank'}</div>
@ -104,22 +170,33 @@ export default function RankList() {
) )
})} })}
</div> </div>
{list.map((listItem, i) => { <div className={`${styles.row} ${styles.sumrow}`}>
return ( <div />
<div <div>{'Összesen'}</div>
className={`${styles.row} ${listItem.userId === selfUserId && <div>{sum.newQuestions}</div>
styles.selfRow}`} <div>{sum.allQuestions}</div>
key={i} <div>{sum.count}</div>
> </div>
<div>{i + 1}</div> {list ? (
<div>{'#' + listItem.userId}</div> list.map((listItem, i) => {
{Object.keys(selectOptions).map((listKey) => { return (
const val = listItem[listKey] <div
return <div key={listKey}>{val}</div> className={`${styles.row} ${listItem.userId === selfUserId &&
})} styles.selfRow}`}
</div> key={i}
) >
})} <div>{i + 1}</div>
<div>{'#' + listItem.userId}</div>
{Object.keys(selectOptions).map((listKey) => {
const val = listItem[listKey]
return <div key={listKey}>{val}</div>
})}
</div>
)
})
) : (
<LoadingIndicator />
)}
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,7 +1,20 @@
.row, .table,
.headerRow { .sinceTable {
display: flex; display: flex;
padding: 3px; flex-direction: column;
padding: 0px 10px;
}
.table :nth-child(1),
.sinceTable :nth-child(1) {
color: white;
}
.row,
.headerRow,
.sinceHeaderRow {
display: flex;
padding: 1px;
} }
.row:hover { .row:hover {
@ -9,13 +22,15 @@
} }
.row div, .row div,
.headerRow div { .headerRow div,
.sinceHeaderRow div {
flex: 1; flex: 1;
padding: 0px 5px; padding: 0px 5px;
text-align: center; text-align: center;
} }
.headerRow div { .headerRow div,
.sinceHeaderRow div {
padding: 15px 5px; padding: 15px 5px;
} }
@ -30,20 +45,14 @@
text-align: left; text-align: left;
} }
.table {
display: flex;
flex-direction: column;
padding: 10px;
}
.table :nth-child(1) {
color: white;
}
.clickable:hover { .clickable:hover {
background-color: #666666; background-color: #666666;
} }
.clickable {
cursor: pointer;
}
.selfRow { .selfRow {
background-color: #9999ff; background-color: #9999ff;
color: black; color: black;
@ -67,6 +76,6 @@
background-color: #9999ff; background-color: #9999ff;
} }
.clickable { .sumrow {
cursor: pointer; color: white;
} }