fixed the loop in eventlineup slots so they will show duplicate eventlineupentries if they exist refined some styling in eventsheet
157 lines
7.0 KiB
JavaScript
157 lines
7.0 KiB
JavaScript
const path = require('path')
|
|
const fs = require('fs')
|
|
const {embeddedSvgFromPath, parsePositionLabel, compilePositionLabel} = require("../lib/utils")
|
|
const tsUtils = require('../lib/utils')
|
|
const { loadEventLineupEntries } = require('teamsnap.js')
|
|
|
|
exports.partials = path.join(__dirname, "../views/eventlineup/partials")
|
|
exports.helpers = require('../helpers/eventlineup.js')
|
|
|
|
exports.getEventLineup = async (req, res)=>{
|
|
await Promise.all(req.promises)
|
|
const {user, team, members, event, layout, event_lineup, event_lineup_entries, availabilities, availabilitySummary, csrfToken} = req
|
|
attachBenchcoachPropertiesToMember(members, event_lineup_entries, availabilities)
|
|
members.sort(tsUtils.teamsnapMembersSortLineupAvailabilityLastName)
|
|
const scripts = [
|
|
"https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js",
|
|
"/js/eventlineup.js",
|
|
"/js/tinymce.min.js"
|
|
]
|
|
res.render("eventlineup/edit", {user, team, members, event, availabilities, scripts, layout, event_lineup, event_lineup_entries, availabilitySummary, csrfToken})
|
|
}
|
|
|
|
exports.getAdjacentEventLineup = async (req, res) => {
|
|
await Promise.all(req.promises)
|
|
const index = Number(req.query.index)
|
|
const {user, team, members, csrfToken} = req
|
|
let event
|
|
if (index > 0) {
|
|
event = req.upcoming_events[index-1]
|
|
}
|
|
else if (index < 0){
|
|
event = req.recent_events[Math.abs(index)-1]
|
|
} else {
|
|
throw new Error('Index must be positive or negative number')
|
|
}
|
|
if (!event) {
|
|
res.status(500).send()
|
|
return
|
|
}
|
|
const availabilitySummary = event.availabilitySummary
|
|
const event_lineup = req.timeline.event_lineups.find(i=>i.eventId==event.id)
|
|
const event_lineup_entries = req.timeline.event_lineup_entries?.filter(i=>i.eventId==event.id)
|
|
const availabilities = req.timeline.availabilities.filter(i=>i.eventId==event.id)
|
|
attachBenchcoachPropertiesToMember(members, event_lineup_entries, availabilities)
|
|
members.sort(tsUtils.teamsnapMembersSortLineupAvailabilityLastName)
|
|
console.log()
|
|
// res.status(200).send('Received')
|
|
res.render("eventlineup/edit", {user, team, members, event, layout: null, event_lineup, event_lineup_entries, availabilitySummary, csrfToken})
|
|
}
|
|
|
|
attachBenchcoachPropertiesToMember = (members, event_lineup_entries, availabilities) => {
|
|
members.forEach((member)=> {
|
|
// I *think* this can be done with linking https://github.com/teamsnap/teamsnap-javascript-sdk/wiki/Persistence#linking
|
|
// here's an example:
|
|
// member.link('eventLineupEntry', event_lineup_entries.find(i=>i.id=members[1].id))
|
|
member.benchcoach = {}
|
|
// I don't really like this, but the member_id changes once a season is archived.
|
|
// as far as I can tell, member_name should consistently be formulated from first and last name
|
|
// perhaps could have some edge cases if first or last names change, but this *should be* exceedingly rare.
|
|
const member_name = `${member.firstName} ${member.lastName}`
|
|
const event_lineup_entry = event_lineup_entries?.find(e=> e.memberId == member.id || e.memberName == member_name)
|
|
const availability = availabilities.find(e=>e.memberId == member.id)
|
|
member.benchcoach.availability = availability
|
|
if (event_lineup_entry != null) {
|
|
// member.link('eventLineupEntry', event_lineup_entry)
|
|
member.benchcoach.eventLineupEntry = event_lineup_entry
|
|
const {positionLabelWithoutFlag, positionFlags} = parsePositionLabel(event_lineup_entry.label);
|
|
member.benchcoach.eventLineupEntry.positionLabelWithoutFlag = positionLabelWithoutFlag
|
|
member.benchcoach.eventLineupEntry.flags = positionFlags
|
|
}
|
|
else {
|
|
member.benchcoach.eventLineupEntry = null
|
|
}
|
|
}
|
|
)
|
|
}
|
|
exports.attachBenchcoachPropertiesToMember = attachBenchcoachPropertiesToMember
|
|
|
|
exports.getEventLineupEmail = async (req, res)=>{
|
|
const {body} = req
|
|
if (body.memberId == null) {res.status(400).end();return}
|
|
await Promise.all(req.promises)
|
|
const {user, team, members, event, layout, event_lineup, event_lineup_entries, availabilities, availabilitySummary} = req
|
|
const eventLineupEntries = req.event_lineup.eventLineupEntries
|
|
const {newEventLineupEntries} = processPostedEventLineupEntries(body, eventLineupEntries, event_lineup)
|
|
attachBenchcoachPropertiesToMember(members, newEventLineupEntries, availabilities)
|
|
members.sort(tsUtils.teamsnapMembersSortLineupAvailabilityLastName)
|
|
res.status(200).render("eventlineup/partials/email_modal.hbs", {layout:null, user, team, members, event, event_lineup, event_lineup_entries: newEventLineupEntries, availabilities, availabilitySummary})
|
|
}
|
|
|
|
exports.getEventLineupEntries = async (req, res)=>{
|
|
const {event_lineup, event_lineup_entries} = req
|
|
res.setHeader('Content-Type', 'application/json').send(JSON.stringify(req.event_lineup_entries))
|
|
}
|
|
|
|
exports.getEventLineupEntriesData = async (req, res)=>{
|
|
const {event_lineup, event_lineup_entries} = req
|
|
res.setHeader('Content-Type', 'application/json').send(JSON.stringify(req.event_lineup_entries))
|
|
}
|
|
|
|
exports.postEventLineup = async (req,res) => {
|
|
const {body} = req
|
|
if (body.memberId == null) {res.status(400).end();return}
|
|
await Promise.all(req.promises);
|
|
const eventLineupEntries = req.event_lineup.eventLineupEntries
|
|
const {newEventLineupEntries, deleteEventLineupEntries} = processPostedEventLineupEntries(body, eventLineupEntries, req.event_lineup)
|
|
newEventLineupEntries.forEach(e=>{
|
|
teamsnap.saveEventLineupEntry(e)
|
|
})
|
|
deleteEventLineupEntries.forEach(e=>{
|
|
teamsnap.deleteEventLineupEntry(e)
|
|
})
|
|
|
|
eventLineup = await teamsnap.loadEventLineups(req.params.event_id)
|
|
res.status(201).end()
|
|
}
|
|
|
|
const processPostedEventLineupEntries = (body, eventLineupEntries, eventLineup) => {
|
|
const newEventLineupEntries = []
|
|
const deleteEventLineupEntries = []
|
|
|
|
body.memberId.forEach((memberId, i)=>{
|
|
const lineupEntryId = body.eventLineupEntryId[i]
|
|
const lineupEntryLabel = body.label[i]
|
|
const lineupEntrySequence = body.sequence[i]
|
|
const lineupEntryFlags = body.flags[i]
|
|
if (lineupEntryId != '' && lineupEntryLabel != '') {
|
|
// Update lineup entry
|
|
try {
|
|
const eventLineupEntry = eventLineupEntries.find((e)=>e.id==Number(lineupEntryId))
|
|
eventLineupEntry.sequence = lineupEntrySequence
|
|
eventLineupEntry.label = compilePositionLabel(lineupEntryLabel, lineupEntryFlags)
|
|
newEventLineupEntries.push(eventLineupEntry)
|
|
} catch {
|
|
console.log
|
|
}
|
|
}
|
|
else if (lineupEntryId != '') {
|
|
// Delete lineup entry
|
|
const eventLineupEntry = eventLineupEntries.find((e)=>e.id==Number(lineupEntryId))
|
|
deleteEventLineupEntries.push(eventLineupEntry)
|
|
}
|
|
else if (lineupEntryLabel != '') {
|
|
// Create lineup entry
|
|
const eventLineupEntry = teamsnap.createEventLineupEntry()
|
|
eventLineupEntry.eventLineupId = eventLineup.id
|
|
eventLineupEntry.memberId = memberId
|
|
eventLineupEntry.sequence = lineupEntrySequence
|
|
eventLineupEntry.label = compilePositionLabel(lineupEntryLabel, lineupEntryFlags)
|
|
newEventLineupEntries.push(eventLineupEntry)
|
|
}
|
|
else {
|
|
// Skip lineup entry
|
|
}
|
|
})
|
|
return {newEventLineupEntries, eventLineupEntries, deleteEventLineupEntries}
|
|
} |