first commit

This commit is contained in:
Sas Andy
2024-10-01 09:37:38 +07:00
commit e3073d9823
268 changed files with 26689 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mitra_corporate/repository/order_repository.dart';
import '../../provider/dio_provider.dart';
import '../../repository/base_repository.dart';
abstract class CancelOrderState extends Equatable {
final DateTime date;
const CancelOrderState(this.date);
@override
List<Object?> get props => [date];
}
class CancelOrderStateInit extends CancelOrderState {
CancelOrderStateInit() : super(DateTime.now());
}
class CancelOrderStateLoading extends CancelOrderState {
CancelOrderStateLoading() : super(DateTime.now());
}
class CancelOrderStateError extends CancelOrderState {
final String message;
CancelOrderStateError({
required this.message,
}) : super(DateTime.now());
}
class CancelOrderStateDone extends CancelOrderState {
final String number;
CancelOrderStateDone({
required this.number,
}) : super(DateTime.now());
}
//notifier
class CancelOrderNotifier extends StateNotifier<CancelOrderState> {
final Ref ref;
CancelOrderNotifier({
required this.ref,
}) : super(CancelOrderStateInit());
void cancel({required String token, required String orderID}) async {
try {
state = CancelOrderStateLoading();
final dio = ref.read(dioProvider);
final resp = await OrderRepository(dio: dio)
.cancelOrder(token: token, orderID: orderID);
state = CancelOrderStateDone(number: resp);
} catch (e) {
if (e is BaseRepositoryException) {
state = CancelOrderStateError(message: e.message.toString());
} else {
state = CancelOrderStateError(message: e.toString());
}
}
}
}
//provider
final CancelOrderProvider =
StateNotifierProvider<CancelOrderNotifier, CancelOrderState>(
(ref) => CancelOrderNotifier(ref: ref));

View File

@@ -0,0 +1,154 @@
import 'package:flutter/material.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
import '../../app/constant.dart';
class DialogCancelOrder extends StatelessWidget {
const DialogCancelOrder(
{super.key,
required this.orderNumber,
required this.cancel,
required this.orderID,
required this.loading,
required this.name});
final String name;
final String orderNumber;
final Function cancel;
final String orderID;
final bool loading;
@override
Widget build(BuildContext context) {
return AlertDialog(
titlePadding: EdgeInsets.symmetric(
horizontal: Constant.getActualX(context: context, x: 24),
vertical: Constant.getActualY(context: context, y: 24)),
actionsPadding: EdgeInsets.symmetric(
horizontal: Constant.getActualX(context: context, x: 24),
vertical: Constant.getActualY(context: context, y: 24)),
contentPadding: EdgeInsets.symmetric(
horizontal: Constant.getActualX(context: context, x: 24),
vertical: Constant.getActualY(context: context, y: 24)),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
title: Text(
'Konfirmasi Pembatalan',
style: Constant.h4_600(context: context),
),
content: Container(
constraints: BoxConstraints(
minHeight: Constant.getActualY(context: context, y: 100),
maxHeight: Constant.getActualY(context: context, y: 362),
),
height: Constant.getActualY(context: context, y: 240),
child: Column(
children: [
Text(
'Anda yakin membatalkan order berikut ?',
style: Constant.body1_600(context: context),
),
SizedBox(
height: Constant.getActualY(context: context, y: 24),
),
SizedBox(
width: Constant.getActualX(context: context, x: 416),
child: Card(
color: Colors.white,
elevation: 1,
shape: RoundedRectangleBorder(
side: BorderSide(color: Constant.grey_200),
borderRadius: BorderRadius.circular(12)),
child: Container(
padding: EdgeInsets.symmetric(
horizontal:
Constant.getActualX(context: context, x: 24),
vertical:
Constant.getActualY(context: context, y: 24)),
child: Column(
children: [
Row(
children: [
Expanded(
flex: 5,
child: Text(
"Nomor Reg",
style: Constant.body3_600(context: context)
.copyWith(color: Constant.textGrey),
),
),
Expanded(
flex: 7,
child: Text(
orderNumber,
style: Constant.body3_600(context: context)
.copyWith(color: Constant.textBlack),
),
)
],
),
SizedBox(
height:
Constant.getActualY(context: context, y: 12),
),
Row(
children: [
Expanded(
flex: 5,
child: Text(
"Nama",
style: Constant.body3_600(context: context)
.copyWith(color: Constant.textGrey),
),
),
Expanded(
flex: 7,
child: Text(
name,
style: Constant.body3_600(context: context)
.copyWith(color: Constant.textBlack),
),
)
],
),
],
)),
),
)
],
)),
actions: <Widget>[
OutlinedButton(
style: OutlinedButton.styleFrom(
surfaceTintColor: Constant.primaryBlue,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8))),
onPressed: !loading ? () => Navigator.pop(context, 'Batal') : null,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: loading
? LoadingAnimationWidget.staggeredDotsWave(
color: Constant.primaryBlue, size: 20)
: Text('Batal',
style: Constant.button_medium(context: context)
.copyWith(color: Constant.textBlack)),
),
),
ElevatedButton(
onPressed: !loading ? () => cancel(orderID) : null,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: loading
? LoadingAnimationWidget.staggeredDotsWave(
color: Colors.white, size: 20)
: Text(
'Yakin',
style: Constant.button_medium(context: context)
.copyWith(color: Colors.white),
),
),
),
],
);
}
}

View File

@@ -0,0 +1,141 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:mitra_corporate/app/constant.dart';
import 'package:mitra_corporate/provider/order_provider.dart';
import 'package:mitra_corporate/screen/order/edit_pemeriksaan.dart';
import 'package:mitra_corporate/screen/order/form_detail_edit.dart';
import 'package:mitra_corporate/screen/registrasi/registrasi_sukses.dart';
import 'package:mitra_corporate/widgets/stepper_edit.dart';
import 'form_edit_data_pasien.dart';
class DialogEdit extends HookConsumerWidget {
const DialogEdit({super.key});
// const DialogDataPasien({
// Key? key,
// }) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
final editStep = ref.watch(EditStepProvider);
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 40),
child: SimpleDialog(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(12))),
contentPadding: const EdgeInsets.all(40.0),
children: [
Column(children: [
(editStep == 3)
? Text('')
: SizedBox(
width: Constant.getActualX(context: context, x: 1080),
height: Constant.getActualY(context: context, y: 62),
child: Text('Edit Order',
style: Constant.h2_600(context: context)
.copyWith(color: Constant.textBlack)),
),
SizedBox(height: Constant.getActualY(context: context, y: 40)),
//Stepper
(editStep == 3)
? Text('')
: SizedBox(
width: Constant.getActualX(context: context, x: 1080),
height: Constant.getActualY(context: context, y: 100),
child: StepperEdit()),
SizedBox(
height: Constant.getActualY(context: context, y: 40),
),
// membaca perubahan value dari registrasi_provider.dart
(editStep == 0)
? FormEditDatapasien()
: (editStep == 1)
? FormEditPemeriksaan()
: (editStep == 2)
? DetailEdit()
: (editStep == 3)
? RegistrasiSukses()
: Text('Tidak ada view'),
// if(editStep == 1){
// FormDataPasien()
// } else{
// if(editStep == 2){
// Text('2')
// }else{
// Text('3')
// }
// }
//
// SizedBox(height: Constant.getActualY(context: context, y: 24)),
// Container(
// // height: Constant.getActualY(context: context, y: 100),
// // color: Colors.red,
// padding: const EdgeInsets.only(left: 32, right: 32),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.end,
// children: [
// (editStep == 4)
// ? Text('')
// : OutlinedButton(
// style: OutlinedButton.styleFrom(
// backgroundColor: Colors.white,
// side: BorderSide(
// color: Constant.primaryBlue, width: 2),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(8))),
// onPressed: () {
// ref
// .read(registrasiProvider.state)
// .update((state) => state - 1);
// },
// child: SizedBox(
// height: Constant.getActualY(context: context, y: 56),
// child: Center(
// child: Text('Batal',
// style: Constant.body3_600(context: context)
// .copyWith(color: Constant.textBlue)),
// ),
// )),
// SizedBox(width: Constant.getActualX(context: context, x: 24)),
// (editStep == 4)
// ? Text('')
// : ElevatedButton(
// style: ElevatedButton.styleFrom(
// backgroundColor: Constant.primaryBlue,
// side:
// BorderSide(color: Constant.primaryBlue, width: 2),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(8),
// ),
// ),
// // onPressed: () {
// // showDialog(
// // context: context,
// // builder: ((context) => DialogPemeriksaan()));
// // },
// onPressed: () {
// ref
// .read(registrasiProvider.state)
// .update((state) => state + 1);
// },
// child: SizedBox(
// height: Constant.getActualY(context: context, y: 56),
// child: Center(
// child: Text('Simpan Perubahan',
// style: Constant.body3_600(context: context)
// .copyWith(color: Constant.textWhite)),
// ),
// )),
// ],
// ),
// )
])
]),
);
}
}

View File

