mirror of
https://gitlab.com/MrFry/qmining-page
synced 2025-04-01 20:23:44 +02:00
Merge branch 'master' of gitlab.com:MrFry/qmining-page into master
This commit is contained in:
commit
90a04b61b3
2 changed files with 127 additions and 41 deletions
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue