diff --git a/index.html b/index.html index 7154cd0..90147ce 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,8 @@ + + Splatoon3.ink diff --git a/src/assets/i18n/de-DE.json b/src/assets/i18n/de-DE.json index 8dced93..1b5e016 100644 --- a/src/assets/i18n/de-DE.json +++ b/src/assets/i18n/de-DE.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Wird geladen…", + "error": "Die Daten dieser Seite konnten nicht geladen werden. Bitte versuche es erneut.", + "retry": "Erneut versuchen" + }, "times": { "now": "Aktuell", "next": "Demnächst", diff --git a/src/assets/i18n/en-GB.json b/src/assets/i18n/en-GB.json index a97df95..f4c2079 100644 --- a/src/assets/i18n/en-GB.json +++ b/src/assets/i18n/en-GB.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Loading…", + "error": "Couldn’t load this page’s data. Please try again.", + "retry": "Try again" + }, "times": { "now": "Now", "next": "Next", diff --git a/src/assets/i18n/en-US.json b/src/assets/i18n/en-US.json index a4faba5..2dbda11 100644 --- a/src/assets/i18n/en-US.json +++ b/src/assets/i18n/en-US.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Loading…", + "error": "Couldn’t load this page’s data. Please try again.", + "retry": "Try again" + }, "times": { "now": "Now", "next": "Next", diff --git a/src/assets/i18n/es-ES.json b/src/assets/i18n/es-ES.json index 806de65..699bfc3 100644 --- a/src/assets/i18n/es-ES.json +++ b/src/assets/i18n/es-ES.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Cargando…", + "error": "No se pudieron cargar los datos de esta página. Inténtalo de nuevo.", + "retry": "Reintentar" + }, "times": { "now": "Actual", "next": "Próximo", diff --git a/src/assets/i18n/es-MX.json b/src/assets/i18n/es-MX.json index c529521..5a5a591 100644 --- a/src/assets/i18n/es-MX.json +++ b/src/assets/i18n/es-MX.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Cargando…", + "error": "No se pudieron cargar los datos de esta página. Inténtalo de nuevo.", + "retry": "Reintentar" + }, "times": { "now": "Actual", "next": "Siguiente", diff --git a/src/assets/i18n/fr-CA.json b/src/assets/i18n/fr-CA.json index 75c29c2..9230849 100644 --- a/src/assets/i18n/fr-CA.json +++ b/src/assets/i18n/fr-CA.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Chargement…", + "error": "Impossible de charger les données de cette page. Veuillez réessayer.", + "retry": "Réessayer" + }, "times": { "now": "Actuel", "next": "Suivant", diff --git a/src/assets/i18n/fr-FR.json b/src/assets/i18n/fr-FR.json index 0618b51..21955ae 100644 --- a/src/assets/i18n/fr-FR.json +++ b/src/assets/i18n/fr-FR.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Chargement…", + "error": "Impossible de charger les données de cette page. Veuillez réessayer.", + "retry": "Réessayer" + }, "times": { "now": "Actuel", "next": "Suivant", diff --git a/src/assets/i18n/it-IT.json b/src/assets/i18n/it-IT.json index fbb2113..250e173 100644 --- a/src/assets/i18n/it-IT.json +++ b/src/assets/i18n/it-IT.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Caricamento…", + "error": "Impossibile caricare i dati di questa pagina. Riprova.", + "retry": "Riprova" + }, "times": { "now": "In corso!", "next": "Prossimo", diff --git a/src/assets/i18n/ja-JP.json b/src/assets/i18n/ja-JP.json index 9829b3b..2d3c7a2 100644 --- a/src/assets/i18n/ja-JP.json +++ b/src/assets/i18n/ja-JP.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "読み込み中…", + "error": "このページのデータを読み込めませんでした。もう一度お試しください。", + "retry": "再試行" + }, "times": { "now": "オープン!", "next": "つぎ", diff --git a/src/assets/i18n/ko-KR.json b/src/assets/i18n/ko-KR.json index 940dc4a..57a1645 100644 --- a/src/assets/i18n/ko-KR.json +++ b/src/assets/i18n/ko-KR.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "불러오는 중…", + "error": "이 페이지의 데이터를 불러오지 못했습니다. 다시 시도해 주세요.", + "retry": "다시 시도" + }, "times": { "now": "오픈!", "next": "다음", diff --git a/src/assets/i18n/nl-NL.json b/src/assets/i18n/nl-NL.json index 7a6c977..ae316f8 100644 --- a/src/assets/i18n/nl-NL.json +++ b/src/assets/i18n/nl-NL.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Laden…", + "error": "De gegevens van deze pagina konden niet worden geladen. Probeer het opnieuw.", + "retry": "Opnieuw proberen" + }, "times": { "now": "Nu", "next": "Volgende", diff --git a/src/assets/i18n/ru-RU.json b/src/assets/i18n/ru-RU.json index 10e5bfb..4a25137 100644 --- a/src/assets/i18n/ru-RU.json +++ b/src/assets/i18n/ru-RU.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "Загрузка…", + "error": "Не удалось загрузить данные этой страницы. Попробуйте ещё раз.", + "retry": "Повторить" + }, "times": { "now": "Сейчас", "next": "Следующий", diff --git a/src/assets/i18n/zh-CN.json b/src/assets/i18n/zh-CN.json index d85de63..0a32362 100644 --- a/src/assets/i18n/zh-CN.json +++ b/src/assets/i18n/zh-CN.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "正在加载…", + "error": "无法加载此页面的数据。请重试。", + "retry": "重试" + }, "times": { "now": "开放!", "next": "下次", diff --git a/src/assets/i18n/zh-TW.json b/src/assets/i18n/zh-TW.json index d074754..2c63fdd 100644 --- a/src/assets/i18n/zh-TW.json +++ b/src/assets/i18n/zh-TW.json @@ -1,4 +1,9 @@ { + "loading": { + "label": "載入中…", + "error": "無法載入此頁面的資料。請再試一次。", + "retry": "重試" + }, "times": { "now": "開放!", "next": "下次", diff --git a/src/components/Debug/DevControls.vue b/src/components/Debug/DevControls.vue new file mode 100644 index 0000000..85e6e69 --- /dev/null +++ b/src/components/Debug/DevControls.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components/SalmonRunGearBox.vue b/src/components/SalmonRunGearBox.vue index 6c76558..1259ff8 100644 --- a/src/components/SalmonRunGearBox.vue +++ b/src/components/SalmonRunGearBox.vue @@ -2,7 +2,7 @@
- +
diff --git a/src/components/ScheduleBox.vue b/src/components/ScheduleBox.vue index 5b4c300..f76f88d 100644 --- a/src/components/ScheduleBox.vue +++ b/src/components/ScheduleBox.vue @@ -1,8 +1,12 @@ diff --git a/src/components/StageDialog.vue b/src/components/StageDialog.vue index d258d90..0b76c2b 100644 --- a/src/components/StageDialog.vue +++ b/src/components/StageDialog.vue @@ -5,7 +5,7 @@ Close
diff --git a/src/components/StageImage.vue b/src/components/StageImage.vue index 4d8aa0c..85aca79 100644 --- a/src/components/StageImage.vue +++ b/src/components/StageImage.vue @@ -1,14 +1,12 @@ diff --git a/src/components/loading/loading.test.mjs b/src/components/loading/loading.test.mjs new file mode 100644 index 0000000..8fb0c07 --- /dev/null +++ b/src/components/loading/loading.test.mjs @@ -0,0 +1,46 @@ +import { describe, expect, it } from 'vitest'; +import { createSSRApp } from 'vue'; +import { renderToString } from 'vue/server-renderer'; +import { createPinia } from 'pinia'; +import ScheduleBox from '@/components/ScheduleBox.vue'; +import DailyDropGear from '@/components/gear/DailyDropGear.vue'; +import RegularGear from '@/components/gear/RegularGear.vue'; +import SalmonRunBox from '@/components/salmonrun/SalmonRunBox.vue'; +import ChallengeScheduleBox from '@/components/challenge/ChallengeScheduleBox.vue'; +import SplatfestBox from '@/components/SplatfestBox.vue'; +import SplatfestResultsBox from '@/components/SplatfestResultsBox.vue'; + +async function render(component, props) { + const app = createSSRApp(component, props); + app.use(createPinia()); + app.config.globalProperties.$t = key => key; + + return renderToString(app); +} + +describe('loading cards without fetched data', () => { + it.each([ + ['schedule', ScheduleBox, { type: 'regular' }, 'bg-tapes', 'schedule.types.regular'], + ['daily drop', DailyDropGear, {}, 'bg-circles', 'gear.dailydrop'], + ['regular gear', RegularGear, {}, 'bg-paper', 'gear.sale'], + ['salmon run', SalmonRunBox, {}, 'bg-character', 'salmonrun.title'], + ['challenges', ChallengeScheduleBox, { type: 'challenge' }, 'bg-tapes', 'events.available'], + ['splatfest', SplatfestBox, {}, 'bg-camo-purple', 'festival.active'], + ['splatfest results', SplatfestResultsBox, {}, 'bg-camo-purple', 'festival.results.title'], + ])('renders %s with its normal artwork and static labels', async (_name, component, props, artwork, label) => { + const html = await render(component, { ...props, loading: true }); + + expect(html).toContain(artwork); + expect(html).toContain(label); + expect(html).not.toContain('times.checkback'); + expect(html).not.toContain('events.not_available'); + }); + + it('disables stage previews and the upcoming schedule button while loading', async () => { + const html = await render(ScheduleBox, { type: 'regular', loading: true }); + const buttons = html.match(/]*>/g); + + expect(buttons).toHaveLength(5); + expect(buttons.every(button => button.includes('disabled'))).toBe(true); + }); +}); diff --git a/src/components/salmonrun/ExpandedSalmonRunRow.vue b/src/components/salmonrun/ExpandedSalmonRunRow.vue index dd52332..927be66 100644 --- a/src/components/salmonrun/ExpandedSalmonRunRow.vue +++ b/src/components/salmonrun/ExpandedSalmonRunRow.vue @@ -1,15 +1,23 @@ diff --git a/src/components/salmonrun/SalmonRunWeapons.vue b/src/components/salmonrun/SalmonRunWeapons.vue index e638e5c..c1945bb 100644 --- a/src/components/salmonrun/SalmonRunWeapons.vue +++ b/src/components/salmonrun/SalmonRunWeapons.vue @@ -1,7 +1,9 @@