Added Branch FilterView
parent
7c84037601
commit
342d9b2672
@ -0,0 +1,233 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'package:mc_common_app/api/api_client.dart';
|
||||||
|
import 'package:mc_common_app/classes/app_state.dart';
|
||||||
|
|
||||||
|
import 'package:mc_common_app/classes/consts.dart';
|
||||||
|
import 'package:mc_common_app/config/dependencies.dart';
|
||||||
|
import 'package:mc_common_app/models/general_models/m_response.dart';
|
||||||
|
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:mc_common_app/models/provider_branches_models/profile/branch.dart';
|
||||||
|
import 'package:mc_common_app/models/provider_branches_models/profile/categroy.dart';
|
||||||
|
import 'package:mc_common_app/models/provider_branches_models/profile/document.dart';
|
||||||
|
import 'package:mc_common_app/models/provider_branches_models/profile/services.dart';
|
||||||
|
import 'package:mc_common_app/models/provider_branches_models/provider_model.dart';
|
||||||
|
|
||||||
|
abstract class BranchRepo {
|
||||||
|
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude);
|
||||||
|
|
||||||
|
Future<MResponse> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true});
|
||||||
|
|
||||||
|
Future<Branch> fetchAllBranches();
|
||||||
|
|
||||||
|
Future<Category> fetchBranchCategory();
|
||||||
|
|
||||||
|
Future<Services> fetchServicesByCategoryId({required int serviceCategoryId});
|
||||||
|
|
||||||
|
Future<Services> fetchProviderServices(String branchID, String serviceCategoryId);
|
||||||
|
|
||||||
|
Future<MResponse> createNewService(List<Map<String, dynamic>> map);
|
||||||
|
|
||||||
|
Future<Document> getServiceProviderDocument(dynamic userId);
|
||||||
|
|
||||||
|
Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents);
|
||||||
|
|
||||||
|
Future<ProviderModel> getBranchAndServices();
|
||||||
|
|
||||||
|
Future<MResponse> createService(List<Map<String, dynamic>> map);
|
||||||
|
|
||||||
|
Future<MResponse> updateService(List<Map<String, dynamic>> map);
|
||||||
|
|
||||||
|
Future<MResponse> getMatchedServices(int oldBranchId, int newBranchId, int categoryId);
|
||||||
|
|
||||||
|
Future<MResponse> duplicateItems(Map<String, dynamic> map);
|
||||||
|
|
||||||
|
Future<MResponse> getAllProviderDealers(Map<String, dynamic> map);
|
||||||
|
|
||||||
|
Future<MResponse> getBranchUsers(Map<String, dynamic> map);
|
||||||
|
|
||||||
|
Future<MResponse> assignDealerToBranch(Map<String, dynamic> map);
|
||||||
|
|
||||||
|
Future<MResponse> removeDealerFromBranch(Map<String, dynamic> map);
|
||||||
|
|
||||||
|
Future<MResponse> addNewServicesInAppointment(Map<String, dynamic> map);
|
||||||
|
}
|
||||||
|
|
||||||
|
class BranchRepoImp implements BranchRepo {
|
||||||
|
@override
|
||||||
|
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
|
||||||
|
var postParams = {
|
||||||
|
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
|
||||||
|
"branchName": branchName,
|
||||||
|
"branchDescription": branchDescription,
|
||||||
|
"cityID": cityId,
|
||||||
|
"address": address,
|
||||||
|
"latitude": latitude,
|
||||||
|
"longitude": longitude,
|
||||||
|
"isActive": true
|
||||||
|
};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
debugPrint("token " + t);
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Branch> fetchAllBranches() async {
|
||||||
|
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Category> fetchBranchCategory() async {
|
||||||
|
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Services> fetchServicesByCategoryId({required int serviceCategoryId}) async {
|
||||||
|
var postParams = {"ServiceCategoryID": serviceCategoryId};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: serviceCategoryId != -1 ? postParams : null, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> createNewService(List<Map<String, dynamic>> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Document> getServiceProviderDocument(dynamic userId) async {
|
||||||
|
var queryParameters = {
|
||||||
|
"ServiceProviderID": userId.toString(),
|
||||||
|
};
|
||||||
|
String? token = AppState().getUser.data?.accessToken;
|
||||||
|
debugPrint(token);
|
||||||
|
return await injector
|
||||||
|
.get<ApiClient>()
|
||||||
|
.getJsonForObject((json) => Document.fromJson(json), ApiConsts.GetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents) async {
|
||||||
|
List<Map<String, dynamic>> map = [];
|
||||||
|
for (int i = 0; i < documents!.length; i++) {
|
||||||
|
if (documents[i].document != null) {
|
||||||
|
var postParams = {
|
||||||
|
"id": documents[i].id,
|
||||||
|
"serviceProviderID": documents[i].serviceProviderId,
|
||||||
|
"documentID": documents[i].documentId,
|
||||||
|
"documentExt": documents[i].fileExt,
|
||||||
|
"documentImage": documents[i].document,
|
||||||
|
"isActive": true
|
||||||
|
};
|
||||||
|
map.add(postParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
debugPrint("token " + t);
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<ProviderModel> getBranchAndServices() async {
|
||||||
|
var postParams = {"serviceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
print("tokeen121 " + t);
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => ProviderModel.fromJson(json), ApiConsts.BranchesAndServices, queryParameters: postParams, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}) async {
|
||||||
|
String lat = "0", long = "0";
|
||||||
|
try {
|
||||||
|
lat = latitude.substring(0, 9);
|
||||||
|
long = longitude.substring(0, 9);
|
||||||
|
} catch (e) {}
|
||||||
|
var postParams = {
|
||||||
|
"id": id,
|
||||||
|
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
|
||||||
|
"branchName": branchName,
|
||||||
|
"branchDescription": branchDescription,
|
||||||
|
"cityID": cityId,
|
||||||
|
"address": address,
|
||||||
|
"latitude": lat,
|
||||||
|
"longitude": long,
|
||||||
|
"isActive": isNeedToDelete
|
||||||
|
};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateProviderBranch, postParams, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> createService(List<Map<String, dynamic>> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> updateService(List<Map<String, dynamic>> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Update, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> getMatchedServices(int oldBranchId, int newBranchId, int categoryId) async {
|
||||||
|
var postParams = {
|
||||||
|
"ProviderBranchIDExisted": oldBranchId.toString(),
|
||||||
|
"ProviderBranchIDNew": newBranchId.toString(),
|
||||||
|
"CategoryID": categoryId.toString(),
|
||||||
|
};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getMatchedServices, queryParameters: postParams, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> duplicateItems(Map<String, dynamic> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.duplicateItems, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> getAllProviderDealers(Map<String, dynamic> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getAllProviderDealers, queryParameters: map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> getBranchUsers(Map<String, dynamic> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getBranchUser, queryParameters: map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> assignDealerToBranch(Map<String, dynamic> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.assignDealerToBranch, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> removeDealerFromBranch(Map<String, dynamic> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.removeDealerFromBranch, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Services> fetchProviderServices(String branchID, String serviceCategoryId) async {
|
||||||
|
var postParams = {
|
||||||
|
"ServiceCategoryID": serviceCategoryId,
|
||||||
|
"ProviderBranchID": branchID,
|
||||||
|
};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
debugPrint("token " + t);
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => Services.fromJson(json), ApiConsts.GetProviderServices, queryParameters: postParams, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> addNewServicesInAppointment(Map<String, dynamic> map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.AddNewServicesInAppointment, map, token: t);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mc_common_app/api/api_client.dart';
|
||||||
|
import 'package:mc_common_app/classes/app_state.dart';
|
||||||
|
import 'package:mc_common_app/classes/consts.dart';
|
||||||
|
import 'package:mc_common_app/config/dependencies.dart';
|
||||||
|
import 'package:mc_common_app/models/general_models/m_response.dart';
|
||||||
|
import 'package:mc_common_app/models/services_models/item_model.dart';
|
||||||
|
|
||||||
|
|
||||||
|
abstract class ItemsRepo {
|
||||||
|
Future<MResponse> createServiceItems(Map map);
|
||||||
|
|
||||||
|
Future<ItemModel> getServiceItems(int serviceId);
|
||||||
|
|
||||||
|
Future<MResponse> updateServiceItem(Map map);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ItemsRepoImp implements ItemsRepo {
|
||||||
|
@override
|
||||||
|
Future<MResponse> createServiceItems(Map map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
debugPrint(t);
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createItems, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<ItemModel> getServiceItems(int serviceId) async {
|
||||||
|
var queryParameters = {
|
||||||
|
"ServiceProviderServiceID": serviceId.toString(),
|
||||||
|
};
|
||||||
|
String? token = AppState().getUser.data?.accessToken;
|
||||||
|
debugPrint(token);
|
||||||
|
return await injector
|
||||||
|
.get<ApiClient>()
|
||||||
|
.getJsonForObject((json) => ItemModel.fromJson(json), ApiConsts.getServiceItems, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> updateServiceItem(Map map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
debugPrint(t);
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateServiceItem, map, token: t);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,61 @@
|
|||||||
|
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/models/provider_branches_models/profile/services.dart';
|
||||||
|
import 'package:mc_common_app/api/api_client.dart';
|
||||||
|
import 'package:mc_common_app/classes/app_state.dart';
|
||||||
|
import 'package:mc_common_app/classes/consts.dart';
|
||||||
|
import 'package:mc_common_app/config/dependencies.dart';
|
||||||
|
|
||||||
|
abstract class ScheduleRepo {
|
||||||
|
Future<Services> getAllServices(String branchId);
|
||||||
|
|
||||||
|
Future<MResponse> createSchedule(Map map);
|
||||||
|
|
||||||
|
Future<MResponse> addServicesInSchedule(Map map);
|
||||||
|
|
||||||
|
Future<MResponse> updateSchedule(Map map);
|
||||||
|
|
||||||
|
Future<Schedule> getSchedules(String branchId);
|
||||||
|
|
||||||
|
Future<MResponse> updateServicesInSchedule(Map map);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ScheduleRepoImp implements ScheduleRepo {
|
||||||
|
@override
|
||||||
|
Future<Services> getAllServices(String branchId) async {
|
||||||
|
Map<String, dynamic> map = {"ProviderBranchID": branchId};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => Services.fromJson(json), ApiConsts.getServicesOfBranch, token: t, queryParameters: map);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> createSchedule(Map map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createSchedule, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> addServicesInSchedule(Map map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createGroup, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Schedule> getSchedules(String branchId) async {
|
||||||
|
Map<String, dynamic> map = {"ServiceProviderBranchID": branchId};
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().getJsonForObject((json) => Schedule.fromJson(json), ApiConsts.getSchedule, token: t, queryParameters: map);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> updateSchedule(Map map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateSchedule, map, token: t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MResponse> updateServicesInSchedule(Map map) async {
|
||||||
|
String t = AppState().getUser.data!.accessToken ?? "";
|
||||||
|
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateGroup, map, token: t);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,153 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mc_common_app/classes/consts.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/general_models/widgets_models.dart';
|
||||||
|
import 'package:mc_common_app/theme/colors.dart';
|
||||||
|
import 'package:mc_common_app/view_models/ad_view_model.dart';
|
||||||
|
import 'package:mc_common_app/view_models/appointments_view_model.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/common_widgets/search_entity_widget.dart';
|
||||||
|
import 'package:mc_common_app/widgets/common_widgets/slider_widget.dart';
|
||||||
|
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
|
||||||
|
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class BranchesFilterView extends StatelessWidget {
|
||||||
|
const BranchesFilterView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: CustomAppBar(
|
||||||
|
title: "Branches Filter",
|
||||||
|
profileImageUrl: MyAssets.bnCar,
|
||||||
|
isRemoveBackButton: false,
|
||||||
|
isDrawerEnabled: false,
|
||||||
|
onBackButtonTapped: () {
|
||||||
|
context.read<AdVM>().resetValues();
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
body: Consumer<AppointmentsVM>(
|
||||||
|
builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
|
||||||
|
return WillPopScope(
|
||||||
|
onWillPop: () async {
|
||||||
|
context.read<AdVM>().resetValues();
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
ListView(
|
||||||
|
children: [
|
||||||
|
20.height,
|
||||||
|
SearchEntityWidget(
|
||||||
|
title: "Search By Provider Name",
|
||||||
|
actionWidget: Builder(
|
||||||
|
builder: (context) {
|
||||||
|
return DropdownField(
|
||||||
|
(DropValue value) => appointmentsVM.updateBranchFilterSelectedProviderId(SelectionModel(selectedId: value.id, selectedOption: value.value), isForSearch: true),
|
||||||
|
list: appointmentsVM.providersDropList,
|
||||||
|
dropdownValue: appointmentsVM.branchFilterSelectedProviderId.selectedId != -1
|
||||||
|
? DropValue(appointmentsVM.branchFilterSelectedProviderId.selectedId, appointmentsVM.branchFilterSelectedProviderId.selectedOption, "")
|
||||||
|
: null,
|
||||||
|
hint: "Select Provider",
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
historyContent: appointmentsVM.branchFilterProviderSearchHistory,
|
||||||
|
onHistoryItemDeleted: (index) {
|
||||||
|
appointmentsVM.removeBranchFilterProviderSearchHistory(index: index);
|
||||||
|
},
|
||||||
|
onHistoryItemTapped: (DropValue value) =>
|
||||||
|
appointmentsVM.updateBranchFilterSelectedProviderId(SelectionModel(selectedId: value.id, selectedOption: value.value), isForSearch: true),
|
||||||
|
),
|
||||||
|
const Divider(thickness: 1.2).paddingOnly(top: 7, bottom: 7),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
"0 KM".toText(fontSize: 12, isBold: true),
|
||||||
|
Expanded(
|
||||||
|
child: SliderWidget(
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 100,
|
||||||
|
value: appointmentsVM.branchFilterCurrentDistance,
|
||||||
|
onChanged: appointmentsVM.updateBranchFilterCurrentDistance,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"${appointmentsVM.branchFilterCurrentDistance.toInt()} KM".toText(fontSize: 12, isBold: true),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Divider(thickness: 1.2).paddingOnly(top: 7, bottom: 7),
|
||||||
|
SearchEntityWidget(
|
||||||
|
title: "Search By Category",
|
||||||
|
actionWidget: Builder(
|
||||||
|
builder: (context) {
|
||||||
|
return DropdownField(
|
||||||
|
(DropValue value) => appointmentsVM.updateBranchFilterSelectedCategoryId(SelectionModel(selectedId: value.id, selectedOption: value.value), isForSearch: true),
|
||||||
|
list: appointmentsVM.categoryDropList,
|
||||||
|
dropdownValue: appointmentsVM.branchFilterSelectedCategoryId.selectedId != -1
|
||||||
|
? DropValue(appointmentsVM.branchFilterSelectedCategoryId.selectedId, appointmentsVM.branchFilterSelectedCategoryId.selectedOption, "")
|
||||||
|
: null,
|
||||||
|
hint: "Select Category",
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
historyContent: appointmentsVM.branchFilterCategorySearchHistory,
|
||||||
|
onHistoryItemDeleted: (index) {
|
||||||
|
appointmentsVM.removeFilterCategorySearchHistory(index: index);
|
||||||
|
},
|
||||||
|
onHistoryItemTapped: (DropValue value) =>
|
||||||
|
appointmentsVM.updateBranchFilterSelectedCategoryId(SelectionModel(selectedId: value.id, selectedOption: value.value), isForSearch: true),
|
||||||
|
),
|
||||||
|
const Divider(thickness: 1.2).paddingOnly(top: 7, bottom: 7),
|
||||||
|
SearchEntityWidget(
|
||||||
|
title: "Search By Services",
|
||||||
|
actionWidget: Builder(builder: (context) {
|
||||||
|
return DropdownField(
|
||||||
|
(DropValue value) => appointmentsVM.updateBranchFilterSelectedServiceId(SelectionModel(selectedId: value.id, selectedOption: value.value), isForSearch: true),
|
||||||
|
list: appointmentsVM.servicesDropList,
|
||||||
|
dropdownValue: appointmentsVM.branchFilterSelectedServiceId.selectedId != -1
|
||||||
|
? DropValue(appointmentsVM.branchFilterSelectedServiceId.selectedId, appointmentsVM.branchFilterSelectedServiceId.selectedOption, "")
|
||||||
|
: null,
|
||||||
|
hint: "Select Services",
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
historyContent: appointmentsVM.branchFilterServicesSearchHistory,
|
||||||
|
onHistoryItemDeleted: (index) => appointmentsVM.removeBranchFilterServicesSearchHistory(index: index),
|
||||||
|
onHistoryItemTapped: (DropValue value) =>
|
||||||
|
appointmentsVM.updateBranchFilterSelectedServiceId(SelectionModel(selectedId: value.id, selectedOption: value.value), isForSearch: true),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
).expand(),
|
||||||
|
Container(
|
||||||
|
color: MyColors.white,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
5.height,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: ShowFillButton(
|
||||||
|
maxHeight: 55,
|
||||||
|
title: "Search",
|
||||||
|
onPressed: () {},
|
||||||
|
backgroundColor: MyColors.darkPrimaryColor,
|
||||||
|
txtColor: MyColors.white,
|
||||||
|
fontSize: 18,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
10.height,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).horPaddingMain(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class SliderWidget extends StatelessWidget {
|
||||||
|
final double minValue;
|
||||||
|
final double maxValue;
|
||||||
|
final double value;
|
||||||
|
final Function(double) onChanged;
|
||||||
|
|
||||||
|
const SliderWidget({super.key, required this.minValue, required this.maxValue, required this.value, required this.onChanged});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||||
|
child: SliderTheme(
|
||||||
|
data: const SliderThemeData(
|
||||||
|
trackShape: CustomSliderTrackShape(),
|
||||||
|
),
|
||||||
|
child: Slider(
|
||||||
|
min: minValue,
|
||||||
|
max: maxValue,
|
||||||
|
value: value,
|
||||||
|
onChanged: onChanged,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CustomSliderTrackShape extends RoundedRectSliderTrackShape {
|
||||||
|
const CustomSliderTrackShape();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Rect getPreferredRect({
|
||||||
|
required RenderBox parentBox,
|
||||||
|
Offset offset = Offset.zero,
|
||||||
|
required SliderThemeData sliderTheme,
|
||||||
|
bool isEnabled = false,
|
||||||
|
bool isDiscrete = false,
|
||||||
|
}) {
|
||||||
|
final trackHeight = sliderTheme.trackHeight;
|
||||||
|
final trackLeft = offset.dx;
|
||||||
|
final trackTop = offset.dy + (parentBox.size.height - trackHeight!) / 2;
|
||||||
|
final trackWidth = parentBox.size.width;
|
||||||
|
return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue