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>
362 lines
11 KiB
Dart
362 lines
11 KiB
Dart
// GENERATED CODE DO NOT EDIT
|
|
part of '../brick.g.dart';
|
|
|
|
Future<ProgrammerTask> _$ProgrammerTaskFromSupabase(
|
|
Map<String, dynamic> data, {
|
|
required SupabaseProvider provider,
|
|
OfflineFirstWithSupabaseRepository? repository,
|
|
}) async {
|
|
return ProgrammerTask(
|
|
id: data['id'] as String,
|
|
title: data['title'] as String,
|
|
description: data['description'] == null
|
|
? null
|
|
: data['description'] as String?,
|
|
category: data['category'] as String,
|
|
status: data['status'] as String,
|
|
priority: data['priority'] as int,
|
|
assigneeId: data['assignee_id'] == null
|
|
? null
|
|
: data['assignee_id'] as String?,
|
|
creatorId: data['creator_id'] == null
|
|
? null
|
|
: data['creator_id'] as String?,
|
|
createdAt: DateTime.parse(data['created_at'] as String),
|
|
startedAt: data['started_at'] == null
|
|
? null
|
|
: data['started_at'] == null
|
|
? null
|
|
: DateTime.tryParse(data['started_at'] as String),
|
|
completedAt: data['completed_at'] == null
|
|
? null
|
|
: data['completed_at'] == null
|
|
? null
|
|
: DateTime.tryParse(data['completed_at'] as String),
|
|
cancelledAt: data['cancelled_at'] == null
|
|
? null
|
|
: data['cancelled_at'] == null
|
|
? null
|
|
: DateTime.tryParse(data['cancelled_at'] as String),
|
|
cancellationReason: data['cancellation_reason'] == null
|
|
? null
|
|
: data['cancellation_reason'] as String?,
|
|
updatedAt: DateTime.parse(data['updated_at'] as String),
|
|
);
|
|
}
|
|
|
|
Future<Map<String, dynamic>> _$ProgrammerTaskToSupabase(
|
|
ProgrammerTask instance, {
|
|
required SupabaseProvider provider,
|
|
OfflineFirstWithSupabaseRepository? repository,
|
|
}) async {
|
|
return {
|
|
'id': instance.id,
|
|
'title': instance.title,
|
|
'description': instance.description,
|
|
'category': instance.category,
|
|
'status': instance.status,
|
|
'priority': instance.priority,
|
|
'assignee_id': instance.assigneeId,
|
|
'creator_id': instance.creatorId,
|
|
'created_at': instance.createdAt.toIso8601String(),
|
|
'started_at': instance.startedAt?.toIso8601String(),
|
|
'completed_at': instance.completedAt?.toIso8601String(),
|
|
'cancelled_at': instance.cancelledAt?.toIso8601String(),
|
|
'cancellation_reason': instance.cancellationReason,
|
|
'updated_at': instance.updatedAt.toIso8601String(),
|
|
'is_terminal': instance.isTerminal,
|
|
};
|
|
}
|
|
|
|
Future<ProgrammerTask> _$ProgrammerTaskFromSqlite(
|
|
Map<String, dynamic> data, {
|
|
required SqliteProvider provider,
|
|
OfflineFirstWithSupabaseRepository? repository,
|
|
}) async {
|
|
return ProgrammerTask(
|
|
id: data['id'] as String,
|
|
title: data['title'] as String,
|
|
description: data['description'] == null
|
|
? null
|
|
: data['description'] as String?,
|
|
category: data['category'] as String,
|
|
status: data['status'] as String,
|
|
priority: data['priority'] as int,
|
|
assigneeId: data['assignee_id'] == null
|
|
? null
|
|
: data['assignee_id'] as String?,
|
|
creatorId: data['creator_id'] == null
|
|
? null
|
|
: data['creator_id'] as String?,
|
|
createdAt: DateTime.parse(data['created_at'] as String),
|
|
startedAt: data['started_at'] == null
|
|
? null
|
|
: data['started_at'] == null
|
|
? null
|
|
: DateTime.tryParse(data['started_at'] as String),
|
|
completedAt: data['completed_at'] == null
|
|
? null
|
|
: data['completed_at'] == null
|
|
? null
|
|
: DateTime.tryParse(data['completed_at'] as String),
|
|
cancelledAt: data['cancelled_at'] == null
|
|
? null
|
|
: data['cancelled_at'] == null
|
|
? null
|
|
: DateTime.tryParse(data['cancelled_at'] as String),
|
|
cancellationReason: data['cancellation_reason'] == null
|
|
? null
|
|
: data['cancellation_reason'] as String?,
|
|
updatedAt: DateTime.parse(data['updated_at'] as String),
|
|
)..primaryKey = data['_brick_id'] as int;
|
|
}
|
|
|
|
Future<Map<String, dynamic>> _$ProgrammerTaskToSqlite(
|
|
ProgrammerTask instance, {
|
|
required SqliteProvider provider,
|
|
OfflineFirstWithSupabaseRepository? repository,
|
|
}) async {
|
|
return {
|
|
'id': instance.id,
|
|
'title': instance.title,
|
|
'description': instance.description,
|
|
'category': instance.category,
|
|
'status': instance.status,
|
|
'priority': instance.priority,
|
|
'assignee_id': instance.assigneeId,
|
|
'creator_id': instance.creatorId,
|
|
'created_at': instance.createdAt.toIso8601String(),
|
|
'started_at': instance.startedAt?.toIso8601String(),
|
|
'completed_at': instance.completedAt?.toIso8601String(),
|
|
'cancelled_at': instance.cancelledAt?.toIso8601String(),
|
|
'cancellation_reason': instance.cancellationReason,
|
|
'updated_at': instance.updatedAt.toIso8601String(),
|
|
'is_terminal': instance.isTerminal ? 1 : 0,
|
|
};
|
|
}
|
|
|
|
/// Construct a [ProgrammerTask]
|
|
class ProgrammerTaskAdapter
|
|
extends OfflineFirstWithSupabaseAdapter<ProgrammerTask> {
|
|
ProgrammerTaskAdapter();
|
|
|
|
@override
|
|
final supabaseTableName = 'programmer_tasks';
|
|
@override
|
|
final defaultToNull = true;
|
|
@override
|
|
final fieldsToSupabaseColumns = {
|
|
'id': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'id',
|
|
),
|
|
'title': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'title',
|
|
),
|
|
'description': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'description',
|
|
),
|
|
'category': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'category',
|
|
),
|
|
'status': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'status',
|
|
),
|
|
'priority': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'priority',
|
|
),
|
|
'assigneeId': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'assignee_id',
|
|
),
|
|
'creatorId': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'creator_id',
|
|
),
|
|
'createdAt': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'created_at',
|
|
),
|
|
'startedAt': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'started_at',
|
|
),
|
|
'completedAt': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'completed_at',
|
|
),
|
|
'cancelledAt': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'cancelled_at',
|
|
),
|
|
'cancellationReason': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'cancellation_reason',
|
|
),
|
|
'updatedAt': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'updated_at',
|
|
),
|
|
'isTerminal': const RuntimeSupabaseColumnDefinition(
|
|
association: false,
|
|
columnName: 'is_terminal',
|
|
),
|
|
};
|
|
@override
|
|
final ignoreDuplicates = false;
|
|
@override
|
|
final uniqueFields = {};
|
|
@override
|
|
final Map<String, RuntimeSqliteColumnDefinition> fieldsToSqliteColumns = {
|
|
'primaryKey': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: '_brick_id',
|
|
iterable: false,
|
|
type: int,
|
|
),
|
|
'id': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'id',
|
|
iterable: false,
|
|
type: String,
|
|
),
|
|
'title': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'title',
|
|
iterable: false,
|
|
type: String,
|
|
),
|
|
'description': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'description',
|
|
iterable: false,
|
|
type: String,
|
|
),
|
|
'category': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'category',
|
|
iterable: false,
|
|
type: String,
|
|
),
|
|
'status': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'status',
|
|
iterable: false,
|
|
type: String,
|
|
),
|
|
'priority': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'priority',
|
|
iterable: false,
|
|
type: int,
|
|
),
|
|
'assigneeId': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'assignee_id',
|
|
iterable: false,
|
|
type: String,
|
|
),
|
|
'creatorId': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'creator_id',
|
|
iterable: false,
|
|
type: String,
|
|
),
|
|
'createdAt': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'created_at',
|
|
iterable: false,
|
|
type: DateTime,
|
|
),
|
|
'startedAt': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'started_at',
|
|
iterable: false,
|
|
type: DateTime,
|
|
),
|
|
'completedAt': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'completed_at',
|
|
iterable: false,
|
|
type: DateTime,
|
|
),
|
|
'cancelledAt': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'cancelled_at',
|
|
iterable: false,
|
|
type: DateTime,
|
|
),
|
|
'cancellationReason': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'cancellation_reason',
|
|
iterable: false,
|
|
type: String,
|
|
),
|
|
'updatedAt': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'updated_at',
|
|
iterable: false,
|
|
type: DateTime,
|
|
),
|
|
'isTerminal': const RuntimeSqliteColumnDefinition(
|
|
association: false,
|
|
columnName: 'is_terminal',
|
|
iterable: false,
|
|
type: bool,
|
|
),
|
|
};
|
|
@override
|
|
Future<int?> primaryKeyByUniqueColumns(
|
|
ProgrammerTask instance,
|
|
DatabaseExecutor executor,
|
|
) async => instance.primaryKey;
|
|
@override
|
|
final String tableName = 'ProgrammerTask';
|
|
|
|
@override
|
|
Future<ProgrammerTask> fromSupabase(
|
|
Map<String, dynamic> input, {
|
|
required provider,
|
|
covariant OfflineFirstWithSupabaseRepository? repository,
|
|
}) async => await _$ProgrammerTaskFromSupabase(
|
|
input,
|
|
provider: provider,
|
|
repository: repository,
|
|
);
|
|
@override
|
|
Future<Map<String, dynamic>> toSupabase(
|
|
ProgrammerTask input, {
|
|
required provider,
|
|
covariant OfflineFirstWithSupabaseRepository? repository,
|
|
}) async => await _$ProgrammerTaskToSupabase(
|
|
input,
|
|
provider: provider,
|
|
repository: repository,
|
|
);
|
|
@override
|
|
Future<ProgrammerTask> fromSqlite(
|
|
Map<String, dynamic> input, {
|
|
required provider,
|
|
covariant OfflineFirstWithSupabaseRepository? repository,
|
|
}) async => await _$ProgrammerTaskFromSqlite(
|
|
input,
|
|
provider: provider,
|
|
repository: repository,
|
|
);
|
|
@override
|
|
Future<Map<String, dynamic>> toSqlite(
|
|
ProgrammerTask input, {
|
|
required provider,
|
|
covariant OfflineFirstWithSupabaseRepository? repository,
|
|
}) async => await _$ProgrammerTaskToSqlite(
|
|
input,
|
|
provider: provider,
|
|
repository: repository,
|
|
);
|
|
}
|