Compare commits

..

7 Commits

Author SHA1 Message Date
Constantin Graf
aedb9a016d Fixed modules service providers 2025-07-23 15:52:31 +02:00
Gregor Vostrak
43073b5be2 fix design inconsistency in timeentryaggregaterow 2025-07-18 16:38:09 +02:00
Gregor Vostrak
9589c9106d e2e: make sure reporting tests do not check the dropdown values when verifying table results 2025-07-17 18:41:48 +02:00
Gregor Vostrak
8a0d2235a8 fix flakyness in e2e tests for reporting 2025-07-17 18:38:21 +02:00
Gregor Vostrak
38f38790d5 change font to inter, scale down fonts, improve rounding/filter elements 2025-07-17 18:38:21 +02:00
Gregor Vostrak
e3cfc155b8 add rounding frontend to reports, and support for shared reports 2025-07-17 18:38:21 +02:00
Constantin Graf
4b726635b2 Add rounding feature 2025-07-17 18:38:21 +02:00
5 changed files with 14 additions and 7 deletions

View File

@@ -118,7 +118,8 @@
"extra": { "extra": {
"laravel": { "laravel": {
"dont-discover": [ "dont-discover": [
"laravel/telescope" "laravel/telescope",
"nwidart/laravel-modules"
] ]
} }
}, },

View File

@@ -9,6 +9,7 @@ use App\Enums\NumberFormat;
use App\Enums\TimeFormat; use App\Enums\TimeFormat;
use Illuminate\Support\Facades\Facade; use Illuminate\Support\Facades\Facade;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Nwidart\Modules\LaravelModulesServiceProvider;
return [ return [
@@ -197,6 +198,7 @@ return [
App\Providers\FortifyServiceProvider::class, App\Providers\FortifyServiceProvider::class,
App\Providers\JetstreamServiceProvider::class, App\Providers\JetstreamServiceProvider::class,
// Warning: Do not add TelescopeServiceProvider here since it is already conditionally registered in AppServiceProvider // Warning: Do not add TelescopeServiceProvider here since it is already conditionally registered in AppServiceProvider
LaravelModulesServiceProvider::class,
])->toArray(), ])->toArray(),
/* /*

View File

@@ -114,8 +114,8 @@ test('test that project filtering works in reporting', async ({ page }) => {
await page.waitForLoadState('networkidle'); await page.waitForLoadState('networkidle');
// Verify only project1 time entries are shown // Verify only project1 time entries are shown
await expect(page.getByText(project1)).toBeVisible(); await expect(page.getByTestId('reporting_view').getByText(project1)).toBeVisible();
await expect(page.getByText(project2)).not.toBeVisible(); await expect(page.getByTestId('reporting_view').getByText(project2)).not.toBeVisible();
}); });
test('test that tag filtering works in reporting', async ({ page }) => { test('test that tag filtering works in reporting', async ({ page }) => {
@@ -142,7 +142,7 @@ test('test that tag filtering works in reporting', async ({ page }) => {
]); ]);
// Verify only time entries with tag1 are shown // Verify only time entries with tag1 are shown
await expect(page.getByText('1h 00min').first()).toBeVisible(); await expect(page.getByTestId('reporting_view').getByText('1h 00min').first()).toBeVisible();
}); });
test('test that billable status filtering works in reporting', async ({ page }) => { test('test that billable status filtering works in reporting', async ({ page }) => {
@@ -164,7 +164,7 @@ test('test that billable status filtering works in reporting', async ({ page })
]); ]);
await page.waitForLoadState('networkidle'); await page.waitForLoadState('networkidle');
await expect(page.getByText('1h 00min').first()).toBeVisible(); await expect(page.getByTestId('reporting_view').getByText('1h 00min').first()).toBeVisible();
}); });

View File

@@ -154,7 +154,7 @@ function onSelectChange(checked: boolean) {
"></BillableToggleButton> "></BillableToggleButton>
<div class="flex-1"> <div class="flex-1">
<button <button
:class="twMerge('text-text-secondary w-[110px] px-1 py-1.5 bg-transparent text-center hover:bg-card-background rounded-lg border border-transparent hover:border-card-border text-sm font-medium focus-visible:outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:bg-tertiary', organization?.time_format === '12-hours' ? 'w-[160px]' : 'w-[110px]')" :class="twMerge('text-text-secondary px-1 py-1.5 bg-transparent text-center hover:bg-card-background rounded-lg border border-transparent hover:border-card-border text-sm font-medium focus-visible:outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:bg-tertiary', organization?.time_format === '12-hours' ? 'w-[170px]' : 'w-[120px]')"
@click="expanded = !expanded"> @click="expanded = !expanded">
{{ formatStartEnd(timeEntry.start, timeEntry.end, organization?.time_format) }} {{ formatStartEnd(timeEntry.start, timeEntry.end, organization?.time_format) }}
</button> </button>

View File

@@ -21,13 +21,17 @@ abstract class TestCase extends BaseTestCase
{ {
use CreatesApplication; use CreatesApplication;
protected bool $mockBillingContract = true;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
Mail::fake(); Mail::fake();
LogFake::bind(); LogFake::bind();
Http::preventStrayRequests(); Http::preventStrayRequests();
$this->actAsOrganizationWithoutSubscriptionAndWithoutTrial(); if ($this->mockBillingContract) {
$this->actAsOrganizationWithoutSubscriptionAndWithoutTrial();
}
// Note: The following line can be used to test timezone edge cases. // Note: The following line can be used to test timezone edge cases.
// $this->travelTo(Carbon::now()->timezone('Europe/Vienna')->setHour(0)->setMinute(59)->setSecond(0)); // $this->travelTo(Carbon::now()->timezone('Europe/Vienna')->setHour(0)->setMinute(59)->setSecond(0));
} }