reorganized

This commit is contained in:
2023-08-19 16:30:28 -05:00
parent 70a7981ca5
commit 6576d17539
12 changed files with 698 additions and 372 deletions

View File

@@ -3,40 +3,167 @@ utils = require("../lib/utils");
exports.getEvents = (req, res, next) => {
team_id = req.params.team_id;
utils.initTeamsnap(req, res, () => {
teamsnap
.bulkLoad(team_id, ["team", "event", "availabilitySummary"])
.then(() => {
items = teamsnap.getAllItems();
context = {
title: "Events",
team: items.find((i) => i.type == "team" && i.id == team_id),
availabilitySummaries: items.filter(
(i) => i.type == "availabilitySummary"
),
events: items.filter((i) => i.type == "event"),
};
res.render("events", context);
});
teamsnap.bulkLoad(team_id, ["team", "event", "availabilitySummary"]).then(() => {
items = teamsnap.getAllItems();
context = {
title: "Events",
team: items.find((i) => i.type == "team" && i.id == team_id),
availabilitySummaries: items.filter((i) => i.type == "availabilitySummary"),
events: items.filter((i) => i.type == "event"),
};
res.render("events", context);
});
});
};
exports.getEvent = (req, res, next) => {
team_id = req.params.team_id;
event_id = req.params.event_id;
utils.initTeamsnap(req, res, () => {
teamsnap.bulkLoad(team_id, ["team", "event", "availabilitySummary"]).then(() => {
items = teamsnap.getAllItems();
context = {
title: "Event",
team: items.find((i) => i.type == "team" && i.id == team_id),
availabilitySummary: items.find((i) => i.type == "availabilitySummary" && i.id == event_id),
event: items.find((i) => i.type == "event" && i.id == event_id),
};
res.render("event", context);
});
});
};
exports.getLineup = (req, res, next) => {
team_id = req.params.team_id;
event_id = req.params.event_id;
utils.initTeamsnap(req, res, () => {
teamsnap
.bulkLoad(team_id, ["team", "event", "availabilitySummary"])
.bulkLoad(team_id, [
"team",
"member",
// "member_photos",
"event",
"opponent",
"availability_summary",
])
.then((items) => {
events = items.filter((i) => i.type == "event").sort((a, b) => a.startDate - b.startDate);
event = events.find((i) => i.id == event_id);
events_past = events.slice(
events.findIndex((e) => e == event) - 4,
events.findIndex((e) => e == event)
);
events_future = events.slice(events.findIndex((e) => e == event) + 1, events.findIndex((e) => e == event) + 5);
events = events_past.concat(event).concat(events_future);
})
.then((items) => {
return teamsnap.loadAvailabilities({
eventId: events.map((e) => e.id),
});
})
.then(() => {
return teamsnap.collections["eventLineups"]
.queryItems("search", {
eventId: events.map((e) => e.id),
})
.then((event_lineups) => {
return Promise.all(event_lineups.map((elu) => elu.loadItem("eventLineupEntries")));
});
})
.then(() => {
items = teamsnap.getAllItems();
events = items.filter((i) => i.type == "event");
current_event_index = events.findIndex((e) => e.id == event_id);
context = {
title: "Event",
team: items.find((i) => i.type == "team" && i.id == team_id),
availabilitySummary: items.find(
(i) => i.type == "availabilitySummary" && i.id == event_id
),
event: items.find((i) => i.type == "event" && i.id == event_id),
title: "Lineup",
team: items.find((e) => e.type == "team" && e.id == team_id),
team_id: req.params.team_id,
event_id: req.params.event_id,
current_event_index: current_event_index,
events: items.filter((a) => a.type == "event"),
availabilitySummaries: items.filter((i) => i.type == "availabilitySummary"),
availabilitySummary: items.filter((i) => i.type == "availabilitySummary" && i.eventId == event_id),
event: items.find((e) => e.type == "event" && e.id == event_id),
events_past: events_past,
events_future: events_future,
members: items.filter((a) => a.type == "member"),
availabilities: items.filter((i) => i.type == "availability").sort(utils.teamsnapAvailabilitiesSort),
all_lineup_entries: items.filter((i) => i.type == "eventLineupEntry"),
event_lineup_entries: items
.filter((i) => i.type == "eventLineupEntry" && i.eventId == event_id)
.sort((a, b) => a.sequence - b.sequence),
};
res.render("event", context);
res.render("event-lineup", context);
});
});
};
exports.getLineupCard = (req, res, next) => {
team_id = req.params.team_id;
event_id = req.params.event_id;
utils.initTeamsnap(req, res, () => {
teamsnap
.bulkLoad(team_id, [
"team",
"member",
// "member_photos",
"event",
"opponent",
"availability_summary",
])
.then((items) => {
events = items.filter((i) => i.type == "event").sort((a, b) => a.startDate - b.startDate);
event = events.find((i) => i.id == event_id);
events_past = events.slice(
events.findIndex((e) => e == event) - 4,
events.findIndex((e) => e == event)
);
events_future = events.slice(events.findIndex((e) => e == event) + 1, events.findIndex((e) => e == event) + 5);
events = events_past.concat(event).concat(events_future);
})
.then((items) => {
return teamsnap.loadAvailabilities({
eventId: events.map((e) => e.id),
});
})
.then(() => {
return teamsnap.collections["eventLineups"]
.queryItems("search", {
eventId: events.map((e) => e.id),
})
.then((event_lineups) => {
return Promise.all(event_lineups.map((elu) => elu.loadItem("eventLineupEntries")));
});
})
.then(() => {
items = teamsnap.getAllItems();
events = items.filter((i) => i.type == "event");
current_event_index = events.findIndex((e) => e.id == event_id);
context = {
title: "Gamecard",
team_id: req.params.team_id,
event_id: req.params.event_id,
current_event_index: current_event_index,
events: items.filter((a) => a.type == "event"),
availabilitySummaries: items.filter((i) => i.type == "availabilitySummary"),
event: items.find((e) => e.type == "event" && e.id == event_id),
events_past: events_past,
events_future: events_future,
members: items.filter((a) => a.type == "member"),
availabilities: items.filter((i) => i.type == "availability").sort(utils.teamsnapAvailabilitiesSort),
all_lineup_entries: items.filter((i) => i.type == "eventLineupEntry"),
event_lineup_entries_offense: items
.filter((i) => i.type == "eventLineupEntry" && i.eventId == event_id && !i.label.includes("[PO]"))
.sort((a, b) => a.sequence - b.sequence),
event_lineup_entries: items
.filter((i) => i.type == "eventLineupEntry" && i.eventId == event_id)
.sort((a, b) => a.sequence - b.sequence),
};
res.render("event-lineupcard", context);
});
});
};

