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;
|
static double designWidthPhone = 390;
|
||||||
|
|
||||||
// NOTE VERSI HARUS SAMA DENGAN PUBSPEC.YAML
|
// NOTE VERSI HARUS SAMA DENGAN PUBSPEC.YAML
|
||||||
static String version = "1.0.1";
|
static String version = "1.0.2";
|
||||||
|
|
||||||
// color theme
|
// color theme
|
||||||
static Color textTrueBlack = const Color(0xff000000);
|
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_distance_model.dart';
|
||||||
import 'package:absensi_sas/model/check_presensi_jam_model.dart';
|
import 'package:absensi_sas/model/check_presensi_jam_model.dart';
|
||||||
|
import '../model/rekap_kehadiran_home_screen_model.dart';
|
||||||
import 'base_repository.dart';
|
import 'base_repository.dart';
|
||||||
|
|
||||||
class PresensiRepository extends BaseRepository {
|
class PresensiRepository extends BaseRepository {
|
||||||
@@ -177,4 +178,49 @@ class PresensiRepository extends BaseRepository {
|
|||||||
);
|
);
|
||||||
return result;
|
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/app/constant.dart';
|
||||||
|
import 'package:absensi_sas/provider/current_rekap_kehadiran_home_provider.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:geocoding/geocoding.dart';
|
import 'package:geocoding/geocoding.dart';
|
||||||
@@ -19,6 +20,7 @@ import '../../widget/real_time.dart';
|
|||||||
import '../../widget/sankbar_widget.dart';
|
import '../../widget/sankbar_widget.dart';
|
||||||
import '../presensi/check_distance_provider.dart';
|
import '../presensi/check_distance_provider.dart';
|
||||||
import '../presensi/check_presensi_jam_provider.dart';
|
import '../presensi/check_presensi_jam_provider.dart';
|
||||||
|
import 'rekap_kehadiran_home_screen_provider.dart';
|
||||||
|
|
||||||
class HomeScreen extends HookConsumerWidget {
|
class HomeScreen extends HookConsumerWidget {
|
||||||
const HomeScreen({super.key});
|
const HomeScreen({super.key});
|
||||||
@@ -30,6 +32,9 @@ class HomeScreen extends HookConsumerWidget {
|
|||||||
final varCurrentDistanceProvider = ref.watch(currentCheckDistanceProvider);
|
final varCurrentDistanceProvider = ref.watch(currentCheckDistanceProvider);
|
||||||
final varCurrentCheckJamProvider =
|
final varCurrentCheckJamProvider =
|
||||||
ref.watch(currentCheckJamPresensiProvider);
|
ref.watch(currentCheckJamPresensiProvider);
|
||||||
|
|
||||||
|
final varCurrentRekapKehadiranProvider =
|
||||||
|
ref.watch(currentRekapKehadiranHomeProvider);
|
||||||
final positionLatitude = useState<String>("");
|
final positionLatitude = useState<String>("");
|
||||||
final positionLongitude = useState<String>("");
|
final positionLongitude = useState<String>("");
|
||||||
// GoogleSignInAccount? currentUserGoogle =
|
// GoogleSignInAccount? currentUserGoogle =
|
||||||
@@ -70,6 +75,16 @@ class HomeScreen extends HookConsumerWidget {
|
|||||||
selectedUser?.token ?? "",
|
selectedUser?.token ?? "",
|
||||||
inpVariablesCheckPresensiJam,
|
inpVariablesCheckPresensiJam,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// panggil rekap kehadiran home screen
|
||||||
|
ref
|
||||||
|
.read(rekapKehadiranHomeScreenProvider.notifier)
|
||||||
|
.rekapKehadiranHomeScreen(
|
||||||
|
selectedUser?.model.staffId ?? "",
|
||||||
|
selectedUser?.model.companyId ?? "",
|
||||||
|
selectedUser?.token ?? "",
|
||||||
|
inpVariablesCheckPresensiJam,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return () {};
|
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(
|
return Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
top: Constant.getActualYPhone(context: context, y: 30),
|
top: Constant.getActualYPhone(context: context, y: 30),
|
||||||
@@ -383,6 +412,16 @@ class HomeScreen extends HookConsumerWidget {
|
|||||||
selectedUser?.token ?? "",
|
selectedUser?.token ?? "",
|
||||||
inpVariablesCheckPresensiJam,
|
inpVariablesCheckPresensiJam,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// panggil rekap kehadiran home screen
|
||||||
|
ref
|
||||||
|
.read(rekapKehadiranHomeScreenProvider.notifier)
|
||||||
|
.rekapKehadiranHomeScreen(
|
||||||
|
selectedUser?.model.staffId ?? "",
|
||||||
|
selectedUser?.model.companyId ?? "",
|
||||||
|
selectedUser?.token ?? "",
|
||||||
|
inpVariablesCheckPresensiJam,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
@@ -693,12 +732,12 @@ class HomeScreen extends HookConsumerWidget {
|
|||||||
//Menu Rekap Presensi
|
//Menu Rekap Presensi
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
right:
|
right:
|
||||||
Constant.getActualXPhone(context: context, x: 27),
|
Constant.getActualXPhone(context: context, x: 27),
|
||||||
left:
|
left: Constant.getActualXPhone(context: context, x: 33),
|
||||||
Constant.getActualXPhone(context: context, x: 33),
|
bottom:
|
||||||
bottom: Constant.getActualYPhone(
|
Constant.getActualYPhone(context: context, y: 40),
|
||||||
context: context, y: 40)),
|
),
|
||||||
child: Container(
|
child: Container(
|
||||||
width:
|
width:
|
||||||
Constant.getActualXPhone(context: context, x: 330),
|
Constant.getActualXPhone(context: context, x: 330),
|
||||||
@@ -750,7 +789,8 @@ class HomeScreen extends HookConsumerWidget {
|
|||||||
CrossAxisAlignment.start,
|
CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'24 hari',
|
// '24 hari',
|
||||||
|
varCurrentRekapKehadiranProvider?.kehadiran ?? "",
|
||||||
style: Constant.subtitle_600_14(
|
style: Constant.subtitle_600_14(
|
||||||
context: context)
|
context: context)
|
||||||
.copyWith(
|
.copyWith(
|
||||||
@@ -802,7 +842,8 @@ class HomeScreen extends HookConsumerWidget {
|
|||||||
CrossAxisAlignment.start,
|
CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'2 hari',
|
// '2 hari',
|
||||||
|
varCurrentRekapKehadiranProvider?.tidakHadir ?? "",
|
||||||
style: Constant.subtitle_600_14(
|
style: Constant.subtitle_600_14(
|
||||||
context: context)
|
context: context)
|
||||||
.copyWith(
|
.copyWith(
|
||||||
@@ -854,7 +895,8 @@ class HomeScreen extends HookConsumerWidget {
|
|||||||
CrossAxisAlignment.start,
|
CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'5 hari',
|
// '5 hari',
|
||||||
|
varCurrentRekapKehadiranProvider?.lembur ?? "",
|
||||||
style: Constant.subtitle_600_14(
|
style: Constant.subtitle_600_14(
|
||||||
context: context)
|
context: context)
|
||||||
.copyWith(
|
.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
|
# 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
|
# 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.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.0.1
|
version: 1.0.2
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.6 <4.0.0'
|
sdk: '>=3.0.6 <4.0.0'
|
||||||
|
|||||||
Reference in New Issue
Block a user