Merge pull request #41 from Pandipipas/replace-save-buttons-with-disk-icons

feat(scoreboard): guardar cambios por campo con iconos en ScoreboardPanel
This commit is contained in:
Pandipipas
2026-02-11 23:46:48 +01:00
committed by GitHub
@@ -135,6 +135,38 @@ const rightCanSave = computed(
&& !playerExistsByGamertag(scoreboardStore.scoreboard.rightNameOverride), && !playerExistsByGamertag(scoreboardStore.scoreboard.rightNameOverride),
); );
const leftTeamChanged = computed(() => {
const player = leftSelectedPlayer.value;
if (!player) {
return false;
}
return player.team !== scoreboardStore.scoreboard.leftTeamOverride;
});
const rightTeamChanged = computed(() => {
const player = rightSelectedPlayer.value;
if (!player) {
return false;
}
return player.team !== scoreboardStore.scoreboard.rightTeamOverride;
});
const leftCountryChanged = computed(() => {
const player = leftSelectedPlayer.value;
if (!player) {
return false;
}
return player.country !== scoreboardStore.scoreboard.leftCountryOverride;
});
const rightCountryChanged = computed(() => {
const player = rightSelectedPlayer.value;
if (!player) {
return false;
}
return player.country !== scoreboardStore.scoreboard.rightCountryOverride;
});
const leftPendingGamertag = computed(() => { const leftPendingGamertag = computed(() => {
const override = scoreboardStore.scoreboard.leftNameOverride.trim(); const override = scoreboardStore.scoreboard.leftNameOverride.trim();
if (override) { if (override) {
@@ -151,26 +183,33 @@ const rightPendingGamertag = computed(() => {
return rightSelectedPlayer.value?.gamertag ?? ''; return rightSelectedPlayer.value?.gamertag ?? '';
}); });
const leftHasSelectedPlayerChanges = computed(() => { const leftNameChanged = computed(() => {
const player = leftSelectedPlayer.value; const player = leftSelectedPlayer.value;
if (!player) { if (!player) {
return false; return false;
} }
return player.gamertag !== leftPendingGamertag.value return player.gamertag !== leftPendingGamertag.value;
|| player.team !== scoreboardStore.scoreboard.leftTeamOverride
|| player.country !== scoreboardStore.scoreboard.leftCountryOverride;
}); });
const rightHasSelectedPlayerChanges = computed(() => { const rightNameChanged = computed(() => {
const player = rightSelectedPlayer.value; const player = rightSelectedPlayer.value;
if (!player) { if (!player) {
return false; return false;
} }
return player.gamertag !== rightPendingGamertag.value return player.gamertag !== rightPendingGamertag.value;
|| player.team !== scoreboardStore.scoreboard.rightTeamOverride
|| player.country !== scoreboardStore.scoreboard.rightCountryOverride;
}); });
const leftCanSaveNameChange = computed(
() => leftNameChanged.value && !playerExistsByGamertag(leftPendingGamertag.value),
);
const rightCanSaveNameChange = computed(
() => rightNameChanged.value && !playerExistsByGamertag(rightPendingGamertag.value),
);
const leftShowsNameSave = computed(() => leftCanSave.value || leftCanSaveNameChange.value);
const rightShowsNameSave = computed(() => rightCanSave.value || rightCanSaveNameChange.value);
const startLeftCustomPlayer = () => { const startLeftCustomPlayer = () => {
const wasCustom = scoreboardStore.scoreboard.leftPlayerId === CUSTOM_LEFT_PLAYER_ID; const wasCustom = scoreboardStore.scoreboard.leftPlayerId === CUSTOM_LEFT_PLAYER_ID;
scoreboardStore.scoreboard.leftPlayerId = CUSTOM_LEFT_PLAYER_ID; scoreboardStore.scoreboard.leftPlayerId = CUSTOM_LEFT_PLAYER_ID;
@@ -372,7 +411,39 @@ const saveRightPlayer = () => {
rightInput.value = gamertag; rightInput.value = gamertag;
}; };
const saveLeftSelectedPlayerChanges = () => { const saveLeftNameChange = () => {
const playerId = scoreboardStore.scoreboard.leftPlayerId;
const player = playersStore.players[playerId];
if (!player) {
return;
}
if (!leftCanSaveNameChange.value) {
return;
}
playersStore.upsertPlayer(playerId, {
...player,
gamertag: leftPendingGamertag.value,
});
scoreboardStore.scoreboard.leftNameOverride = '';
};
const saveRightNameChange = () => {
const playerId = scoreboardStore.scoreboard.rightPlayerId;
const player = playersStore.players[playerId];
if (!player) {
return;
}
if (!rightCanSaveNameChange.value) {
return;
}
playersStore.upsertPlayer(playerId, {
...player,
gamertag: rightPendingGamertag.value,
});
scoreboardStore.scoreboard.rightNameOverride = '';
};
const saveLeftTeamChange = () => {
const playerId = scoreboardStore.scoreboard.leftPlayerId; const playerId = scoreboardStore.scoreboard.leftPlayerId;
const player = playersStore.players[playerId]; const player = playersStore.players[playerId];
if (!player) { if (!player) {
@@ -380,14 +451,11 @@ const saveLeftSelectedPlayerChanges = () => {
} }
playersStore.upsertPlayer(playerId, { playersStore.upsertPlayer(playerId, {
...player, ...player,
gamertag: leftPendingGamertag.value,
team: scoreboardStore.scoreboard.leftTeamOverride, team: scoreboardStore.scoreboard.leftTeamOverride,
country: scoreboardStore.scoreboard.leftCountryOverride,
}); });
scoreboardStore.scoreboard.leftNameOverride = '';
}; };
const saveRightSelectedPlayerChanges = () => { const saveRightTeamChange = () => {
const playerId = scoreboardStore.scoreboard.rightPlayerId; const playerId = scoreboardStore.scoreboard.rightPlayerId;
const player = playersStore.players[playerId]; const player = playersStore.players[playerId];
if (!player) { if (!player) {
@@ -395,11 +463,48 @@ const saveRightSelectedPlayerChanges = () => {
} }
playersStore.upsertPlayer(playerId, { playersStore.upsertPlayer(playerId, {
...player, ...player,
gamertag: rightPendingGamertag.value,
team: scoreboardStore.scoreboard.rightTeamOverride, team: scoreboardStore.scoreboard.rightTeamOverride,
});
};
const saveLeftCountryChange = () => {
const playerId = scoreboardStore.scoreboard.leftPlayerId;
const player = playersStore.players[playerId];
if (!player) {
return;
}
playersStore.upsertPlayer(playerId, {
...player,
country: scoreboardStore.scoreboard.leftCountryOverride,
});
};
const saveRightCountryChange = () => {
const playerId = scoreboardStore.scoreboard.rightPlayerId;
const player = playersStore.players[playerId];
if (!player) {
return;
}
playersStore.upsertPlayer(playerId, {
...player,
country: scoreboardStore.scoreboard.rightCountryOverride, country: scoreboardStore.scoreboard.rightCountryOverride,
}); });
scoreboardStore.scoreboard.rightNameOverride = ''; };
const onLeftNameSave = () => {
if (leftCanSave.value) {
saveLeftPlayer();
return;
}
saveLeftNameChange();
};
const onRightNameSave = () => {
if (rightCanSave.value) {
saveRightPlayer();
return;
}
saveRightNameChange();
}; };
@@ -504,14 +609,38 @@ watchEffect(() => {
@focus="onLeftFocus" @focus="onLeftFocus"
@blur="onLeftBlur" @blur="onLeftBlur"
@update:model-value="onLeftSelect" @update:model-value="onLeftSelect"
>
<template #append>
<QBtn
v-if="leftShowsNameSave"
flat
round
dense
icon="save"
color="primary"
@click.stop="onLeftNameSave"
/> />
</template>
</QSelect>
<QInput <QInput
v-model="scoreboardStore.scoreboard.leftTeamOverride" v-model="scoreboardStore.scoreboard.leftTeamOverride"
label="Team" label="Team"
dense dense
outlined outlined
class="q-mt-sm" class="q-mt-sm"
>
<template #append>
<QBtn
v-if="leftTeamChanged"
flat
round
dense
icon="save"
color="primary"
@click.stop="saveLeftTeamChange"
/> />
</template>
</QInput>
<QSelect <QSelect
v-model="scoreboardStore.scoreboard.leftCountryOverride" v-model="scoreboardStore.scoreboard.leftCountryOverride"
v-model:input-value="leftCountryInput" v-model:input-value="leftCountryInput"
@@ -530,23 +659,19 @@ watchEffect(() => {
outlined outlined
class="q-mt-sm" class="q-mt-sm"
@filter="onLeftCountryFilter" @filter="onLeftCountryFilter"
/> >
<template #append>
<QBtn <QBtn
v-if="leftCanSave" v-if="leftCountryChanged"
color="primary" flat
round
dense
icon="save" icon="save"
label="Save player"
class="q-mt-sm"
@click="saveLeftPlayer"
/>
<QBtn
v-if="leftHasSelectedPlayerChanges"
color="primary" color="primary"
icon="save" @click.stop="saveLeftCountryChange"
label="Save player changes"
class="q-mt-sm q-ml-sm"
@click="saveLeftSelectedPlayerChanges"
/> />
</template>
</QSelect>
<QInput <QInput
v-model.number="scoreboardStore.leftScore" v-model.number="scoreboardStore.leftScore"
type="number" type="number"
@@ -589,14 +714,38 @@ watchEffect(() => {
@focus="onRightFocus" @focus="onRightFocus"
@blur="onRightBlur" @blur="onRightBlur"
@update:model-value="onRightSelect" @update:model-value="onRightSelect"
>
<template #append>
<QBtn
v-if="rightShowsNameSave"
flat
round
dense
icon="save"
color="primary"
@click.stop="onRightNameSave"
/> />
</template>
</QSelect>
<QInput <QInput
v-model="scoreboardStore.scoreboard.rightTeamOverride" v-model="scoreboardStore.scoreboard.rightTeamOverride"
label="Team" label="Team"
dense dense
outlined outlined
class="q-mt-sm" class="q-mt-sm"
>
<template #append>
<QBtn
v-if="rightTeamChanged"
flat
round
dense
icon="save"
color="primary"
@click.stop="saveRightTeamChange"
/> />
</template>
</QInput>
<QSelect <QSelect
v-model="scoreboardStore.scoreboard.rightCountryOverride" v-model="scoreboardStore.scoreboard.rightCountryOverride"
v-model:input-value="rightCountryInput" v-model:input-value="rightCountryInput"
@@ -615,23 +764,19 @@ watchEffect(() => {
outlined outlined
class="q-mt-sm" class="q-mt-sm"
@filter="onRightCountryFilter" @filter="onRightCountryFilter"
/> >
<template #append>
<QBtn <QBtn
v-if="rightCanSave" v-if="rightCountryChanged"
color="primary" flat
round
dense
icon="save" icon="save"
label="Save player"
class="q-mt-sm"
@click="saveRightPlayer"
/>
<QBtn
v-if="rightHasSelectedPlayerChanges"
color="primary" color="primary"
icon="save" @click.stop="saveRightCountryChange"
label="Save player changes"
class="q-mt-sm q-ml-sm"
@click="saveRightSelectedPlayerChanges"
/> />
</template>
</QSelect>
<QInput <QInput
v-model.number="scoreboardStore.rightScore" v-model.number="scoreboardStore.rightScore"
type="number" type="number"