View File

@@ -0,0 +1,18 @@
utils = require("../lib/utils");
exports.getMembers = (req, res, next) => {
team_id = req.params.team_id;
utils.initTeamsnap(req, res, () => {
teamsnap.bulkLoad(team_id, ["team", "member"]).then(() => {
items = teamsnap.getAllItems();
context = {
title: `Roster`,
team_id: team_id,
team: items.find((i) => i.type == "team" && i.id == team_id),
members: items.filter((i) => i.type == "member" && i.teamId == team_id),
};
res.set("Content-Type", "text/html");
res.render("members", context);
});
});
};

View File

@@ -0,0 +1,80 @@
exports.getOpponents = (req, res, next) => {
team_id = req.params.team_id;
utils.initTeamsnap(req, res, () => {
teamsnap.bulkLoad(team_id, ["team", "opponent"]).then((items) => {
res.set("Content-Type", "text/html");
res.render("opponents", {
title: "Opponents",
team: items.find((i) => i.type == "team" && i.id == team_id),
opponents: items.filter((i) => i.type == "opponent"),
team_id: team_id,
});
});
});
};
exports.uploadOpponentLogoForm = (req, res, next) => {
opponent_id = req.params.opponent_id;
team_id = req.params.team_id;
res.set("Content-Type", "text/html");
res.render("upload-logo", {
title: "Upload Logo",
csrf_token: req.csrfToken(),
team_id: team_id,
opponent_id: opponent_id,
});
};
exports.uploadOpponentLogo = (req, res, next) => {
opponent_id = req.body.opponent_id;
team_id = req.body.team_id;
member_id = req.user.id;
file = new File(req.file.buffer, `team-logo-${opponent_id}.png`, {
type: "image/png",
});
authTeamsnap(req.user);
teamsnap
.loadCollections()
.then(() => {
return teamsnap.createTeamMedium({
file: file,
mediaFormat: "file",
memberId: member_id,
teamId: team_id,
teamMediaGroupId: "4927028",
description: `team-logo-${opponent_id}.png`,
});
})
.then((item) => {
return teamsnap.uploadTeamMedium(item);
})
.then((item) => {
res.send("Data Received: " + JSON.stringify(item));
})
.fail((err) => console.log(err));
};
exports.getOpponent = (req, res, next) => {
team_id = req.params.team_id;
opponent_id = req.params.opponent_id;
utils.initTeamsnap(req, res, () => {
teamsnap
.bulkLoad(team_id, ["team", "opponent"])
.then(() => {
teamsnap.loadTeamMedia(team_id);
})
.then(() => {
items = teamsnap.getAllItems();
context = {
team: items.find((i) => i.type == "team" && i.id == team_id),
opponent: items.find((i) => i.type == "opponent" && i.id == opponent_id),
opponent_logo: items.find(
(i) => i.type == "teamMedium" && i.description == `opponent-logo-${opponent_id}.png`
),
team_id: team_id,
};
res.set("Content-Type", "text/html");
res.render("opponent", context);
});
});
};

