achievement crud complete
This commit is contained in:
parent
2206720810
commit
32826abcea
@ -8,6 +8,7 @@ class SessionsDao extends DatabaseAccessor<AppDatabase> with _$SessionsDaoMixin
|
|||||||
SessionsDao(super.db);
|
SessionsDao(super.db);
|
||||||
|
|
||||||
Future<Session> find(int id) => (select(sessions)..where((session) => session.id.equals(id) )).getSingle();
|
Future<Session> find(int id) => (select(sessions)..where((session) => session.id.equals(id) )).getSingle();
|
||||||
|
Stream<Session> watchSession(int id) => (select(sessions)..where((session) => session.id.equals(id) )).watchSingle();
|
||||||
Future<List<Session>> all() => select(sessions).get();
|
Future<List<Session>> all() => select(sessions).get();
|
||||||
Stream<List<Session>> watch() => select(sessions).watch();
|
Stream<List<Session>> watch() => select(sessions).watch();
|
||||||
Future createOrUpdate(SessionsCompanion session) => into(sessions).insertOnConflictUpdate(session);
|
Future createOrUpdate(SessionsCompanion session) => into(sessions).insertOnConflictUpdate(session);
|
||||||
|
@ -9,7 +9,7 @@ showMediaDetailWidget(BuildContext context, MediaItem media) {
|
|||||||
showEditorSheet(BuildContext context, Widget widget) {
|
showEditorSheet(BuildContext context, Widget widget) {
|
||||||
showModalBottomSheet<void>(
|
showModalBottomSheet<void>(
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.all(Radius.circular(10.0)),
|
borderRadius: BorderRadius.only(topLeft: Radius.circular(10.0), topRight: Radius.circular(10.0)),
|
||||||
),
|
),
|
||||||
context: context,
|
context: context,
|
||||||
showDragHandle: true,
|
showDragHandle: true,
|
||||||
|
@ -1,18 +1,74 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:drift/drift.dart' hide Column;
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:sendtrain/daos/sessions_dao.dart';
|
||||||
|
import 'package:sendtrain/database/database.dart';
|
||||||
|
import 'package:sendtrain/widgets/generic/elements/form_text_input.dart';
|
||||||
|
|
||||||
class AchievementEditor extends StatefulWidget {
|
// class AchievementEditor extends StatefulWidget {
|
||||||
const AchievementEditor({super.key, this.achievements, this.callback});
|
// const AchievementEditor({super.key, required this.session, this.callback});
|
||||||
|
|
||||||
final List? achievements;
|
// final Session session;
|
||||||
|
// final Function? callback;
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// State<AchievementEditor> createState() => _AchievementEditorState();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// class _AchievementEditorState extends State<AchievementEditor> {
|
||||||
|
class AchievementEditor extends StatelessWidget {
|
||||||
|
AchievementEditor({super.key, required this.session, this.callback});
|
||||||
|
|
||||||
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||||
|
final TextEditingController tec = TextEditingController();
|
||||||
|
final Session session;
|
||||||
final Function? callback;
|
final Function? callback;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<AchievementEditor> createState() => _AchievementEditorState();
|
Widget build(
|
||||||
}
|
BuildContext context,
|
||||||
|
) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.fromLTRB(15, 0, 15, 15),
|
||||||
|
child: Form(
|
||||||
|
key: _formKey,
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(top: 10, bottom: 10),
|
||||||
|
child: Text('Create Achievement',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.titleLarge)),
|
||||||
|
FormTextInput(controller: tec, title: 'Achievement'),
|
||||||
|
Row(mainAxisAlignment: MainAxisAlignment.end, children: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(top: 10),
|
||||||
|
child: FilledButton(
|
||||||
|
child: Text('Submit'),
|
||||||
|
onPressed: () async {
|
||||||
|
session.achievements;
|
||||||
|
List achievements =
|
||||||
|
json.decode(session.achievements!);
|
||||||
|
achievements.add(tec.text);
|
||||||
|
Session updatedSession = session.copyWith(
|
||||||
|
achievements:
|
||||||
|
Value<String>(json.encode(achievements)));
|
||||||
|
|
||||||
class _AchievementEditorState extends State<AchievementEditor> {
|
SessionsDao(Provider.of<AppDatabase>(context,
|
||||||
@override
|
listen: false))
|
||||||
Widget build(BuildContext context, ) {
|
.replace(updatedSession);
|
||||||
return Text('this is a test');
|
|
||||||
|
Navigator.pop(_formKey.currentContext!, 'Submit');
|
||||||
|
|
||||||
|
if (callback != null) {
|
||||||
|
await callback!();
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
])
|
||||||
|
])));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -24,8 +24,7 @@ class ActivityCard extends StatefulWidget {
|
|||||||
class ActivityCardState extends State<ActivityCard> {
|
class ActivityCardState extends State<ActivityCard> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ActivityTimerModel atm =
|
final ActivityTimerModel atm = Provider.of<ActivityTimerModel>(context);
|
||||||
Provider.of<ActivityTimerModel>(context);
|
|
||||||
|
|
||||||
return FutureBuilder<List<MediaItem>>(
|
return FutureBuilder<List<MediaItem>>(
|
||||||
future: MediaItemsDao(Provider.of<AppDatabase>(context))
|
future: MediaItemsDao(Provider.of<AppDatabase>(context))
|
||||||
@ -48,7 +47,8 @@ class ActivityCardState extends State<ActivityCard> {
|
|||||||
ListTile(
|
ListTile(
|
||||||
// visualDensity: VisualDensity(horizontal: VisualDensity.maximumDensity),
|
// visualDensity: VisualDensity(horizontal: VisualDensity.maximumDensity),
|
||||||
leading: CardImage(
|
leading: CardImage(
|
||||||
image: findMediaByType(mediaItems, MediaType.image)),
|
image:
|
||||||
|
findMediaByType(mediaItems, MediaType.image)),
|
||||||
title: Consumer<ActivityTimerModel>(
|
title: Consumer<ActivityTimerModel>(
|
||||||
builder: (context, atm, child) {
|
builder: (context, atm, child) {
|
||||||
if (atm.activity?.id == widget.activity.id) {
|
if (atm.activity?.id == widget.activity.id) {
|
||||||
@ -78,13 +78,12 @@ class ActivityCardState extends State<ActivityCard> {
|
|||||||
showRemovalDialog(
|
showRemovalDialog(
|
||||||
'Activity Removal',
|
'Activity Removal',
|
||||||
'Would you like to permanently remove this activity from the current session?',
|
'Would you like to permanently remove this activity from the current session?',
|
||||||
|
context, () {
|
||||||
|
ActivitiesDao(Provider.of<AppDatabase>(
|
||||||
context,
|
context,
|
||||||
ActivitiesDao(
|
listen: false))
|
||||||
Provider.of<AppDatabase>(
|
.remove(widget.activity);
|
||||||
context,
|
}).then((result) {
|
||||||
listen: false)),
|
|
||||||
widget.activity)
|
|
||||||
.then((result) {
|
|
||||||
setState(() {});
|
setState(() {});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -21,7 +21,7 @@ Future showGenericDialog(dynamic object, BuildContext parentContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future showCrudDialog(String title, String content, BuildContext context,
|
Future showCrudDialog(String title, String content, BuildContext context,
|
||||||
dynamic daoCall, dynamic object) {
|
[Function? callback]) {
|
||||||
return showAdaptiveDialog(
|
return showAdaptiveDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (BuildContext context) => AlertDialog(
|
builder: (BuildContext context) => AlertDialog(
|
||||||
@ -35,7 +35,10 @@ Future showCrudDialog(String title, String content, BuildContext context,
|
|||||||
child: const Text('Cancel'),
|
child: const Text('Cancel'),
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () => {daoCall(object), Navigator.pop(context, 'OK')},
|
onPressed: () => {
|
||||||
|
if (callback != null) {callback()},
|
||||||
|
Navigator.pop(context, 'OK')
|
||||||
|
},
|
||||||
child: const Text('OK'),
|
child: const Text('OK'),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -44,11 +47,11 @@ Future showCrudDialog(String title, String content, BuildContext context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future showRemovalDialog(String title, String content, BuildContext context,
|
Future showRemovalDialog(String title, String content, BuildContext context,
|
||||||
dynamic dao, dynamic object) {
|
[Function? callback]) {
|
||||||
return showCrudDialog(title, content, context, dao.remove, object);
|
return showCrudDialog(title, content, context, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future showUpdateDialog(String title, String content, BuildContext context,
|
Future showUpdateDialog(String title, String content, BuildContext context,
|
||||||
dynamic dao, dynamic object) {
|
[Function? callback]) {
|
||||||
return showCrudDialog(title, content, context, dao.replace, object);
|
return showCrudDialog(title, content, context, callback);
|
||||||
}
|
}
|
||||||
|
@ -16,41 +16,6 @@ class MediaCard extends StatelessWidget {
|
|||||||
final MediaItem media;
|
final MediaItem media;
|
||||||
final Function? callback;
|
final Function? callback;
|
||||||
|
|
||||||
// @override
|
|
||||||
// State<MediaCard> createState() => _MediaCardState();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// class _MediaCardState extends State<MediaCard> {
|
|
||||||
// // late VideoPlayerController _controller;
|
|
||||||
// late MediaItem media;
|
|
||||||
// late Function? callback;
|
|
||||||
|
|
||||||
// @override
|
|
||||||
// void initState() {
|
|
||||||
// super.initState();
|
|
||||||
// media = widget.media;
|
|
||||||
// callback = widget.callback;
|
|
||||||
// _controller = VideoPlayerController.asset(dataSource)
|
|
||||||
// ..initialize().then((_) {
|
|
||||||
// setState(() {}); //when your thumbnail will show.
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// @override
|
|
||||||
// void dispose() {
|
|
||||||
// super.dispose();
|
|
||||||
// _controller.dispose();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Future<VideoPlayerController> createVideoPlayer() async {
|
|
||||||
// final File file =
|
|
||||||
// await ImgB64Decoder.fileFromB64String(widget.encodedBytes);
|
|
||||||
// final VideoPlayerController controller = VideoPlayerController.file(file);
|
|
||||||
// await controller.initialize();
|
|
||||||
// await controller.setLooping(true);
|
|
||||||
// return controller;
|
|
||||||
// }
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
DecorationImage mediaImage(MediaItem media) {
|
DecorationImage mediaImage(MediaItem media) {
|
||||||
@ -63,9 +28,7 @@ class MediaCard extends StatelessWidget {
|
|||||||
} else if (media.type == MediaType.youtube) {
|
} else if (media.type == MediaType.youtube) {
|
||||||
image =
|
image =
|
||||||
NetworkImage('https://img.youtube.com/vi/${media.reference}/0.jpg');
|
NetworkImage('https://img.youtube.com/vi/${media.reference}/0.jpg');
|
||||||
} else if (media.type == MediaType.localVideo) {
|
} else if (media.type == MediaType.localVideo) {}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return DecorationImage(image: image, fit: BoxFit.cover);
|
return DecorationImage(image: image, fit: BoxFit.cover);
|
||||||
}
|
}
|
||||||
@ -84,11 +47,11 @@ class MediaCard extends StatelessWidget {
|
|||||||
onLongPress: () => showRemovalDialog(
|
onLongPress: () => showRemovalDialog(
|
||||||
'Media Removal',
|
'Media Removal',
|
||||||
'Would you like to permanently remove this media from the current session?',
|
'Would you like to permanently remove this media from the current session?',
|
||||||
context,
|
context, () {
|
||||||
MediaItemsDao(Provider.of<AppDatabase>(context,
|
MediaItemsDao(
|
||||||
listen: false)),
|
Provider.of<AppDatabase>(context, listen: false))
|
||||||
media)
|
.remove(media);
|
||||||
.then((result) {
|
}).then((result) {
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback!();
|
callback!();
|
||||||
}
|
}
|
||||||
|
@ -82,11 +82,11 @@ class _SessionCardFullState extends State<SessionCardFull> {
|
|||||||
showRemovalDialog(
|
showRemovalDialog(
|
||||||
'Session Removal',
|
'Session Removal',
|
||||||
'Would you like to permanently remove this session?',
|
'Would you like to permanently remove this session?',
|
||||||
context,
|
context, () {
|
||||||
SessionsDao(Provider.of<AppDatabase>(context,
|
SessionsDao(
|
||||||
listen: false)),
|
Provider.of<AppDatabase>(context, listen: false))
|
||||||
session)
|
.remove(session);
|
||||||
.then((result) {
|
}).then((result) {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -281,7 +281,7 @@ class _SessionEditorState extends State<SessionEditor> {
|
|||||||
|
|
||||||
if (widget.callback != null) {
|
if (widget.callback != null) {
|
||||||
await widget
|
await widget
|
||||||
.callback!(widget.session!.id);
|
.callback!();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import 'package:sendtrain/daos/sessions_dao.dart';
|
|||||||
import 'package:sendtrain/database/database.dart';
|
import 'package:sendtrain/database/database.dart';
|
||||||
import 'package:sendtrain/extensions/string_extensions.dart';
|
import 'package:sendtrain/extensions/string_extensions.dart';
|
||||||
import 'package:sendtrain/helpers/widget_helpers.dart';
|
import 'package:sendtrain/helpers/widget_helpers.dart';
|
||||||
|
import 'package:sendtrain/widgets/achievements/achievement_editor.dart';
|
||||||
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
|
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
|
||||||
import 'package:sendtrain/widgets/sessions/session_editor.dart';
|
import 'package:sendtrain/widgets/sessions/session_editor.dart';
|
||||||
import 'package:sendtrain/widgets/sessions/session_view_achievements.dart';
|
import 'package:sendtrain/widgets/sessions/session_view_achievements.dart';
|
||||||
@ -39,13 +40,13 @@ class _SessionViewState extends State<SessionView> {
|
|||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetState(int sessionId) async {
|
void resetState() async {
|
||||||
Session updatedSession =
|
Session updatedSession =
|
||||||
await SessionsDao(Provider.of<AppDatabase>(context, listen: false))
|
await SessionsDao(Provider.of<AppDatabase>(context, listen: false))
|
||||||
.find(sessionId);
|
.find(session.id);
|
||||||
|
|
||||||
final state = _fabKey.currentState;
|
final state = _fabKey.currentState;
|
||||||
if (state != null) {
|
if (state != null && state.isOpen) {
|
||||||
state.toggle();
|
state.toggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,13 +65,16 @@ class _SessionViewState extends State<SessionView> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return StreamBuilder<List<Activity>>(
|
return StreamBuilder<Session>(
|
||||||
stream: ActivitiesDao(Provider.of<AppDatabase>(context))
|
initialData: session,
|
||||||
.watchSessionActivities(session.id),
|
stream: SessionsDao(Provider.of<AppDatabase>(context))
|
||||||
|
.watchSession(session.id),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
|
// return StreamBuilder<List<Activity>>(
|
||||||
|
// stream: ActivitiesDao(Provider.of<AppDatabase>(context))
|
||||||
|
// .watchSessionActivities(session.id),
|
||||||
|
// builder: (context, snapshot) {
|
||||||
if (snapshot.hasData) {
|
if (snapshot.hasData) {
|
||||||
final activities = snapshot.data!;
|
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
floatingActionButtonLocation: ExpandableFab.location,
|
floatingActionButtonLocation: ExpandableFab.location,
|
||||||
floatingActionButton: ExpandableFab(
|
floatingActionButton: ExpandableFab(
|
||||||
@ -82,6 +86,26 @@ class _SessionViewState extends State<SessionView> {
|
|||||||
blur: 10,
|
blur: 10,
|
||||||
),
|
),
|
||||||
children: [
|
children: [
|
||||||
|
FloatingActionButton.extended(
|
||||||
|
icon: const Icon(Icons.edit_outlined),
|
||||||
|
label: Text('Add Achievement'),
|
||||||
|
onPressed: () {
|
||||||
|
showEditorSheet(
|
||||||
|
context,
|
||||||
|
AchievementEditor(
|
||||||
|
session: session, callback: resetState));
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FloatingActionButton.extended(
|
||||||
|
icon: const Icon(Icons.edit_outlined),
|
||||||
|
label: Text('Edit'),
|
||||||
|
onPressed: () {
|
||||||
|
showEditorSheet(
|
||||||
|
context,
|
||||||
|
SessionEditor(
|
||||||
|
session: session, callback: resetState));
|
||||||
|
},
|
||||||
|
),
|
||||||
FloatingActionButton.extended(
|
FloatingActionButton.extended(
|
||||||
icon: const Icon(Icons.history_outlined),
|
icon: const Icon(Icons.history_outlined),
|
||||||
label: Text('Restart'),
|
label: Text('Restart'),
|
||||||
@ -116,16 +140,6 @@ class _SessionViewState extends State<SessionView> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FloatingActionButton.extended(
|
|
||||||
icon: const Icon(Icons.edit_outlined),
|
|
||||||
label: Text('Edit'),
|
|
||||||
onPressed: () {
|
|
||||||
showEditorSheet(
|
|
||||||
context,
|
|
||||||
SessionEditor(
|
|
||||||
session: session, callback: resetState));
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]),
|
]),
|
||||||
body: Column(
|
body: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
@ -144,7 +158,7 @@ class _SessionViewState extends State<SessionView> {
|
|||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 25, fontWeight: FontWeight.bold),
|
fontSize: 25, fontWeight: FontWeight.bold),
|
||||||
title())),
|
title())),
|
||||||
SessionViewAchievements(session: session),
|
SessionViewAchievements(session: session, callback: resetState),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 15, right: 15),
|
padding: const EdgeInsets.only(left: 15, right: 15),
|
||||||
child: Text(
|
child: Text(
|
||||||
@ -163,7 +177,7 @@ class _SessionViewState extends State<SessionView> {
|
|||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 20, fontWeight: FontWeight.bold),
|
fontSize: 20, fontWeight: FontWeight.bold),
|
||||||
'Activites:')),
|
'Activites:')),
|
||||||
SessionViewActivities(activities: activities),
|
SessionViewActivities(session: session),
|
||||||
],
|
],
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:drift/drift.dart' hide Column;
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:sendtrain/daos/session_activities_dao.dart';
|
|
||||||
import 'package:sendtrain/daos/sessions_dao.dart';
|
import 'package:sendtrain/daos/sessions_dao.dart';
|
||||||
import 'package:sendtrain/database/database.dart';
|
import 'package:sendtrain/database/database.dart';
|
||||||
import 'package:sendtrain/extensions/string_extensions.dart';
|
import 'package:sendtrain/extensions/string_extensions.dart';
|
||||||
@ -11,33 +11,25 @@ import 'package:sendtrain/widgets/achievements/achievement_editor.dart';
|
|||||||
import 'package:sendtrain/widgets/builders/dialogs.dart';
|
import 'package:sendtrain/widgets/builders/dialogs.dart';
|
||||||
|
|
||||||
class SessionViewAchievements extends StatelessWidget {
|
class SessionViewAchievements extends StatelessWidget {
|
||||||
const SessionViewAchievements({super.key, required this.session});
|
const SessionViewAchievements(
|
||||||
|
{super.key, required this.session, this.callback});
|
||||||
|
|
||||||
final Session session;
|
final Session session;
|
||||||
|
final Function? callback;
|
||||||
|
|
||||||
// List<String> getAchievements(List<SessionActivity> sessionActivities) {
|
Session updateAchievements(int index, List achievements) {
|
||||||
// List<String> achievements = [];
|
achievements.removeAt(index);
|
||||||
|
return session.copyWith(
|
||||||
// for (int i = 0; i < sessionActivities.length; i++) {
|
achievements: Value<String>(json.encode(achievements)));
|
||||||
// final SessionActivity sessionActivity = sessionActivities[i];
|
|
||||||
// final List? saAchievments = sessionActivity.achievements?.split(',');
|
|
||||||
|
|
||||||
// if (saAchievments != null) {
|
|
||||||
// saAchievments.forEach((achievement) => achievements.add(achievement));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return achievements;
|
|
||||||
// }
|
|
||||||
|
|
||||||
void resetState() {
|
|
||||||
// setState(() {});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Widget content;
|
Widget content;
|
||||||
if (session.achievements == null) {
|
final AppDatabase db = Provider.of<AppDatabase>(context, listen: false);
|
||||||
|
List achievements = json.decode(session.achievements ?? "[]");
|
||||||
|
|
||||||
|
if (achievements.isEmpty) {
|
||||||
content = Padding(
|
content = Padding(
|
||||||
padding: const EdgeInsets.only(left: 10, right: 5),
|
padding: const EdgeInsets.only(left: 10, right: 5),
|
||||||
child: ActionChip(
|
child: ActionChip(
|
||||||
@ -45,11 +37,11 @@ class SessionViewAchievements extends StatelessWidget {
|
|||||||
avatar: const Icon(Icons.check_circle_outline),
|
avatar: const Icon(Icons.check_circle_outline),
|
||||||
label: Text(maxLines: 1, 'Add Achievements!'),
|
label: Text(maxLines: 1, 'Add Achievements!'),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
showEditorSheet(context, AchievementEditor(callback: resetState));
|
showEditorSheet(context,
|
||||||
|
AchievementEditor(session: session, callback: callback));
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
final achievements = json.decode(session.achievements!);
|
|
||||||
content = ListView.builder(
|
content = ListView.builder(
|
||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||||
@ -60,15 +52,23 @@ class SessionViewAchievements extends StatelessWidget {
|
|||||||
child: ActionChip(
|
child: ActionChip(
|
||||||
visualDensity: VisualDensity.compact,
|
visualDensity: VisualDensity.compact,
|
||||||
avatar: const Icon(Icons.check_circle_outline),
|
avatar: const Icon(Icons.check_circle_outline),
|
||||||
label: Text(maxLines: 1, achievements[index].toString().toTitleCase()),
|
label: Text(
|
||||||
onPressed: () {
|
maxLines: 1,
|
||||||
showUpdateDialog(
|
achievements[index].toString().toTitleCase()),
|
||||||
|
onPressed: () async {
|
||||||
|
// remove the achievement at index
|
||||||
|
// then update session
|
||||||
|
Session newSession =
|
||||||
|
updateAchievements(index, achievements);
|
||||||
|
await showUpdateDialog(
|
||||||
'Achievement Removal',
|
'Achievement Removal',
|
||||||
'Would you like to remove this achievement?',
|
'Would you like to remove this achievement?',
|
||||||
context,
|
context, () {
|
||||||
SessionsDao(
|
SessionsDao(db).replace(newSession);
|
||||||
Provider.of<AppDatabase>(context, listen: false)),
|
if (callback != null) {
|
||||||
session);
|
callback!();
|
||||||
|
}
|
||||||
|
});
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@ -81,59 +81,101 @@ class SessionViewAchievements extends StatelessWidget {
|
|||||||
child: SizedBox(height: 40, child: content)),
|
child: SizedBox(height: 40, child: content)),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
// return StreamBuilder<List<SessionActivity>>(
|
|
||||||
// stream: SessionActivitiesDao(Provider.of<AppDatabase>(context))
|
|
||||||
// .fromSessionId(session.id).asStream(),
|
|
||||||
// builder: (context, snapshot) {
|
|
||||||
// if (snapshot.hasData) {
|
|
||||||
// final sessionActivities = snapshot.data!;
|
|
||||||
// final achievements = getAchievements(sessionActivities);
|
|
||||||
|
|
||||||
// Widget content;
|
|
||||||
// if (achievements.isEmpty) {
|
|
||||||
// content = Padding(
|
|
||||||
// padding: const EdgeInsets.only(left: 10, right: 5),
|
|
||||||
// child: ActionChip(
|
|
||||||
// visualDensity: VisualDensity.compact,
|
|
||||||
// avatar: const Icon(Icons.check_circle_outline),
|
|
||||||
// label: Text(maxLines: 1, 'Add Achievements!'),
|
|
||||||
// onPressed: () {
|
|
||||||
// showEditorSheet(context, AchievementEditor(achievements: achievements, callback: resetState));
|
|
||||||
// },
|
|
||||||
// ));
|
|
||||||
// } else {
|
|
||||||
// content = ListView.builder(
|
|
||||||
// scrollDirection: Axis.horizontal,
|
|
||||||
// padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
|
||||||
// itemCount: achievements.length,
|
|
||||||
// itemBuilder: (BuildContext context, int index) {
|
|
||||||
// return Padding(
|
|
||||||
// padding: const EdgeInsets.only(right: 5),
|
|
||||||
// child: ActionChip(
|
|
||||||
// visualDensity: VisualDensity.compact,
|
|
||||||
// avatar: const Icon(Icons.check_circle_outline),
|
|
||||||
// label: Text(
|
|
||||||
// maxLines: 1, achievements[index].toTitleCase()),
|
|
||||||
// onPressed: () {
|
|
||||||
// // remove achievements
|
|
||||||
// },
|
|
||||||
// ));
|
|
||||||
// },
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return Column(
|
|
||||||
// children: [
|
|
||||||
// Padding(
|
|
||||||
// padding: const EdgeInsets.only(bottom: 10),
|
|
||||||
// child: SizedBox(height: 40, child: content)),
|
|
||||||
// ],
|
|
||||||
// );
|
|
||||||
// } else {
|
|
||||||
// return Padding(
|
|
||||||
// padding: EdgeInsets.all(15),
|
|
||||||
// child: CircularProgressIndicator());
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// class SessionViewAchievements extends StatefulWidget {
|
||||||
|
// const SessionViewAchievements({super.key, required this.session});
|
||||||
|
|
||||||
|
// final Session session;
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// State<SessionViewAchievements> createState() =>
|
||||||
|
// _SessionViewAchievementsState();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// class _SessionViewAchievementsState extends State<SessionViewAchievements> {
|
||||||
|
// late final AppDatabase db;
|
||||||
|
// late Session session;
|
||||||
|
// late List achievements;
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// void initState() {
|
||||||
|
// super.initState();
|
||||||
|
// db = Provider.of<AppDatabase>(context, listen: false);
|
||||||
|
// session = widget.session;
|
||||||
|
// achievements = json.decode(session.achievements!);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void resetState(int sessionId) async {
|
||||||
|
// Session updatedSession =
|
||||||
|
// await SessionsDao(Provider.of<AppDatabase>(context, listen: false))
|
||||||
|
// .find(sessionId);
|
||||||
|
|
||||||
|
// setState(() {
|
||||||
|
// session = updatedSession;
|
||||||
|
// achievements = json.decode(session.achievements!);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Session updateAchievements(int index) {
|
||||||
|
// achievements.removeAt(index);
|
||||||
|
// return session.copyWith(
|
||||||
|
// achievements: Value<String>(json.encode(achievements)));
|
||||||
|
// }
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// Widget build(BuildContext context) {
|
||||||
|
// Widget content;
|
||||||
|
// if (achievements.isEmpty) {
|
||||||
|
// content = Padding(
|
||||||
|
// padding: const EdgeInsets.only(left: 10, right: 5),
|
||||||
|
// child: ActionChip(
|
||||||
|
// visualDensity: VisualDensity.compact,
|
||||||
|
// avatar: const Icon(Icons.check_circle_outline),
|
||||||
|
// label: Text(maxLines: 1, 'Add Achievements!'),
|
||||||
|
// onPressed: () {
|
||||||
|
// showEditorSheet(context,
|
||||||
|
// AchievementEditor(session: session, callback: resetState));
|
||||||
|
// },
|
||||||
|
// ));
|
||||||
|
// } else {
|
||||||
|
// content = ListView.builder(
|
||||||
|
// scrollDirection: Axis.horizontal,
|
||||||
|
// padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||||
|
// itemCount: achievements.length,
|
||||||
|
// itemBuilder: (BuildContext context, int index) {
|
||||||
|
// return Padding(
|
||||||
|
// padding: const EdgeInsets.only(right: 5),
|
||||||
|
// child: ActionChip(
|
||||||
|
// visualDensity: VisualDensity.compact,
|
||||||
|
// avatar: const Icon(Icons.check_circle_outline),
|
||||||
|
// label: Text(
|
||||||
|
// maxLines: 1,
|
||||||
|
// achievements[index].toString().toTitleCase()),
|
||||||
|
// onPressed: () async {
|
||||||
|
// // remove the achievement at index
|
||||||
|
// // then update session
|
||||||
|
// Session newSession = updateAchievements(index);
|
||||||
|
// await showUpdateDialog(
|
||||||
|
// 'Achievement Removal',
|
||||||
|
// 'Would you like to remove this achievement?',
|
||||||
|
// context,
|
||||||
|
// SessionsDao(db),
|
||||||
|
// newSession,
|
||||||
|
// resetState);
|
||||||
|
// }));
|
||||||
|
// },
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return Column(
|
||||||
|
// children: [
|
||||||
|
// Padding(
|
||||||
|
// padding: const EdgeInsets.only(bottom: 10),
|
||||||
|
// child: SizedBox(height: 40, child: content)),
|
||||||
|
// ],
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
@ -1,29 +1,40 @@
|
|||||||
import 'package:flutter/material.dart';
|
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/database/database.dart';
|
||||||
import 'package:sendtrain/widgets/activities/activity_card.dart';
|
import 'package:sendtrain/widgets/activities/activity_card.dart';
|
||||||
|
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
|
||||||
|
|
||||||
class SessionViewActivities extends StatefulWidget {
|
class SessionViewActivities extends StatefulWidget {
|
||||||
const SessionViewActivities({super.key, required this.activities });
|
const SessionViewActivities({super.key, required this.session});
|
||||||
|
|
||||||
final List<Activity> activities;
|
final Session session;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<SessionViewActivities> createState() => _SessionViewActivitiesState();
|
State<SessionViewActivities> createState() => _SessionViewActivitiesState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _SessionViewActivitiesState extends State<SessionViewActivities> {
|
class _SessionViewActivitiesState extends State<SessionViewActivities> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
return StreamBuilder<List<Activity>>(
|
||||||
|
stream: ActivitiesDao(Provider.of<AppDatabase>(context))
|
||||||
|
.watchSessionActivities(widget.session.id),
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
if (snapshot.hasData) {
|
||||||
|
final activities = snapshot.data!;
|
||||||
return Expanded(
|
return Expanded(
|
||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
// shrinkWrap: true,
|
// shrinkWrap: true,
|
||||||
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||||
itemCount: widget.activities.length,
|
itemCount: activities.length,
|
||||||
itemBuilder: (BuildContext context, int index) {
|
itemBuilder: (BuildContext context, int index) {
|
||||||
return ActivityCard(
|
return ActivityCard(activity: activities[index]);
|
||||||
activity: widget.activities[index]);
|
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
|
} else {
|
||||||
|
return GenericProgressIndicator();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -14,18 +14,10 @@ class SessionViewMedia extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _SessionViewMediaState extends State<SessionViewMedia> {
|
class _SessionViewMediaState extends State<SessionViewMedia> {
|
||||||
// late final Session session;
|
|
||||||
|
|
||||||
void resetState() {
|
void resetState() {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
// @override
|
|
||||||
// initState() async {
|
|
||||||
// super.initState();
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return FutureBuilder<List<MediaItem>>(
|
return FutureBuilder<List<MediaItem>>(
|
||||||
@ -35,8 +27,8 @@ class _SessionViewMediaState extends State<SessionViewMedia> {
|
|||||||
if (snapshot.hasData) {
|
if (snapshot.hasData) {
|
||||||
final mediaItems = snapshot.data!;
|
final mediaItems = snapshot.data!;
|
||||||
|
|
||||||
List<Widget> mediaCards = List.generate(
|
List<Widget> mediaCards = List.generate(mediaItems.length,
|
||||||
mediaItems.length, (i) => MediaCard(media: mediaItems[i], callback: resetState));
|
(i) => MediaCard(media: mediaItems[i], callback: resetState));
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user