finish caleg, area and tim survei page
This commit is contained in:
@ -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,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user