diff --git a/assets/images/search.svg b/assets/images/search.svg new file mode 100644 index 00000000..a991c00a --- /dev/null +++ b/assets/images/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index aed0f553..b175041e 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -37,6 +37,7 @@ "back": "السابق", "search": "بحث", "searchByName": "بحث بالاسم", + "searchByAssetNumber": "بحث برقم الجهاز", "address": "العنوان", "addressNotFound": "لا يوجد عنوان", "addressValidateMessage": "العنوان مطلوب", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 29433d6f..69dc34fe 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -37,6 +37,7 @@ "back": "Back", "search": "Search", "searchByName": "Search by name", + "searchByAssetNumber": "Search by asset number", "address": "Address", "addressNotFound": "Address not found", "addressValidateMessage": "Address validateMessage", diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index e9d97aee..cfa71a3e 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -1,7 +1,6 @@ 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/models/enums/translation_keys.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_text_style.dart'; @@ -20,11 +19,13 @@ class AppTextFormField extends StatefulWidget { final TextAlign textAlign; final FocusNode node; final Widget suffixIcon; + final Widget prefixIcon; final IconData prefixIconData; final int prefixIconSize; final TextEditingController controller; final TextInputAction textInputAction; final VoidCallback onAction; + final Color backgroundColor; const AppTextFormField({ Key key, @@ -42,11 +43,13 @@ class AppTextFormField extends StatefulWidget { this.style, this.textAlign, this.suffixIcon, + this.prefixIcon, this.prefixIconData, this.prefixIconSize, this.controller, this.textInputAction, this.onAction, + this.backgroundColor, }) : super(key: key); @override @@ -93,19 +96,20 @@ class _AppTextFormFieldState extends State { constraints: const BoxConstraints(), suffixIconConstraints: const BoxConstraints(minWidth: 0), filled: true, - fillColor: context.isDark ? AppColor.neutral50 : Colors.white, + fillColor: widget.backgroundColor ?? (context.isDark ? AppColor.neutral50 : Colors.white), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), hintText: widget.hintText ?? "", labelText: widget.labelText ?? "", - suffixIcon: widget.suffixIcon ?? + prefixIcon: widget.prefixIcon ?? (widget.prefixIconData == null ? null : Icon( - widget.prefixIconData, - size: widget.prefixIconSize == null ? 20.toScreenWidth : (widget.prefixIconSize - 10).toScreenWidth, - color: AppColor.neutral70, - )), + widget.prefixIconData, + size: widget.prefixIconSize == null ? 20.toScreenWidth : (widget.prefixIconSize - 10).toScreenWidth, + color: AppColor.neutral70, + )), + suffixIcon: widget.suffixIcon, ), ), ); diff --git a/lib/new_views/common_widgets/asset_info_card.dart b/lib/new_views/common_widgets/asset_info_card.dart new file mode 100644 index 00000000..983f9dbd --- /dev/null +++ b/lib/new_views/common_widgets/asset_info_card.dart @@ -0,0 +1,33 @@ +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 '../../models/device/device.dart'; + +class AssetInfoCard extends StatelessWidget { + const AssetInfoCard({Key key, @required this.asset}) : super(key: key); + + final Device asset; + + @override + Widget build(BuildContext context) { + return Card( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + asset.modelDefinition?.assetName?.heading5(context), + 8.height, + "${context.translation.assetNo}: ${asset.assetNumber}".bodyText(context), + "${context.translation.manufacture}: ${asset.modelDefinition?.manufacturerName}".bodyText(context), + "${context.translation.model}: ${asset.modelDefinition?.modelName}".bodyText(context), + "${context.translation.serialNumber}: ${asset.assetNumber}".bodyText(context), + const Divider().defaultStyle(context), + "${context.translation.department}: ${asset.department?.departmentName}".bodyText(context), + "${context.translation.site}: ${asset.site?.custName}".bodyText(context), + ], + ).paddingAll(16), + ); + } +} diff --git a/lib/views/widgets/equipment/pick_asset.dart b/lib/views/widgets/equipment/pick_asset.dart index 06faaf8a..3bcd1100 100644 --- a/lib/views/widgets/equipment/pick_asset.dart +++ b/lib/views/widgets/equipment/pick_asset.dart @@ -1,12 +1,12 @@ 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/views/widgets/equipment/single_device_picker.dart'; import '../../../models/device/device.dart'; import '../../../new_views/app_style/app_color.dart'; +import '../../../new_views/common_widgets/asset_info_card.dart'; class PickAsset extends StatelessWidget { final Function(Device) onPickAsset; @@ -36,29 +36,11 @@ class PickAsset extends StatelessWidget { Device device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device; onPickAsset(device); }).expanded, - "qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight).onPress(() { - /// TODO [Zaid] : open qr reader - }), + "qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight, color: context.isDark ? AppColor.primary40 : AppColor.primary70), ], ).paddingOnly(start: 16, end: 16, top: 8, bottom: 8), ), - if (device != null) - Card( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - device.modelDefinition?.assetName?.heading5(context), - 8.height, - "${context.translation.assetNo}: ${device.assetNumber}".bodyText(context), - "${context.translation.manufacture}: ${device.modelDefinition?.manufacturerName}".bodyText(context), - "${context.translation.model}: ${device.modelDefinition?.modelName}".bodyText(context), - "${context.translation.serialNumber}: ${device.assetNumber}".bodyText(context), - const Divider().defaultStyle(context), - "${context.translation.department}: ${device.department?.departmentName}".bodyText(context), - "${context.translation.site}: ${device.site?.custName}".bodyText(context), - ], - ).paddingAll(16), - ).paddingOnly(top: 8), + if (device != null) AssetInfoCard(asset: device).paddingOnly(top: 8), ], ); } diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 744c4bc7..64c83bde 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -1,17 +1,20 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.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/views/widgets/equipment/device_item.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/common_widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import '../../../models/device/device.dart'; -import '../app_text_form_field.dart'; +import '../../../new_views/app_style/app_color.dart'; +import '../../../new_views/common_widgets/asset_info_card.dart'; import '../qr/scan_qr.dart'; class SingleDevicePicker extends StatefulWidget { @@ -30,7 +33,6 @@ class _SingleDevicePickerState extends State { List _initList = []; bool _firstTime = true; - TextEditingController numberController = TextEditingController(); TextEditingController snController = TextEditingController(); @@ -100,11 +102,11 @@ class _SingleDevicePickerState extends State { padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Column( children: [ - ATextFormField( - hintText: "Search by Asset Number", + AppTextFormField( + labelText: context.translation.searchByAssetNumber, controller: numberController, - style: Theme.of(context).textTheme.subtitle1, - suffixIcon: const Icon(Icons.search_rounded), + prefixIcon: "search".toSvgAsset().paddingAll(16), + backgroundColor: context.isDark ? AppColor.neutral40 : AppColor.neutral30, textInputAction: TextInputAction.search, onAction: () async { _devicesProvider.reset(); @@ -117,11 +119,11 @@ class _SingleDevicePickerState extends State { const SizedBox( height: 8, ), - ATextFormField( - hintText: context.translation.searchBySn, + AppTextFormField( + labelText: context.translation.searchBySn, controller: snController, - style: Theme.of(context).textTheme.subtitle1, - suffixIcon: const Icon(Icons.search_rounded), + prefixIcon: "search".toSvgAsset().paddingAll(16), + backgroundColor: context.isDark ? AppColor.neutral40 : AppColor.neutral30, textInputAction: TextInputAction.search, onAction: () async { _devicesProvider.reset(); @@ -146,16 +148,13 @@ class _SingleDevicePickerState extends State { user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); }, child: ListView.builder( - padding: EdgeInsets.zero, + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), shrinkWrap: true, itemCount: _searchableList.length, itemBuilder: (listContext, itemIndex) { - return DeviceItem( - device: _searchableList[itemIndex], - onPressed: (device) { - Navigator.of(context).pop(device); - }, - ); + return AssetInfoCard(asset: _searchableList[itemIndex]).onPress(() { + Navigator.of(context).pop(_searchableList[itemIndex]); + }); }, ), )), @@ -165,7 +164,7 @@ class _SingleDevicePickerState extends State { ), floatingActionButton: FloatingActionButton( heroTag: "some tag 2", - child: const Icon(Icons.qr_code_scanner), + child: "qr".toSvgAsset(height: 32, fit: BoxFit.fitHeight, color: Theme.of(context).scaffoldBackgroundColor), onPressed: () async { String result = await Navigator.of(context).push( MaterialPageRoute(builder: (_) => const ScanQr()), diff --git a/lib/views/widgets/sound/sound_player.dart b/lib/views/widgets/sound/sound_player.dart index ab687517..ae1ed9bb 100644 --- a/lib/views/widgets/sound/sound_player.dart +++ b/lib/views/widgets/sound/sound_player.dart @@ -1,5 +1,6 @@ import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/extensions/context_extension.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/app_style/app_text_style.dart'; @@ -30,13 +31,14 @@ class _ASoundPlayerState extends State { decoration: ShapeDecoration( color: Theme.of(context).cardColor, shape: RoundedRectangleBorder( - side: const BorderSide(width: 1, color: Color(0xFFEAF1F4)), + side: BorderSide(width: 1, color: (context.isDark ? AppColor.neutral20 : AppColor.neutral30)), borderRadius: BorderRadius.circular(32), ), ), child: Icon( icon, - color: Theme.of(context).primaryColor, + size: 30, + color: (context.isDark ? AppColor.primary40 : AppColor.primary70).withOpacity(0.5), ), ).onPress(onpress); } @@ -63,7 +65,7 @@ class _ASoundPlayerState extends State { rebuild(); }); case PlayerState.stopped: - return audioPlayerButton(_isLocalFile ? Icons.play_circle_fill_outlined : Icons.download_rounded, () async { + return audioPlayerButton(_isLocalFile ? Icons.play_arrow_rounded : Icons.download_rounded, () async { _failedToLoad = false; try { await _audioPlayer.play( @@ -179,7 +181,7 @@ class _ASoundPlayerState extends State { value: _audioPosition?.inMilliseconds?.toDouble() ?? 0.0, min: 0, max: _audioTime?.inMilliseconds?.toDouble() ?? 60.0, - activeColor: Theme.of(context).primaryColor, + activeColor: context.isDark ? AppColor.primary40 : AppColor.primary70, inactiveColor: AppColor.neutral30, onChangeStart: (value) { _sliderMoving = true;