@ -1,7 +1,14 @@
import ' dart:collection ' ;
import ' package:flutter/cupertino.dart ' ;
import ' package:flutter/material.dart ' ;
import ' package:mohem_flutter_app/api/worklist/worklist_api_client.dart ' ;
import ' package:mohem_flutter_app/classes/colors.dart ' ;
import ' package:mohem_flutter_app/classes/utils.dart ' ;
import ' package:mohem_flutter_app/extensions/string_extensions.dart ' ;
import ' package:mohem_flutter_app/extensions/int_extensions.dart ' ;
import ' package:mohem_flutter_app/models/worklist/replacement_list_model.dart ' ;
import ' package:mohem_flutter_app/ui/work_list/sheets/search_options_sheet.dart ' ;
import ' package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart ' ;
import ' package:mohem_flutter_app/widgets/bottom_sheet.dart ' ;
import ' package:mohem_flutter_app/widgets/button/default_button.dart ' ;
@ -10,21 +17,92 @@ import 'package:mohem_flutter_app/widgets/input_widget.dart';
import ' package:mohem_flutter_app/widgets/radio/show_radio.dart ' ;
import ' package:mohem_flutter_app/extensions/widget_extensions.dart ' ;
class DelegateSheet extends StatelessWidget {
import ' ../../../models/generic_response_model.dart ' ;
import ' ../../../models/get_action_history_list_model.dart ' ;
import ' ../../../models/worklist/get_favorite_replacements_model.dart ' ;
class DelegateSheet extends StatefulWidget {
int ? notificationID ;
String title , apiMode ;
List < GetActionHistoryList > ? actionHistoryList ;
DelegateSheet ( { required this . title , required this . apiMode , this . notificationID , this . actionHistoryList } ) ;
@ override
State < DelegateSheet > createState ( ) = > _DelegateSheetState ( ) ;
}
class _DelegateSheetState extends State < DelegateSheet > {
TextEditingController username = TextEditingController ( ) ;
bool isNeedEnableTextField = false ;
String ? selectedFavLetter ;
String selectedType = " Workflow " ;
String inputRes = " " ;
List < String > ? favLetters ;
List < GetFavoriteReplacements > ? favUsersList ;
List < ReplacementList > ? replacementList ;
Future fetchFavLetters ( { bool isNeedLoading = true } ) async {
favLetters = [ ] ;
if ( isNeedLoading ) Utils . showLoading ( context ) ;
List < GetFavoriteReplacements > ? favList = await WorkListApiClient ( ) . getFavoriteReplacementWithoutImage ( ) ;
List < String > result = [ ] ;
favList ! . forEach ( ( element ) {
result . add ( element . employeeDisplayName ! [ 0 ] ) ;
} ) ;
favLetters = LinkedHashSet < String > . from ( result ) . toList ( ) ;
if ( isNeedLoading ) Utils . hideLoading ( context ) ;
setState ( ( ) {
favLetters ! . sort ( ( a , b ) {
return a . toLowerCase ( ) . compareTo ( b . toLowerCase ( ) ) ;
} ) ;
} ) ;
return null ;
}
Future fetchFavUsersList ( { bool isNeedLoading = true } ) async {
if ( isNeedLoading ) Utils . showLoading ( context ) ;
favUsersList = await WorkListApiClient ( ) . getFavoriteReplacementWithImage ( selectedFavLetter ? ? " " ) ;
if ( isNeedLoading ) Utils . hideLoading ( context ) ;
setState ( ( ) { } ) ;
return null ;
}
fetchChangeFav ( { required String email , required String employeName , required String image , required String userName , bool isFav = false , bool isNeedToRefresh = false } ) async {
Utils . showLoading ( context ) ;
favLetters = null ;
selectedFavLetter = null ;
GenericResponseModel model = await WorkListApiClient ( ) . changeFavoriteReplacements (
email: email ,
employeName: employeName ,
image: image ,
userName: userName ,
isFav: isFav ,
) ;
if ( isNeedToRefresh ) {
await fetchFavLetters ( isNeedLoading: false ) ;
if ( favLetters ! = null ) await fetchFavUsersList ( isNeedLoading: false ) ;
}
Utils . hideLoading ( context ) ;
setState ( ( ) { } ) ;
}
Future fetchUserByInput ( { bool isNeedLoading = true } ) async {
if ( isNeedLoading ) Utils . showLoading ( context ) ;
replacementList = await WorkListApiClient ( ) . searchUserByInput (
userId: selectedType = = " Employee ID " ? inputRes : " " ,
userName: selectedType = = " Employee Name " ? inputRes : " " ,
email: selectedType = = " Employee Email " ? inputRes : " " ,
) ;
if ( isNeedLoading ) Utils . hideLoading ( context ) ;
setState ( ( ) { } ) ;
return null ;
}
@ override
Widget build ( BuildContext context ) {
List < String > related = [
" Amjad Khan " ,
" Munahi Nasser " ,
] ;
List < String > favorites = [
" Amjad Khan " ,
" Muhammad Ahmed " ,
" Majid Ali " ,
" Faris Mahmoud " ,
] ;
return Container (
width: double . infinity ,
height: MediaQuery . of ( context ) . size . height - 80 ,
@ -37,81 +115,219 @@ class DelegateSheet extends StatelessWidget {
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
" Delegate " . toText24 ( ) ,
widget . title . toText24 ( ) ,
24. height ,
" Search " . toText16 ( ) ,
12. height ,
Row (
20. height ,
Column (
crossAxisAlignment: CrossAxisAlignment . end ,
children: [
Expanded (
flex: 2 ,
child: ShowRadio (
title: " Name " , value: " Name " , groupValue: " Name " ) ,
) ,
Expanded (
flex: 3 ,
child: ShowRadio (
title: " User Name " ,
value: " User Name " ,
groupValue: " Name " ) ,
Container (
padding: EdgeInsets . only ( left: 8 , right: 4 , top: 6 , bottom: 6 ) ,
decoration: BoxDecoration (
borderRadius: BorderRadius . circular ( 15 ) ,
color: Colors . transparent ,
border: Border . all (
color: Color ( 0xffefefef ) ,
width: 1 ,
) ,
) ,
child: Row (
children: [
Expanded (
child: InputWidget (
" Search By " + selectedType ,
" " ,
username ,
isEnableBorder: false ,
horizontalPadding: 4 ,
verticalPadding: 3 ,
isInputTypeNum: selectedType = = " Employee ID " ? true : false ,
isEnable: isNeedEnableTextField ,
onChange: ( v ) {
inputRes = v ;
} ,
) ,
) ,
Container (
height: 24 ,
width: 1 ,
color: Color ( 0xffE5E5E5 ) ,
) ,
Container (
padding: EdgeInsets . all ( 8 ) ,
child: Row (
children: [
Text (
selectedType ,
style: const TextStyle (
fontSize: 11 ,
fontWeight: FontWeight . w600 ,
color: Color ( 0xff2B353E ) ,
letterSpacing: - 0.44 ,
) ,
) ,
4. width ,
Icon (
Icons . keyboard_arrow_down ,
color: Colors . black ,
size: 16 ,
) ,
] ,
) ,
) . onPress ( ( ) {
showMyBottomSheet (
context ,
child: SearchOptionsSheet (
selectedType ,
onSelection: ( String value ) {
selectedType = value ;
if ( value = = " Workflow " ) {
setState ( ( ) {
isNeedEnableTextField = false ;
selectedFavLetter = null ;
favLetters = null ;
favUsersList = null ;
} ) ;
} else if ( value = = " Favorites " ) {
isNeedEnableTextField = false ;
fetchFavLetters ( ) ;
} else {
setState ( ( ) {
isNeedEnableTextField = true ;
selectedFavLetter = null ;
favLetters = null ;
favUsersList = null ;
} ) ;
}
} ,
) ,
) ;
} ) ,
] ,
) ,
) ,
if ( isNeedEnableTextField )
FlatButton (
onPressed: ( ) {
fetchUserByInput ( ) ;
} ,
child: Text (
" Search " ,
style: TextStyle (
color: Colors . blue ,
decoration: TextDecoration . underline ,
) ,
) ,
)
] ,
) ,
if ( ! isNeedEnableTextField ) 12. height ,
Row (
children: [
Expanded (
flex: 2 ,
child: ShowRadio (
title: " Email " ,
value: " Email " ,
groupValue: " Name " ) ,
child: Container (
width: double . infinity ,
child: selectedFavLetter = = null & & favLetters ! = null
? Container (
width: double . infinity ,
alignment: Alignment . center ,
child: " Please select letter to see Fav results " . toText12 ( ) ,
)
: favUsersList ! = null
? ListView . separated (
itemBuilder: ( context , index ) {
return showFavUserItem ( favUsersList ! [ index ] ) ;
} ,
separatorBuilder: ( context , index ) {
return Container (
color: MyColors . borderColor ,
width: double . infinity ,
height: 1 ,
margin: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
) . onPress ( ( ) { } ) ;
} ,
physics: NeverScrollableScrollPhysics ( ) ,
shrinkWrap: true ,
itemCount: favUsersList ! . length ,
padding: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
)
: isNeedEnableTextField & & replacementList = = null
? Container (
width: double . infinity ,
alignment: Alignment . center ,
child: " Search User " . toText12 ( ) ,
)
: isNeedEnableTextField & & replacementList ! . length = = 0
? Container (
width: double . infinity ,
alignment: Alignment . center ,
child: " No Data Found " . toText12 ( ) ,
)
: isNeedEnableTextField
? ListView . separated (
itemBuilder: ( context , index ) {
return showInputUserItem ( replacementList ! [ index ] ) ;
} ,
separatorBuilder: ( context , index ) {
return Container (
color: MyColors . borderColor ,
width: double . infinity ,
height: 1 ,
margin: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
) ;
} ,
physics: NeverScrollableScrollPhysics ( ) ,
shrinkWrap: true ,
itemCount: replacementList ! . length ,
padding: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
)
: ListView . separated (
itemBuilder: ( context , index ) {
return showItem ( widget . actionHistoryList ! [ index ] ) ;
} ,
separatorBuilder: ( context , index ) {
return Container (
color: MyColors . borderColor ,
width: double . infinity ,
height: 1 ,
margin: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
) ;
} ,
physics: NeverScrollableScrollPhysics ( ) ,
shrinkWrap: true ,
itemCount: widget . actionHistoryList ! . length ,
padding: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
) ,
) ,
) ,
if ( favLetters ! = null )
Container (
width: 30 ,
/ / color: Colors . red ,
child: ListView . separated (
itemBuilder: ( context , index ) {
return Container (
padding: EdgeInsets . all ( 8 ) ,
alignment: Alignment . center ,
child: favLetters ! [ index ] . toText14 ( color: selectedFavLetter = = favLetters ! [ index ] ? MyColors . gradiantStartColor : Colors . black ) ,
) . onPress ( ( ) {
selectedFavLetter = favLetters ! [ index ] . toUpperCase ( ) ;
fetchFavUsersList ( ) ;
} ) ;
} ,
separatorBuilder: ( context , index ) {
return SizedBox (
height: 0 ,
) ;
} ,
physics: NeverScrollableScrollPhysics ( ) ,
shrinkWrap: true ,
itemCount: favLetters ! . length ,
) ,
) ,
] ,
) ,
20. height ,
InputWidget (
" Search By Username " ,
" " ,
username ,
isBackgroundEnable: true ,
) ,
24. height ,
" Related " . toText16 ( ) ,
12. height ,
ListView . separated (
itemBuilder: ( context , index ) {
return showItem ( context , related [ index ] ) ;
} ,
separatorBuilder: ( context , index ) {
return Container (
color: MyColors . borderColor ,
width: double . infinity ,
height: 1 ,
margin: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
) ;
} ,
physics: NeverScrollableScrollPhysics ( ) ,
shrinkWrap: true ,
itemCount: related . length ,
padding: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
) ,
24. height ,
" Favorites " . toText16 ( ) ,
12. height ,
ListView . separated (
itemBuilder: ( context , index ) {
return showItem ( context , favorites [ index ] ,
isEnabled: true ) ;
} ,
separatorBuilder: ( context , index ) {
return Container (
color: MyColors . borderColor ,
width: double . infinity ,
height: 1 ,
margin: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
) ;
} ,
physics: NeverScrollableScrollPhysics ( ) ,
shrinkWrap: true ,
itemCount: favorites . length ,
padding: EdgeInsets . only ( top: 8 , bottom: 8 ) ,
) ,
] ,
) ,
) ,
@ -138,26 +354,137 @@ class DelegateSheet extends StatelessWidget {
) ;
}
Widget showItem ( BuildContext context , String name , { bool isEnabled = false } ) {
Widget showItem ( GetActionHistoryList actionHistory ) {
return InkWell (
onTap: ( ) {
showMyBottomSheet ( context , child: SelectedItemSheet ( " Delegate " ) ) ;
showMyBottomSheet ( context ,
child: SelectedItemSheet (
" Comment " ,
apiMode: widget . apiMode ,
actionHistoryList: actionHistory ,
notificationID: widget . notificationID ,
) ) ;
} ,
child: Row (
children: [
CircularAvatar (
url: actionHistory . eMPLOYEEIMAGE ? ? " " ,
height: 30 ,
width: 30 ,
isImageBase64: true ,
) ,
16. width ,
Expanded (
child: name . toText12 ( ) ,
child: ( actionHistory . nAME ? ? " " ) . toText12 ( ) ,
) ,
Icon (
Icons . star ,
size: 16 ,
color: isEnabled ? MyColors . yellowColor : MyColors . borderColor ,
IconButton (
onPressed: ( ) {
actionHistory . isFavorite = true ;
fetchChangeFav (
email: actionHistory . eMAILADDRESS ? ? " " ,
employeName: actionHistory . nAME ? ? " " ,
image: actionHistory . eMPLOYEEIMAGE ? ? " " ,
userName: actionHistory . uSERNAME ? ? " " ,
isFav: true ,
) ;
} ,
icon: Icon (
Icons . star ,
size: 16 ,
color: ( actionHistory . isFavorite ? ? false ) ? MyColors . yellowColor : MyColors . borderColor ,
) ,
)
] ,
) ,
) ;
}
Widget showFavUserItem ( GetFavoriteReplacements actionHistory ) {
return InkWell (
onTap: ( ) {
showMyBottomSheet ( context ,
child: SelectedItemSheet (
" Comment " ,
apiMode: widget . apiMode ,
favoriteReplacements: actionHistory ,
notificationID: widget . notificationID ,
) ) ;
} ,
child: Row (
children: [
CircularAvatar (
url: actionHistory . employeeImage ? ? " " ,
height: 30 ,
width: 30 ,
isImageBase64: true ,
) ,
16. width ,
Expanded (
child: ( actionHistory . employeeDisplayName ? ? " " ) . toText12 ( ) ,
) ,
IconButton (
onPressed: ( ) {
fetchChangeFav (
email: actionHistory . emailAddress ? ? " " ,
employeName: actionHistory . employeeDisplayName ? ? " " ,
image: actionHistory . employeeImage ? ? " " ,
userName: actionHistory . userName ? ? " " ,
isFav: false ,
isNeedToRefresh: true ,
) ;
} ,
icon: Icon (
Icons . star ,
size: 16 ,
color: MyColors . yellowColor ,
) ,
)
] ,
) ,
) ;
}
Widget showInputUserItem ( ReplacementList actionHistory ) {
return InkWell (
onTap: ( ) {
showMyBottomSheet ( context ,
child: SelectedItemSheet (
" Comment " ,
apiMode: widget . apiMode ,
replacementList: actionHistory ,
notificationID: widget . notificationID ,
) ) ;
} ,
child: Row (
children: [
CircularAvatar (
url: actionHistory . employeeImage ? ? " " ,
height: 30 ,
width: 30 ,
isImageBase64: true ,
) ,
16. width ,
Expanded (
child: ( actionHistory . employeeDisplayName ? ? " " ) . toText12 ( ) ,
) ,
IconButton (
onPressed: ( ) {
actionHistory . isFavorite = ! ( actionHistory . isFavorite ? ? false ) ;
fetchChangeFav (
email: actionHistory . emailAddress ? ? " " ,
employeName: actionHistory . employeeDisplayName ? ? " " ,
image: actionHistory . employeeImage ? ? " " ,
userName: actionHistory . userName ? ? " " ,
isFav: false ,
isNeedToRefresh: false ,
) ;
} ,
icon: Icon (
Icons . star ,
size: 16 ,
color: ( actionHistory . isFavorite ? ? false ) ? MyColors . yellowColor : MyColors . borderColor ,
) ,
)
] ,
) ,
) ;