From b3f4aae68aab333884da3829a9075f5606f515f7 Mon Sep 17 00:00:00 2001
From: Pandipipas <62224708+Pandipipas@users.noreply.github.com>
Date: Wed, 11 Feb 2026 00:48:22 +0100
Subject: [PATCH] =?UTF-8?q?Mejorar=20override=20de=20jugadores=20y=20guard?=
=?UTF-8?q?ado=20r=C3=A1pido=20(#37)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../example/components/ScoreboardPanel.vue | 116 +++++++++++++++---
1 file changed, 100 insertions(+), 16 deletions(-)
diff --git a/src/dashboard/example/components/ScoreboardPanel.vue b/src/dashboard/example/components/ScoreboardPanel.vue
index 69555b9..5d46fa3 100644
--- a/src/dashboard/example/components/ScoreboardPanel.vue
+++ b/src/dashboard/example/components/ScoreboardPanel.vue
@@ -14,6 +14,8 @@ const rightInput = ref('');
const leftFocused = ref(false);
const rightFocused = ref(false);
+const normalizeName = (value: string) => value.trim().toLowerCase();
+
const filterOptions = (
options: { label: string; value: string }[],
needle: string,
@@ -40,6 +42,27 @@ const getPlayerLabel = (playerId: string) => {
return match ? match.label : '';
};
+const playerExistsByGamertag = (name: string) => {
+ const normalized = normalizeName(name);
+ if (!normalized) {
+ return false;
+ }
+ return Object.values(playersStore.players).some((player) => normalizeName(player.gamertag || '') === normalized);
+};
+
+const leftDisplayName = computed(() => scoreboardStore.scoreboard.leftNameOverride || getPlayerLabel(scoreboardStore.scoreboard.leftPlayerId));
+const rightDisplayName = computed(() => scoreboardStore.scoreboard.rightNameOverride || getPlayerLabel(scoreboardStore.scoreboard.rightPlayerId));
+
+const leftCanSave = computed(
+ () => Boolean(scoreboardStore.scoreboard.leftNameOverride.trim())
+ && !playerExistsByGamertag(scoreboardStore.scoreboard.leftNameOverride),
+);
+
+const rightCanSave = computed(
+ () => Boolean(scoreboardStore.scoreboard.rightNameOverride.trim())
+ && !playerExistsByGamertag(scoreboardStore.scoreboard.rightNameOverride),
+);
+
const leftPlayerOptions = computed(() => filterOptions(playerOptions.value, leftFilter.value));
const rightPlayerOptions = computed(() => filterOptions(playerOptions.value, rightFilter.value));
@@ -47,6 +70,7 @@ const onLeftFilter = (val: string, update: (fn: () => void) => void) => {
update(() => {
leftFilter.value = val;
leftInput.value = val;
+ scoreboardStore.scoreboard.leftNameOverride = val;
});
};
@@ -54,6 +78,7 @@ const onRightFilter = (val: string, update: (fn: () => void) => void) => {
update(() => {
rightFilter.value = val;
rightInput.value = val;
+ scoreboardStore.scoreboard.rightNameOverride = val;
});
};
@@ -65,7 +90,7 @@ const onLeftFocus = () => {
const onLeftBlur = () => {
leftFocused.value = false;
leftFilter.value = '';
- leftInput.value = getPlayerLabel(scoreboardStore.scoreboard.leftPlayerId);
+ leftInput.value = leftDisplayName.value;
};
const onRightFocus = () => {
@@ -76,28 +101,85 @@ const onRightFocus = () => {
const onRightBlur = () => {
rightFocused.value = false;
rightFilter.value = '';
- rightInput.value = getPlayerLabel(scoreboardStore.scoreboard.rightPlayerId);
+ rightInput.value = rightDisplayName.value;
};
const onLeftSelect = () => {
+ scoreboardStore.scoreboard.leftNameOverride = '';
leftFilter.value = '';
leftInput.value = getPlayerLabel(scoreboardStore.scoreboard.leftPlayerId);
};
const onRightSelect = () => {
+ scoreboardStore.scoreboard.rightNameOverride = '';
rightFilter.value = '';
rightInput.value = getPlayerLabel(scoreboardStore.scoreboard.rightPlayerId);
};
+const createPlayerId = (name: string) => {
+ const base = name
+ .trim()
+ .toLowerCase()
+ .normalize('NFD')
+ .replace(/[^\w\s-]/g, '')
+ .replace(/[\u0300-\u036f]/g, '')
+ .replace(/\s+/g, '-');
+
+ const seed = base || 'player';
+ let index = 1;
+ let candidate = seed;
+ while (playersStore.players[candidate]) {
+ index += 1;
+ candidate = `${seed}-${index}`;
+ }
+ return candidate;
+};
+
+const saveLeftPlayer = () => {
+ const gamertag = scoreboardStore.scoreboard.leftNameOverride.trim();
+ if (!gamertag || playerExistsByGamertag(gamertag)) {
+ return;
+ }
+ const id = createPlayerId(gamertag);
+ playersStore.upsertPlayer(id, {
+ gamertag,
+ name: '',
+ team: '',
+ country: '',
+ twitter: '',
+ });
+ scoreboardStore.scoreboard.leftPlayerId = id;
+ scoreboardStore.scoreboard.leftNameOverride = '';
+ leftInput.value = gamertag;
+};
+
+const saveRightPlayer = () => {
+ const gamertag = scoreboardStore.scoreboard.rightNameOverride.trim();
+ if (!gamertag || playerExistsByGamertag(gamertag)) {
+ return;
+ }
+ const id = createPlayerId(gamertag);
+ playersStore.upsertPlayer(id, {
+ gamertag,
+ name: '',
+ team: '',
+ country: '',
+ twitter: '',
+ });
+ scoreboardStore.scoreboard.rightPlayerId = id;
+ scoreboardStore.scoreboard.rightNameOverride = '';
+ rightInput.value = gamertag;
+};
+
watchEffect(() => {
if (!leftFocused.value) {
- leftInput.value = getPlayerLabel(scoreboardStore.scoreboard.leftPlayerId);
+ leftInput.value = leftDisplayName.value;
}
});
watchEffect(() => {
if (!rightFocused.value) {
- rightInput.value = getPlayerLabel(scoreboardStore.scoreboard.rightPlayerId);
+ rightInput.value = rightDisplayName.value;
}
});
@@ -158,12 +240,13 @@ watchEffect(() => {
@blur="onLeftBlur"
@update:model-value="onLeftSelect"
/>
-
{
@blur="onRightBlur"
@update:model-value="onRightSelect"
/>
-