From 2ebf36ca2f5dd5687ed3739bdf0aa0530922e336 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 5 Nov 2023 11:31:00 +0300 Subject: [PATCH] Calibration Tool & PM Kit Design DONE --- .../pages/user/visits/pantry/edit_pentry.dart | 2 +- .../parts/auto_complete_parts_field.dart | 29 ++--- .../auto_complete_devices_field.dart | 24 ++-- .../pentry/pentry_calibration_tool_form.dart | 94 +++++++--------- .../widgets/pentry/pentry_pm_kit_form.dart | 106 +++++++++--------- ...ry_info_form.dart => pentry_tbs_form.dart} | 0 lib/views/widgets/timer/app_timer.dart | 1 + 7 files changed, 126 insertions(+), 130 deletions(-) rename lib/views/widgets/pentry/{pentry_info_form.dart => pentry_tbs_form.dart} (100%) diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index f2ecd399..a4d7ae00 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -20,7 +20,7 @@ import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart'; import 'package:test_sa/views/widgets/pentry/pentry_pm_kit_form.dart'; import 'package:test_sa/views/widgets/pentry/pentry_ppm_check_list_form.dart'; -import '../../../../widgets/pentry/pentry_info_form.dart'; +import '../../../../widgets/pentry/pentry_tbs_form.dart'; class EditPentry extends StatefulWidget { final Pentry pentry; diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index 7bd26d30..ec742632 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/parts_provider.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/views/app_style/colors.dart'; +import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import '../../../extensions/text_extensions.dart'; import '../../../models/service_request/spare_parts.dart'; class AutoCompletePartsField extends StatefulWidget { @@ -47,17 +49,17 @@ class _AutoCompletePartsFieldState extends State { return Container( padding: const EdgeInsets.symmetric(horizontal: 16), decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color: AColors.black), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - boxShadow: const [AppStyle.boxShadow]), - child: - Container() /*TypeAheadField( + color: Colors.white, + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], + ), + child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.subtitle1, + style: AppTextStyles.bodyText, controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( + textAlign: TextAlign.start, + decoration: InputDecoration( + label: context.translation.partNumberName.tinyFont(context), border: InputBorder.none, disabledBorder: InputBorder.none, focusedBorder: InputBorder.none, @@ -66,14 +68,14 @@ class _AutoCompletePartsFieldState extends State { textInputAction: TextInputAction.search, ), suggestionsCallback: (vale) async { - return await _partsProvider.getPartsList(title: vale, assetId: widget.assetId); + return (await _partsProvider.getPartsList(title: vale, assetId: widget.assetId)).map((e) => SparePartsWorkOrders(sparePart: e)).toList(); }, itemBuilder: (context, part) { return ListTile( title: Text(part?.sparePart?.partNo ?? ""), subtitle: Text( part?.sparePart?.partName ?? "", - style: Theme.of(context).textTheme.caption, + style: Theme.of(context).textTheme.bodySmall, ), ); }, @@ -85,8 +87,7 @@ class _AutoCompletePartsFieldState extends State { } widget.onPick(part); }, - )*/ - , + ), ); } } diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index 397c7ec2..67288f1b 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -4,8 +4,10 @@ import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.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/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import '../../../../models/device/asset.dart'; @@ -48,16 +50,17 @@ class _AutoCompleteDeviceNumberFieldState extends State( textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, + style: AppTextStyles.bodyText, controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( + textAlign: TextAlign.start, + decoration: InputDecoration( + label: context.translation.assetNumber.tinyFont(context), border: InputBorder.none, disabledBorder: InputBorder.none, focusedBorder: InputBorder.none, @@ -74,10 +77,7 @@ class _AutoCompleteDeviceNumberFieldState extends State models; @@ -24,45 +26,44 @@ class _PentryCalibrationToolFormState extends State { Widget build(BuildContext context) { final userProvider = Provider.of(context); return ListView.builder( - padding: EdgeInsets.only( - top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), - itemCount: widget.models.length + 1, - itemBuilder: (context, index) { - if (index == widget.models.length) { - return AButton( - text: context.translation.add, - onPressed: () { - widget.models.add(CalibrationTool()); - setState(() {}); - }, - ); - } - final model = widget.models[index]; - return Column( + itemCount: widget.models.length + 1, + padding: EdgeInsets.only(top: 16.toScreenHeight), + itemBuilder: (context, index) { + if (index == widget.models.length) { + return AppFilledButton( + label: "Add Asset", + maxWidth: true, + textColor: Colors.white, + buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50, + onPressed: () { + widget.models.add(CalibrationTool()); + setState(() {}); + }, + ); + } + final model = widget.models[index]; + return Container( + padding: const EdgeInsets.all(16), + margin: EdgeInsets.only(bottom: 16.toScreenHeight), + decoration: BoxDecoration( + color: Theme.of(context).cardColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14)], + ), + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ASubTitle("#${index + 1}"), - if (index != 0) - ASmallButton( - color: Theme.of(context).colorScheme.error, - text: context.translation.delete, - onPressed: () { - widget.models.remove(model); - setState(() {}); - }, - ), + "Asset ${index + 1}".heading5(context), + "trash".toSvgAsset(height: 20, width: 15).onPress(() { + widget.models.remove(model); + setState(() {}); + }), ], ), - const SizedBox( - height: 8, - ), - const ASubTitle("Asset Number"), - const SizedBox( - height: 4, - ), + 16.height, AutoCompleteDeviceNumberField( initialValue: model.assetsNumber, hospitalId: userProvider.user.clientId, @@ -70,28 +71,19 @@ class _PentryCalibrationToolFormState extends State { model.assetsNumber = number; }, ), - const SizedBox( - height: 8, - ), - const ASubTitle("Date of Testing"), - const SizedBox( - height: 4, - ), + 8.height, ADatePicker( + label: "Calibration Date", date: model.dataOfTesting, onDatePicker: (date) { model.dataOfTesting = date; setState(() {}); }, ), - const SizedBox( - height: 8, - ), - Divider( - color: Theme.of(context).textTheme.titleMedium.color, - ), ], - ); - }); + ), + ); + }, + ); } } diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index 72df9d7b..1a0a8665 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -1,12 +1,15 @@ import 'package:flutter/material.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/lookup.dart'; import 'package:test_sa/models/pantry/pm_kit.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../../../new_views/app_style/app_color.dart'; +import '../../../new_views/common_widgets/app_filled_button.dart'; class PentryPMKitForm extends StatefulWidget { final List models; @@ -27,18 +30,16 @@ class _PentryPMKitFormState extends State { @override Widget build(BuildContext context) { return ListView.builder( - padding: EdgeInsets.only( - top: 12 * AppStyle.getScaleFactor(context), - left: 12 * AppStyle.getScaleFactor(context), - right: 12 * AppStyle.getScaleFactor(context), - bottom: 100 * AppStyle.getScaleFactor(context) + MediaQuery.of(context).padding.bottom, - ), itemCount: widget.models.length + 1, shrinkWrap: true, + padding: EdgeInsets.only(top: 16.toScreenHeight), itemBuilder: (context, index) { if (index == widget.models.length) { - return AButton( - text: context.translation.add, + return AppFilledButton( + label: "Add Item", + maxWidth: true, + textColor: Colors.white, + buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50, onPressed: () { widget.models.add(PMKit()); setState(() {}); @@ -46,46 +47,47 @@ class _PentryPMKitFormState extends State { ); } final model = widget.models[index]; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ASubTitle("#${index + 1}"), - if (index != 0) - ASmallButton( - color: Theme.of(context).colorScheme.error, - text: context.translation.delete, - onPressed: () { - widget.models.remove(model); - setState(() {}); - }, - ), - ], - ), - const SizedBox( - height: 8, - ), - const ASubTitle("Item Code"), - const SizedBox( - height: 4, - ), - AutoCompletePartsField( - assetId: widget.assetId, - clearAfterPick: false, - initialValue: (model.itemCode?.name ?? "").toString(), - onPick: (part) { - model.itemCode = Lookup(id: part.id, name: part?.sparePart?.partNo); - }, - ), - const SizedBox( - height: 8, - ), - Divider( - color: Theme.of(context).textTheme.titleMedium.color, - ), - ], + return Container( + padding: const EdgeInsets.all(16), + margin: EdgeInsets.only(bottom: 16.toScreenHeight), + decoration: BoxDecoration( + color: Theme.of(context).cardColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14)], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Item ${index + 1}".heading5(context), + "trash".toSvgAsset(width: 15, height: 20).onPress(() { + widget.models.remove(model); + setState(() {}); + }), + ], + ), + 8.height, + AutoCompletePartsField( + assetId: widget.assetId, + clearAfterPick: false, + initialValue: (model.itemCode?.name ?? "").toString(), + onPick: (part) { + model.itemCode = Lookup(id: part.id, name: part?.sparePart?.partNo); + }, + ), + 8.height, + AppTextFormField( + initialValue: model.quantityNeeded, + labelText: context.translation.quantity, + textInputType: TextInputType.number, + onChange: (text) { + model.quantityNeeded = num.tryParse(text ?? "")?.toString(); + }, + ), + ], + ), ); }, ); diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_tbs_form.dart similarity index 100% rename from lib/views/widgets/pentry/pentry_info_form.dart rename to lib/views/widgets/pentry/pentry_tbs_form.dart diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 3d6fd259..b7bbbcc1 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -107,6 +107,7 @@ class _AppTimerState extends State { decoration: BoxDecoration( color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(10), + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), child: _loading ? const SizedBox.square(dimension: 18, child: CircularProgressIndicator(color: Colors.white))