revisi + request v 1.01 -> 1.02

This commit is contained in:
Sas Andy
2024-12-23 08:17:16 +07:00
parent e3073d9823
commit c0e21811c0
13 changed files with 387 additions and 10 deletions

View File

@@ -14,7 +14,9 @@ class Constant {
static String tokenName = "oneMitraPramita";
static double designHeight = 1024;
static double designWidth = 1440;
static String version = "Versi 1.01";
static String version = "Versi 1.02";
static String build = "Build 13-12-2024";
// flutter build web --base-href "/mitra/"
static String ipAddress = "";

View File

@@ -8,8 +8,8 @@ import 'package:mitra_corporate/screen/splash_screen.dart/splash_screen.dart';
import 'app/constant.dart';
import 'app/route.dart';
import 'app/register_webview_rtub.dart'
if (dart.library.html) 'app/register_webview.dart';
// import 'app/register_webview_rtub.dart'
// if (dart.library.html) 'app/register_webview.dart';
void main() {
// runApp(const MyApp());

View File

@@ -1,3 +1,5 @@
import 'package:mitra_corporate/model/user_mou_model.dart';
class OrderModel {
String? orderId;
String? orderNumber;
@@ -30,6 +32,7 @@ class OrderModel {
List<String>? tests;
List<String>? paket;
List<String>? paketDetail;
UserMouModel? mou;
OrderModel(
{this.orderId,
@@ -62,6 +65,7 @@ class OrderModel {
this.lokasi,
this.pekerjaan,
this.isQr,
this.mou,
this.bahan});
OrderModel.fromJson(Map<String, dynamic> json) {
@@ -89,6 +93,7 @@ class OrderModel {
lokasi = json['lokasi'];
pekerjaan = json['pekerjaan'];
isQr = json['is_qr'];
mou = UserMouModel.fromJson(json['mou']);
// sample = json['sample'].cast<String>();
// bahan = json['bahan'].cast<String>();
// tests = json['tests'].cast<String>();
@@ -185,6 +190,7 @@ class OrderModel {
data['pekerjaan'] = pekerjaan;
data['noRM'] = noRM;
data['is_qr'] = isQr;
data['mou'] = mou;
return data;
}
}

View File

@@ -8,6 +8,7 @@ class RegistrationModel {
List<Tests>? tests;
List<Specimens>? specimens;
List<Bahan>? bahan;
String? userMouID;
String? total;
String? token;
@@ -17,6 +18,7 @@ class RegistrationModel {
this.specimens,
this.total,
this.bahan,
this.userMouID,
this.patientId,
this.paket,
this.orderID,
@@ -54,6 +56,7 @@ class RegistrationModel {
patientId = json['patient_id'];
token = json['token'];
userMouID = json['userMouID'];
orderID = json['orderID'];
}
@@ -77,7 +80,7 @@ class RegistrationModel {
data['total'] = total;
data['patient_id'] = patientId;
data['token'] = token;
data['userMouID'] = userMouID;
data['orderID'] = orderID;
return data;
}

View File

@@ -0,0 +1,28 @@
class UserMouModel {
String? userMouID;
String? userMouMouID;
String? userMouName;
String? userMouIsDefault;
UserMouModel(
{this.userMouID,
this.userMouName,
this.userMouIsDefault,
this.userMouMouID});
UserMouModel.fromJson(Map<String, dynamic> json) {
userMouID = json['userMouID'];
userMouName = json['userMouName'];
userMouIsDefault = json['userMouIsDefault'];
userMouMouID = json['userMouMouID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userMouID'] = this.userMouID;
data['userMouName'] = this.userMouName;
data['userMouIsDefault'] = this.userMouIsDefault;
data['userMouMouID'] = this.userMouMouID;
return data;
}
}

View File

@@ -1,6 +1,7 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/model/test_model.dart';
import 'package:mitra_corporate/model/user_mou_model.dart';
// menerima perubahan value dari onTap simpan perubahan
final registrasiProvider = StateProvider<int>((ref) => 0);
@@ -17,6 +18,9 @@ final registrationDataProvider =
final tempTestListProvider = StateProvider<List<TestModel>>(
(ref) => List.empty(),
);
final selectedMouProvider = StateProvider<UserMouModel>(
(ref) => UserMouModel(),
);
final orderNumberProvider = StateProvider<String>((ref) => "");
final dialogOrderActionProvider = StateProvider<String>((ref) => "new");

View File

@@ -1,6 +1,7 @@
import 'package:mitra_corporate/model/registration_filter_model.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/model/test_model.dart';
import 'package:mitra_corporate/model/user_mou_model.dart';
import '../app/constant.dart';
import 'base_repository.dart';
@@ -31,6 +32,29 @@ class RegistrationRepository extends BaseRepository {
return data;
}
Future<List<UserMouModel>> getUserMou({
required String userID,
required String token,
}) async {
var param = {"userID": userID, "token": token};
// print(param);
final url = "${Constant.baseUrl}fpp/getMou";
final resp = await post(param: param, service: url);
List<UserMouModel> data;
// print(resp['data']);
if (resp['status'] == 'OK') {
data = [];
resp['data'].forEach((e) {
final model = UserMouModel.fromJson(e);
data.add(model);
});
} else {
data = [];
}
return data;
}
Future<RegistrationFilterModel> getFilter({
required String token,
}) async {

View File

@@ -4,14 +4,17 @@ import 'dart:ui';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:mitra_corporate/model/auth_model.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/model/test_model.dart';
import 'package:mitra_corporate/model/user_mou_model.dart';
import 'package:mitra_corporate/provider/auth_provider.dart';
import 'package:mitra_corporate/provider/order_provider.dart';
import 'package:mitra_corporate/screen/registrasi/registrasi_prvider.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:mitra_corporate/screen/registrasi/user_mou_provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import '../../app/constant.dart';
@@ -29,6 +32,7 @@ class FormEditPemeriksaan extends HookConsumerWidget {
final selectedtest = ref.watch(selectedTestEditProvider);
final selectedPacket = ref.watch(selectedPacketEditProvider);
final selectedPacketOld = ref.watch(currentPacketProvider);
final selectedMou = ref.watch(selectedMouProvider);
// inisialisasi baca provider idTipePeriksaStateProvider
final selectedTab = ref.watch(idTipePeriksaStateProvider);
final AuthModel auth = ref.watch(authProvider) ?? AuthModel();
@@ -37,17 +41,31 @@ class FormEditPemeriksaan extends HookConsumerWidget {
final searchCtr = useTextEditingController(text: "");
final scrollCtr = useScrollController();
final ctr = useState(AutoScrollController());
final listUserMou = useState<List<UserMouModel>>(List.empty());
final userMouCtr = useTextEditingController(text: "");
//get pemeriksaan from api
getPemeriksaan() {
getPemeriksaan(String mouID) {
ref
.read(GetFPPProvider.notifier)
.getData(mouID: auth.mUserMMouID ?? "0", token: auth.token ?? "0");
.getData(mouID: mouID, token: auth.token ?? "0");
}
//get pemeriksaan from api
getUserMou() {
ref
.read(GetUserMouProvider.notifier)
.getData(userID: auth.mUserID ?? "0", token: auth.token ?? "0");
}
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
getPemeriksaan();
// getPemeriksaan();
getUserMou();
if (selectedMou.userMouID != "0" && selectedMou.userMouID != null) {
getPemeriksaan(selectedMou.userMouMouID ?? "0");
userMouCtr.text = selectedMou.userMouName ?? "";
}
});
return () {};
}, []);
@@ -87,6 +105,29 @@ class FormEditPemeriksaan extends HookConsumerWidget {
},
);
ref.listen(
GetUserMouProvider,
(pref, next) {
if (next is GetUserMouStateInit) {
testLoading.value = true;
} else if (next is GetUserMouStateLoading) {
testLoading.value = true;
} else if (next is GetUserMouStateError) {
testLoading.value = false;
print(next.message);
SanckbarWidget(context, next.message, snackbarType.error);
Constant.autoLogout(context: context, msg: next.message);
} else if (next is GetUserMouStateDone) {
listUserMou.value = next.model;
// ref.read(tempTestListProvider.notifier).state = next.model;
print(listUserMou.value);
// tabController.length
testLoading.value = false;
}
},
);
// searchCtr.addListener(() {
// listTest.value.firstWhere((element) => element.items)
// },);
@@ -96,6 +137,63 @@ class FormEditPemeriksaan extends HookConsumerWidget {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: Constant.getActualX(context: context, x: 500),
child: TypeAheadField(
builder: (context, controller, focusNode) {
return TextField(
controller: controller,
focusNode: focusNode,
enabled: !testLoading.value,
// autofocus: true,
decoration: InputDecoration(
hintStyle: Constant.body2_400(context: context),
labelStyle: Constant.body2_400(context: context),
fillColor: Constant.primaryBlue,
labelText: 'Pilih Agreement',
// isCollapsed: true,
hintText: 'Pilih Agreement',
border: OutlineInputBorder(
borderSide: BorderSide(color: Constant.primaryBlue),
borderRadius: BorderRadius.circular(8),
)));
},
controller: userMouCtr,
suggestionsCallback: (pattern) async {
return listUserMou.value
.where(
(element) => element.userMouName!
.toLowerCase()
.contains(pattern.toLowerCase()),
)
.toList();
},
itemBuilder: (BuildContext context, UserMouModel value) {
return ListTile(
title: Text(value.userMouName ?? ""),
);
},
onSelected: (UserMouModel value) {
print(selectedtest);
print(selectedPacket);
// if (selectedtest.isNotEmpty || selectedPacket.isNotEmpty) {
// SanckbarWidget(
// context,
// "test dan paket yang sudah dipilih telah di reset",
// snackbarType.warning);
// }
ref.read(selectedTestEditProvider.notifier).state = List.empty();
ref.read(selectedPacketEditProvider.notifier).state =
List.empty();
ref.read(selectedMouProvider.notifier).state = value;
userMouCtr.text = value.userMouName ?? "";
getPemeriksaan(value.userMouMouID ?? "0");
},
),
),
SizedBox(height: Constant.getActualY(context: context, y: 12)),
SizedBox(
width: Constant.getActualX(context: context, x: 500),
// height: Constant.getActualY(context: context, y: 56),

View File

@@ -8,6 +8,7 @@ import 'package:intl/intl.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/model/test_model.dart';
import 'package:mitra_corporate/model/user_mou_model.dart';
import 'package:mitra_corporate/provider/auth_provider.dart';
import 'package:mitra_corporate/provider/order_provider.dart';
import 'package:mitra_corporate/provider/registrasi_provider.dart';
@@ -31,6 +32,7 @@ class DetailEdit extends HookConsumerWidget {
final testListAll = ref.read(tempTestListProvider);
final selectedTest = ref.read(selectedTestEditProvider);
final dialogAction = ref.watch(dialogOrderActionProvider);
final selectedMou = ref.watch(selectedMouProvider);
final testList = useState<List<Items>>(List.empty());
final testScrollCtr = useScrollController();
@@ -446,6 +448,7 @@ class DetailEdit extends HookConsumerWidget {
}
editOrder() {
tempRegistrationData.userMouID = selectedMou.userMouMouID;
print(jsonEncode(tempRegistrationData));
// tempRegistrationData.tests!.forEach((element) {
// if (element.date == null || element.date!.isEmpty) {
@@ -497,6 +500,7 @@ class DetailEdit extends HookConsumerWidget {
ref.read(currentPacketProvider.notifier).state =
List.empty(growable: true);
ref.read(selectedPacketEditProvider.notifier).state = List.empty();
ref.read(selectedMouProvider.notifier).state = UserMouModel();
}
},
);
@@ -507,7 +511,13 @@ class DetailEdit extends HookConsumerWidget {
// height: MediaQuery.of(context).size.height,
color: Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Agreement : ${selectedMou.userMouName}",
style: Constant.h4_600(context: context),
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
Row(
children: [
SizedBox(

View File

@@ -6,6 +6,7 @@ import 'package:intl/intl.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/model/search_order_model.dart';
import 'package:mitra_corporate/model/test_model.dart';
import 'package:mitra_corporate/model/user_mou_model.dart';
import 'package:mitra_corporate/provider/order_provider.dart';
import 'package:mitra_corporate/screen/order/cancel_order_provider.dart';
import 'package:mitra_corporate/screen/order/dialog_cancel_order.dart';
@@ -872,6 +873,7 @@ class OrderScreen extends HookConsumerWidget {
pekerjaan: e.value.pekerjaan,
));
ref.read(EditDataProvider.notifier).state = a;
ref.read(selectedMouProvider.notifier).state = e.value.mou ?? UserMouModel();
showDialog(context: context, barrierDismissible: false, builder: ((context) => DialogEdit())).then((value) => refresh());
},
icon: Icon(

View File

@@ -8,6 +8,7 @@ import 'package:jiffy/jiffy.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/model/test_model.dart';
import 'package:mitra_corporate/model/user_mou_model.dart';
import 'package:mitra_corporate/provider/auth_provider.dart';
import 'package:mitra_corporate/provider/registrasi_provider.dart';
import 'package:mitra_corporate/screen/registrasi/get_specimen_provider.dart';
@@ -27,6 +28,7 @@ class DetailOrder extends HookConsumerWidget {
final tempRegistrationData = ref.watch(registrationDataProvider);
final testListAll = ref.read(tempTestListProvider);
final selectedTest = ref.read(selectedTestProvider);
final selectedMou = ref.read(selectedMouProvider);
final dialogAction = ref.watch(dialogOrderActionProvider);
final testList = useState<List<Items>>(List.empty());
@@ -423,6 +425,7 @@ class DetailOrder extends HookConsumerWidget {
}
addOrder() {
tempRegistrationData.userMouID = selectedMou.userMouMouID;
print(jsonEncode(tempRegistrationData));
for (var element in tempRegistrationData.tests!) {
if (element.date == null || element.date!.isEmpty) {
@@ -471,6 +474,7 @@ class DetailOrder extends HookConsumerWidget {
ref.read(registrasiProvider.state).update((state) => 3);
print(jsonEncode(tempRegistrationData));
ref.read(selectedMouProvider.notifier).state = UserMouModel();
}
},
);
@@ -481,7 +485,13 @@ class DetailOrder extends HookConsumerWidget {
// height: MediaQuery.of(context).size.height,
color: Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Agreement : ${selectedMou.userMouName}",
style: Constant.h4_600(context: context),
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
Row(
children: [
SizedBox(

View File

@@ -1,16 +1,20 @@
import 'dart:ui';
import 'package:dio/dio.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:intl/intl.dart';
import 'package:mitra_corporate/model/auth_model.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/model/test_model.dart';
import 'package:mitra_corporate/model/user_mou_model.dart';
import 'package:mitra_corporate/provider/auth_provider.dart';
import 'package:mitra_corporate/screen/registrasi/registrasi_prvider.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:mitra_corporate/screen/registrasi/user_mou_provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import '../../app/constant.dart';
@@ -48,25 +52,40 @@ class FormPemeriksaan extends HookConsumerWidget {
final tempRegistrationData = ref.watch(registrationDataProvider);
final selectedtest = ref.watch(selectedTestProvider);
final selectedPacket = ref.watch(selectedPacketProvider);
final selectedMou = ref.watch(selectedMouProvider);
// inisialisasi baca provider idTipePeriksaStateProvider
final selectedTab = ref.watch(idTipePeriksaStateProvider);
final AuthModel auth = ref.watch(authProvider) ?? AuthModel();
final listTest = useState<List<TestModel>>(List.empty());
final listUserMou = useState<List<UserMouModel>>(List.empty());
final userMouCtr = useTextEditingController(text: "");
final testLoading = useState(false);
final searchCtr = useTextEditingController(text: "");
final scrollCtr = useScrollController();
final ctr = useState(AutoScrollController());
//get pemeriksaan from api
getPemeriksaan() {
getPemeriksaan(String mouID) {
ref
.read(GetFPPProvider.notifier)
.getData(mouID: auth.mUserMMouID ?? "0", token: auth.token ?? "0");
.getData(mouID: mouID, token: auth.token ?? "0");
}
//get pemeriksaan from api
getUserMou() {
ref
.read(GetUserMouProvider.notifier)
.getData(userID: auth.mUserID ?? "0", token: auth.token ?? "0");
}
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
getPemeriksaan();
getUserMou();
if (selectedMou.userMouID != "0" && selectedMou.userMouID != null) {
getPemeriksaan(selectedMou.userMouMouID ?? "0");
userMouCtr.text = selectedMou.userMouName ?? "";
}
});
return () {};
}, []);
@@ -117,6 +136,29 @@ class FormPemeriksaan extends HookConsumerWidget {
}
},
);
ref.listen(
GetUserMouProvider,
(pref, next) {
if (next is GetUserMouStateInit) {
testLoading.value = true;
} else if (next is GetUserMouStateLoading) {
testLoading.value = true;
} else if (next is GetUserMouStateError) {
testLoading.value = false;
print(next.message);
SanckbarWidget(context, next.message, snackbarType.error);
Constant.autoLogout(context: context, msg: next.message);
} else if (next is GetUserMouStateDone) {
listUserMou.value = next.model;
// ref.read(tempTestListProvider.notifier).state = next.model;
print(listUserMou.value);
// tabController.length
testLoading.value = false;
}
},
);
// searchCtr.addListener(() {
// listTest.value.firstWhere((element) => element.items)
@@ -127,6 +169,88 @@ class FormPemeriksaan extends HookConsumerWidget {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: Constant.getActualX(context: context, x: 500),
// height: Constant.getActualY(context: context, y: 56),
// child: Autocomplete<UserMouModel>(
// optionsViewBuilder: (context, onSelected, options) {
// return ListView.builder(
// itemCount: options.length,
// itemBuilder: (context, index) {
// return Text(options.elementAt(index).userMouName ?? "");
// },
// );
// },
// optionsBuilder: (TextEditingValue textEditingValue) {
// if (textEditingValue.text == '') {
// return const Iterable<UserMouModel>.empty();
// }
// return listUserMou.value.where((UserMouModel option) {
// return option.userMouName!
// .toLowerCase()
// .contains(textEditingValue.text.toLowerCase());
// });
// },
// displayStringForOption: (option) => option.userMouName ?? "",
// onSelected: (UserMouModel option) {
// selectedUserMou.value = option;
// },
// ),
child: TypeAheadField(
builder: (context, controller, focusNode) {
return TextField(
controller: controller,
focusNode: focusNode,
enabled: !testLoading.value,
// autofocus: true,
decoration: InputDecoration(
hintStyle: Constant.body2_400(context: context),
labelStyle: Constant.body2_400(context: context),
fillColor: Constant.primaryBlue,
labelText: 'Pilih Agreement',
// isCollapsed: true,
hintText: 'Pilih Agreement',
border: OutlineInputBorder(
borderSide: BorderSide(color: Constant.primaryBlue),
borderRadius: BorderRadius.circular(8),
)));
},
controller: userMouCtr,
suggestionsCallback: (pattern) async {
return listUserMou.value
.where(
(element) => element.userMouName!
.toLowerCase()
.contains(pattern.toLowerCase()),
)
.toList();
},
itemBuilder: (BuildContext context, UserMouModel value) {
return ListTile(
title: Text(value.userMouName ?? ""),
);
},
onSelected: (UserMouModel value) {
print(selectedtest);
print(selectedPacket);
// if (selectedtest.isNotEmpty || selectedPacket.isNotEmpty) {
// SanckbarWidget(
// context,
// "test dan paket yang sudah dipilih telah di reset",
// snackbarType.warning);
// }
ref.read(selectedTestProvider.notifier).state = List.empty();
ref.read(selectedPacketProvider.notifier).state = List.empty();
ref.read(selectedMouProvider.notifier).state = value;
userMouCtr.text = value.userMouName ?? "";
getPemeriksaan(value.userMouMouID ?? "0");
},
),
),
SizedBox(height: Constant.getActualY(context: context, y: 12)),
SizedBox(
width: Constant.getActualX(context: context, x: 500),
// height: Constant.getActualY(context: context, y: 56),

View File

@@ -0,0 +1,66 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mitra_corporate/model/test_model.dart';
import 'package:mitra_corporate/model/user_mou_model.dart';
import 'package:mitra_corporate/repository/registration_repository.dart';
import '../../provider/dio_provider.dart';
import '../../repository/base_repository.dart';
abstract class GetUserMouState extends Equatable {
final DateTime date;
const GetUserMouState(this.date);
@override
List<Object?> get props => [date];
}
class GetUserMouStateInit extends GetUserMouState {
GetUserMouStateInit() : super(DateTime.now());
}
class GetUserMouStateLoading extends GetUserMouState {
GetUserMouStateLoading() : super(DateTime.now());
}
class GetUserMouStateError extends GetUserMouState {
final String message;
GetUserMouStateError({
required this.message,
}) : super(DateTime.now());
}
class GetUserMouStateDone extends GetUserMouState {
final List<UserMouModel> model;
GetUserMouStateDone({
required this.model,
}) : super(DateTime.now());
}
//notifier
class GetUserMouNotifier extends StateNotifier<GetUserMouState> {
final Ref ref;
GetUserMouNotifier({
required this.ref,
}) : super(GetUserMouStateInit());
void getData({required String userID, required String token}) async {
try {
state = GetUserMouStateLoading();
final dio = ref.read(dioProvider);
final resp = await RegistrationRepository(dio: dio)
.getUserMou(userID: userID, token: token);
state = GetUserMouStateDone(model: resp);
} catch (e) {
if (e is BaseRepositoryException) {
state = GetUserMouStateError(message: e.message.toString());
} else {
state = GetUserMouStateError(message: e.toString());
}
}
}
}
//provider
final GetUserMouProvider =
StateNotifierProvider<GetUserMouNotifier, GetUserMouState>(
(ref) => GetUserMouNotifier(ref: ref));