(sessions, courseID, levelsCollection)
| 228 | } |
| 229 | |
| 230 | statsForSessions (sessions, courseID, levelsCollection) { |
| 231 | let complete, left, nextLevel, nextLevelNumber |
| 232 | if (levelsCollection == null) { levelsCollection = undefined } |
| 233 | if (!sessions) { return null } |
| 234 | sessions = sessions.models || sessions |
| 235 | const arena = this.getLadderLevel(courseID) |
| 236 | const project = this.getProjectLevel(courseID) |
| 237 | const courseLevels = this.getLevels({ courseID, withoutLadderLevels: true, levelsCollection }) |
| 238 | const levelSessionMap = {} |
| 239 | for (const session of Array.from(sessions)) { levelSessionMap[session.get('level').original] = session } |
| 240 | let currentIndex = -1 |
| 241 | let lastStarted = null |
| 242 | let levelsTotal = 0 |
| 243 | let levelsLeft = 0 |
| 244 | let lastPlayed = null |
| 245 | let lastPlayedNumber = null |
| 246 | let playtime = 0 |
| 247 | const levels = [] |
| 248 | let linesOfCode = 0 |
| 249 | const userLevels = {} |
| 250 | const levelsInCourse = new Set() |
| 251 | const levelAttributesArr = courseLevels.models.map(l => l.attributes) |
| 252 | for (let index = 0; index < courseLevels.models.length; index++) { |
| 253 | let left2, left3 |
| 254 | const level = courseLevels.models[index] |
| 255 | if (!level.get('practice') && !level.get('assessment')) { levelsTotal++ } |
| 256 | complete = false |
| 257 | const session = levelSessionMap[level.get('original')] |
| 258 | if (session) { |
| 259 | let left1 |
| 260 | complete = (left = session.get('state').complete) != null ? left : false |
| 261 | playtime += (left1 = session.get('playtime')) != null ? left1 : 0 |
| 262 | linesOfCode += session.countOriginalLinesOfCode(level) |
| 263 | lastPlayed = level |
| 264 | lastPlayedNumber = this.getLevelNumber(level.get('original'), index + 1, courseID) |
| 265 | if (complete) { |
| 266 | currentIndex = index |
| 267 | } else { |
| 268 | lastStarted = level |
| 269 | if (!level.get('practice') && !level.get('assessment')) { levelsLeft++ } |
| 270 | } |
| 271 | } else if (!(level.get('practice') || level.get('assessment'))) { |
| 272 | levelsLeft++ |
| 273 | } |
| 274 | const lockCheckOriginal = utils.findParentLevelOriginal(level.attributes, levelAttributesArr) |
| 275 | levels.push({ |
| 276 | assessment: (left2 = level.get('assessment')) != null ? left2 : false, |
| 277 | practice: (left3 = level.get('practice')) != null ? left3 : false, |
| 278 | complete, |
| 279 | optional: this.isStudentOnOptionalLevel(me.id, courseID, lockCheckOriginal), |
| 280 | slug: level.get('slug'), |
| 281 | original: level.get('original'), |
| 282 | }) |
| 283 | if (!level.get('practice') && !level.get('assessment')) { levelsInCourse.add(level.get('original')) } |
| 284 | userLevels[level.get('original')] = complete |
| 285 | } |
| 286 | lastPlayed = lastStarted != null ? lastStarted : lastPlayed |
| 287 | if (lastPlayed != null ? lastPlayed.get('assessment') : undefined) { lastPlayedNumber = '' } |
no test coverage detected