From 61b6dc8a35c003d29e3e03ab2184cf77be71679b Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Fri, 15 Mar 2024 08:38:15 -0500 Subject: [PATCH] add dr, dh flags --- src/controllers/eventlineup.js | 42 +++++++++++++---- src/lib/utils.js | 5 ++- src/public/js/eventlineup.js | 45 ++++++++++++++++--- .../eventlineup/partials/email_table.hbs | 6 +-- src/views/eventlineup/partials/slot.hbs | 19 ++++++-- 5 files changed, 94 insertions(+), 23 deletions(-) diff --git a/src/controllers/eventlineup.js b/src/controllers/eventlineup.js index a5b9687..e998fc1 100644 --- a/src/controllers/eventlineup.js +++ b/src/controllers/eventlineup.js @@ -15,9 +15,11 @@ const statusCodeIcons = { } exports.helpers = { - flagsString: (flags) => flags?.join(","), + flagsString: (flags) => { + return flags != null ? Array.from(flags).join(",") : '' + }, plus1: (i) => Number(i)+1, - positions: () => ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"], + positions: () => ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH", "DR"], defense_positions: () => ["C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "P"], avail_status_code_icon: (status_code) => { const icon_classes = { @@ -39,7 +41,21 @@ exports.helpers = { return `` }, positionLabelWithoutFlags: (label) => { - return label.replace(/(.*?)\s\[(.*?)\]/, "$1"); + const {positionLabelWithoutFlags} = parsePositionLabel(label); + return positionLabelWithoutFlags + }, + positionLabelWithoutPOFlag: (label) => { + const {positionLabelWithoutFlags, positionFlags} = parsePositionLabel(label); + positionFlags.delete('PO') + return compilePositionLabel(positionLabelWithoutFlags, positionFlags) + }, + positionFlags: (label)=> { + const {positionFlags} = parsePositionLabel(label); + return `[${Array.from(positionFlags).join(",")}]` + }, + hasPositionFlags: (label) => { + const {positionLabelWithoutFlags, positionFlags} = parsePositionLabel(label); + return positionFlags.size > 0; }, comparePositionWithFlags: (labelWithoutFlags, eventLineupEntry, options) => { labelWithFlags = eventLineupEntry?.label @@ -52,12 +68,12 @@ exports.helpers = { isInStartingLineup: (member) => { if (member.benchcoach.eventLineupEntry == null || member.benchcoach.eventLineupEntry.label == '') return false; const {positionFlags} = parsePositionLabel(member.benchcoach.eventLineupEntry?.label); - return (positionFlags != "PO") + return (!positionFlags.has("PO")) }, isInPositionOnly: (member) => { if (!member.benchcoach || member.benchcoach.eventLineupEntry == null) return false; const {positionFlags} = parsePositionLabel(member.benchcoach.eventLineupEntry?.label); - return (member.benchcoach.eventLineupEntry != null && positionFlags == "PO") + return (member.benchcoach.eventLineupEntry != null && positionFlags.has("PO")) }, isInBench: (member) => { if ((member.benchcoach.eventLineupEntry != null && member.benchcoach.eventLineupEntry.label != '') || member.isNonPlayer) return false; @@ -143,29 +159,39 @@ exports.postEventLineup = async (req,res) => { if (body.memberId == null) {res.status(400).end();return} await Promise.all(req.promises); const eventLineupEntries = req.event_lineup.eventLineupEntries - const {newEventLineupEntries} = processPostedEventLineupEntries(body, eventLineupEntries, req.event_lineup) + 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 != '') { + if (lineupEntryId != '' && lineupEntryLabel != '') { // Update lineup entry const eventLineupEntry = eventLineupEntries.find((e)=>e.id==Number(lineupEntryId)) eventLineupEntry.sequence = lineupEntrySequence eventLineupEntry.label = compilePositionLabel(lineupEntryLabel, lineupEntryFlags) newEventLineupEntries.push(eventLineupEntry) } + 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() @@ -179,5 +205,5 @@ const processPostedEventLineupEntries = (body, eventLineupEntries, eventLineup) // Skip lineup entry } }) - return {newEventLineupEntries, eventLineupEntries} + return {newEventLineupEntries, eventLineupEntries, deleteEventLineupEntries} } \ No newline at end of file diff --git a/src/lib/utils.js b/src/lib/utils.js index dcb6ff2..428b703 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -157,12 +157,13 @@ exports.parsePositionLabel = (label) => { const pattern = /(?[A-Z0-9]+)(?:\s\[(?.[A-z,]+)\])?/g const {pos, flags} = pattern.exec(label)?.groups || {} const positionLabelWithoutFlags= pos - const positionFlags = flags?.split(',').map(f=>f.trim()) || [] + const positionFlags = new Set(flags?.split(',').map(f=>f.trim()) || []) + return {positionLabelWithoutFlags, positionFlags} } exports.compilePositionLabel = (label, flags) => { - if (flags == null || flags == '' || flags.lengh == 0) { + if (flags == null || flags == '' || flags.size == 0) { return label } else { diff --git a/src/public/js/eventlineup.js b/src/public/js/eventlineup.js index c3a5e42..8d3dda2 100644 --- a/src/public/js/eventlineup.js +++ b/src/public/js/eventlineup.js @@ -39,6 +39,28 @@ function colorPositions() { } } +function initFlagsCheckboxes(){ + Array.from(document.querySelectorAll("[id^=event-lineup]")).forEach((bcLineup) => { + Array.from( + bcLineup.querySelectorAll( + ".starting .lineup-slot, \ + .position-only .lineup-slot, \ + .bench .lineup-slot" + ) + ).forEach((slot, i) => { + const flags = new Set(slot.querySelector("input[name*=flags]")?.value?.split(',')?.map(s=>s.trim())) || new Set() + console.log(slot, flags) + if (flags.has('DHd')) { + slot.querySelector('[name=flag-dhd]').checked = true; + } + + if (flags.has('DRd') ) { + slot.querySelector('[name=flag-drd]').checked = true; + } + })} + ) +} + function refreshLineup() { Array.from(document.querySelectorAll("[id^=event-lineup]")).forEach((bcLineup) => { Array.from( @@ -50,25 +72,36 @@ function refreshLineup() { ).forEach((slot, i) => { slot.querySelector("input[name*=sequence]").value = i; selected_position = slot.querySelector(".position-select-box option:checked"); + const flags = new Set(slot.querySelector("input[name*=flags]")?.value?.split(',')?.map(s=>s.trim())) || new Set() + + if (slot.querySelector('[name=flag-dhd]').checked) { + flags.add('DHd') + } else { + flags.delete('DHd') + } + + if (slot.querySelector('[name=flag-drd]').checked) { + flags.add('DRd') + } else { + flags.delete('DRd') + } + if (selected_position && selected_position.text != "--") { slot.querySelector("input[name*=label]").value = selected_position.text; } else { slot.querySelector("input[name*=label]").value = null; } if (slot.closest('.position-only')){ - const flags = new Set(slot.querySelector("input[name*=flags]").value.split(',').map(s=>s.trim())) flags.add('PO');flags.delete('') - slot.querySelector("input[name*=flags]").value = Array.from(flags).join(","); } else { - const flags = new Set(slot.querySelector("input[name*=flags]").value.split(',').map(s=>s.trim())) flags.delete('PO');flags.delete('') - slot.querySelector("input[name*=flags]").value = Array.from(flags).join(","); } if (slot.closest('.bench')){ slot.querySelector("input[name*=sequence]").value = ''; slot.querySelector("input[name*=label]").value = ''; } + slot.querySelector("input[name*=flags]").value = Array.from(flags).join(","); }); }); } @@ -105,7 +138,7 @@ for (bcLineup of document.querySelectorAll("[id^=event-lineup]")) { } for (lineup_slot of document.querySelectorAll("[id^=lineup-out] .lineup-slot")) { - const cells = lineup_slot.querySelectorAll('.Panel-cell:has(.sequence), .Panel-cell:has(.drag-handle), .Panel-cell:has(.position-select-box) ') + const cells = lineup_slot.querySelectorAll('.Panel-cell:has(.sequence), .Panel-cell:has(.drag-handle), .Panel-cell:has(.position-select-box), div.position-label-flags') Array.from(cells).forEach(cell=>{ cell.classList.add('u-hidden') }) @@ -503,7 +536,7 @@ function toggleChildSlots (element) { console.log(element.closest(".slot-set")) for (lineup_slot of document.querySelectorAll("[id^=lineup-out] .lineup-slot")) { console.log(lineup_slot) - const cells = lineup_slot.querySelectorAll('.Panel-cell:has(.sequence), .Panel-cell:has(.drag-handle), .Panel-cell:has(.position-select-box) ') + const cells = lineup_slot.querySelectorAll('.Panel-cell:has(.sequence), .Panel-cell:has(.drag-handle), .Panel-cell:has(.position-select-box), div.position-label-flags ') Array.from(cells).forEach(cell=>{ cell.classList.toggle('u-hidden') }) diff --git a/src/views/eventlineup/partials/email_table.hbs b/src/views/eventlineup/partials/email_table.hbs index ff655b8..8391514 100644 --- a/src/views/eventlineup/partials/email_table.hbs +++ b/src/views/eventlineup/partials/email_table.hbs @@ -11,10 +11,10 @@ {{#if (isInStartingLineup this)}} - {{plus1 this.benchcoach.eventLineupEntry.sequence}} + {{plus1 this.benchcoach.eventLineupEntry.sequence}}{{#if (hasPositionFlags this.benchcoach.eventLineupEntry.label)}} {{positionFlags this.benchcoach.eventLineupEntry.label}}{{/if}} {{this.lastName}}, {{this.firstName}} – #{{this.jerseyNumber}} - {{this.benchcoach.eventLineupEntry.label}} + {{positionLabelWithoutFlags this.benchcoach.eventLineupEntry.label}} {{/if}} {{/each}} @@ -26,7 +26,7 @@ {{this.lastName}}, {{this.firstName}} – #{{this.jerseyNumber}} - {{this.benchcoach.eventLineupEntry.label}} + {{positionLabelWithoutPOFlag this.benchcoach.eventLineupEntry.label}} {{/if}} {{/each}} diff --git a/src/views/eventlineup/partials/slot.hbs b/src/views/eventlineup/partials/slot.hbs index 2e937cb..34892e6 100644 --- a/src/views/eventlineup/partials/slot.hbs +++ b/src/views/eventlineup/partials/slot.hbs @@ -15,14 +15,15 @@ class="Panel-cell Panel-cell--header">
-
+
-
- {{#if member.benchcoach.availability}}{{{avail_status_code_icon member.benchcoach.availability.statusCode}}}{{/if}} + {{#if member.benchcoach.availability}}{{{avail_status_code_icon member.benchcoach.availability.statusCode}}}{{/if}} +
+
{{member.lastName}} @@ -32,6 +33,16 @@ #{{member.jerseyNumber}} +
+
+
+
+ + +
+
+ +