You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
374 lines
14 KiB
Dart
374 lines
14 KiB
Dart
|
|
import 'package:car_provider_app/view_models/schedule_view_model.dart';
|
|
import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart';
|
|
import 'package:car_provider_app/views/settings/schedule/widgets/select_days_sheet.dart';
|
|
import 'package:car_provider_app/views/settings/schedule/widgets/select_services_sheet.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:mc_common_app/extensions/int_extensions.dart';
|
|
import 'package:mc_common_app/extensions/string_extensions.dart';
|
|
import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
|
|
import 'package:mc_common_app/models/general_models/m_response.dart';
|
|
import 'package:mc_common_app/theme/colors.dart';
|
|
import 'package:mc_common_app/utils/date_helper.dart';
|
|
import 'package:mc_common_app/utils/utils.dart';
|
|
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
|
|
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
|
|
import 'package:mc_common_app/widgets/txt_field.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:mc_common_app/widgets/bottom_sheet.dart';
|
|
|
|
class AddSchedulesPage extends StatelessWidget {
|
|
late ScheduleVM mModel;
|
|
String name = "", startDate = "", endDate = "", startTime = "", endTime = "", slotsTime = "", appointmentPerSlot = "", servicesGroupID = "";
|
|
late ScheduleData scheduleData;
|
|
|
|
AddSchedulesPage({Key? key}) : super(key: key);
|
|
|
|
setEditData() {
|
|
name = scheduleData.scheduleName ?? "";
|
|
startDate = DateHelper.formatAsYearMonthDay(scheduleData.fromDate ?? DateTime.now());
|
|
endDate = DateHelper.formatAsYearMonthDay(scheduleData.toDate ?? DateTime.now());
|
|
startTime = scheduleData.startTime ?? "";
|
|
endTime = scheduleData.endTime ?? "";
|
|
slotsTime = scheduleData.slotDurationMinute.toString();
|
|
appointmentPerSlot = scheduleData.perSlotAppointment.toString();
|
|
|
|
// mModel.selectedServicesItems.clear();
|
|
scheduleData.scheduleServices?.forEach((element) {
|
|
mModel.selectedServicesItems.add(PickerItem(id: element.providerServiceId ?? 0, title: element.providerServiceName ?? ""));
|
|
});
|
|
mModel.selectedDaysItems.clear();
|
|
scheduleData.weeklyOffDays?.forEach((element) {
|
|
for (var daysElement in initDaysList) {
|
|
if (element.dayNumber == daysElement.id) {
|
|
daysElement.isSelected = true;
|
|
mModel.selectedDaysItems.add(daysElement);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
mModel = context.read<ScheduleVM>();
|
|
scheduleData = ModalRoute.of(context)!.settings.arguments as ScheduleData;
|
|
mModel.getAllServices(scheduleData.branchId, scheduleData);
|
|
mModel.selectedServicesItems = [];
|
|
mModel.selectedDaysItems = [];
|
|
if (scheduleData.id != null) {
|
|
setEditData();
|
|
}
|
|
return Scaffold(
|
|
appBar: const CustomAppBar(
|
|
title: "Create Schedules",
|
|
),
|
|
body: SizedBox(
|
|
width: double.infinity,
|
|
child: Consumer<ScheduleVM>(
|
|
builder: (_, ScheduleVM model, child) {
|
|
return Column(
|
|
children: [
|
|
Expanded(
|
|
child: SingleChildScrollView(
|
|
padding: const EdgeInsets.all(20),
|
|
child: Column(
|
|
children: [
|
|
TxtField(
|
|
hint: "Name of Schedule",
|
|
value: name,
|
|
onChanged: (v) {
|
|
name = v;
|
|
},
|
|
),
|
|
8.height,
|
|
ChipsPickerItem(
|
|
hint: 'Select Services',
|
|
itemsList: [...model.selectedServicesItems],
|
|
onClick: () {
|
|
showMyBottomSheet(
|
|
context,
|
|
child: SelectServicesSheet(
|
|
onSelectServices: () {
|
|
model.filterSelectedServices();
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
},
|
|
),
|
|
);
|
|
},
|
|
),
|
|
8.height,
|
|
TxtField(
|
|
hint: "Starting Date",
|
|
value: startDate,
|
|
postfixWidget: const Icon(
|
|
Icons.calendar_month,
|
|
size: 16,
|
|
),
|
|
isNeedClickAll: true,
|
|
onTap: () async {
|
|
startDate = await Utils.pickDateFromDatePicker(
|
|
context,
|
|
firstDate: DateTime.now(),
|
|
);
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
model.refresh();
|
|
},
|
|
),
|
|
8.height,
|
|
TxtField(
|
|
hint: "End Date",
|
|
postfixWidget: const Icon(
|
|
Icons.calendar_month,
|
|
size: 16,
|
|
),
|
|
value: endDate,
|
|
isNeedClickAll: true,
|
|
onTap: () async {
|
|
endDate = await Utils.pickDateFromDatePicker(
|
|
context,
|
|
firstDate: DateTime.now(),
|
|
);
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
model.refresh();
|
|
},
|
|
),
|
|
8.height,
|
|
ChipsPickerItem(
|
|
hint: 'Days',
|
|
itemsList: [...model.selectedDaysItems],
|
|
onClick: () {
|
|
showMyBottomSheet(
|
|
context,
|
|
child: SelectDaysSheet(
|
|
onSelected: (List<PickerItem> picked) {
|
|
model.filterDays(picked);
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
},
|
|
),
|
|
);
|
|
},
|
|
),
|
|
8.height,
|
|
Row(
|
|
children: [
|
|
Expanded(
|
|
child: TxtField(
|
|
hint: "Shift Start Time",
|
|
postfixWidget: const Icon(
|
|
Icons.access_time_filled_outlined,
|
|
size: 16,
|
|
),
|
|
value: startTime,
|
|
isNeedClickAll: true,
|
|
onTap: () async {
|
|
startTime = await Utils.pickTime(context);
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
model.refresh();
|
|
},
|
|
),
|
|
),
|
|
8.width,
|
|
Expanded(
|
|
child: TxtField(
|
|
hint: "Shift End Time",
|
|
postfixWidget: const Icon(
|
|
Icons.access_time_filled_outlined,
|
|
size: 16,
|
|
),
|
|
value: endTime,
|
|
isNeedClickAll: true,
|
|
onTap: () async {
|
|
TimeOfDay _startTime = TimeOfDay.now();
|
|
if (startTime.isNotEmpty) _startTime = TimeOfDay(hour: int.parse(startTime.split(":")[0]), minute: int.parse(startTime.split(":")[1]));
|
|
endTime = await Utils.pickTime(
|
|
context,
|
|
initialTime: _startTime,
|
|
);
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
model.refresh();
|
|
},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
8.height,
|
|
TxtField(
|
|
hint: "Slots Time",
|
|
postfixWidget: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
"Min".toText(color: MyColors.lightTextColor),
|
|
],
|
|
),
|
|
keyboardType: TextInputType.number,
|
|
value: slotsTime,
|
|
onChanged: (v) {
|
|
slotsTime = v;
|
|
},
|
|
),
|
|
8.height,
|
|
TxtField(
|
|
hint: "Appointment Per Slot",
|
|
value: appointmentPerSlot,
|
|
keyboardType: TextInputType.number,
|
|
onChanged: (v) {
|
|
appointmentPerSlot = v;
|
|
},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
ShowFillButton(
|
|
title: "Create",
|
|
maxWidth: double.infinity,
|
|
margin: const EdgeInsets.all(20),
|
|
onPressed: () {
|
|
if (validation(model)) {
|
|
if (scheduleData.id != null) {
|
|
updateSchedule(context, model);
|
|
} else {
|
|
createSchedule(context, model);
|
|
}
|
|
}
|
|
},
|
|
),
|
|
],
|
|
);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
bool validation(ScheduleVM model) {
|
|
bool valid = true;
|
|
if (name.length < 3) {
|
|
Utils.showToast("Please enter valid schedule Name");
|
|
valid = false;
|
|
} else if (model.selectedServicesItems.isEmpty) {
|
|
Utils.showToast("Please select Services");
|
|
valid = false;
|
|
} else if (startDate.isEmpty) {
|
|
Utils.showToast("Please select start date");
|
|
valid = false;
|
|
} else if (endDate.isEmpty) {
|
|
Utils.showToast("Please select end date");
|
|
valid = false;
|
|
} else if (model.selectedDaysItems.isEmpty) {
|
|
Utils.showToast("Please off Days");
|
|
valid = false;
|
|
} else if (startTime.isEmpty) {
|
|
Utils.showToast("Please select start time");
|
|
valid = false;
|
|
} else if (endTime.isEmpty) {
|
|
Utils.showToast("Please select end time");
|
|
valid = false;
|
|
} else if (slotsTime.isEmpty) {
|
|
Utils.showToast("Please select slot time");
|
|
valid = false;
|
|
} else if (appointmentPerSlot.isEmpty) {
|
|
Utils.showToast("Please select appointment per slot");
|
|
valid = false;
|
|
}
|
|
return valid;
|
|
}
|
|
|
|
createSchedule(BuildContext context, ScheduleVM model) async {
|
|
List<int> days = [];
|
|
for (var element in model.selectedDaysItems) {
|
|
days.add(element.id);
|
|
}
|
|
|
|
//TODO: needs to verify with Zahoor about appointment type while creating Schedule
|
|
var map = {
|
|
"scheduleName": name,
|
|
"serviceProviderBranchID": scheduleData.branchId,
|
|
"fromDate": startDate,
|
|
"toDate": endDate,
|
|
"startTime": startTime,
|
|
"endTime": endDate,
|
|
"slotDurationMinute": slotsTime,
|
|
"perSlotAppointment": appointmentPerSlot,
|
|
"deliveryServiceType": 1,
|
|
"appointmentType": 1,
|
|
"weeklyOffDays": days
|
|
};
|
|
|
|
Utils.showLoading(context);
|
|
MResponse scheduleResponse = await model.createSchedule(map);
|
|
if (scheduleResponse.messageStatus == 1) {
|
|
List<int> services = [];
|
|
for (var element in model.selectedServicesItems) {
|
|
services.add(element.id);
|
|
}
|
|
var map1 = {
|
|
// "id": 0,
|
|
"branchAppointmentScheduleID": scheduleResponse.data,
|
|
"serviceProviderServiceID": services,
|
|
"serviceGroupDescription": "string"
|
|
};
|
|
|
|
MResponse servicesResponse = await model.addServicesInSchedule(map1);
|
|
Utils.hideLoading(context);
|
|
if (servicesResponse.messageStatus == 1) {
|
|
Utils.showToast("Successfully schedule created");
|
|
} else {
|
|
Utils.showToast("Something went wrong while adding services in schedule");
|
|
}
|
|
} else {
|
|
Utils.hideLoading(context);
|
|
Utils.showToast("Something went wrong");
|
|
}
|
|
}
|
|
|
|
updateSchedule(BuildContext context, ScheduleVM model) async {
|
|
List<int> days = [];
|
|
for (var element in model.selectedDaysItems) {
|
|
days.add(element.id);
|
|
}
|
|
|
|
var map = {
|
|
"id": scheduleData.id,
|
|
"scheduleName": name,
|
|
"serviceProviderBranchID": scheduleData.branchId,
|
|
"fromDate": startDate,
|
|
"toDate": endDate,
|
|
"startTime": startTime,
|
|
"endTime": endDate,
|
|
"slotDurationMinute": slotsTime,
|
|
"perSlotAppointment": appointmentPerSlot,
|
|
"deliveryServiceType": 1,
|
|
"weeklyOffDays": days
|
|
};
|
|
|
|
Utils.showLoading(context);
|
|
MResponse scheduleResponse = await model.updateSchedule(map);
|
|
if (scheduleResponse.messageStatus == 1) {
|
|
List<int> services = [];
|
|
for (var element in model.selectedServicesItems) {
|
|
services.add(element.id);
|
|
}
|
|
var map1 = {
|
|
// "id": scheduleData,
|
|
"branchAppointmentScheduleID": scheduleData.id,
|
|
"serviceProviderServiceID": services,
|
|
"serviceGroupDescription": "string",
|
|
};
|
|
|
|
MResponse servicesResponse = await model.updateServicesInSchedule(map1);
|
|
Utils.hideLoading(context);
|
|
if (servicesResponse.messageStatus == 1) {
|
|
Utils.showToast("Successfully schedule updated");
|
|
} else {
|
|
Utils.showToast("Something went wrong while adding services in schedule");
|
|
}
|
|
} else {
|
|
Utils.hideLoading(context);
|
|
Utils.showToast("Something went wrong");
|
|
}
|
|
}
|
|
}
|