Conversation
…roperties display
…lytics, and custom fields with dynamic form generation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (50)
📝 WalkthroughWalkthroughThis PR implements passwordless magic-link OTP authentication on the backend and mobile platforms, while substantially expanding ticket management capabilities with watchers, time tracking, approvals, solutions, and custom fields. The backend introduces a new OTP delivery mode for magic links; the mobile app adds complete OTP sign-in flows, comprehensive ticket detail views with thread segmentation and actions, and enhanced ticket form/list UI with unified filtering and custom field support. ChangesPasswordless Authentication and Ticket Management Expansion
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Pull request overview
This PR expands the mobile ticketing experience with passwordless email-code sign-in, ticket filters and editing enhancements, approvals, analytics, knowledge-base solutions, custom fields, watchers/time-tracking support, and related backend OTP support.
Changes:
- Adds mobile OTP authentication screens and backend verify-code flow.
- Adds ticket-related mobile surfaces for analytics, approvals, solutions, custom fields, properties, and time tracking.
- Extends providers/models/API configuration for tickets, solutions, approvals, analytics, custom fields, and OTP.
Reviewed changes
Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
mobile/lib/widgets/tickets/ticket_time_panel.dart |
Adds ticket time-tracking panel with timers and manual entries. |
mobile/lib/widgets/tickets/ticket_solutions_panel.dart |
Adds linked and suggested solution panel for tickets. |
mobile/lib/widgets/tickets/ticket_properties_card.dart |
Adds ticket SLA/escalation/watcher properties card. |
mobile/lib/widgets/tickets/ticket_approval_panel.dart |
Adds per-ticket approval status and actions. |
mobile/lib/widgets/forms/multi_select_sheet.dart |
Adds reusable searchable multi-select bottom sheet. |
mobile/lib/widgets/forms/custom_fields_form.dart |
Adds schema-driven custom-field form renderer. |
mobile/lib/widgets/common/badge.dart |
Extends badges for ticket status/type/priority. |
mobile/lib/widgets/cards/task_row.dart |
Updates priority badge usage. |
mobile/lib/widgets/cards/deal_card.dart |
Updates priority badge usage. |
mobile/lib/services/auth_service.dart |
Adds OTP request/verify auth methods and Google server client ID. |
mobile/lib/services/api_service.dart |
Improves error parsing and preserves structured failure bodies for POST/PUT. |
mobile/lib/screens/tickets/tickets_list_screen.dart |
Adds server-backed ticket filters and new navigation actions. |
mobile/lib/screens/tickets/ticket_form_screen.dart |
Adds assignees, tags, custom fields, closed-on date, and edit account read-only behavior. |
mobile/lib/screens/tickets/ticket_analytics_screen.dart |
Adds mobile ticket analytics dashboard. |
mobile/lib/screens/tickets/approvals_inbox_screen.dart |
Adds approvals inbox with filters and inline actions. |
mobile/lib/screens/tasks/task_detail_screen.dart |
Updates priority badge usage. |
mobile/lib/screens/solutions/solutions_list_screen.dart |
Adds solutions list/search/filter screen. |
mobile/lib/screens/solutions/solution_detail_screen.dart |
Adds solution create/edit/publish/delete screen. |
mobile/lib/screens/leads/lead_detail_screen.dart |
Updates priority badge usage. |
mobile/lib/screens/auth/magic_link_email_screen.dart |
Adds email step for OTP sign-in. |
mobile/lib/screens/auth/magic_link_code_screen.dart |
Adds code-entry step for OTP sign-in. |
mobile/lib/screens/auth/login_screen.dart |
Replaces password form with Google and email-code sign-in options. |
mobile/lib/screens/auth/forgot_password_screen.dart |
Removes legacy forgot-password screen. |
mobile/lib/routes/app_router.dart |
Registers OTP, solutions, approvals, and analytics routes. |
mobile/lib/providers/tickets_provider.dart |
Extends ticket list filters and ticket detail/time/tree/watcher operations. |
mobile/lib/providers/solutions_provider.dart |
Adds solutions state/actions provider. |
mobile/lib/providers/lookup_provider.dart |
Adds custom-field definition provider. |
mobile/lib/providers/auth_provider.dart |
Exposes OTP request/verify actions in auth state. |
mobile/lib/providers/approvals_provider.dart |
Adds approvals provider and actions. |
mobile/lib/providers/analytics_provider.dart |
Adds analytics provider and query model. |
mobile/lib/data/models/time_entry.dart |
Adds time entry and time summary models. |
mobile/lib/data/models/ticket.dart |
Extends ticket model with tags, custom fields, SLA, parent/child, and problem metadata. |
mobile/lib/data/models/solution.dart |
Adds solution model and status enum. |
mobile/lib/data/models/models.dart |
Exports new models. |
mobile/lib/data/models/email_message.dart |
Adds ticket email message model. |
mobile/lib/data/models/custom_field_definition.dart |
Adds custom-field definition model. |
mobile/lib/data/models/comment.dart |
Improves commenter email parsing compatibility. |
mobile/lib/data/models/approval.dart |
Adds approval model and related summaries. |
mobile/lib/config/api_config.dart |
Adds new API endpoint constants and updates dev URL. |
mobile/android/app/build.gradle.kts |
Updates NDK/signing behavior. |
backend/templates/magic_link_code_email.html |
Adds OTP email template. |
backend/common/views/auth_views.py |
Adds OTP delivery and verify-code view. |
backend/common/urls.py |
Registers OTP verify-code endpoint. |
backend/common/tests/test_magic_link.py |
Adds OTP request/verify tests and adjusts task mocking. |
backend/common/tasks.py |
Supports sending either magic-link or OTP emails. |
backend/common/serializer.py |
Adds delivery and verify-code serializers. |
backend/common/models.py |
Extends magic-link token model for OTP delivery. |
backend/common/migrations/0025_magic_link_token_otp.py |
Adds OTP fields to magic-link token table. |
backend/common/middleware/rls_context.py |
Allows OTP verify-code without org context. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| controller: _descController, | ||
| maxLines: 2, | ||
| decoration: InputDecoration( | ||
| hintText: 'What did you work on? (optional)', |
| // Date range is enforced client-side — the list endpoint doesn't expose | ||
| // a created_at filter. Acceptable because the user already paginates. | ||
| newTickets = _applyDateRange(newTickets, filters); | ||
|
|
||
| return TicketsListData( | ||
| tickets: newTickets, | ||
| totalCount: totalCount, | ||
| hasMore: newTickets.length >= _pageSize, | ||
| currentOffset: offset + newTickets.length, | ||
| currentOffset: offset + ticketsList.length, |
| : ListView.builder( | ||
| itemCount: filtered.length, | ||
| itemBuilder: (_, i) { |
| Widget _textInput({required int maxLines}) { | ||
| return FloatingLabelInput( | ||
| label: _label(), | ||
| controller: TextEditingController(text: value?.toString() ?? ''), |
| ), | ||
| const SizedBox(height: 2), | ||
| Text( | ||
| _subtitle(deadline: deadline, met: met, metAt: metAt), |
| if (status != null && status.isNotEmpty) queryParams['status'] = status; | ||
| if (priority != null && priority.isNotEmpty) { | ||
| queryParams['priority'] = priority; | ||
| if (filters.search.isNotEmpty) queryParams['search'] = filters.search; |
Summary by CodeRabbit
Release Notes