import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_bloc.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_event.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_state.dart'; import 'package:syncrow_web/pages/common/default_button.dart'; import 'package:syncrow_web/pages/visitor_password/view/visitor_password_dialog.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/style.dart'; import 'package:syncrow_web/web_layout/web_scaffold.dart'; class AccessManagementPage extends StatelessWidget { const AccessManagementPage({super.key}); @override Widget build(BuildContext context) { Size size = MediaQuery.of(context).size; return WebScaffold( enableMenuSideba: false, appBarTitle: Row( children: [ Text( 'Access Management', style: Theme.of(context).textTheme.headlineLarge, ) ], ), appBarBody: [ Text( 'Physical Access', style: Theme.of(context) .textTheme .headlineMedium! .copyWith(color: Colors.white), ), ], scaffoldBody: BlocProvider(create: (BuildContext context) => AccessBloc()..add(FetchTableData()), child: BlocConsumer(listener: (context, state) { if (state is FailedState) { // CustomSnackBar.displaySnackBar( // state.errorMessage // ); } }, builder: (context, state) { final accessBloc = BlocProvider.of(context); return Container( padding: EdgeInsets.all(30), height: size.height, width: size.width, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( height: size.height * 0.05, width:size.width * 0.26 , decoration: containerDecoration, child: Center( child: ListView.builder( scrollDirection: Axis.horizontal, itemCount: BlocProvider.of(context).tabs.length, itemBuilder: (context, index) { final isSelected = index == BlocProvider.of(context).selectedIndex; return InkWell( onTap: () { BlocProvider.of(context).add(TabChangedEvent(index)); }, child: Container( decoration: BoxDecoration( color: ColorsManager.boxColor, border: Border.all( color: isSelected ? Colors.blue : Colors.transparent, width: 2.0,), borderRadius: index == 0 ? const BorderRadius.only( topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)) : index == 3 ? const BorderRadius.only( topRight: Radius.circular(10), bottomRight: Radius.circular(10)) : null), padding: const EdgeInsets.only(left: 10,right: 10), child: Center( child: Text( BlocProvider.of(context).tabs[index], style: TextStyle( color: isSelected ? Colors.blue : Colors.black, ), ), ), ), ); }, ), ), ), const SizedBox( height: 20, ), Wrap( children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ const Text('Password Name'), Container( width: size.width * 0.15, decoration: containerDecoration, child: TextFormField( controller: accessBloc.passwordName, style: TextStyle(color: Colors.black), decoration: textBoxDecoration()! .copyWith(hintText: 'Please enter'), )), ], ), const SizedBox( width: 15, ), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ const Text('Access Time'), Container( width: size.width * 0.25, padding: EdgeInsets.all(10), decoration: containerDecoration, child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ InkWell( onTap: () { accessBloc.add(SelectTime(context: context, isStart: true)); }, child: Text(BlocProvider.of(context).startTime) ), const Icon(Icons.arrow_right_alt), InkWell( onTap: () { accessBloc.add(SelectTime(context: context, isStart: false)); }, child: Text(BlocProvider.of(context).endTime)), SvgPicture.asset( Assets.calendarIcon, ), ], ), ], )), ], ), const SizedBox( width: 15, ), SizedBox( width: size.width * 0.06, child: Column( children: [ Text(''), Container( decoration: containerDecoration, child: DefaultButton( onPressed: () { accessBloc.add(FilterDataEvent( passwordName: accessBloc.passwordName.text, startTime: accessBloc.effectiveTimeTimeStamp, endTime: accessBloc.expirationTimeTimeStamp )); }, borderRadius: 9, child: const Text('Search'))), ], ), ), const SizedBox( width: 10, ), SizedBox( width: size.width * 0.06, child: Column( children: [ Text(''), Container( decoration: containerDecoration, child: DefaultButton( onPressed: () { accessBloc.add(ResetSearch()); }, backgroundColor: ColorsManager.whiteColors, borderRadius: 9, child: Text( 'Reset', style: Theme.of(context) .textTheme .bodySmall! .copyWith(color: Colors.black), ), ), ), ], ), ), ], ), const SizedBox( height: 20, ), Wrap( children: [ Container( width: size.width * 0.15, decoration: containerDecoration, child: DefaultButton( onPressed: () { showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return const VisitorPasswordDialog(); }, ); }, borderRadius: 8, child: Text('+ Create Visitor Password ')), ), const SizedBox( width: 10, ), Container( width: size.width * 0.12, decoration: containerDecoration, child: DefaultButton( borderRadius: 8, backgroundColor: ColorsManager.whiteColors, child: Text( 'Admin Password', style: Theme.of(context) .textTheme .bodySmall! .copyWith(color: Colors.black), ))) ], ), const SizedBox( height: 20, ), Expanded( child: state is TableLoaded ? TableWidget(size, state,accessBloc) : const Center(child: CircularProgressIndicator())) ], ), ); }))); } Container TableWidget(Size size, TableLoaded state,AccessBloc accessBloc) { return Container( decoration: containerDecoration, width: size.width, child: Padding( padding: const EdgeInsets.all(10.0), child: ListView( scrollDirection: Axis.horizontal, children: [ Container( width: size.width, height: size.height, child: Column( children: [ Container( color: ColorsManager.boxColor, child: Row( children: [ _buildTableHeaderCell('Password name'), _buildTableHeaderCell(' Password Type'), _buildTableHeaderCell('Start Time'), _buildTableHeaderCell('End Time'), _buildTableHeaderCell('Device Id'), // _buildTableHeaderCell('Authorization Source'), // _buildTableHeaderCell('Authorizer'), _buildTableHeaderCell('Password Created'), // _buildTableHeaderCell('Access Status'), _buildTableHeaderCell('Password Status'), ], ), ), Expanded( child: Container( width: size.width, color: ColorsManager.whiteColors, child: ListView( shrinkWrap: true, children: [ Column( children: state.data.map((item) { return Row( children: [ _buildTableCell(item.passwodName), _buildTableCell(item.passwordType), _buildTableCell(accessBloc.timestampToDateTime(item.effectiveTime).toString()), _buildTableCell(accessBloc.timestampToDateTime(item.invalidTime).toString()), _buildTableCell(item.deviceUuid.toString()), // _buildTableCell(item.authorizationSource), // _buildTableCell(item.authorizer), _buildTableCell(item.passwordCreated!=null?accessBloc.timestampToDateTime(item.passwordCreated).toString():'no data'), // _buildTableCell(item.accessStatus), _buildTableCell(item.passwordStatus.toString()), ], ); }).toList(), ), ], ), ), ), ], ), ), ], ), ), ); } } Widget _buildTableHeaderCell(String title) { return Expanded( child: Container( decoration: const BoxDecoration( border: Border.symmetric( vertical: BorderSide(color: ColorsManager.boxDivider))), alignment: Alignment.centerLeft, child: Padding( padding: const EdgeInsets.all(8.0), child: Text(title, style: TextStyle(fontWeight: FontWeight.bold)), ), ), ); } Widget _buildTableCell(String content) { return Expanded( child: Container( height: 80, padding: const EdgeInsets.all(20.0), decoration: BoxDecoration( border: Border( bottom: BorderSide( // <--- right side color: ColorsManager.boxDivider, width: 1.0, ), ) ), alignment: Alignment.centerLeft, child: Text( content, style: TextStyle(color: Colors.black, fontSize: 12), ), ), ); }