@@ -0,0 +1,64 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/repository/order_repository.dart';
import '../../provider/dio_provider.dart';
import '../../repository/base_repository.dart';
abstract class EditOrderState extends Equatable {
final DateTime date;
const EditOrderState(this.date);
@override
List<Object?> get props => [date];
}
class EditOrderStateInit extends EditOrderState {
EditOrderStateInit() : super(DateTime.now());
}
class EditOrderStateLoading extends EditOrderState {
EditOrderStateLoading() : super(DateTime.now());
}
class EditOrderStateError extends EditOrderState {
final String message;
EditOrderStateError({
required this.message,
}) : super(DateTime.now());
}
class EditOrderStateDone extends EditOrderState {
final String number;
EditOrderStateDone({
required this.number,
}) : super(DateTime.now());
}
//notifier
class EditOrderNotifier extends StateNotifier<EditOrderState> {
final Ref ref;
EditOrderNotifier({
required this.ref,
}) : super(EditOrderStateInit());
void editOrder({required RegistrationModel prm}) async {
try {
state = EditOrderStateLoading();
final dio = ref.read(dioProvider);
final resp = await OrderRepository(dio: dio).editOrder(prm: prm);
state = EditOrderStateDone(number: resp);
} catch (e) {
if (e is BaseRepositoryException) {
state = EditOrderStateError(message: e.message.toString());
} else {
state = EditOrderStateError(message: e.toString());
}
}
}
}
//provider
final EditOrderProvider =
StateNotifierProvider<EditOrderNotifier, EditOrderState>(
(ref) => EditOrderNotifier(ref: ref));

View File

@@ -0,0 +1,655 @@
import 'dart:convert';
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: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/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:scroll_to_index/scroll_to_index.dart';
import '../../app/constant.dart';
import '../../provider/registrasi_provider.dart';
import '../../widgets/custom_snackbar_widget.dart';
import '../../widgets/custom_text_field.dart';
// ubah stateless jadi HookConsumerWidget
class FormEditPemeriksaan extends HookConsumerWidget {
const FormEditPemeriksaan({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final tempRegistrationData = ref.watch(EditDataProvider);
final selectedtest = ref.watch(selectedTestEditProvider);
final selectedPacket = ref.watch(selectedPacketEditProvider);
final selectedPacketOld = ref.watch(currentPacketProvider);
// inisialisasi baca provider idTipePeriksaStateProvider
final selectedTab = ref.watch(idTipePeriksaStateProvider);
final AuthModel auth = ref.watch(authProvider) ?? AuthModel();
final listTest = useState<List<TestModel>>(List.empty());
final testLoading = useState(false);
final searchCtr = useTextEditingController(text: "");
final scrollCtr = useScrollController();
final ctr = useState(AutoScrollController());
//get pemeriksaan from api
getPemeriksaan() {
ref
.read(GetFPPProvider.notifier)
.getData(mouID: auth.mUserMMouID ?? "0", token: auth.token ?? "0");
}
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
getPemeriksaan();
});
return () {};
}, []);
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
int index = listTest.value
.indexWhere((element) => element.tabId == selectedTab);
if (searchCtr.text.isNotEmpty) {
ctr.value.scrollToIndex(index);
}
// scrollCtr.animateTo(double.parse(index.toString()),
// curve: Curves.linear, duration: Duration(milliseconds: 100));
// // scrollCtr.jumpTo(double.parse(index.toString()));
});
return () {};
}, [selectedTab]);
ref.listen(
GetFPPProvider,
(pref, next) {
if (next is GetFPPStateInit) {
testLoading.value = true;
} else if (next is GetFPPStateLoading) {
testLoading.value = true;
} else if (next is GetFPPStateError) {
testLoading.value = false;
SanckbarWidget(context, next.message, snackbarType.error);
Constant.autoLogout(context: context, msg: next.message);
} else if (next is GetFPPStateDone) {
listTest.value = next.model;
ref.read(tempTestListProvider.notifier).state = next.model;
// tabController.length
testLoading.value = false;
}
},
);
// searchCtr.addListener(() {
// listTest.value.firstWhere((element) => element.items)
// },);
return Material(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: Constant.getActualX(context: context, x: 500),
// height: Constant.getActualY(context: context, y: 56),
child: CustomTextField(
suffixIcon: const Icon(EvaIcons.search),
controller: searchCtr,
isPassword: false,
hintText: "Cari Pemeriksaan",
labelText: "Cari Pemeriksaan",
),
),
SizedBox(height: Constant.getActualY(context: context, y: 12)),
// Tab
testLoading.value
? LoadingAnimationWidget.discreteCircle(
color: Colors.blue, size: 20)
: ConstrainedBox(
constraints: BoxConstraints(
maxWidth: Constant.getActualX(context: context, x: 1080)),
child: SizedBox(
width: MediaQuery.of(context).size.width,
height: Constant.getActualY(context: context, y: 70),
child: ScrollConfiguration(
behavior:
ScrollConfiguration.of(context).copyWith(dragDevices: {
PointerDeviceKind.mouse,
PointerDeviceKind.touch,
PointerDeviceKind.trackpad,
PointerDeviceKind.stylus,
PointerDeviceKind.unknown
}),
child: ListView(
controller: ctr.value,
scrollDirection: Axis.horizontal,
children: listTest.value
.asMap()
.entries
.map((e) => AutoScrollTag(
key: ValueKey(e.key),
index: e.key,
controller: ctr.value,
child: Container(
decoration: BoxDecoration(
border: Border(
bottom: selectedTab == e.value.tabId
? BorderSide(
width: 2,
color: Constant.primaryRed)
: const BorderSide(
color: Colors.transparent),
),
),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
shadowColor: Constant.primaryRed
.withOpacity(0.5),
backgroundColor: Colors.transparent,
elevation: 0),
onPressed: () {
ref
.read(idTipePeriksaStateProvider
.state)
.update((state) => e.value.tabId!);
},
child: Text(
e.value.tab!,
style:
Constant.body3_500(context: context)
.copyWith(color: Colors.black),
)),
),
))
.toList(),
),
),
),
),
SizedBox(height: Constant.getActualY(context: context, y: 14)),
// widget checkbox semua biar rapi
listCheckboxWidget(
search: searchCtr,
listTest: listTest,
loading: testLoading,
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
SizedBox(
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
OutlinedButton(
style: OutlinedButton.styleFrom(
backgroundColor: Colors.white,
side: BorderSide(color: Colors.grey.shade400, width: 2),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8))),
onPressed: () {
// Navigator.pop(context);
ref
.read(EditStepProvider.state)
.update((state) => state - 1);
},
child: SizedBox(
height: Constant.getActualY(context: context, y: 56),
child: Center(
child: Text('Sebelumnya',
style: Constant.body3_600(context: context)
.copyWith(color: Constant.textBlack)),
),
)),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Constant.green,
side: BorderSide(color: Constant.green, width: 2),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
onPressed: () {
if (selectedtest.isEmpty && selectedPacket.isEmpty) {
SanckbarWidget(context, "Belum memilih Pemeriksaan",
snackbarType.warning);
return;
}
List<Tests> ts = List.empty(growable: true);
double total = 0;
for (var i = 0; i < selectedtest.length; i++) {
var splitted = selectedtest[i].split("|");
var tabid = splitted[0];
var testid = splitted[1];
for (var j = 0; j < listTest.value.length; j++) {
if (listTest.value[j].tabId == int.parse(tabid)) {
var tests = listTest.value[j].items;
for (var k = 0; k < tests!.length; k++) {
if (tests[k].testID == testid) {
ts.add(Tests(
date: DateTime.now().toString(),
id: tests[k].testID,
name: tests[k].testName,
price: tests[k].testPrice,
sasCode: tests[k].sasCode,
// specimen: "",
tab: tabid,
));
total = total +
double.parse(tests[k].testPrice ?? "0");
}
}
}
}
}
List<Paket> pkt = List.empty(growable: true);
for (var i = 0; i < selectedPacket.length; i++) {
var paket = listTest.value
.firstWhere((element) => element.isPaket == "Y");
paket.items?.forEach((element) {
if (element.testID == selectedPacket[i]) {
if (selectedPacketOld.isNotEmpty) {
for (var i in selectedPacketOld) {
var splitted = i.split('|');
if (splitted[1] == element.testID) {
pkt.add(Paket(
detailID: splitted[0],
id: element.testID,
arrTest: element.arrTest,
detail: element.sasCode,
name: element.testName));
total = total +
double.parse(element.testPrice ?? "0");
} else {
pkt.add(Paket(
detailID: "new",
id: element.testID,
price: element.testPrice,
type: element.type,
arrTest: element.arrTest,
detail: element.sasCode,
name: element.testName));
total = total +
double.parse(element.testPrice ?? "0");
}
}
} else {
pkt.add(Paket(
detailID: "new",
id: element.testID,
arrTest: element.arrTest,
detail: element.sasCode,
price: element.testPrice,
type: element.type,
name: element.testName));
total =
total + double.parse(element.testPrice ?? "0");
}
}
});
}
bool paketValidation = false;
bool testValidation = false;
for (var e in pkt) {
var test = e.arrTest?.split(",");
test?.forEach((f) {
for (var g in pkt) {
if (e.id?.trim() != g.id?.trim()) {
var testCek = g.arrTest!.split(",");
var cek = testCek.firstWhere(
(h) => h.trim() == f.trim(),
orElse: () => "-1",
);
if (cek != "-1") {
paketValidation = true;
}
}
}
});
}
for (var e in pkt) {
var test = e.arrTest?.split(",");
test?.forEach((f) {
for (var g in ts) {
if (f.trim() == g.id?.trim()) {
testValidation = true;
}
}
});
}
if (paketValidation) {
SanckbarWidget(
context,
"Paket pilihan memiliki pemeriksaan yang sama ",
snackbarType.warning);
return;
}
if (testValidation) {
SanckbarWidget(
context,
"Paket pilihan memiliki pemeriksaan yang sama dengan test pilihan",
snackbarType.warning);
return;
}
ref.read(EditDataProvider.notifier).state =
RegistrationModel(
orderID: tempRegistrationData.orderID,
patientId: tempRegistrationData.patientId,
token: auth.token,
patientData: tempRegistrationData.patientData,
specimens: tempRegistrationData.specimens,
bahan: tempRegistrationData.bahan,
paket: pkt,
tests: ts,
total: total.toString());
print("Specimen awal");
print(jsonEncode(tempRegistrationData.specimens));
print("Bahan awal");
print(jsonEncode(tempRegistrationData.bahan));
ref.read(EditStepProvider.state).update((state) => 2);
},
child: SizedBox(
height: Constant.getActualY(context: context, y: 56),
child: Center(
child: Text('Berikutnya',
style: Constant.body3_600(context: context)
.copyWith(color: Constant.textWhite)),
),
)),
],
),
)
],
));
}
}
class listCheckboxWidget extends HookConsumerWidget {
const listCheckboxWidget(
{super.key,
required this.listTest,
required this.loading,
required this.search});
final ValueNotifier<List<TestModel>> listTest;
final ValueNotifier<bool> loading;
final TextEditingController search;
@override
Widget build(BuildContext context, WidgetRef ref) {
bool? isChecked = false;
final tests = useState<List<Items>>(List.empty());
final isPaket = useState(false);
// inisialisasi state provider buat baca idTipePeriksa yang di klik
final selectedTab = ref.watch(idTipePeriksaStateProvider);
final selectedTest = ref.watch(selectedTestEditProvider);
final selectedPacket = ref.watch(selectedPacketEditProvider);
final scrollCtr = useScrollController();
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
if (loading.value == false && listTest.value.isNotEmpty) {
// TestModel temp = listTest.value[0];
var selected = listTest.value
.firstWhere((element) => element.tabId == selectedTab);
if (selected.isPaket == 'Y') {
isPaket.value = true;
} else {
isPaket.value = false;
}
if (search.text.isNotEmpty) {
List<Items> filter = selected.items!
.where((element) =>
element.testName!.toLowerCase().contains(search.text))
.toList();
tests.value = filter;
} else {
tests.value = selected.items ?? [];
}
}
});
return () {};
}, [selectedTab, loading.value]);
search.addListener(
() {
if (loading.value == false && listTest.value.isNotEmpty) {
for (var i = 0; i < listTest.value.length; i++) {
List<Items> flt = listTest.value[i].items!
.where((element) =>
element.testName!.toLowerCase().contains(search.text))
.toList();
if (flt.isNotEmpty) {
ref.read(idTipePeriksaStateProvider.notifier).state =
listTest.value[i].tabId!;
break;
}
}
var selected = listTest.value
.firstWhere((element) => element.tabId == selectedTab);
if (search.text.isNotEmpty) {
List<Items> filter = selected.items!
.where((element) =>
element.testName!.toLowerCase().contains(search.text))
.toList();
tests.value = filter;
} else {
tests.value = selected.items ?? [];
}
}
},
);
selectedItem(int idTab, String idTest) {
List<String> temp = selectedTest.toSet().toList(growable: true);
var data = "$idTab|$idTest";
var cek = temp.firstWhere(
(element) => element == data,
orElse: () => "-1",
);
if (cek == "-1") {
temp.add(data);
} else {
temp.remove(cek);
}
ref.read(selectedTestEditProvider.notifier).state = temp.toSet().toList();
}
valueCek<Bool>(int idTab, String idTest) {
var data = "$idTab|$idTest";
var cek = selectedTest.firstWhere(
(element) => element == data,
orElse: () => "-1",
);
if (cek == "-1") {
return false;
} else {
return true;
}
}
selectPacket(String idTest) {
List<String> temp = selectedPacket.toSet().toList(growable: true);
var cek = temp.firstWhere(
(element) => element == idTest,
orElse: () => "-1",
);
if (cek == "-1") {
temp.add(idTest);
} else {
temp.remove(cek);
}
ref.read(selectedPacketEditProvider.notifier).state =
temp.toSet().toList();
}
valueCekPacket<Bool>(String idTest) {
var cek = selectedPacket.firstWhere(
(element) => element == idTest,
orElse: () => "-1",
);
if (cek == "-1") {
return false;
} else {
return true;
}
}
// buat data2 dari List Periksa
return Row(children: [
SizedBox(
width: Constant.getActualX(context: context, x: 1080),
height: Constant.getActualY(context: context, y: 230),
child: loading.value
? Center(
child: LoadingAnimationWidget.discreteCircle(
color: Constant.primaryBlue, size: 30),
)
: Scrollbar(
controller: scrollCtr,
thumbVisibility: true,
trackVisibility: true,
child: ScrollConfiguration(
behavior:
ScrollConfiguration.of(context).copyWith(dragDevices: {
PointerDeviceKind.mouse,
PointerDeviceKind.touch,
PointerDeviceKind.trackpad,
PointerDeviceKind.stylus,
PointerDeviceKind.unknown
}),
child: isPaket.value
? ListView(
controller: scrollCtr,
children: tests.value
.map(
(e) => Container(
margin: EdgeInsets.symmetric(vertical: 5),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Row(
children: [
Checkbox(
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(4)),
// value: valueCek(
// selectedTab, e.testID!),
value: valueCekPacket(e.testID!),
onChanged: (value) {
print(value);
selectPacket(e.testID!);
// selectedItem(
// selectedTab, e.testID!);
}),
SizedBox(
// constraints: BoxConstraints(
// maxWidth:
// ),
// color: Colors.red,
width: Constant.getActualX(
context: context, x: 380),
child: Text('${e.testName}',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Constant.body3_400(
context: context)
.copyWith(
color: Constant
.textBlack)),
),
],
),
Padding(
padding: EdgeInsets.only(left: 30),
child: Text(
e.sasCode ?? "",
style: Constant.caption2_400(
context: context)
.copyWith(
color: Constant.textGrey),
),
)
],
),
),
)
.toList(),
)
: GridView.count(
controller: scrollCtr,
shrinkWrap: true,
crossAxisCount: 2,
childAspectRatio: 15,
children: tests.value
.map(
(e) => Container(
// color: Colors.primaries[
// Random().nextInt(Colors.primaries.length)],
child: Row(
children: [
Checkbox(
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(4)),
// value: valueCek(selectedTab, e.testID!),
value:
valueCek(selectedTab, e.testID!),
onChanged: (value) {
print(value);
selectedItem(
selectedTab, e.testID!);
}),
SizedBox(
// constraints: BoxConstraints(
// maxWidth:
// ),
// color: Colors.red,
width: Constant.getActualX(
context: context, x: 380),
child: Text('${e.testName}',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Constant.body3_400(
context: context)
.copyWith(
color: Constant.textBlack)),
),
// Container(
// // constraints: BoxConstraints(
// // maxWidth:
// // ),
// // color: Colors.red,
// // width:
// // Constant.getActualX(context: context, x: 350),
// child: Text(
// Constant.convertToIdr(
// int.parse(e.testPrice ?? "0"), 0),
// style: Constant.body3_500(
// context: context)
// .copyWith(color: Constant.textBlack)),
// ),
],
),
),
)
.toList(),
),
),
),
),
]);
}
}

View File

@@ -0,0 +1,663 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
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/provider/auth_provider.dart';
import 'package:mitra_corporate/provider/order_provider.dart';
import 'package:mitra_corporate/provider/registrasi_provider.dart';
import 'package:mitra_corporate/screen/order/edit_order_provider.dart';
import 'package:mitra_corporate/screen/registrasi/get_specimen_provider.dart';
import 'package:mitra_corporate/widgets/tests_tabel_edit_widget.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
import '../../app/constant.dart';
import '../../widgets/custom_snackbar_widget.dart';
class DetailEdit extends HookConsumerWidget {
const DetailEdit({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final auth = ref.watch(authProvider);
final tempRegistrationData = ref.watch(EditDataProvider);
final selectedtestDataOld = ref.watch(selectedtestData);
final selectedPacketOld = ref.watch(currentPacketProvider);
final testListAll = ref.read(tempTestListProvider);
final selectedTest = ref.read(selectedTestEditProvider);
final dialogAction = ref.watch(dialogOrderActionProvider);
final testList = useState<List<Items>>(List.empty());
final testScrollCtr = useScrollController();
final specimenLoading = useState(false);
final addOrderLoading = ref.watch(editOrderLoadingProvider);
final tabctr = useTabController(initialLength: 2);
final selectedTab = useState(0);
//get specimen & bahan from list of tests
getSpecimen() {
List<Map<String, String>> test = List.empty(growable: true);
tempRegistrationData.tests?.forEach((element) {
test.add({
"id": element.id ?? "0",
"tab": element.tab ?? "0",
"sasCode": element.sasCode ?? "-"
});
});
// print(jsonEncode(test));
ref
.read(GetSpecimenProvider.notifier)
.getData(arrTest: test, token: auth?.token ?? "0");
}
ref.listen(
GetSpecimenProvider,
(pref, next) {
if (next is GetSpecimenStateInit) {
specimenLoading.value = true;
} else if (next is GetSpecimenStateLoading) {
specimenLoading.value = true;
} else if (next is GetSpecimenStateError) {
specimenLoading.value = false;
SanckbarWidget(context, next.message, snackbarType.error);
Constant.autoLogout(context: context, msg: next.message);
} else if (next is GetSpecimenStateDone) {
var tests = tempRegistrationData.tests;
//assign specimn & bahan
List<GetSpecimenModel> nw = next.model;
List<Specimens> sp = List.empty(growable: true);
List<Bahan> bhn = List.empty(growable: true);
for (var i = 0; i < tests!.length; i++) {
var tes = tests[i];
var cek = "${tes.tab}|${tes.id}";
for (var j = 0; j < nw.length; j++) {
var cek2 = "${nw[j].tab}|${nw[j].id}";
if (cek == cek2) {
tests[i].specimen = nw[j].specimen?.toSet().toList();
tests[i].bahan = nw[j].bahan?.toSet().toList();
tests[i].detailID = 'new';
nw[j].specimen?.forEach((element) {
var a = sp.firstWhere(
(dt) => dt.id == element.id,
orElse: () =>
Specimens(ctr: TextEditingController(), id: "new"),
);
if (a.id == "new") {
element.detailID = "new";
sp.add(element);
}
});
nw[j].bahan?.forEach((element) {
var a = bhn.firstWhere(
(dt) => dt.id == element.id,
orElse: () =>
Bahan(ctr: TextEditingController(), id: "new"),
);
if (a.id == "new") {
element.detailID = "new";
bhn.add(element);
}
});
}
}
}
print("SPECIMEN");
print(jsonEncode(sp));
print("BAHAN");
print(jsonEncode(bhn));
for (var e in sp) {
tempRegistrationData.specimens?.forEach((i) {
if (e.id == i.id) {
e.detailID = i.detailID;
e.ctr.text = i.amount ?? "0";
e.amount = i.amount ?? "0";
}
});
}
for (var e in bhn) {
tempRegistrationData.bahan?.forEach((i) {
if (e.id == i.id) {
e.detailID = i.detailID;
e.ctr.text = i.amount ?? "0";
e.amount = i.amount ?? "0";
}
});
}
print("SPECIMEN2");
print(jsonEncode(sp));
print("BAHAN2");
print(jsonEncode(bhn));
for (var e in tests) {
for (var i in selectedtestDataOld) {
//detailid|idtest|testdate
// 68|205|2023-10-18 14:32:19
var splitted = i.split('|');
if (e.id == splitted[1]) {
e.detailID = splitted[0];
///assign date
// e.date = splitted[2];
e.date = DateFormat('dd-MM-yyyy HH:mm')
.format(DateTime.parse(splitted[2]))
.toString();
}
}
}
ref.read(EditDataProvider.notifier).state = RegistrationModel(
orderID: tempRegistrationData.orderID,
patientId: tempRegistrationData.patientId,
token: auth?.token,
patientData: tempRegistrationData.patientData,
paket: tempRegistrationData.paket,
tests: tests,
specimens: sp.toSet().toList(),
bahan: bhn.toSet().toList(),
total: tempRegistrationData.total);
specimenLoading.value = false;
}
},
);
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
List<Items> temp = List.empty(growable: true);
for (var element in testListAll) {
// "$idTab|$idTest"
for (var i in element.items!) {
String cek = "${element.tabId}|${i.testID}";
String ck = selectedTest.firstWhere(
(j) => j == cek,
orElse: () => "-1",
);
if (ck != "-1") {
temp.add(i);
}
}
}
testList.value = temp;
getSpecimen();
});
return () {};
}, []);
//delete tests & auto cek & delete specimen/bahan
delete(String idTest, String idtab) {
List<Tests> temp = tempRegistrationData.tests ?? [];
List<String> selectedTest = ref.watch(selectedTestEditProvider);
String cek = "$idtab|$idTest";
double total = double.parse(tempRegistrationData.total!);
List<Specimens> oldSp = tempRegistrationData.specimens ?? [];
List<Bahan> oldBhn = tempRegistrationData.bahan ?? [];
Tests removed = tempRegistrationData.tests!.firstWhere(
(element) => element.id == idTest && element.tab == idtab);
temp.removeWhere(
(element) => element.id == idTest && element.tab == idtab);
selectedTest.removeWhere((element) => element == cek);
total = total - double.parse(removed.price!);
// var tests = tempRegistrationData.tests;
// List<GetSpecimenModel> nw = next.model;
List<Specimens> newSp = List.empty(growable: true);
List<Bahan> newBhn = List.empty(growable: true);
for (var j = 0; j < temp.length; j++) {
temp[j].specimen?.forEach((element) {
var a = newSp.firstWhere(
(dt) => dt.id == element.id,
orElse: () => Specimens(ctr: TextEditingController(), id: "new"),
);
if (a.id == "new") {
newSp.add(element);
}
});
temp[j].bahan?.forEach((element) {
var a = newBhn.firstWhere(
(dt) => dt.id == element.id,
orElse: () => Bahan(ctr: TextEditingController(), id: "new"),
);
if (a.id == "new") {
newBhn.add(element);
}
});
}
// print("old sp");
// print(jsonEncode(oldSp));
// print("new sp");
// print(jsonEncode(newSp));
//compare old dp and new sp to get deleted specimen
List<Specimens> deletedSp = List.empty(growable: true);
for (var i = 0; i < oldSp.length; i++) {
Specimens sp = newSp.firstWhere((element) => element.id == oldSp[i].id,
orElse: () =>
Specimens(ctr: TextEditingController(), id: "deleted"));
if (sp.id == "deleted") {
deletedSp.add(oldSp[i]);
}
}
List<Specimens> tempSp = tempRegistrationData.specimens ?? [];
for (var e in deletedSp) {
tempSp.removeWhere((element) => element.id == e.id);
}
// print("deleted sp");
// print(jsonEncode(deletedSp));
// print("old bhn");
// print(jsonEncode(oldBhn));
// print("new bhn");
// print(jsonEncode(newBhn));
//compare old bhn and new bhn to get deleted bahan
List<Bahan> deletedBhn = List.empty(growable: true);
for (var i = 0; i < oldBhn.length; i++) {
Bahan sp = newBhn.firstWhere((element) => element.id == oldBhn[i].id,
orElse: () => Bahan(ctr: TextEditingController(), id: "deleted"));
if (sp.id == "deleted") {
deletedBhn.add(oldBhn[i]);
}
}
List<Bahan> tempBhn = tempRegistrationData.bahan ?? [];
for (var e in deletedBhn) {
tempBhn.removeWhere((element) => element.id == e.id);
}
// print("deleted bahan");
// print(jsonEncode(deletedBhn));
ref.read(EditDataProvider.notifier).state = RegistrationModel(
orderID: tempRegistrationData.orderID,
patientId: tempRegistrationData.patientId,
token: auth?.token,
patientData: tempRegistrationData.patientData,
specimens: tempSp,
paket: tempRegistrationData.paket,
bahan: tempBhn,
tests: temp,
total: total.toString());
ref.read(selectedTestEditProvider.notifier).state = selectedTest;
if (selectedTest.isEmpty) {
ref.read(EditStepProvider.state).update((state) => state - 1);
}
}
deletePaket(String idPaket) {
List<Paket> temp = tempRegistrationData.paket ?? [];
List<String> selectedPaket = ref.watch(selectedPacketEditProvider);
selectedPaket.removeWhere((element) => element == idPaket);
temp.removeWhere((element) => element.id == idPaket);
ref.read(selectedPacketEditProvider.notifier).state = selectedPaket;
ref.read(EditDataProvider.notifier).state = RegistrationModel(
orderID: tempRegistrationData.orderID,
patientId: tempRegistrationData.patientId,
token: auth?.token,
patientData: tempRegistrationData.patientData,
specimens: tempRegistrationData.specimens,
paket: temp,
bahan: tempRegistrationData.bahan,
tests: tempRegistrationData.tests,
total: tempRegistrationData.total);
}
Future<DateTime?> pickDate(DateTime initialdate) => showDatePicker(
// locale: Locale("id", "ID"),
context: context,
initialEntryMode: DatePickerEntryMode.calendarOnly,
cancelText: "Batal",
confirmText: "Simpan",
helpText: "Pilih Tanggal",
initialDate: initialdate,
firstDate: DateTime(1800),
lastDate: DateTime(2100));
Future<TimeOfDay?> pickTime(TimeOfDay initialTime) => showTimePicker(
context: context,
initialTime: initialTime,
cancelText: "Batal",
confirmText: "Simpan",
helpText: "Masukkan Jam dan Menit",
hourLabelText: "Jam",
minuteLabelText: "Menit",
builder: (context, childWidget) {
return MediaQuery(
data: MediaQuery.of(context).copyWith(
// Using 24-Hour format
alwaysUse24HourFormat: true),
// If you want 12-Hour format, just change alwaysUse24HourFormat to false or remove all the builder argument
child: childWidget!);
},
initialEntryMode: TimePickerEntryMode.input);
Future pickDateTime(String idtab, String idtest, String dt) async {
// DateTime selectedDate = DateTime.parse(dt);
// DateTime? date = await pickDate(selectedDate);
// if (date == null) return;
// TimeOfDay? time = await pickTime(
// TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute));
// if (time == null) return;
// var test = tempRegistrationData.tests ?? [];
// for (var i = 0; i < test.length; i++) {
// if (test[i].id == idtest && test[i].tab == idtab) {
// test[i].date =
// DateTime(date.year, date.month, date.day, time.hour, time.minute)
// .toString();
// }
// }
var test = tempRegistrationData.tests ?? [];
for (var i = 0; i < test.length; i++) {
if (test[i].id == idtest && test[i].tab == idtab) {
test[i].date = dt;
}
}
ref.read(EditDataProvider.notifier).state = RegistrationModel(
orderID: tempRegistrationData.orderID,
patientData: tempRegistrationData.patientData,
specimens: tempRegistrationData.specimens,
tests: test,
token: auth?.token,
patientId: tempRegistrationData.patientId,
bahan: tempRegistrationData.bahan,
total: tempRegistrationData.total);
}
bool validateDate(String? value) {
if (value == null || value.isEmpty) {
SanckbarWidget(context, "Format Waktu Pengambilan Sample Salah !",
snackbarType.warning);
return true;
}
final splitted = value.split(" ");
if (splitted.length == 2) {
final date = splitted[0];
final time = splitted[1];
final splittedDate = date.split("-");
final splittedTime = time.split(":");
if (splittedDate.length == 3) {
final day = int.tryParse(splittedDate[0]);
final month = int.tryParse(splittedDate[1]);
final year = int.tryParse(splittedDate[2]);
if (day != null) {
if (day > 31) {
SanckbarWidget(
context,
"Format Waktu Pengambilan Sample Salah !",
snackbarType.warning);
return true;
}
}
if (month != null) {
if (month > 12) {
SanckbarWidget(
context,
"Format Waktu Pengambilan Sample Salah !",
snackbarType.warning);
return true;
}
}
// if (year == null) {
// return "Format salah";
// }
} else {
SanckbarWidget(context, "Format Waktu Pengambilan Sample Salah !",
snackbarType.warning);
return true;
}
if (splittedTime.length == 2) {
var hour = int.tryParse(splittedTime[0]);
var sec = int.tryParse(splittedTime[1]);
if (hour != null) {
if (hour > 24) {
SanckbarWidget(
context,
"Format Waktu Pengambilan Sample Salah !",
snackbarType.warning);
return true;
}
}
if (sec != null) {
if (sec > 60) {
SanckbarWidget(
context,
"Format Waktu Pengambilan Sample Salah !",
snackbarType.warning);
return true;
}
}
} else {
SanckbarWidget(context, "Format Waktu Pengambilan Sample Salah !",
snackbarType.warning);
return true;
}
} else {
SanckbarWidget(context, "Format Waktu Pengambilan Sample Salah !",
snackbarType.warning);
return true;
}
return false;
}
editOrder() {
print(jsonEncode(tempRegistrationData));
// tempRegistrationData.tests!.forEach((element) {
// if (element.date == null || element.date!.isEmpty) {
// SanckbarWidget(
// context,
// "Waktu pengambilan sample ${element.name} Tidak boleh kosong",
// snackbarType.warning);
// return;
// }
// if (validateDate(element.date)) {
// return;
// }
// var coba = Jiffy.parse(element.date!, pattern: 'dd-MM-yyyy HH:mm')
// .format(pattern: 'yyyy-MM-dd HH:mm');
// });
// print(jsonEncode(tempRegistrationData));
// return;
ref.read(EditOrderProvider.notifier).editOrder(prm: tempRegistrationData);
}
ref.listen(
EditOrderProvider,
(pref, next) {
if (next is EditOrderStateInit) {
ref.read(editOrderLoadingProvider.notifier).state = true;
} else if (next is EditOrderStateLoading) {
ref.read(editOrderLoadingProvider.notifier).state = true;
} else if (next is EditOrderStateError) {
ref.read(editOrderLoadingProvider.notifier).state = false;
SanckbarWidget(context, next.message, snackbarType.error);
Constant.autoLogout(context: context, msg: next.message);
} else if (next is EditOrderStateDone) {
ref.read(orderNumberProvider.notifier).state = next.number;
print(next.number);
SanckbarWidget(context, "Edit Order Berhasil ", snackbarType.success);
ref.read(editOrderLoadingProvider.notifier).state = false;
Navigator.pop(context);
ref.read(EditStepProvider.notifier).state = 0;
ref.read(tabPeriksaprovider.notifier).state = 1;
ref.read(EditDataProvider.notifier).state = RegistrationModel();
ref.read(selectedtestData.notifier).state =
List.empty(growable: true);
ref.read(tempTestListProvider.notifier).state =
List.empty(growable: true);
ref.read(currentPacketProvider.notifier).state =
List.empty(growable: true);
ref.read(selectedPacketEditProvider.notifier).state = List.empty();
}
},
);
return Material(
child: Container(
width: Constant.getActualX(context: context, x: 1160),
// height: MediaQuery.of(context).size.height,
color: Colors.white,
child: Column(
children: [
Row(
children: [
SizedBox(
// color: Colors.red,
width: Constant.getActualX(context: context, x: 1160),
child: TestsTableEditWidget(
paketDelete: deletePaket,
specimenLoading: specimenLoading,
testScrollCtr: testScrollCtr,
tempRegistrationData: tempRegistrationData,
addOrderLoading: addOrderLoading,
delete: delete,
pickDateTime: pickDateTime)
// TestsTableWEditWidget(
// specimenLoading: specimenLoading,
// testScrollCtr: testScrollCtr,
// tempRegistrationData: tempRegistrationData,
// addOrderLoading: addOrderLoading,
// delete: delete,
// pickDateTime: pickDateTime),
),
// Container(
// width:
// Constant.getActualX(context: context, x: 1160) * 0.05,
// ),
// Container(
// // color: Colors.red,
// width:
// Constant.getActualX(context: context, x: 1160) * 0.24,
// child: Column(
// children: [
// Container(
// width:
// Constant.getActualX(context: context, x: 1160) *
// 0.24,
// child: TabBar(
// controller: tabctr,
// labelColor: Colors.black,
// labelStyle: Constant.body3_500(context: context)
// .copyWith(color: Colors.black),
// indicatorColor: Constant.primaryRed,
// onTap: (value) => selectedTab.value = value,
// tabs: [
// Tab(
// text: "Specimen",
// ),
// Tab(
// text: "Bahan",
// )
// ]),
// ),
// SizedBox(
// height:
// Constant.getActualY(context: context, y: 20),
// ),
// if (selectedTab.value == 0)
// SpecimenTableWidget(
// specimenLoading: specimenLoading,
// tempRegistrationData: tempRegistrationData,
// addOrderLoading: addOrderLoading),
// if (selectedTab.value == 1)
// BahanTableWidget(
// specimenLoading: specimenLoading,
// tempRegistrationData: tempRegistrationData,
// addOrderLoading: addOrderLoading)
// // SizedBox(
// // height:
// // Constant.getActualY(context: context, y: 20),
// // ),
// // BahanTableWidget(
// // specimenLoading: specimenLoading,
// // tempRegistrationData: tempRegistrationData,
// // addOrderLoading: addOrderLoading),
// ],
// ),
// ),
],
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
OutlinedButton(
style: OutlinedButton.styleFrom(
backgroundColor: Colors.white,
side: BorderSide(
color: Colors.grey.shade400, width: 2),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8))),
onPressed: addOrderLoading == false
? () {
// Navigator.pop(context);
ref
.read(EditStepProvider.state)
.update((state) => state - 1);
}
: null,
child: SizedBox(
height:
Constant.getActualY(context: context, y: 56),
child: Center(
child: addOrderLoading
? LoadingAnimationWidget.staggeredDotsWave(
color: Constant.primaryRed, size: 30)
: Text('Sebelumnya',
style: Constant.body3_600(
context: context)
.copyWith(color: Constant.textBlack)),
),
)),
SizedBox(
width: Constant.getActualX(context: context, x: 24)),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Constant.green,
side: BorderSide(color: Constant.green, width: 2),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
// onPressed: () {
// showDialog(
// context: context,
// builder: ((context) => DialogPemeriksaan()));
// },
onPressed: addOrderLoading == false
? () {
editOrder();
}
: null,
child: SizedBox(
height:
Constant.getActualY(context: context, y: 56),
child: Center(
child: addOrderLoading
? LoadingAnimationWidget.staggeredDotsWave(
color: Colors.white, size: 30)
: Text('Simpan',
style: Constant.body3_600(
context: context)
.copyWith(color: Constant.textWhite)),
),
)),
],
),
)
],
)));
}
}

