From 7cc686f23087a29ddc5718682a3f823a9d263434 Mon Sep 17 00:00:00 2001 From: Gregor Vostrak Date: Wed, 13 Mar 2024 19:44:25 +0100 Subject: [PATCH] restructure timetracker tests to use promise all (#7) * restructure timetracker tests to use promise all * remove unused variables & lint --------- Co-authored-by: Gregor Vostrak --- docker-compose.yml | 2 +- e2e/timetracker.spec.ts | 627 ++++++++++-------- .../Dashboard/TeamActivityCardEntry.vue | 2 +- resources/js/Components/DialogModal.vue | 3 +- resources/js/Pages/API/Index.vue | 3 +- resources/js/Pages/Auth/ForgotPassword.vue | 4 +- resources/js/Pages/Auth/Login.vue | 4 +- resources/js/Pages/Dashboard.vue | 2 +- resources/js/Pages/MainContainer.vue | 8 +- resources/js/Pages/Profile/Show.vue | 3 +- resources/js/Pages/Teams/Create.vue | 3 +- resources/js/Pages/Teams/Show.vue | 3 +- 12 files changed, 346 insertions(+), 318 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 0ccaecc6..0ebc2d6b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -95,7 +95,7 @@ services: - sail - reverse-proxy playwright: - image: mcr.microsoft.com/playwright:v1.41.1-jammy + image: mcr.microsoft.com/playwright:v1.42.1-jammy command: ['npx', 'playwright', 'test', '--ui-port=8080', '--ui-host=0.0.0.0'] working_dir: /src extra_hosts: diff --git a/e2e/timetracker.spec.ts b/e2e/timetracker.spec.ts index f7efd2ed..06cebfd0 100644 --- a/e2e/timetracker.spec.ts +++ b/e2e/timetracker.spec.ts @@ -17,8 +17,8 @@ async function assertThatTimerHasStarted(page) { ); } -async function assertNewTimeEntryResponse(page) { - await page.waitForResponse(async (response) => { +function newTimeEntryResponse(page) { + return page.waitForResponse(async (response) => { return ( response.status() === 201 && (await response.headerValue('Content-Type')) === @@ -37,7 +37,7 @@ async function assertNewTimeEntryResponse(page) { }); } -async function assertThatTimerIsStoped(page) { +async function assertThatTimerIsStopped(page) { await page.locator( '[data-testid="dashboard_timer"] [data-testid="timer_button"].bg-accent-300/70' ); @@ -47,29 +47,32 @@ test('test that starting and stopping a timer without description and project wo page, }) => { await goToDashboard(page); + const newTimeEntryPromise = newTimeEntryResponse(page); await startOrStopTimerWithButton(page); - await assertNewTimeEntryResponse(page); + await newTimeEntryPromise; await assertThatTimerHasStarted(page); await page.waitForTimeout(1500); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end !== null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration !== null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); - await assertThatTimerIsStoped(page); + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end !== null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration !== null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + startOrStopTimerWithButton(page), + ]); + await assertThatTimerIsStopped(page); }); test('test that starting and stopping a timer with a description works', async ({ @@ -79,226 +82,251 @@ test('test that starting and stopping a timer with a description works', async ( await page .getByTestId('time_entry_description') .fill('New Time Entry Description'); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 201 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end === null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === - 'New Time Entry Description' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration === null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 201 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end === null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === + 'New Time Entry Description' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration === null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + startOrStopTimerWithButton(page), + ]); await assertThatTimerHasStarted(page); - await page.waitForTimeout(500); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end !== null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === - 'New Time Entry Description' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration !== null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); - await assertThatTimerIsStoped(page); + await page.waitForTimeout(1500); + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end !== null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === + 'New Time Entry Description' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration !== null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + await startOrStopTimerWithButton(page), + ]); + await assertThatTimerIsStopped(page); }); test('test that starting and updating the description while running works', async ({ page, }) => { await goToDashboard(page); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 201 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end === null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration === null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); + + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 201 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end === null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration === null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + startOrStopTimerWithButton(page), + ]); await assertThatTimerHasStarted(page); await page.waitForTimeout(500); await page .getByTestId('time_entry_description') .fill('New Time Entry Description'); - await page.getByTestId('time_entry_description').press('Tab'); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end === null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === - 'New Time Entry Description' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration === null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); + + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end === null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === + 'New Time Entry Description' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration === null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + page.getByTestId('time_entry_description').press('Tab'), + ]); await page.waitForTimeout(500); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end !== null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === - 'New Time Entry Description' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration !== null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); - await assertThatTimerIsStoped(page); + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end !== null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === + 'New Time Entry Description' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration !== null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + await startOrStopTimerWithButton(page), + ]); + await assertThatTimerIsStopped(page); }); test('test that starting and updating the time while running works', async ({ page, }) => { await goToDashboard(page); - await startOrStopTimerWithButton(page); - const createResponse = await page.waitForResponse(async (response) => { - return ( - response.status() === 201 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end === null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration === null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); + const [createResponse] = await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 201 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end === null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration === null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + await startOrStopTimerWithButton(page), + ]); await assertThatTimerHasStarted(page); await page.waitForTimeout(500); await page.getByTestId('time_entry_time').fill('20min'); - await page.getByTestId('time_entry_time').press('Tab'); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.start !== - (await createResponse.json()).data.start && - (await response.json()).data.end === null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration === null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); + + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.start !== + (await createResponse.json()).data.start && + (await response.json()).data.end === null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration === null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + page.getByTestId('time_entry_time').press('Tab'), + ]); + await expect(page.getByTestId('time_entry_time')).toHaveValue(/00:20/); await page.waitForTimeout(500); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end !== null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration !== null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); - await assertThatTimerIsStoped(page); + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end !== null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration !== null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + startOrStopTimerWithButton(page), + ]); + await assertThatTimerIsStopped(page); }); test('test that entering a time starts the timer on blur', async ({ page }) => { await goToDashboard(page); await page.getByTestId('time_entry_time').fill('20min'); - await page.getByTestId('time_entry_time').press('Tab'); - await page.waitForResponse(async (response) => { - return ( - response.status() === 201 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end === null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration === null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 201 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end === null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration === null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + page.getByTestId('time_entry_time').press('Tab'), + ]); await assertThatTimerHasStarted(page); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end !== null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration !== null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); + + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end !== null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration !== null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + startOrStopTimerWithButton(page), + ]); await page.locator( '[data-testid="dashboard_timer"] [data-testid="timer_button"].bg-accent-300/70' ); @@ -309,44 +337,48 @@ test('test that entering a time starts the timer on enter', async ({ }) => { await goToDashboard(page); await page.getByTestId('time_entry_time').fill('20min'); - await page.getByTestId('time_entry_time').press('Enter'); - await page.waitForResponse(async (response) => { - return ( - response.status() === 201 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end === null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration === null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 201 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end === null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration === null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + page.getByTestId('time_entry_time').press('Enter'), + ]); await assertThatTimerHasStarted(page); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end !== null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration !== null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([]) - ); - }); - await assertThatTimerIsStoped(page); + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end !== null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration !== null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([]) + ); + }), + startOrStopTimerWithButton(page), + ]); + await assertThatTimerIsStopped(page); }); test('test that adding a new tag works', async ({ page }) => { @@ -354,15 +386,19 @@ test('test that adding a new tag works', async ({ page }) => { await goToDashboard(page); await page.getByTestId('tag_dropdown').click(); await page.getByTestId('tag_dropdown_search').fill(newTagName); - await page.getByTestId('tag_dropdown_search').press('Enter'); - await page.waitForResponse(async (response) => { - return ( - response.status() === 201 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.name === newTagName - ); - }); + + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 201 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.name === newTagName + ); + }), + page.getByTestId('tag_dropdown_search').press('Enter'), + ]); + await expect(page.getByTestId('tag_dropdown_search')).toHaveValue(''); await expect(page.getByRole('option', { name: newTagName })).toBeVisible(); }); @@ -372,24 +408,24 @@ test('test that adding a new tag when the timer is running', async ({ }) => { const newTagName = 'New Tag' + Math.floor(Math.random() * 10000); await goToDashboard(page); - await startOrStopTimerWithButton(page); - await assertNewTimeEntryResponse(page); + await Promise.all([ + newTimeEntryResponse(page), + startOrStopTimerWithButton(page), + ]); await assertThatTimerHasStarted(page); await page.getByTestId('tag_dropdown').click(); await page.getByTestId('tag_dropdown_search').fill(newTagName); - await page.getByTestId('tag_dropdown_search').press('Enter'); - const tagCreateResponse = await page.waitForResponse(async (response) => { - return ( - response.status() === 201 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.name === newTagName - ); - }); - await expect(page.getByTestId('tag_dropdown_search')).toHaveValue(''); - - await expect(page.getByRole('option', { name: newTagName })).toBeVisible(); - + const [tagCreateResponse] = await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 201 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.name === newTagName + ); + }), + page.getByTestId('tag_dropdown_search').press('Enter'), + ]); await page.waitForResponse(async (response) => { return ( response.status() === 200 && @@ -407,27 +443,32 @@ test('test that adding a new tag when the timer is running', async ({ JSON.stringify([(await tagCreateResponse.json()).data.id]) ); }); + await expect(page.getByTestId('tag_dropdown_search')).toHaveValue(''); + await expect(page.getByRole('option', { name: newTagName })).toBeVisible(); await page.getByTestId('tag_dropdown_search').press('Escape'); await page.waitForTimeout(1000); - await startOrStopTimerWithButton(page); - await page.waitForResponse(async (response) => { - return ( - response.status() === 200 && - (await response.headerValue('Content-Type')) === - 'application/json' && - (await response.json()).data.id !== null && - (await response.json()).data.start !== null && - (await response.json()).data.end !== null && - (await response.json()).data.project_id === null && - (await response.json()).data.description === '' && - (await response.json()).data.task_id === null && - (await response.json()).data.duration !== null && - (await response.json()).data.user_id !== null && - JSON.stringify((await response.json()).data.tags) === - JSON.stringify([(await tagCreateResponse.json()).data.id]) - ); - }); - await assertThatTimerIsStoped(page); + + await Promise.all([ + page.waitForResponse(async (response) => { + return ( + response.status() === 200 && + (await response.headerValue('Content-Type')) === + 'application/json' && + (await response.json()).data.id !== null && + (await response.json()).data.start !== null && + (await response.json()).data.end !== null && + (await response.json()).data.project_id === null && + (await response.json()).data.description === '' && + (await response.json()).data.task_id === null && + (await response.json()).data.duration !== null && + (await response.json()).data.user_id !== null && + JSON.stringify((await response.json()).data.tags) === + JSON.stringify([(await tagCreateResponse.json()).data.id]) + ); + }), + startOrStopTimerWithButton(page), + ]); + await assertThatTimerIsStopped(page); }); // test that adding a new tag when the timer is running diff --git a/resources/js/Components/Dashboard/TeamActivityCardEntry.vue b/resources/js/Components/Dashboard/TeamActivityCardEntry.vue index a359d475..3d30ca31 100644 --- a/resources/js/Components/Dashboard/TeamActivityCardEntry.vue +++ b/resources/js/Components/Dashboard/TeamActivityCardEntry.vue @@ -9,7 +9,7 @@ defineProps<{