finish caleg, area and tim survei page

This commit is contained in:
kicap
2023-10-26 16:05:01 +08:00
parent 364bee3120
commit 85be29e7ce
24 changed files with 1100 additions and 228 deletions

View File

@ -0,0 +1,154 @@
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
import 'package:validatorless/validatorless.dart';
import '../../../../../app/themes/app_colors.dart';
import '../../../../widgets/my_button.dart';
import '../../../../widgets/my_textformfield.dart';
import './tambah_detail_tim_survei_view_model.dart';
class TambahDetailTimSurveiView extends StatelessWidget {
final DialogRequest request;
final Function(DialogResponse) completer;
const TambahDetailTimSurveiView({
Key? key,
required this.request,
required this.completer,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return ViewModelBuilder<TambahDetailTimSurveiViewModel>.reactive(
viewModelBuilder: () => TambahDetailTimSurveiViewModel(),
onViewModelReady: (TambahDetailTimSurveiViewModel model) async {
await model.init(request.data);
},
builder: (
BuildContext context,
TambahDetailTimSurveiViewModel model,
Widget? child,
) {
return Dialog(
child: Container(
padding: const EdgeInsets.all(15),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: backgroundColor,
),
child: SingleChildScrollView(
child: Form(
key: model.formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
request.title ?? '',
),
const SizedBox(height: 15),
MyTextFormField(
hintText: 'NIK Tim Survei',
labelText: 'NIK Tim Survei',
keyboardType: TextInputType.number,
controller: model.nikController,
readOnly: model.timSurveiModel != null,
maxLength: 16,
validator: Validatorless.multiple(
[
Validatorless.required(
'NIK Tim Survei tidak boleh kosong'),
Validatorless.min(
16, 'NIK Tim Survei harus 16 digit'),
Validatorless.number(
'NIK Tim Survei harus berupa angka')
],
),
),
const SizedBox(height: 15),
MyTextFormField(
hintText: 'Nama Tim Survei',
labelText: 'Nama Tim Survei',
readOnly: model.timSurveiModel != null,
controller: model.namaController,
validator: Validatorless.required(
'Nama Tim Survei tidak boleh kosong'),
),
const SizedBox(height: 20),
if (model.timSurveiModel == null)
SizedBox(
width: 200,
child: MyButton(
text: 'Tambah',
onPressed: () {
if (model.formKey.currentState!.validate()) {
model.dialogService
.showConfirmationDialog(
title: 'Tambah Tim Survei',
description:
'Apakah anda yakin ingin menambahkan Tim Survei ${model.namaController.text} ?',
confirmationTitle: 'Ya',
cancelTitle: 'Tidak',
)
.then((value) async {
if (value!.confirmed) {
bool res = await model.tambahTimSurvei();
if (res) {
completer(DialogResponse(confirmed: true));
}
}
});
}
},
),
),
if (model.timSurveiModel != null)
Row(
mainAxisSize: MainAxisSize.min,
children: [
// create rounde icon with one is delete and one is info
Container(
width: 50,
height: 50,
decoration: BoxDecoration(
color: mainColor.withOpacity(0.5),
borderRadius: BorderRadius.circular(50),
),
child: IconButton(
onPressed: () {},
icon: const Icon(
Icons.list_alt_outlined,
color: Colors.white,
),
),
),
const SizedBox(width: 20),
Container(
width: 50,
height: 50,
decoration: BoxDecoration(
color: dangerColor,
borderRadius: BorderRadius.circular(50),
),
child: IconButton(
onPressed: () async {
completer(DialogResponse(confirmed: true));
},
icon: const Icon(
Icons.delete,
color: Colors.white,
),
),
),
],
)
],
),
),
),
),
);
},
);
}
}

View File

@ -0,0 +1,54 @@
import 'package:cek_suara/model/tim_survei_model.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import '../../../../../app/app.logger.dart';
import '../../../../../app/core/custom_base_view_model.dart';
class TambahDetailTimSurveiViewModel extends CustomBaseViewModel {
final log = getLogger('TambahDetailTimSurveiViewModel');
// form variabel
final formKey = GlobalKey<FormState>();
TextEditingController nikController = TextEditingController();
TextEditingController namaController = TextEditingController();
TimSurveiModel? timSurveiModel;
Future<void> init(data) async {
globalVar.backPressed = 'exitApp';
timSurveiModel = data;
if (timSurveiModel != null) {
nikController.text = timSurveiModel!.nik!;
namaController.text = timSurveiModel!.nama!;
}
}
Future<bool> tambahTimSurvei() async {
globalVar.backPressed = 'cantBack';
setBusy(true);
easyLoading.customLoading('Menambahkan Tim Survei...');
try {
var formData = FormData.fromMap({
'nik': nikController.text,
'nama': namaController.text,
});
var response = await httpService.postWithFormData('survei', formData);
log.i(response.data);
return true;
} catch (e) {
// log.e(e);
// snackbarService.showSnackbar(
// message: 'Gagal menambahkan Tim Survei\n${e.res}',
// title: 'Error',
// duration: const Duration(seconds: 2),
// );
return false;
} finally {
globalVar.backPressed = 'exitApp';
easyLoading.dismissLoading();
setBusy(false);
}
}
}

View File

@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import '../../../../app/themes/app_colors.dart';
import '../../../widgets/top_container.dart';
import './tim_survei_view_model.dart';
class TimSurveiView extends StatelessWidget {
@ -28,12 +30,122 @@ class TimSurveiView extends StatelessWidget {
}
return false;
},
child: const Center(
child: Text(
'TimSurveiView',
child: SafeArea(
child: Container(
height: MediaQuery.of(context).size.height,
padding: const EdgeInsets.all(20),
child: Column(
children: [
TopContainer(
title: 'Tim\nSurvei',
value: '${model.jumlahTimSurvei} Orang',
icon: Icons.people_alt_outlined,
background: orangeColor,
),
const SizedBox(height: 15),
Expanded(
child: Container(
alignment: model.isBusy
? Alignment.center
: (model.listTimSurveiModel.isNotEmpty
? null
: Alignment.center),
width: double.infinity,
height: double.infinity,
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(10),
color: warningColor,
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (model.isBusy)
const Center(
child: LinearProgressIndicator(
minHeight: 5,
color: mainColor,
),
),
if (!model.isBusy &&
model.listTimSurveiModel.isNotEmpty)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// create 10 list of survei person using card
for (int i = 0;
i < model.jumlahTimSurvei;
i++)
Card(
child: ListTile(
leading: Text('${i + 1}'),
title: Text(
model.listTimSurveiModel[i].nama!,
),
subtitle: Text(
model.listTimSurveiModel[i].nik!,
),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
// one info and one delete button
IconButton(
onPressed: () {
model.showDetailTimSurvei(
model.listTimSurveiModel[
i]);
},
icon: const Icon(
Icons.info_outline,
color: mainColor,
),
),
IconButton(
onPressed: () {
model.deleteTimSurvei(model
.listTimSurveiModel[i]);
},
icon: const Icon(
Icons.delete_outline,
color: Colors.red,
),
),
],
)),
),
],
),
// if listTimSurveiModel is empty
if (!model.isBusy &&
model.listTimSurveiModel.isEmpty)
Center(
child: Text(
model.status == true
? 'Data Tim Survei Kosong\n'
'Silahkan Tambahkan Tim Survei Baru'
: 'Gagal Mengambil Data Tim Survei',
textAlign: TextAlign.center,
),
),
],
),
),
),
)
],
),
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
model.addTimSurvei();
},
child: const Icon(Icons.add),
),
);
},
);

View File

@ -1,7 +1,96 @@
import '../../../../app/app.dialogs.dart';
import '../../../../app/app.logger.dart';
import '../../../../app/core/custom_base_view_model.dart';
import '../../../../app/themes/app_colors.dart';
import '../../../../model/my_response.model.dart';
import '../../../../model/tim_survei_model.dart';
class TimSurveiViewModel extends CustomBaseViewModel {
final log = getLogger('TimSurveiViewModel');
// variabel
List<TimSurveiModel> listTimSurveiModel = [];
int jumlahTimSurvei = 0;
bool status = false;
Future<void> init() async {
globalVar.backPressed = 'exitApp';
await getData();
}
getData() async {
setBusy(true);
// easyLoading.showLoading();
// globalVar.backPressed = 'cantBack';
try {
var response = await httpService.get('survei');
MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data);
TimSurveiListModel timSurveiListModel =
TimSurveiListModel.fromJson(myResponseModel.data);
listTimSurveiModel = timSurveiListModel.survei!;
jumlahTimSurvei = timSurveiListModel.jumlah!;
log.i('listTimSurveiModel: $listTimSurveiModel');
log.i('jumlahTimSurvei: $jumlahTimSurvei');
status = true;
} catch (e) {
log.e(e.toString());
status = false;
} finally {
setBusy(false);
// globalVar.backPressed = 'exitApp';
// easyLoading.dismissLoading();
}
}
addTimSurvei() async {
var res = await dialogService.showCustomDialog(
variant: DialogType.tambahDetailTimSurveiView,
title: 'Tambah Tim Survei',
);
if (res!.confirmed) {
await getData();
snackbarService.showSnackbar(
message: 'Berhasil menambahkan Tim Survei\nPassword default: 12345678',
title: 'Sukses',
duration: const Duration(seconds: 2),
);
}
}
deleteTimSurvei(TimSurveiModel listTimSurveiModel) async {
dialogService
.showDialog(
title: 'Hapus Tim Survei',
description:
'Apakah anda yakin ingin menghapus ${listTimSurveiModel.nama} ?',
buttonTitle: 'Hapus',
cancelTitle: 'Batal',
buttonTitleColor: dangerColor,
cancelTitleColor: mainColor,
)
.then((value) async {
if (value!.confirmed) {
await httpService.delete('survei/${listTimSurveiModel.nik}');
await getData();
snackbarService.showSnackbar(
message: 'Berhasil menghapus ${listTimSurveiModel.nama}',
title: 'Sukses',
duration: const Duration(seconds: 2),
);
}
});
}
showDetailTimSurvei(TimSurveiModel listTimSurveiModel) async {
var res = await dialogService.showCustomDialog(
variant: DialogType.tambahDetailTimSurveiView,
title: 'Detail Tim Survei',
data: listTimSurveiModel,
);
if (res!.confirmed) {
deleteTimSurvei(listTimSurveiModel);
}
}
}