From cbca4ec97d5933cf6920e675b874d67dd437a0e5 Mon Sep 17 00:00:00 2001 From: rodolfobacuinjr Date: Mon, 12 Dec 2022 16:44:26 +0800 Subject: [PATCH] create user interface for registration in charge and create password for new user --- .../docsms/components/doc_info_tile.dart | 25 ++ unit2/lib/screens/docsms/request_receipt.dart | 156 ++++++++++++ .../{screen => screens}/sos/add_mobile.dart | 15 +- .../sos/components/mobile.dart | 0 .../{screen => screens}/sos/request_sos.dart | 2 +- .../{screen => screens}/sos/sos_received.dart | 0 .../components/drawer-screen.dart | 0 .../components/empty_module.dart | 0 .../homepage.dart/components/menu-screen.dart | 0 .../unit2/homepage.dart/components/menu.dart | 0 .../unit2/homepage.dart/module-screen.dart | 0 .../login/components/login-via-qr-label.dart | 0 .../login/functions/press-again-to-exit.dart | 0 .../unit2/login/login.dart | 11 +- unit2/lib/screens/unit2/login/register.dart | 202 +++++++++++++++ .../unit2/profile/components/cover-image.dart | 0 .../unit2/profile/profile.dart | 0 .../components/custom_switch.dart | 0 .../components/save_settings.dart | 0 .../roles/qr_code_scanner.dart/scan.dart | 0 .../qr_code_scanner.dart/settings_screen.dart | 2 +- .../components/add.dart | 232 ++++++++++++++++++ .../components/request_qr.dart | 19 ++ .../components/sync.dart | 63 +++++ .../components/view.dart | 100 ++++++++ .../roles/registration_in_charge/home.dart | 88 +++++++ unit2/lib/test_data.dart | 86 ++++++- unit2/lib/theme-data.dart/colors.dart | 7 + unit2/lib/theme-data.dart/text-styles.dart | 14 ++ unit2/lib/utils/router.dart | 17 +- unit2/lib/utils/text_container.dart | 17 +- unit2/lib/utils/validators.dart | 18 +- unit2/lib/widgets/costum_divider.dart | 16 ++ unit2/lib/widgets/label.dart | 22 ++ unit2/lib/widgets/text_icon.dart | 30 +++ unit2/notes.txt | 4 + unit2/pubspec.lock | 30 ++- unit2/pubspec.yaml | 4 + 38 files changed, 1148 insertions(+), 32 deletions(-) create mode 100644 unit2/lib/screens/docsms/components/doc_info_tile.dart create mode 100644 unit2/lib/screens/docsms/request_receipt.dart rename unit2/lib/{screen => screens}/sos/add_mobile.dart (89%) rename unit2/lib/{screen => screens}/sos/components/mobile.dart (100%) rename unit2/lib/{screen => screens}/sos/request_sos.dart (98%) rename unit2/lib/{screen => screens}/sos/sos_received.dart (100%) rename unit2/lib/{screen => screens}/unit2/homepage.dart/components/drawer-screen.dart (100%) rename unit2/lib/{screen => screens}/unit2/homepage.dart/components/empty_module.dart (100%) rename unit2/lib/{screen => screens}/unit2/homepage.dart/components/menu-screen.dart (100%) rename unit2/lib/{screen => screens}/unit2/homepage.dart/components/menu.dart (100%) rename unit2/lib/{screen => screens}/unit2/homepage.dart/module-screen.dart (100%) rename unit2/lib/{screen => screens}/unit2/login/components/login-via-qr-label.dart (100%) rename unit2/lib/{screen => screens}/unit2/login/functions/press-again-to-exit.dart (100%) rename unit2/lib/{screen => screens}/unit2/login/login.dart (96%) create mode 100644 unit2/lib/screens/unit2/login/register.dart rename unit2/lib/{screen => screens}/unit2/profile/components/cover-image.dart (100%) rename unit2/lib/{screen => screens}/unit2/profile/profile.dart (100%) rename unit2/lib/{screen => screens}/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart (100%) rename unit2/lib/{screen => screens}/unit2/roles/qr_code_scanner.dart/components/save_settings.dart (100%) rename unit2/lib/{screen => screens}/unit2/roles/qr_code_scanner.dart/scan.dart (100%) rename unit2/lib/{screen => screens}/unit2/roles/qr_code_scanner.dart/settings_screen.dart (98%) create mode 100644 unit2/lib/screens/unit2/roles/registration_in_charge/components/add.dart create mode 100644 unit2/lib/screens/unit2/roles/registration_in_charge/components/request_qr.dart create mode 100644 unit2/lib/screens/unit2/roles/registration_in_charge/components/sync.dart create mode 100644 unit2/lib/screens/unit2/roles/registration_in_charge/components/view.dart create mode 100644 unit2/lib/screens/unit2/roles/registration_in_charge/home.dart create mode 100644 unit2/lib/widgets/costum_divider.dart create mode 100644 unit2/lib/widgets/label.dart create mode 100644 unit2/lib/widgets/text_icon.dart create mode 100644 unit2/notes.txt diff --git a/unit2/lib/screens/docsms/components/doc_info_tile.dart b/unit2/lib/screens/docsms/components/doc_info_tile.dart new file mode 100644 index 0000000..a209c76 --- /dev/null +++ b/unit2/lib/screens/docsms/components/doc_info_tile.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; + +import '../../../theme-data.dart/text-styles.dart'; +import '../../../utils/global.dart'; + +class DocInfo extends StatelessWidget { + final String title; + final String subTitle; + const DocInfo({super.key, required this.title, required this.subTitle}); + + @override + Widget build(BuildContext context) { + return ListTile( + dense: true, + title: Text( + title, + style: titleTextStyle() + .copyWith(color: Colors.black87, fontSize: blockSizeVertical * 2), + ), + subtitle: Text(subTitle), + ); + } +} diff --git a/unit2/lib/screens/docsms/request_receipt.dart b/unit2/lib/screens/docsms/request_receipt.dart new file mode 100644 index 0000000..338cb98 --- /dev/null +++ b/unit2/lib/screens/docsms/request_receipt.dart @@ -0,0 +1,156 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:fluttericon/entypo_icons.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:unit2/screens/docsms/components/doc_info_tile.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; +import 'package:unit2/utils/text_container.dart'; +import 'package:unit2/widgets/costum_divider.dart'; +import 'package:unit2/widgets/text_icon.dart'; + +import '../../test_data.dart'; +import '../../theme-data.dart/btn-style.dart'; +import '../../theme-data.dart/form-style.dart'; +import '../../utils/global.dart'; + +class RequetAutoReceipt extends StatefulWidget { + RequetAutoReceipt({super.key}); + + @override + State createState() => _RequetAutoReceiptState(); +} + +class _RequetAutoReceiptState extends State { + final _formKey = GlobalKey(); + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + appBar: AppBar( + backgroundColor: primary, + ), + body: SingleChildScrollView( + // ignore: avoid_unnecessary_containers + child: Container( + padding: const EdgeInsets.symmetric(vertical: 8), + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + const DocInfo(title: "4427", subTitle: documentId), + const CostumDivider(), + const DocInfo(title: "Purchase of Diesel", subTitle: documentTitle), + const CostumDivider(), + const DocInfo(title: "N/A", subTitle: documentSubject), + const CostumDivider(), + const DocInfo(title: "Request for Quotation", subTitle: documentType), + const CostumDivider(), + Form( + child: Column(children: [ + FormBuilder( + key: _formKey, + child: Container( + padding: const EdgeInsets.symmetric( + vertical: 12, horizontal: 25), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextIcon(title: "Source", icon: Entypo.reply), + const SizedBox( + height: 8, + ), + Text( + "Source Remarks", + style: Theme.of(context).textTheme.caption, + ), + const SizedBox( + height: 12, + ), + FormBuilderTextField( + name: "remarks", + validator: FormBuilderValidators.compose([ + FormBuilderValidators.required( + errorText: "Remarks is required") + ]), + autovalidateMode: + AutovalidateMode.onUserInteraction, + maxLines: 5, + decoration: normalTextFieldStyle( + "Enter your remarks", "..."), + ), + const SizedBox( + height: 8, + ), + const TextIcon( + title: "Destination", icon: Entypo.forward), + const SizedBox( + height: 8, + ), + FormBuilderDropdown( + name: 'department', + autofocus: false, + validator: FormBuilderValidators.compose([ + FormBuilderValidators.required( + errorText: "Department is required") + ]), + decoration: + normalTextFieldStyle("Department", ""), + items: puroks + .map((purok) => DropdownMenuItem( + value: purok, + child: Text(purok), + )) + .toList()), + const SizedBox( + height: 12, + ), + FormBuilderDropdown( + name: 'purok', + autofocus: false, + validator: FormBuilderValidators.compose([ + FormBuilderValidators.required( + errorText: "Purok is required") + ]), + decoration: + normalTextFieldStyle("Substation", ""), + items: puroks + .map((purok) => DropdownMenuItem( + value: purok, + child: Text(purok), + )) + .toList()), + const SizedBox( + height: 24, + ), + SizedBox( + width: double.infinity, + height: screenHeight * .06, + child: ElevatedButton( + style: secondaryBtnStyle( + second, Colors.transparent, Colors.white54), + child: const Text( + "Request Auto Receipt", + style: TextStyle(color: Colors.white), + ), + onPressed: () { + if (_formKey.currentState! + .saveAndValidate()) { + debugPrint(_formKey + .currentState!.value['remarks']); + } + }, + ), + ), + ], + ), + )), + ]), + ) + ]), + ), + ), + ), + ); + } +} diff --git a/unit2/lib/screen/sos/add_mobile.dart b/unit2/lib/screens/sos/add_mobile.dart similarity index 89% rename from unit2/lib/screen/sos/add_mobile.dart rename to unit2/lib/screens/sos/add_mobile.dart index c102a0a..4d7ee6a 100644 --- a/unit2/lib/screen/sos/add_mobile.dart +++ b/unit2/lib/screens/sos/add_mobile.dart @@ -94,7 +94,6 @@ class AddMobile extends StatelessWidget { ), FormBuilderTextField( name: 'mobile2', - validator: mobileNumberValidator, decoration: normalTextFieldStyle( "mobile number 2", "+63")), @@ -113,14 +112,12 @@ class AddMobile extends StatelessWidget { style: TextStyle(color: Colors.white), ), onPressed: () { - context.go( - context.namedLocation('request-sos')); - // if (_formKey.currentState.validate()) { - // _formKey.currentState.save(); - // BlocProvider.of(context) - // .add(UserWebLogin( - // password: password, - // username: username)); + if (_formKey.currentState! + .saveAndValidate()) { + context.go(context + .namedLocation('request-sos')); + } + // } }, ), diff --git a/unit2/lib/screen/sos/components/mobile.dart b/unit2/lib/screens/sos/components/mobile.dart similarity index 100% rename from unit2/lib/screen/sos/components/mobile.dart rename to unit2/lib/screens/sos/components/mobile.dart diff --git a/unit2/lib/screen/sos/request_sos.dart b/unit2/lib/screens/sos/request_sos.dart similarity index 98% rename from unit2/lib/screen/sos/request_sos.dart rename to unit2/lib/screens/sos/request_sos.dart index e284efd..76cab37 100644 --- a/unit2/lib/screen/sos/request_sos.dart +++ b/unit2/lib/screens/sos/request_sos.dart @@ -6,7 +6,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:fluttericon/typicons_icons.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; -import 'package:unit2/screen/sos/components/mobile.dart'; +import 'package:unit2/screens/sos/components/mobile.dart'; import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/utils/text_container.dart'; diff --git a/unit2/lib/screen/sos/sos_received.dart b/unit2/lib/screens/sos/sos_received.dart similarity index 100% rename from unit2/lib/screen/sos/sos_received.dart rename to unit2/lib/screens/sos/sos_received.dart diff --git a/unit2/lib/screen/unit2/homepage.dart/components/drawer-screen.dart b/unit2/lib/screens/unit2/homepage.dart/components/drawer-screen.dart similarity index 100% rename from unit2/lib/screen/unit2/homepage.dart/components/drawer-screen.dart rename to unit2/lib/screens/unit2/homepage.dart/components/drawer-screen.dart diff --git a/unit2/lib/screen/unit2/homepage.dart/components/empty_module.dart b/unit2/lib/screens/unit2/homepage.dart/components/empty_module.dart similarity index 100% rename from unit2/lib/screen/unit2/homepage.dart/components/empty_module.dart rename to unit2/lib/screens/unit2/homepage.dart/components/empty_module.dart diff --git a/unit2/lib/screen/unit2/homepage.dart/components/menu-screen.dart b/unit2/lib/screens/unit2/homepage.dart/components/menu-screen.dart similarity index 100% rename from unit2/lib/screen/unit2/homepage.dart/components/menu-screen.dart rename to unit2/lib/screens/unit2/homepage.dart/components/menu-screen.dart diff --git a/unit2/lib/screen/unit2/homepage.dart/components/menu.dart b/unit2/lib/screens/unit2/homepage.dart/components/menu.dart similarity index 100% rename from unit2/lib/screen/unit2/homepage.dart/components/menu.dart rename to unit2/lib/screens/unit2/homepage.dart/components/menu.dart diff --git a/unit2/lib/screen/unit2/homepage.dart/module-screen.dart b/unit2/lib/screens/unit2/homepage.dart/module-screen.dart similarity index 100% rename from unit2/lib/screen/unit2/homepage.dart/module-screen.dart rename to unit2/lib/screens/unit2/homepage.dart/module-screen.dart diff --git a/unit2/lib/screen/unit2/login/components/login-via-qr-label.dart b/unit2/lib/screens/unit2/login/components/login-via-qr-label.dart similarity index 100% rename from unit2/lib/screen/unit2/login/components/login-via-qr-label.dart rename to unit2/lib/screens/unit2/login/components/login-via-qr-label.dart diff --git a/unit2/lib/screen/unit2/login/functions/press-again-to-exit.dart b/unit2/lib/screens/unit2/login/functions/press-again-to-exit.dart similarity index 100% rename from unit2/lib/screen/unit2/login/functions/press-again-to-exit.dart rename to unit2/lib/screens/unit2/login/functions/press-again-to-exit.dart diff --git a/unit2/lib/screen/unit2/login/login.dart b/unit2/lib/screens/unit2/login/login.dart similarity index 96% rename from unit2/lib/screen/unit2/login/login.dart rename to unit2/lib/screens/unit2/login/login.dart index 31da7a8..e19f924 100644 --- a/unit2/lib/screen/unit2/login/login.dart +++ b/unit2/lib/screens/unit2/login/login.dart @@ -161,7 +161,11 @@ class _UniT2LoginState extends State { style: TextStyle(color: Colors.white), ), onPressed: () { - context.go(context.namedLocation('home')); + if (_formKey.currentState! + .saveAndValidate()) { + context.go(context.namedLocation('home')); + } + // if (_formKey.currentState.validate()) { // _formKey.currentState.save(); // BlocProvider.of(context) @@ -193,6 +197,8 @@ class _UniT2LoginState extends State { style: TextStyle(color: second), ), onPressed: () async { + context.go(context.namedLocation('home')); + // BlocProvider.of(context) // .add(QRCodelogin()); }, @@ -217,8 +223,7 @@ class _UniT2LoginState extends State { style: mainBtnStyle( third, Colors.transparent, Colors.white38), onPressed: () { - context - .go(context.namedLocation('add-mobile')); + context.goNamed('add-mobile'); }, label: const Text( requestSOS, diff --git a/unit2/lib/screens/unit2/login/register.dart b/unit2/lib/screens/unit2/login/register.dart new file mode 100644 index 0000000..3d4e614 --- /dev/null +++ b/unit2/lib/screens/unit2/login/register.dart @@ -0,0 +1,202 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:fluttericon/font_awesome5_icons.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:unit2/theme-data.dart/btn-style.dart'; +import 'package:unit2/widgets/wave.dart'; + +import '../../../theme-data.dart/colors.dart'; +import '../../../theme-data.dart/form-style.dart'; +import '../../../utils/global.dart'; +import '../../../utils/text_container.dart'; +import '../../../utils/validators.dart'; + +class Register extends StatefulWidget { + const Register({super.key}); + + @override + State createState() => _RegisterState(); +} + +class _RegisterState extends State { + bool showSuffixIcon = false; + bool _showPassword = true; + final _formKey = GlobalKey(); + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + resizeToAvoidBottomInset: true, + body: SingleChildScrollView( + child: Stack( + children: [ + Wave(height: blockSizeVertical * 8), + Positioned( + bottom: 0, child: WaveReverse(height: blockSizeVertical * 8)), + Container( + height: screenHeight * .97, + padding: const EdgeInsets.symmetric(horizontal: 15), + child: FormBuilder( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/svgs/logo.svg', + height: blockSizeVertical * 16, + allowDrawingOutsideViewBox: true, + color: primary, + ), + Text(unitApp, + style: TextStyle( + fontSize: blockSizeVertical * 8, + fontWeight: FontWeight.w800, + letterSpacing: .2, + height: 1, + color: Colors.black87)), + Text( + registerToContinue, + style: TextStyle( + fontSize: blockSizeVertical * 2, + height: 1.5, + fontWeight: FontWeight.w600), + ), + const SizedBox( + height: 15, + ), + // Password + FormBuilderTextField( + name: 'password', + validator: registerPasswordValidator, + // initialValue: state.password, + onChanged: (value) { + value!.isEmpty + ? setState(() { + showSuffixIcon = false; + }) + : setState(() { + showSuffixIcon = true; + }); + }, + autofocus: false, + style: const TextStyle( + fontWeight: FontWeight.bold, color: Colors.black87), + decoration: loginTextFieldStyle().copyWith( + suffixIcon: Visibility( + visible: showSuffixIcon, + child: _showPassword + ? IconButton( + icon: Icon(FontAwesome5.eye_slash, + size: 24, + color: Theme.of(context) + .textTheme + .displayLarge + ?.color), + onPressed: () { + setState(() { + _showPassword = false; + }); + }, + ) + : IconButton( + onPressed: () { + setState(() { + _showPassword = true; + }); + }, + icon: Icon(FontAwesome5.eye, + size: 24, + color: Theme.of(context) + .textTheme + .displayLarge + ?.color)), + ), + prefixIcon: const Icon(Icons.lock), + labelText: "Password", + hintText: "Enter Password..."), + obscureText: _showPassword ? true : false, + ), + const SizedBox( + height: 15, + ), + FormBuilderTextField( + name: 'confirmPassword', + validator: registerPasswordValidator, + // initialValue: state.password, + onChanged: (value) { + value!.isEmpty + ? setState(() { + showSuffixIcon = false; + }) + : setState(() { + showSuffixIcon = true; + }); + }, + autofocus: false, + style: const TextStyle( + fontWeight: FontWeight.bold, color: Colors.black87), + decoration: loginTextFieldStyle().copyWith( + suffixIcon: Visibility( + visible: showSuffixIcon, + child: _showPassword + ? IconButton( + icon: Icon(FontAwesome5.eye_slash, + size: 24, + color: Theme.of(context) + .textTheme + .displayLarge + ?.color), + onPressed: () { + setState(() { + _showPassword = false; + }); + }, + ) + : IconButton( + onPressed: () { + setState(() { + _showPassword = true; + }); + }, + icon: Icon(FontAwesome5.eye, + size: 24, + color: Theme.of(context) + .textTheme + .displayLarge + ?.color)), + ), + prefixIcon: const Icon(Icons.lock), + labelText: "Confirm Password", + hintText: "Confirm Password..."), + obscureText: _showPassword ? true : false, + ), + const SizedBox( + height: 15, + ), + SizedBox( + width: double.infinity, + height: blockSizeVertical * 6, + child: ElevatedButton( + style: secondaryBtnStyle( + second, Colors.transparent, primary), + onPressed: () { + if (_formKey.currentState!.saveAndValidate()) {} + }, + child: const Text("Register")), + ) + ], + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/unit2/lib/screen/unit2/profile/components/cover-image.dart b/unit2/lib/screens/unit2/profile/components/cover-image.dart similarity index 100% rename from unit2/lib/screen/unit2/profile/components/cover-image.dart rename to unit2/lib/screens/unit2/profile/components/cover-image.dart diff --git a/unit2/lib/screen/unit2/profile/profile.dart b/unit2/lib/screens/unit2/profile/profile.dart similarity index 100% rename from unit2/lib/screen/unit2/profile/profile.dart rename to unit2/lib/screens/unit2/profile/profile.dart diff --git a/unit2/lib/screen/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart b/unit2/lib/screens/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart similarity index 100% rename from unit2/lib/screen/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart rename to unit2/lib/screens/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart diff --git a/unit2/lib/screen/unit2/roles/qr_code_scanner.dart/components/save_settings.dart b/unit2/lib/screens/unit2/roles/qr_code_scanner.dart/components/save_settings.dart similarity index 100% rename from unit2/lib/screen/unit2/roles/qr_code_scanner.dart/components/save_settings.dart rename to unit2/lib/screens/unit2/roles/qr_code_scanner.dart/components/save_settings.dart diff --git a/unit2/lib/screen/unit2/roles/qr_code_scanner.dart/scan.dart b/unit2/lib/screens/unit2/roles/qr_code_scanner.dart/scan.dart similarity index 100% rename from unit2/lib/screen/unit2/roles/qr_code_scanner.dart/scan.dart rename to unit2/lib/screens/unit2/roles/qr_code_scanner.dart/scan.dart diff --git a/unit2/lib/screen/unit2/roles/qr_code_scanner.dart/settings_screen.dart b/unit2/lib/screens/unit2/roles/qr_code_scanner.dart/settings_screen.dart similarity index 98% rename from unit2/lib/screen/unit2/roles/qr_code_scanner.dart/settings_screen.dart rename to unit2/lib/screens/unit2/roles/qr_code_scanner.dart/settings_screen.dart index 5a79040..7f3e4a4 100644 --- a/unit2/lib/screen/unit2/roles/qr_code_scanner.dart/settings_screen.dart +++ b/unit2/lib/screens/unit2/roles/qr_code_scanner.dart/settings_screen.dart @@ -4,7 +4,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:fluttericon/entypo_icons.dart'; import 'package:fluttericon/modern_pictograms_icons.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; -import 'package:unit2/screen/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart'; +import 'package:unit2/screens/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart'; import 'package:unit2/test_data.dart'; import 'package:unit2/utils/text_container.dart'; import '../../../../theme-data.dart/btn-style.dart'; diff --git a/unit2/lib/screens/unit2/roles/registration_in_charge/components/add.dart b/unit2/lib/screens/unit2/roles/registration_in_charge/components/add.dart new file mode 100644 index 0000000..45b3b71 --- /dev/null +++ b/unit2/lib/screens/unit2/roles/registration_in_charge/components/add.dart @@ -0,0 +1,232 @@ +import 'package:date_time_picker/date_time_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:intl/intl.dart'; +import 'package:unit2/theme-data.dart/form-style.dart'; +import 'package:unit2/utils/global.dart'; +import 'package:unit2/utils/text_container.dart'; +import 'package:unit2/widgets/label.dart'; +import '../../../../../test_data.dart'; +import '../../../../../theme-data.dart/btn-style.dart'; +import '../../../../../theme-data.dart/colors.dart'; + +class AddPerson extends StatefulWidget { + const AddPerson({super.key}); + + @override + State createState() => _AddPersonState(); +} + +class _AddPersonState extends State { + final _formKey = GlobalKey(); + + DateFormat dteFormat = DateFormat("y-M-d"); + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 25), + child: SingleChildScrollView( + child: FormBuilder( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Label(text: basicInformation), + //Firstname + FormBuilderTextField( + name: 'firstname', + validator: FormBuilderValidators.required( + errorText: "First name is required"), + autofocus: false, + decoration: normalTextFieldStyle("First name", ""), + textCapitalization: TextCapitalization.characters, + keyboardType: TextInputType.text, + ), + const SizedBox( + height: 10, + ), + //Firstname + FormBuilderTextField( + name: 'lastname', + validator: FormBuilderValidators.required( + errorText: "Middle name is required"), + autofocus: false, + textCapitalization: TextCapitalization.characters, + keyboardType: TextInputType.text, + decoration: normalTextFieldStyle("Last name", "")), + const SizedBox( + height: 10, + ), + Row( + children: [ + Expanded( + flex: 2, + child: FormBuilderTextField( + name: 'middlename', + validator: FormBuilderValidators.required( + errorText: "Middle name is required"), + autofocus: false, + textCapitalization: TextCapitalization.characters, + keyboardType: TextInputType.text, + decoration: normalTextFieldStyle("Middle name", "")), + ), + const SizedBox( + width: 10, + ), + Expanded( + flex: 1, + child: DateTimePicker( + decoration: normalTextFieldStyle("Birth date", ""), + initialValue: '', + firstDate: DateTime(2000), + lastDate: DateTime(2100), + dateLabelText: 'Date', + onChanged: (val) => print(val), + validator: (val) { + if (val!.isEmpty) { + return "Birthdate is required"; + } + return null; + }, + onSaved: (val) => print(val), + ), + ) + ], + ), + const SizedBox( + height: 10, + ), + Row( + children: [ + Expanded( + flex: 1, + child: FormBuilderTextField( + name: 'extension-name', + autofocus: false, + textCapitalization: TextCapitalization.characters, + keyboardType: TextInputType.text, + decoration: + normalTextFieldStyle("Extenstion name", "")), + ), + const SizedBox( + width: 10, + ), + Expanded( + flex: 1, + child: FormBuilderDropdown( + validator: FormBuilderValidators.required( + errorText: "Gender is required"), + name: 'gender', + autofocus: false, + decoration: normalTextFieldStyle("Gender", ""), + items: genders + .map((gender) => DropdownMenuItem( + value: gender, + child: Text(gender), + )) + .toList()), + ) + ], + ), + const Label(text: address), + FormBuilderDropdown( + name: 'region', + autofocus: false, + validator: FormBuilderValidators.required( + errorText: "Region is required"), + decoration: normalTextFieldStyle("Region", ""), + items: regions + .map((region) => DropdownMenuItem( + value: region, + child: Text(region), + )) + .toList()), + const SizedBox( + height: 10, + ), + FormBuilderDropdown( + name: 'province', + autofocus: false, + validator: FormBuilderValidators.required( + errorText: "Province is required"), + decoration: normalTextFieldStyle("Province", ""), + items: provinces + .map((province) => DropdownMenuItem( + value: province, + child: Text(province), + )) + .toList()), + const SizedBox( + height: 10, + ), + FormBuilderDropdown( + name: 'municipality', + autofocus: false, + validator: FormBuilderValidators.required( + errorText: "Municipality is required"), + decoration: normalTextFieldStyle("Municipalities", ""), + items: municipalities + .map((municipality) => DropdownMenuItem( + value: municipality, + child: Text(municipality), + )) + .toList()), + const SizedBox( + height: 10, + ), + FormBuilderDropdown( + name: 'barangay', + autofocus: false, + validator: FormBuilderValidators.required( + errorText: "Barangay is required"), + decoration: normalTextFieldStyle("Barangay", ""), + items: barangays + .map((barangay) => DropdownMenuItem( + value: barangay, + child: Text(barangay), + )) + .toList()), + const SizedBox( + height: 10, + ), + FormBuilderDropdown( + name: 'purok', + autofocus: false, + validator: FormBuilderValidators.required( + errorText: "Purok is required"), + decoration: normalTextFieldStyle("Purok", ""), + items: puroks + .map((purok) => DropdownMenuItem( + value: purok, + child: Text(purok), + )) + .toList()), + const SizedBox( + height: 10, + ), + SizedBox( + width: double.infinity, + height: screenHeight * .06, + child: ElevatedButton( + style: secondaryBtnStyle( + second, Colors.transparent, Colors.white54), + child: const Text( + submit, + style: TextStyle(color: Colors.white), + ), + onPressed: () { + print(_formKey.currentState!.value['firstname']); + if (_formKey.currentState!.saveAndValidate()) {} + }, + ), + ), + const SizedBox( + height: 20, + ), + ], + )), + ), + ); + } +} diff --git a/unit2/lib/screens/unit2/roles/registration_in_charge/components/request_qr.dart b/unit2/lib/screens/unit2/roles/registration_in_charge/components/request_qr.dart new file mode 100644 index 0000000..7f95879 --- /dev/null +++ b/unit2/lib/screens/unit2/roles/registration_in_charge/components/request_qr.dart @@ -0,0 +1,19 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; + +class RequestQR extends StatefulWidget { + const RequestQR({super.key}); + + @override + State createState() => _RequestQRState(); +} + +class _RequestQRState extends State { + @override + Widget build(BuildContext context) { + return Container( + child: Center(child: Text("Request QR")), + ); + } +} diff --git a/unit2/lib/screens/unit2/roles/registration_in_charge/components/sync.dart b/unit2/lib/screens/unit2/roles/registration_in_charge/components/sync.dart new file mode 100644 index 0000000..02e0236 --- /dev/null +++ b/unit2/lib/screens/unit2/roles/registration_in_charge/components/sync.dart @@ -0,0 +1,63 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:fluttericon/entypo_icons.dart'; +import 'package:fluttericon/font_awesome_icons.dart'; +import 'package:fluttericon/linearicons_free_icons.dart'; +import 'package:fluttericon/octicons_icons.dart'; +import 'package:fluttericon/typicons_icons.dart'; +import 'package:unit2/widgets/label.dart'; + +import '../../../../../theme-data.dart/btn-style.dart'; +import '../../../../../theme-data.dart/colors.dart'; +import '../../../../../utils/global.dart'; +import '../../../../../utils/text_container.dart'; + +class SyncData extends StatefulWidget { + const SyncData({super.key}); + + @override + State createState() => _SyncDataState(); +} + +class _SyncDataState extends State { + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 25), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const Label(text: syncTitle), + Icon( + Octicons.sync_icon, + size: blockSizeVertical * 25, + color: success2, + ), + Column( + children: [ + const Text(syncSubTittle), + const SizedBox( + height: 10, + ), + SizedBox( + width: double.infinity, + height: screenHeight * .06, + child: ElevatedButton( + style: secondaryBtnStyle( + second, Colors.transparent, Colors.white54), + child: const Text( + syncNow, + style: TextStyle(color: Colors.white), + ), + onPressed: () {}, + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/unit2/lib/screens/unit2/roles/registration_in_charge/components/view.dart b/unit2/lib/screens/unit2/roles/registration_in_charge/components/view.dart new file mode 100644 index 0000000..a103af9 --- /dev/null +++ b/unit2/lib/screens/unit2/roles/registration_in_charge/components/view.dart @@ -0,0 +1,100 @@ +import 'package:azlistview/azlistview.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:fluttericon/octicons_icons.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; +import 'package:unit2/utils/global.dart'; + +import '../../../../../test_data.dart'; +import '../../../../../theme-data.dart/text-styles.dart'; + +class _AZItem extends ISuspensionBean { + final String title; + final String tag; + + _AZItem({required this.title, required this.tag}); + + @override + String getSuspensionTag() { + return tag; + } +} + +class ViewList extends StatefulWidget { + const ViewList({super.key}); + + @override + State createState() => _ViewListState(); +} + +class _ViewListState extends State { + List<_AZItem> convertedPersonList = []; + @override + void initState() { + addedPersons.sort( + (a, b) => a.lastname.toLowerCase().compareTo(b.lastname.toLowerCase())); + initList(addedPersons); + super.initState(); + } + + void initList(List persons) { + convertedPersonList = persons + .map((person) => _AZItem( + title: person.lastname + ' ' + person.name, + tag: person.lastname[0])) + .toList(); + SuspensionUtil.sortListBySuspensionTag(persons); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return AzListView( + data: addedPersons, + itemCount: addedPersons.length, + itemBuilder: (BuildContext context, int index) { + final person = convertedPersonList[index]; + return _buildListItem(person, true); + }, + physics: const BouncingScrollPhysics(), + indexBarItemHeight: blockSizeVertical * 3, + indexBarData: SuspensionUtil.getTagIndexList(addedPersons), + indexBarMargin: const EdgeInsets.all(0), + indexBarOptions: const IndexBarOptions( + selectItemDecoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.grey, + ), + selectTextStyle: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + needRebuild: true, + )); + } + + _buildListItem(_AZItem person, bool selected) { + return Card( + elevation: 0, + child: ListTile( + onTap: (() => setState(() { + selected = !selected; + })), + dense: true, + subtitle: Text( + "December 15 1994", + style: Theme.of(context).textTheme.caption, + ), + leading: Checkbox( + onChanged: (value) { + selected = value!; + setState(() {}); + print(selected); + }, + value: selected, + ), + title: Text( + person.title, + style: personInfo(), + ))); + } +} diff --git a/unit2/lib/screens/unit2/roles/registration_in_charge/home.dart b/unit2/lib/screens/unit2/roles/registration_in_charge/home.dart new file mode 100644 index 0000000..d778b69 --- /dev/null +++ b/unit2/lib/screens/unit2/roles/registration_in_charge/home.dart @@ -0,0 +1,88 @@ +import 'package:convex_bottom_bar/convex_bottom_bar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:fluttericon/entypo_icons.dart'; +import 'package:fluttericon/font_awesome_icons.dart'; +import 'package:fluttericon/iconic_icons.dart'; +import 'package:unit2/screens/unit2/roles/registration_in_charge/components/add.dart'; +import 'package:unit2/screens/unit2/roles/registration_in_charge/components/request_qr.dart'; +import 'package:unit2/screens/unit2/roles/registration_in_charge/components/sync.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; +import 'package:unit2/utils/text_container.dart'; + +import 'components/view.dart'; + +class RegistrationInCharge extends StatefulWidget { + const RegistrationInCharge({super.key}); + + @override + State createState() => _RegistrationInChargeState(); +} + +class _RegistrationInChargeState extends State { + final List _pages = [ + const ViewList(), + const AddPerson(), + const SyncData(), + const RequestQR() + ]; + int currentIndex = 0; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text(registrationInChargeTitle), + backgroundColor: second, + centerTitle: true, + actions: [ + IconButton( + // ##SEARCH BUTTON + icon: const Icon(Icons.search), + color: Colors.white, + onPressed: () { + // Navigator.pushNamed(context, '/Registration Search'); + }, + ), + PopupMenuButton( + onSelected: (value) { + // SORT VIA DATE ADDED + if (value == 1) { + } + // SORT VIA LAST NAME + else if (value == 2) {} + }, + itemBuilder: (context) => [ + PopupMenuItem( + value: 1, + child: Row( + children: const [Text('Sort By Date Added')], + )), + PopupMenuItem( + value: 2, + child: Row( + children: const [Text('Sort by Lastname')], + )), + ]), + ], + ), + bottomNavigationBar: ConvexAppBar( + color: Colors.white70, + gradient: primaryGradient(), + style: TabStyle.react, + items: const [ + TabItem(icon: Entypo.home, title: "Home"), + TabItem(icon: Iconic.plus_circle, title: "Add"), + TabItem(icon: Iconic.loop, title: "Sync"), + TabItem(icon: FontAwesome.qrcode, title: "Request QR"), + ], + initialActiveIndex: 0, + onTap: (int i) { + setState(() { + currentIndex = i; + }); + }), + body: _pages[currentIndex], + ); + } +} diff --git a/unit2/lib/test_data.dart b/unit2/lib/test_data.dart index 57b6cd3..a16e395 100644 --- a/unit2/lib/test_data.dart +++ b/unit2/lib/test_data.dart @@ -1,3 +1,87 @@ +import 'package:azlistview/azlistview.dart'; + List levels = ['Establishments', 'Office']; List establishments = ['Provincial Government of Agusan del Norte']; -List checkPointAreas = ['Agusan Up', 'Bids and Awards Committee','Cabadbaran District Hospital','Commision on Audit']; +List checkPointAreas = [ + 'Agusan Up', + 'Bids and Awards Committee', + 'Cabadbaran District Hospital', + 'Commision on Audit' +]; + +final List genders = ["MALE", "FEMALE"]; +final List regions = [ + "Region I", + "Region II", + "Region III", + "Region IV", + "Region V" +]; +final List barangays = [ + "Ambago", + "Lingayao", + "Obrero", + "Bading", + "Limaha", + "Peqeno" +]; +final List puroks = [ + "Ambago", + "Lingayao", + "Obrero", + "Bading", + "Limaha", + "Peqeno" +]; + +final List municipalities = [ + "Buenavista", + "Butuan City", + "Carmen", + "Cabadbaran", + "Jabonga" +]; +final List provinces = [ + "Agusan del Norte", + "Agusan del Sur", + "Surigao del Norte", + "Surigao del Sur" +]; + +List addedPersons = [ + Person(name: "Nav", lastname: "Acuin"), + Person(name: "Jhonny", lastname: "Agoy"), + Person(name: "Philip", lastname: "Amaw"), + Person(name: "Jojo", lastname: "Asus"), + Person(name: "Naruto", lastname: "Acer"), + Person(name: "Agata", lastname: "Azarcon"), + Person(name: "Nav", lastname: "Amen"), + Person(name: "Cristine", lastname: "Albarina"), + Person(name: "Nav", lastname: "Zcuin"), + Person(name: "Jhonny", lastname: "Zgoy"), + Person(name: "Philip", lastname: "Zmaw"), + Person(name: "Jojo", lastname: "Zsus"), + Person(name: "Naruto", lastname: "Zcer"), + Person(name: "Agata", lastname: "Zzarcon"), + Person(name: "Nav", lastname: "Zmen"), + Person(name: "Cristine", lastname: "Zlbarina"), + Person(name: "Nav", lastname: "Bcuin"), + Person(name: "Jhonny", lastname: "Tgoy"), + Person(name: "Philip", lastname: "Smaw"), + Person(name: "Jojo", lastname: "Dsus"), + Person(name: "Naruto", lastname: "Fcer"), + Person(name: "Agata", lastname: "Ezarcon"), + Person(name: "Nav", lastname: "Cmen"), + Person(name: "Cristine", lastname: "Blbarina"), +]; + +class Person extends ISuspensionBean { + final String name; + final String lastname; + Person({required this.name, required this.lastname}); + + @override + String getSuspensionTag() { + return lastname[0]; + } +} diff --git a/unit2/lib/theme-data.dart/colors.dart b/unit2/lib/theme-data.dart/colors.dart index 219a3fd..6fe66a9 100644 --- a/unit2/lib/theme-data.dart/colors.dart +++ b/unit2/lib/theme-data.dart/colors.dart @@ -8,3 +8,10 @@ const fifth = Color(0xfffdfefd); const success = Color(0xffa5d6a7); const success2 = Color(0xff66bb6a); const primary2 = Color(0xff039be5); + +LinearGradient primaryGradient() { + return const LinearGradient( + begin: Alignment.topRight, + end: Alignment.bottomLeft, + colors: [second, Color(0xffFF5151)]); +} diff --git a/unit2/lib/theme-data.dart/text-styles.dart b/unit2/lib/theme-data.dart/text-styles.dart index 7ad4888..aa14dd8 100644 --- a/unit2/lib/theme-data.dart/text-styles.dart +++ b/unit2/lib/theme-data.dart/text-styles.dart @@ -5,3 +5,17 @@ TextStyle titleTextStyle() { return TextStyle( fontSize: blockSizeVertical * 2.5, fontWeight: FontWeight.w500); } + +TextStyle personInitials() { + return TextStyle( + fontSize: blockSizeVertical * 2, + fontWeight: FontWeight.w500, + color: Colors.white); +} + +TextStyle personInfo() { + return TextStyle( + fontWeight: FontWeight.w500, + color: Colors.black54, + fontSize: blockSizeVertical * 2.5); +} diff --git a/unit2/lib/utils/router.dart b/unit2/lib/utils/router.dart index a5e5216..956278b 100644 --- a/unit2/lib/utils/router.dart +++ b/unit2/lib/utils/router.dart @@ -1,16 +1,19 @@ import 'package:go_router/go_router.dart'; -import 'package:unit2/screen/unit2/roles/qr_code_scanner.dart/scan.dart'; -import '../screen/sos/add_mobile.dart'; -import '../screen/sos/request_sos.dart'; -import '../screen/unit2/login/login.dart'; -import '../screen/unit2/homepage.dart/components/drawer-screen.dart'; -import '../screen/unit2/profile/profile.dart'; +import 'package:unit2/screens/unit2/login/register.dart'; +import '../screens/docsms/components/doc_info_tile.dart'; +import '../screens/docsms/request_receipt.dart'; +import '../screens/sos/add_mobile.dart'; +import '../screens/sos/request_sos.dart'; +import '../screens/unit2/login/login.dart'; +import '../screens/unit2/homepage.dart/components/drawer-screen.dart'; +import '../screens/unit2/profile/profile.dart'; +import '../screens/unit2/roles/registration_in_charge/home.dart'; final GoRouter goRouter = GoRouter(routes: [ GoRoute( path: '/', name: 'login', - builder: (context, state) => const QRCodeScanner(), + builder: (context, state) => Register(), routes: [ GoRoute( name: 'home', diff --git a/unit2/lib/utils/text_container.dart b/unit2/lib/utils/text_container.dart index 856ae72..3fcd534 100644 --- a/unit2/lib/utils/text_container.dart +++ b/unit2/lib/utils/text_container.dart @@ -24,4 +24,19 @@ const String requestSOS = "Request SOS"; const String qrScannerTitle = "QR-Code Scanner"; const String establishment = "Establishment"; const String checkpointArea = "Checkpoint Area"; -const String scanMode = 'Scan Mode'; \ No newline at end of file +const String scanMode = 'Scan Mode'; +const String registrationInChargeTitle = "Registration In Charge"; +const String basicInformation = "Basic Information"; +const String address = "Address"; +const String syncTitle = "Sync Data"; +const String syncSubTittle = "Press Sync button to get latest data available"; +const String syncNow = "SYNC NOW"; +const String documentId = "Document ID"; +const String documentTitle = "Document Title"; +const String documentSubject = "Document Subject"; +const String documentType = "Document Type"; +const String registerToContinue = "Create your password to register"; +// +// +// +// \ No newline at end of file diff --git a/unit2/lib/utils/validators.dart b/unit2/lib/utils/validators.dart index 704e733..f647b4d 100644 --- a/unit2/lib/utils/validators.dart +++ b/unit2/lib/utils/validators.dart @@ -1,12 +1,14 @@ import 'package:form_builder_validators/form_builder_validators.dart'; import '../utils/text_container.dart'; +final mobileNumberValidator = FormBuilderValidators.compose([ + FormBuilderValidators.minLength(11), + FormBuilderValidators.required(errorText: mobileNumberRequired), + FormBuilderValidators.numeric(errorText: numericValidator) +]); -final mobileNumberValidator = FormBuilderValidators.compose([ - FormBuilderValidators.required( - errorText: mobileNumberRequired), - FormBuilderValidators.numeric( - errorText: numericValidator) - ]); - - +final registerPasswordValidator = FormBuilderValidators.compose([ + FormBuilderValidators.required(errorText: "Password is required"), + FormBuilderValidators.minLength(6, + errorText: "Password must be equal or greater than 6 characters"), +]); diff --git a/unit2/lib/widgets/costum_divider.dart b/unit2/lib/widgets/costum_divider.dart new file mode 100644 index 0000000..14bf211 --- /dev/null +++ b/unit2/lib/widgets/costum_divider.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; + +class CostumDivider extends StatelessWidget { + const CostumDivider({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Divider( + color: Colors.grey.withOpacity(.5), + height: 1, + thickness: 1, + ); + } +} diff --git a/unit2/lib/widgets/label.dart b/unit2/lib/widgets/label.dart new file mode 100644 index 0000000..c6e9af5 --- /dev/null +++ b/unit2/lib/widgets/label.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; + +import '../utils/global.dart'; + +class Label extends StatelessWidget { + final String text; + const Label({super.key, required this.text}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: Text(text, + style: Theme.of(context) + .textTheme + .displayMedium! + .copyWith(fontSize: blockSizeVertical * 2.5)), + ); + } +} \ No newline at end of file diff --git a/unit2/lib/widgets/text_icon.dart b/unit2/lib/widgets/text_icon.dart new file mode 100644 index 0000000..5a8f50b --- /dev/null +++ b/unit2/lib/widgets/text_icon.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:unit2/theme-data.dart/text-styles.dart'; + +import '../theme-data.dart/colors.dart'; + +class TextIcon extends StatelessWidget { + final String title; + final IconData icon; + + const TextIcon({Key? key, required this.title, required this.icon}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + title, + style: titleTextStyle().copyWith(color: primary, fontSize: 18), + ), + Icon( + icon, + color: primary, + size: 24, + ), + ], + ); + } +} diff --git a/unit2/notes.txt b/unit2/notes.txt new file mode 100644 index 0000000..07ecc0a --- /dev/null +++ b/unit2/notes.txt @@ -0,0 +1,4 @@ + onPressed: () { + print(_formKey.currentState!.value['firstname']); + if (_formKey.currentState!.saveAndValidate()) {} + }, \ No newline at end of file diff --git a/unit2/pubspec.lock b/unit2/pubspec.lock index 93767ed..d2f2cea 100644 --- a/unit2/pubspec.lock +++ b/unit2/pubspec.lock @@ -22,6 +22,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.0" + azlistview: + dependency: "direct main" + description: + name: azlistview + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" boolean_selector: dependency: transitive description: @@ -71,6 +78,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.16.0" + convex_bottom_bar: + dependency: "direct main" + description: + name: convex_bottom_bar + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0+1" crypto: dependency: transitive description: @@ -85,6 +99,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" + date_time_picker: + dependency: "direct main" + description: + name: date_time_picker + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" device_frame: dependency: transitive description: @@ -246,7 +267,7 @@ packages: source: hosted version: "4.0.2" intl: - dependency: transitive + dependency: "direct main" description: name: intl url: "https://pub.dartlang.org" @@ -434,6 +455,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.27.7" + scrollable_positioned_list: + dependency: transitive + description: + name: scrollable_positioned_list + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3" shared_preferences: dependency: transitive description: diff --git a/unit2/pubspec.yaml b/unit2/pubspec.yaml index 729c747..b08bfd4 100644 --- a/unit2/pubspec.yaml +++ b/unit2/pubspec.yaml @@ -50,6 +50,10 @@ dependencies: animate_do: ^3.0.2 flutter_spinkit: ^5.1.0 toggle_switch: ^2.0.1 + convex_bottom_bar: ^3.1.0+1 + azlistview: ^2.0.0 + intl: ^0.17.0 + date_time_picker: ^2.1.0 dev_dependencies: flutter_test: