Commit 3e1bbe4b authored by Administrator's avatar Administrator

edit any activity

parent caba41fd
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-3.3.3/","dependencies":[]},{"name":"package_info","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-0.4.1/","dependencies":[]},{"name":"path_provider","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.11/","dependencies":[]},{"name":"shared_preferences","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-0.5.8/","dependencies":[]},{"name":"sqflite","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.1/","dependencies":[]},{"name":"uni_links","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.4.0/","dependencies":[]},{"name":"url_launcher","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-5.5.0/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-3.3.3/","dependencies":[]},{"name":"package_info","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-0.4.1/","dependencies":[]},{"name":"path_provider","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.11/","dependencies":[]},{"name":"shared_preferences","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-0.5.8/","dependencies":[]},{"name":"sqflite","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.1/","dependencies":[]},{"name":"uni_links","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.4.0/","dependencies":[]},{"name":"url_launcher","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-5.5.0/","dependencies":[]}],"macos":[{"name":"package_info","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-0.4.1/","dependencies":[]},{"name":"path_provider_macos","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.4+3/","dependencies":[]},{"name":"shared_preferences_macos","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-0.0.1+10/","dependencies":[]},{"name":"sqflite","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.1/","dependencies":[]},{"name":"url_launcher_macos","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-0.0.1+7/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-0.0.1+2/","dependencies":[]},{"name":"shared_preferences_linux","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-0.0.2+1/","dependencies":["path_provider_linux"]},{"name":"url_launcher_linux","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-0.0.1+1/","dependencies":[]}],"windows":[],"web":[{"name":"shared_preferences_web","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-0.1.2+7/","dependencies":[]},{"name":"url_launcher_web","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-0.1.2/","dependencies":[]}]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"package_info","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_linux","shared_preferences_macos","shared_preferences_web"]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_web","url_launcher_linux","url_launcher_macos"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]}],"date_created":"2020-09-03 14:35:40.046882","version":"1.20.2"}
\ No newline at end of file
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-3.3.3/","dependencies":[]},{"name":"package_info","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-0.4.1/","dependencies":[]},{"name":"path_provider","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.11/","dependencies":[]},{"name":"shared_preferences","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-0.5.8/","dependencies":[]},{"name":"sqflite","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.1/","dependencies":[]},{"name":"uni_links","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.4.0/","dependencies":[]},{"name":"url_launcher","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-5.5.0/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-3.3.3/","dependencies":[]},{"name":"package_info","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-0.4.1/","dependencies":[]},{"name":"path_provider","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.11/","dependencies":[]},{"name":"shared_preferences","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-0.5.8/","dependencies":[]},{"name":"sqflite","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.1/","dependencies":[]},{"name":"uni_links","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.4.0/","dependencies":[]},{"name":"url_launcher","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-5.5.0/","dependencies":[]}],"macos":[{"name":"package_info","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-0.4.1/","dependencies":[]},{"name":"path_provider_macos","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.4+3/","dependencies":[]},{"name":"shared_preferences_macos","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-0.0.1+10/","dependencies":[]},{"name":"sqflite","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.1/","dependencies":[]},{"name":"url_launcher_macos","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-0.0.1+7/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-0.0.1+2/","dependencies":[]},{"name":"shared_preferences_linux","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-0.0.2+1/","dependencies":["path_provider_linux"]},{"name":"url_launcher_linux","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-0.0.1+1/","dependencies":[]}],"windows":[],"web":[{"name":"shared_preferences_web","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-0.1.2+7/","dependencies":[]},{"name":"url_launcher_web","path":"/home/stefan/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-0.1.2/","dependencies":[]}]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"package_info","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_linux","shared_preferences_macos","shared_preferences_web"]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"sqflite","dependencies":[]},{"name":"uni_links","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_web","url_launcher_linux","url_launcher_macos"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]}],"date_created":"2020-09-03 16:21:59.563383","version":"1.20.2"}
\ No newline at end of file
......@@ -59,6 +59,12 @@ class Activity {
_db = DbActivity()
..athletesId = athlete.id
..stravaId = DateTime.now().millisecondsSinceEpoch
..movingTime = 0
..totalAscent = 0
..totalDescent = 0
..totalDistance = 0
..avgHeartRate = 0
..avgPower = 0
..timeCreated = DateTime.now();
}
......
import 'package:encrateia/utils/my_color.dart';
import 'package:encrateia/widgets/activity_widgets/edit_activity_widget.dart';
import 'package:flutter/material.dart';
import 'package:encrateia/models/activity.dart';
class EditActivityScreen extends StatelessWidget {
const EditActivityScreen({
Key key,
@required this.activity,
}) : super(key: key);
final Activity activity;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: MyColor.activity,
title: const Text('Create Activity'),
),
body: SafeArea(
child: EditActivityWidget(activity: activity),
),
);
}
}
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
import 'package:encrateia/utils/my_button.dart';
import 'package:encrateia/utils/my_color.dart';
import 'package:flutter/material.dart';
import 'package:encrateia/utils/date_time_utils.dart';
import 'package:encrateia/models/activity.dart';
import 'package:intl/intl.dart';
class EditActivityScreen extends StatefulWidget {
const EditActivityScreen({
Key key,
@required this.activity,
}) : super(key: key);
final Activity activity;
@override
_EditActivityScreenState createState() => _EditActivityScreenState();
}
class _EditActivityScreenState extends State<EditActivityScreen> {
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: MyColor.activity,
title: const Text('Edit Record'),
),
body: SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
decoration: const InputDecoration(labelText: 'Title'),
onChanged: (String value) => widget.activity.name = value,
initialValue: widget.activity.event,
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Total Distance',
helperText: 'in m',
),
onChanged: (String value) =>
widget.activity.totalDistance = int.parse(value),
initialValue:
(widget.activity.totalDistance ?? 0).toString(),
keyboardType: TextInputType.number,
),
DateTimeField(
decoration: const InputDecoration(
labelText: 'Time Stamp',
helperText: 'Tap to open Selector',
),
format: DateFormat('yyyy-MM-dd HH:mm:SS'),
initialValue: widget.activity.timeStamp,
resetIcon: null,
onShowPicker:
(BuildContext context, DateTime currentValue) async {
final DateTime date = await showDatePicker(
context: context,
firstDate: DateTime(1969),
initialDate: currentValue ?? DateTime.now(),
lastDate: DateTime(2100));
if (date != null) {
final TimeOfDay time = await showTimePicker(
context: context,
initialTime: TimeOfDay.fromDateTime(
currentValue ?? DateTime.now()),
);
return DateTimeField.combine(date, time);
} else {
return currentValue;
}
},
onChanged: (DateTime value) {
widget.activity.timeStamp = value;
widget.activity.timeCreated = value;
}),
TextFormField(
decoration: const InputDecoration(
labelText: 'Total Ascent',
helperText: 'in m',
),
onChanged: (String value) =>
widget.activity.totalAscent = int.parse(value),
initialValue: (widget.activity.totalAscent ?? 0).toString(),
keyboardType: TextInputType.number,
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Total Descent',
helperText: 'in m',
),
onChanged: (String value) =>
widget.activity.totalDescent = int.parse(value),
initialValue:
(widget.activity.totalDescent ?? 0).toString(),
keyboardType: TextInputType.number,
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Average Heart Rate',
helperText: 'in bpm',
),
onChanged: (String value) =>
widget.activity.avgHeartRate = int.parse(value),
initialValue:
(widget.activity.avgHeartRate ?? 0).toString(),
keyboardType: TextInputType.number,
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Average Power',
helperText: 'in W',
),
onChanged: (String value) =>
widget.activity.avgPower = double.parse(value),
initialValue: (widget.activity.avgPower ?? 0).toString(),
keyboardType: TextInputType.number,
),
Row(
children: <Widget>[
const Text('Sport'),
const SizedBox(width: 20),
DropdownButton<String>(
value: widget.activity.sport ?? 'Running',
icon: const Icon(Icons.arrow_downward),
onChanged: (String value) =>
widget.activity.sport = value,
items: <String>[
'Running',
'Cycling',
'Swimming',
'Other'
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
],
),
TextFormField(
decoration: const InputDecoration(labelText: 'Sub Sport'),
onChanged: (String value) => widget.activity.name = value,
initialValue: widget.activity.event,
),
Row(
children: <Widget>[
Flexible(
child: TextFormField(
decoration: const InputDecoration(
labelText: 'Moving Time',
helperText: 'hours',
),
onChanged: (String value) =>
widget.activity.movingTime = widget
.activity.movingTime
.setHours(int.parse(value)),
initialValue: (widget.activity.movingTime ?? 0)
.fullHours
.toString(),
keyboardType: TextInputType.number,
),
),
Flexible(
child: TextFormField(
decoration: const InputDecoration(
labelText: 'Moving Time',
helperText: 'minutes',
),
onChanged: (String value) =>
widget.activity.movingTime =
(widget.activity.movingTime ?? 0)
.setMinutes(int.parse(value)),
initialValue: (widget.activity.movingTime ?? 0)
.fullMinutes
.toString(),
keyboardType: TextInputType.number,
),
),
Flexible(
child: TextFormField(
decoration: const InputDecoration(
labelText: 'Moving Time',
helperText: 'seconds',
),
onChanged: (String value) =>
widget.activity.movingTime = widget
.activity.movingTime
.setSeconds(int.parse(value)),
initialValue: (widget.activity.movingTime ?? 0)
.fullSeconds
.toString(),
keyboardType: TextInputType.number,
),
),
const Spacer(flex: 2),
],
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: MyButton.save(
onPressed: () async {
await widget.activity.save();
Navigator.of(context).pop();
},
),
),
],
),
),
),
),
),
);
}
}
......@@ -27,6 +27,7 @@ import 'package:encrateia/widgets/activity_widgets/activity_form_power_widget.da
import 'package:encrateia/widgets/activity_widgets/activity_stryd_cadence_widget.dart';
import 'package:encrateia/widgets/activity_widgets/activity_stride_ratio_widget.dart';
import 'package:encrateia/widgets/activity_widgets/activity_vertical_oscillation_widget.dart';
import 'package:encrateia/widgets/activity_widgets/edit_activity_widget.dart';
import 'package:encrateia/screens/show_activity_detail_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
......@@ -389,6 +390,17 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
athlete: widget.athlete,
),
),
navigationButton(
title: 'Edit Activity',
color: MyColor.activity,
icon: MyIcon.addActivity,
context: context,
nextWidget: EditActivityWidget(
activity: widget.activity,
),
),
if (<String>['new', 'downloaded', 'persisted']
.contains(widget.activity.state))
RaisedButton.icon(
......
......@@ -30,7 +30,7 @@ import 'package:encrateia/screens/show_athlete_detail_screen.dart';
import 'package:encrateia/utils/icon_utils.dart';
import 'package:flushbar/flushbar.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'edit_activity_screen.dart';
import 'create_activity_screen.dart';
import 'edit_athlete_screen.dart';
class ShowAthleteScreen extends StatefulWidget {
......
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
import 'package:encrateia/utils/my_button.dart';
import 'package:flutter/material.dart';
import 'package:encrateia/utils/date_time_utils.dart';
import 'package:encrateia/models/activity.dart';
import 'package:intl/intl.dart';
class EditActivityWidget extends StatefulWidget {
const EditActivityWidget({
Key key,
@required this.activity,
}) : super(key: key);
final Activity activity;
@override
_EditActivityWidgetState createState() => _EditActivityWidgetState();
}
class _EditActivityWidgetState extends State<EditActivityWidget> {
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
decoration: const InputDecoration(labelText: 'Title'),
onChanged: (String value) => widget.activity.name = value,
initialValue: widget.activity.name,
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Total Distance',
helperText: 'in m',
),
onChanged: (String value) =>
widget.activity.totalDistance = int.parse(value),
initialValue: widget.activity.totalDistance.toString(),
keyboardType: TextInputType.number,
),
DateTimeField(
decoration: const InputDecoration(
labelText: 'Time Stamp',
helperText: 'Tap to open Selector',
),
format: DateFormat('yyyy-MM-dd HH:mm:SS'),
initialValue: widget.activity.timeStamp,
resetIcon: null,
onShowPicker:
(BuildContext context, DateTime currentValue) async {
final DateTime date = await showDatePicker(
context: context,
firstDate: DateTime(1969),
initialDate: currentValue ?? DateTime.now(),
lastDate: DateTime(2100));
if (date != null) {
final TimeOfDay time = await showTimePicker(
context: context,
initialTime: TimeOfDay.fromDateTime(
currentValue ?? DateTime.now()),
);
return DateTimeField.combine(date, time);
} else {
return currentValue;
}
},
onChanged: (DateTime value) {
widget.activity.timeStamp = value;
widget.activity.timeCreated = value;
}),
TextFormField(
decoration: const InputDecoration(
labelText: 'Total Ascent',
helperText: 'in m',
),
onChanged: (String value) =>
widget.activity.totalAscent = int.parse(value),
initialValue: widget.activity.totalAscent.toString(),
keyboardType: TextInputType.number,
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Total Descent',
helperText: 'in m',
),
onChanged: (String value) =>
widget.activity.totalDescent = int.parse(value),
initialValue: widget.activity.totalDescent.toString(),
keyboardType: TextInputType.number,
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Average Heart Rate',
helperText: 'in bpm',
),
onChanged: (String value) =>
widget.activity.avgHeartRate = int.parse(value),
initialValue: widget.activity.avgHeartRate.toString(),
keyboardType: TextInputType.number,
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Average Power',
helperText: 'in W',
),
onChanged: (String value) =>
widget.activity.avgPower = double.parse(value),
initialValue: widget.activity.avgPower.toString(),
keyboardType: TextInputType.number,
),
Row(
children: <Widget>[
const Text('Sport'),
const SizedBox(width: 20),
DropdownButton<String>(
value: widget.activity.sport ?? 'running',
icon: const Icon(Icons.arrow_downward),
onChanged: (String value) => widget.activity.sport = value,
items: <String>['running', 'cycling', 'swimming', 'other']
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
],
),
TextFormField(
decoration: const InputDecoration(labelText: 'Sub Sport'),
onChanged: (String value) => widget.activity.subSport = value,
initialValue: widget.activity.subSport,
),
Row(
children: <Widget>[
Flexible(
child: TextFormField(
decoration: const InputDecoration(
labelText: 'Moving Time',
helperText: 'hours',
),
onChanged: (String value) => widget.activity.movingTime =
widget.activity.movingTime.setHours(int.parse(value)),
initialValue:
widget.activity.movingTime.fullHours.toString(),
keyboardType: TextInputType.number,
),
),
Flexible(
child: TextFormField(
decoration: const InputDecoration(
labelText: 'Moving Time',
helperText: 'minutes',
),
onChanged: (String value) => widget.activity.movingTime =
widget.activity.movingTime
.setMinutes(int.parse(value)),
initialValue:
widget.activity.movingTime.fullMinutes.toString(),
keyboardType: TextInputType.number,
),
),
Flexible(
child: TextFormField(
decoration: const InputDecoration(
labelText: 'Moving Time',
helperText: 'seconds',
),
onChanged: (String value) => widget.activity.movingTime =
widget.activity.movingTime
.setSeconds(int.parse(value)),
initialValue:
widget.activity.movingTime.fullSeconds.toString(),
keyboardType: TextInputType.number,
),
),
const Spacer(flex: 2),
],
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: MyButton.save(
onPressed: () async {
await widget.activity.save();
Navigator.of(context).pop();
},
),
),
],
),
),
),
);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment