Skip to content

Feature v0.11.0#140

Closed
StanBarrows wants to merge 100 commits intomainfrom
feature-v0.11.0
Closed

Feature v0.11.0#140
StanBarrows wants to merge 100 commits intomainfrom
feature-v0.11.0

Conversation

@StanBarrows
Copy link
Contributor

No description provided.

Onatcer and others added 30 commits December 2, 2025 13:30
Onatcer and others added 26 commits February 17, 2026 13:54
…m inconsistencies

The frontend did not show organization settings for admin users because of the team ownership check
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.
Copilot AI review requested due to automatic review settings March 16, 2026 11:20
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR rolls up the v0.11.0 feature work, including a shift toward TanStack Query on the frontend, new sortable/persisted table UX, and faster/sharded Playwright E2E execution, plus backend filter/pagination improvements.

Changes:

  • Migrate multiple pages/components from Pinia store fetching to TanStack Query hooks and refactor UI form fields to the shared Field/* components.
  • Add client/member/tag/project table sorting (incl. persisted sort state via storage) and several UI/UX polish changes (select/tabs/dialog/table styling).
  • Improve E2E reliability/performance (API-based auth, Mailpit helpers, sharded CI runs with Octane/FrankenPHP) and enhance backend filtering/validation/pagination ordering.

Reviewed changes

Copilot reviewed 201 out of 387 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
resources/js/Pages/ProjectShow.vue Switch to query-based data sources; format billable rate via computed.
resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue Replace legacy label/error components with new Field components.
resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue Replace legacy label/error components with new Field components.
resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue Replace legacy label/error components with new Field components.
resources/js/Pages/Profile/Partials/ThemeForm.vue Replace native select with shared Select UI components.
resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue Update error handling UI to Field components.
resources/js/Pages/Profile/Partials/DeleteUserForm.vue Update error handling UI to Field components.
resources/js/Pages/Profile/Partials/ApiTokensForm.vue Update token form to Field components and improve helper text structure.
resources/js/Pages/Members.vue Persist member table sort state and forward sorting events/props.
resources/js/Pages/Dashboard.vue Adjust dashboard grid spacing.
resources/js/Pages/Clients.vue Switch client fetching to query hook; persist and forward table sorting state.
resources/js/Pages/Auth/TwoFactorChallenge.vue Update auth form UI to Field components.
resources/js/Pages/Auth/ResetPassword.vue Update auth form UI to Field components.
resources/js/Pages/Auth/Register.vue Update auth form UI to Field components; refactor checkbox alignment.
resources/js/Pages/Auth/Login.vue Update auth form UI to Field components.
resources/js/Pages/Auth/ForgotPassword.vue Update auth form UI to Field components.
resources/js/Pages/Auth/ConfirmPassword.vue Update auth form UI to Field components.
resources/js/Pages/API/Partials/ApiTokenManager.vue Update token manager fields to Field components.
resources/js/Components/ui/tabs/TabsList.vue Update TabsList styling classes.
resources/js/Components/ui/select/SelectTrigger.vue Expand SelectTrigger API (sizes/variants/chevron) and restyle.
resources/js/Components/ui/number-field/NumberFieldInput.vue Update number input sizing/typography classes.
resources/js/Components/ui/label/index.ts Export new Label component entrypoint.
resources/js/Components/ui/label/Label.vue Add Label wrapper component around reka-ui Label.
resources/js/Components/ui/dropdown-menu/DropdownMenuContent.vue Adjust dropdown-menu content border styling classes.
resources/js/Components/ui/dialog/DialogContent.vue Improve dialog layout/padding and pointer-events handling.
resources/js/Components/ui/calendar/CalendarDateInput.vue Switch Popover import source; adjust Button props.
resources/js/Components/ui/calendar/CalendarCellTrigger.vue Update selected day styling classes.
resources/js/Components/ui/button/index.ts Remove old button exports/variants from this UI path.
resources/js/Components/ui/button/Button.vue Remove old Button component implementation from this UI path.
resources/js/Components/TimeTracker.vue Move time-entry flow toward query/mutation hooks; UI tweaks.
resources/js/Components/ResponsiveNavLink.vue Enable Inertia Link prefetch.
resources/js/Components/NavigationSidebarLink.vue Enable Inertia Link prefetch.
resources/js/Components/NavLink.vue Enable Inertia Link prefetch on mount.
resources/js/Components/DropdownLink.vue Enable Inertia Link prefetch.
resources/js/Components/Dashboard/ThisWeekOverview.vue Add reporting table; adjust chart options and query stale times.
resources/js/Components/Dashboard/TeamActivityCardEntry.vue Adjust activity entry spacing and typography.
resources/js/Components/Dashboard/TeamActivityCard.vue Improve empty-state padding behavior.
resources/js/Components/Dashboard/RecentlyTrackedTasksCardEntry.vue Switch to query hooks; adjust entry styling; tweak start/stop button.
resources/js/Components/Dashboard/RecentlyTrackedTasksCard.vue Update icons and empty-state spacing.
resources/js/Components/Dashboard/LastSevenDaysCard.vue Tighten typing for placeholder data construction.
resources/js/Components/Dashboard/DayOverviewCardEntry.vue Adjust day row styling and simplify classes.
resources/js/Components/Dashboard/DayOverviewCardChart.vue Simplify chart axes and remove unused styling variables.
resources/js/Components/Dashboard/DashboardCard.vue Adjust card layout/styling and spacing.
resources/js/Components/CurrentSidebarTimer.vue Apply secondary variant to timer start/stop.
resources/js/Components/ConfirmsPassword.vue Update error display UI to Field components.
resources/js/Components/Common/User/UserTimezoneMismatchModal.vue Replace custom modal logic with shared TimezoneMismatchModal.
resources/js/Components/Common/Task/TaskTableHeading.vue Restyle task table headings.
resources/js/Components/Common/Task/TaskMultiselectDropdown.vue Switch to tasks query; add empty label and submit event passthrough.
resources/js/Components/Common/Task/TaskEditModal.vue Refactor task edit modal form to FieldGroup/Field.
resources/js/Components/Common/Task/TaskCreateModal.vue Refactor task create modal form; customize project trigger UI.
resources/js/Components/Common/Tag/TagTableRow.vue Add edit flow (modal) and permission-aware options.
resources/js/Components/Common/Tag/TagTableHeading.vue Add sortable header UI with chevrons.
resources/js/Components/Common/Tag/TagTable.vue Switch tag fetching to query; add frontend sorting via vue-table.
resources/js/Components/Common/Tag/TagMoreOptionsDropdown.vue Add edit option and permission checks.
resources/js/Components/Common/Tag/TagEditModal.vue Add modal for editing tag name.
resources/js/Components/Common/TableHeading.vue Adjust heading typography sizing.
resources/js/Components/Common/TabBar/TabBarItem.vue Adjust tab item padding/classes.
resources/js/Components/Common/Reporting/ReportingTabNavbar.vue Refactor reporting tabs; add hover prefetch and dynamic tab list.
resources/js/Components/Common/Reporting/ReportingRow.vue Add optional cost column support and nested-row layout changes.
resources/js/Components/Common/Reporting/ReportingRoundingControls.vue Switch popover import; refactor rounding UI to Field components; button variant change.
resources/js/Components/Common/Reporting/ReportingGroupBySelect.vue Replace legacy dropdown/badge with shared Select UI.
resources/js/Components/Common/Reporting/ReportingExportButton.vue Replace legacy dropdown with dropdown-menu components.
resources/js/Components/Common/Reporting/ReportingChart.vue Simplify chart axis rendering.
resources/js/Components/Common/Report/ReportTableRow.vue Add created/expiry columns with localized formatting and visibility icons.
resources/js/Components/Common/Report/ReportTableHeading.vue Update report table headings to match new columns.
resources/js/Components/Common/Report/ReportTable.vue Update report table grid columns and empty-state colspan.
resources/js/Components/Common/Report/ReportEditModal.vue Use Field components; fix public_until UTC/local conversion.
resources/js/Components/Common/Report/ReportCreateModal.vue Use Field components; invalidate reports query; navigate after create.
resources/js/Components/Common/ProjectMember/ProjectMemberTableRow.vue Switch member lookup to query hook.
resources/js/Components/Common/ProjectMember/ProjectMemberTableHeading.vue Restyle project-member headings.
resources/js/Components/Common/ProjectMember/ProjectMemberMoreOptionsDropdown.vue Switch member lookup to query hook.
resources/js/Components/Common/ProjectMember/ProjectMemberEditModal.vue Refactor billable rate label to Field components.
resources/js/Components/Common/Project/constants.ts Add shared sentinel constant for “no client”.
resources/js/Components/Common/Project/ProjectsFilterDropdown.vue Add dropdown-based project filter UI for status/client.
resources/js/Components/Common/Project/ProjectTableRow.vue Switch clients/tasks to query hooks; adjust status display/icons.
resources/js/Components/Common/Project/ProjectTableHeading.vue Add sortable header UI with chevrons.
resources/js/Components/Common/Project/ProjectStatusFilterBadge.vue Add status filter badge component with dropdown options.
resources/js/Components/Common/Project/ProjectMultiselectDropdown.vue Switch to projects query; add empty label and submit passthrough.
resources/js/Components/Common/Project/ProjectEditModal.vue Refactor modal to FieldGroup; update client trigger UI; switch clients to query.
resources/js/Components/Common/Project/ProjectClientFilterBadge.vue Add client filter badge component with dropdown checklist.
resources/js/Components/Common/Project/BaseFilterBadge.vue Add reusable filter badge UI with dropdown and remove action.
resources/js/Components/Common/PageTitle.vue Adjust icon sizing for page titles.
resources/js/Components/Common/Member/MemberTableRow.vue Update status icons and remove unnecessary fetch on modal open.
resources/js/Components/Common/Member/MemberTableHeading.vue Add sortable header UI with chevrons.
resources/js/Components/Common/Member/MemberTable.vue Switch to members query; implement frontend sorting via vue-table.
resources/js/Components/Common/Member/MemberRoleSelect.vue Replace legacy dropdown/badge with shared Select UI.
resources/js/Components/Common/Member/MemberMultiselectDropdown.vue Switch member list to query hook and add submit passthrough.
resources/js/Components/Common/Member/MemberMergeModal.vue Invalidate members query after merge.
resources/js/Components/Common/Member/MemberMakePlaceholderModal.vue Invalidate members query after placeholder conversion.
resources/js/Components/Common/Member/MemberInviteModal.vue Refactor invite form UI to Field components.
resources/js/Components/Common/Member/MemberDeleteModal.vue Refactor delete confirmation UI to Field components; invalidate members query.
resources/js/Components/Common/Member/MemberBillableSelect.vue Replace legacy dropdown/badge with shared Select UI.
resources/js/Components/Common/Invitation/InvitationTableHeading.vue Restyle invitation table headings.
resources/js/Components/Common/Client/ClientTableRow.vue Switch projects to query hook; adjust status UI/icons.
resources/js/Components/Common/Client/ClientTableHeading.vue Add sortable header UI with chevrons.
resources/js/Components/Common/Client/ClientTable.vue Add frontend sorting via vue-table; compute project counts for sorting.
resources/js/Components/Common/Client/ClientMultiselectDropdown.vue Switch client list to query hook; add empty label and submit passthrough.
resources/js/Components/Common/Client/ClientCreateModal.vue Refactor create modal label to Field components.
resources/js/Components/CommandPalette/index.ts Export command palette provider.
playwright/fixtures.ts Add API-based auth, ctx/admin/employee fixtures, and user setup helpers.
playwright/config.ts Add Mailpit URL and central test password constant.
playwright.config.ts Configure higher parallelism and blob reports; CI-only Firefox project.
package.json Add workspaces; bump frontend dependencies; add postcss-import.
e2e/utils/tags.ts Convert Page import to type-only.
e2e/utils/table.ts Add helper to extract ordered row names from tables.
e2e/utils/money.ts Convert NumberFormat import to type-only.
e2e/utils/mailpit.ts Add Mailpit API helpers for invitation/reset link extraction.
e2e/utils/currentTimeEntry.ts Improve visibility targeting and assertions for timer interactions.
docker-compose.yml Bump Playwright container image version.
database/factories/UserFactory.php Use class import in @see annotation.
config/excel.php Import DefaultValueBinder and reference it by class name.
config/auth.php Import User and reference by class name.
config/audit.php Import resolver classes and reference by class name.
config/app.php Import providers and reference by class name.
composer.json Require PHP 8.4.*.
bootstrap/app.php Add imports and replace fully-qualified class references.
app/Service/TimeEntryService.php Fix rounding “Up” end boundary behavior.
app/Service/TimeEntryFilter.php Add NONE sentinel and support “none” filtering across dimensions.
app/Service/ReportExport/CsvExport.php Use imported exception types in docblock.
app/Service/MemberService.php Ensure placeholder user gets current_team_id set.
app/Service/Dto/ReportPropertiesDto.php Allow “none” sentinel in properties ID collections.
app/Service/DashboardService.php Constrain weekly billable amount by organization.
app/Policies/OrganizationPolicy.php Use PermissionStore for organization update authorization.
app/Models/Organization.php Adjust findOrFail return type to Team import.
app/Http/Resources/V1/Tag/TagCollection.php Implement PaginatedResourceCollection.
app/Http/Resources/V1/Client/ClientCollection.php Implement PaginatedResourceCollection.
app/Http/Requests/V1/TimeEntry/TimeEntryUpdateRequest.php Restrict project existence validation by employee visibility rules.
app/Http/Requests/V1/TimeEntry/TimeEntryUpdateMultipleRequest.php Restrict project existence validation by employee visibility rules.
app/Http/Requests/V1/TimeEntry/TimeEntryStoreRequest.php Restrict project existence validation by employee visibility rules.
app/Http/Requests/V1/TimeEntry/TimeEntryIndexRequest.php Allow “none” sentinel in ID filters via custom validators.
app/Http/Requests/V1/TimeEntry/TimeEntryIndexExportRequest.php Add client_ids export filter rules and “none” sentinel validation.
app/Http/Requests/V1/TimeEntry/TimeEntryAggregateRequest.php Allow “none” sentinel in aggregate filter IDs via custom validators.
app/Http/Requests/V1/TimeEntry/TimeEntryAggregateExportRequest.php Allow “none” sentinel in aggregate-export filter IDs via custom validators.
app/Http/Requests/V1/Task/TaskIndexRequest.php Add page parameter validation.
app/Http/Requests/V1/Tag/TagIndexRequest.php Add Tag index request with page validation.
app/Http/Requests/V1/Report/ReportStoreRequest.php Allow “none” sentinel in stored report properties IDs.
app/Http/Requests/V1/Report/ReportIndexRequest.php Add Report index request with page validation.
app/Http/Requests/V1/ProjectMember/ProjectMemberIndexRequest.php Add ProjectMember index request with page validation.
app/Http/Requests/V1/Member/MemberMergeIntoRequest.php Adjust rule return-type annotation import.
app/Http/Requests/V1/Member/MemberIndexRequest.php Add page parameter validation.
app/Http/Requests/V1/Invitation/InvitationIndexRequest.php Add page parameter validation.
app/Http/Middleware/RedirectIfAuthenticated.php Update docblock type annotation.
app/Http/Middleware/ForceJsonResponse.php Update docblock type annotation.
app/Http/Middleware/ForceHttps.php Update docblock type annotation.
app/Http/Kernel.php Add imports and replace fully-qualified middleware references.
app/Http/Controllers/Api/V1/TimeEntryController.php Simplify Carbon typehint by importing Carbon.
app/Http/Controllers/Api/V1/TaskController.php Add deterministic ordering for task pagination.
app/Http/Controllers/Api/V1/TagController.php Use TagIndexRequest for index endpoint.
app/Http/Controllers/Api/V1/ReportController.php Use ReportIndexRequest; allow updating public_until when public.
app/Http/Controllers/Api/V1/ProjectMemberController.php Add index request, ordering, and pagination for members.
app/Http/Controllers/Api/V1/ProjectController.php Add deterministic ordering for project pagination.
app/Http/Controllers/Api/V1/MemberController.php Add deterministic ordering for member pagination.
app/Http/Controllers/Api/V1/InvitationController.php Add deterministic ordering for invitation pagination.
app/Http/Controllers/Api/V1/ChartController.php Increase days returned for daily tracked hours chart.
app/Http/Controllers/Api/V1/ApiTokenController.php Add ordering for API tokens list.
app/Filament/Resources/UserResource.php Use imported Filament form components (TextInput).
app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php Map member_id to user_id/organization_id on save.
app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php Map member_id to user_id/organization_id on create.
app/Filament/Resources/TimeEntryResource.php Use member selector; add task_id selection; simplify table column classes.
app/Filament/Resources/ReportResource.php Use imported Filament components in form/table.
app/Filament/Resources/OrganizationResource/RelationManagers/UsersRelationManager.php Use imported Filament table actions/columns.
app/Filament/Resources/OrganizationResource.php Use imported Filament components in form/table.
app/Filament/Resources/OrganizationInvitationResource.php Use imported Filament Select component.
app/Filament/Resources/FailedJobResource.php Fix Textarea component class name casing.
README.md Add contribution guidance line regarding AI-generated PR quality.
.github/workflows/playwright.yml Add sharded Playwright runs, Mailpit service ports, Octane server, and report merging.
.env.ci Switch CI mailer to SMTP for Mailpit and set Octane server environment.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

<slot />
<SelectIcon as-child>
<ChevronDown class="w-4 h-4 opacity-50 shrink-0" />
<SelectIcon v-if="showChevron" as-child>
Comment on lines +154 to +164
$includeNone = in_array(self::NONE_VALUE, $clientIds, true);
$clientIds = array_values(array_filter($clientIds, fn (string $id): bool => $id !== self::NONE_VALUE));

$this->builder->where(function (Builder $builder) use ($clientIds, $includeNone): void {
if (count($clientIds) > 0) {
$builder->whereIn('client_id', $clientIds);
}
if ($includeNone) {
$builder->orWhereNull('client_id');
}
});
Comment on lines +41 to +42
class="py-1.5 pr-3 text-left text-text-tertiary pl-4 sm:pl-6 lg:pl-8 3xl:pl-12 cursor-pointer hover:bg-secondary hover:text-text-primary transition-colors select-none flex items-center gap-1"
@click="handleSort('name')">
</DropdownMenuContent>
</DropdownMenu>

<button
request: APIRequestContext,
query: string
): Promise<{ messages: Array<{ ID: string; Subject: string }> }> {
const response = await request.get(`${MAILPIT_BASE_URL}/api/v1/search?query=${query}`);
style="grid-template-columns: 1fr 150px 150px">
:class="showCost ? 'col-span-3' : 'col-span-2'"
class="grid bg-tertiary"
:style="`grid-template-columns: 1fr 150px ${showCost ? '150px' : ''}`">
<TabBarItem value="detailed" @click="router.visit(route('reporting.detailed'))"
>Detailed</TabBarItem
>
<TabBar :default-value="props.active" @update:model-value="onTabChange">
- name: "Install FrankenPHP"
run: |
ARCH="$(uname -m)"
curl -fsSL "https://github.com/dunglas/frankenphp/releases/latest/download/frankenphp-linux-${ARCH}" -o /usr/local/bin/frankenphp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants