Update
This commit is contained in:
@@ -362,6 +362,17 @@ body.is-dragging-window .ui-tool-title-bar {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.side-panel-window {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.side-panel-window > .window-content {
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.participants-window {
|
||||
min-height: 24rem;
|
||||
}
|
||||
@@ -421,12 +432,13 @@ body.is-dragging-window .ui-tool-title-bar {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.55rem;
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.participants-scroll {
|
||||
flex: 1;
|
||||
min-height: 13rem;
|
||||
min-height: 0;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
|
||||
@@ -203,7 +203,9 @@ function parseNumericVote(value) {
|
||||
|
||||
function calculateSummary(state) {
|
||||
const rows = new Map();
|
||||
const numericVotes = [];
|
||||
const scoreVotes = [];
|
||||
const cardIndexByValue = new Map(state.cards.map((cardValue, index) => [cardValue, index]));
|
||||
let hasNumericVote = false;
|
||||
|
||||
state.participants.forEach((participant) => {
|
||||
if (!participant.connected) {
|
||||
@@ -221,26 +223,42 @@ function calculateSummary(state) {
|
||||
|
||||
const numeric = parseNumericVote(participant.voteValue);
|
||||
if (numeric !== null) {
|
||||
numericVotes.push(numeric);
|
||||
hasNumericVote = true;
|
||||
scoreVotes.push(numeric);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cardIndexByValue.has(participant.voteValue)) {
|
||||
scoreVotes.push(cardIndexByValue.get(participant.voteValue));
|
||||
}
|
||||
});
|
||||
|
||||
let average = null;
|
||||
if (numericVotes.length > 0) {
|
||||
average = numericVotes.reduce((acc, value) => acc + value, 0) / numericVotes.length;
|
||||
if (scoreVotes.length > 0) {
|
||||
average = scoreVotes.reduce((acc, value) => acc + value, 0) / scoreVotes.length;
|
||||
}
|
||||
|
||||
let averageCard = null;
|
||||
let recommended = null;
|
||||
if (!hasNumericVote && average !== null && state.cards.length > 0) {
|
||||
const roundedIndex = Math.min(
|
||||
state.cards.length - 1,
|
||||
Math.max(0, Math.round(average)),
|
||||
);
|
||||
averageCard = state.cards[roundedIndex];
|
||||
recommended = state.cards[roundedIndex];
|
||||
} else {
|
||||
const deckNumeric = state.cards
|
||||
.map(parseNumericVote)
|
||||
.filter((value) => value !== null)
|
||||
.sort((a, b) => a - b);
|
||||
|
||||
let recommended = null;
|
||||
if (average !== null && deckNumeric.length > 0) {
|
||||
recommended = deckNumeric.find((value) => value >= average) ?? deckNumeric[deckNumeric.length - 1];
|
||||
}
|
||||
}
|
||||
|
||||
return { rows, average, recommended };
|
||||
return { rows, average, recommended, averageCard };
|
||||
}
|
||||
|
||||
function renderSummary(state) {
|
||||
@@ -251,7 +269,7 @@ function renderSummary(state) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { rows, average, recommended } = calculateSummary(state);
|
||||
const { rows, average, recommended, averageCard } = calculateSummary(state);
|
||||
summaryBody.innerHTML = '';
|
||||
|
||||
if (rows.size === 0) {
|
||||
@@ -274,7 +292,11 @@ function renderSummary(state) {
|
||||
});
|
||||
}
|
||||
|
||||
if (averageCard !== null) {
|
||||
summaryAverage.textContent = `Average: ${averageCard}`;
|
||||
} else {
|
||||
summaryAverage.textContent = average === null ? 'Average: -' : `Average: ${average.toFixed(2)}`;
|
||||
}
|
||||
summaryRecommended.textContent = recommended === null ? 'Recommended: -' : `Recommended: ${recommended}`;
|
||||
}
|
||||
|
||||
@@ -400,6 +422,34 @@ function updateShareLink() {
|
||||
shareLinkInput.value = raw ? `${window.location.origin}${raw}` : '';
|
||||
}
|
||||
|
||||
function fallbackCopyFromShareInput() {
|
||||
shareLinkInput.focus();
|
||||
shareLinkInput.select();
|
||||
shareLinkInput.setSelectionRange(0, shareLinkInput.value.length);
|
||||
document.execCommand('copy');
|
||||
}
|
||||
|
||||
async function selectAndCopyShareLink() {
|
||||
if (!shareLinkInput.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
shareLinkInput.focus();
|
||||
shareLinkInput.select();
|
||||
shareLinkInput.setSelectionRange(0, shareLinkInput.value.length);
|
||||
|
||||
if (!navigator.clipboard || !window.isSecureContext) {
|
||||
fallbackCopyFromShareInput();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await navigator.clipboard.writeText(shareLinkInput.value);
|
||||
} catch (_err) {
|
||||
fallbackCopyFromShareInput();
|
||||
}
|
||||
}
|
||||
|
||||
function connectSSE() {
|
||||
if (eventSource) {
|
||||
eventSource.close();
|
||||
@@ -502,6 +552,9 @@ async function changeName() {
|
||||
revealBtn.addEventListener('click', () => adminAction('reveal'));
|
||||
resetBtn.addEventListener('click', () => adminAction('reset'));
|
||||
shareAdminToggle.addEventListener('change', updateShareLink);
|
||||
shareLinkInput.addEventListener('click', () => {
|
||||
void selectAndCopyShareLink();
|
||||
});
|
||||
changeNameBtn.addEventListener('click', () => {
|
||||
void changeName();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user