View File

@@ -11,307 +11,18 @@ const storage = multer.memoryStorage();
const upload = multer({ storage: storage });
const teamsController = require("../controllers/teams");
const eventsController = require("../controllers/events");
const membersController = require("../controllers/members");
const opponentsController = require("../controllers/opponents");
router.get("/", ensureLoggedIn, teamsController.getTeams);
router.get("/:team_id/home", ensureLoggedIn, teamsController.getTeamHome);
router.get("/:team_id/events", ensureLoggedIn, eventsController.getEvents);
router.get(
"/:team_id/event/:event_id",
ensureLoggedIn,
eventsController.getEvent
);
router.get(
"/:team_id/event/:event_id/gamecard",
ensureLoggedIn,
function (req, res, next) {
authTeamsnap(req.user);
team_id = req.params.team_id;
event_id = req.params.event_id;
teamsnap.loadCollections((err) => {
teamsnap.enablePersistence();
var events;
teamsnap
.bulkLoad(team_id, [
"team",
"member",
// "member_photos",
"event",
"opponent",
"availability_summary",
])
.then((items) => {
events = items
.filter((i) => i.type == "event")
.sort((a, b) => a.startDate - b.startDate);
event = events.find((i) => i.id == event_id);
events_past = events.slice(
events.findIndex((e) => e == event) - 4,
events.findIndex((e) => e == event)
);
events_future = events.slice(
events.findIndex((e) => e == event) + 1,
events.findIndex((e) => e == event) + 5
);
events = events_past.concat(event).concat(events_future);
})
.then((items) => {
return teamsnap.loadAvailabilities({
eventId: events.map((e) => e.id),
});
})
.then(() => {
return teamsnap.collections["eventLineups"]
.queryItems("search", {
eventId: events.map((e) => e.id),
})
.then((event_lineups) => {
return Promise.all(
event_lineups.map((elu) => elu.loadItem("eventLineupEntries"))
);
});
})
.then(() => {
items = teamsnap.getAllItems();
events = items.filter((i) => i.type == "event");
current_event_index = events.findIndex((e) => e.id == event_id);
context = {
title: "Gamecard",
team_id: req.params.team_id,
event_id: req.params.event_id,
current_event_index: current_event_index,
events: items.filter((a) => a.type == "event"),
availabilitySummaries: items.filter(
(i) => i.type == "availabilitySummary"
),
event: items.find((e) => e.type == "event" && e.id == event_id),
events_past: events_past,
events_future: events_future,
members: items.filter((a) => a.type == "member"),
availabilities: items
.filter((i) => i.type == "availability")
.sort(availabilitiesSort),
all_lineup_entries: items.filter(
(i) => i.type == "eventLineupEntry"
),
event_lineup_entries_offense: items
.filter(
(i) =>
i.type == "eventLineupEntry" &&
i.eventId == event_id &&
!i.label.includes("[PO]")
)
.sort((a, b) => a.sequence - b.sequence),
event_lineup_entries: items
.filter(
(i) => i.type == "eventLineupEntry" && i.eventId == event_id
)
.sort((a, b) => a.sequence - b.sequence),
};
res.render("gamecard", context);
});
});
}
);
router.get(
"/:team_id/event/:event_id/lineup",
ensureLoggedIn,
function (req, res, next) {
authTeamsnap(req.user);
team_id = req.params.team_id;
event_id = req.params.event_id;
teamsnap.loadCollections((err) => {
teamsnap.enablePersistence();
var events;
teamsnap
.bulkLoad(team_id, [
"team",
"member",
// "member_photos",
"event",
"opponent",
"availability_summary",
])
.then((items) => {
events = items
.filter((i) => i.type == "event")
.sort((a, b) => a.startDate - b.startDate);
event = events.find((i) => i.id == event_id);
events_past = events.slice(
events.findIndex((e) => e == event) - 4,
events.findIndex((e) => e == event)
);
events_future = events.slice(
events.findIndex((e) => e == event) + 1,
events.findIndex((e) => e == event) + 5
);
events = events_past.concat(event).concat(events_future);
})
.then((items) => {
return teamsnap.loadAvailabilities({
eventId: events.map((e) => e.id),
});
})
.then(() => {
return teamsnap.collections["eventLineups"]
.queryItems("search", {
eventId: events.map((e) => e.id),
})
.then((event_lineups) => {
return Promise.all(
event_lineups.map((elu) => elu.loadItem("eventLineupEntries"))
);
});
})
.then(() => {
items = teamsnap.getAllItems();
events = items.filter((i) => i.type == "event");
current_event_index = events.findIndex((e) => e.id == event_id);
context = {
title: "Lineup",
team: items.find((e) => e.type == "team" && e.id == team_id),
team_id: req.params.team_id,
event_id: req.params.event_id,
current_event_index: current_event_index,
events: items.filter((a) => a.type == "event"),
availabilitySummaries: items.filter(
(i) => i.type == "availabilitySummary"
),
event: items.find((e) => e.type == "event" && e.id == event_id),
events_past: events_past,
events_future: events_future,
members: items.filter((a) => a.type == "member"),
availabilities: items
.filter((i) => i.type == "availability")
.sort(availabilitiesSort),
all_lineup_entries: items.filter(
(i) => i.type == "eventLineupEntry"
),
event_lineup_entries_offense: items
.filter(
(i) =>
i.type == "eventLineupEntry" &&
i.eventId == event_id &&
!i.label.includes("[PO]")
)
.sort((a, b) => a.sequence - b.sequence),
event_lineup_entries: items
.filter(
(i) => i.type == "eventLineupEntry" && i.eventId == event_id
)
.sort((a, b) => a.sequence - b.sequence),
};
res.render("lineup/lineup", context);
});
});
}
);
router.get("/:team_id/events", ensureLoggedIn);
router.get("/:team_id/opponents", ensureLoggedIn, function (req, res, next) {
authTeamsnap(req.user);
team_id = req.params.team_id;
teamsnap.loadCollections(function (err) {
teamsnap.bulkLoad(team_id, ["team", "opponent"]).then((items) => {
res.set("Content-Type", "text/html");
res.render("opponents", {
title: "Opponents",
team: items.find((i) => i.type == "team" && i.id == team_id),
opponents: items.filter((i) => i.type == "opponent"),
team_id: team_id,
});
});
});
});
router.get("/:team_id/opponents", ensureLoggedIn, function (req, res, next) {
authTeamsnap(req.user);
team_id = req.params.team_id;
teamsnap.loadCollections(function (err) {
teamsnap.bulkLoad(team_id, ["team", "opponent"]).then((items) => {
res.set("Content-Type", "text/html");
res.render("opponents", {
title: "Opponents",
team: items.find((i) => i.type == "team" && i.id == team_id),
opponents: items.filter((i) => i.type == "opponent"),
team_id: team_id,
});
});
});
});
router.get("/:team_id/roster", ensureLoggedIn, function (req, res, next) {
authTeamsnap(req.user);
team_id = req.params.team_id;
teamsnap.loadCollections(function (err) {
teamsnap.enablePersistence();
teamsnap.bulkLoad(team_id, ["team", "members"]).then(() => {
items = teamsnap.getAllItems();
res.set("Content-Type", "text/html");
res.render("roster", {
title: `Roster`,
team: items.find((i) => i.type == "team" && i.id == team_id),
members: items.find((i) => i.type == "member" && team.id == team_id),
team_id: team_id,
});
});
});
});
router.get(
"/:team_id/opponent/:opponent_id/upload-logo",
ensureLoggedIn,
function (req, res, next) {
opponent_id = req.params.opponent_id;
team_id = req.params.team_id;
res.set("Content-Type", "text/html");
res.render("upload-logo", {
title: "Upload Logo",
csrf_token: req.csrfToken(),
team_id: team_id,
opponent_id: opponent_id,
});
}
);
router.post(
"/:team_id/opponent/:opponent_id/upload-logo",
ensureLoggedIn,
upload.single("file"),
function (req, res, next) {
opponent_id = req.body.opponent_id;
team_id = req.body.team_id;
member_id = req.user.id;
file = new File(req.file.buffer, `team-logo-${opponent_id}.png`, {
type: "image/png",
});
authTeamsnap(req.user);
teamsnap
.loadCollections()
.then(() => {
return teamsnap.createTeamMedium({
file: file,
mediaFormat: "file",
memberId: member_id,
teamId: team_id,
teamMediaGroupId: "4927028",
description: `team-logo-${opponent_id}.png`,
});
})
.then((item) => {
return teamsnap.uploadTeamMedium(item);
})
.then((item) => {
res.send("Data Received: " + JSON.stringify(item));
})
.fail((err) => console.log(err));
}
);
router.get("/:team_id/event/:event_id", ensureLoggedIn, eventsController.getEvent);
router.get("/:team_id/event/:event_id/lineup", ensureLoggedIn, eventsController.getLineup);
router.get("/:team_id/event/:event_id/lineup_card", ensureLoggedIn, eventsController.getLineupCard);
router.get("/:team_id/members", ensureLoggedIn, membersController.getMembers);
router.get("/:team_id/opponents", ensureLoggedIn, opponentsController.getOpponents);
router.get("/:team_id/opponent/:opponent_id", ensureLoggedIn, opponentsController.getOpponent);
// router.get("/:team_id/opponent/:opponent_id/logo", ensureLoggedIn, opponentsController.getOpponentLogo);
module.exports = router;

