import '/backend/api_requests/api_calls.dart'; import '/flutterlib/flutter_drop_down.dart'; import '/flutterlib/flutter_theme.dart'; import '/flutterlib/flutter_util.dart'; import '/flutterlib/flutter_widgets.dart'; import '/flutterlib/form_field_controller.dart'; import '/flutterlib/upload_data.dart'; import 'package:badges/badges.dart' as badges; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import 'bk41_model.dart'; export 'bk41_model.dart'; class Bk41Widget extends StatefulWidget { const Bk41Widget({Key? key}) : super(key: key); @override _Bk41WidgetState createState() => _Bk41WidgetState(); } class _Bk41WidgetState extends State { late Bk41Model _model; final scaffoldKey = GlobalKey(); @override void initState() { super.initState(); _model = createModel(context, () => Bk41Model()); _model.nameController ??= TextEditingController(); _model.nameFocusNode ??= FocusNode(); _model.descriptionController ??= TextEditingController(); _model.descriptionFocusNode ??= FocusNode(); } @override void dispose() { _model.dispose(); super.dispose(); } @override Widget build(BuildContext context) { if (isiOS) { SystemChrome.setSystemUIOverlayStyle( SystemUiOverlayStyle( statusBarBrightness: Theme.of(context).brightness, systemStatusBarContrastEnforced: true, ), ); } context.watch(); return GestureDetector( onTap: () => _model.unfocusNode.canRequestFocus ? FocusScope.of(context).requestFocus(_model.unfocusNode) : FocusScope.of(context).unfocus(), child: Scaffold( key: scaffoldKey, backgroundColor: Color(0xFFEBEBE4), drawer: Container( width: 180.0, child: Drawer( elevation: 16.0, child: Container( width: 100.0, height: 100.0, decoration: BoxDecoration( color: Color(0xFF009B9A), ), child: Column( mainAxisSize: MainAxisSize.max, children: [ Padding( padding: EdgeInsetsDirectional.fromSTEB(0.0, 80.0, 0.0, 0.0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Container( width: 180.0, height: 61.0, decoration: BoxDecoration( color: Color(0xFF009B9A), ), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { context.pushNamed('account'); }, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ Padding( padding: EdgeInsetsDirectional.fromSTEB( 15.0, 8.0, 0.0, 0.0), child: Container( width: 40.0, height: 40.0, decoration: BoxDecoration( color: FlutterTheme.of(context) .secondaryBackground, shape: BoxShape.circle, ), child: Align( alignment: AlignmentDirectional(0.0, 0.0), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/company.svg', width: 30.0, height: 30.0, fit: BoxFit.contain, ), ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 8.0, 8.0, 0.0, 0.0), child: Text( FFLocalizations.of(context).getText( 'iovedxpi' /* ABC Ltd */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', color: Colors.white, fontSize: 16.0, ), ), ), ], ), ), ), ], ), ), Container( width: 180.0, height: 61.0, decoration: BoxDecoration( color: Color(0xFF009B9A), ), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { context.pushNamed('account1'); }, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/Group_2640.svg', width: 0.0, height: 0.0, fit: BoxFit.contain, ), ), Align( alignment: AlignmentDirectional(0.0, 0.0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 5.0, 0.0, 0.0, 0.0), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: Image.asset( 'assets/images/account.png', width: 50.0, height: 50.0, fit: BoxFit.cover, ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 8.0, 0.0, 0.0, 0.0), child: Text( FFLocalizations.of(context).getText( '1l8snegj' /* Account */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', color: Colors.white, fontSize: 16.0, ), ), ), ], ), ), ), Container( width: 180.0, height: 61.0, decoration: BoxDecoration( color: Color(0xFF009B9A), ), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { context.pushNamed('tnc'); }, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/document.svg', width: 0.0, height: 0.0, fit: BoxFit.contain, ), ), Align( alignment: AlignmentDirectional(0.0, 0.0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 16.0, 0.0, 0.0, 0.0), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/tnc.svg', width: 30.0, height: 30.0, fit: BoxFit.cover, ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 17.0, 0.0, 0.0, 0.0), child: Text( FFLocalizations.of(context).getText( 'ozukx08w' /* T&C */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', color: Colors.white, fontSize: 16.0, ), ), ), ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/Group_2640.svg', width: 0.0, height: 0.0, fit: BoxFit.fitHeight, ), ), ], ), ), ), Container( width: 180.0, height: 61.0, decoration: BoxDecoration( color: Color(0xFF009B9A), ), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { context.pushNamed('policy'); }, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/Group_2640.svg', width: 0.0, height: 0.0, fit: BoxFit.contain, ), ), Align( alignment: AlignmentDirectional(0.0, 0.0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 16.0, 0.0, 0.0, 0.0), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/pp.svg', width: 30.0, height: 30.0, fit: BoxFit.cover, ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 16.0, 0.0, 0.0, 0.0), child: Text( FFLocalizations.of(context).getText( 'ubvug0hu' /* Privacy Policy */ , ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', color: Colors.white, fontSize: 16.0, ), ), ), ], ), ), ), Container( width: 180.0, height: 61.0, decoration: BoxDecoration( color: Color(0xFF009B9A), ), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { context.pushNamed('language'); }, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/Group_2640.svg', width: 0.0, height: 0.0, fit: BoxFit.contain, ), ), Align( alignment: AlignmentDirectional(0.0, 0.0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 16.0, 0.0, 0.0, 0.0), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/language.svg', width: 30.0, height: 30.0, fit: BoxFit.contain, ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 15.0, 0.0, 0.0, 0.0), child: Text( FFLocalizations.of(context).getText( '8q5lu6vw' /* Languages */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', color: Colors.white, fontSize: 16.0, ), ), ), ], ), ), ), Container( width: 180.0, height: 61.0, decoration: BoxDecoration( color: Color(0xFF009B9A), ), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { context.pushNamed('setting'); }, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/Group_2640.svg', width: 0.0, height: 0.0, fit: BoxFit.contain, ), ), Align( alignment: AlignmentDirectional(0.0, 0.0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 16.0, 0.0, 0.0, 0.0), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/setting-2.svg', width: 30.0, height: 30.0, fit: BoxFit.contain, ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 15.0, 0.0, 0.0, 0.0), child: Text( FFLocalizations.of(context).getText( '4hzlw4m2' /* Settings */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', color: Colors.white, fontSize: 16.0, ), ), ), ], ), ), ), ], ), ), ), ), appBar: PreferredSize( preferredSize: Size.fromHeight(0.0), child: AppBar( backgroundColor: Color(0xFFE7E36B), automaticallyImplyLeading: false, actions: [], centerTitle: false, elevation: 0.0, ), ), body: SafeArea( top: true, child: Column( mainAxisSize: MainAxisSize.max, children: [ Container( width: double.infinity, height: 105.0, decoration: BoxDecoration( gradient: LinearGradient( colors: [Color(0xFFE7E63B), Color(0xFFC6E6D7)], stops: [0.0, 1.0], begin: AlignmentDirectional(-1.0, 0.0), end: AlignmentDirectional(1.0, 0), ), borderRadius: BorderRadius.only( bottomLeft: Radius.circular(40.0), bottomRight: Radius.circular(40.0), topLeft: Radius.circular(0.0), topRight: Radius.circular(0.0), ), ), child: Padding( padding: EdgeInsetsDirectional.fromSTEB(0.0, 40.0, 0.0, 0.0), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Align( alignment: AlignmentDirectional(-1.0, 0.0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 20.0, 0.0, 0.0, 0.0), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { scaffoldKey.currentState!.openDrawer(); }, child: Icon( Icons.density_medium_sharp, color: FlutterTheme.of(context).secondaryText, size: 30.0, ), ), ), ), ClipRRect( borderRadius: BorderRadius.circular(8.0), child: Image.asset( 'assets/images/numstat+black_1.png', width: 61.0, height: 61.0, fit: BoxFit.cover, ), ), Align( alignment: AlignmentDirectional(1.0, 0.0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 0.0, 0.0, 20.0, 0.0), child: badges.Badge( badgeContent: Text( FFLocalizations.of(context).getText( 'snphvz0i' /* 1 */, ), style: FlutterTheme.of(context) .titleSmall .override( fontFamily: 'Readex Pro', color: Colors.white, fontSize: 10.0, ), ), showBadge: true, shape: badges.BadgeShape.circle, badgeColor: Color(0xFFFF0000), elevation: 4.0, padding: EdgeInsets.all(8.0), position: badges.BadgePosition.topEnd(), animationType: badges.BadgeAnimationType.scale, toAnimate: true, child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { context.pushNamed('notification'); }, child: FaIcon( FontAwesomeIcons.bell, color: FlutterTheme.of(context).secondaryText, size: 30.0, ), ), ), ), ), ], ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB(0.0, 20.0, 0.0, 0.0), child: Container( width: 358.0, height: 598.0, decoration: BoxDecoration( color: FlutterTheme.of(context).secondaryBackground, borderRadius: BorderRadius.circular(8.0), ), child: Column( mainAxisSize: MainAxisSize.max, children: [ Padding( padding: EdgeInsetsDirectional.fromSTEB( 10.0, 20.0, 0.0, 12.0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Text( FFLocalizations.of(context).getText( '7wbp1un9' /* Upload Document */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', fontSize: 16.0, ), ), ], ), ), Container( width: 326.0, height: 140.0, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8.0), ), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { final selectedMedia = await selectMedia( mediaSource: MediaSource.photoGallery, multiImage: false, ); if (selectedMedia != null && selectedMedia.every((m) => validateFileFormat( m.storagePath, context))) { setState(() => _model.isDataUploading = true); var selectedUploadedFiles = []; try { selectedUploadedFiles = selectedMedia .map((m) => FFUploadedFile( name: m.storagePath.split('/').last, bytes: m.bytes, height: m.dimensions?.height, width: m.dimensions?.width, blurHash: m.blurHash, )) .toList(); } finally { _model.isDataUploading = false; } if (selectedUploadedFiles.length == selectedMedia.length) { setState(() { _model.uploadedLocalFile = selectedUploadedFiles.first; }); } else { setState(() {}); return; } } }, child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: SvgPicture.asset( 'assets/images/Property_1=Drag_and_Drop,_Property_2=File.svg', width: 320.0, height: 142.0, fit: BoxFit.contain, ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 10.0, 15.0, 0.0, 0.0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Text( FFLocalizations.of(context).getText( 'iuev6ol8' /* Document name */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', fontSize: 16.0, ), ), ], ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Expanded( child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 8.0, 0.0, 8.0, 0.0), child: Container( width: 326.0, child: TextFormField( controller: _model.nameController, focusNode: _model.nameFocusNode, obscureText: false, decoration: InputDecoration( labelStyle: FlutterTheme.of(context) .labelMedium, hintStyle: FlutterTheme.of(context) .labelMedium, enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterTheme.of(context) .alternate, width: 2.0, ), borderRadius: BorderRadius.circular(23.8), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterTheme.of(context) .primary, width: 2.0, ), borderRadius: BorderRadius.circular(23.8), ), errorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterTheme.of(context) .error, width: 2.0, ), borderRadius: BorderRadius.circular(23.8), ), focusedErrorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterTheme.of(context) .error, width: 2.0, ), borderRadius: BorderRadius.circular(23.8), ), ), style: FlutterTheme.of(context).bodyMedium, maxLines: 2, minLines: 1, validator: _model.nameControllerValidator .asValidator(context), ), ), ), ), ], ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 10.0, 15.0, 0.0, 0.0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Text( FFLocalizations.of(context).getText( 'o8ws4hp9' /* Document description */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', fontSize: 16.0, ), ), ], ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Expanded( child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 8.0, 0.0, 8.0, 0.0), child: Container( width: 326.0, child: TextFormField( controller: _model.descriptionController, focusNode: _model.descriptionFocusNode, obscureText: false, decoration: InputDecoration( labelStyle: FlutterTheme.of(context) .labelMedium, hintStyle: FlutterTheme.of(context) .labelMedium, enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterTheme.of(context) .alternate, width: 2.0, ), borderRadius: BorderRadius.circular(23.8), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterTheme.of(context) .primary, width: 2.0, ), borderRadius: BorderRadius.circular(23.8), ), errorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterTheme.of(context) .error, width: 2.0, ), borderRadius: BorderRadius.circular(23.8), ), focusedErrorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterTheme.of(context) .error, width: 2.0, ), borderRadius: BorderRadius.circular(23.8), ), ), style: FlutterTheme.of(context).bodyMedium, maxLines: 2, minLines: 1, validator: _model .descriptionControllerValidator .asValidator(context), ), ), ), ), ], ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 10.0, 15.0, 0.0, 0.0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Text( FFLocalizations.of(context).getText( '1capxgqu' /* Document category */, ), style: FlutterTheme.of(context) .bodyMedium .override( fontFamily: 'Readex Pro', fontSize: 16.0, ), ), ], ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0), child: FutureBuilder( future: NumstationGroup.documentCategoriesCall.call( token: FFAppState().token, ), builder: (context, snapshot) { // Customize what your widget looks like when it's loading. if (!snapshot.hasData) { return Center( child: SizedBox( width: 50.0, height: 50.0, child: CircularProgressIndicator( valueColor: AlwaysStoppedAnimation( FlutterTheme.of(context).info, ), ), ), ); } final categoryDocumentCategoriesResponse = snapshot.data!; return FlutterDropDown( controller: _model.categoryValueController ??= FormFieldController( _model.categoryValue ??= '', ), options: List.from((getJsonField( categoryDocumentCategoriesResponse.jsonBody, r'''$.categories..id''', true, ) as List) .map((s) => s.toString()) .toList()!), optionLabels: (getJsonField( categoryDocumentCategoriesResponse.jsonBody, r'''$.categories..name''', true, ) as List) .map((s) => s.toString()) .toList()!, onChanged: (val) => setState(() => _model.categoryValue = val), width: 326.0, height: 40.0, textStyle: FlutterTheme.of(context).bodyMedium, hintText: FFLocalizations.of(context).getText( '4saf6x91' /* -- Select category -- */, ), icon: Icon( Icons.keyboard_arrow_down_rounded, color: FlutterTheme.of(context).secondaryText, size: 24.0, ), fillColor: Color(0xFFEBEBE4), elevation: 2.0, borderColor: FlutterTheme.of(context).alternate, borderWidth: 2.0, borderRadius: 40.0, margin: EdgeInsetsDirectional.fromSTEB( 16.0, 4.0, 16.0, 4.0), hidesUnderline: true, isSearchable: false, isMultiSelect: false, ); }, ), ), Expanded( child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding( padding: EdgeInsetsDirectional.fromSTEB( 10.0, 0.0, 0.0, 0.0), child: FFButtonWidget( onPressed: () async { _model.apiResultl9k = await NumstationGroup .addDocumentCall .call( token: FFAppState().token, document: _model.uploadedLocalFile, name: _model.nameController.text, description: _model.descriptionController.text, bookkeepingDocumentCategoryId: _model.categoryValue, ); if ((_model.apiResultl9k?.succeeded ?? true)) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( 'success', style: TextStyle( color: FlutterTheme.of(context) .primaryText, ), ), duration: Duration(milliseconds: 4000), backgroundColor: FlutterTheme.of(context) .secondary, ), ); context.pushNamed('bk4'); } setState(() {}); }, text: FFLocalizations.of(context).getText( 'knrdjja6' /* Submit */, ), options: FFButtonOptions( width: 159.0, height: 50.0, padding: EdgeInsetsDirectional.fromSTEB( 24.0, 0.0, 24.0, 0.0), iconPadding: EdgeInsetsDirectional.fromSTEB( 0.0, 0.0, 0.0, 0.0), color: Color(0xFF009B9A), textStyle: FlutterTheme.of(context) .titleSmall .override( fontFamily: 'Readex Pro', color: Colors.white, ), elevation: 3.0, borderSide: BorderSide( color: Colors.transparent, width: 1.0, ), borderRadius: BorderRadius.circular(40.0), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 0.0, 0.0, 10.0, 0.0), child: FFButtonWidget( onPressed: () async { context.safePop(); }, text: FFLocalizations.of(context).getText( '6rbn102v' /* Cancel */, ), options: FFButtonOptions( width: 159.0, height: 50.0, padding: EdgeInsetsDirectional.fromSTEB( 24.0, 0.0, 24.0, 0.0), iconPadding: EdgeInsetsDirectional.fromSTEB( 0.0, 0.0, 0.0, 0.0), color: Color(0xFF9B0025), textStyle: FlutterTheme.of(context) .titleSmall .override( fontFamily: 'Readex Pro', color: Colors.white, ), elevation: 3.0, borderSide: BorderSide( color: Colors.transparent, width: 1.0, ), borderRadius: BorderRadius.circular(40.0), ), ), ), ], ), ), ], ), ), ), ], ), ), ), ); } }