Skip to content

Commit 896c220

Browse files
authored
Merge pull request #33 from ryanaidilp/5.0.3
add ability to check if attendance is being canceled 5.0.3
2 parents 6816bfd + ca99019 commit 896c220

File tree

6 files changed

+121
-59
lines changed

6 files changed

+121
-59
lines changed

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ android {
4848
applicationId "com.banuacoders.siap"
4949
minSdkVersion 24
5050
targetSdkVersion 30
51-
versionCode 45
52-
versionName '5.0.2'
51+
versionCode 46
52+
versionName '5.0.3'
5353
}
5454

5555
signingConfigs {

lib/repositories/data_repository.dart

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -309,17 +309,6 @@ class DataRepository {
309309
return result;
310310
}
311311

312-
Future<Map<String, dynamic>> getEmployeePresence(DateTime date) async {
313-
Map<String, dynamic> data;
314-
try {
315-
data =
316-
await apiService.getEndpointData(endpoint: Endpoint.presence, query: {
317-
'date': date.toString(),
318-
});
319-
} catch (e) {}
320-
return data;
321-
}
322-
323312
Future<Response> cancelAttendance(Map<String, dynamic> data) async {
324313
Response response;
325314
try {

lib/screen/employee_attendance_screen.dart

Lines changed: 97 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import 'dart:convert';
2-
31
import 'package:flare_flutter/flare_actor.dart';
42
import 'package:flutter/cupertino.dart';
53
import 'package:flutter/material.dart';
4+
import 'package:flutter_spinkit/flutter_spinkit.dart';
65
import 'package:get/get.dart';
6+
import 'package:provider/provider.dart';
77
import 'package:search_page/search_page.dart';
8-
import 'package:shared_preferences/shared_preferences.dart';
98
import 'package:spo_balaesang/models/employee.dart';
109
import 'package:spo_balaesang/models/user.dart';
10+
import 'package:spo_balaesang/repositories/data_repository.dart';
1111
import 'package:spo_balaesang/screen/report_screen.dart';
1212
import 'package:spo_balaesang/utils/app_const.dart';
1313

@@ -19,25 +19,30 @@ class EmployeeAttendanceScreen extends StatefulWidget {
1919

2020
class _EmployeeAttendanceScreenState extends State<EmployeeAttendanceScreen> {
2121
List<Employee> _employees;
22+
bool _isLoading = false;
2223

2324
@override
2425
void setState(void Function() fn) {
2526
if (mounted) super.setState(fn);
2627
}
2728

29+
void _setLoading(bool isLoading) {
30+
setState(() {
31+
_isLoading = isLoading;
32+
});
33+
}
34+
2835
Future<void> loadData() async {
29-
final sp = await SharedPreferences.getInstance();
30-
do {
31-
final _dataEmployees = sp.get(prefsEmployeeKey);
32-
final List<dynamic> _jsonEmployees =
33-
jsonDecode(_dataEmployees.toString()) as List<dynamic>;
36+
try {
37+
_setLoading(true);
38+
final dataRepo = Provider.of<DataRepository>(context, listen: false);
39+
final List<Employee> _jsonEmployees = await dataRepo.getAllEmployee();
3440
setState(() {
35-
_employees = _jsonEmployees
36-
.map((employee) =>
37-
Employee.fromJson(employee as Map<String, dynamic>))
38-
.toList();
41+
_employees = _jsonEmployees;
3942
});
40-
} while (_employees.isEmpty);
43+
} catch (e) {} finally {
44+
_setLoading(false);
45+
}
4146
}
4247

4348
@override
@@ -177,6 +182,83 @@ class _EmployeeAttendanceScreenState extends State<EmployeeAttendanceScreen> {
177182
);
178183
}
179184

185+
Widget _buildContent() {
186+
if (_isLoading) {
187+
return const SizedBox(
188+
child: Center(
189+
child: SpinKitCircle(
190+
size: 45,
191+
color: Colors.blueAccent,
192+
)),
193+
);
194+
}
195+
196+
if (_employees == null || _employees.isEmpty) {
197+
return SizedBox(
198+
child: Center(
199+
child: Column(
200+
mainAxisAlignment: MainAxisAlignment.center,
201+
children: <Widget>[
202+
SizedBox(
203+
width: Get.width * 0.5,
204+
height: Get.height * 0.3,
205+
child: const FlareActor(
206+
'assets/flare/failure.flr',
207+
animation: 'failure',
208+
),
209+
),
210+
const Text('Gagal memuat data pegawai!'),
211+
sizedBoxH20,
212+
ElevatedButton(
213+
style: ElevatedButton.styleFrom(
214+
shape: RoundedRectangleBorder(
215+
borderRadius: BorderRadius.circular(6)),
216+
primary: Colors.blueAccent,
217+
onPrimary: Colors.white),
218+
onPressed: loadData,
219+
child: const Text('Coba Lagi'),
220+
)
221+
]),
222+
),
223+
);
224+
}
225+
226+
return ListView.builder(
227+
itemBuilder: (context, index) => _buildEmployeeCard(_employees[index]),
228+
itemCount: _employees?.length ?? 0,
229+
);
230+
}
231+
232+
Future<Employee> _onSearchButtonPressed() async {
233+
if (_employees == null || _employees.isEmpty) {
234+
return null;
235+
}
236+
237+
return showSearch(
238+
context: context,
239+
delegate: SearchPage(
240+
searchLabel: 'Cari Pegawai',
241+
barTheme: ThemeData(
242+
appBarTheme: const AppBarTheme(
243+
brightness: Brightness.dark,
244+
color: Colors.blueAccent,
245+
),
246+
),
247+
showItemsOnEmpty: true,
248+
failure: _buildEmptyWidget(),
249+
builder: (Employee employee) => Padding(
250+
padding: const EdgeInsets.symmetric(horizontal: 8.0),
251+
child: _buildEmployeeCard(employee),
252+
),
253+
filter: (Employee employee) => [
254+
employee.name,
255+
employee.status,
256+
employee.nip,
257+
employee.department
258+
],
259+
items: _employees));
260+
}
261+
180262
@override
181263
Widget build(BuildContext context) {
182264
return Scaffold(
@@ -185,40 +267,13 @@ class _EmployeeAttendanceScreenState extends State<EmployeeAttendanceScreen> {
185267
title: const Text('Presensi Pegawai'),
186268
actions: <Widget>[
187269
IconButton(
188-
onPressed: () => showSearch(
189-
context: context,
190-
delegate: SearchPage(
191-
searchLabel: 'Cari Pegawai',
192-
barTheme: ThemeData(
193-
appBarTheme: const AppBarTheme(
194-
brightness: Brightness.dark,
195-
color: Colors.blueAccent,
196-
),
197-
),
198-
showItemsOnEmpty: true,
199-
failure: _buildEmptyWidget(),
200-
builder: (Employee employee) => Padding(
201-
padding:
202-
const EdgeInsets.symmetric(horizontal: 8.0),
203-
child: _buildEmployeeCard(employee),
204-
),
205-
filter: (Employee employee) => [
206-
employee.name,
207-
employee.status,
208-
employee.nip,
209-
employee.department
210-
],
211-
items: _employees)),
270+
onPressed: _onSearchButtonPressed,
212271
icon: const Icon(Icons.search_rounded))
213272
],
214273
),
215274
body: Padding(
216275
padding: const EdgeInsets.only(bottom: 8, left: 8, right: 8),
217-
child: ListView.builder(
218-
itemBuilder: (context, index) =>
219-
_buildEmployeeCard(_employees[index]),
220-
itemCount: _employees?.length ?? 0,
221-
),
276+
child: _buildContent(),
222277
),
223278
);
224279
}

lib/screen/login_screen.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ class _LoginScreenState extends State<LoginScreen> {
298298
mainAxisAlignment: MainAxisAlignment.center,
299299
children: const <Widget>[
300300
Text(
301-
'v5.0.2',
301+
'v5.0.3',
302302
style: TextStyle(
303303
color: Colors.grey,
304304
fontSize: 12.0,

lib/screen/splash_screen.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ class _SplashScreenState extends State<SplashScreen> {
198198
color: Colors.white,
199199
fontWeight: FontWeight.w700)),
200200
SizedBox(width: 2.0),
201-
Text('v5.0.2', style: TextStyle(color: Colors.white)),
201+
Text('v5.0.3', style: TextStyle(color: Colors.white)),
202202
Spacer()
203203
],
204204
),

lib/widgets/employee_presence_card_widget.dart

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,24 @@ class EmployeePresenceCardWidget extends StatelessWidget {
8989
);
9090
}
9191

92+
String checkAddressLabel() {
93+
if (int.parse(point.substring(0, point.length - 1)) == 0 &&
94+
address.isNotEmpty) {
95+
return 'Alasan Pembatalan';
96+
}
97+
98+
return 'Lokasi';
99+
}
100+
101+
IconData checkAddressIcon() {
102+
if (int.parse(point.substring(0, point.length - 1)) == 0 &&
103+
address.isNotEmpty) {
104+
return Icons.notes_rounded;
105+
}
106+
107+
return Icons.location_on_rounded;
108+
}
109+
92110
@override
93111
Widget build(BuildContext context) {
94112
return Container(
@@ -156,12 +174,12 @@ class EmployeePresenceCardWidget extends StatelessWidget {
156174
Row(
157175
children: <Widget>[
158176
Icon(
159-
Icons.location_on,
177+
checkAddressIcon(),
160178
color: Colors.grey[600],
161179
size: 20.0,
162180
),
163181
sizedBoxW4,
164-
Text('Lokasi', style: labelTextStyle)
182+
Text(checkAddressLabel(), style: labelTextStyle)
165183
],
166184
),
167185
sizedBoxH4,

0 commit comments

Comments
 (0)