View File

@@ -1,6 +1,6 @@
extends ../base.pug
include lineup-slot.pug
include ../widgets/availability-progress-bar.pug
extends base.pug
include mixin-lineup-slot.pug
include mixin-availability-progress-bar.pug
block append styles
link(rel='stylesheet' href='/css/lineup.css')
@@ -28,7 +28,8 @@ block content
each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"]
.Grid-cell.position-status #{pos}
.slot-set
each lineup_entry, i in event_lineup_entries_offense
each lineup_entry, i in event_lineup_entries
if !lineup_entry.label.includes("PO")
+lineup-slot(lineup_entry, i)
.Panel
.Panel-body

View File

@@ -0,0 +1,409 @@
html
head
meta(charset='utf-8')
title #{event.formattedTitle}
link(rel='stylesheet' href='/css/gamecard.css')
body(class="B5")
input(name="team_id", type="hidden" value=`${team_id}`)
input(name="event_id", type="hidden" value=`${event_id}`)
#page-1.sheet.gamecard
section#todays-game
.grid-container
.section-header
#todays-game-header.bar-left.event-title
| #{event.formattedTitle}
| #{event.startDate.toLocaleDateString("en-us",{weekday: "short", day: "numeric",month: "short"})}
| #{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})}
.bar-right.homeaway #{event.gameType}
.bar-span.gametitle
#offense-pane.left
table#starting-lineup-offense
tbody
each _, i in Array(11)
- if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){
tr
th(rowspan='2') #{i+1}
td(id=`offense-slot-${i}-name` class="player-name") #{event_lineup_entries_offense[i].member.lastName}
td(id=`offense-slot-${i}-jersey-number` class="jersey-number") #{event_lineup_entries_offense[i].member.jerseyNumber}
td(id=`offense-slot-${i}-position` class="position") #{event_lineup_entries_offense[i].label}
tr.substitute
td
td
td
- } else {
tr
th(rowspan='2')
td(id=`offense-slot-${i}-name` class="player-name")
td(id=`offense-slot-${i}-jersey-number` class="jersey-number")
td(id=`offense-slot-${i}-position` class="position")
tr.substitute
td
td
td
- }
#defense-pane.right
.container
.field-container
image(src='/media/baseball-diamond.svg')
.row(style='justify-content: center')
.defense-slot-set
table
tr
th.position CF
td#defense-slot-CF-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("CF")) || {"member":{}}).member.lastName}
tr
td(colspan='2')
tr
td(colspan='2')
.row(style='justify-content: space-between')
.defense-slot-set
table
tr
th.position LF
td#defense-slot-LF-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("LF")) || {"member":{}}).member.lastName}
tr
td(colspan='2')
tr
td(colspan='2')
.defense-slot-set
table
tr
th.position RF
td#defense-slot-RF-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("RF")) || {"member":{}}).member.lastName}
tr
td(colspan='2')
tr
td(colspan='2')
.row(style='justify-content: space-around')
.defense-slot-set
table
tr
th.position SS
td#defense-slot-SS-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("SS")) || {"member":{}}).member.lastName}
tr
td(colspan='2')
tr
td(colspan='2')
.defense-slot-set
table
tr
th.position 2B
td#defense-slot-2B-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("2B")) || {"member":{}}).member.lastName}
tr
td(colspan='2')
tr
td(colspan='2')
.row(style='justify-content: space-between')
.defense-slot-set
table
tr
th.position 3B
td#defense-slot-3B-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("3B")) || {"member":{}}).member.lastName}
tr
td(colspan='2')
tr
td(colspan='2')
.defense-slot-set
table
tr
th.position 1B
td#defense-slot-1B-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("1B")) || {"member":{}}).member.lastName}
tr
td(colspan='2')
tr
td(colspan='2')
.row(style='justify-content: center')
.defense-slot-set
table
tr
th.position C
td#defense-slot-C-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("C") && !lue.label.startsWith("CF") ) || {"member":{}}).member.lastName}
tr
td(colspan='2')
tr
td(colspan='2')
.pitching-container
.defense-slot-set
table
tr
th.position P
td#defense-slot-P-name.player-name
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("P")) || {"member":{}}).member.lastName}
td.jersey-number
| #{(event_lineup_entries.find((lue)=>lue.label.startsWith("P")) || {"member":{}}).member.jerseyNumber}
td.position
tr
th.position RP
td#defense-slot-RP1-name.player-name
td
td
tr
th.position RP
td#defense-slot-RP2-name.player-name
td
td
.footer
table
tr
th Notes
td
tr
td
tr
td
section#roster-and-history
div
table
thead
tr
th#today-availability(colspan='3') Available (
| #{availabilitySummaries.find((e)=>e.id==event_id).playerGoingCount}|
| #{availabilitySummaries.find((e)=>e.id==event_id).playerMaybeCount}
| )
th.player-stats
span.decimal-point .
| AVG
span.delimiter /
span.decimal-point .
| OBP
span.delimiter /
span.decimal-point .
| SLG
span.delimiter :
| PA
th.position-capability.pitcher P
th.position-capability.catcher C
th.position-capability.infield I
th.position-capability.outfield O
each event_future, i in events_future
th(id=`avail-header-today-plus-${i+1}` class="availability future")
.rotate #{event_future.startDate.toLocaleDateString("en-us", {weekday: "short"})}
each event_past, i in events_past
th(id=`avail-header-today-minus-${i+1}` class="availability past")
.rotate #{event_past.startDate.toLocaleDateString("en-us", {weekday: "short"})}
tbody
each row, index in availabilities.filter((e)=>e.event.id==event_id && !e.member.isNonPlayer)
tr(id=`roster-history-slot-${index+1}` class=``)
td(class=`is-present-checkbox available-status-code-${row.statusCode}`)
span ■
td(
class=`
jersey-number
border-left
available-status-code-${row.statusCode}
${event_lineup_entries.find((lue)=>lue.member.id==row.member.id) !== undefined ? "starting" : ""}
`)
| #{row.member.jerseyNumber}
td(
class=`
player-name
available-status-code-${row.statusCode}
${event_lineup_entries.find((lue)=>lue.member.id==row.member.id) !== undefined ? "starting" : ""}
`)
| #{row.member.lastName}
td.player-stats.border-left.border-right
span.decimal-point .
span.avg 000
span.delimiter /
span.decimal-point .
span.obp 000
span.delimiter /
span.decimal-point .
span.slg 000
span.delimiter :
span.pa 00
td.position-capability.pitcher #{row.member.position.includes("P") ? "\u2713" : ""}
td.position-capability.catcher #{row.member.position.includes("C") ? "\u2713" : ""}
td.position-capability.infield #{row.member.position.includes("IF") ? "\u2713" : ""}
td.position-capability.outfield #{row.member.position.includes("OF") ? "\u2713" : ""}
- var future_availability
- var future_lineupEntry
each future_event, i in events_future
- future_availability = availabilities.find((el)=>el.eventId ==future_event.id && el.memberId==row.member.id)
- future_lineupEntry = all_lineup_entries.find((el)=>el.eventId ==future_event.id && el.member.id==row.member.id)
- console.log(future_availability)
td(id=`avail-${row.member}-today-plus-${i+1}` class=`
row
future
availability
available-status-code-${future_availability.statusCode}
`)
if future_lineupEntry
|#{future_lineupEntry.label.slice(0,2)}
else
|#{future_availability.status[0]}
- var past_availability
- var past_lineupEntry
each past_event, i in events_past
- past_availability = availabilities.find((el)=>el.eventId==past_event.id && el.memberId==row.memberId)
- past_lineupEntry = all_lineup_entries.find((el)=>el.event.id==past_event.id && el.member.id==row.member.id)
td(id=`avail-${row.member}-today-minus-${i+1}` class=`
row
past
availability
available-status-code-${past_availability.statusCode}
${past_lineupEntry ? "started" : ""}
`)
if past_lineupEntry
|#{past_lineupEntry.label.slice(0,2)}
else
|#{past_availability.status[0]}
tfoot
tr
th(colspan='3')
th
th(colspan='4')
each event_future, i in events_future
th(class=`availability future`)
.rotate #{availabilitySummaries.find((el)=>el.eventId == event_future.id).playerGoingCount}
th.today-minus-1
.rotate
th.today-minus-2
.rotate
th.today-minus-3
.rotate
th.today-minus-4
.rotate
section#lineup-card-dugout.lineup-card
.grid-container
.section-header
.bar-left.event-title
| #{event.formattedTitle}
.bar-right.homeaway #{event.gameType}
.starting-lineup-table
table
thead
tr
th(colspan='4') Starting
tbody
each i in [0,1,2,3,4,5,6,7,8,9,10]
- if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){
tr
th.sequence.label #{event_lineup_entries_offense[i].sequence +1}
td.player-name #{event_lineup_entries_offense[i].member.lastName}
td.jersey-number #{event_lineup_entries_offense[i].member.jerseyNumber}
td.position #{event_lineup_entries_offense[i].label}
- } else {
tr
th.sequence.label
td.player-name
td.jersey-number
td.position
tr
td
td
td
td
- }
.substitution-table
table(style='width: 100%')
thead
tr
th Substitution
tbody
each i in [0,1,2,3,4,5,6,7,8,9,10,11]
tr
td.substitution
tr
td.substitution
section#lineup-card-exchange.lineup-card
.grid-container
.section-header.event-title #{event.formattedTitleForMultiTeam}
.starting-lineup-table
table.starting-lineup-table
thead
tr
th
th.player-name Name
th.jersey-number Num
th.position Pos
tbody
each _,i in Array(10)
- if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){
tr
th.sequence.label #{event_lineup_entries_offense[i].sequence+1}
td.player-name #{event_lineup_entries_offense[i].member.lastName}
td.jersey-number #{event_lineup_entries_offense[i].member.jerseyNumber}
td.position #{event_lineup_entries_offense[i].label}
- } else {
tr
th.sequence.label
td.player-name
td.jersey-number
td.position
tr
td
td
td
td
- }
#page-2.sheet.gamecard
section#back-cover
section#front-cover
div.grid-container
.section-header
.bar-right.homeaway #{event.gameType}
.event-title
| #{event.startDate.toLocaleDateString("en-us",{weekday: "long", day: "numeric",month: "short"})},
| #{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})}
br
| #{event.locationName}
div.team
|#{event.team.name}
div.opponent
|#{event.opponent.name}
section#lineup-card-dugout-empty.lineup-card
.grid-container
.section-header
.starting-lineup-table
table
thead
tr
th(colspan='4') Starting
tbody
each _ in Array(12)
tr
th.sequence.label
td.player-name
td.jersey-number
td.position
.substitution-table
table(style='width: 100%')
thead
tr
th Substitution
tbody
each _ in Array(11)
tr
td.substitution
tr
td.substitution
section#lineup-card-exchange-empty.lineup-card
.grid-container
.section-header
.starting-lineup-table
table.starting-lineup-table
thead
tr
th
th.player-name Name
th.jersey-number Num
th.position Pos
tbody
each _ in Array(12)
tr
th.sequence.label
td.player-name
td.jersey-number
td.position

