Merge pull request 'activity things' (#6) from activity-things into main
Reviewed-on: #6
This commit is contained in:
commit
6012a1541e
@ -4,17 +4,21 @@ import 'package:sendtrain/database/database.dart';
|
||||
part 'session_activities_dao.g.dart';
|
||||
|
||||
@DriftAccessor(tables: [SessionActivities])
|
||||
class SessionActivitiesDao extends DatabaseAccessor<AppDatabase> with _$SessionActivitiesDaoMixin {
|
||||
class SessionActivitiesDao extends DatabaseAccessor<AppDatabase>
|
||||
with _$SessionActivitiesDaoMixin {
|
||||
SessionActivitiesDao(super.db);
|
||||
|
||||
Future createOrUpdate(SessionActivitiesCompanion sessionActivity) => into(sessionActivities).insertOnConflictUpdate(sessionActivity);
|
||||
Future createOrUpdate(SessionActivitiesCompanion sessionActivity) =>
|
||||
into(sessionActivities).insertOnConflictUpdate(sessionActivity);
|
||||
|
||||
Future<List<SessionActivity>> all() async {
|
||||
return await select(sessionActivities).get();
|
||||
}
|
||||
|
||||
Future<SessionActivity> find(int id) async {
|
||||
return await (select(sessionActivities)..where((sessionActivity) => sessionActivity.id.equals(id) )).getSingle();
|
||||
return await (select(sessionActivities)
|
||||
..where((sessionActivity) => sessionActivity.id.equals(id)))
|
||||
.getSingle();
|
||||
}
|
||||
|
||||
Future<List<SessionActivity>> fromSessionId(int id) async {
|
||||
@ -23,4 +27,16 @@ class SessionActivitiesDao extends DatabaseAccessor<AppDatabase> with _$SessionA
|
||||
|
||||
return result.get();
|
||||
}
|
||||
}
|
||||
|
||||
Future remove(SessionActivity sessionActivity) =>
|
||||
delete(sessionActivities).delete(sessionActivity);
|
||||
|
||||
Future removeAssociation(int activityId, int sessionId) {
|
||||
return (delete(sessionActivities)
|
||||
..where((t) =>
|
||||
t.sessionId.equals(sessionId) & t.activityId.equals(activityId)))
|
||||
.go();
|
||||
}
|
||||
}
|
||||
|
||||
// return (delete(todos)..where((t) => t.id.isSmallerThanValue(10))).go();
|
@ -35,7 +35,7 @@ class AppDatabase extends _$AppDatabase {
|
||||
AppDatabase() : super(_openConnection());
|
||||
|
||||
@override
|
||||
int get schemaVersion => 19;
|
||||
int get schemaVersion => 20;
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration {
|
||||
@ -193,7 +193,7 @@ enum MediaType { youtube, image, location, localImage, localVideo }
|
||||
|
||||
class MediaItems extends Table {
|
||||
IntColumn get id => integer().autoIncrement()();
|
||||
TextColumn get title => text().withLength(min: 3, max: 32)();
|
||||
TextColumn get title => text().withLength(min: 3, max: 64)();
|
||||
TextColumn get description => text().named('body')();
|
||||
TextColumn get reference => text()();
|
||||
TextColumn get type => textEnum<MediaType>()();
|
||||
|
@ -515,11 +515,6 @@ class $ActivitiesTable extends Activities
|
||||
type: DriftSqlType.string, requiredDuringInsert: false)
|
||||
.withConverter<ActivityMuscle?>(
|
||||
$ActivitiesTable.$convertersecondaryMusclesn);
|
||||
static const VerificationMeta _imagesMeta = const VerificationMeta('images');
|
||||
@override
|
||||
late final GeneratedColumn<String> images = GeneratedColumn<String>(
|
||||
'images', aliasedName, true,
|
||||
type: DriftSqlType.string, requiredDuringInsert: false);
|
||||
static const VerificationMeta _createdAtMeta =
|
||||
const VerificationMeta('createdAt');
|
||||
@override
|
||||
@ -541,7 +536,6 @@ class $ActivitiesTable extends Activities
|
||||
equipment,
|
||||
primaryMuscles,
|
||||
secondaryMuscles,
|
||||
images,
|
||||
createdAt
|
||||
];
|
||||
@override
|
||||
@ -578,10 +572,6 @@ class $ActivitiesTable extends Activities
|
||||
context.handle(_equipmentMeta, const VerificationResult.success());
|
||||
context.handle(_primaryMusclesMeta, const VerificationResult.success());
|
||||
context.handle(_secondaryMusclesMeta, const VerificationResult.success());
|
||||
if (data.containsKey('images')) {
|
||||
context.handle(_imagesMeta,
|
||||
images.isAcceptableOrUnknown(data['images']!, _imagesMeta));
|
||||
}
|
||||
if (data.containsKey('created_at')) {
|
||||
context.handle(_createdAtMeta,
|
||||
createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta));
|
||||
@ -624,8 +614,6 @@ class $ActivitiesTable extends Activities
|
||||
secondaryMuscles: $ActivitiesTable.$convertersecondaryMusclesn.fromSql(
|
||||
attachedDatabase.typeMapping.read(DriftSqlType.string,
|
||||
data['${effectivePrefix}secondary_muscles'])),
|
||||
images: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}images']),
|
||||
createdAt: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
|
||||
);
|
||||
@ -685,7 +673,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
final ActivityEquipment? equipment;
|
||||
final ActivityMuscle? primaryMuscles;
|
||||
final ActivityMuscle? secondaryMuscles;
|
||||
final String? images;
|
||||
final DateTime createdAt;
|
||||
const Activity(
|
||||
{required this.id,
|
||||
@ -699,7 +686,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
this.equipment,
|
||||
this.primaryMuscles,
|
||||
this.secondaryMuscles,
|
||||
this.images,
|
||||
required this.createdAt});
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
@ -740,9 +726,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
map['secondary_muscles'] = Variable<String>(
|
||||
$ActivitiesTable.$convertersecondaryMusclesn.toSql(secondaryMuscles));
|
||||
}
|
||||
if (!nullToAbsent || images != null) {
|
||||
map['images'] = Variable<String>(images);
|
||||
}
|
||||
map['created_at'] = Variable<DateTime>(createdAt);
|
||||
return map;
|
||||
}
|
||||
@ -774,8 +757,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
secondaryMuscles: secondaryMuscles == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(secondaryMuscles),
|
||||
images:
|
||||
images == null && nullToAbsent ? const Value.absent() : Value(images),
|
||||
createdAt: Value(createdAt),
|
||||
);
|
||||
}
|
||||
@ -802,7 +783,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
.fromJson(serializer.fromJson<String?>(json['primaryMuscles'])),
|
||||
secondaryMuscles: $ActivitiesTable.$convertersecondaryMusclesn
|
||||
.fromJson(serializer.fromJson<String?>(json['secondaryMuscles'])),
|
||||
images: serializer.fromJson<String?>(json['images']),
|
||||
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
|
||||
);
|
||||
}
|
||||
@ -829,7 +809,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
'secondaryMuscles': serializer.toJson<String?>($ActivitiesTable
|
||||
.$convertersecondaryMusclesn
|
||||
.toJson(secondaryMuscles)),
|
||||
'images': serializer.toJson<String?>(images),
|
||||
'createdAt': serializer.toJson<DateTime>(createdAt),
|
||||
};
|
||||
}
|
||||
@ -846,7 +825,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
Value<ActivityEquipment?> equipment = const Value.absent(),
|
||||
Value<ActivityMuscle?> primaryMuscles = const Value.absent(),
|
||||
Value<ActivityMuscle?> secondaryMuscles = const Value.absent(),
|
||||
Value<String?> images = const Value.absent(),
|
||||
DateTime? createdAt}) =>
|
||||
Activity(
|
||||
id: id ?? this.id,
|
||||
@ -863,7 +841,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
secondaryMuscles: secondaryMuscles.present
|
||||
? secondaryMuscles.value
|
||||
: this.secondaryMuscles,
|
||||
images: images.present ? images.value : this.images,
|
||||
createdAt: createdAt ?? this.createdAt,
|
||||
);
|
||||
Activity copyWithCompanion(ActivitiesCompanion data) {
|
||||
@ -884,7 +861,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
secondaryMuscles: data.secondaryMuscles.present
|
||||
? data.secondaryMuscles.value
|
||||
: this.secondaryMuscles,
|
||||
images: data.images.present ? data.images.value : this.images,
|
||||
createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
|
||||
);
|
||||
}
|
||||
@ -903,27 +879,14 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
..write('equipment: $equipment, ')
|
||||
..write('primaryMuscles: $primaryMuscles, ')
|
||||
..write('secondaryMuscles: $secondaryMuscles, ')
|
||||
..write('images: $images, ')
|
||||
..write('createdAt: $createdAt')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(
|
||||
id,
|
||||
title,
|
||||
type,
|
||||
description,
|
||||
category,
|
||||
force,
|
||||
level,
|
||||
mechanic,
|
||||
equipment,
|
||||
primaryMuscles,
|
||||
secondaryMuscles,
|
||||
images,
|
||||
createdAt);
|
||||
int get hashCode => Object.hash(id, title, type, description, category, force,
|
||||
level, mechanic, equipment, primaryMuscles, secondaryMuscles, createdAt);
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
@ -939,7 +902,6 @@ class Activity extends DataClass implements Insertable<Activity> {
|
||||
other.equipment == this.equipment &&
|
||||
other.primaryMuscles == this.primaryMuscles &&
|
||||
other.secondaryMuscles == this.secondaryMuscles &&
|
||||
other.images == this.images &&
|
||||
other.createdAt == this.createdAt);
|
||||
}
|
||||
|
||||
@ -955,7 +917,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
final Value<ActivityEquipment?> equipment;
|
||||
final Value<ActivityMuscle?> primaryMuscles;
|
||||
final Value<ActivityMuscle?> secondaryMuscles;
|
||||
final Value<String?> images;
|
||||
final Value<DateTime> createdAt;
|
||||
const ActivitiesCompanion({
|
||||
this.id = const Value.absent(),
|
||||
@ -969,7 +930,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
this.equipment = const Value.absent(),
|
||||
this.primaryMuscles = const Value.absent(),
|
||||
this.secondaryMuscles = const Value.absent(),
|
||||
this.images = const Value.absent(),
|
||||
this.createdAt = const Value.absent(),
|
||||
});
|
||||
ActivitiesCompanion.insert({
|
||||
@ -984,7 +944,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
this.equipment = const Value.absent(),
|
||||
this.primaryMuscles = const Value.absent(),
|
||||
this.secondaryMuscles = const Value.absent(),
|
||||
this.images = const Value.absent(),
|
||||
this.createdAt = const Value.absent(),
|
||||
}) : title = Value(title);
|
||||
static Insertable<Activity> custom({
|
||||
@ -999,7 +958,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
Expression<String>? equipment,
|
||||
Expression<String>? primaryMuscles,
|
||||
Expression<String>? secondaryMuscles,
|
||||
Expression<String>? images,
|
||||
Expression<DateTime>? createdAt,
|
||||
}) {
|
||||
return RawValuesInsertable({
|
||||
@ -1014,7 +972,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
if (equipment != null) 'equipment': equipment,
|
||||
if (primaryMuscles != null) 'primary_muscles': primaryMuscles,
|
||||
if (secondaryMuscles != null) 'secondary_muscles': secondaryMuscles,
|
||||
if (images != null) 'images': images,
|
||||
if (createdAt != null) 'created_at': createdAt,
|
||||
});
|
||||
}
|
||||
@ -1031,7 +988,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
Value<ActivityEquipment?>? equipment,
|
||||
Value<ActivityMuscle?>? primaryMuscles,
|
||||
Value<ActivityMuscle?>? secondaryMuscles,
|
||||
Value<String?>? images,
|
||||
Value<DateTime>? createdAt}) {
|
||||
return ActivitiesCompanion(
|
||||
id: id ?? this.id,
|
||||
@ -1045,7 +1001,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
equipment: equipment ?? this.equipment,
|
||||
primaryMuscles: primaryMuscles ?? this.primaryMuscles,
|
||||
secondaryMuscles: secondaryMuscles ?? this.secondaryMuscles,
|
||||
images: images ?? this.images,
|
||||
createdAt: createdAt ?? this.createdAt,
|
||||
);
|
||||
}
|
||||
@ -1095,9 +1050,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
.$convertersecondaryMusclesn
|
||||
.toSql(secondaryMuscles.value));
|
||||
}
|
||||
if (images.present) {
|
||||
map['images'] = Variable<String>(images.value);
|
||||
}
|
||||
if (createdAt.present) {
|
||||
map['created_at'] = Variable<DateTime>(createdAt.value);
|
||||
}
|
||||
@ -1118,7 +1070,6 @@ class ActivitiesCompanion extends UpdateCompanion<Activity> {
|
||||
..write('equipment: $equipment, ')
|
||||
..write('primaryMuscles: $primaryMuscles, ')
|
||||
..write('secondaryMuscles: $secondaryMuscles, ')
|
||||
..write('images: $images, ')
|
||||
..write('createdAt: $createdAt')
|
||||
..write(')'))
|
||||
.toString();
|
||||
@ -2098,7 +2049,7 @@ class $MediaItemsTable extends MediaItems
|
||||
late final GeneratedColumn<String> title = GeneratedColumn<String>(
|
||||
'title', aliasedName, false,
|
||||
additionalChecks:
|
||||
GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32),
|
||||
GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 64),
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true);
|
||||
static const VerificationMeta _descriptionMeta =
|
||||
@ -3117,7 +3068,6 @@ typedef $$ActivitiesTableCreateCompanionBuilder = ActivitiesCompanion Function({
|
||||
Value<ActivityEquipment?> equipment,
|
||||
Value<ActivityMuscle?> primaryMuscles,
|
||||
Value<ActivityMuscle?> secondaryMuscles,
|
||||
Value<String?> images,
|
||||
Value<DateTime> createdAt,
|
||||
});
|
||||
typedef $$ActivitiesTableUpdateCompanionBuilder = ActivitiesCompanion Function({
|
||||
@ -3132,7 +3082,6 @@ typedef $$ActivitiesTableUpdateCompanionBuilder = ActivitiesCompanion Function({
|
||||
Value<ActivityEquipment?> equipment,
|
||||
Value<ActivityMuscle?> primaryMuscles,
|
||||
Value<ActivityMuscle?> secondaryMuscles,
|
||||
Value<String?> images,
|
||||
Value<DateTime> createdAt,
|
||||
});
|
||||
|
||||
@ -3232,9 +3181,6 @@ class $$ActivitiesTableFilterComposer
|
||||
column: $table.secondaryMuscles,
|
||||
builder: (column) => ColumnWithTypeConverterFilters(column));
|
||||
|
||||
ColumnFilters<String> get images => $composableBuilder(
|
||||
column: $table.images, builder: (column) => ColumnFilters(column));
|
||||
|
||||
ColumnFilters<DateTime> get createdAt => $composableBuilder(
|
||||
column: $table.createdAt, builder: (column) => ColumnFilters(column));
|
||||
|
||||
@ -3325,9 +3271,6 @@ class $$ActivitiesTableOrderingComposer
|
||||
column: $table.secondaryMuscles,
|
||||
builder: (column) => ColumnOrderings(column));
|
||||
|
||||
ColumnOrderings<String> get images => $composableBuilder(
|
||||
column: $table.images, builder: (column) => ColumnOrderings(column));
|
||||
|
||||
ColumnOrderings<DateTime> get createdAt => $composableBuilder(
|
||||
column: $table.createdAt, builder: (column) => ColumnOrderings(column));
|
||||
}
|
||||
@ -3376,9 +3319,6 @@ class $$ActivitiesTableAnnotationComposer
|
||||
get secondaryMuscles => $composableBuilder(
|
||||
column: $table.secondaryMuscles, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<String> get images =>
|
||||
$composableBuilder(column: $table.images, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<DateTime> get createdAt =>
|
||||
$composableBuilder(column: $table.createdAt, builder: (column) => column);
|
||||
|
||||
@ -3461,7 +3401,6 @@ class $$ActivitiesTableTableManager extends RootTableManager<
|
||||
Value<ActivityEquipment?> equipment = const Value.absent(),
|
||||
Value<ActivityMuscle?> primaryMuscles = const Value.absent(),
|
||||
Value<ActivityMuscle?> secondaryMuscles = const Value.absent(),
|
||||
Value<String?> images = const Value.absent(),
|
||||
Value<DateTime> createdAt = const Value.absent(),
|
||||
}) =>
|
||||
ActivitiesCompanion(
|
||||
@ -3476,7 +3415,6 @@ class $$ActivitiesTableTableManager extends RootTableManager<
|
||||
equipment: equipment,
|
||||
primaryMuscles: primaryMuscles,
|
||||
secondaryMuscles: secondaryMuscles,
|
||||
images: images,
|
||||
createdAt: createdAt,
|
||||
),
|
||||
createCompanionCallback: ({
|
||||
@ -3491,7 +3429,6 @@ class $$ActivitiesTableTableManager extends RootTableManager<
|
||||
Value<ActivityEquipment?> equipment = const Value.absent(),
|
||||
Value<ActivityMuscle?> primaryMuscles = const Value.absent(),
|
||||
Value<ActivityMuscle?> secondaryMuscles = const Value.absent(),
|
||||
Value<String?> images = const Value.absent(),
|
||||
Value<DateTime> createdAt = const Value.absent(),
|
||||
}) =>
|
||||
ActivitiesCompanion.insert(
|
||||
@ -3506,7 +3443,6 @@ class $$ActivitiesTableTableManager extends RootTableManager<
|
||||
equipment: equipment,
|
||||
primaryMuscles: primaryMuscles,
|
||||
secondaryMuscles: secondaryMuscles,
|
||||
images: images,
|
||||
createdAt: createdAt,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
|
@ -2901,6 +2901,178 @@ i1.GeneratedColumn<String> _column_40(String aliasedName) =>
|
||||
additionalChecks: i1.GeneratedColumn.checkTextLength(
|
||||
minTextLength: 3, maxTextLength: 100),
|
||||
type: i1.DriftSqlType.string);
|
||||
|
||||
final class Schema20 extends i0.VersionedSchema {
|
||||
Schema20({required super.database}) : super(version: 20);
|
||||
@override
|
||||
late final List<i1.DatabaseSchemaEntity> entities = [
|
||||
sessions,
|
||||
activities,
|
||||
sessionActivities,
|
||||
actions,
|
||||
activityActions,
|
||||
mediaItems,
|
||||
objectMediaItems,
|
||||
];
|
||||
late final Shape12 sessions = Shape12(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'sessions',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_1,
|
||||
_column_2,
|
||||
_column_3,
|
||||
_column_11,
|
||||
_column_20,
|
||||
_column_4,
|
||||
_column_5,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape17 activities = Shape17(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'activities',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_40,
|
||||
_column_36,
|
||||
_column_37,
|
||||
_column_38,
|
||||
_column_27,
|
||||
_column_28,
|
||||
_column_29,
|
||||
_column_35,
|
||||
_column_31,
|
||||
_column_32,
|
||||
_column_5,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape13 sessionActivities = Shape13(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'session_activities',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_21,
|
||||
_column_22,
|
||||
_column_19,
|
||||
_column_10,
|
||||
_column_5,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape3 actions = Shape3(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'actions',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_1,
|
||||
_column_2,
|
||||
_column_12,
|
||||
_column_5,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape10 activityActions = Shape10(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'activity_actions',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_22,
|
||||
_column_23,
|
||||
_column_19,
|
||||
_column_5,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape5 mediaItems = Shape5(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'media_items',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_41,
|
||||
_column_2,
|
||||
_column_25,
|
||||
_column_6,
|
||||
_column_5,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape6 objectMediaItems = Shape6(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'object_media_items',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_15,
|
||||
_column_16,
|
||||
_column_24,
|
||||
_column_5,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
}
|
||||
|
||||
class Shape17 extends i0.VersionedTable {
|
||||
Shape17({required super.source, required super.alias}) : super.aliased();
|
||||
i1.GeneratedColumn<int> get id =>
|
||||
columnsByName['id']! as i1.GeneratedColumn<int>;
|
||||
i1.GeneratedColumn<String> get title =>
|
||||
columnsByName['title']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get type =>
|
||||
columnsByName['type']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get description =>
|
||||
columnsByName['body']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get category =>
|
||||
columnsByName['category']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get force =>
|
||||
columnsByName['force']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get level =>
|
||||
columnsByName['level']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get mechanic =>
|
||||
columnsByName['mechanic']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get equipment =>
|
||||
columnsByName['equipment']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get primaryMuscles =>
|
||||
columnsByName['primary_muscles']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get secondaryMuscles =>
|
||||
columnsByName['secondary_muscles']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<DateTime> get createdAt =>
|
||||
columnsByName['created_at']! as i1.GeneratedColumn<DateTime>;
|
||||
}
|
||||
|
||||
i1.GeneratedColumn<String> _column_41(String aliasedName) =>
|
||||
i1.GeneratedColumn<String>('title', aliasedName, false,
|
||||
additionalChecks: i1.GeneratedColumn.checkTextLength(
|
||||
minTextLength: 3, maxTextLength: 64),
|
||||
type: i1.DriftSqlType.string);
|
||||
i0.MigrationStepWithVersion migrationSteps({
|
||||
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
||||
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
||||
@ -2920,6 +3092,7 @@ i0.MigrationStepWithVersion migrationSteps({
|
||||
required Future<void> Function(i1.Migrator m, Schema17 schema) from16To17,
|
||||
required Future<void> Function(i1.Migrator m, Schema18 schema) from17To18,
|
||||
required Future<void> Function(i1.Migrator m, Schema19 schema) from18To19,
|
||||
required Future<void> Function(i1.Migrator m, Schema20 schema) from19To20,
|
||||
}) {
|
||||
return (currentVersion, database) async {
|
||||
switch (currentVersion) {
|
||||
@ -3013,6 +3186,11 @@ i0.MigrationStepWithVersion migrationSteps({
|
||||
final migrator = i1.Migrator(database, schema);
|
||||
await from18To19(migrator, schema);
|
||||
return 19;
|
||||
case 19:
|
||||
final schema = Schema20(database: database);
|
||||
final migrator = i1.Migrator(database, schema);
|
||||
await from19To20(migrator, schema);
|
||||
return 20;
|
||||
default:
|
||||
throw ArgumentError.value('Unknown migration from $currentVersion');
|
||||
}
|
||||
@ -3038,6 +3216,7 @@ i1.OnUpgrade stepByStep({
|
||||
required Future<void> Function(i1.Migrator m, Schema17 schema) from16To17,
|
||||
required Future<void> Function(i1.Migrator m, Schema18 schema) from17To18,
|
||||
required Future<void> Function(i1.Migrator m, Schema19 schema) from18To19,
|
||||
required Future<void> Function(i1.Migrator m, Schema20 schema) from19To20,
|
||||
}) =>
|
||||
i0.VersionedSchema.stepByStepHelper(
|
||||
step: migrationSteps(
|
||||
@ -3059,4 +3238,5 @@ i1.OnUpgrade stepByStep({
|
||||
from16To17: from16To17,
|
||||
from17To18: from17To18,
|
||||
from18To19: from18To19,
|
||||
from19To20: from19To20,
|
||||
));
|
||||
|
File diff suppressed because one or more lines are too long
@ -73,7 +73,7 @@ Future<void> seedDb(AppDatabase database) async {
|
||||
|
||||
Map<Symbol, Value> payload = {
|
||||
Symbol('title'): Value<String>(exercise['name']),
|
||||
Symbol('description'): Value<String>(exercise['instructions'].toString()),
|
||||
Symbol('description'): Value<String>(json.encode(exercise['instructions'])),
|
||||
Symbol('force'): Value<String>(exercise['force'] ?? "")
|
||||
};
|
||||
|
||||
@ -124,9 +124,9 @@ Future<void> seedDb(AppDatabase database) async {
|
||||
await database
|
||||
.into(database.mediaItems)
|
||||
.insert(MediaItemsCompanion.insert(
|
||||
title: 'Media title $m',
|
||||
title: exercise['name'],
|
||||
description:
|
||||
'Media description $m Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
|
||||
exercise['name'],
|
||||
reference: mediaItem,
|
||||
type: MediaType.image))
|
||||
.then((mediaId) async {
|
||||
|
@ -6,10 +6,11 @@ showMediaDetailWidget(BuildContext context, MediaItem media) {
|
||||
showEditorSheet(context, MediaDetails(media: media));
|
||||
}
|
||||
|
||||
showEditorSheet(BuildContext context, Widget widget) {
|
||||
showGenericSheet(BuildContext context, Widget widget) {
|
||||
showModalBottomSheet<void>(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(10.0), topRight: Radius.circular(10.0)),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(10.0), topRight: Radius.circular(10.0)),
|
||||
),
|
||||
context: context,
|
||||
showDragHandle: true,
|
||||
@ -19,3 +20,21 @@ showEditorSheet(BuildContext context, Widget widget) {
|
||||
return widget;
|
||||
});
|
||||
}
|
||||
|
||||
showEditorSheet(BuildContext context, Widget widget) {
|
||||
showGenericSheet(context, widget);
|
||||
}
|
||||
|
||||
String jsonToDescription(List text) {
|
||||
String content = '';
|
||||
|
||||
for (int i = 0; i < text.length; i++) {
|
||||
if (content.isEmpty) {
|
||||
content = text[i];
|
||||
} else {
|
||||
content = "$content\n\n${text[i]}";
|
||||
}
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
@ -19,9 +19,9 @@ class ActivityTimerModel with ChangeNotifier {
|
||||
|
||||
int get actionCount => _actionCounter;
|
||||
int get currentActionNum => _currentActionNum;
|
||||
dynamic get currentAction => currentSet[_currentActionNum];
|
||||
dynamic get currentAction => currentSet.isNotEmpty ? currentSet[_currentActionNum] : {};
|
||||
int get currentSetNum => _currentSetNum;
|
||||
dynamic get currentSet => _sets[_currentSetNum];
|
||||
dynamic get currentSet => _sets.isNotEmpty ? _sets[_currentSetNum] : {};
|
||||
Activity? get activity => _activity;
|
||||
List get sets => _sets;
|
||||
Timer? get periodicTimer => _periodicTimer;
|
||||
@ -36,7 +36,7 @@ class ActivityTimerModel with ChangeNotifier {
|
||||
_isc = null;
|
||||
_activity = activity;
|
||||
// only one action for now
|
||||
_sets = json.decode(actions[0].set);
|
||||
_sets = actions.isNotEmpty ? json.decode(actions[0].set) : [];
|
||||
// _actions = actions;
|
||||
_currentActionNum = 0;
|
||||
_currentSetNum = 0;
|
||||
@ -92,7 +92,7 @@ class ActivityTimerModel with ChangeNotifier {
|
||||
}
|
||||
|
||||
void setActionCount() {
|
||||
_actionCounter = currentAction['amount'];
|
||||
_actionCounter = currentAction.isNotEmpty ? currentAction['amount'] : 0;
|
||||
}
|
||||
|
||||
void pause() {
|
||||
|
@ -1,8 +1,10 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sendtrain/daos/activities_dao.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
// import 'package:sendtrain/widgets/activities/activity_card.dart';
|
||||
import 'package:sendtrain/helpers/widget_helpers.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/form_search_input.dart';
|
||||
|
||||
class ActivityFinderService {
|
||||
@ -27,10 +29,10 @@ class ActivityFinderService {
|
||||
}
|
||||
|
||||
Widget resultWidget(Activity activity, Function? callback) {
|
||||
// return ActivityCard(activity: activity, callback: callback);
|
||||
return ListTile(
|
||||
title: Text(activity.title),
|
||||
subtitle: Text(activity.description ?? ""),
|
||||
subtitle: Text(jsonToDescription(json.decode(activity.description ?? "")),
|
||||
maxLines: 2, softWrap: true, overflow: TextOverflow.ellipsis),
|
||||
onTap: () {
|
||||
if (callback != null) {
|
||||
callback();
|
||||
|
@ -1,11 +1,14 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sendtrain/daos/activities_dao.dart';
|
||||
import 'package:sendtrain/daos/media_items_dao.dart';
|
||||
import 'package:sendtrain/daos/session_activities_dao.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/extensions/string_extensions.dart';
|
||||
import 'package:sendtrain/helpers/date_time_helpers.dart';
|
||||
import 'package:sendtrain/helpers/media_helpers.dart';
|
||||
import 'package:sendtrain/helpers/widget_helpers.dart';
|
||||
import 'package:sendtrain/models/activity_timer_model.dart';
|
||||
import 'package:sendtrain/widgets/activities/activity_view.dart';
|
||||
import 'package:sendtrain/widgets/builders/dialogs.dart';
|
||||
@ -14,9 +17,14 @@ import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.da
|
||||
|
||||
class ActivityCard extends StatefulWidget {
|
||||
final Activity activity;
|
||||
final Session session;
|
||||
final Function? callback;
|
||||
|
||||
const ActivityCard({super.key, required this.activity, this.callback});
|
||||
const ActivityCard(
|
||||
{super.key,
|
||||
required this.activity,
|
||||
required this.session,
|
||||
this.callback});
|
||||
|
||||
@override
|
||||
State<ActivityCard> createState() => ActivityCardState();
|
||||
@ -54,16 +62,22 @@ class ActivityCardState extends State<ActivityCard> {
|
||||
if (atm.activity?.id == widget.activity.id) {
|
||||
return Text(
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
"${widget.activity.title.toTitleCase()} (${formattedTime(atm.totalTime)})");
|
||||
} else {
|
||||
return Text(
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
widget.activity.title.toTitleCase());
|
||||
}
|
||||
},
|
||||
),
|
||||
subtitle:
|
||||
Text(maxLines: 2, widget.activity.description ?? ""),
|
||||
subtitle: Text(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
maxLines: 2,
|
||||
softWrap: true,
|
||||
jsonToDescription(json
|
||||
.decode(widget.activity.description ?? ""))),
|
||||
contentPadding: EdgeInsets.only(left: 13),
|
||||
trailing: Flex(
|
||||
direction: Axis.vertical,
|
||||
@ -79,10 +93,11 @@ class ActivityCardState extends State<ActivityCard> {
|
||||
'Activity Removal',
|
||||
'Would you like to permanently remove this activity from the current session?',
|
||||
context, () {
|
||||
ActivitiesDao(Provider.of<AppDatabase>(
|
||||
context,
|
||||
listen: false))
|
||||
.remove(widget.activity);
|
||||
SessionActivitiesDao(
|
||||
Provider.of<AppDatabase>(context,
|
||||
listen: false))
|
||||
.removeAssociation(widget.activity.id,
|
||||
widget.session.id);
|
||||
}).then((result) {
|
||||
setState(() {});
|
||||
});
|
||||
|
@ -1,18 +1,20 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_expandable_fab/flutter_expandable_fab.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sendtrain/daos/actions_dao.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/extensions/string_extensions.dart';
|
||||
import 'package:sendtrain/helpers/widget_helpers.dart';
|
||||
import 'package:sendtrain/models/activity_timer_model.dart';
|
||||
import 'package:sendtrain/widgets/activities/activity_action_view.dart';
|
||||
import 'package:sendtrain/widgets/activities/activity_view_categories.dart';
|
||||
import 'package:sendtrain/widgets/activities/activity_view_media.dart';
|
||||
import 'package:sendtrain/widgets/activities/activity_view_types.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/add_card_generic.dart';
|
||||
|
||||
class ActivityView extends StatefulWidget {
|
||||
const ActivityView(
|
||||
{super.key, required this.activity});
|
||||
const ActivityView({super.key, required this.activity});
|
||||
final Activity activity;
|
||||
|
||||
@override
|
||||
@ -20,6 +22,98 @@ class ActivityView extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _ActivityViewState extends State<ActivityView> {
|
||||
List<ActivityMuscle> activity_muscle(Activity activity) {
|
||||
List<ActivityMuscle> muscles = [];
|
||||
|
||||
if (activity.primaryMuscles != null) {
|
||||
muscles.add(activity.primaryMuscles!);
|
||||
}
|
||||
|
||||
if (activity.secondaryMuscles != null) {
|
||||
muscles.add(activity.secondaryMuscles!);
|
||||
}
|
||||
|
||||
return muscles;
|
||||
}
|
||||
|
||||
List<Widget> action(actions) {
|
||||
if (actions.isNotEmpty) {
|
||||
return [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 10, right: 10),
|
||||
child: Card(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(10),
|
||||
topRight: Radius.circular(10)),
|
||||
),
|
||||
color: Theme.of(context).colorScheme.onPrimary,
|
||||
child: Row(children: [
|
||||
Ink(
|
||||
width: 70,
|
||||
color: Theme.of(context).colorScheme.primaryContainer,
|
||||
child: Consumer<ActivityTimerModel>(
|
||||
builder: (context, atm, child) {
|
||||
return IconButton(
|
||||
alignment: AlignmentDirectional.center,
|
||||
icon: atm.isActive
|
||||
? const Icon(Icons.pause_rounded)
|
||||
: const Icon(Icons.play_arrow_rounded),
|
||||
onPressed: () =>
|
||||
{atm.isActive ? atm.pause() : atm.start()});
|
||||
},
|
||||
)),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: Stack(alignment: Alignment.center, children: [
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
child: Consumer<ActivityTimerModel>(
|
||||
builder: (context, atm, child) {
|
||||
return Text(
|
||||
style: const TextStyle(fontSize: 20),
|
||||
textAlign: TextAlign.center,
|
||||
'${atm.actionCount} ${atm.currentAction['type']}'
|
||||
.toTitleCase());
|
||||
},
|
||||
),
|
||||
),
|
||||
Container(
|
||||
alignment: Alignment.centerRight,
|
||||
padding: EdgeInsets.only(right: 15),
|
||||
child: Consumer<ActivityTimerModel>(
|
||||
builder: (context, atm, child) {
|
||||
return Text(
|
||||
style: const TextStyle(fontSize: 12),
|
||||
textAlign: TextAlign.right,
|
||||
'${atm.currentAction['actionID'] + 1} of ${atm.totalActions()}');
|
||||
})),
|
||||
])),
|
||||
]))),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 14, right: 14),
|
||||
child: Consumer<ActivityTimerModel>(builder: (context, atm, child) {
|
||||
return LinearProgressIndicator(
|
||||
value: atm.progress,
|
||||
semanticsLabel: 'Activity Progress',
|
||||
);
|
||||
})),
|
||||
ActivityActionView(actions: actions)
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
AddCardGeneric(
|
||||
title: 'Add an Action!',
|
||||
description:
|
||||
'Click here to create an exercise template (sets and reps, etc) for your activity!',
|
||||
action: () {
|
||||
print('teset');
|
||||
})
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final Activity activity = widget.activity;
|
||||
@ -44,11 +138,11 @@ class _ActivityViewState extends State<ActivityView> {
|
||||
blur: 10,
|
||||
),
|
||||
children: [
|
||||
FloatingActionButton.extended(
|
||||
icon: const Icon(Icons.upload_outlined),
|
||||
label: Text('Upload Media'),
|
||||
onPressed: () {},
|
||||
),
|
||||
// FloatingActionButton.extended(
|
||||
// icon: const Icon(Icons.upload_outlined),
|
||||
// label: Text('Upload Media'),
|
||||
// onPressed: () {},
|
||||
// ),
|
||||
FloatingActionButton.extended(
|
||||
icon: const Icon(Icons.note_add_outlined),
|
||||
label: Text('Add Note'),
|
||||
@ -68,125 +162,204 @@ class _ActivityViewState extends State<ActivityView> {
|
||||
body: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
AppBar(
|
||||
titleSpacing: 0,
|
||||
centerTitle: true,
|
||||
title: const Text('Activity',
|
||||
style: TextStyle(fontSize: 15)),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 15, right: 20, top: 15, bottom: 10),
|
||||
child: Text(
|
||||
maxLines: 1,
|
||||
style: const TextStyle(
|
||||
fontSize: 25, fontWeight: FontWeight.bold),
|
||||
activity.title.toTitleCase())),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(10, 0, 0, 10),
|
||||
child: Flex(direction: Axis.horizontal, children: [
|
||||
ActivityViewCategories(
|
||||
categories: activity.category != null ? [activity.category!] : []),
|
||||
ActivityViewTypes(types: [activity.type!])
|
||||
])),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 0, bottom: 10, left: 15, right: 15),
|
||||
child: Text(
|
||||
textAlign: TextAlign.left,
|
||||
style: const TextStyle(fontSize: 15),
|
||||
activity.description ?? "")),
|
||||
const Padding(
|
||||
padding: EdgeInsets.fromLTRB(15, 20, 0, 10),
|
||||
child: Text(
|
||||
style: TextStyle(
|
||||
fontSize: 20, fontWeight: FontWeight.bold),
|
||||
'Media:')),
|
||||
ActivityViewMedia(activity: activity),
|
||||
const Padding(
|
||||
padding: EdgeInsets.fromLTRB(15, 30, 0, 10),
|
||||
child: Text(
|
||||
textAlign: TextAlign.left,
|
||||
style: TextStyle(
|
||||
fontSize: 20, fontWeight: FontWeight.bold),
|
||||
'Actions')),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 10, right: 10),
|
||||
child: Card(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(10),
|
||||
topRight: Radius.circular(10)),
|
||||
),
|
||||
color: Theme.of(context).colorScheme.onPrimary,
|
||||
child: Row(children: [
|
||||
Ink(
|
||||
width: 70,
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.primaryContainer,
|
||||
child: Consumer<ActivityTimerModel>(
|
||||
builder: (context, atm, child) {
|
||||
return IconButton(
|
||||
alignment:
|
||||
AlignmentDirectional.center,
|
||||
icon: atm.isActive
|
||||
? const Icon(
|
||||
Icons.pause_rounded)
|
||||
: const Icon(
|
||||
Icons.play_arrow_rounded),
|
||||
onPressed: () => {
|
||||
atm.isActive
|
||||
? atm.pause()
|
||||
: atm.start()
|
||||
});
|
||||
},
|
||||
)),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
child: Consumer<ActivityTimerModel>(
|
||||
builder: (context, atm, child) {
|
||||
return Text(
|
||||
style: const TextStyle(
|
||||
fontSize: 20),
|
||||
textAlign: TextAlign.center,
|
||||
'${atm.actionCount} ${atm.currentAction['type']}'.toTitleCase());
|
||||
},
|
||||
),
|
||||
),
|
||||
Container(
|
||||
alignment: Alignment.centerRight,
|
||||
padding:
|
||||
EdgeInsets.only(right: 15),
|
||||
child:
|
||||
Consumer<ActivityTimerModel>(
|
||||
builder: (context, atm,
|
||||
child) {
|
||||
return Text(
|
||||
style: const TextStyle(
|
||||
fontSize: 12),
|
||||
textAlign: TextAlign.right,
|
||||
'${atm.currentAction['actionID'] + 1} of ${atm.totalActions()}');
|
||||
})),
|
||||
])),
|
||||
]))),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 14, right: 14),
|
||||
child: Consumer<ActivityTimerModel>(
|
||||
builder: (context, atm, child) {
|
||||
return LinearProgressIndicator(
|
||||
value: atm.progress,
|
||||
semanticsLabel: 'Activity Progress',
|
||||
);
|
||||
})),
|
||||
ActivityActionView(actions: actions),
|
||||
]));
|
||||
AppBar(
|
||||
titleSpacing: 0,
|
||||
centerTitle: true,
|
||||
title: const Text('Activity',
|
||||
style: TextStyle(fontSize: 15)),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 15, right: 20, top: 15, bottom: 10),
|
||||
child: Text(
|
||||
maxLines: 1,
|
||||
style: const TextStyle(
|
||||
fontSize: 25,
|
||||
fontWeight: FontWeight.bold),
|
||||
activity.title.toTitleCase())),
|
||||
SizedBox(
|
||||
height: 40,
|
||||
child: ListView(
|
||||
scrollDirection: Axis.horizontal,
|
||||
padding:
|
||||
const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||
shrinkWrap: true,
|
||||
children: [
|
||||
ActivityViewCategories<List<ActivityLevel>>(
|
||||
icon: Icon(Icons.stairs_rounded),
|
||||
text: "Activity Level",
|
||||
object: activity.level != null
|
||||
? [activity.level!]
|
||||
: []),
|
||||
// ActivityViewCategories<List<ActivityMechanic>>(
|
||||
// icon: Icon(Icons.),
|
||||
// text: 'Activity Mechanic',
|
||||
// object: activity.mechanic != null
|
||||
// ? [activity.mechanic!]
|
||||
// : []),
|
||||
ActivityViewCategories<
|
||||
List<ActivityEquipment>>(
|
||||
icon:
|
||||
Icon(Icons.fitness_center_rounded),
|
||||
text: 'Equipment Used',
|
||||
object: activity.equipment != null
|
||||
? [activity.equipment!]
|
||||
: []),
|
||||
ActivityViewCategories<List<ActivityType>>(
|
||||
icon: Icon(Icons.type_specimen_rounded),
|
||||
text: 'Activity Type',
|
||||
object: activity.type != null
|
||||
? [activity.type!]
|
||||
: []),
|
||||
ActivityViewCategories<
|
||||
List<ActivityMuscle>>(
|
||||
icon: Icon(Icons.person),
|
||||
text: 'Muscles used',
|
||||
object: activity_muscle(activity))
|
||||
])),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 10, bottom: 0, left: 15, right: 15),
|
||||
child: Text(
|
||||
maxLines: 4,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
// softWrap: true,
|
||||
textAlign: TextAlign.left,
|
||||
style: const TextStyle(fontSize: 15),
|
||||
jsonToDescription([
|
||||
json.decode(activity.description ?? "")[0]
|
||||
]))),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(right: 15),
|
||||
child: Align(
|
||||
alignment: Alignment.topRight,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
textStyle:
|
||||
WidgetStateProperty.all<TextStyle>(
|
||||
TextStyle(
|
||||
fontWeight:
|
||||
FontWeight.normal)),
|
||||
shape: WidgetStateProperty.all<
|
||||
RoundedRectangleBorder>(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius:
|
||||
BorderRadius.circular(10.0),
|
||||
))),
|
||||
onPressed: () {
|
||||
showGenericSheet(
|
||||
context,
|
||||
Padding(
|
||||
padding: EdgeInsets.all(15),
|
||||
child: Text(
|
||||
style:
|
||||
TextStyle(fontSize: 18),
|
||||
jsonToDescription(json.decode(
|
||||
activity.description ??
|
||||
"")))));
|
||||
},
|
||||
child: Text(
|
||||
"read more",
|
||||
textAlign: TextAlign.right,
|
||||
style: TextStyle(fontSize: 12),
|
||||
),
|
||||
))),
|
||||
const Padding(
|
||||
padding: EdgeInsets.fromLTRB(15, 10, 0, 10),
|
||||
child: Text(
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.bold),
|
||||
'Media:')),
|
||||
ActivityViewMedia(activity: activity),
|
||||
const Padding(
|
||||
padding: EdgeInsets.fromLTRB(15, 30, 0, 10),
|
||||
child: Text(
|
||||
textAlign: TextAlign.left,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.bold),
|
||||
'Actions')),
|
||||
|
||||
// Padding(
|
||||
// padding: const EdgeInsets.only(left: 10, right: 10),
|
||||
// child: Card(
|
||||
// clipBehavior: Clip.antiAlias,
|
||||
// shape: const RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.only(
|
||||
// topLeft: Radius.circular(10),
|
||||
// topRight: Radius.circular(10)),
|
||||
// ),
|
||||
// color: Theme.of(context).colorScheme.onPrimary,
|
||||
// child: Row(children: [
|
||||
// Ink(
|
||||
// width: 70,
|
||||
// color: Theme.of(context)
|
||||
// .colorScheme
|
||||
// .primaryContainer,
|
||||
// child: Consumer<ActivityTimerModel>(
|
||||
// builder: (context, atm, child) {
|
||||
// return IconButton(
|
||||
// alignment:
|
||||
// AlignmentDirectional.center,
|
||||
// icon: atm.isActive
|
||||
// ? const Icon(
|
||||
// Icons.pause_rounded)
|
||||
// : const Icon(
|
||||
// Icons.play_arrow_rounded),
|
||||
// onPressed: () => {
|
||||
// atm.isActive
|
||||
// ? atm.pause()
|
||||
// : atm.start()
|
||||
// });
|
||||
// },
|
||||
// )),
|
||||
// Expanded(
|
||||
// flex: 1,
|
||||
// child: Stack(
|
||||
// alignment: Alignment.center,
|
||||
// children: [
|
||||
// Container(
|
||||
// alignment: Alignment.center,
|
||||
// child: Consumer<ActivityTimerModel>(
|
||||
// builder: (context, atm, child) {
|
||||
// return Text(
|
||||
// style: const TextStyle(
|
||||
// fontSize: 20),
|
||||
// textAlign: TextAlign.center,
|
||||
// '${atm.actionCount} ${atm.currentAction['type']}'
|
||||
// .toTitleCase());
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// Container(
|
||||
// alignment: Alignment.centerRight,
|
||||
// padding:
|
||||
// EdgeInsets.only(right: 15),
|
||||
// child:
|
||||
// Consumer<ActivityTimerModel>(
|
||||
// builder: (context, atm,
|
||||
// child) {
|
||||
// return Text(
|
||||
// style: const TextStyle(
|
||||
// fontSize: 12),
|
||||
// textAlign: TextAlign.right,
|
||||
// '${atm.currentAction['actionID'] + 1} of ${atm.totalActions()}');
|
||||
// })),
|
||||
// ])),
|
||||
// ]))),
|
||||
// Padding(
|
||||
// padding: EdgeInsets.only(left: 14, right: 14),
|
||||
// child: Consumer<ActivityTimerModel>(
|
||||
// builder: (context, atm, child) {
|
||||
// return LinearProgressIndicator(
|
||||
// value: atm.progress,
|
||||
// semanticsLabel: 'Activity Progress',
|
||||
// );
|
||||
// })),
|
||||
// ActivityActionView(actions: actions),
|
||||
] +
|
||||
action(actions)));
|
||||
} else {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
|
@ -1,30 +1,35 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/extensions/string_extensions.dart';
|
||||
|
||||
class ActivityViewCategories extends StatelessWidget {
|
||||
const ActivityViewCategories({super.key, required this.categories});
|
||||
class ActivityViewCategories<T extends List<Enum>> extends StatelessWidget {
|
||||
const ActivityViewCategories(
|
||||
{super.key,
|
||||
required this.object,
|
||||
required this.icon,
|
||||
required this.text});
|
||||
|
||||
final List<ActivityCategories> categories;
|
||||
final T object;
|
||||
final Icon icon;
|
||||
final String text;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
height: 40,
|
||||
child: ListView.builder(
|
||||
shrinkWrap: true,
|
||||
scrollDirection: Axis.horizontal,
|
||||
padding: const EdgeInsets.only(right: 10),
|
||||
itemCount: categories.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return ActionChip(
|
||||
return ListView.builder(
|
||||
shrinkWrap: true,
|
||||
scrollDirection: Axis.horizontal,
|
||||
// padding: const EdgeInsets.only(right: 10, left: 10),
|
||||
itemCount: object.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(right: 10),
|
||||
child: ActionChip(
|
||||
visualDensity: VisualDensity.compact,
|
||||
avatar: const Icon(Icons.category_rounded),
|
||||
label: Text(maxLines: 1, categories[index].name.toTitleCase()),
|
||||
tooltip: "Activity Category",
|
||||
avatar: icon,
|
||||
label: Text(maxLines: 1, object[index].name.toTitleCase()),
|
||||
tooltip: text,
|
||||
onPressed: () {},
|
||||
);
|
||||
},
|
||||
));
|
||||
));
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
37
lib/widgets/generic/elements/add_card_generic.dart
Normal file
37
lib/widgets/generic/elements/add_card_generic.dart
Normal file
@ -0,0 +1,37 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AddCardGeneric extends StatelessWidget {
|
||||
const AddCardGeneric(
|
||||
{super.key, required this.title, required this.description, this.action});
|
||||
|
||||
final String title;
|
||||
final String description;
|
||||
final Function? action;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Expanded(
|
||||
child: ListView(
|
||||
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||
children: [
|
||||
Card.outlined(
|
||||
child: InkWell(
|
||||
customBorder: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
onTap: () {
|
||||
if (action != null) {
|
||||
action!();
|
||||
}
|
||||
},
|
||||
child: ListTile(
|
||||
contentPadding:
|
||||
EdgeInsets.only(top: 5, left: 15, right: 5, bottom: 5),
|
||||
autofocus: true,
|
||||
leading: Icon(Icons.add_box_rounded),
|
||||
title: Text(title),
|
||||
subtitle: Text(description),
|
||||
)))
|
||||
]));
|
||||
}
|
||||
}
|
@ -57,8 +57,7 @@ class _FormSearchInputState extends State<FormSearchInput> {
|
||||
_currentQuery = query;
|
||||
|
||||
// In a real application, there should be some error handling here.
|
||||
// final Iterable<String> options = await _FakeAPI.search(_currentQuery!);
|
||||
if (query.isNotEmpty) {
|
||||
if (query.isNotEmpty && query.length > 3) {
|
||||
final List<Suggestion>? suggestions =
|
||||
await service.fetchSuggestions(_currentQuery!);
|
||||
|
||||
|
@ -11,9 +11,11 @@ import 'package:sendtrain/widgets/builders/dialogs.dart';
|
||||
import 'package:video_player/video_player.dart';
|
||||
|
||||
class MediaCard extends StatelessWidget {
|
||||
const MediaCard({super.key, required this.media, this.callback});
|
||||
const MediaCard(
|
||||
{super.key, required this.media, this.callback, this.canDelete});
|
||||
|
||||
final MediaItem media;
|
||||
final bool? canDelete;
|
||||
final Function? callback;
|
||||
|
||||
@override
|
||||
@ -44,7 +46,9 @@ class MediaCard extends StatelessWidget {
|
||||
RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
||||
shadowColor: const Color.fromARGB(0, 255, 255, 255),
|
||||
child: TextButton(
|
||||
onLongPress: () => showRemovalDialog(
|
||||
onLongPress: () {
|
||||
if (canDelete == true) {
|
||||
showRemovalDialog(
|
||||
'Media Removal',
|
||||
'Would you like to permanently remove this media from the current session?',
|
||||
context, () {
|
||||
@ -55,7 +59,9 @@ class MediaCard extends StatelessWidget {
|
||||
if (callback != null) {
|
||||
callback!();
|
||||
}
|
||||
}),
|
||||
});
|
||||
}
|
||||
},
|
||||
onPressed: () => showMediaDetailWidget(context, media),
|
||||
child: const ListTile(
|
||||
title: Text(''),
|
||||
|
@ -83,7 +83,7 @@ class _SessionViewState extends State<SessionView> {
|
||||
),
|
||||
children: [
|
||||
FloatingActionButton.extended(
|
||||
icon: const Icon(Icons.edit_outlined),
|
||||
icon: const Icon(Icons.military_tech_rounded),
|
||||
label: Text('Add Achievement'),
|
||||
onPressed: () {
|
||||
showEditorSheet(
|
||||
@ -93,7 +93,7 @@ class _SessionViewState extends State<SessionView> {
|
||||
},
|
||||
),
|
||||
FloatingActionButton.extended(
|
||||
icon: const Icon(Icons.edit_outlined),
|
||||
icon: const Icon(Icons.sports_gymnastics_rounded),
|
||||
label: Text('Add Activity'),
|
||||
onPressed: () {
|
||||
showEditorSheet(
|
||||
@ -104,7 +104,7 @@ class _SessionViewState extends State<SessionView> {
|
||||
),
|
||||
FloatingActionButton.extended(
|
||||
icon: const Icon(Icons.edit_outlined),
|
||||
label: Text('Edit'),
|
||||
label: Text('Edit Session'),
|
||||
onPressed: () {
|
||||
showEditorSheet(
|
||||
context,
|
||||
@ -114,7 +114,7 @@ class _SessionViewState extends State<SessionView> {
|
||||
),
|
||||
FloatingActionButton.extended(
|
||||
icon: const Icon(Icons.history_outlined),
|
||||
label: Text('Restart'),
|
||||
label: Text('Restart Session'),
|
||||
onPressed: () {
|
||||
Session newSession =
|
||||
session.copyWith(status: SessionStatus.pending);
|
||||
@ -131,7 +131,7 @@ class _SessionViewState extends State<SessionView> {
|
||||
),
|
||||
FloatingActionButton.extended(
|
||||
icon: const Icon(Icons.done_all_outlined),
|
||||
label: Text('Done'),
|
||||
label: Text('Finish Session'),
|
||||
onPressed: () {
|
||||
Session newSession =
|
||||
session.copyWith(status: SessionStatus.completed);
|
||||
|
@ -4,6 +4,7 @@ import 'package:sendtrain/daos/activities_dao.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/helpers/widget_helpers.dart';
|
||||
import 'package:sendtrain/widgets/activities/activity_card.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/add_card_generic.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_activities_editor.dart';
|
||||
|
||||
@ -32,36 +33,21 @@ class _SessionViewActivitiesState extends State<SessionViewActivities> {
|
||||
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||
itemCount: activities.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return ActivityCard(activity: activities[index]);
|
||||
return ActivityCard(
|
||||
activity: activities[index], session: widget.session);
|
||||
},
|
||||
));
|
||||
} else {
|
||||
return Expanded(
|
||||
child: ListView(
|
||||
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||
children: [
|
||||
Card.outlined(
|
||||
child: InkWell(
|
||||
customBorder: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
onTap: () {
|
||||
showEditorSheet(
|
||||
context,
|
||||
SessionActivitiesEditor(
|
||||
session: widget.session,
|
||||
callback: () {}));
|
||||
},
|
||||
child: ListTile(
|
||||
contentPadding: EdgeInsets.only(
|
||||
top: 5, left: 15, right: 5, bottom: 5),
|
||||
autofocus: true,
|
||||
leading: Icon(Icons.add_box_rounded),
|
||||
title: Text('Add an Activity!'),
|
||||
subtitle: Text(
|
||||
'Here you can associate one or more activities that you can follow along with during your session.'),
|
||||
)))
|
||||
]));
|
||||
return AddCardGeneric(
|
||||
title: 'Add an Activity!',
|
||||
description:
|
||||
'Here you can associate one or more activities that you can follow along with during your session.',
|
||||
action: () {
|
||||
showEditorSheet(
|
||||
context,
|
||||
SessionActivitiesEditor(
|
||||
session: widget.session, callback: () {}));
|
||||
});
|
||||
}
|
||||
} else {
|
||||
return GenericProgressIndicator();
|
||||
|
@ -32,7 +32,7 @@ class _SessionViewMediaState extends State<SessionViewMedia> {
|
||||
List<Widget> content;
|
||||
if (mediaItems.isNotEmpty) {
|
||||
List<Widget> mediaCards = List.generate(mediaItems.length,
|
||||
(i) => MediaCard(media: mediaItems[i], callback: resetState));
|
||||
(i) => MediaCard(media: mediaItems[i], callback: resetState, canDelete: true));
|
||||
content = mediaCards;
|
||||
} else {
|
||||
content = [
|
||||
|
@ -7,11 +7,6 @@ import 'schema_v1.dart' as v1;
|
||||
import 'schema_v2.dart' as v2;
|
||||
import 'schema_v3.dart' as v3;
|
||||
import 'schema_v4.dart' as v4;
|
||||
import 'schema_v5.dart' as v5;
|
||||
import 'schema_v6.dart' as v6;
|
||||
import 'schema_v7.dart' as v7;
|
||||
import 'schema_v8.dart' as v8;
|
||||
import 'schema_v9.dart' as v9;
|
||||
import 'schema_v10.dart' as v10;
|
||||
import 'schema_v11.dart' as v11;
|
||||
import 'schema_v12.dart' as v12;
|
||||
@ -22,6 +17,12 @@ import 'schema_v16.dart' as v16;
|
||||
import 'schema_v17.dart' as v17;
|
||||
import 'schema_v18.dart' as v18;
|
||||
import 'schema_v19.dart' as v19;
|
||||
import 'schema_v5.dart' as v5;
|
||||
import 'schema_v6.dart' as v6;
|
||||
import 'schema_v7.dart' as v7;
|
||||
import 'schema_v8.dart' as v8;
|
||||
import 'schema_v9.dart' as v9;
|
||||
import 'schema_v20.dart' as v20;
|
||||
|
||||
class GeneratedHelper implements SchemaInstantiationHelper {
|
||||
@override
|
||||
@ -35,16 +36,6 @@ class GeneratedHelper implements SchemaInstantiationHelper {
|
||||
return v3.DatabaseAtV3(db);
|
||||
case 4:
|
||||
return v4.DatabaseAtV4(db);
|
||||
case 5:
|
||||
return v5.DatabaseAtV5(db);
|
||||
case 6:
|
||||
return v6.DatabaseAtV6(db);
|
||||
case 7:
|
||||
return v7.DatabaseAtV7(db);
|
||||
case 8:
|
||||
return v8.DatabaseAtV8(db);
|
||||
case 9:
|
||||
return v9.DatabaseAtV9(db);
|
||||
case 10:
|
||||
return v10.DatabaseAtV10(db);
|
||||
case 11:
|
||||
@ -65,6 +56,18 @@ class GeneratedHelper implements SchemaInstantiationHelper {
|
||||
return v18.DatabaseAtV18(db);
|
||||
case 19:
|
||||
return v19.DatabaseAtV19(db);
|
||||
case 5:
|
||||
return v5.DatabaseAtV5(db);
|
||||
case 6:
|
||||
return v6.DatabaseAtV6(db);
|
||||
case 7:
|
||||
return v7.DatabaseAtV7(db);
|
||||
case 8:
|
||||
return v8.DatabaseAtV8(db);
|
||||
case 9:
|
||||
return v9.DatabaseAtV9(db);
|
||||
case 20:
|
||||
return v20.DatabaseAtV20(db);
|
||||
default:
|
||||
throw MissingSchemaException(version, versions);
|
||||
}
|
||||
@ -89,6 +92,7 @@ class GeneratedHelper implements SchemaInstantiationHelper {
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
19
|
||||
19,
|
||||
20
|
||||
];
|
||||
}
|
||||
|
2219
test/drift/sendtrain/generated/schema_v20.dart
Normal file
2219
test/drift/sendtrain/generated/schema_v20.dart
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user