step 21 : rekap kehadiran di home screen & update versi 1.0.2
This commit is contained in:
@@ -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);
|
||||
|
||||
33
lib/model/rekap_kehadiran_home_screen_model.dart
Normal file
33
lib/model/rekap_kehadiran_home_screen_model.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
5
lib/provider/current_rekap_kehadiran_home_provider.dart
Normal file
5
lib/provider/current_rekap_kehadiran_home_provider.dart
Normal 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);
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
83
lib/screen/home/rekap_kehadiran_home_screen_provider.dart
Normal file
83
lib/screen/home/rekap_kehadiran_home_screen_provider.dart
Normal 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),
|
||||
);
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user