View File

@@ -19,7 +19,7 @@ block content
a(class="Button m-auto" href=`/${team_id}/event/${event.id}/lineup`)
i(class="bi bi-clipboard")
span.mx-1 Lineup
a(class="Button m-auto" href=`/${team_id}/event/${event.id}/gamecard`)
a(class="Button m-auto" href=`/${team_id}/event/${event.id}/lineup_card`)
i(class="bi bi-book")
span.mx-1 Game Card
a(class="Button m-auto" href=`https://go.teamsnap.com/${team_id}/schedule/view_game/${event.id}`)

14
src/views/members.pug Normal file
View File

@@ -0,0 +1,14 @@
extends base.pug
block content
.Panel
.Panel-header
.Panel-title Roster
.Panel-body
each member in members
a(class="" href=`/${team_id}/member/${member.id}`).Panel-row--withCells
.Panel-cell
|#{member.firstName}
.Panel-cell
|#{member.lastName}

View File

@@ -1,14 +1,5 @@
html
head
meta(charset='utf-8')
meta(name='viewport' content='width=device-width, initial-scale=1')
title BenchCoach - Teams
link(rel='stylesheet' href='/css/bootstrap.min.css')
link(rel='stylesheet' href='/font/bootstrap-icons.min.css')
link(rel='stylesheet' href='/css/teamsnap-ui.css')
body
.container
extends base
block content
.Panel
.Panel-header
.Panel-title #{opponent.name}
@@ -39,7 +30,7 @@ body
a.Button(target="_blank" rel="noopener noreferrer" href=`https://go.teamsnap.com/${team_id}/files/list/${team_media_group.id}`) Upload
else
a.Button(target="_blank" rel="noopener noreferrer" href=`https://go.teamsnap.com/${team_id}/files/`) Upload
Button(onclick=`navigator.clipboard.writeText("team-logo-${opponent.id}.png");`).Button
Button(onclick=`navigator.clipboard.writeText("opponent-logo-${opponent.id}.png");`).Button
i.bi.bi-clipboard.Icon
span Copy Filename
.Panel-row.Panel-row--withCells

View File

@@ -1,18 +1,10 @@
html
head
meta(charset='utf-8')
meta(name='viewport' content='width=device-width, initial-scale=1')
title BenchCoach - Teams
link(rel='stylesheet' href='/css/bootstrap.min.css')
link(rel='stylesheet' href='/font/bootstrap-icons.min.css')
link(rel='stylesheet' href='/css/teamsnap-ui.css')
extends base
body
.container
.Panel
.Panel-header
.Panel-title Opponents
.Panel-body
each opponent in opponents
.Panel-row
a(class='opponent' href=`/${team.id}/opponent/${opponent.id}`) #{opponent.name}
block content
.Panel
.Panel-header
.Panel-title Opponents
.Panel-body
each opponent in opponents
.Panel-row
a(class='opponent' href=`/${team.id}/opponent/${opponent.id}`) #{opponent.name}

View File

@@ -1,17 +0,0 @@
extends base.pug
include widgets/availability-progress-bar.pug
block content
.Panel
.Panel-header
.Panel-title roster
.Panel-body
each member in members
- var availabilitySummary = availabilitySummaries.find((a)=>a.eventId==event.id)
a(class="event list-group-item" href=`/${team_id}/event/${event.id}`).Panel-row--withCells
.Panel-cell
|#{member.firstName}
.Panel-cell
|#{event.lastName}