View File

@@ -0,0 +1,896 @@
import 'package:age_calculator/age_calculator.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:intl/intl.dart';
import 'package:jiffy/jiffy.dart';
import 'package:mitra_corporate/app/constant.dart';
import 'package:mitra_corporate/model/registration_model.dart';
import 'package:mitra_corporate/provider/auth_provider.dart';
import 'package:mitra_corporate/provider/order_provider.dart';
import 'package:mitra_corporate/screen/registrasi/get_filter_provider.dart';
import 'package:mitra_corporate/widgets/custom_snackbar_widget.dart';
import 'package:mitra_corporate/widgets/custom_text_field.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
class FormEditDatapasien extends HookConsumerWidget {
const FormEditDatapasien({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final tempPatient = ref.watch(EditDataProvider);
final auth = ref.watch(authProvider);
//withoutnik apabila tanpa nik maka true
final withoutNIK = useState(false);
final getFilterLoading = useState(false);
final sapaanKey = useState(1);
final genderKey = useState(1000);
final prefixCtr = useTextEditingController(text: "");
final nameCtr = useTextEditingController(text: "");
final suffixCtr = useTextEditingController(text: "");
final nikCtr = useTextEditingController(text: "");
final nipCtr = useTextEditingController(text: "");
final hpCtr = useTextEditingController(text: "");
final noRmCtr = useTextEditingController(text: "");
final addressCtr = useTextEditingController(text: "");
final diagnosisCtr = useTextEditingController(text: "");
final noteCtr = useTextEditingController(text: "");
final jabatanCtr = useTextEditingController(text: "");
final kedudukanCtr = useTextEditingController(text: "");
final lokasiCtr = useTextEditingController(text: "");
final pekerjaanCtr = useTextEditingController(text: "");
final sapaan = useState<List<CustomDropDownModel>>(List.empty());
final selectedSaluation = useState(CustomDropDownModel());
final gender = useState<List<CustomDropDownModel>>(List.empty());
final selectedGender = useState(CustomDropDownModel());
//select salah satu sapaan
onSelectSaluation(CustomDropDownModel value) {
selectedSaluation.value = value;
selectedGender.value =
gender.value.firstWhere((element) => element.id == value.type);
genderKey.value = genderKey.value + 1;
// sapaanKey.value = sapaanKey.value + 1;
}
//update gender saat sapaan dipilih
selectedSaluation.addListener(() {
selectedGender.value = gender.value
.firstWhere((element) => element.id == selectedSaluation.value.type);
genderKey.value = genderKey.value + 1;
});
//select gender
onSelectGender(CustomDropDownModel value) {
selectedGender.value = value;
}
final dobRb = useState('date');
final dobCtr = useTextEditingController(
text: DateFormat('dd-MM-yyyy').format(DateTime.now()));
final dobState = useState(DateTime.now());
final yearCtr = useTextEditingController(text: "0");
final monthCtr = useTextEditingController(text: "0");
final dayCtr = useTextEditingController(text: "0");
//perhitungan umur dari tanggal ke angka
DateDuration calculateAge(DateTime birthDate) {
DateTime currentDate = DateTime.now();
var age = AgeCalculator.age(birthDate, today: currentDate);
return age;
}
dobState.addListener(
() {
// print(calculateAge(dobState.value));
if (dobRb.value == "date") {
var age = calculateAge(dobState.value);
yearCtr.text = age.years.toString();
monthCtr.text = age.months.toString();
dayCtr.text = age.days.toString();
}
},
);
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
nameCtr.text = tempPatient.patientData?.name ?? "";
prefixCtr.text = tempPatient.patientData?.prefix ?? "";
suffixCtr.text = tempPatient.patientData?.suffix ?? "";
nikCtr.text = tempPatient.patientData?.nik ?? "";
nipCtr.text = tempPatient.patientData?.nip ?? "";
withoutNIK.value =
tempPatient.patientData?.withoutNIK == 'Y' ? true : false;
hpCtr.text = tempPatient.patientData?.hp ?? "";
addressCtr.text = tempPatient.patientData?.address ?? "";
diagnosisCtr.text = tempPatient.patientData?.diagnosis ?? "";
noteCtr.text = tempPatient.patientData?.note ?? "";
noRmCtr.text = tempPatient.patientData?.noRM ?? "";
jabatanCtr.text = tempPatient.patientData?.jabatan ?? "";
kedudukanCtr.text = tempPatient.patientData?.kedudukan ?? "";
lokasiCtr.text = tempPatient.patientData?.lokasi ?? "";
pekerjaanCtr.text = tempPatient.patientData?.pekerjaan ?? "";
// DateFormat('dd-MM-yyyy').format(DateTime.now())
dobCtr.text = DateFormat('dd-MM-yyyy').format(DateTime.parse(
tempPatient.patientData?.dob ?? DateTime.now().toString()));
dobState.value = DateTime.parse(
tempPatient.patientData?.dob ?? DateTime.now().toString());
ref
.read(GetFilterRegistrationProvider.notifier)
.getData(token: auth!.token ?? "");
});
return () {};
}, []);
ref.listen(
GetFilterRegistrationProvider,
(previous, next) {
if (next is GetFilterRegistrationStateInit) {
getFilterLoading.value = true;
} else if (next is GetFilterRegistrationStateLoading) {
getFilterLoading.value = true;
} else if (next is GetFilterRegistrationStateError) {
SanckbarWidget(context, next.message, snackbarType.error);
getFilterLoading.value = false;
Constant.autoLogout(context: context, msg: next.message);
} else if (next is GetFilterRegistrationStateDone) {
// print(jsonEncode(next.model));
sapaan.value = next.model.titles!;
gender.value = next.model.gender!;
// selectedGender.value = next.model.gender![0];
if (tempPatient.patientData?.saluation != null) {
var sp = next.model.titles!.firstWhere(
(element) => element.id == tempPatient.patientData?.saluation);
selectedSaluation.value = sp;
}
if (tempPatient.patientData?.gender != null) {
var gd = next.model.gender!.firstWhere(
(element) => element.id == tempPatient.patientData?.gender);
selectedGender.value = gd;
}
sapaanKey.value = sapaanKey.value + 1;
genderKey.value = genderKey.value + 1;
getFilterLoading.value = false;
}
},
);
//Function ke step selanjutny(pilih pemeriksaan)
nextStep() {
if (withoutNIK.value == false) {
if (nikCtr.text.isEmpty) {
SanckbarWidget(context, "NIK Harus diisi", snackbarType.warning);
return;
}
if (nikCtr.text.length < 16 || nikCtr.text.length > 16) {
SanckbarWidget(
context, "NIK berjumlah 16 digit", snackbarType.warning);
return;
}
}
if (nameCtr.text.isEmpty || selectedGender.value.id == null) {
// print(nameCtr.text);
// print(selectedGender.value.name);
SanckbarWidget(
context,
"Nama, Tanggal Lahir, dan Jenis Kelamin Haruus Diisi !",
snackbarType.warning);
} else {
var temp = ref.watch(EditDataProvider);
PatientData data = PatientData(
noRM: noRmCtr.text,
saluation: selectedSaluation.value.id,
name: nameCtr.text,
prefix: prefixCtr.text,
suffix: suffixCtr.text,
dob: dobState.value.toString(),
nik: nikCtr.text,
nip: nipCtr.text,
withoutNIK: withoutNIK.value ? "Y" : "N",
gender: selectedGender.value.id.toString(),
address: addressCtr.text,
diagnosis: diagnosisCtr.text,
hp: hpCtr.text,
note: noteCtr.text);
ref.read(EditDataProvider.notifier).state = RegistrationModel(
orderID: temp.orderID,
token: auth?.token ?? "",
patientId: temp.patientId ?? "new",
patientData: data,
specimens: temp.specimens,
bahan: temp.bahan,
tests: temp.tests,
total: temp.total);
ref.read(EditStepProvider.state).update((state) => 1);
}
}
return Padding(
padding: const EdgeInsets.only(top: 20, bottom: 20, left: 24, right: 24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
SizedBox(
width: Constant.getActualX(context: context, x: 120),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
DropdownMenu<CustomDropDownModel>(
enabled: false,
menuHeight:
Constant.getActualY(context: context, y: 300),
key: ValueKey(sapaanKey.value),
initialSelection: selectedSaluation.value,
trailingIcon: getFilterLoading.value
? LoadingAnimationWidget.discreteCircle(
color: Constant.primaryBlue, size: 20)
: null,
width: Constant.getActualX(context: context, x: 120),
hintText: "Sapaan",
textStyle: Constant.body2_400(context: context),
inputDecorationTheme: InputDecorationTheme(
border: OutlineInputBorder(
borderSide: BorderSide(color: Constant.primaryBlue),
borderRadius: BorderRadius.circular(8),
)),
label: const Text(
"Sapaan",
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
onSelected: (value) {
onSelectSaluation(value!);
selectedSaluation.value = value;
},
dropdownMenuEntries: sapaan.value
.map<DropdownMenuEntry<CustomDropDownModel>>(
(e) => DropdownMenuEntry(
value: e, label: e.name ?? ""))
.toList()),
],
)),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 160),
// height: Constant.getActualY(context: context, y: 56),
child: CustomTextField(
disable: false,
hintText: 'Prefix',
labelText: "Prefix",
controller: prefixCtr,
),
),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 520),
// height: Constant.getActualY(context: context, y: 56),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
CustomTextField(
disable: false,
hintText: 'Name',
labelText: "Nama",
controller: nameCtr,
),
],
),
),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 160),
// height: Constant.getActualY(context: context, y: 56),
child: CustomTextField(
disable: false,
hintText: 'Suffix',
labelText: "suffix",
controller: suffixCtr,
),
),
],
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
Row(
children: [
Radio<String>(
value: "date",
groupValue: dobRb.value,
onChanged: (value) {
dobRb.value = value!;
},
),
SizedBox(width: Constant.getActualX(context: context, x: 20)),
SizedBox(
width: Constant.getActualX(context: context, x: 252),
// height: Constant.getActualY(context: context, y: 56),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
TextField(
enabled: false,
controller: dobCtr,
style: Constant.body2_400(context: context),
decoration: InputDecoration(
suffixIcon: Icon(Icons.calendar_today),
border: OutlineInputBorder(
borderSide: BorderSide(color: Constant.primaryBlue),
borderRadius: BorderRadius.circular(8),
),
labelText: "Tanggal Lahir" //label text of field
),
readOnly: true,
onTap: () async {
DateTime? pickedDate = await showDatePicker(
// locale: Locale("id"),
context: context,
initialDate: dobState.value,
firstDate: DateTime(1800),
initialEntryMode: DatePickerEntryMode.calendarOnly,
//DateTime.now() - not to allow to choose before today.
lastDate: DateTime(2100));
if (pickedDate != null) {
print(
pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
String formattedDate =
DateFormat('dd-MM-yyyy').format(pickedDate);
print(
formattedDate); //formatted date output using intl package => 2021-03-16
dobCtr.text =
formattedDate; //set output date to TextField value.
dobState.value = pickedDate;
} else {}
},
),
],
),
),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
Radio<String>(
value: "age",
groupValue: dobRb.value,
onChanged: (value) {
dobRb.value = value!;
},
),
SizedBox(width: Constant.getActualX(context: context, x: 20)),
Stack(
clipBehavior: Clip.none,
// alignment: AlignmentDirectional.bottomCenter,
children: [
Container(
padding: EdgeInsets.symmetric(
horizontal:
Constant.getActualX(context: context, x: 16),
vertical: Constant.getActualY(context: context, y: 12)),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
border: Border.all(color: Colors.grey)),
child: Row(
children: [
SizedBox(
width: Constant.getActualX(context: context, x: 90),
height: Constant.getActualY(context: context, y: 40),
child: CustomTextField(
onChange: (value) {
if (dobRb.value == "age") {
DateTime coba = Jiffy.now()
.subtract(
months: int.parse(monthCtr.text),
years: int.parse(yearCtr.text),
days: int.parse(dayCtr.text))
.dateTime;
// print(coba);
dobState.value = coba;
dobCtr.text = DateFormat('dd-MM-yyyy')
.format(dobState.value);
}
},
disable: dobRb.value != "date",
hintText: 'Tahun',
labelText: "",
isDense: true,
suffixIcon: SizedBox(
child: Container(
padding: EdgeInsets.only(
top: Constant.getActualY(
context: context, y: 8),
bottom: Constant.getActualY(
context: context, y: 8),
right: Constant.getActualX(
context: context, x: 5),
),
child: Text(
'Tahun',
style: Constant.body3_400(context: context)
.copyWith(color: Colors.grey),
),
),
),
style: Constant.body3_400(context: context),
hintStyle: Constant.body3_400(context: context),
labelStyle: Constant.body3_400(context: context),
controller: yearCtr,
inputType: TextInputType.number,
),
),
SizedBox(
width:
Constant.getActualX(context: context, x: 16)),
SizedBox(
width: Constant.getActualX(context: context, x: 90),
height: Constant.getActualY(context: context, y: 40),
child: CustomTextField(
onChange: (value) {
if (dobRb.value == "age") {
DateTime currentDate = DateTime.now();
DateTime coba = Jiffy.now()
.subtract(
months: int.parse(monthCtr.text),
years: int.parse(yearCtr.text),
days: int.parse(dayCtr.text))
.dateTime;
// print(coba);
dobState.value = coba;
dobCtr.text = DateFormat('dd-MM-yyyy')
.format(dobState.value);
}
},
disable: dobRb.value != "date",
hintText: 'Bulan',
labelText: "",
controller: monthCtr,
inputType: TextInputType.number,
isDense: true,
suffixIcon: Container(
child: Container(
padding: EdgeInsets.only(
top: Constant.getActualY(
context: context, y: 8),
bottom: Constant.getActualY(
context: context, y: 8),
right: Constant.getActualX(
context: context, x: 5),
),
child: Text(
'Bulan',
style: Constant.body3_400(context: context)
.copyWith(color: Colors.grey),
),
),
),
style: Constant.body3_400(context: context),
hintStyle: Constant.body3_400(context: context),
labelStyle: Constant.body3_400(context: context),
),
),
SizedBox(
width:
Constant.getActualX(context: context, x: 16)),
SizedBox(
width: Constant.getActualX(context: context, x: 90),
height: Constant.getActualY(context: context, y: 40),
child: CustomTextField(
disable: dobRb.value != "date",
onChange: (value) {
if (dobRb.value == "age") {
if (int.parse(dayCtr.text) <= 31) {
DateTime currentDate = DateTime.now();
DateTime coba = Jiffy.now()
.subtract(
months: int.parse(monthCtr.text),
years: int.parse(yearCtr.text),
days: int.parse(dayCtr.text))
.dateTime;
// print(coba);
dobState.value = coba;
dobCtr.text = DateFormat('dd-MM-yyyy')
.format(dobState.value);
} else {
dayCtr.text = "31";
SanckbarWidget(
context,
"hari tidak lebih dari 31",
snackbarType.warning);
}
}
},
hintText: 'Hari',
labelText: "",
controller: dayCtr,
inputType: TextInputType.number,
isDense: true,
suffixIcon: Container(
child: Container(
padding: EdgeInsets.only(
top: Constant.getActualY(
context: context, y: 8),
bottom: Constant.getActualY(
context: context, y: 8),
right: Constant.getActualX(
context: context, x: 5),
),
child: Text(
'Hari',
style: Constant.body3_400(context: context)
.copyWith(color: Colors.grey),
),
),
),
style: Constant.body3_400(context: context),
hintStyle: Constant.body3_400(context: context),
labelStyle: Constant.body3_400(context: context),
),
),
],
),
),
Positioned(
top: -8,
left: 10,
child: Container(
color: Colors.white,
child: const Text(
"Umur",
style: TextStyle(color: Colors.grey),
)))
],
),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 300),
// height: Constant.getActualY(context: context, y: 56),
child: CustomTextField(
disable: false,
hintText: 'No RM',
labelText: "No RM",
controller: noRmCtr,
),
)
],
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
Row(
children: [
SizedBox(
width: Constant.getActualX(context: context, x: 240),
// height: Constant.getActualY(context: context, y: 56),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
CustomTextField(
disable: false,
inputType: TextInputType.number,
controller: nikCtr,
hintText: withoutNIK.value
? "Pasien Tanpa NIK Data Historis Tidak Terkonsolidasi"
: 'NIK',
labelText: withoutNIK.value
? "Pasien Tanpa NIK Data Historis Tidak Terkonsolidasi"
: "NIK"),
],
),
),
SizedBox(width: Constant.getActualX(context: context, x: 20)),
Center(
child: Transform.scale(
scale: 0.8,
child: Checkbox(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4)),
value: withoutNIK.value,
onChanged: (value) {
withoutNIK.value = value!;
if (value == true) {}
}),
),
),
Text('Tanpa NIK',
style: Constant.body2_400(context: context)
.copyWith(color: Constant.textBlack)),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
],
),
SizedBox(
height: Constant.getActualY(context: context, y: 24),
),
Row(
children: [
SizedBox(
width: Constant.getActualX(context: context, x: 304),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
DropdownMenu<CustomDropDownModel>(
enabled: false,
key: ValueKey(genderKey.value),
initialSelection: selectedGender.value,
trailingIcon: getFilterLoading.value
? LoadingAnimationWidget.discreteCircle(
color: Constant.primaryBlue, size: 20)
: null,
width: Constant.getActualX(context: context, x: 304),
hintText: "Jenis Kelamin",
textStyle: Constant.body2_400(context: context),
inputDecorationTheme: InputDecorationTheme(
border: OutlineInputBorder(
borderSide: BorderSide(color: Constant.primaryBlue),
borderRadius: BorderRadius.circular(8),
)),
label: const Text("jenis Kelamin"),
onSelected: (value) {
onSelectGender(value!);
selectedGender.value = value;
},
dropdownMenuEntries: gender.value
.map<DropdownMenuEntry<CustomDropDownModel>>(
(e) => DropdownMenuEntry(
value: e, label: e.name ?? ""))
.toList()),
],
)),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 218),
// height: Constant.getActualY(context: context, y: 56),
child: CustomTextField(
disable: false,
hintText: 'No Hp',
labelText: "No Hp",
controller: hpCtr,
),
),
SizedBox(
width: Constant.getActualX(context: context, x: 24),
),
SizedBox(
width: Constant.getActualX(context: context, x: 218),
child: CustomTextField(
disable: false,
hintText: "NIP",
labelText: "NIP",
controller: nipCtr,
),
),
],
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
Row(
children: [
SizedBox(
width: Constant.getActualX(context: context, x: 304),
// height: Constant.getActualY(context: context, y: 56),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
CustomTextField(
disable: false,
hintText: 'Jabatan',
labelText: "Jabatan",
controller: jabatanCtr,
),
],
),
),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 218),
// height: Constant.getActualY(context: context, y: 56),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
CustomTextField(
disable: false,
hintText: 'Kedudukan',
labelText: "Kedudukan",
controller: kedudukanCtr,
),
],
),
),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 218),
// height: Constant.getActualY(context: context, y: 56),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
CustomTextField(
disable: false,
hintText: 'Lokasi',
labelText: "Lokasi",
controller: lokasiCtr,
),
],
),
),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 218),
// height: Constant.getActualY(context: context, y: 56),
child: Stack(
alignment: AlignmentDirectional.topEnd,
children: [
Padding(
padding: const EdgeInsets.all(5),
child: Text(
"*",
style: Constant.body2_400(context: context)
.copyWith(color: Constant.primaryRed),
),
),
CustomTextField(
disable: false,
hintText: 'Pekerjaan',
labelText: "Pekerjaan",
controller: pekerjaanCtr,
),
],
),
)
],
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 1032),
// height: Constant.getActualY(context: context, y: 120),
child: CustomTextField(
disable: false,
controller: addressCtr,
hintText: 'Alamat',
labelText: "Alamat",
maxLines: 4,
minLines: 1),
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 1032),
// height: Constant.getActualY(context: context, y: 120),
child: CustomTextField(
controller: diagnosisCtr,
hintText: 'Diagnosis',
labelText: "Diagnosis",
maxLines: 4,
minLines: 1),
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
SizedBox(
width: Constant.getActualX(context: context, x: 1032),
// height: Constant.getActualY(context: context, y: 120),
child: CustomTextField(
controller: noteCtr,
hintText: 'Catatan FO',
labelText: "Catatan FO",
maxLines: 4,
minLines: 1),
),
SizedBox(height: Constant.getActualY(context: context, y: 24)),
SizedBox(
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
OutlinedButton(
style: OutlinedButton.styleFrom(
backgroundColor: Colors.white,
side: BorderSide(color: Colors.grey.shade400, width: 2),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8))),
onPressed: () {
ref.read(EditDataProvider.notifier).state =
RegistrationModel();
ref.read(selectedTestEditProvider.notifier).state =
List.empty(growable: true);
ref.read(currentPacketProvider.notifier).state =
List.empty(growable: true);
ref.read(selectedPacketEditProvider.notifier).state =
List.empty();
Navigator.pop(context);
},
child: SizedBox(
height: Constant.getActualY(context: context, y: 56),
child: Center(
child: Text('Batal',
style: Constant.body3_600(context: context)
.copyWith(color: Constant.textBlack)),
),
)),
SizedBox(width: Constant.getActualX(context: context, x: 24)),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Constant.green,
side: BorderSide(color: Constant.green, width: 2),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
onPressed: () {
nextStep();
},
child: SizedBox(
height: Constant.getActualY(context: context, y: 56),
child: Center(
child: Text('Berikutnya',
style: Constant.body3_600(context: context)
.copyWith(color: Constant.textWhite)),
),
)),
],
),
)
],
),
);
}
}

