boxchecker/lib/add_form.dart

127 lines
3.9 KiB
Dart

import 'package:flutter/material.dart';
import 'data_util.dart' as data;
import 'db_helper.dart';
class AddForm extends StatefulWidget {
const AddForm({Key? key, required this.type}) : super(key: key);
final data.Page type;
@override
State<StatefulWidget> createState() => _AddFormState(type);
}
class _AddFormState extends State<AddForm> {
_AddFormState(this.type);
final _formKey = GlobalKey<FormState>();
final data.Page type;
int _templatChoice = -1;
String _listLabel = "";
String _listDesc = "";
List<data.List> templates = [];
final FocusNode _TemplateFocusNode = FocusNode();
void loadTemplates() async {
var rows = await DBHelper.dbHelper.getAllLists(data.Page.templates);
setState(() {
templates.clear();
for (var row in rows) {
var template = data.List.fromMap(row);
templates.add(template);
}
});
}
List<DropdownMenuItem<int>> generateDropdown() {
loadTemplates();
List<DropdownMenuItem<int>> items = [
DropdownMenuItem<int>(child: Text("None"), value: -1)
];
templates.asMap().forEach((index, value) {
items.add(DropdownMenuItem<int>(
child: Text(value.name),
value: index,
));
});
return items;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'Add ' +
((type == data.Page.lists)
? 'Check List'
: (type == data.Page.templates)
? 'Template'
: ''),
),
),
body: Container(
margin: const EdgeInsets.all(10),
child: Form(
key: _formKey,
child: Column(
children: [
TextFormField(
onChanged: (value) {
_listLabel = value;
},
validator: (value) {
if (value == null || value.isEmpty) {
return 'Label is required';
}
return null;
},
textInputAction: TextInputAction.next,
onFieldSubmitted: (value) =>
_formKey.currentState!.validate(),
decoration: const InputDecoration(labelText: 'Label')),
TextFormField(
decoration:
const InputDecoration(labelText: 'Description(optional)'),
textInputAction: TextInputAction.next,
onChanged: (value) {
_listDesc = value;
},
),
DropdownButtonFormField<int>(
focusNode: _TemplateFocusNode,
value: _templatChoice,
onChanged: (value) => setState(() {
_templatChoice = value!;
}),
decoration:
const InputDecoration(labelText: "Starting Template"),
items: generateDropdown(),
)
],
),
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.save_alt),
onPressed: () async {
if (_formKey.currentState!.validate()) {
int id = await DBHelper.dbHelper.insertList(
data.List(
_listLabel,
isTemplate: type.index == 1,
description: _listDesc,
),
);
if (_templatChoice >= 0 && _templatChoice < templates.length) {
DBHelper.dbHelper.copyList(templates[_templatChoice].id!, id);
}
Navigator.pop(context); // TODO replace route with checklist page
}
},
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
);
}
}