View File

@@ -15,7 +15,7 @@ block content
</svg>
| Events
.Panel-row
a(href=`/${team.id}/roster`)
a(href=`/${team.id}/members`)
<svg viewBox="0 0 960 960" class="Icon"><path d="M959 714c2 8 .7 16-4 24-5.3 7.3-12.3 11.7-21 13-9.3 4.7-66.7 8.3-172 11-28.7-60.7-73.3-109.7-134-147-17.3-10-39-19.7-65-29-6.7-3.3-12-5.7-16-7 31.3-49.3 52.3-97 63-143s13.5-84.3 8.5-115-15.2-58.3-30.5-83c-28-47.3-63.3-80.7-106-100 18.7-24 37.2-41.7 55.5-53S579 68 607 68c33.3 0 63.7 7.7 91 23s49.3 36.7 66 64c43.3 71.3 32.3 157.7-33 259-20 28.7-27.7 50.7-23 66 2 7.3 8 14.5 18 21.5s18.7 12.2 26 15.5 19.3 8.3 36 15c26 10.7 43.7 18.7 53 24 64.7 39.3 104 92 118 158zM352 892c-70 0-132-1-186-3s-90.2-4-108.5-6-28.8-3.3-31.5-4c-8.7-.7-15.7-5-21-13-4.7-6.7-6-14.7-4-24 14-66 53-118.7 117-158 8-4.7 25.7-12.7 53-24 16.7-6.7 28.7-11.7 36-15s16-8.5 26-15.5 16-14.2 18-21.5c4.7-14.7-2.7-36.7-22-66-65.3-102-76.7-188.3-34-259 16.7-27.3 38.8-48.7 66.5-64s57.8-23 90.5-23c33.3 0 63.8 7.7 91.5 23s49.8 36.7 66.5 64c42.7 70.7 31.3 157-34 259-19.3 29.3-26.7 51.3-22 66 2 7.3 8 14.5 18 21.5s18.7 12.2 26 15.5 19.3 8.3 36 15c27.3 11.3 45 19.3 53 24 63.3 39.3 102.7 92 118 158 2 8.7.3 16.7-5 24-5.3 8-12.3 12.3-21 13-2.7.7-13.3 2-32 4s-55 4-109 6-116 3-186 3z"></path></svg>
| Roster
.Panel-row