View File

@@ -0,0 +1,214 @@
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:intl/intl.dart';
import '../../app/constant.dart';
import '../../provider/auth_provider.dart';
import '../../widgets/custom_dialog_builder.dart';
class OrderFilter extends HookConsumerWidget {
const OrderFilter({
super.key,
required this.startDateCtr,
required this.startDateState,
required this.endDateCtr,
required this.endDateState,
required this.keywordCtr,
});
final TextEditingController startDateCtr;
final ValueNotifier<DateTime> startDateState;
final TextEditingController endDateCtr;
final ValueNotifier<DateTime> endDateState;
final TextEditingController keywordCtr;
@override
Widget build(BuildContext context, WidgetRef ref) {
final auth = ref.watch(authProvider);
final username = auth?.mUserUsername ?? "-";
showDialogBuilder() {
var endDateParam =
DateFormat('yyyy-MM-dd').format(endDateState.value).toString();
var startDateParam =
DateFormat('yyyy-MM-dd').format(startDateState.value).toString();
var companyID = auth?.mUserMCompanyID ?? "";
print("endDateParam : $endDateParam");
print("startDateParam : $startDateParam");
CustomDialogBuilder.dialogBuilderWebPDF(
context,
// startDateCtr.text.toString(),
// endDateCtr.text.toString(),
startDateParam,
endDateParam,
keywordCtr.text.toString(),
username,
companyID);
// launchUrlString("http://10.9.8.249/birt/run?__report=report/one/rekap/rpt_sales_001.rptdesign&__format=xls&PStartDate=2023-01-01&PEndDate=2023-01-31&username=adminsas&tm=1681262919125");
}
return Padding(
padding: const EdgeInsets.all(0),
child: Row(
children: [
Expanded(
flex: 3,
child: TextField(
style: Constant.body1_600(context: context),
controller: startDateCtr,
decoration: InputDecoration(
suffixIcon: Icon(EvaIcons.calendar),
border: OutlineInputBorder(
borderSide: BorderSide(color: Constant.primaryBlue),
borderRadius: BorderRadius.circular(8),
),
labelStyle: Constant.body1_600(context: context),
labelText: "Tanggal Awal" //label text of field
),
readOnly: true,
onTap: () async {
DateTime? pickedDate = await showDatePicker(
// locale: Locale("id"),
confirmText: "OK",
cancelText: "Batal",
context: context,
initialDate: startDateState.value,
firstDate: DateTime(1800),
initialEntryMode: DatePickerEntryMode.calendarOnly,
//DateTime.now() - not to allow to choose before today.
lastDate: DateTime(2100));
if (pickedDate != null) {
print(
pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
String formattedDate =
DateFormat('dd-MM-yyyy').format(pickedDate);
print(
formattedDate); //formatted date output using intl package => 2021-03-16
startDateCtr.text =
formattedDate; //set output date to TextField value.
startDateState.value = pickedDate;
} else {}
},
),
),
SizedBox(
width: Constant.getActualX(context: context, x: 24),
),
Expanded(
flex: 3,
child: TextField(
style: Constant.body1_600(context: context),
controller: endDateCtr,
decoration: InputDecoration(
suffixIcon: Icon(EvaIcons.calendar),
border: OutlineInputBorder(
borderSide: BorderSide(color: Constant.primaryBlue),
borderRadius: BorderRadius.circular(8),
),
labelStyle: Constant.body1_600(context: context),
labelText: "Tanggal Akhir" //label text of field
),
readOnly: true,
onTap: () async {
DateTime? pickedDate = await showDatePicker(
// locale: Locale("id"),
confirmText: "OK",
cancelText: "Batal",
context: context,
initialDate: endDateState.value,
firstDate: DateTime(1800),
initialEntryMode: DatePickerEntryMode.calendarOnly,
//DateTime.now() - not to allow to choose before today.
lastDate: DateTime(2100));
if (pickedDate != null) {
print(
pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
String formattedDate =
DateFormat('dd-MM-yyyy').format(pickedDate);
print(
formattedDate); //formatted date output using intl package => 2021-03-16
endDateCtr.text =
formattedDate; //set output date to TextField value.
endDateState.value = pickedDate;
} else {}
},
),
),
SizedBox(
width: Constant.getActualX(context: context, x: 24),
),
Expanded(
flex: 6,
child: TextField(
style: Constant.body1_600(context: context),
controller: keywordCtr,
decoration: InputDecoration(
border: OutlineInputBorder(
borderSide: BorderSide(color: Constant.primaryBlue),
borderRadius: BorderRadius.circular(8),
),
hintText: "No Reg / Nama",
hintStyle: Constant.body1_600(context: context),
labelStyle: Constant.body1_600(context: context),
labelText: "No Reg / Nama" //label text of field
)),
),
SizedBox(
width: Constant.getActualX(context: context, x: 24),
),
// button report pdf
Expanded(
flex: 1,
child: SizedBox(
width: Constant.getActualX(
context: context,
x: 171,
),
height: Constant.getActualY(context: context, y: 56),
child: ElevatedButton(
onPressed: () {
showDialogBuilder();
},
style: ButtonStyle(
backgroundColor: WidgetStateColor.resolveWith(
(st) => Constant.primaryRed,
),
shape: WidgetStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
side: BorderSide(
color: Colors.transparent,
),
),
),
// shadowColor: MaterialStateProperty.all(
// Color(0xffff48423d)),
elevation: WidgetStateProperty.all(1.0),
),
// child: Align(
// alignment: Alignment.center,
// child: Text(
// 'Cetak',
// style: Constant.body3_600(context: context).copyWith(
// color: Constant.textWhite,
// ),
// ),
// ),
child: Icon(
color: Colors.white,
EvaIcons.printerOutline,
),
),
),
),
],
),
);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,79 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mitra_corporate/model/search_order_model.dart';
import 'package:mitra_corporate/repository/order_repository.dart';
import '../../provider/dio_provider.dart';
import '../../repository/base_repository.dart';
abstract class SearchOrderState extends Equatable {
final DateTime date;
const SearchOrderState(this.date);
@override
List<Object?> get props => [date];
}
class SearchOrderStateInit extends SearchOrderState {
SearchOrderStateInit() : super(DateTime.now());
}
class SearchOrderStateLoading extends SearchOrderState {
SearchOrderStateLoading() : super(DateTime.now());
}
class SearchOrderStateError extends SearchOrderState {
final String message;
SearchOrderStateError({
required this.message,
}) : super(DateTime.now());
}
class SearchOrderStateDone extends SearchOrderState {
final SearchOrderModel model;
SearchOrderStateDone({
required this.model,
}) : super(DateTime.now());
}
//notifier
class SearchOrderNotifier extends StateNotifier<SearchOrderState> {
final Ref ref;
SearchOrderNotifier({
required this.ref,
}) : super(SearchOrderStateInit());
void getData({
required String token,
required String companyID,
required String rpp,
required String keyword,
required String page,
required String startDate,
required String endDate,
}) async {
try {
state = SearchOrderStateLoading();
final dio = ref.read(dioProvider);
final resp = await OrderRepository(dio: dio).searchOrder(
endDate: endDate,
startDate: startDate,
token: token,
companyID: companyID,
rpp: rpp,
keyword: keyword,
page: page);
state = SearchOrderStateDone(model: resp);
} catch (e) {
if (e is BaseRepositoryException) {
state = SearchOrderStateError(message: e.message.toString());
} else {
state = SearchOrderStateError(message: e.toString());
}
}
}
}
//provider
final SearchOrderProvider =
StateNotifierProvider<SearchOrderNotifier, SearchOrderState>(
(ref) => SearchOrderNotifier(ref: ref));