first commit
This commit is contained in:
65
lib/screen/order/cancel_order_provider.dart
Normal file
65
lib/screen/order/cancel_order_provider.dart
Normal 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));
|
||||
154
lib/screen/order/dialog_cancel_order.dart
Normal file
154
lib/screen/order/dialog_cancel_order.dart
Normal 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),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
141
lib/screen/order/dialog_edit.dart
Normal file
141
lib/screen/order/dialog_edit.dart
Normal 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)),
|
||||
// ),
|
||||
// )),
|
||||
// ],
|
||||
// ),
|
||||
// )
|
||||
])
|
||||
]),
|
||||
);
|
||||
}
|
||||
}
|
||||
64
lib/screen/order/edit_order_provider.dart
Normal file
64
lib/screen/order/edit_order_provider.dart
Normal 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));
|
||||
655
lib/screen/order/edit_pemeriksaan.dart
Normal file
655
lib/screen/order/edit_pemeriksaan.dart
Normal 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(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
]);
|
||||
}
|
||||
}
|
||||
663
lib/screen/order/form_detail_edit.dart
Normal file
663
lib/screen/order/form_detail_edit.dart
Normal 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)),
|
||||
),
|
||||
)),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
)));
|
||||
}
|
||||
}
|
||||
896
lib/screen/order/form_edit_data_pasien.dart
Normal file
896
lib/screen/order/form_edit_data_pasien.dart
Normal 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)),
|
||||
),
|
||||
)),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
214
lib/screen/order/order_filter.dart
Normal file
214
lib/screen/order/order_filter.dart
Normal 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,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
1022
lib/screen/order/order_screen.dart
Normal file
1022
lib/screen/order/order_screen.dart
Normal file
File diff suppressed because it is too large
Load Diff
79
lib/screen/order/search_order_provider.dart
Normal file
79
lib/screen/order/search_order_provider.dart
Normal 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));
|
||||
Reference in New Issue
Block a user