Added Damage Pictures in ad_detail_view and extend edit ad
parent
424942bf58
commit
dfa57dbe55
@ -0,0 +1,36 @@
|
|||||||
|
class BranchRatingModel {
|
||||||
|
int? id;
|
||||||
|
String? title;
|
||||||
|
String? review;
|
||||||
|
int? ratNo;
|
||||||
|
int? serviceProviderBranchID;
|
||||||
|
String? serviceProviderBranchName;
|
||||||
|
int? customerID;
|
||||||
|
String? customerName;
|
||||||
|
|
||||||
|
BranchRatingModel({this.id, this.title, this.review, this.ratNo, this.serviceProviderBranchID, this.serviceProviderBranchName, this.customerID, this.customerName});
|
||||||
|
|
||||||
|
BranchRatingModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
id = json['id'];
|
||||||
|
title = json['title'];
|
||||||
|
review = json['review'];
|
||||||
|
ratNo = json['ratNo'];
|
||||||
|
serviceProviderBranchID = json['serviceProviderBranchID'];
|
||||||
|
serviceProviderBranchName = json['serviceProviderBranchName'];
|
||||||
|
customerID = json['customerID'];
|
||||||
|
customerName = json['customerName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['id'] = id;
|
||||||
|
data['title'] = title;
|
||||||
|
data['review'] = review;
|
||||||
|
data['ratNo'] = ratNo;
|
||||||
|
data['serviceProviderBranchID'] = serviceProviderBranchID;
|
||||||
|
data['serviceProviderBranchName'] = serviceProviderBranchName;
|
||||||
|
data['customerID'] = customerID;
|
||||||
|
data['customerName'] = customerName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,95 +0,0 @@
|
|||||||
import 'package:flutter/material.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/advertisment_models/ad_details_model.dart';
|
|
||||||
import 'package:mc_common_app/models/chat_models/buyers_chat_for_ads_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/chat_view_model.dart';
|
|
||||||
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
|
|
||||||
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
|
||||||
|
|
||||||
class AdsBuyerChatsListView extends StatelessWidget {
|
|
||||||
final List<BuyersChatForAdsModel> buyersListViewArguments;
|
|
||||||
|
|
||||||
const AdsBuyerChatsListView({super.key, required this.buyersListViewArguments});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: CustomAppBar(title: LocaleKeys.chat.tr()),
|
|
||||||
body: buyersListViewArguments.isEmpty
|
|
||||||
? Center(child: LocaleKeys.noOffersShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor))
|
|
||||||
: ListView.separated(
|
|
||||||
itemCount: buyersListViewArguments.length,
|
|
||||||
padding: const EdgeInsets.all(16),
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
BuyersChatForAdsModel chatForAdsModel = buyersListViewArguments[index];
|
|
||||||
return Column(
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
(chatForAdsModel.buyerName ?? "").toText(fontSize: 16, isBold: true),
|
|
||||||
if (chatForAdsModel.unReadMessagesCount != null && chatForAdsModel.unReadMessagesCount! > 0) ...[
|
|
||||||
Center(
|
|
||||||
child: "${chatForAdsModel.unReadMessagesCount ?? "1"}".toText(
|
|
||||||
color: Colors.white,
|
|
||||||
isBold: true,
|
|
||||||
fontSize: 10,
|
|
||||||
),
|
|
||||||
).toContainer(
|
|
||||||
backgroundColor: MyColors.redColor,
|
|
||||||
borderRadius: 100,
|
|
||||||
paddingAll: 1,
|
|
||||||
width: 22,
|
|
||||||
height: 22,
|
|
||||||
),
|
|
||||||
]
|
|
||||||
],
|
|
||||||
),
|
|
||||||
8.height,
|
|
||||||
Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
(chatForAdsModel.lastMessage ?? "").toText(color: MyColors.lightTextColor, fontSize: 12),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
|
|
||||||
if (chatForAdsModel.lastMessageDateTime != null) ...[
|
|
||||||
DateTime.parse(chatForAdsModel.lastMessageDateTime!).getTimeAgo().toText(color: MyColors.lightTextColor),
|
|
||||||
],
|
|
||||||
// const Icon(
|
|
||||||
// Icons.arrow_forward,
|
|
||||||
// color: MyColors.darkIconColor,
|
|
||||||
// size: 18,
|
|
||||||
// ),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
).onPress(() async {
|
|
||||||
ChatViewArgumentsForAd chatViewArgumentsForAd = ChatViewArgumentsForAd(receiverUserID: chatForAdsModel.buyerUserID, adsID: chatForAdsModel.adsID);
|
|
||||||
|
|
||||||
ChatViewArguments chatViewArguments = ChatViewArguments(chatTypeEnum: ChatTypeEnum.ads, chatViewArgumentsForAd: chatViewArgumentsForAd);
|
|
||||||
|
|
||||||
final chatVM = context.read<ChatVM>();
|
|
||||||
await chatVM.getUsersChatMessagesForAd(context: context, isForBuyer: false, adsChatBuyerId: chatForAdsModel.id).whenComplete(
|
|
||||||
() => navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments),
|
|
||||||
);
|
|
||||||
}).toContainer(isShadowEnabled: true);
|
|
||||||
},
|
|
||||||
separatorBuilder: (context, index) => 16.height,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,118 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/widgets.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/advertisment_models/ad_details_model.dart';
|
||||||
|
import 'package:mc_common_app/models/chat_models/buyers_chat_for_ads_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/chat_view_model.dart';
|
||||||
|
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
|
||||||
|
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:sizer/sizer.dart';
|
||||||
|
|
||||||
|
class AdsBuyerChatsView extends StatelessWidget {
|
||||||
|
final List<BuyersChatForAdsModel> buyersListViewArguments;
|
||||||
|
|
||||||
|
const AdsBuyerChatsView({super.key, required this.buyersListViewArguments});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: CustomAppBar(title: LocaleKeys.chat.tr()),
|
||||||
|
body: buyersListViewArguments.isEmpty
|
||||||
|
? Center(child: LocaleKeys.noOffersShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor))
|
||||||
|
: ListView.separated(
|
||||||
|
itemCount: buyersListViewArguments.length,
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
BuyersChatForAdsModel chatForAdsModel = buyersListViewArguments[index];
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
MyAssets.bnCar,
|
||||||
|
width: 34,
|
||||||
|
height: 34,
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
).toCircle(borderRadius: 100),
|
||||||
|
SizedBox(width: 2.w),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
(chatForAdsModel.buyerName ?? "").toText(fontSize: 16, isBold: true),
|
||||||
|
if (chatForAdsModel.unReadMessagesCount != null && chatForAdsModel.unReadMessagesCount! > 0) ...[
|
||||||
|
Center(
|
||||||
|
child: "${chatForAdsModel.unReadMessagesCount ?? "1"}".toText(
|
||||||
|
color: Colors.white,
|
||||||
|
isBold: true,
|
||||||
|
fontSize: 10,
|
||||||
|
),
|
||||||
|
).toContainer(
|
||||||
|
backgroundColor: MyColors.redColor,
|
||||||
|
borderRadius: 100,
|
||||||
|
paddingAll: 1,
|
||||||
|
width: 22,
|
||||||
|
height: 22,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
],
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Flexible(child: ("${chatForAdsModel.lastMessage}").toText(color: MyColors.lightTextColor, fontSize: 12)),
|
||||||
|
SizedBox(width: 5.w),
|
||||||
|
if (chatForAdsModel.lastMessageDateTime != null) ...[
|
||||||
|
DateTime.parse(chatForAdsModel.lastMessageDateTime!).getTimeAgo().toText(color: MyColors.lightTextColor),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
),
|
||||||
|
2.height,
|
||||||
|
const Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Icons.arrow_forward,
|
||||||
|
color: MyColors.darkIconColor,
|
||||||
|
size: 18,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).onPress(() async {
|
||||||
|
ChatViewArgumentsForAd chatViewArgumentsForAd = ChatViewArgumentsForAd(receiverUserID: chatForAdsModel.buyerUserID, adsID: chatForAdsModel.adsID);
|
||||||
|
|
||||||
|
ChatViewArguments chatViewArguments = ChatViewArguments(chatTypeEnum: ChatTypeEnum.ads, chatViewArgumentsForAd: chatViewArgumentsForAd);
|
||||||
|
|
||||||
|
final chatVM = context.read<ChatVM>();
|
||||||
|
await chatVM
|
||||||
|
.getUsersChatMessagesForAd(context: context, isForBuyer: false, adsChatBuyerId: chatForAdsModel.id, senderName: chatForAdsModel.buyerName)
|
||||||
|
.whenComplete(() => navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments));
|
||||||
|
}).toContainer(isShadowEnabled: true);
|
||||||
|
},
|
||||||
|
separatorBuilder: (context, index) => 16.height,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,143 @@
|
|||||||
|
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/advertisment_models/vehicle_details_models.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/widgets/button/show_fill_button.dart';
|
||||||
|
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||||
|
import 'package:mc_common_app/widgets/txt_field.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
|
class AdDamagePartsSelectionSheet extends StatefulWidget {
|
||||||
|
const AdDamagePartsSelectionSheet({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AdDamagePartsSelectionSheet> createState() => _AdDamagePartsSelectionSheetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AdDamagePartsSelectionSheetState extends State<AdDamagePartsSelectionSheet> {
|
||||||
|
bool checkBoxValue = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
AdVM adVM = context.watch<AdVM>();
|
||||||
|
return SizedBox(
|
||||||
|
height: MediaQuery.of(context).size.height * 0.85,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
margin: const EdgeInsets.all(8),
|
||||||
|
height: 8,
|
||||||
|
width: 60,
|
||||||
|
decoration: const BoxDecoration(color: MyColors.lightTextColor, borderRadius: BorderRadius.all(Radius.circular(20))),
|
||||||
|
),
|
||||||
|
12.height,
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.damagePartList.tr().toText(fontSize: 24, isBold: true),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
TxtField(
|
||||||
|
value: adVM.damagePartSearchValue,
|
||||||
|
errorValue: "",
|
||||||
|
hint: LocaleKeys.searchPart.tr(),
|
||||||
|
onChanged: (value) {
|
||||||
|
adVM.onSearchChangedForDamagePart(value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
Expanded(
|
||||||
|
child: ListView.builder(
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: adVM.vehiclePartsSearchResults.isEmpty ? adVM.vehicleDamageParts.length : adVM.vehiclePartsSearchResults.length,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
VehiclePartModel vehiclePart = adVM.vehiclePartsSearchResults.isEmpty ? adVM.vehicleDamageParts[index] : adVM.vehiclePartsSearchResults[index];
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
// CheckboxListTile(
|
||||||
|
// value: false,
|
||||||
|
// visualDensity: VisualDensity.compact,
|
||||||
|
// contentPadding: EdgeInsets.zero,
|
||||||
|
// controlAffinity: ListTileControlAffinity.leading,
|
||||||
|
// title: "Rear Break Light".toText(
|
||||||
|
// fontSize: 16,
|
||||||
|
// isBold: true,
|
||||||
|
// ),
|
||||||
|
// onChanged: (value) {},
|
||||||
|
// ),
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
if (vehiclePart.isSelected!) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
adVM.vehicleDamageParts[index].isChecked = !(adVM.vehicleDamageParts[index].isChecked!);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
height: 40.0,
|
||||||
|
width: 30.0,
|
||||||
|
child: Transform.scale(
|
||||||
|
scale: 1.3,
|
||||||
|
child: Checkbox(
|
||||||
|
value: vehiclePart.isSelected! ? true : vehiclePart.isChecked,
|
||||||
|
activeColor: vehiclePart.isSelected! ? MyColors.lightTextColor : MyColors.primaryColor,
|
||||||
|
onChanged: (value) {
|
||||||
|
if (vehiclePart.isSelected!) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
adVM.vehicleDamageParts[index].isChecked = !(adVM.vehicleDamageParts[index].isChecked!);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(width: 20),
|
||||||
|
vehiclePart.partName.toString().toText(
|
||||||
|
fontSize: 16,
|
||||||
|
color: vehiclePart.isSelected! ? MyColors.lightTextColor : MyColors.black,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Divider(thickness: 1),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
child: ShowFillButton(
|
||||||
|
title: LocaleKeys.addDamagePart.tr(),
|
||||||
|
onPressed: () {
|
||||||
|
for (var value in adVM.vehicleDamageParts) {
|
||||||
|
if (value.isChecked! && !value.isSelected!) {
|
||||||
|
adVM.addNewDamagePartCard(
|
||||||
|
damageCard: VehicleDamageCard(
|
||||||
|
partImageErrorValue: "",
|
||||||
|
partImages: null,
|
||||||
|
partSelectedId: SelectionModel(selectedOption: value.partName!, selectedId: value.id!, errorValue: ""),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
value.isChecked = false;
|
||||||
|
value.isSelected = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
).paddingOnly(bottom: 10),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
).horPaddingMain();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,91 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:developer';
|
||||||
|
|
||||||
|
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
|
||||||
|
import 'package:mc_common_app/models/general_models/widgets_models.dart';
|
||||||
|
import 'package:mc_common_app/view_models/ad_view_model.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/theme/colors.dart';
|
||||||
|
import 'package:mc_common_app/views/advertisement/components/picked_images_container_widget.dart';
|
||||||
|
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||||
|
|
||||||
|
class AdDamagePartPicturesSheet extends StatefulWidget {
|
||||||
|
final List<DamageReport> adDamageReportList;
|
||||||
|
|
||||||
|
const AdDamagePartPicturesSheet({super.key, required this.adDamageReportList});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AdDamagePartPicturesSheet> createState() => _AdDamagePartPicturesSheetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AdDamagePartPicturesSheetState extends State<AdDamagePartPicturesSheet> {
|
||||||
|
List<VehicleDamageCard> vehicleDamageCards = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
scheduleMicrotask(() => populateDamagePartPictures());
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void populateDamagePartPictures() {
|
||||||
|
for (var element in widget.adDamageReportList) {
|
||||||
|
ImageModel imageModel = ImageModel(id: element.id!, filePath: element.imageUrl!, isFromNetwork: true);
|
||||||
|
|
||||||
|
VehicleDamageCard vehicleDamageCard = VehicleDamageCard(
|
||||||
|
partSelectedId: SelectionModel(
|
||||||
|
selectedId: element.vehicleDamagePartID!,
|
||||||
|
selectedOption: element.partName ?? "",
|
||||||
|
),
|
||||||
|
partImages: [imageModel],
|
||||||
|
);
|
||||||
|
vehicleDamageCards.add(vehicleDamageCard);
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SizedBox(
|
||||||
|
height: MediaQuery.of(context).size.height / 1.2,
|
||||||
|
child: ListView.builder(
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: vehicleDamageCards.length,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
VehicleDamageCard vehicleDamageCard = vehicleDamageCards[index];
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
vehicleDamageCard.partSelectedId!.selectedOption.toText(fontSize: 18, color: MyColors.darkTextColor),
|
||||||
|
PickedFilesContainer(
|
||||||
|
pickedFiles: vehicleDamageCard.partImages ?? [],
|
||||||
|
isReview: true,
|
||||||
|
onCrossPressedSecondary: (imageIndex, filePath) {},
|
||||||
|
index: index,
|
||||||
|
onAddFilePressed: () {},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).toWhiteContainer(
|
||||||
|
width: double.infinity,
|
||||||
|
allPading: 12,
|
||||||
|
margin: const EdgeInsets.symmetric(horizontal: 21, vertical: 4),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
).paddingOnly(top: 10),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget showItem(String item, String value, {Color valueColor = Colors.black}) {
|
||||||
|
return Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
item.toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
|
||||||
|
4.width,
|
||||||
|
value.toText(fontSize: 12, color: valueColor, isBold: true),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,110 @@
|
|||||||
|
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/utils/enums.dart';
|
||||||
|
import 'package:mc_common_app/view_models/appointments_view_model.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/theme/colors.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 DamagePicturesList extends StatefulWidget {
|
||||||
|
final int serviceId;
|
||||||
|
|
||||||
|
const DamagePicturesList(this.serviceId, {super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<DamagePicturesList> createState() => _DamagePicturesListState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _DamagePicturesListState extends State<DamagePicturesList> {
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
context.read<AppointmentsVM>().getServiceItems(widget.serviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SizedBox(
|
||||||
|
height: MediaQuery.of(context).size.height / 1.2,
|
||||||
|
child: Consumer<AppointmentsVM>(
|
||||||
|
builder: (context, appointmentsVM, _) {
|
||||||
|
if (appointmentsVM.state == ViewState.busy) {
|
||||||
|
return Center(child: CircularProgressIndicator());
|
||||||
|
}
|
||||||
|
return appointmentsVM.serviceItemsFromApi.isEmpty
|
||||||
|
? const EmptyWidget()
|
||||||
|
: ListView.separated(
|
||||||
|
itemCount: appointmentsVM.serviceItemsFromApi.length,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
ItemData serviceItemModel = appointmentsVM.serviceItemsFromApi[index];
|
||||||
|
return SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
serviceItemModel.name.toString().toText(fontSize: 16, isBold: true),
|
||||||
|
4.height,
|
||||||
|
showItem(LocaleKeys.availableforAppointment.tr() + ":", (serviceItemModel.isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green),
|
||||||
|
showItem(LocaleKeys.allowingWorkshopService.tr() + ":", (serviceItemModel.isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
|
||||||
|
showItem(LocaleKeys.allowingHomeService.tr() + ":", (serviceItemModel.isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
|
||||||
|
12.height,
|
||||||
|
LocaleKeys.serviceAmount.tr().toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
|
children: [
|
||||||
|
serviceItemModel.price!.toText(fontSize: 22, isBold: true),
|
||||||
|
2.width,
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 4),
|
||||||
|
child: LocaleKeys.sar.tr().toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
// Padding(
|
||||||
|
// padding: const EdgeInsets.all(4.0),
|
||||||
|
// child: SvgPicture.asset(
|
||||||
|
// MyAssets.icEdit,
|
||||||
|
// width: 16,
|
||||||
|
// height: 16,
|
||||||
|
// ),
|
||||||
|
// )
|
||||||
|
],
|
||||||
|
),
|
||||||
|
).toWhiteContainer(width: double.infinity, allPading: 12);
|
||||||
|
},
|
||||||
|
separatorBuilder: (BuildContext context, int index) {
|
||||||
|
return 12.height;
|
||||||
|
},
|
||||||
|
padding: const EdgeInsets.all(20),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget showItem(String item, String value, {Color valueColor = Colors.black}) {
|
||||||
|
return Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
item.toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
|
||||||
|
4.width,
|
||||||
|
value.toText(fontSize: 12, color: valueColor, isBold: true),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue