190 lines
7.9 KiB
Dart
190 lines
7.9 KiB
Dart
import 'dart:async';
|
|
import 'dart:math';
|
|
|
|
import 'package:drift/drift.dart' hide Column;
|
|
import 'package:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:sendtrain/daos/media_items_dao.dart';
|
|
import 'package:sendtrain/daos/object_media_items_dao.dart';
|
|
import 'package:sendtrain/daos/sessions_dao.dart';
|
|
import 'package:sendtrain/database/database.dart';
|
|
import 'package:sendtrain/widgets/builders/dialogs.dart';
|
|
import 'package:sendtrain/widgets/generic/elements/form_search_input.dart';
|
|
import 'package:sendtrain/widgets/generic/elements/form_text_input.dart';
|
|
import 'package:sendtrain/widgets/sessions/session_view.dart';
|
|
|
|
class SessionCreator extends StatefulWidget {
|
|
const SessionCreator({super.key, this.data, this.session});
|
|
|
|
final Session? session;
|
|
final Map<String, dynamic>? data;
|
|
|
|
@override
|
|
State<SessionCreator> createState() => _SessionCreatorState();
|
|
}
|
|
|
|
// used to pass the result of the found image back to current context...
|
|
class SessionPayload {
|
|
String? photoUri;
|
|
String? address;
|
|
}
|
|
|
|
class _SessionCreatorState extends State<SessionCreator> {
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
final Map<String, TextEditingController> sessionCreateController = {
|
|
'name': TextEditingController(),
|
|
'content': TextEditingController(),
|
|
'status': TextEditingController(),
|
|
'date': TextEditingController(),
|
|
'address': TextEditingController(),
|
|
'media': TextEditingController(),
|
|
};
|
|
|
|
final SessionPayload sessionPayload = SessionPayload();
|
|
|
|
Future createSession(context) async {
|
|
Map<Symbol, Value> payload = {
|
|
Symbol('title'): Value<String>(sessionCreateController['name']!.text),
|
|
Symbol('content'):
|
|
Value<String>(sessionCreateController['content']!.text),
|
|
Symbol('status'): Value<SessionStatus>(SessionStatus.pending),
|
|
Symbol('date'): Value<DateTime>(
|
|
DateTime.parse(sessionCreateController['date']!.text)),
|
|
};
|
|
|
|
// optional params
|
|
if (sessionCreateController['address']!.text.isNotEmpty) {
|
|
payload[Symbol('address')] =
|
|
Value<String>(sessionCreateController['address']!.text);
|
|
}
|
|
|
|
return await SessionsDao(Provider.of<AppDatabase>(context, listen: false))
|
|
.createOrUpdate(Function.apply(SessionsCompanion.new, [], payload));
|
|
}
|
|
|
|
Future createSessionMedia(context, sessionId) async {
|
|
if (sessionPayload.photoUri != null) {
|
|
MediaItemsCompanion mediaItem = MediaItemsCompanion(
|
|
title: Value('Location Image'),
|
|
description: Value(sessionPayload.address!),
|
|
reference: Value(sessionPayload.photoUri!),
|
|
type: Value(MediaType.image));
|
|
|
|
return await MediaItemsDao(
|
|
Provider.of<AppDatabase>(context, listen: false))
|
|
.createOrUpdate(mediaItem).then((id) async {
|
|
ObjectMediaItemsCompanion omi = ObjectMediaItemsCompanion(
|
|
objectId: Value(sessionId),
|
|
objectType: Value(ObjectType.sessions),
|
|
mediaId: Value(id),
|
|
);
|
|
|
|
await ObjectMediaItemsDao(Provider.of<AppDatabase>(context, listen: false)).createOrUpdate(omi);
|
|
});
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
sessionCreateController['date']!.text =
|
|
DateFormat('yyyy-MM-dd').format(DateTime.now());
|
|
|
|
AppDatabase db = Provider.of<AppDatabase>(context, listen: false);
|
|
|
|
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 Session',
|
|
textAlign: TextAlign.center,
|
|
style: Theme.of(context).textTheme.titleLarge)),
|
|
FormTextInput(
|
|
controller: sessionCreateController['name']!,
|
|
title: 'Title'),
|
|
FormTextInput(
|
|
controller: sessionCreateController['content']!,
|
|
title: 'Description',
|
|
icon: Icon(Icons.description_rounded),
|
|
maxLines: 10),
|
|
FormTextInput(
|
|
controller: sessionCreateController['date']!,
|
|
title: 'Date',
|
|
icon: Icon(Icons.date_range_rounded),
|
|
onTap: () {
|
|
showDatePicker(
|
|
context: context,
|
|
initialDate: DateTime.now(),
|
|
firstDate: DateTime.now(),
|
|
lastDate: DateTime.now().add(Duration(days: 365)))
|
|
.then((date) {
|
|
if (date != null) {
|
|
sessionCreateController['date']?.text =
|
|
DateFormat('yyyy-MM-dd').format(date);
|
|
}
|
|
});
|
|
}),
|
|
// Padding(
|
|
// padding: EdgeInsets.only(top: 10, bottom: 10),
|
|
// child: TextFormField(
|
|
// readOnly: true,
|
|
// decoration: InputDecoration(
|
|
// prefixIcon: Icon(Icons.image_rounded),
|
|
// filled: true,
|
|
// border: OutlineInputBorder(
|
|
// borderSide: BorderSide.none,
|
|
// borderRadius: BorderRadius.circular(12),
|
|
// ),
|
|
// labelText: 'Select Media (optional)',
|
|
// ),
|
|
// controller: sessionCreateController['media'],
|
|
// onTap: () async {
|
|
// FilePickerResult? result = await FilePicker.platform
|
|
// .pickFiles(allowMultiple: true);
|
|
|
|
// if (result != null) {
|
|
// List<File> files = result.paths
|
|
// .map((path) => File(path!))
|
|
// .toList();
|
|
// }
|
|
// })),
|
|
FormSearchInput(
|
|
sessionController: sessionCreateController['address']!,
|
|
optionalPayload: sessionPayload),
|
|
Row(mainAxisAlignment: MainAxisAlignment.end, children: [
|
|
Padding(
|
|
padding: EdgeInsets.only(top: 10),
|
|
child: FilledButton(
|
|
onPressed: () async => {
|
|
if (_formKey.currentState!.validate())
|
|
{
|
|
await createSession(_formKey.currentContext)
|
|
.then((id) async => {
|
|
await createSessionMedia(
|
|
_formKey.currentContext, id),
|
|
SessionsDao(db).find(id).then(
|
|
(session) => showGenericDialog(
|
|
SessionView(
|
|
session: session),
|
|
_formKey
|
|
.currentContext!)),
|
|
Navigator.pop(
|
|
_formKey.currentContext!,
|
|
'Submit')
|
|
})
|
|
}
|
|
},
|
|
child: Text('Submit')))
|
|
]),
|
|
],
|
|
)));
|
|
}
|
|
}
|