refactor Leaderboard and new Table component structure
This commit is contained in:
parent
1abe2ddfaf
commit
decd4faf22
@ -47,6 +47,8 @@ const getChallengeLeaderboard = (
|
|||||||
id: submission.id,
|
id: submission.id,
|
||||||
submitter: submission.submitter,
|
submitter: submission.submitter,
|
||||||
when: submission.when,
|
when: submission.when,
|
||||||
|
description: submission.description,
|
||||||
|
entries: submission.times,
|
||||||
tags: submission.tags,
|
tags: submission.tags,
|
||||||
};
|
};
|
||||||
result.push(item);
|
result.push(item);
|
||||||
|
@ -1,20 +1,16 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import pensilIco from '../../../assets/pencil_ico.svg';
|
|
||||||
import deleteIco from '../../../assets/delete_ico.svg';
|
|
||||||
import TableStyle from './styles/TableStyle';
|
import TableStyle from './styles/TableStyle';
|
||||||
import TableHeader from './components/TableHeader';
|
import TableHeader from './components/TableHeader';
|
||||||
import TableRowTags from './components/TableRowTags';
|
|
||||||
import TableRowItems from './components/TableRowItems';
|
import TableRowItems from './components/TableRowItems';
|
||||||
import TableRowButtons from './components/TableRowButtons';
|
|
||||||
import RowsBackgroundStyle from './styles/RowsBackgroundStyle';
|
import RowsBackgroundStyle from './styles/RowsBackgroundStyle';
|
||||||
import { FlexRow } from '../../../utils/containers';
|
import TableRowFooter from './components/TableRowFooter';
|
||||||
|
|
||||||
const Table = ({ items, orderedKeys, sortByUpdate }) => {
|
const Table = ({ items, orderedKeys, sortByUpdate, rowFooter = true }) => {
|
||||||
const [, updateState] = React.useState();
|
const [, updateState] = React.useState();
|
||||||
const tableUpdate = React.useCallback(() => updateState({}), []);
|
const tableUpdate = React.useCallback(() => updateState({}), []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TableStyle>
|
<TableStyle rowFooter={rowFooter}>
|
||||||
<TableHeader
|
<TableHeader
|
||||||
orderedKeys={orderedKeys}
|
orderedKeys={orderedKeys}
|
||||||
sortByUpdate={sortByUpdate}
|
sortByUpdate={sortByUpdate}
|
||||||
@ -24,15 +20,7 @@ const Table = ({ items, orderedKeys, sortByUpdate }) => {
|
|||||||
return (
|
return (
|
||||||
<tr key={`table-row-${i}`} className="TableStyle__tr">
|
<tr key={`table-row-${i}`} className="TableStyle__tr">
|
||||||
<TableRowItems orderedKeys={orderedKeys} item={item} i={i} />
|
<TableRowItems orderedKeys={orderedKeys} item={item} i={i} />
|
||||||
<FlexRow className="TableStyle__row-footer">
|
<TableRowFooter rowFooter={rowFooter} item={item} i={i} />
|
||||||
<TableRowTags item={item} i={i} />
|
|
||||||
<TableRowButtons
|
|
||||||
buttons={[
|
|
||||||
{ icon: pensilIco, handler: () => console.log('edit') },
|
|
||||||
{ icon: deleteIco, handler: () => console.log('delete') },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</FlexRow>
|
|
||||||
<RowsBackgroundStyle i={i} />
|
<RowsBackgroundStyle i={i} />
|
||||||
</tr>
|
</tr>
|
||||||
);
|
);
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { FlexRow } from '../../../../../utils/containers';
|
||||||
|
import TableRowTags from '../TableRowTags/TableRowTags';
|
||||||
|
import TableRowButtons from '../TableRowButtons/TableRowButtons';
|
||||||
|
import pensilIco from '../../../../../assets/pencil_ico.svg';
|
||||||
|
import deleteIco from '../../../../../assets/delete_ico.svg';
|
||||||
|
|
||||||
|
const TableRowFooter = ({ rowFooter, item, i }) => {
|
||||||
|
if (rowFooter) {
|
||||||
|
return (
|
||||||
|
<FlexRow className="TableStyle__row-footer">
|
||||||
|
<TableRowTags item={item} i={i} />
|
||||||
|
<TableRowButtons
|
||||||
|
buttons={[
|
||||||
|
{ icon: pensilIco, handler: () => console.log('edit') },
|
||||||
|
{ icon: deleteIco, handler: () => console.log('delete') },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</FlexRow>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default TableRowFooter;
|
@ -0,0 +1 @@
|
|||||||
|
export { default } from './TableRowFooter';
|
@ -1,7 +1,7 @@
|
|||||||
import { FlexRow } from '../../../../../utils/containers';
|
import { FlexRow } from '../../../../../utils/containers';
|
||||||
|
|
||||||
const renderTags = (tags, i) => {
|
const renderTags = (tags, i) => {
|
||||||
if (tags.length > 0) {
|
if (tags && tags.length > 0) {
|
||||||
return tags.map((tag, j) => {
|
return tags.map((tag, j) => {
|
||||||
return (
|
return (
|
||||||
<FlexRow className="TableStyle__tag" key={`submissionTag-${i}-${j}`}>
|
<FlexRow className="TableStyle__tag" key={`submissionTag-${i}-${j}`}>
|
||||||
|
@ -19,12 +19,13 @@ const TableStyle = styled.table`
|
|||||||
|
|
||||||
.TableStyle__tr {
|
.TableStyle__tr {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 72px;
|
height: ${({ rowFooter }) => (rowFooter ? '72px' : 'auto')};
|
||||||
}
|
}
|
||||||
|
|
||||||
.TableStyle__td {
|
.TableStyle__td {
|
||||||
padding: 0 0 32px 0;
|
padding: ${({ rowFooter }) => (rowFooter ? '0 0 32px 0' : '12px 0')};
|
||||||
margin: 0 0 0 2px;
|
margin: 0 0 0 2px;
|
||||||
|
min-width: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.TableStyle_line {
|
.TableStyle_line {
|
||||||
|
@ -17,8 +17,8 @@ const Leaderboard = (props) => {
|
|||||||
const [pageNr, setPageNr] = React.useState(1);
|
const [pageNr, setPageNr] = React.useState(1);
|
||||||
const [loading, setLoading] = React.useState(true);
|
const [loading, setLoading] = React.useState(true);
|
||||||
const [submitterSorted, setSubmitterSorted] = React.useState(false);
|
const [submitterSorted, setSubmitterSorted] = React.useState(false);
|
||||||
// const [descriptionSorted, setDescriptionSorted] = React.useState(false);
|
const [descriptionSorted, setDescriptionSorted] = React.useState(false);
|
||||||
// const [entriesSorted, setEntriesSorted] = React.useState(false);
|
const [entriesSorted, setEntriesSorted] = React.useState(false);
|
||||||
const [whenSorted, setWhenSorted] = React.useState(false);
|
const [whenSorted, setWhenSorted] = React.useState(false);
|
||||||
const [scoresSorted, setScoresSorted] = React.useState([]);
|
const [scoresSorted, setScoresSorted] = React.useState([]);
|
||||||
const [idSorted, setIdSorted] = React.useState([]);
|
const [idSorted, setIdSorted] = React.useState([]);
|
||||||
@ -80,6 +80,40 @@ const Leaderboard = (props) => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'description':
|
||||||
|
if (descriptionSorted) {
|
||||||
|
newEntries = newEntries.sort((a, b) =>
|
||||||
|
a.description.toLowerCase() < b.description.toLowerCase()
|
||||||
|
? 1
|
||||||
|
: b.description.toLowerCase() < a.description.toLowerCase()
|
||||||
|
? -1
|
||||||
|
: 0
|
||||||
|
);
|
||||||
|
setDescriptionSorted(false);
|
||||||
|
} else {
|
||||||
|
newEntries = newEntries.sort((a, b) =>
|
||||||
|
a.description.toLowerCase() > b.description.toLowerCase()
|
||||||
|
? 1
|
||||||
|
: b.description.toLowerCase() > a.description.toLowerCase()
|
||||||
|
? -1
|
||||||
|
: 0
|
||||||
|
);
|
||||||
|
setDescriptionSorted(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'times':
|
||||||
|
if (entriesSorted) {
|
||||||
|
newEntries = newEntries.sort((a, b) =>
|
||||||
|
a.times > b.times ? 1 : b.times > a.times ? -1 : 0
|
||||||
|
);
|
||||||
|
setEntriesSorted(false);
|
||||||
|
} else {
|
||||||
|
newEntries = newEntries.sort((a, b) =>
|
||||||
|
a.times < b.times ? 1 : b.times < a.times ? -1 : 0
|
||||||
|
);
|
||||||
|
setEntriesSorted(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'when':
|
case 'when':
|
||||||
if (whenSorted) {
|
if (whenSorted) {
|
||||||
setWhenSorted(false);
|
setWhenSorted(false);
|
||||||
@ -111,11 +145,19 @@ const Leaderboard = (props) => {
|
|||||||
}
|
}
|
||||||
setEntries(newEntries);
|
setEntries(newEntries);
|
||||||
},
|
},
|
||||||
[entries, idSorted, scoresSorted, submitterSorted, whenSorted]
|
[
|
||||||
|
descriptionSorted,
|
||||||
|
entries,
|
||||||
|
entriesSorted,
|
||||||
|
idSorted,
|
||||||
|
scoresSorted,
|
||||||
|
submitterSorted,
|
||||||
|
whenSorted,
|
||||||
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
const n = (pageNr - 1) * (ELEMENTS_PER_PAGE * 2);
|
const n = (pageNr - 1) * (ELEMENTS_PER_PAGE * 2);
|
||||||
let elements = entries.slice(n, n + ELEMENTS_PER_PAGE * 2);
|
const elements = entries.slice(n, n + ELEMENTS_PER_PAGE * 2);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FlexColumn
|
<FlexColumn
|
||||||
@ -138,11 +180,12 @@ const Leaderboard = (props) => {
|
|||||||
items={elements}
|
items={elements}
|
||||||
orderedKeys={orderKeys(entries[0])}
|
orderedKeys={orderKeys(entries[0])}
|
||||||
sortByUpdate={sortByUpdate}
|
sortByUpdate={sortByUpdate}
|
||||||
|
rowFooter={false}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<Pager
|
<Pager
|
||||||
pageNr={pageNr}
|
pageNr={pageNr}
|
||||||
elements={entries}
|
elements={elements}
|
||||||
setPageNr={setPageNr}
|
setPageNr={setPageNr}
|
||||||
width="72px"
|
width="72px"
|
||||||
borderRadius="64px"
|
borderRadius="64px"
|
||||||
@ -158,34 +201,3 @@ const Leaderboard = (props) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default Leaderboard;
|
export default Leaderboard;
|
||||||
|
|
||||||
// case 'description':
|
|
||||||
// if (descriptionSorted) {
|
|
||||||
// newEntries = newEntries.sort((a, b) =>
|
|
||||||
// a.description.toLowerCase() < b.description.toLowerCase()
|
|
||||||
// ? 1
|
|
||||||
// : b.description.toLowerCase() < a.description.toLowerCase()
|
|
||||||
// ? -1
|
|
||||||
// : 0
|
|
||||||
// );
|
|
||||||
// setDescriptionSorted(false);
|
|
||||||
// } else {
|
|
||||||
// newEntries = newEntries.sort((a, b) =>
|
|
||||||
// a.description.toLowerCase() > b.description.toLowerCase()
|
|
||||||
// ? 1
|
|
||||||
// : b.description.toLowerCase() > a.description.toLowerCase()
|
|
||||||
// ? -1
|
|
||||||
// : 0
|
|
||||||
// );
|
|
||||||
// setDescriptionSorted(true);
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// case 'entries':
|
|
||||||
// if (entriesSorted) {
|
|
||||||
// newEntries = newEntries.sort((a, b) => b.times - a.times);
|
|
||||||
// setEntriesSorted(false);
|
|
||||||
// } else {
|
|
||||||
// newEntries = newEntries.sort((a, b) => a.times - b.times);
|
|
||||||
// setEntriesSorted(true);
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
const orderKeys = (elem) => {
|
const orderKeys = (elem) => {
|
||||||
if (elem) {
|
if (elem) {
|
||||||
let result = ['id'];
|
let result = ['id', 'submitter', 'description'];
|
||||||
const elemKeys = Object.keys(elem);
|
const elemKeys = Object.keys(elem);
|
||||||
const dev0keys = elemKeys
|
const dev0keys = elemKeys
|
||||||
.filter((key) => key.split('.')[1] === 'dev-0')
|
.filter((key) => key.split('.')[1] === 'dev-0')
|
||||||
@ -14,7 +14,7 @@ const orderKeys = (elem) => {
|
|||||||
result = result.concat(dev0keys);
|
result = result.concat(dev0keys);
|
||||||
result = result.concat(dev1keys);
|
result = result.concat(dev1keys);
|
||||||
result = result.concat(testAkeys);
|
result = result.concat(testAkeys);
|
||||||
result.push('when');
|
result.push('entries', 'when');
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
Loading…
Reference in New Issue
Block a user