diff --git a/src/GroupStats.js b/src/GroupStats.js index 8ccbac6..301d18a 100644 --- a/src/GroupStats.js +++ b/src/GroupStats.js @@ -122,7 +122,7 @@ export default withRouter(class GroupStats extends Component { }], count: doc.data().switch_language ? 0 : 1, switchedCount: doc.data().switch_language ? 1 : 0, - setIds: [doc.data().setIds], + setIds: doc.data().setIds, }); } else { incorrectAnswers[incorrectAnswers.length - 1].answers.push({ @@ -155,7 +155,7 @@ export default withRouter(class GroupStats extends Component { newState.totalIncorrect = 0; console.log(`Couldn't get group progress: ${error}`); }) - ) + ); await Promise.all(promises); } @@ -208,11 +208,11 @@ export default withRouter(class GroupStats extends Component { this.arraysHaveSameMembers(answer.setIds, [selectedSet.value]) || ( this.state.includeCompoundTests && - answer.setIds.includes(this.state.selectedSet.value) + answer.setIds.includes(selectedSet.value) ) ) } - newVocabItem.switchedCount = newVocabItem.answers.filter((answer) => answer.switchLanguage).length; + newVocabItem.switchedCount = newVocabItem.answers.filter((answer) => answer.switchLanguage === true).length; newVocabItem.count = newVocabItem.answers.length - newVocabItem.switchedCount; totalIncorrect += newVocabItem.answers.length; diff --git a/src/MistakesHistory.js b/src/MistakesHistory.js index 037752b..2cf0d9b 100644 --- a/src/MistakesHistory.js +++ b/src/MistakesHistory.js @@ -6,6 +6,8 @@ import "./css/History.css"; import "./css/MistakesHistory.css"; import Collapsible from "react-collapsible"; +import Checkbox from '@material-ui/core/Checkbox'; +import Select from "react-select"; export default class IncorrectHistory extends Component { constructor(props) { @@ -28,9 +30,17 @@ export default class IncorrectHistory extends Component { hideTextMobile: true, } ], - incorrectAnswers: [], totalIncorrect: 0, totalTests: 0, + sets: {}, + selectedSet: { + value: "all_sets", + label: "All sets", + }, + includeCompoundTests: true, + incorrectAnswers: [], + filteredIncorrectAnswers: [], + setsWithHistory: {}, }; let isMounted = true; @@ -48,51 +58,100 @@ export default class IncorrectHistory extends Component { document.title = "Incorrect | History | Parandum"; let promises = []; - let newState = {}; + let newState = { + sets: {}, + setsWithHistory: {}, + }; promises.push( this.state.db.collection("incorrect_answers") .where("uid", "==", this.state.user.uid) .orderBy("term", "asc") .get() - .then((querySnapshot) => { + .then(async (querySnapshot) => { let incorrectAnswers = []; + let subPromises = []; querySnapshot.docs.map((doc, index, array) => { - if (index === 0 || doc.data().term !== array[array.length - 1].data().term || doc.data().definition !== array[array.length - 1].data().definition) { + // if (index === 0 || doc.data().term !== array[array.length - 1].data().term || doc.data().definition !== array[array.length - 1].data().definition) { + // incorrectAnswers.push({ + // term: doc.data().term, + // definition: doc.data().definition, + // switchedAnswers: {}, + // notSwitchedAnswers: {}, + // switchedCount: 0, + // notSwitchedCount: 0, + // }); + // } + + // if (doc.data().switch_language) { + // if (Object.keys(incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers).includes(doc.data().answer)) { + // incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers[doc.data().answer]++; + // } else { + // incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers[doc.data().answer] = 1; + // } + // incorrectAnswers[incorrectAnswers.length - 1].switchedCount++; + // } else { + // if (Object.keys(incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers).includes(doc.data().answer)) { + // incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers[doc.data().answer]++; + // } else { + // incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers[doc.data().answer] = 1; + // } + // incorrectAnswers[incorrectAnswers.length - 1].notSwitchedCount++; + // } + + + + if (index === 0 || doc.data().term !== array[index - 1].data().term || doc.data().definition !== array[index - 1].data().definition) { incorrectAnswers.push({ term: doc.data().term, definition: doc.data().definition, - switchedAnswers: {}, - notSwitchedAnswers: {}, - switchedCount: 0, - notSwitchedCount: 0, + answers: [{ + answer: doc.data().answer, + switchLanguage: doc.data().switch_language, + setIds: doc.data().setIds, + }], + count: doc.data().switch_language ? 0 : 1, + switchedCount: doc.data().switch_language ? 1 : 0, + setIds: doc.data().setIds, }); + } else { + incorrectAnswers[incorrectAnswers.length - 1].answers.push({ + answer: doc.data().answer, + switchLanguage: doc.data().switch_language, + setIds: doc.data().setIds, + }); + doc.data().setIds.map((setId) => { + if (!incorrectAnswers[incorrectAnswers.length - 1].setIds.includes(setId)) + return incorrectAnswers[incorrectAnswers.length - 1].setIds.push(setId); + return true; + }); + if (doc.data().switch_language) { + incorrectAnswers[incorrectAnswers.length - 1].switchedCount++; + } else { + incorrectAnswers[incorrectAnswers.length - 1].count++; + } } - if (doc.data().switch_language) { - if (Object.keys(incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers).includes(doc.data().answer)) { - incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers[doc.data().answer]++; - } else { - incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers[doc.data().answer] = 1; - } - incorrectAnswers[incorrectAnswers.length - 1].switchedCount++; - } else { - if (Object.keys(incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers).includes(doc.data().answer)) { - incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers[doc.data().answer]++; - } else { - incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers[doc.data().answer] = 1; - } - incorrectAnswers[incorrectAnswers.length - 1].notSwitchedCount++; - } + doc.data().setIds.map((setId) => subPromises.push( + this.state.db.collection("sets") + .doc(setId) + .get() + .then((doc) => + newState.setsWithHistory[setId] = doc.data().title + ) + )); + return true; }); newState.incorrectAnswers = incorrectAnswers.sort((a,b) => b.count + b.switchedCount - a.count - a.switchedCount); + newState.filteredIncorrectAnswers = newState.incorrectAnswers; newState.totalIncorrect = querySnapshot.docs.length; + await Promise.all(subPromises); }) .catch((error) => { newState.incorrectAnswers = []; newState.totalIncorrect = 0; - console.log(`Couldn't get group progress: ${error}`); + console.log(`Couldn't get mistakes history: ${error}`); }) ); @@ -100,7 +159,16 @@ export default class IncorrectHistory extends Component { this.state.db.collection("progress") .where("uid", "==", this.state.user.uid) .get() - .then((querySnapshot) => newState.totalTests = querySnapshot.docs.length) + // .then((querySnapshot) => newState.totalTests = querySnapshot.docs.length) + .then((querySnapshot) => { + newState.progressHistory = querySnapshot.docs.map((doc) => + ({ + setIds: doc.data().setIds, + }) + ); + console.log(newState.progressHistory); + newState.totalTests = newState.progressHistory.length; + }) ); await Promise.all(promises); @@ -117,6 +185,84 @@ export default class IncorrectHistory extends Component { this.props.page.unload(); } + arraysHaveSameMembers = (arr1, arr2) => { + const set1 = new Set(arr1); + const set2 = new Set(arr2); + return arr1.every(item => set2.has(item)) && + arr2.every(item => set1.has(item)); + } + + handleSetSelectionChange = (selectedSet = this.state.selectedSet) => { + let totalIncorrect = 0; + const filteredIncorrectAnswers = (selectedSet.value === "all_sets" ? + JSON.parse(JSON.stringify(this.state.incorrectAnswers)) + : + JSON.parse(JSON.stringify(this.state.incorrectAnswers)) + .filter((vocabItem) => + vocabItem.setIds.includes(selectedSet.value) + ) + ) + .map((vocabItem) => { + let newVocabItem = vocabItem; + if (selectedSet.value === "all_sets") { + if (this.state.includeCompoundTests) { + newVocabItem.answers = vocabItem.answers; + } else { + newVocabItem.answers = vocabItem.answers + .filter((answer) => + answer.setIds.length === 1 + ) + } + } else { + newVocabItem.answers = vocabItem.answers + .filter((answer) => + this.arraysHaveSameMembers(answer.setIds, [selectedSet.value]) || + ( + this.state.includeCompoundTests && + answer.setIds.includes(selectedSet.value) + ) + ) + } + newVocabItem.switchedCount = newVocabItem.answers.filter((answer) => answer.switchLanguage === true).length; + newVocabItem.count = newVocabItem.answers.length - newVocabItem.switchedCount; + + totalIncorrect += newVocabItem.answers.length; + + return newVocabItem; + }); + console.log(this.state.progressHistory + .filter((progressItem) => + this.arraysHaveSameMembers(progressItem.setIds, [selectedSet.value]) || + ( + this.state.includeCompoundTests && + progressItem.setIds.includes(selectedSet.value) + ) + )); + this.setState({ + filteredIncorrectAnswers: filteredIncorrectAnswers, + selectedSet: selectedSet, + totalIncorrect: totalIncorrect, + totalTests: selectedSet.value === "all_sets" ? + this.state.progressHistory.length + : + this.state.progressHistory + .filter((progressItem) => + this.arraysHaveSameMembers(progressItem.setIds, [selectedSet.value]) || + ( + this.state.includeCompoundTests && + progressItem.setIds.includes(selectedSet.value) + ) + ) + .length, + }); + } + + handleIncludeCompoundTestsChange = (event) => { + this.setState({ + includeCompoundTests: event.target.checked, + }, () => this.handleSetSelectionChange()); + } + render() { return (
@@ -125,6 +271,88 @@ export default class IncorrectHistory extends Component {

Mistakes

+