apk provided to FM for asset image training

ui_ux_rollout_merge
Sikander Saleem 3 weeks ago
parent ace00bfa85
commit dbc53d62f8

@ -3,13 +3,13 @@ class URLs {
static const String appReleaseBuildNumber = "44"; static const String appReleaseBuildNumber = "44";
// static const host1 = "https://atomsm.hmg.com"; // production url static const host1 = "https://atomsm.hmg.com"; // production url
// static const host1 = "https://atomsmdev.hmg.com"; // local DEV url // static const host1 = "https://atomsmdev.hmg.com"; // local DEV url
static const host1 = "https://atomsmuat.hmg.com"; // local UAT url // static const host1 = "https://atomsmuat.hmg.com"; // local UAT url
static final String _baseUrl = "$_host/mobile"; // host local UAT // static final String _baseUrl = "$_host/mobile"; // host local UAT
// static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis // static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
// static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM
// static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module // static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module
// static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation // static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation
// static final String _baseUrl = "$_host/v6/mobile"; // for asset delivery module // static final String _baseUrl = "$_host/v6/mobile"; // for asset delivery module

@ -20,6 +20,7 @@ import 'package:test_sa/modules/cm_module/views/forms/asset_retired/asset_retire
import 'package:test_sa/modules/cm_module/views/forms/cost/cost_detail_form_screen.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/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_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/files_list.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
@ -73,43 +74,43 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
: requestProvider.currentWorkOrder == null : requestProvider.currentWorkOrder == null
? const NoDataFound() ? const NoDataFound()
: Column( : Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
workOrderDetailCard(context, requestProvider.currentWorkOrder!.data!, _userProvider, requestProvider), workOrderDetailCard(context, requestProvider.currentWorkOrder!.data!, _userProvider, requestProvider),
initialVisitCard(requestDetailProvider: requestProvider, userProvider: _userProvider), initialVisitCard(requestDetailProvider: requestProvider, userProvider: _userProvider),
12.height,
assetDetailCard(requestDetailProvider: requestProvider, userProvider: _userProvider),
12.height,
if (context.userProvider.user!.type == UsersTypes.engineer &&
!requestProvider.isReadOnlyRequest &&
requestProvider.currentWorkOrder!.data!.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[
costCard(context, requestProvider),
12.height, 12.height,
assetDetailCard(requestDetailProvider: requestProvider, userProvider: _userProvider),
12.height,
if (context.userProvider.user!.type == UsersTypes.engineer &&
!requestProvider.isReadOnlyRequest &&
requestProvider.currentWorkOrder!.data!.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[
costCard(context, requestProvider),
12.height,
],
contactInfoCard(context, requestProvider.currentWorkOrder!.data!),
20.height,
], ],
contactInfoCard(context, requestProvider.currentWorkOrder!.data!), ),
20.height, ).expanded,
], SafeArea(
), top: false,
).expanded, right: false,
SafeArea( left: false,
top: false, child: FooterActionButton.requestDetailsFooterWidget(
right: false, workOrderNextStepStatus: requestProvider.currentWorkOrder!.data!.nextStep!.workOrderNextStepEnum!,
left: false, status: requestProvider.currentWorkOrder?.data?.status,
child: FooterActionButton.requestDetailsFooterWidget( isEmpIsAssigned: requestProvider.currentWorkOrder!.data!.assignedEmployee != null,
workOrderNextStepStatus: requestProvider.currentWorkOrder!.data!.nextStep!.workOrderNextStepEnum!, activities: requestProvider.currentWorkOrder!.data?.activities ?? [],
status: requestProvider.currentWorkOrder?.data?.status, userProvider: _userProvider,
isEmpIsAssigned: requestProvider.currentWorkOrder!.data!.assignedEmployee != null, context: context),
activities: requestProvider.currentWorkOrder!.data?.activities ?? [], ).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0),
userProvider: _userProvider, ],
context: context), );
).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0),
],
);
}); });
} }
@ -135,7 +136,7 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
// spacing: 8, // spacing: 8,
runSpacing: 8, runSpacing: 8,
children: [ children: [
if (Provider.of<SettingProvider>(context, listen: false).showPriority&&workOrder.priority!=null) ...[ if (Provider.of<SettingProvider>(context, listen: false).showPriority && workOrder.priority != null) ...[
StatusLabel( StatusLabel(
label: workOrder.priority?.name, label: workOrder.priority?.name,
id: workOrder.priority?.value, id: workOrder.priority?.value,
@ -190,9 +191,19 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
], ],
), ),
8.height, 8.height,
Text( Row(
context.translation.assetInformation, spacing: 4,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), children: [
Flexible(
child: Text(
context.translation.assetInformation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
),
const Icon(Icons.open_in_new_rounded, color: AppColor.primary10, size: 21).onPress(() {
Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: workOrder.asset!.id);
})
],
), ),
8.height, 8.height,
Text( Text(

@ -9,26 +9,29 @@ class UploadingDialog extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Center( return Center(
child: Container( child: Material(
height: 150.toScreenWidth, borderRadius: BorderRadius.circular(20.0),
width: 200.toScreenWidth, child: Container(
alignment: Alignment.center, height: 150.toScreenWidth,
padding: const EdgeInsets.all(8), width: 200.toScreenWidth,
decoration: BoxDecoration( alignment: Alignment.center,
color: AppColor.neutral30, padding: const EdgeInsets.all(8),
borderRadius: BorderRadius.circular(20.0), decoration: BoxDecoration(
boxShadow: [AppStyle.boxShadow], color: AppColor.neutral30,
), borderRadius: BorderRadius.circular(20.0),
child: Column( boxShadow: [AppStyle.boxShadow],
mainAxisSize: MainAxisSize.min, ),
children: [ child: Column(
const CircularProgressIndicator(strokeWidth: 3), mainAxisSize: MainAxisSize.min,
16.height, children: [
Text( const CircularProgressIndicator(strokeWidth: 3),
"Uploading...", 16.height,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: AppColor.textColor(context), height: 35 / 24, letterSpacing: -0.96), Text(
) "Uploading...",
], style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: AppColor.textColor(context), height: 35 / 24, letterSpacing: -0.96),
)
],
),
), ),
), ),
); );

@ -7,6 +7,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset_by_id_model.dart'; import 'package:test_sa/models/device/asset_by_id_model.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
@ -168,7 +169,7 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
context: context, context: context,
child: AppFilledButton( child: AppFilledButton(
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
label: "Upload Images", label: "Upload Images (AI Training)",
onPressed: _upload, onPressed: _upload,
), ),
), ),

@ -10,6 +10,7 @@ import 'package:test_sa/modules/cm_module/views/components/action_button/footer_
import 'package:test_sa/new_views/app_style/app_color.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_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/dialogs/dialog.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
class AssetImageUploadPage extends StatefulWidget { class AssetImageUploadPage extends StatefulWidget {
@ -30,6 +31,7 @@ class _AssetImageUploadPageState extends State<AssetImageUploadPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
// attachments = widget.attachments;
} }
@override @override
@ -47,10 +49,11 @@ class _AssetImageUploadPageState extends State<AssetImageUploadPage> {
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
children: [ children: [
AttachmentPicker( AttachmentPicker(
label: "Upload Images", label: "Import",
attachment: attachments, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: true, onlyImages: true,
pickMultiple: true,
showAsListView: true, showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120),
onChange: (_attachments) { onChange: (_attachments) {
@ -64,13 +67,22 @@ class _AssetImageUploadPageState extends State<AssetImageUploadPage> {
context: context, context: context,
child: AppFilledButton( child: AppFilledButton(
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
disableButton: attachments.length < 4,
label: "Upload Images", label: "Upload Images",
onPressed: () async { onPressed: () async {
Utils.showUploadingDialog(context); bool result = await showDialog(
bool result = await Provider.of<AssetProvider>(context, listen: false).uploadAssetImages(widget.assetId, attachments); context: context,
Utils.hideLoading(context); builder: (_) => AAlertDialog(
title: context.translation.confirm,
content: "For more enhancement, these images will be used to train AI model.\n\nAre you sure you are uploading clear and high quality images?"),
);
if (result) { if (result) {
Navigator.pop(context, result); Utils.showUploadingDialog(context);
result = await Provider.of<AssetProvider>(context, listen: false).uploadAssetImages(widget.assetId, attachments);
Utils.hideLoading(context);
if (result) {
Navigator.pop(context, result);
}
} }
}, },
), ),

@ -322,6 +322,7 @@ class AttachmentPicker extends StatefulWidget {
final Function(List<GenericAttachmentModel>)? onChange; final Function(List<GenericAttachmentModel>)? onChange;
final bool showAsGrid; final bool showAsGrid;
final bool showAsListView; final bool showAsListView;
final bool pickMultiple;
Lookup? documentType; Lookup? documentType;
AttachmentPicker( AttachmentPicker(
@ -337,6 +338,7 @@ class AttachmentPicker extends StatefulWidget {
this.documentType, this.documentType,
this.showAsGrid = false, this.showAsGrid = false,
this.showAsListView = false, this.showAsListView = false,
this.pickMultiple = false,
this.buttonColor}) this.buttonColor})
: super(key: key); : super(key: key);
@ -348,7 +350,8 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start,spacing: 12, crossAxisAlignment: CrossAxisAlignment.start,
spacing: 12,
children: [ children: [
AppDashedButton( AppDashedButton(
title: widget.label, title: widget.label,
@ -465,16 +468,21 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
).paddingAll(21), ).paddingAll(21),
)) as ImageSource; )) as ImageSource;
final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); // if(widget.pickMultiple) {
final pickedFile12 = await ImagePicker().pickMultiImage(imageQuality: 70, maxWidth: 800, maxHeight: 800);
if (pickedFile != null) { // // }
File fileImage = File(pickedFile.path); //
widget.attachment.add(GenericAttachmentModel(id: 0, name: fileImage.path, documentTypeId: widget.documentType)); // final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800);
if (widget.onChange != null) { //
widget.onChange!(widget.attachment); // if (pickedFile != null) {
} // File fileImage = File(pickedFile.path);
setState(() {}); // widget.attachment.add(GenericAttachmentModel(id: 0, name: fileImage.path, documentTypeId: widget.documentType));
} // if (widget.onChange != null) {
// widget.onChange!(widget.attachment);
// }
// setState(() {});
// }
} }
Widget gridItem(IconData iconData, String title) { Widget gridItem(IconData iconData, String title) {
@ -632,6 +640,20 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
// ); // );
if (source == null) return; if (source == null) return;
if (widget.pickMultiple && source == ImageSource.gallery) {
final pickedFiles = await ImagePicker().pickMultiImage(imageQuality: 70, maxWidth: 800, maxHeight: 800);
if (pickedFiles.isNotEmpty) {
pickedFiles.forEach((pickedFile) {
File fileImage = File(pickedFile.path);
widget.attachment.add(GenericAttachmentModel(id: 0, name: fileImage.path, documentTypeId: widget.documentType));
});
if (widget.onChange != null) {
widget.onChange!(widget.attachment);
}
setState(() {});
return;
}
}
final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800);
if (pickedFile != null) { if (pickedFile != null) {

Loading…
Cancel
Save