spare part ui implemented
parent
e714fed62c
commit
b56b998125
@ -0,0 +1,207 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/controllers/providers/api/user_provider.dart';
|
||||
import 'package:test_sa/extensions/context_extension.dart';
|
||||
import 'package:test_sa/extensions/int_extensions.dart';
|
||||
import 'package:test_sa/extensions/text_extensions.dart';
|
||||
import 'package:test_sa/extensions/widget_extensions.dart';
|
||||
import 'package:test_sa/models/enums/user_types.dart';
|
||||
import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart';
|
||||
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
|
||||
import 'package:test_sa/models/new_models/work_order_detail_model.dart';
|
||||
import 'package:test_sa/models/service_request/spare_parts.dart';
|
||||
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
|
||||
import 'package:test_sa/models/service_request/supplier_details.dart';
|
||||
import 'package:test_sa/modules/cm_module/cm_detail_provider.dart';
|
||||
import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
|
||||
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
|
||||
import 'package:test_sa/modules/cm_module/views/forms/maintenance_request/maintenance_request_main.dart';
|
||||
import 'package:test_sa/modules/cm_module/views/forms/spare_part/spare_part_request.dart';
|
||||
import 'package:test_sa/new_views/app_style/app_color.dart';
|
||||
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
|
||||
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
|
||||
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
|
||||
import 'package:test_sa/views/widgets/images/files_list.dart';
|
||||
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
|
||||
import 'package:test_sa/views/widgets/item_views/info_text_widget.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
|
||||
import 'package:test_sa/views/widgets/requests/request_status.dart';
|
||||
|
||||
class PmActivitiesListView extends StatefulWidget {
|
||||
static const String id = "/activities-list";
|
||||
|
||||
const PmActivitiesListView({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_PmActivitiesListViewState createState() {
|
||||
return _PmActivitiesListViewState();
|
||||
}
|
||||
}
|
||||
|
||||
class _PmActivitiesListViewState extends State<PmActivitiesListView> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
List<Activities> reOrderActivities = [];
|
||||
|
||||
List<Activities> activities = [];
|
||||
|
||||
bool disableNewActivity = false;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
UserProvider userProvider = Provider.of<UserProvider>(context);
|
||||
return Scaffold(
|
||||
appBar: const DefaultAppBar(
|
||||
title: 'PM Activities',
|
||||
// actions: [if (!showReorderView) IconButton(onPressed: () => activities.isEmpty ? null : setState(() => showReorderView = true), icon: const Icon(Icons.reorder_rounded))],
|
||||
),
|
||||
|
||||
///TODO replace with pm provider and data from pm provider
|
||||
body: Consumer<CMDetailProvider>(builder: (context, CMDetailProvider requestDetailProvider, child) {
|
||||
activities = requestDetailProvider.currentWorkOrder!.data!.activities;
|
||||
requestDetailProvider.lastVisitedRequestActivityId = (activities.isNotEmpty ? activities.last.id : -1)!;
|
||||
if (activities.isNotEmpty && (activities.last.activityStatus!.value == 14 || activities.last.activityStatus!.value == 19)) {
|
||||
disableNewActivity = true;
|
||||
} else {
|
||||
disableNewActivity = false;
|
||||
}
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
(activities.isEmpty && reOrderActivities.isEmpty)
|
||||
? NoDataFound(message: context.translation.noDataFound).center.expanded
|
||||
: ListView.separated(
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemCount: activities.length,
|
||||
separatorBuilder: (czt, index) => 16.height,
|
||||
itemBuilder: (context, index) {
|
||||
return sparePartActivityCard(requestDetailProvider: requestDetailProvider, userProvider: userProvider, context: context, activity: activities[index]);
|
||||
},
|
||||
).expanded,
|
||||
if (userProvider.user!.type == UsersTypes.engineer &&
|
||||
(requestDetailProvider.currentWorkOrder?.data?.status?.value != 5 && requestDetailProvider.currentWorkOrder?.data?.status?.value != 3))
|
||||
FooterActionButton.footerContainer(
|
||||
context: context,
|
||||
child: AppFilledButton(
|
||||
label: 'Create New Spare Part',
|
||||
maxWidth: true,
|
||||
buttonColor: AppColor.primary10,
|
||||
loading: requestDetailProvider.isLoading,
|
||||
disableButton: disableNewActivity,
|
||||
onPressed: () async {
|
||||
// ServiceRequestBottomSheet.activityTypeBottomSheet(context: context);
|
||||
},
|
||||
))
|
||||
],
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
Widget sparePartActivityCard({required CMDetailProvider requestDetailProvider, required UserProvider userProvider, required BuildContext context, required Activities activity}) {
|
||||
bool showActionButtons = userProvider.user!.userID == requestDetailProvider.currentWorkOrder?.data?.assignedEmployee?.userId &&
|
||||
userProvider.user!.type == UsersTypes.engineer &&
|
||||
requestDetailProvider.currentWorkOrder?.data?.status?.value != 5 &&
|
||||
requestDetailProvider.currentWorkOrder?.data?.status?.value != 3;
|
||||
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
StatusLabel(
|
||||
label: activity.activityStatus?.name,
|
||||
textColor: AppColor.white10,
|
||||
backgroundColor: AppColor.primary10,
|
||||
),
|
||||
if (showActionButtons)
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
"edit_icon".toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).onPress(() {
|
||||
editSparePartRequest(context: context, requestDetailProvider: requestDetailProvider, activity: activity);
|
||||
}),
|
||||
12.width,
|
||||
"delete_icon".toSvgAsset(height: 24, width: 24).onPress(() async {
|
||||
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
|
||||
int status = await requestDetailProvider.deleteActivitySparePart(id: activity.id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
|
||||
if (status == 200) {
|
||||
await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
|
||||
Navigator.pop(context);
|
||||
} else {
|
||||
Navigator.pop(context);
|
||||
}
|
||||
}),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
6.height,
|
||||
InfoHeaderWidget(activity.activityType?.cleanupWhitespace.capitalizeFirstOfEach ?? '-'),
|
||||
InfoTextWidget(
|
||||
label: context.translation.partName,
|
||||
value: activity.activitySparePart?.partCatalogItem?.partName,
|
||||
),
|
||||
InfoTextWidget(
|
||||
label: context.translation.partNo,
|
||||
value: activity.activitySparePart?.partCatalogItem?.partNumber,
|
||||
showArrow: true,
|
||||
),
|
||||
if (activity.activitySparePart?.acitiySparePartAttachments?.isNotEmpty ?? false) ...[
|
||||
6.height,
|
||||
const Divider().defaultStyle(context),
|
||||
FilesList(images: activity.activitySparePart!.acitiySparePartAttachments!.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()),
|
||||
],
|
||||
],
|
||||
).toShadowContainer(context, showShadow: false).onPress(() {
|
||||
///Move to cost page ..
|
||||
// if (showActionButtons) return;
|
||||
// if (requestDetailProvider.isReadOnlyRequest) {
|
||||
// editSparePartRequest(context: context, requestDetailProvider: requestDetailProvider, activity: activity);
|
||||
// } else if (userProvider.user!.userID == requestDetailProvider.currentWorkOrder?.data?.assignedEmployee?.userId) {
|
||||
// requestDetailProvider.isReadOnlyRequest = true;
|
||||
// editSparePartRequest(context: context, requestDetailProvider: requestDetailProvider, activity: activity);
|
||||
// }
|
||||
});
|
||||
}
|
||||
|
||||
void editSparePartRequest({required BuildContext context, required CMDetailProvider requestDetailProvider, required Activities activity}) async {
|
||||
requestDetailProvider.sparePartHelperModel = SparePartHelperModel(
|
||||
id: activity.id,
|
||||
workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId,
|
||||
comment: activity.activitySparePart?.comment,
|
||||
sparePartAttachments: activity.activitySparePart?.acitiySparePartAttachments ?? [],
|
||||
activityStatus: activity.activityStatus,
|
||||
sparePart: SparePart(
|
||||
id: activity.activitySparePart?.partCatalogItem?.id,
|
||||
partName: activity.activitySparePart?.partCatalogItem?.partName,
|
||||
partNo: activity.activitySparePart?.partCatalogItem?.partNumber,
|
||||
oracleCode: activity.activitySparePart?.partCatalogItem?.oracleCode),
|
||||
quantity: activity.activitySparePart?.quantity,
|
||||
installQty: activity.activitySparePart?.installQty,
|
||||
returnQty: activity.activitySparePart?.returnQty,
|
||||
activityStatusId: activity.activityStatus?.id,
|
||||
);
|
||||
|
||||
requestDetailProvider.updateSparePartHelperModel(requestDetailProvider.sparePartHelperModel);
|
||||
|
||||
Navigator.of(context).push(MaterialPageRoute(
|
||||
builder: (_) => SparePartRequest(
|
||||
model: requestDetailProvider.sparePartHelperModel,
|
||||
provider: requestDetailProvider,
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,127 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/controllers/providers/api/user_provider.dart';
|
||||
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
|
||||
import 'package:test_sa/extensions/context_extension.dart';
|
||||
import 'package:test_sa/extensions/int_extensions.dart';
|
||||
import 'package:test_sa/extensions/string_extensions.dart';
|
||||
import 'package:test_sa/extensions/text_extensions.dart';
|
||||
import 'package:test_sa/extensions/widget_extensions.dart';
|
||||
import 'package:test_sa/models/enums/user_types.dart';
|
||||
import 'package:test_sa/models/enums/work_order_next_step.dart';
|
||||
import 'package:test_sa/models/generic_attachment_model.dart';
|
||||
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
|
||||
import 'package:test_sa/models/new_models/work_order_detail_model.dart';
|
||||
import 'package:test_sa/modules/cm_module/cm_detail_provider.dart';
|
||||
import 'package:test_sa/modules/cm_module/views/forms/asset_retired/asset_retired.dart';
|
||||
import 'package:test_sa/modules/cm_module/views/forms/cost/cost_detail_form_screen.dart';
|
||||
import 'package:test_sa/new_views/app_style/app_color.dart';
|
||||
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
|
||||
import 'package:test_sa/views/widgets/equipment/asset_detail_page.dart';
|
||||
import 'package:test_sa/views/widgets/images/files_list.dart';
|
||||
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
|
||||
import 'package:test_sa/views/widgets/item_views/info_date_widget.dart';
|
||||
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
|
||||
import 'package:test_sa/views/widgets/item_views/info_text_widget.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
|
||||
import 'package:test_sa/views/widgets/requests/request_status.dart';
|
||||
import 'package:test_sa/views/widgets/sound/sound_player.dart';
|
||||
|
||||
class PmCostDetailsView extends StatefulWidget {
|
||||
PmCostDetailsView({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<PmCostDetailsView> createState() => _PmCostDetailsViewState();
|
||||
}
|
||||
|
||||
class _PmCostDetailsViewState extends State<PmCostDetailsView> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
|
||||
///TODO: replace with pm provider and data from provider and remove the extra widgets as well.
|
||||
return Consumer<CMDetailProvider>(builder: (pContext, requestProvider, _) {
|
||||
bool showCostCard = context.userProvider.user!.type == UsersTypes.engineer &&
|
||||
!requestProvider.isReadOnlyRequest &&
|
||||
requestProvider.currentWorkOrder?.data?.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity;
|
||||
|
||||
return requestProvider.isLoading
|
||||
? CircularProgressIndicator(color: AppColor.loadingColor(context)).center
|
||||
: requestProvider.currentWorkOrder == null
|
||||
? const NoDataFound()
|
||||
: Column(
|
||||
children: [
|
||||
SingleChildScrollView(
|
||||
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showCostCard) ...[
|
||||
16.height,
|
||||
costCard(context, requestProvider),
|
||||
],
|
||||
],
|
||||
),
|
||||
).expanded,
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Widget costCard(BuildContext context, CMDetailProvider provider) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
InfoHeader16Widget("Cost"),
|
||||
const Spacer(),
|
||||
if (!provider.isReadOnlyRequest)
|
||||
|
||||
///TODO replace with exact provider and data from provider and remove the extra widgets as well.
|
||||
"edit_icon".toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).onPress(() async {
|
||||
WorkOrderData currentWorkOrderData = provider.currentWorkOrder!.data!;
|
||||
provider.workOrderCostModel = WorkOrderCostModel(
|
||||
workOrderId: currentWorkOrderData.requestId,
|
||||
labourCost: currentWorkOrderData.labourCost,
|
||||
sparePartCost: currentWorkOrderData.sparePartCost,
|
||||
travelCost: currentWorkOrderData.travelCost,
|
||||
qAmount: currentWorkOrderData.qAmount,
|
||||
prNo: currentWorkOrderData.prNo,
|
||||
poNo: currentWorkOrderData.poNo,
|
||||
mrNo: currentWorkOrderData.mrNo,
|
||||
exchangeCost: currentWorkOrderData.exchangeCost,
|
||||
);
|
||||
provider.refreshTimer = false;
|
||||
await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => CostDetailFormScreen(
|
||||
isEdit: true,
|
||||
model: provider.workOrderCostModel,
|
||||
provider: provider,
|
||||
)));
|
||||
provider.refreshTimer = true;
|
||||
}),
|
||||
],
|
||||
),
|
||||
InfoTextWidget(label: 'Spare Part Cost'.addTranslation, value: provider.currentWorkOrder?.data?.sparePartCost?.toString() ?? '-'),
|
||||
InfoTextWidget(label: 'Labor Cost'.addTranslation, value: provider.currentWorkOrder?.data?.labourCost?.toString() ?? '-'),
|
||||
InfoTextWidget(label: 'Travel Cost'.addTranslation, value: provider.currentWorkOrder?.data?.travelCost?.toString() ?? '-'),
|
||||
InfoTextWidget(label: 'Quot Amount'.addTranslation, value: provider.currentWorkOrder?.data?.qAmount?.toString() ?? '-'),
|
||||
InfoTextWidget(label: 'PR No'.addTranslation, value: provider.currentWorkOrder?.data?.prNo?.toString() ?? '-'),
|
||||
InfoTextWidget(label: 'PO No'.addTranslation, value: provider.currentWorkOrder?.data?.poNo?.toString() ?? '-'),
|
||||
InfoTextWidget(label: 'MR No'.addTranslation, value: provider.currentWorkOrder?.data?.mrNo?.toString() ?? '-'),
|
||||
InfoTextWidget(label: 'Exchange Cost'.addTranslation, value: provider.currentWorkOrder?.data?.exchangeCost?.toString() ?? '-'),
|
||||
],
|
||||
).toShadowContainer(context);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue