Add Programmer Tasks module (work-log + time tracking)
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>
This commit is contained in:
@@ -0,0 +1,197 @@
|
||||
// GENERATED CODE DO NOT EDIT
|
||||
part of '../brick.g.dart';
|
||||
|
||||
Future<ProgrammerTaskActivityLog> _$ProgrammerTaskActivityLogFromSupabase(
|
||||
Map<String, dynamic> data, {
|
||||
required SupabaseProvider provider,
|
||||
OfflineFirstWithSupabaseRepository? repository,
|
||||
}) async {
|
||||
return ProgrammerTaskActivityLog(
|
||||
id: data['id'] as String,
|
||||
taskId: data['task_id'] as String,
|
||||
actorId: data['actor_id'] == null ? null : data['actor_id'] as String?,
|
||||
actionType: data['action_type'] as String,
|
||||
meta: data['meta'] == null ? null : data['meta'],
|
||||
createdAt: DateTime.parse(data['created_at'] as String),
|
||||
);
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> _$ProgrammerTaskActivityLogToSupabase(
|
||||
ProgrammerTaskActivityLog instance, {
|
||||
required SupabaseProvider provider,
|
||||
OfflineFirstWithSupabaseRepository? repository,
|
||||
}) async {
|
||||
return {
|
||||
'id': instance.id,
|
||||
'task_id': instance.taskId,
|
||||
'actor_id': instance.actorId,
|
||||
'action_type': instance.actionType,
|
||||
'meta': instance.meta,
|
||||
'created_at': instance.createdAt.toIso8601String(),
|
||||
};
|
||||
}
|
||||
|
||||
Future<ProgrammerTaskActivityLog> _$ProgrammerTaskActivityLogFromSqlite(
|
||||
Map<String, dynamic> data, {
|
||||
required SqliteProvider provider,
|
||||
OfflineFirstWithSupabaseRepository? repository,
|
||||
}) async {
|
||||
return ProgrammerTaskActivityLog(
|
||||
id: data['id'] as String,
|
||||
taskId: data['task_id'] as String,
|
||||
actorId: data['actor_id'] == null ? null : data['actor_id'] as String?,
|
||||
actionType: data['action_type'] as String,
|
||||
meta: data['meta'] == null ? null : jsonDecode(data['meta']),
|
||||
createdAt: DateTime.parse(data['created_at'] as String),
|
||||
)..primaryKey = data['_brick_id'] as int;
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> _$ProgrammerTaskActivityLogToSqlite(
|
||||
ProgrammerTaskActivityLog instance, {
|
||||
required SqliteProvider provider,
|
||||
OfflineFirstWithSupabaseRepository? repository,
|
||||
}) async {
|
||||
return {
|
||||
'id': instance.id,
|
||||
'task_id': instance.taskId,
|
||||
'actor_id': instance.actorId,
|
||||
'action_type': instance.actionType,
|
||||
'meta': instance.meta != null ? jsonEncode(instance.meta) : null,
|
||||
'created_at': instance.createdAt.toIso8601String(),
|
||||
};
|
||||
}
|
||||
|
||||
/// Construct a [ProgrammerTaskActivityLog]
|
||||
class ProgrammerTaskActivityLogAdapter
|
||||
extends OfflineFirstWithSupabaseAdapter<ProgrammerTaskActivityLog> {
|
||||
ProgrammerTaskActivityLogAdapter();
|
||||
|
||||
@override
|
||||
final supabaseTableName = 'programmer_task_activity_logs';
|
||||
@override
|
||||
final defaultToNull = true;
|
||||
@override
|
||||
final fieldsToSupabaseColumns = {
|
||||
'id': const RuntimeSupabaseColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'id',
|
||||
),
|
||||
'taskId': const RuntimeSupabaseColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'task_id',
|
||||
),
|
||||
'actorId': const RuntimeSupabaseColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'actor_id',
|
||||
),
|
||||
'actionType': const RuntimeSupabaseColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'action_type',
|
||||
),
|
||||
'meta': const RuntimeSupabaseColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'meta',
|
||||
),
|
||||
'createdAt': const RuntimeSupabaseColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'created_at',
|
||||
),
|
||||
};
|
||||
@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,
|
||||
),
|
||||
'taskId': const RuntimeSqliteColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'task_id',
|
||||
iterable: false,
|
||||
type: String,
|
||||
),
|
||||
'actorId': const RuntimeSqliteColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'actor_id',
|
||||
iterable: false,
|
||||
type: String,
|
||||
),
|
||||
'actionType': const RuntimeSqliteColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'action_type',
|
||||
iterable: false,
|
||||
type: String,
|
||||
),
|
||||
'meta': const RuntimeSqliteColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'meta',
|
||||
iterable: false,
|
||||
type: Map,
|
||||
),
|
||||
'createdAt': const RuntimeSqliteColumnDefinition(
|
||||
association: false,
|
||||
columnName: 'created_at',
|
||||
iterable: false,
|
||||
type: DateTime,
|
||||
),
|
||||
};
|
||||
@override
|
||||
Future<int?> primaryKeyByUniqueColumns(
|
||||
ProgrammerTaskActivityLog instance,
|
||||
DatabaseExecutor executor,
|
||||
) async => instance.primaryKey;
|
||||
@override
|
||||
final String tableName = 'ProgrammerTaskActivityLog';
|
||||
|
||||
@override
|
||||
Future<ProgrammerTaskActivityLog> fromSupabase(
|
||||
Map<String, dynamic> input, {
|
||||
required provider,
|
||||
covariant OfflineFirstWithSupabaseRepository? repository,
|
||||
}) async => await _$ProgrammerTaskActivityLogFromSupabase(
|
||||
input,
|
||||
provider: provider,
|
||||
repository: repository,
|
||||
);
|
||||
@override
|
||||
Future<Map<String, dynamic>> toSupabase(
|
||||
ProgrammerTaskActivityLog input, {
|
||||
required provider,
|
||||
covariant OfflineFirstWithSupabaseRepository? repository,
|
||||
}) async => await _$ProgrammerTaskActivityLogToSupabase(
|
||||
input,
|
||||
provider: provider,
|
||||
repository: repository,
|
||||
);
|
||||
@override
|
||||
Future<ProgrammerTaskActivityLog> fromSqlite(
|
||||
Map<String, dynamic> input, {
|
||||
required provider,
|
||||
covariant OfflineFirstWithSupabaseRepository? repository,
|
||||
}) async => await _$ProgrammerTaskActivityLogFromSqlite(
|
||||
input,
|
||||
provider: provider,
|
||||
repository: repository,
|
||||
);
|
||||
@override
|
||||
Future<Map<String, dynamic>> toSqlite(
|
||||
ProgrammerTaskActivityLog input, {
|
||||
required provider,
|
||||
covariant OfflineFirstWithSupabaseRepository? repository,
|
||||
}) async => await _$ProgrammerTaskActivityLogToSqlite(
|
||||
input,
|
||||
provider: provider,
|
||||
repository: repository,
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,361 @@
|
||||
// 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,
|
||||
);
|
||||
}
|
||||
@@ -35,6 +35,8 @@ 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';
|
||||
@@ -56,6 +58,8 @@ 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';
|
||||
@@ -79,6 +83,8 @@ final Map<Type, SupabaseAdapter<SupabaseModel>> supabaseMappings = {
|
||||
Office: OfficeAdapter(),
|
||||
PassSlip: PassSlipAdapter(),
|
||||
Profile: ProfileAdapter(),
|
||||
ProgrammerTask: ProgrammerTaskAdapter(),
|
||||
ProgrammerTaskActivityLog: ProgrammerTaskActivityLogAdapter(),
|
||||
Service: ServiceAdapter(),
|
||||
SwapRequest: SwapRequestAdapter(),
|
||||
Task: TaskAdapter(),
|
||||
@@ -104,6 +110,8 @@ final Map<Type, SqliteAdapter<SqliteModel>> sqliteMappings = {
|
||||
Office: OfficeAdapter(),
|
||||
PassSlip: PassSlipAdapter(),
|
||||
Profile: ProfileAdapter(),
|
||||
ProgrammerTask: ProgrammerTaskAdapter(),
|
||||
ProgrammerTaskActivityLog: ProgrammerTaskActivityLogAdapter(),
|
||||
Service: ServiceAdapter(),
|
||||
SwapRequest: SwapRequestAdapter(),
|
||||
Task: TaskAdapter(),
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
// GENERATED CODE EDIT WITH CAUTION
|
||||
// THIS FILE **WILL NOT** BE REGENERATED
|
||||
// This file should be version controlled and can be manually edited.
|
||||
part of 'schema.g.dart';
|
||||
|
||||
// While migrations are intelligently created, the difference between some commands, such as
|
||||
// DropTable vs. RenameTable, cannot be determined. For this reason, please review migrations after
|
||||
// they are created to ensure the correct inference was made.
|
||||
|
||||
// The migration version must **always** mirror the file name
|
||||
|
||||
const List<MigrationCommand> _migration_20260926162926_up = [
|
||||
InsertTable('ProgrammerTask'),
|
||||
InsertTable('ProgrammerTaskActivityLog'),
|
||||
InsertColumn('id', Column.varchar, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('title', Column.varchar, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('description', Column.varchar, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('category', Column.varchar, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('status', Column.varchar, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('priority', Column.integer, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('assignee_id', Column.varchar, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('creator_id', Column.varchar, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('created_at', Column.datetime, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('started_at', Column.datetime, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('completed_at', Column.datetime, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('cancelled_at', Column.datetime, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('cancellation_reason', Column.varchar, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('updated_at', Column.datetime, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('is_terminal', Column.boolean, onTable: 'ProgrammerTask'),
|
||||
InsertColumn('id', Column.varchar, onTable: 'ProgrammerTaskActivityLog'),
|
||||
InsertColumn('task_id', Column.varchar, onTable: 'ProgrammerTaskActivityLog'),
|
||||
InsertColumn('actor_id', Column.varchar, onTable: 'ProgrammerTaskActivityLog'),
|
||||
InsertColumn('action_type', Column.varchar, onTable: 'ProgrammerTaskActivityLog'),
|
||||
InsertColumn('meta', Column.varchar, onTable: 'ProgrammerTaskActivityLog'),
|
||||
InsertColumn('created_at', Column.datetime, onTable: 'ProgrammerTaskActivityLog')
|
||||
];
|
||||
|
||||
const List<MigrationCommand> _migration_20260926162926_down = [
|
||||
DropTable('ProgrammerTask'),
|
||||
DropTable('ProgrammerTaskActivityLog'),
|
||||
DropColumn('id', onTable: 'ProgrammerTask'),
|
||||
DropColumn('title', onTable: 'ProgrammerTask'),
|
||||
DropColumn('description', onTable: 'ProgrammerTask'),
|
||||
DropColumn('category', onTable: 'ProgrammerTask'),
|
||||
DropColumn('status', onTable: 'ProgrammerTask'),
|
||||
DropColumn('priority', onTable: 'ProgrammerTask'),
|
||||
DropColumn('assignee_id', onTable: 'ProgrammerTask'),
|
||||
DropColumn('creator_id', onTable: 'ProgrammerTask'),
|
||||
DropColumn('created_at', onTable: 'ProgrammerTask'),
|
||||
DropColumn('started_at', onTable: 'ProgrammerTask'),
|
||||
DropColumn('completed_at', onTable: 'ProgrammerTask'),
|
||||
DropColumn('cancelled_at', onTable: 'ProgrammerTask'),
|
||||
DropColumn('cancellation_reason', onTable: 'ProgrammerTask'),
|
||||
DropColumn('updated_at', onTable: 'ProgrammerTask'),
|
||||
DropColumn('is_terminal', onTable: 'ProgrammerTask'),
|
||||
DropColumn('id', onTable: 'ProgrammerTaskActivityLog'),
|
||||
DropColumn('task_id', onTable: 'ProgrammerTaskActivityLog'),
|
||||
DropColumn('actor_id', onTable: 'ProgrammerTaskActivityLog'),
|
||||
DropColumn('action_type', onTable: 'ProgrammerTaskActivityLog'),
|
||||
DropColumn('meta', onTable: 'ProgrammerTaskActivityLog'),
|
||||
DropColumn('created_at', onTable: 'ProgrammerTaskActivityLog')
|
||||
];
|
||||
|
||||
//
|
||||
// DO NOT EDIT BELOW THIS LINE
|
||||
//
|
||||
|
||||
@Migratable(
|
||||
version: '20260926162926',
|
||||
up: _migration_20260926162926_up,
|
||||
down: _migration_20260926162926_down,
|
||||
)
|
||||
class Migration20260926162926 extends Migration {
|
||||
const Migration20260926162926()
|
||||
: super(
|
||||
version: 20260926162926,
|
||||
up: _migration_20260926162926_up,
|
||||
down: _migration_20260926162926_down,
|
||||
);
|
||||
}
|
||||
@@ -1,11 +1,13 @@
|
||||
// GENERATED CODE DO NOT EDIT
|
||||
// This file should be version controlled
|
||||
import 'package:brick_sqlite/db.dart';
|
||||
part '20260926162926.migration.dart';
|
||||
part '20260411041808.migration.dart';
|
||||
part '20260411042152.migration.dart';
|
||||
|
||||
/// All intelligently-generated migrations from all `@Migratable` classes on disk
|
||||
final migrations = <Migration>{
|
||||
const Migration20260926162926(),
|
||||
const Migration20260411041808(),
|
||||
const Migration20260411042152(),
|
||||
};
|
||||
@@ -334,6 +336,53 @@ final schema = Schema(
|
||||
},
|
||||
indices: <SchemaIndex>{},
|
||||
),
|
||||
SchemaTable(
|
||||
'ProgrammerTask',
|
||||
columns: <SchemaColumn>{
|
||||
SchemaColumn(
|
||||
'_brick_id',
|
||||
Column.integer,
|
||||
autoincrement: true,
|
||||
nullable: false,
|
||||
isPrimaryKey: true,
|
||||
),
|
||||
SchemaColumn('id', Column.varchar),
|
||||
SchemaColumn('title', Column.varchar),
|
||||
SchemaColumn('description', Column.varchar),
|
||||
SchemaColumn('category', Column.varchar),
|
||||
SchemaColumn('status', Column.varchar),
|
||||
SchemaColumn('priority', Column.integer),
|
||||
SchemaColumn('assignee_id', Column.varchar),
|
||||
SchemaColumn('creator_id', Column.varchar),
|
||||
SchemaColumn('created_at', Column.datetime),
|
||||
SchemaColumn('started_at', Column.datetime),
|
||||
SchemaColumn('completed_at', Column.datetime),
|
||||
SchemaColumn('cancelled_at', Column.datetime),
|
||||
SchemaColumn('cancellation_reason', Column.varchar),
|
||||
SchemaColumn('updated_at', Column.datetime),
|
||||
SchemaColumn('is_terminal', Column.boolean),
|
||||
},
|
||||
indices: <SchemaIndex>{},
|
||||
),
|
||||
SchemaTable(
|
||||
'ProgrammerTaskActivityLog',
|
||||
columns: <SchemaColumn>{
|
||||
SchemaColumn(
|
||||
'_brick_id',
|
||||
Column.integer,
|
||||
autoincrement: true,
|
||||
nullable: false,
|
||||
isPrimaryKey: true,
|
||||
),
|
||||
SchemaColumn('id', Column.varchar),
|
||||
SchemaColumn('task_id', Column.varchar),
|
||||
SchemaColumn('actor_id', Column.varchar),
|
||||
SchemaColumn('action_type', Column.varchar),
|
||||
SchemaColumn('meta', Column.varchar),
|
||||
SchemaColumn('created_at', Column.datetime),
|
||||
},
|
||||
indices: <SchemaIndex>{},
|
||||
),
|
||||
SchemaTable(
|
||||
'Service',
|
||||
columns: <SchemaColumn>{
|
||||
|
||||
Reference in New Issue
Block a user