Added Services Widget on HomeScreen

aamir_dev
faizatflutter 11 months ago
parent cbbc86d998
commit cf13f4b44e

@ -1,26 +1,25 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:easy_localization/easy_localization.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/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart';
import 'package:mc_common_app/view_models/service_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/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/tab/role_type_tab.dart';
import 'package:mc_common_app/widgets/row_with_arrow.dart';
import 'package:mc_common_app/widgets/tab/role_type_tab.dart';
import 'package:provider/provider.dart';
class BranchListPage extends StatelessWidget {
@ -144,7 +143,7 @@ class BranchListPage extends StatelessWidget {
),
],
),
2.height,
5.height,
// branchModel.distanceKm == null
// ? const SizedBox()
// : Row(

@ -1,6 +1,5 @@
import 'dart:async';
import 'dart:developer';
import 'package:car_provider_app/main.dart';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';

@ -1,15 +1,16 @@
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:car_provider_app/views/branch_management/services/duplication/sheet/approved_branches_list_sheet.dart';
import 'package:car_provider_app/views/branch_management/services/duplication/sheet/items_selection_sheet.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.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:flutter_svg/flutter_svg.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/services_models/item_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:mc_common_app/widgets/bottom_sheet.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
@ -17,12 +18,11 @@ import 'package:mc_common_app/widgets/dropdown/dropdown_text.dart';
import 'package:mc_common_app/widgets/empty_widget.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class MatchedServicesPage extends StatefulWidget {
final MatchServicesArguments? matchServicesArguments;
const MatchedServicesPage(this.matchServicesArguments, {Key? key}) : super(key: key);
const MatchedServicesPage(this.matchServicesArguments, {super.key});
@override
State<MatchedServicesPage> createState() => _MatchedServicesPageState();
@ -39,7 +39,11 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
}
getMatchedServices() {
serviceVM.getAllMatchedServices(widget.matchServicesArguments!.oldBranch, widget.matchServicesArguments!.newBranch, widget.matchServicesArguments!.categoryId);
serviceVM.getAllMatchedServices(
widget.matchServicesArguments!.oldBranch,
widget.matchServicesArguments!.newBranch,
widget.matchServicesArguments!.categoryId,
);
}
@override
@ -53,47 +57,41 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
height: double.infinity,
child: Column(
children: [
DropDownText(widget.matchServicesArguments!.oldBranchName).toContainer(
padding: const EdgeInsets.only(
left: 14,
right: 14,
top: 21,
),
12.height,
DropDownText(
title: widget.matchServicesArguments!.oldBranchName,
showDropDownIcon: false,
),
12.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Checkbox(
GestureDetector(
onTap: () {
// Toggle the checkbox value when the row is tapped
bool newValue = !context.read<ServiceVM>().isAllSelected;
serviceVM.selectAllServices(newValue);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
SizedBox(
height: 30,
width: 30,
child: Checkbox(
value: context.watch<ServiceVM>().isAllSelected,
onChanged: (v) {
serviceVM.selectAllServices(v ?? false);
},
),
LocaleKeys.selectAll.tr().toText(isBold: true)
],
),
Container(
alignment: Alignment.centerRight,
margin: const EdgeInsets.symmetric(horizontal: 14, vertical: 7),
child: LocaleKeys.unselectAll.tr().toText(
color: MyColors.primaryColor,
isUnderLine: true,
isBold: true,
),
).onPress(() {
serviceVM.selectAllServices(false);
}),
],
),
LocaleKeys.selectAll.tr().toText(fontSize: 14),
],
),
),
12.height,
Expanded(
child: Consumer<ServiceVM>(builder: (context, model, _) {
if (model.matchedServices == null) {
child: Consumer<ServiceVM>(builder: (context, ServiceVM serviceVM, _) {
if (serviceVM.matchedServices == null) {
return const Center(child: CircularProgressIndicator());
} else if (model.matchedServices!.isEmpty) {
} else if (serviceVM.matchedServices!.isEmpty) {
return EmptyWidget(text: LocaleKeys.noServicesAvailable.tr(), isWrappedColumn: false);
}
return ListView.separated(
@ -103,13 +101,13 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Checkbox(
value: model.matchedServices![index].isExpandedOrSelected,
value: serviceVM.matchedServices![index].isExpandedOrSelected,
onChanged: (v) {
if (model.matchedServices![index].serviceItems!.isEmpty) {
Utils.showToast(LocaleKeys.noItemsToShow.tr());
if (serviceVM.matchedServices![index].serviceItems!.isEmpty) {
Utils.showToast(LocaleKeys.noAvailableItems.tr());
} else {
model.matchedServices![index].isExpandedOrSelected = v ?? false;
model.updateServiceItem(index, model.matchedServices![index].isExpandedOrSelected);
serviceVM.matchedServices![index].isExpandedOrSelected = v ?? false;
serviceVM.updateServiceItem(index, serviceVM.matchedServices![index].isExpandedOrSelected);
}
},
),
@ -118,8 +116,9 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
model.matchedServices![index].serviceDescription.toString().toText(fontSize: 16, isBold: true),
"${model.matchedServices![index].serviceItems!.where((c) => c.isUpdateOrSelected == true).length} items selected out of ${model.matchedServices![index].serviceItems!.length}".toText(color: MyColors.lightTextColor)
serviceVM.matchedServices![index].serviceDescription.toString().toText(fontSize: 16, isBold: true),
"${serviceVM.matchedServices![index].serviceItems!.where((c) => c.isUpdateOrSelected == true).length} items selected out of ${serviceVM.matchedServices![index].serviceItems!.length}"
.toText(color: MyColors.lightTextColor)
],
),
),
@ -134,9 +133,9 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
showMyBottomSheet(
context,
child: ItemsSelectionSheet(
model.matchedServices![index].serviceItems ?? [],
serviceVM.matchedServices![index].serviceItems ?? [],
onItemCopied: (List<ItemData> selected) {
model.copyItems(index, selected);
serviceVM.copyItems(index, selected);
},
),
);
@ -147,7 +146,7 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
return 8.height;
},
padding: const EdgeInsets.symmetric(horizontal: 14),
itemCount: model.matchedServices!.length,
itemCount: serviceVM.matchedServices!.length,
);
}),
),
@ -164,7 +163,7 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
},
),
],
),
).padding(const EdgeInsets.symmetric(horizontal: 14)),
),
);
}

