627645056b
Separate feature for the `programmer` role to record dev work by category, distinct from the IT help-desk `tasks` feature. Modeled on the IT Service Requests pattern (Brick offline-first model -> Riverpod stream/controller -> list/detail screens); seed of a future Project Management workflow. - programmer_tasks + programmer_task_activity_logs (category enum, RLS, realtime) via supabase migration - single assignee, self-logged or lead-assigned; assign/reassign logged - pause-on-switch: starting a task while another runs prompts to pause the running one, keeping one active task per user for accurate time attribution - worked-duration math shared with help-desk tasks via a generic core in task_duration.dart (existing callers unchanged) - list distinguishes running vs paused with a per-task Resume shortcut - accessible dialog labels; route /programmer-tasks + nav gated to admin/programmer - unit/widget tests: controller lifecycle, duration math, pause-switch dialog Co-Authored-By: claude-flow <ruv@ruv.net>
123 lines
5.6 KiB
Dart
123 lines
5.6 KiB
Dart
// ignore: unused_import, unused_shown_name, unnecessary_import
|
|
import 'package:brick_core/query.dart';
|
|
// ignore: unused_import, unused_shown_name, unnecessary_import
|
|
import 'package:brick_sqlite/db.dart';
|
|
// ignore: unused_import, unused_shown_name, unnecessary_import
|
|
import 'package:brick_offline_first_with_supabase/brick_offline_first_with_supabase.dart';
|
|
// ignore: unused_import, unused_shown_name, unnecessary_import
|
|
import 'package:brick_sqlite/brick_sqlite.dart';
|
|
// ignore: unused_import, unused_shown_name, unnecessary_import
|
|
import 'package:brick_supabase/brick_supabase.dart';
|
|
// ignore: unused_import, unused_shown_name, unnecessary_import
|
|
import '../utils/app_time.dart';
|
|
// ignore: unused_import, unused_shown_name, unnecessary_import
|
|
import 'package:tasq/models/team_member.dart';// GENERATED CODE DO NOT EDIT
|
|
// ignore: unused_import
|
|
import 'dart:convert';
|
|
import 'package:brick_sqlite/brick_sqlite.dart' show SqliteModel, SqliteAdapter, SqliteModelDictionary, RuntimeSqliteColumnDefinition, SqliteProvider;
|
|
import 'package:brick_supabase/brick_supabase.dart' show SupabaseProvider, SupabaseModel, SupabaseAdapter, SupabaseModelDictionary;
|
|
// ignore: unused_import, unused_shown_name
|
|
import 'package:brick_offline_first/brick_offline_first.dart' show RuntimeOfflineFirstDefinition;
|
|
// ignore: unused_import, unused_shown_name
|
|
import 'package:sqflite_common/sqlite_api.dart' show DatabaseExecutor;
|
|
|
|
import '../models/announcement.model.dart';
|
|
import '../models/announcement_comment.model.dart';
|
|
import '../models/attendance_log.model.dart';
|
|
import '../models/chat_message.model.dart';
|
|
import '../models/duty_schedule.model.dart';
|
|
import '../models/it_service_request.model.dart';
|
|
import '../models/it_service_request_action.model.dart';
|
|
import '../models/it_service_request_activity_log.model.dart';
|
|
import '../models/it_service_request_assignment.model.dart';
|
|
import '../models/leave_of_absence.model.dart';
|
|
import '../models/notification_item.model.dart';
|
|
import '../models/office.model.dart';
|
|
import '../models/pass_slip.model.dart';
|
|
import '../models/profile.model.dart';
|
|
import '../models/programmer_task.model.dart';
|
|
import '../models/programmer_task_activity_log.model.dart';
|
|
import '../models/service.model.dart';
|
|
import '../models/swap_request.model.dart';
|
|
import '../models/task.model.dart';
|
|
import '../models/task_activity_log.model.dart';
|
|
import '../models/team.model.dart';
|
|
import '../models/ticket.model.dart';
|
|
|
|
part 'adapters/announcement_adapter.g.dart';
|
|
part 'adapters/announcement_comment_adapter.g.dart';
|
|
part 'adapters/attendance_log_adapter.g.dart';
|
|
part 'adapters/chat_message_adapter.g.dart';
|
|
part 'adapters/duty_schedule_adapter.g.dart';
|
|
part 'adapters/it_service_request_adapter.g.dart';
|
|
part 'adapters/it_service_request_action_adapter.g.dart';
|
|
part 'adapters/it_service_request_activity_log_adapter.g.dart';
|
|
part 'adapters/it_service_request_assignment_adapter.g.dart';
|
|
part 'adapters/leave_of_absence_adapter.g.dart';
|
|
part 'adapters/notification_item_adapter.g.dart';
|
|
part 'adapters/office_adapter.g.dart';
|
|
part 'adapters/pass_slip_adapter.g.dart';
|
|
part 'adapters/profile_adapter.g.dart';
|
|
part 'adapters/programmer_task_adapter.g.dart';
|
|
part 'adapters/programmer_task_activity_log_adapter.g.dart';
|
|
part 'adapters/service_adapter.g.dart';
|
|
part 'adapters/swap_request_adapter.g.dart';
|
|
part 'adapters/task_adapter.g.dart';
|
|
part 'adapters/task_activity_log_adapter.g.dart';
|
|
part 'adapters/team_adapter.g.dart';
|
|
part 'adapters/ticket_adapter.g.dart';
|
|
|
|
/// Supabase mappings should only be used when initializing a [SupabaseProvider]
|
|
final Map<Type, SupabaseAdapter<SupabaseModel>> supabaseMappings = {
|
|
Announcement: AnnouncementAdapter(),
|
|
AnnouncementComment: AnnouncementCommentAdapter(),
|
|
AttendanceLog: AttendanceLogAdapter(),
|
|
ChatMessage: ChatMessageAdapter(),
|
|
DutySchedule: DutyScheduleAdapter(),
|
|
ItServiceRequest: ItServiceRequestAdapter(),
|
|
ItServiceRequestAction: ItServiceRequestActionAdapter(),
|
|
ItServiceRequestActivityLog: ItServiceRequestActivityLogAdapter(),
|
|
ItServiceRequestAssignment: ItServiceRequestAssignmentAdapter(),
|
|
LeaveOfAbsence: LeaveOfAbsenceAdapter(),
|
|
NotificationItem: NotificationItemAdapter(),
|
|
Office: OfficeAdapter(),
|
|
PassSlip: PassSlipAdapter(),
|
|
Profile: ProfileAdapter(),
|
|
ProgrammerTask: ProgrammerTaskAdapter(),
|
|
ProgrammerTaskActivityLog: ProgrammerTaskActivityLogAdapter(),
|
|
Service: ServiceAdapter(),
|
|
SwapRequest: SwapRequestAdapter(),
|
|
Task: TaskAdapter(),
|
|
TaskActivityLog: TaskActivityLogAdapter(),
|
|
Team: TeamAdapter(),
|
|
Ticket: TicketAdapter()
|
|
};
|
|
final supabaseModelDictionary = SupabaseModelDictionary(supabaseMappings);
|
|
|
|
/// Sqlite mappings should only be used when initializing a [SqliteProvider]
|
|
final Map<Type, SqliteAdapter<SqliteModel>> sqliteMappings = {
|
|
Announcement: AnnouncementAdapter(),
|
|
AnnouncementComment: AnnouncementCommentAdapter(),
|
|
AttendanceLog: AttendanceLogAdapter(),
|
|
ChatMessage: ChatMessageAdapter(),
|
|
DutySchedule: DutyScheduleAdapter(),
|
|
ItServiceRequest: ItServiceRequestAdapter(),
|
|
ItServiceRequestAction: ItServiceRequestActionAdapter(),
|
|
ItServiceRequestActivityLog: ItServiceRequestActivityLogAdapter(),
|
|
ItServiceRequestAssignment: ItServiceRequestAssignmentAdapter(),
|
|
LeaveOfAbsence: LeaveOfAbsenceAdapter(),
|
|
NotificationItem: NotificationItemAdapter(),
|
|
Office: OfficeAdapter(),
|
|
PassSlip: PassSlipAdapter(),
|
|
Profile: ProfileAdapter(),
|
|
ProgrammerTask: ProgrammerTaskAdapter(),
|
|
ProgrammerTaskActivityLog: ProgrammerTaskActivityLogAdapter(),
|
|
Service: ServiceAdapter(),
|
|
SwapRequest: SwapRequestAdapter(),
|
|
Task: TaskAdapter(),
|
|
TaskActivityLog: TaskActivityLogAdapter(),
|
|
Team: TeamAdapter(),
|
|
Ticket: TicketAdapter()
|
|
};
|
|
final sqliteModelDictionary = SqliteModelDictionary(sqliteMappings);
|