step 21 : rekap kehadiran di home screen & update versi 1.0.2

This commit is contained in:
sindhu
2024-02-05 11:56:54 +07:00
parent 8d8c5a38bc
commit 409b8561e7
7 changed files with 220 additions and 11 deletions

View File

@@ -14,7 +14,7 @@ class Constant {
static double designWidthPhone = 390;
// NOTE VERSI HARUS SAMA DENGAN PUBSPEC.YAML
static String version = "1.0.1";
static String version = "1.0.2";
// color theme
static Color textTrueBlack = const Color(0xff000000);

View File

@@ -0,0 +1,33 @@
class RekapKehadiranHomeScreenModel {
String? status;
String? message;
String? kehadiran;
String? tidakHadir;
String? lembur;
RekapKehadiranHomeScreenModel({
this.status,
this.message,
this.kehadiran,
this.tidakHadir,
this.lembur,
});
RekapKehadiranHomeScreenModel.fromJson(Map<String, dynamic> json) {
status = json['status'];
message = json['message'];
kehadiran = json['kehadiran'];
tidakHadir = json['tidak_hadir'];
lembur = json['lembur'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
data['message'] = this.message;
data['kehadiran'] = this.kehadiran;
data['tidak_hadir'] = this.tidakHadir;
data['lembur'] = this.lembur;
return data;
}
}

View File

@@ -0,0 +1,5 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../model/rekap_kehadiran_home_screen_model.dart';
final currentRekapKehadiranHomeProvider = StateProvider<RekapKehadiranHomeScreenModel?>((ref) => null);

View File

@@ -1,5 +1,6 @@
import 'package:absensi_sas/model/check_distance_model.dart';
import 'package:absensi_sas/model/check_presensi_jam_model.dart';
import '../model/rekap_kehadiran_home_screen_model.dart';
import 'base_repository.dart';
class PresensiRepository extends BaseRepository {
@@ -177,4 +178,49 @@ class PresensiRepository extends BaseRepository {
);
return result;
}
// rekap kehadiran home screen
Future<RekapKehadiranHomeScreenModel> rekapKehadiranHomeScreen(
String M_StaffID,
String M_CompanyID,
String token,
Map<String, dynamic> paramInpVariables,
) async {
const String query =
r'''query($M_StaffID:String!, $M_CompanyID:String!, $token:String!){
queryRekapKehadiranHomeScreen(M_StaffID:$M_StaffID, M_CompanyID:$M_CompanyID, token:$token){
status
message
kehadiran
tidak_hadir
lembur
}
}''';
// Map<String, dynamic> inpVariables = paramInpVariables;
// Map<String, dynamic> X = {
// "M_StaffID": M_StaffID,
// "M_CompanyID": M_CompanyID,
// "token": token+"1",
// };
print(paramInpVariables);
final resp = await postGraphQlQuery(query, paramInpVariables);
// final resp = await postGraphQlQueryX(query, X);
// print(inpVariables);
print('obj queryRekapKehadiranHomeScreen : ${resp["queryRekapKehadiranHomeScreen"]}');
final result = RekapKehadiranHomeScreenModel(
kehadiran: resp['queryRekapKehadiranHomeScreen']['kehadiran'],
tidakHadir: resp['queryRekapKehadiranHomeScreen']['tidak_hadir'],
lembur: resp['queryRekapKehadiranHomeScreen']['lembur'],
message: resp['queryRekapKehadiranHomeScreen']['message'],
status: resp['queryRekapKehadiranHomeScreen']['status'],
);
return result;
}
}

View File

@@ -1,4 +1,5 @@
import 'package:absensi_sas/app/constant.dart';
import 'package:absensi_sas/provider/current_rekap_kehadiran_home_provider.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:geocoding/geocoding.dart';
@@ -19,6 +20,7 @@ import '../../widget/real_time.dart';
import '../../widget/sankbar_widget.dart';
import '../presensi/check_distance_provider.dart';
import '../presensi/check_presensi_jam_provider.dart';
import 'rekap_kehadiran_home_screen_provider.dart';
class HomeScreen extends HookConsumerWidget {
const HomeScreen({super.key});
@@ -30,6 +32,9 @@ class HomeScreen extends HookConsumerWidget {
final varCurrentDistanceProvider = ref.watch(currentCheckDistanceProvider);
final varCurrentCheckJamProvider =
ref.watch(currentCheckJamPresensiProvider);
final varCurrentRekapKehadiranProvider =
ref.watch(currentRekapKehadiranHomeProvider);
final positionLatitude = useState<String>("");
final positionLongitude = useState<String>("");
// GoogleSignInAccount? currentUserGoogle =
@@ -70,6 +75,16 @@ class HomeScreen extends HookConsumerWidget {
selectedUser?.token ?? "",
inpVariablesCheckPresensiJam,
);
// panggil rekap kehadiran home screen
ref
.read(rekapKehadiranHomeScreenProvider.notifier)
.rekapKehadiranHomeScreen(
selectedUser?.model.staffId ?? "",
selectedUser?.model.companyId ?? "",
selectedUser?.token ?? "",
inpVariablesCheckPresensiJam,
);
}
});
return () {};
@@ -180,6 +195,20 @@ class HomeScreen extends HookConsumerWidget {
}
});
// rekap kehadiran home screen
ref.listen(rekapKehadiranHomeScreenProvider, (prev, next) {
if (next is RekapKehadiranHomeScreenStateLoading) {
isLoadingProsesCheckDistance.value = true;
} else if (next is RekapKehadiranHomeScreenStateError) {
isLoadingProsesCheckDistance.value = false;
print("Error : " + next.toString());
SanckbarWidget(
context, "Error : " + next.toString(), snackbarType.warning);
} else if (next is RekapKehadiranHomeScreenStateDone) {
isLoadingProsesCheckDistance.value = false;
}
});
return Padding(
padding: EdgeInsets.only(
top: Constant.getActualYPhone(context: context, y: 30),
@@ -383,6 +412,16 @@ class HomeScreen extends HookConsumerWidget {
selectedUser?.token ?? "",
inpVariablesCheckPresensiJam,
);
// panggil rekap kehadiran home screen
ref
.read(rekapKehadiranHomeScreenProvider.notifier)
.rekapKehadiranHomeScreen(
selectedUser?.model.staffId ?? "",
selectedUser?.model.companyId ?? "",
selectedUser?.token ?? "",
inpVariablesCheckPresensiJam,
);
}
},
child: SingleChildScrollView(
@@ -693,12 +732,12 @@ class HomeScreen extends HookConsumerWidget {
//Menu Rekap Presensi
Padding(
padding: EdgeInsets.only(
right:
Constant.getActualXPhone(context: context, x: 27),
left:
Constant.getActualXPhone(context: context, x: 33),
bottom: Constant.getActualYPhone(
context: context, y: 40)),
right:
Constant.getActualXPhone(context: context, x: 27),
left: Constant.getActualXPhone(context: context, x: 33),
bottom:
Constant.getActualYPhone(context: context, y: 40),
),
child: Container(
width:
Constant.getActualXPhone(context: context, x: 330),
@@ -750,7 +789,8 @@ class HomeScreen extends HookConsumerWidget {
CrossAxisAlignment.start,
children: [
Text(
'24 hari',
// '24 hari',
varCurrentRekapKehadiranProvider?.kehadiran ?? "",
style: Constant.subtitle_600_14(
context: context)
.copyWith(
@@ -802,7 +842,8 @@ class HomeScreen extends HookConsumerWidget {
CrossAxisAlignment.start,
children: [
Text(
'2 hari',
// '2 hari',
varCurrentRekapKehadiranProvider?.tidakHadir ?? "",
style: Constant.subtitle_600_14(
context: context)
.copyWith(
@@ -854,7 +895,8 @@ class HomeScreen extends HookConsumerWidget {
CrossAxisAlignment.start,
children: [
Text(
'5 hari',
// '5 hari',
varCurrentRekapKehadiranProvider?.lembur ?? "",
style: Constant.subtitle_600_14(
context: context)
.copyWith(

View File

@@ -0,0 +1,83 @@
import '../../model/rekap_kehadiran_home_screen_model.dart';
import '../../provider/current_rekap_kehadiran_home_provider.dart';
import '../../repository/presensi_repository.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../provider/dio_provider.dart';
import '../../provider/graphql_provider.dart';
import '../../repository/base_repository.dart';
abstract class RekapKehadiranHomeScreenState extends Equatable {
final DateTime date;
const RekapKehadiranHomeScreenState(this.date);
@override
List<Object?> get props => [date];
}
class RekapKehadiranHomeScreenStateInit extends RekapKehadiranHomeScreenState {
RekapKehadiranHomeScreenStateInit() : super(DateTime.now());
}
class RekapKehadiranHomeScreenStateLoading extends RekapKehadiranHomeScreenState {
RekapKehadiranHomeScreenStateLoading() : super(DateTime.now());
}
class RekapKehadiranHomeScreenStateError extends RekapKehadiranHomeScreenState {
final String message;
RekapKehadiranHomeScreenStateError({
required this.message,
}) : super(DateTime.now());
}
class RekapKehadiranHomeScreenStateDone extends RekapKehadiranHomeScreenState {
final RekapKehadiranHomeScreenModel model;
RekapKehadiranHomeScreenStateDone({
required this.model,
}) : super(DateTime.now());
}
//notifier
class RekapKehadiranHomeScreenNotifier extends StateNotifier<RekapKehadiranHomeScreenState> {
final Ref ref;
RekapKehadiranHomeScreenNotifier({
required this.ref,
}) : super(RekapKehadiranHomeScreenStateInit());
void rekapKehadiranHomeScreen(
String M_StaffID,
String M_CompanyID,
String token,
Map<String, dynamic> paramInpVariables,
) async {
try {
state = RekapKehadiranHomeScreenStateLoading();
final graphql = ref.read(graphqlProvider(''));
final dio = ref.read(dioProvider);
final resp = await PresensiRepository(graphql: graphql, dio: dio)
.rekapKehadiranHomeScreen(
M_StaffID,
M_CompanyID,
token,
paramInpVariables,
);
// set ke global state provider currentRekapKehadiranHomeProvider
ref.read(currentRekapKehadiranHomeProvider.notifier).update((state) => resp);
state = RekapKehadiranHomeScreenStateDone(model: resp);
} catch (e) {
if (e is BaseRepositoryException) {
print(e.message);
state = RekapKehadiranHomeScreenStateError(message: e.message ?? "");
} else {
state = RekapKehadiranHomeScreenStateError(message: e.toString());
}
}
}
}
// provider
final rekapKehadiranHomeScreenProvider =
StateNotifierProvider<RekapKehadiranHomeScreenNotifier, RekapKehadiranHomeScreenState>(
(ref) => RekapKehadiranHomeScreenNotifier(ref: ref),
);

View File

@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.0.1
version: 1.0.2
environment:
sdk: '>=3.0.6 <4.0.0'