remove camel case text, confirmation dialog added, on back press.

design_3.0_latest
Sikander Saleem 7 months ago
parent d8cd1362fb
commit f99ea0dacd

@ -164,13 +164,14 @@ extension CapExtension on String {
String get allInCaps => toUpperCase(); String get allInCaps => toUpperCase();
String get cleanupWhitespace => replaceAll(RegExp(r"\s+"), " "); String get cleanupWhitespace => this;//replaceAll(RegExp(r"\s+"), " ");
String get capitalizeFirstOfEach => trim().isNotEmpty String get capitalizeFirstOfEach => this;
? trim().toLowerCase().split(" ").map((str) { //trim().isNotEmpty
return str.trim()?.inCaps ?? ""; // ? trim().toLowerCase().split(" ").map((str) {
}).join(" ") // return str.trim()?.inCaps ?? "";
: ""; // }).join(" ")
// : "";
} }
extension FilesExtension on String { extension FilesExtension on String {

@ -4,6 +4,7 @@ import 'package:shimmer/shimmer.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/new_views/swipe_module/dialoge/acknowledge_work_dialog.dart';
import '../new_views/app_style/app_color.dart'; import '../new_views/app_style/app_color.dart';
@ -54,6 +55,26 @@ extension WidgetExtensions on Widget {
Widget toExpanded({int flex = 1}) => Expanded(flex: flex, child: this); Widget toExpanded({int flex = 1}) => Expanded(flex: flex, child: this);
Widget handlePopScope(BuildContext _cxt, VoidCallback onSave) {
return PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) {
if (didPop) {
return;
}
showDialog(
context: _cxt,
builder: (BuildContext cxt) => AcknowledgeWorkDialog(
onSave: () => onSave(),
onDiscard: () {
Navigator.of(cxt).pop();
},
),
);
},
child: this);
}
Widget toShimmer({bool isShow = true, double radius = 20}) => isShow Widget toShimmer({bool isShow = true, double radius = 20}) => isShow
? Shimmer.fromColors( ? Shimmer.fromColors(
baseColor: const Color(0xffe8eff0), baseColor: const Color(0xffe8eff0),
@ -81,18 +102,19 @@ extension WidgetExtensions on Widget {
).toShadowContainer(context) ).toShadowContainer(context)
: this; : this;
Widget toShadowContainer(BuildContext context, {bool showShadow = true,double borderRadius = 14, bool withShadow = true, Color? backgroundColor, double padding = 16, EdgeInsets? paddingObject}) => withShadow Widget toShadowContainer(BuildContext context, {bool showShadow = true, double borderRadius = 14, bool withShadow = true, Color? backgroundColor, double padding = 16, EdgeInsets? paddingObject}) =>
? Container( withShadow
padding: paddingObject ?? EdgeInsets.all(padding), ? Container(
width: double.infinity, padding: paddingObject ?? EdgeInsets.all(padding),
decoration: ShapeDecoration( width: double.infinity,
color: backgroundColor ?? AppColor.background(context), decoration: ShapeDecoration(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius)), color: backgroundColor ?? AppColor.background(context),
shadows: showShadow ? [boxShadowR14] : null, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius)),
), shadows: showShadow ? [boxShadowR14] : null,
child: this, ),
) child: this,
: this; )
: this;
Widget bottomSheetContainer(BuildContext context, {EdgeInsets? padding}) => Container( Widget bottomSheetContainer(BuildContext context, {EdgeInsets? padding}) => Container(
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,

@ -15,6 +15,7 @@ class AppFilledButton extends StatelessWidget {
final Color? textColor; final Color? textColor;
final bool showBorder; final bool showBorder;
final double radius; final double radius;
final int height;
final bool disableButton; final bool disableButton;
const AppFilledButton( const AppFilledButton(
@ -25,6 +26,7 @@ class AppFilledButton extends StatelessWidget {
this.icon, this.icon,
this.fontSize, this.fontSize,
this.loading = false, this.loading = false,
this.height = 56,
this.showBorder = false, this.showBorder = false,
this.disableButton = false, this.disableButton = false,
this.buttonColor, this.buttonColor,
@ -36,7 +38,7 @@ class AppFilledButton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
height: 56.toScreenHeight, height: height.toScreenHeight,
width: maxWidth ? double.infinity : null, width: maxWidth ? double.infinity : null,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(

@ -4,6 +4,7 @@ import 'package:test_sa/extensions/int_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/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart';
import 'package:test_sa/new_views/swipe_module/dialoge/acknowledge_work_dialog.dart';
import '../app_style/app_color.dart'; import '../app_style/app_color.dart';
@ -12,8 +13,9 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
final List<Widget>? actions; final List<Widget>? actions;
final Function? onBackPress; final Function? onBackPress;
final bool showHomeActionButton; final bool showHomeActionButton;
final VoidCallback? onWillPopScope;
const DefaultAppBar({this.title, this.onBackPress, this.actions, this.showHomeActionButton = false, Key? key}) : super(key: key); const DefaultAppBar({this.title, this.onBackPress, this.onWillPopScope, this.actions, this.showHomeActionButton = false, Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -40,6 +42,18 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
title: Row( title: Row(
children: [ children: [
const Icon(Icons.arrow_back_ios).onPress(() { const Icon(Icons.arrow_back_ios).onPress(() {
if (onWillPopScope != null) {
showDialog(
context: context,
builder: (BuildContext cxt) => AcknowledgeWorkDialog(
onSave: onWillPopScope!,
onDiscard: () {
Navigator.of(cxt).pop();
},
),
);
return;
}
if (onBackPress != null) { if (onBackPress != null) {
onBackPress!(); onBackPress!();
} else { } else {

@ -0,0 +1,67 @@
import 'package:flutter/material.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/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
class AcknowledgeWorkDialog extends StatelessWidget {
final String? title;
final String? message;
final String? okTitle;
final VoidCallback onSave;
final VoidCallback onDiscard;
const AcknowledgeWorkDialog(
{Key? key, this.title, this.message = "To prevent the risk of losing your changes, Please confirm Save or Discard", this.okTitle, required this.onSave, required this.onDiscard})
: super(key: key);
@override
Widget build(BuildContext context) {
return Dialog(
backgroundColor: Colors.white,
shape: const RoundedRectangleBorder(),
insetPadding: const EdgeInsets.only(left: 21, right: 21),
child: Padding(
padding: const EdgeInsets.only(left: 20, right: 20, top: 18, bottom: 28),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
const Text(
"Confirm",
style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: Colors.black87, height: 35 / 24, letterSpacing: -0.96),
).paddingOnly(top: 16, bottom: 8),
message != null ? message!.heading5(context).custom(color: AppColor.neutral50) : const SizedBox(),
28.height,
Row(
children: [
AppFilledButton(
label: "Discard",
buttonColor: Colors.white54,
textColor: AppColor.red30,
height: 40,
showBorder: true,
onPressed: () {
Navigator.of(context).pop();
onDiscard();
},
).expanded,
16.width,
AppFilledButton(
label: "Save",
onPressed: () {
Navigator.of(context).pop();
onSave();
},
height: 40,
buttonColor: AppColor.green70,
).expanded,
],
),
],
),
),
);
}
}

@ -6,13 +6,13 @@ 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';
class ConfirmDialog extends StatelessWidget { class ConfirmDialog extends StatelessWidget {
final String ?title; final String? title;
final String ?message; final String? message;
final String ?okTitle; final String? okTitle;
final VoidCallback ?onTap; final VoidCallback? onTap;
final VoidCallback ?onCloseTap; final VoidCallback? onCloseTap;
const ConfirmDialog({Key ?key, this.title, this.message, this.okTitle, this.onTap, this.onCloseTap}) : super(key: key); const ConfirmDialog({Key? key, this.title, this.message, this.okTitle, this.onTap, this.onCloseTap}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -45,7 +45,7 @@ class ConfirmDialog extends StatelessWidget {
) )
], ],
), ),
message!=null?message!.heading5(context).custom(color: AppColor.neutral70):const SizedBox(), message != null ? message!.heading5(context).custom(color: AppColor.neutral70) : const SizedBox(),
28.height, 28.height,
AppFilledButton( AppFilledButton(
label: okTitle ?? "OK", label: okTitle ?? "OK",

@ -49,7 +49,12 @@ class _MaintenanceRequestFormState extends State<MaintenanceRequestForm> with Si
bool isUpdate = requestDetailProvider.activityMaintenanceHelperModel?.id != 0; bool isUpdate = requestDetailProvider.activityMaintenanceHelperModel?.id != 0;
return Scaffold( return Scaffold(
backgroundColor: AppColor.neutral110, backgroundColor: AppColor.neutral110,
appBar: const DefaultAppBar(title: "CM Activity"), appBar: DefaultAppBar(
title: "CM Activity",
onWillPopScope: () {
save(requestDetailProvider);
},
),
body: Stack( body: Stack(
children: [ children: [
DefaultTabController( DefaultTabController(
@ -97,48 +102,49 @@ class _MaintenanceRequestFormState extends State<MaintenanceRequestForm> with Si
label: requestDetailProvider.activityMaintenanceHelperModel?.id != 0 ? context.translation.update : context.translation.addActivity, // Use the dynamic label label: requestDetailProvider.activityMaintenanceHelperModel?.id != 0 ? context.translation.update : context.translation.addActivity, // Use the dynamic label
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onPressed: () async { onPressed: () async {
//TODO add this as dropdown not added in design yet Bhaa need to confirm with hussain then. save(requestDetailProvider);
// requestDetailProvider.activityMaintenanceHelperModel?.lastSituationId = 282;
if (validate(model: requestDetailProvider.activityMaintenanceHelperModel!)) {
requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers = requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers ?? [];
requestDetailProvider.activityMaintenanceHelperModel?.timerModelList?.forEach((timer) {
int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers?.add(
ActivityMaintenanceTimers(
id: 0,
startTime: timer.startAt!.toIso8601String(), // Handle potential null
endTime: timer.endAt?.toIso8601String(), // Handle potential null
workingHours: ((durationInSecond) / 60 / 60),
),
);
});
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status = -1;
if (requestDetailProvider.activityMaintenanceHelperModel?.id == 0) {
status = await requestDetailProvider.createActivityMaintenanceRequest();
} else {
status = await requestDetailProvider.updateActivityMaintenance();
}
if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pop(context);
Navigator.pop(context);
} else {
Navigator.pop(context);
}
}
// Handle button press
}, },
), ),
), ),
], ],
), ),
); ).handlePopScope(context, () {
save(requestDetailProvider);
});
}); });
} }
void save(ServiceRequestDetailProvider requestDetailProvider) async {
if (validate(model: requestDetailProvider.activityMaintenanceHelperModel!)) {
requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers = requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers ?? [];
requestDetailProvider.activityMaintenanceHelperModel?.timerModelList?.forEach((timer) {
int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers?.add(
ActivityMaintenanceTimers(
id: 0,
startTime: timer.startAt!.toIso8601String(), // Handle potential null
endTime: timer.endAt?.toIso8601String(), // Handle potential null
workingHours: ((durationInSecond) / 60 / 60),
),
);
});
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status = -1;
if (requestDetailProvider.activityMaintenanceHelperModel?.id == 0) {
status = await requestDetailProvider.createActivityMaintenanceRequest();
} else {
status = await requestDetailProvider.updateActivityMaintenance();
}
if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pop(context);
Navigator.pop(context);
} else {
Navigator.pop(context);
}
}
}
bool validate({required ActivityMaintenanceHelperModel model}) { bool validate({required ActivityMaintenanceHelperModel model}) {
if (model.activityStatus == null) { if (model.activityStatus == null) {
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.activityStatus}"); Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.activityStatus}");

Loading…
Cancel
Save