@ -1,8 +1,6 @@
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
@ -10,11 +8,9 @@ import 'package:mc_common_app/models/provider_branches_models/branch_detail_mode
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter_svg/svg.dart';
import 'package:geolocator/geolocator.dart';
class MatchServicesArguments {
int oldBranch, newBranch, categoryId;
@ -24,9 +20,9 @@ class MatchServicesArguments {
}
class ApprovedBranchesListSheet extends StatelessWidget {
int newBranch, categoryId;
final int branchId, categoryId;
ApprovedBranchesListSheet({required this.newBranch, required this.categoryId, Key? key}) : super(key: key);
const ApprovedBranchesListSheet({required this.branchId, required this.categoryId, super.key});
@override
Widget build(BuildContext context) {
@ -37,10 +33,8 @@ class ApprovedBranchesListSheet extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"Select Branch".toText(fontSize: 20, isBold: true),
"Select the branch to copy their items to this branch. You can modify the selection at any time.".toText(
fontSize: 12,
),
LocaleKeys.selectBranch.tr().toText(fontSize: 20, isBold: true),
LocaleKeys.selectBranchToCopyServices.tr().toText(fontSize: 12),
12.height,
Expanded(
child: Consumer<ServiceVM>(
@ -50,25 +44,20 @@ class ApprovedBranchesListSheet extends StatelessWidget {
} else {
List<BranchDetailModel> branches = [];
if (model.branches!.data != null) {
branches = model.branches!.data!.serviceProviderBranch!.where((element) => model.selectedBranchStatus == element.statusId).toList();
branches = model.branches!.data!.serviceProviderBranch!.where((element) => element.branchStatus == BranchStatusEnum.approvedOrActive && element.id != branchId).toList();
}
return branches.isEmpty
? Center(child: Text(LocaleKeys.no_branch.tr()))
? Center(child: Text(LocaleKeys.noBranchFound.tr()))
: ListView.separated(
itemBuilder: (context, index) {
return Row(
children: [
Container(
width: 74,
height: 50,
decoration: const BoxDecoration(
color: MyColors.darkPrimaryColor,
borderRadius: BorderRadius.all(Radius.circular(8)),
),
padding: const EdgeInsets.all(6),
child: SvgPicture.asset(
MyAssets.icBranches,
color: Colors.white,
SizedBox(
width: 70,
height: 55,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(8)),
child: branches[index].branchProfileImage.buildNetworkImage(fit: BoxFit.cover),
),
),
12.width,
@ -77,22 +66,6 @@ class ApprovedBranchesListSheet extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
children: [
const Icon(
Icons.place,
size: 12,
color: MyColors.darkPrimaryColor,
),
Geolocator.distanceBetween(AppState().currentLocation.latitude, AppState().currentLocation.latitude, double.parse(branches[index].latitude ?? "0"),
double.parse(branches[index].longitude ?? "0"))
.toStringAsFixed(2)
.toText(
fontSize: 12,
color: MyColors.darkPrimaryColor,
)
],
),
Text(
branches[index].branchName ?? "",
style: const TextStyle(
@ -100,15 +73,12 @@ class ApprovedBranchesListSheet extends StatelessWidget {
fontWeight: FontWeight.bold,
),
),
"Tap to select".toText(fontSize: 10, color: MyColors.grey70Color),
"${LocaleKeys.totalNumberOfServices.tr()} ${branches[index].branchServices!.length}".toText(fontSize: 10, color: MyColors.grey70Color),
],
),
),
12.width,
const Icon(
Icons.arrow_forward_rounded,
size: 16,
),
const Icon(Icons.arrow_forward_rounded, size: 16),
],
).toContainer(isShadowEnabled: true).onPress(() async {
// branches[index].countryID = model.branchs!.data!.countryID;
@ -119,7 +89,7 @@ class ApprovedBranchesListSheet extends StatelessWidget {
arguments: MatchServicesArguments(
oldBranch: branches[index].id ?? 0,
oldBranchName: branches[index].branchName ?? "",
newBranch: newBranch,
newBranch: branchId,
categoryId: categoryId,
),
);

@ -104,7 +104,7 @@ class _ServicesListPageState extends State<ServicesListPage> {
showMyBottomSheet(
context,
child: ApprovedBranchesListSheet(
newBranch: int.parse(categoryData.branchId ?? ''),
branchId: int.parse(categoryData.branchId ?? ''),
categoryId: categoryData.id ?? 0,
),
);

@ -1,17 +1,13 @@
import 'package:car_provider_app/views/dashboard/widget/my_service_provider.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.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/view_models/dashboard_view_model_provider.dart';
import 'package:mc_common_app/views/advertisement/components/ads_list_widget.dart';
import 'package:mc_common_app/views/appointments/widgets/common_appointment_slider_widget.dart';
@ -19,10 +15,9 @@ import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/view_all_widget.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class HomeFragment extends StatelessWidget {
const HomeFragment({Key? key}) : super(key: key);
const HomeFragment({super.key});
@override
Widget build(BuildContext context) {
@ -64,23 +59,15 @@ class HomeFragment extends StatelessWidget {
context.read<DashboardVMProvider>().onNavbarTapped(1);
},
).horPaddingMain(),
// const AppointmentSliderWidget().horPaddingMain(),
//TODO TESTING PENDING
if (AppState().currentAppType == AppType.provider && context.read<AppointmentsVM>().myUpComingAppointments.isEmpty) ...[
LocaleKeys.noUpcomingAppointments.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium).paddingAll(21),
] else ...[
CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) {
navigateWithName(context, AppRoutes.appointmentDetailList, arguments: value);
},
)
.toWhiteContainer(
width: double.infinity,
backgroundColor: Colors.transparent,
)
.margin(left: 21, right: 21),
],
CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) => navigateWithName(
context,
AppRoutes.appointmentDetailList,
arguments: value,
)).toWhiteContainer(width: double.infinity, backgroundColor: Colors.transparent).margin(
left: 21,
right: 21,
),
24.height,
ViewAllWidget(
title: LocaleKeys.myBranches.tr(),

@ -42,7 +42,9 @@ dependencies:
mc_common_app:
# path: D:\Development\car_common_app
# path: /Users/amir/StudioProjects/car_common_app
path: /Volumes/Data/Projects/Flutter/car_common_app
# path: /Volumes/Data/Projects/Flutter/car_common_app
path: /Users/faizhashmi/Development/Projects/MyProjects/CloudSolutions/car_common_app

Loading…
Cancel
Save