Closed
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
Merges changes for the v0.11.0 feature set, including UI refactors to shared UI primitives, new filtering/sorting UX, API enhancements (notably invoicing-related time entry behavior), and broad tooling/CI updates (PHP 8.4, Node 22, Playwright/E2E improvements).
Changes:
- Refactors multiple Vue components to new
Select,Field,DropdownMenu, and related UI primitives; adds new filter UI components and table sorting. - Adds time entry
invoiced_atsupport with API filtering/guards, plus reporting/shared report UI updates. - Updates developer tooling: npm workspaces, dependency bumps, Playwright fixtures & E2E utilities, CI workflow adjustments.
Reviewed changes
Copilot reviewed 191 out of 452 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| resources/js/Components/Common/Reporting/ReportingRoundingControls.vue | Switches to new UI primitives (Field, Popover) and updates styling/sizes. |
| resources/js/Components/Common/Reporting/ReportingGroupBySelect.vue | Replaces legacy dropdown/badge trigger with new Select UI component. |
| resources/js/Components/Common/Reporting/ReportingFilterBar.vue | Adds a new reporting filter bar assembling multiple filter controls and rounding controls. |
| resources/js/Components/Common/Reporting/ReportingExportButton.vue | Migrates export dropdown to DropdownMenu primitives. |
| resources/js/Components/Common/Reporting/ReportingChart.vue | Simplifies axis rendering configuration (hides axis line/ticks/labels). |
| resources/js/Components/Common/Report/ReportTableRow.vue | Adds created/expires columns with localized date formatting and visibility icons. |
| resources/js/Components/Common/Report/ReportTableHeading.vue | Updates headings to match new report table columns. |
| resources/js/Components/Common/Report/ReportTable.vue | Adjusts report table grid template and empty-state col-span. |
| resources/js/Components/Common/Report/ReportEditModal.vue | Refactors form fields to Field components and adds UTC/local conversion for public_until. |
| resources/js/Components/Common/Report/ReportCreateModal.vue | Refactors form fields and adds query invalidation + redirect after creation. |
| resources/js/Components/Common/ProjectMember/ProjectMemberTableRow.vue | Migrates members data source from Pinia store to query hook. |
| resources/js/Components/Common/ProjectMember/ProjectMemberTableHeading.vue | Updates heading styles to new typography color convention. |
| resources/js/Components/Common/ProjectMember/ProjectMemberMoreOptionsDropdown.vue | Migrates members data source from Pinia store to query hook. |
| resources/js/Components/Common/ProjectMember/ProjectMemberEditModal.vue | Refactors label usage to Field components. |
| resources/js/Components/Common/Project/constants.ts | Adds a constant for “no client” sentinel filtering. |
| resources/js/Components/Common/Project/ProjectsFilterDropdown.vue | Introduces a project filter dropdown (status + client filters). |
| resources/js/Components/Common/Project/ProjectTableRow.vue | Migrates clients/tasks data access to query hooks and updates status display. |
| resources/js/Components/Common/Project/ProjectTableHeading.vue | Adds clickable sortable headings with chevrons. |
| resources/js/Components/Common/Project/ProjectTable.vue | Implements client-side sorting using TanStack Table + emits sort changes. |
| resources/js/Components/Common/Project/ProjectStatusFilterBadge.vue | Adds a reusable status filter badge component. |
| resources/js/Components/Common/Project/ProjectMultiselectDropdown.vue | Migrates projects source to query hook; adds “No Project” option and submit emit. |
| resources/js/Components/Common/Project/ProjectMoreOptionsDropdown.vue | Removes delete action from project dropdown UI. |
| resources/js/Components/Common/Project/ProjectEditModal.vue | Refactors labels to Field components; updates client dropdown trigger UI. |
| resources/js/Components/Common/Project/ProjectClientFilterBadge.vue | Adds a reusable client filter badge component. |
| resources/js/Components/Common/Project/BaseFilterBadge.vue | Adds a generic filter badge with dropdown + remove button. |
| resources/js/Components/Common/PageTitle.vue | Adjusts icon sizing/responsiveness. |
| resources/js/Components/Common/Member/MemberTableRow.vue | Updates icons and status rendering; removes store refresh call. |
| resources/js/Components/Common/Member/MemberTableHeading.vue | Adds sortable headings with chevrons. |
| resources/js/Components/Common/Member/MemberTable.vue | Adds client-side sorting via TanStack Table; fixes data-testid. |
| resources/js/Components/Common/Member/MemberRoleSelect.vue | Migrates role selection to Select UI component. |
| resources/js/Components/Common/Member/MemberMultiselectDropdown.vue | Migrates members source to query hook + submit emit. |
| resources/js/Components/Common/Member/MemberMergeModal.vue | Invalidates member queries after merge. |
| resources/js/Components/Common/Member/MemberMakePlaceholderModal.vue | Invalidates member queries after deactivation. |
| resources/js/Components/Common/Member/MemberInviteModal.vue | Refactors labels/errors to Field components. |
| resources/js/Components/Common/Member/MemberEditModal.vue | Refactors billable rate UX + integrates org default rate with tooltips. |
| resources/js/Components/Common/Member/MemberDeleteModal.vue | Refactors labels/errors to Field components + invalidates member queries. |
| resources/js/Components/Common/Member/MemberCombobox.vue | Rebuilds member picker with Radix combobox + dropdown behavior. |
| resources/js/Components/Common/Member/MemberBillableSelect.vue | Migrates billable select to Select UI component. |
| resources/js/Components/Common/Invitation/InvitationTableHeading.vue | Updates heading styles to new typography color convention. |
| resources/js/Components/Common/Client/ClientTableRow.vue | Migrates projects source to query hook and updates status display; removes delete handler. |
| resources/js/Components/Common/Client/ClientTableHeading.vue | Adds sortable headings with chevrons. |
| resources/js/Components/Common/Client/ClientTable.vue | Adds client-side sorting via TanStack Table. |
| resources/js/Components/Common/Client/ClientMultiselectDropdown.vue | Migrates clients source to query hook; adds “No Client” option and submit emit. |
| resources/js/Components/Common/Client/ClientMoreOptionsDropdown.vue | Removes delete action from client dropdown UI. |
| resources/js/Components/Common/Client/ClientCreateModal.vue | Refactors labels to Field components. |
| resources/js/Components/CommandPalette/index.ts | Exposes CommandPaletteProvider barrel export. |
| playwright/fixtures.ts | Implements API-based registration/auth fixture; adds admin/employee fixtures. |
| playwright/config.ts | Adds Mailpit base URL and standard test-user password constant. |
| playwright.config.ts | Increases parallel workers; switches CI reporter to blob; limits Firefox to CI. |
| package.json | Adds npm workspaces and bumps many frontend dependencies/tooling. |
| lang/en/exceptions.php | Adds translation for new TimeEntry invoiced exception. |
| e2e/utils/tags.ts | Uses type-only import for Playwright Page. |
| e2e/utils/table.ts | Adds helper to extract table row names for sorting assertions. |
| e2e/utils/money.ts | Fixes type-only import for NumberFormat. |
| e2e/utils/mailpit.ts | Adds Mailpit helpers to retrieve invitation/reset links for E2E. |
| e2e/utils/currentTimeEntry.ts | Improves timer interaction selectors and assertions. |
| e2e/tags.spec.ts | Expands tag E2E coverage (edit, sorting persistence, employee restrictions). |
| e2e/import-export.spec.ts | Adds E2E coverage for import/export flows and employee restrictions. |
| docker/prod/deployment/supervisord.worker.conf | Removes legacy supervisor worker config. |
| docker/prod/deployment/supervisord.scheduler.conf | Removes legacy supervisor scheduler config. |
| docker/prod/deployment/supervisord.reverb.conf | Removes legacy supervisor reverb config. |
| docker/prod/deployment/supervisord.horizon.conf | Removes legacy supervisor horizon config. |
| docker/prod/deployment/supervisord.conf | Removes legacy root supervisor config. |
| docker/prod/deployment/start-container | Removes legacy container entrypoint script. |
| docker/prod/deployment/php.ini | Removes legacy production php.ini. |
| docker/prod/deployment/octane/FrankenPHP/supervisord.frankenphp.conf | Removes legacy FrankenPHP supervisor config. |
| docker/prod/deployment/octane/FrankenPHP/Caddyfile | Removes legacy FrankenPHP Caddy config. |
| docker/prod/deployment/healthcheck | Removes legacy healthcheck script. |
| docker/prod/LICENSE | Removes embedded MIT license file from docker/prod. |
| docker/local/pgsql/create-testing-database.sql | Removes local SQL script for creating testing DB. |
| docker/local/minio/create_bucket.sh | Removes local MinIO bucket bootstrap script. |
| docker/local/8.3/supervisord.conf | Removes legacy local supervisor config. |
| docker/local/8.3/start-container | Removes legacy local start script. |
| docker/local/8.3/php.ini | Removes legacy local php.ini. |
| docker/local/8.3/Dockerfile | Removes legacy local PHP 8.3 Dockerfile. |
| database/schema/pgsql_test-schema.sql | Removes trailing whitespace line from schema dump. |
| database/migrations/2025_10_20_120000_add_invoiced_at_to_time_entries_table.php | Adds invoiced_at column on time entries. |
| database/factories/UserFactory.php | Updates doc reference to FileHelpers::hashName. |
| config/excel.php | Imports DefaultValueBinder and uses class constant alias. |
| config/database.php | Adds read/write host split for pgsql connection. |
| config/auth.php | Imports User and uses class constant alias. |
| config/audit.php | Imports auditing classes, uses aliases for configuration values. |
| config/app.php | Imports service providers and uses aliases in providers list. |
| composer.json | Bumps PHP requirement to 8.4, updates deps, pins platform PHP to 8.4.0. |
| bootstrap/app.php | Uses imported class names for Application/Kernel/Handler bindings. |
| app/Service/TimeEntryService.php | Fixes rounding “Up” behavior to preserve boundary ends; reuses computed start expr. |
| app/Service/TimeEntryFilter.php | Adds invoiced filtering and supports sentinel none for null relations/tags. |
| app/Service/ReportExport/CsvExport.php | Improves typed exception imports and adds collection/phpdoc type hints. |
| app/Service/MemberService.php | Ensures placeholder user has current_team_id set when created. |
| app/Service/Dto/ReportPropertiesDto.php | Allows sentinel none besides UUIDs in report properties arrays. |
| app/Service/DashboardService.php | Adds organization constraint to weekly billable amount aggregation. |
| app/Policies/OrganizationPolicy.php | Switches update authorization to permission-based check. |
| app/Models/TimeEntry.php | Adds invoiced_at cast and includes it in select columns. |
| app/Models/Organization.php | Adjusts return type import for findOrFail. |
| app/Http/Resources/V1/TimeEntry/TimeEntryResource.php | Exposes invoiced_at in API resource output. |
| app/Http/Resources/V1/Tag/TagCollection.php | Marks collection as paginated via interface. |
| app/Http/Resources/V1/Client/ClientCollection.php | Marks collection as paginated via interface. |
| app/Http/Requests/V1/TimeEntry/TimeEntryUpdateRequest.php | Tightens project validation visibility based on permissions. |
| app/Http/Requests/V1/TimeEntry/TimeEntryUpdateMultipleRequest.php | Adds project visibility check + validates changes.invoiced_at. |
| app/Http/Requests/V1/TimeEntry/TimeEntryStoreRequest.php | Tightens project validation visibility based on permissions. |
| app/Http/Requests/V1/TimeEntry/TimeEntryIndexRequest.php | Adds sentinel none validation + invoiced filter parameter validation. |
| app/Http/Requests/V1/TimeEntry/TimeEntryIndexExportRequest.php | Aligns export index validation with sentinel none + adds invoiced filter. |
| app/Http/Requests/V1/TimeEntry/TimeEntryAggregateRequest.php | Adds sentinel none handling in validation closures. |
| app/Http/Requests/V1/TimeEntry/TimeEntryAggregateExportRequest.php | Adds sentinel none handling in validation closures. |
| app/Http/Requests/V1/Task/TaskIndexRequest.php | Adds page validation. |
| app/Http/Requests/V1/Tag/TagIndexRequest.php | Adds page validation for tags index. |
| app/Http/Requests/V1/Report/ReportStoreRequest.php | Allows sentinel none values in report filter property ID arrays. |
| app/Http/Requests/V1/Report/ReportIndexRequest.php | Adds page validation for reports index. |
| app/Http/Requests/V1/ProjectMember/ProjectMemberIndexRequest.php | Adds page validation for project members index. |
| app/Http/Requests/V1/Member/MemberMergeIntoRequest.php | Adjusts return type doc to use Rule import. |
| app/Http/Requests/V1/Member/MemberIndexRequest.php | Adds page validation. |
| app/Http/Requests/V1/Invitation/InvitationIndexRequest.php | Adds page validation. |
| app/Http/Middleware/ShareInertiaData.php | Adds sidebar counts for projects/clients respecting visibility permissions. |
| app/Http/Middleware/RedirectIfAuthenticated.php | Updates docblock type signature to imported types. |
| app/Http/Middleware/ForceJsonResponse.php | Updates docblock type signature to imported types. |
| app/Http/Middleware/ForceHttps.php | Updates docblock type signature to imported types. |
| app/Http/Kernel.php | Refactors middleware registration to use imported class names. |
| app/Http/Controllers/Api/V1/TimeEntryController.php | Blocks modifying invoiced time entries; wires invoiced filter; improves type imports. |
| app/Http/Controllers/Api/V1/TaskController.php | Adds default ordering for tasks index. |
| app/Http/Controllers/Api/V1/TagController.php | Adds index request validation parameter. |
| app/Http/Controllers/Api/V1/ReportController.php | Adds index request validation parameter; allows updating public_until for public reports. |
| app/Http/Controllers/Api/V1/ProjectMemberController.php | Adds index request validation + default ordering. |
| app/Http/Controllers/Api/V1/ProjectController.php | Adds ordering; disables deletion endpoint behavior. |
| app/Http/Controllers/Api/V1/MemberController.php | Adds default ordering for member index. |
| app/Http/Controllers/Api/V1/InvitationController.php | Adds default ordering for invitations index. |
| app/Http/Controllers/Api/V1/ClientController.php | Orders clients by name; disables deletion endpoint behavior. |
| app/Http/Controllers/Api/V1/ChartController.php | Increases daily tracked hours window. |
| app/Http/Controllers/Api/V1/ApiTokenController.php | Adds default ordering for API tokens index. |
| app/Filament/Resources/UserResource.php | Replaces fully qualified TextInput usage with imported alias. |
| app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php | Ensures user/org fields are derived from member on save. |
| app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php | Ensures user/org fields are derived from member on create. |
| app/Filament/Resources/TimeEntryResource.php | Switches to selecting member; adds task selection; column aliases cleanup. |
| app/Filament/Resources/ReportResource.php | Cleans up component references to use imported aliases. |
| app/Filament/Resources/OrganizationResource/RelationManagers/UsersRelationManager.php | Cleans up column/action references to use imported aliases. |
| app/Filament/Resources/OrganizationResource.php | Cleans up select/column references to use imported aliases. |
| app/Filament/Resources/OrganizationInvitationResource.php | Cleans up select reference to use imported alias. |
| app/Filament/Resources/FailedJobResource.php | Fixes Textarea component naming. |
| app/Exceptions/Api/TimeEntryInvoicedApiException.php | Adds new API exception key for invoiced time entry modifications. |
| app/Actions/Jetstream/UpdateOrganization.php | Adjusts Gate authorize call signature usage. |
| app/Actions/Jetstream/AddOrganizationMember.php | Adjusts Gate authorize call signature usage. |
| SECURITY.md | Removes repository security policy document. |
| README.md | Adds contribution warning language. |
| CONTRIBUTING.md | Removes contributing guide content. |
| CODE_OF_CONDUCT.md | Removes code of conduct. |
| .nvmrc | Pins Node major version for local dev. |
| .github/workflows/playwright.yml | Disables Playwright workflow and adds sharding/Octane/Mailpit steps for future use. |
| .github/workflows/pint.yml | Updates Laravel Pint action version. |
| .github/workflows/phpunit.yml | Updates CI to PHP 8.4 and Node 22; speeds up npm install. |
| .github/workflows/phpstan.yml | Updates CI to PHP 8.4. |
| .github/workflows/npm-typecheck.yml | Updates CI to PHP 8.4 and Node 22. |
| .github/workflows/npm-publish-ui.yml | Removes UI npm publish workflow. |
| .github/workflows/npm-publish-api.yml | Removes API npm publish workflow. |
| .github/workflows/npm-lint.yml | Updates Node action + speeds up npm install. |
| .github/workflows/npm-format-check.yml | Updates Node action + speeds up npm install. |
| .github/workflows/npm-build.yml | Updates CI to PHP 8.4 and Node 22; speeds up npm install. |
| .github/workflows/generate-api-docs.yml | Removes API docs generation/deploy workflow. |
| .github/workflows/build-private.yml | Removes private build workflow. |
| .github/workflows/README.md | Adds a short README for workflows directory. |
| .github/PULL_REQUEST_TEMPLATE.md | Removes PR template. |
| .github/ISSUE_TEMPLATE/config.yml | Removes issue template configuration. |
| .github/ISSUE_TEMPLATE/1_bug_report.yml | Removes bug report issue template. |
| .env.ci | Switches CI mailer to SMTP (Mailpit) and configures Octane server value. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| </ClientMultiselectDropdown> | ||
| <TagDropdown | ||
| v-model="selectedTags" | ||
| :create-tag |
| memberBody.value.billable_rate = null; | ||
| } else if (billableRateSelect.value === 'custom-rate') { | ||
| memberBody.value.billable_rate = props.member.billable_rate ?? 0; | ||
| if (!memberBody.value.billable_rate) { |
| const { members } = useMembersQuery(); | ||
|
|
||
| const currentMember = computed(() => { | ||
| return members.value.find((member) => member.id === props.projectMember.user_id); |
Comment on lines
+72
to
+75
| 'host' => env('DB_READ_HOST', env('DB_HOST')), | ||
| ], | ||
| 'write' => [ | ||
| 'host' => env('DB_WRITE_HOST', env('DB_HOST')), |
| request: APIRequestContext, | ||
| query: string | ||
| ): Promise<{ messages: Array<{ ID: string; Subject: string }> }> { | ||
| const response = await request.get(`${MAILPIT_BASE_URL}/api/v1/search?query=${query}`); |
Comment on lines
+11
to
+12
| for (let i = 0; i < count; i++) { | ||
| const text = await rows.nth(i).locator('div').first().textContent(); |
Comment on lines
+1
to
+10
| name: Playwright Tests (disabled) | ||
| on: | ||
| push: | ||
| branches-ignore: | ||
| - '**' | ||
| permissions: | ||
| contents: read | ||
| jobs: | ||
| test: | ||
| if: false # Temporarily disabled |
Comment on lines
+1
to
+10
| name: Playwright Tests (disabled) | ||
| on: | ||
| push: | ||
| branches-ignore: | ||
| - '**' | ||
| permissions: | ||
| contents: read | ||
| jobs: | ||
| test: | ||
| if: false # Temporarily disabled |
|
|
||
| return response()->json(null, 204); | ||
| // Deletion disabled: return early to keep data intact | ||
| return response()->json(['message' => 'Client deletion disabled'], 200); |
| return response() | ||
| ->json(null, 204); | ||
| // Deletion disabled: return early to keep data intact | ||
| return response()->json(['message' => 'Project deletion disabled'], 200); |
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.