Merged
Conversation
… where they have access to
…d class merging conflicts
…e value, fixes #994
…d dashboard reporting table
…ProjectDropdown; fix e2e
…reduce visual complexity
columns in the project table
add request classes and fix collection typing for clients, tasks and tags
this is a trade-off where for non grid aligned entries, the cursor position is a bit off, but data and visual are stil in sync. otherwise fc overrides height on drag, causing flickers.
the synced snapDuration cause incorrect noops on updates f.e. 15:55-16:00 on a 15 minute snap
Added a warning about AI slop pull requests and potential bans.
Contributor
There was a problem hiding this comment.
Pull request overview
This PR merges the v0.11.0 feature work, updating the frontend UI patterns (field components, table sorting/persistence, query-based data loading), enhancing reporting/dashboard UX, and modernizing backend/API behaviors and E2E infrastructure.
Changes:
- Migrate multiple Vue pages/components from Pinia store fetches and ad-hoc inputs to query-based hooks and shared
Field/*UI primitives. - Add persistent client/member sorting state and sortable headings via TanStack Vue Table across multiple tables.
- Improve backend request validation/filtering (including
nonesentinel support), add default API ordering, and upgrade Playwright CI to sharded blob reporting with Octane/FrankenPHP.
Reviewed changes
Copilot reviewed 202 out of 385 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| resources/js/Pages/ProjectShow.vue | Switches project/members/tasks/org loading to query hooks; minor UI tweaks. |
| resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue | Replaces label/error components with Field/* primitives. |
| resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue | Uses Field/* primitives for confirmation code UI. |
| resources/js/Pages/Profile/Partials/ThemeForm.vue | Replaces native select with UI Select + Field/*. |
| resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue | Uses Field/* error rendering. |
| resources/js/Pages/Profile/Partials/DeleteUserForm.vue | Uses Field/* error rendering. |
| resources/js/Pages/Profile/Partials/ApiTokensForm.vue | Uses Field/* and refines help text structure. |
| resources/js/Pages/Members.vue | Persists member table sort state in storage and passes to table. |
| resources/js/Pages/Dashboard.vue | Adjusts dashboard grid spacing. |
| resources/js/Pages/Clients.vue | Moves to query hook + persistent sort state; removes search UI. |
| resources/js/Pages/Auth/TwoFactorChallenge.vue | Uses Field/* primitives for auth challenge inputs. |
| resources/js/Pages/Auth/ResetPassword.vue | Uses Field/* primitives for reset form inputs. |
| resources/js/Pages/Auth/Register.vue | Uses Field/* primitives; refactors terms/newsletter layout. |
| resources/js/Pages/Auth/Login.vue | Uses Field/* primitives for login inputs. |
| resources/js/Pages/Auth/ForgotPassword.vue | Uses Field/* primitives for forgot password inputs. |
| resources/js/Pages/Auth/ConfirmPassword.vue | Uses Field/* primitives for confirm password input. |
| resources/js/Pages/API/Partials/ApiTokenManager.vue | Uses Field/* primitives for API token creation. |
| resources/js/Components/ui/tabs/TabsList.vue | Updates TabsList styling classes. |
| resources/js/Components/ui/select/SelectTrigger.vue | Expands SelectTrigger API (sizes/variants/chevron) and styling. |
| resources/js/Components/ui/number-field/NumberFieldInput.vue | Adjusts number input sizing/typography classes. |
| resources/js/Components/ui/label/index.ts | Adds barrel export for Label component. |
| resources/js/Components/ui/label/Label.vue | Introduces reusable Label wrapper using reka-ui. |
| resources/js/Components/ui/dropdown-menu/DropdownMenuContent.vue | Updates dropdown content border styling token. |
| resources/js/Components/ui/dialog/DialogContent.vue | Improves dialog content layout and pointer-events behavior. |
| resources/js/Components/ui/calendar/CalendarDateInput.vue | Switches popover imports; tweaks button props usage. |
| resources/js/Components/ui/calendar/CalendarCellTrigger.vue | Updates selected-day styling tokens. |
| resources/js/Components/ui/calendar/CalendarCell.vue | Replaces twMerge with cn for class merging. |
| resources/js/Components/ui/button/index.ts | Removes legacy button component exports from this path. |
| resources/js/Components/ui/button/Button.vue | Removes legacy Button component implementation. |
| resources/js/Components/ui/alert-dialog/AlertDialogCancel.vue | Replaces twMerge with cn. |
| resources/js/Components/ui/alert-dialog/AlertDialogAction.vue | Replaces twMerge with cn. |
| resources/js/Components/TimeTracker.vue | Moves tracker data to query hooks; introduces new time entry query/mutations usage. |
| resources/js/Components/ResponsiveNavLink.vue | Enables Inertia link prefetch. |
| resources/js/Components/NavigationSidebarLink.vue | Enables Inertia link prefetch. |
| resources/js/Components/NavLink.vue | Enables Inertia mount-prefetch for nav links. |
| resources/js/Components/DropdownLink.vue | Enables Inertia link prefetch. |
| resources/js/Components/Dashboard/ThisWeekOverview.vue | Adds staleTime to queries; tweaks chart axis; adds reporting table. |
| resources/js/Components/Dashboard/TeamActivityCardEntry.vue | Updates spacing/typography styles. |
| resources/js/Components/Dashboard/TeamActivityCard.vue | Adjusts empty/short list padding behavior. |
| resources/js/Components/Dashboard/RecentlyTrackedTasksCardEntry.vue | Uses query hooks; tweaks layout; adjusts start/stop button props. |
| resources/js/Components/Dashboard/RecentlyTrackedTasksCard.vue | Updates icon version; adjusts empty state spacing. |
| resources/js/Components/Dashboard/LastSevenDaysCard.vue | Tightens TS types for placeholder data. |
| resources/js/Components/Dashboard/DayOverviewCardEntry.vue | Updates spacing/typography classes. |
| resources/js/Components/Dashboard/DayOverviewCardChart.vue | Simplifies axes visibility config. |
| resources/js/Components/Dashboard/DashboardCard.vue | Updates wrapping/layout styling. |
| resources/js/Components/CurrentSidebarTimer.vue | Uses secondary variant for start/stop control. |
| resources/js/Components/ConfirmsPassword.vue | Uses Field/* primitives for password confirm input. |
| resources/js/Components/Common/User/UserTimezoneMismatchModal.vue | Replaces bespoke modal with shared TimezoneMismatchModal wrapper. |
| resources/js/Components/Common/Task/TaskTableHeading.vue | Updates heading typography colors. |
| resources/js/Components/Common/Task/TaskMultiselectDropdown.vue | Moves to tasks query hook; adds submit event and “No Task” label. |
| resources/js/Components/Common/Task/TaskEditModal.vue | Uses FieldGroup/Field/FieldLabel for task editing. |
| resources/js/Components/Common/Task/TaskCreateModal.vue | Uses FieldGroup + new project trigger button UI for dropdown. |
| resources/js/Components/Common/Tag/TagTableRow.vue | Adds edit flow and modal; gates options by update/delete permissions. |
| resources/js/Components/Common/Tag/TagTableHeading.vue | Adds sortable heading rendering with chevrons. |
| resources/js/Components/Common/Tag/TagTable.vue | Migrates tags to query hook; adds TanStack sorting and props-driven sort state. |
| resources/js/Components/Common/Tag/TagMoreOptionsDropdown.vue | Adds “Edit” option and permission checks. |
| resources/js/Components/Common/Tag/TagEditModal.vue | Adds tag editing modal component. |
| resources/js/Components/Common/TableHeading.vue | Adjusts responsive font sizing class usage. |
| resources/js/Components/Common/TabBar/TabBarItem.vue | Tweaks padding and line-height consistency. |
| resources/js/Components/Common/Reporting/ReportingTabNavbar.vue | Refactors tabs into computed list with hover prefetch + model updates. |
| resources/js/Components/Common/Reporting/ReportingRow.vue | Adds optional cost column support and adjusts layout. |
| resources/js/Components/Common/Reporting/ReportingRoundingControls.vue | Migrates labels to Field; updates SelectTrigger sizing + button variant. |
| resources/js/Components/Common/Reporting/ReportingGroupBySelect.vue | Replaces custom select dropdown with UI Select. |
| resources/js/Components/Common/Reporting/ReportingExportButton.vue | Replaces custom dropdown with dropdown-menu primitives. |
| resources/js/Components/Common/Reporting/ReportingChart.vue | Simplifies chart axis visibility config. |
| resources/js/Components/Common/Report/ReportTableRow.vue | Adds created/expires columns with localized formatting; improves visibility display. |
| resources/js/Components/Common/Report/ReportTableHeading.vue | Adds columns and updates heading styling. |
| resources/js/Components/Common/Report/ReportTable.vue | Updates grid template and empty-state colspan. |
| resources/js/Components/Common/Report/ReportEditModal.vue | Migrates to Field primitives; adds UTC/local conversion for expiration via computed. |
| resources/js/Components/Common/Report/ReportCreateModal.vue | Adds query invalidation and redirect; converts public_until to UTC on submit. |
| resources/js/Components/Common/ProjectMember/ProjectMemberTableRow.vue | Switches member loading to query hook. |
| resources/js/Components/Common/ProjectMember/ProjectMemberTableHeading.vue | Updates heading typography colors. |
| resources/js/Components/Common/ProjectMember/ProjectMemberMoreOptionsDropdown.vue | Switches member loading to query hook. |
| resources/js/Components/Common/ProjectMember/ProjectMemberEditModal.vue | Migrates label usage to Field primitives. |
| resources/js/Components/Common/Project/constants.ts | Adds NO_CLIENT_ID sentinel constant for filtering. |
| resources/js/Components/Common/Project/ProjectsFilterDropdown.vue | Adds new project filtering dropdown (status + client selection). |
| resources/js/Components/Common/Project/ProjectTableRow.vue | Switches to query hooks; adds status/billable columns; layout updates. |
| resources/js/Components/Common/Project/ProjectTableHeading.vue | Adds sortable headings with chevrons for multiple columns. |
| resources/js/Components/Common/Project/ProjectStatusFilterBadge.vue | Adds status filter badge component with dropdown behavior. |
| resources/js/Components/Common/Project/ProjectMultiselectDropdown.vue | Switches to query hook; adds submit event and “No Project” label. |
| resources/js/Components/Common/Project/ProjectEditModal.vue | Migrates to Field primitives and updates client dropdown trigger UI. |
| resources/js/Components/Common/Project/ProjectClientFilterBadge.vue | Adds client filter badge component with multi-select dropdown. |
| resources/js/Components/Common/Project/BaseFilterBadge.vue | Adds reusable filter badge wrapper with dropdown + remove action. |
| resources/js/Components/Common/PageTitle.vue | Adjusts icon sizing responsiveness. |
| resources/js/Components/Common/Member/MemberTableRow.vue | Updates icons and status rendering; removes forced refetch call. |
| resources/js/Components/Common/Member/MemberTableHeading.vue | Adds sortable headings with chevrons. |
| resources/js/Components/Common/Member/MemberTable.vue | Migrates to query hook; adds TanStack sorting and emits sort changes. |
| resources/js/Components/Common/Member/MemberRoleSelect.vue | Replaces custom select dropdown with UI Select. |
| resources/js/Components/Common/Member/MemberMultiselectDropdown.vue | Switches to query hook; adds submit event. |
| resources/js/Components/Common/Member/MemberMergeModal.vue | Invalidates members query after merge. |
| resources/js/Components/Common/Member/MemberMakePlaceholderModal.vue | Invalidates members query after deactivation. |
| resources/js/Components/Common/Member/MemberInviteModal.vue | Uses Field/* primitives for invite form errors/labels. |
| resources/js/Components/Common/Member/MemberDeleteModal.vue | Uses Field/* primitives; invalidates members query after delete. |
| resources/js/Components/Common/Member/MemberBillableSelect.vue | Replaces custom select dropdown with UI Select. |
| resources/js/Components/Common/Invitation/InvitationTableHeading.vue | Updates heading typography colors. |
| resources/js/Components/Common/Client/ClientTableRow.vue | Adds status column; uses projects query; layout tweaks. |
| resources/js/Components/Common/Client/ClientTableHeading.vue | Adds sortable headings with chevrons. |
| resources/js/Components/Common/Client/ClientTable.vue | Adds TanStack sorting + project count derived from projects query. |
| resources/js/Components/Common/Client/ClientMultiselectDropdown.vue | Switches to query hook; adds submit event and “No Client” label. |
| resources/js/Components/Common/Client/ClientCreateModal.vue | Migrates label usage to Field primitives. |
| resources/js/Components/CommandPalette/index.ts | Adds barrel export for CommandPaletteProvider. |
| playwright/fixtures.ts | Adds API-based auth + admin/employee fixtures; reduces UI auth overhead. |
| playwright/config.ts | Adds Mailpit base URL and shared test password constant. |
| playwright.config.ts | Enables parallel workers, blob reporter in CI, and conditional Firefox project. |
| package.json | Adds workspaces; upgrades several dependencies/devDependencies. |
| e2e/utils/tags.ts | Switches to type-only Page import. |
| e2e/utils/table.ts | Adds helper to extract ordered row names from a table locator. |
| e2e/utils/money.ts | Switches to type-only NumberFormat import. |
| e2e/utils/mailpit.ts | Adds Mailpit helpers to extract invitation/reset URLs. |
| e2e/utils/currentTimeEntry.ts | Improves timer button targeting + assertions using test ids and visibility. |
| database/factories/UserFactory.php | Adds import and simplifies @see reference for FileHelpers. |
| config/excel.php | Uses imported DefaultValueBinder constant reference. |
| config/auth.php | Imports User model and uses short class reference. |
| config/audit.php | Imports resolver/model classes and uses short class references. |
| config/app.php | Imports service providers and uses short class references in providers list. |
| bootstrap/app.php | Imports core classes and uses short class references. |
| app/Service/TimeEntryService.php | Fixes “round up” behavior to keep exact-boundary end times unchanged. |
| app/Service/TimeEntryFilter.php | Adds none sentinel support for multiple filters (client/project/tag/task). |
| app/Service/ReportExport/CsvExport.php | Imports CSV exception classes and updates @throws annotations. |
| app/Service/MemberService.php | Sets placeholder user’s current_team_id during placeholder creation. |
| app/Service/Dto/ReportPropertiesDto.php | Accepts none sentinel in ID collections; validates others as UUIDs. |
| app/Service/DashboardService.php | Constrains weekly billable amount query by organization id. |
| app/Policies/OrganizationPolicy.php | Updates authorization to use PermissionStore for org updates. |
| app/Models/Organization.php | Simplifies return type to imported Jetstream Team. |
| app/Http/Resources/V1/Tag/TagCollection.php | Implements PaginatedResourceCollection. |
| app/Http/Resources/V1/Client/ClientCollection.php | Implements PaginatedResourceCollection. |
| app/Http/Requests/V1/TimeEntry/TimeEntryUpdateRequest.php | Restricts project validation via permission-aware visibility constraints. |
| app/Http/Requests/V1/TimeEntry/TimeEntryUpdateMultipleRequest.php | Restricts project validation via permission-aware visibility constraints. |
| app/Http/Requests/V1/TimeEntry/TimeEntryStoreRequest.php | Restricts project validation via permission-aware visibility constraints. |
| app/Http/Requests/V1/TimeEntry/TimeEntryIndexRequest.php | Allows none sentinel for *_ids with custom closure validation. |
| app/Http/Requests/V1/TimeEntry/TimeEntryIndexExportRequest.php | Adds client_ids handling and none sentinel validation closures. |
| app/Http/Requests/V1/TimeEntry/TimeEntryAggregateRequest.php | Allows none sentinel for *_ids with custom closure validation. |
| app/Http/Requests/V1/TimeEntry/TimeEntryAggregateExportRequest.php | Allows none sentinel for *_ids with custom closure validation. |
| app/Http/Requests/V1/Task/TaskIndexRequest.php | Adds pagination parameter validation. |
| app/Http/Requests/V1/Tag/TagIndexRequest.php | Adds pagination parameter validation. |
| app/Http/Requests/V1/Report/ReportStoreRequest.php | Allows none sentinel in report properties filter IDs. |
| app/Http/Requests/V1/Report/ReportIndexRequest.php | Adds pagination parameter validation. |
| app/Http/Requests/V1/ProjectMember/ProjectMemberIndexRequest.php | Adds pagination parameter validation. |
| app/Http/Requests/V1/Member/MemberMergeIntoRequest.php | Updates phpdoc return type aliasing. |
| app/Http/Requests/V1/Member/MemberIndexRequest.php | Adds pagination parameter validation. |
| app/Http/Requests/V1/Invitation/InvitationIndexRequest.php | Adds pagination parameter validation. |
| app/Http/Middleware/RedirectIfAuthenticated.php | Updates phpdoc closure signature formatting. |
| app/Http/Middleware/ForceJsonResponse.php | Updates phpdoc closure signature formatting. |
| app/Http/Middleware/ForceHttps.php | Updates phpdoc closure signature formatting. |
| app/Http/Kernel.php | Replaces FQCN middleware references with imports and short class names. |
| app/Http/Controllers/Api/V1/TimeEntryController.php | Uses imported Carbon type in signature. |
| app/Http/Controllers/Api/V1/TaskController.php | Adds default ordering for task pagination. |
| app/Http/Controllers/Api/V1/TagController.php | Adds index request (pagination validation). |
| app/Http/Controllers/Api/V1/ReportController.php | Adds index request (pagination validation); allows updating public_until. |
| app/Http/Controllers/Api/V1/ProjectMemberController.php | Adds index request + default ordering for pagination. |
| app/Http/Controllers/Api/V1/ProjectController.php | Adds default ordering for project pagination. |
| app/Http/Controllers/Api/V1/MemberController.php | Adds default ordering for member pagination. |
| app/Http/Controllers/Api/V1/InvitationController.php | Adds default ordering for invitation pagination. |
| app/Http/Controllers/Api/V1/ChartController.php | Increases tracked hours history window from 60 to 100 days. |
| app/Http/Controllers/Api/V1/ApiTokenController.php | Adds default ordering for token listing. |
| app/Filament/Resources/UserResource.php | Simplifies Filament component references. |
| app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php | Maps selected member to user/org before save. |
| app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php | Maps selected member to user/org before create. |
| app/Filament/Resources/TimeEntryResource.php | Changes selection to member_id and adds task_id field; simplifies columns. |
| app/Filament/Resources/ReportResource.php | Simplifies Filament component references. |
| app/Filament/Resources/OrganizationResource/RelationManagers/UsersRelationManager.php | Simplifies Filament component references. |
| app/Filament/Resources/OrganizationResource.php | Simplifies Filament component references. |
| app/Filament/Resources/OrganizationInvitationResource.php | Simplifies Filament component references. |
| app/Filament/Resources/FailedJobResource.php | Fixes Filament Textarea component naming. |
| README.md | Adds contribution policy language. |
| .github/workflows/playwright.yml | Adds sharding, Mailpit, Octane/FrankenPHP server, blob report merge/upload. |
| .env.ci | Configures SMTP via Mailpit in CI and sets Octane server variable. |
Comments suppressed due to low confidence (1)
package.json:93
- Several packages are bumped to major versions that were not released as of Aug 2025 (e.g., Vite 7, ECharts 6, Pinia 3, vue-echarts 8, vue-tsc 3). If these are intentional upgrades, double-check they exist, are compatible with your toolchain, and that the lockfile and CI environment are updated accordingly; otherwise installs may fail.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| 'update:filters': [filters: ProjectFilters]; | ||
| }>(); | ||
|
|
||
| const statusOptions = [ |
Comment on lines
+41
to
+47
| function updateStatus(status: 'active' | 'archived' | 'all') { | ||
| emit('update:filters', { | ||
| ...props.filters, | ||
| status, | ||
| }); | ||
| open.value = false; | ||
| } |
Comment on lines
+15
to
+21
| const props = defineProps<{ | ||
| tag: Tag; | ||
| }>(); | ||
|
|
||
| const tagBody = ref<UpdateTagBody>({ | ||
| name: props.tag.name, | ||
| }); |
| $report->share_secret = null; | ||
| $report->public_until = null; | ||
| } | ||
| } elseif ($report->is_public && $request->has('public_until')) { |
|
|
||
| class TimeEntryFilter | ||
| { | ||
| public const string NONE_VALUE = 'none'; |
Comment on lines
17
to
19
| const projectCount = computed(() => { | ||
| return projects.value.filter((project) => project.client_id === props.client.id).length; | ||
| return projects.value.filter((projects) => projects.client_id === props.client.id).length; | ||
| }); |
Comment on lines
31
to
33
| const projectTasksCount = computed(() => { | ||
| return tasks.value.filter((task) => task.project_id === props.project.id).length; | ||
| }); |
Comment on lines
+27
to
+31
| class: _, | ||
| showChevron: __, | ||
| variant: ___, | ||
| active: ____, | ||
| size: _____, |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.