Pick asset screen design

main_design2.0
zaid_daoud 2 years ago
parent 7d2afa23cc
commit 5b1e067a93

@ -0,0 +1,3 @@
<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.9499 9.51862C12.6027 8.54479 12.984 7.37301 12.984 6.11339C12.984 2.74246 10.2534 0 6.89703 0C3.54065 0 0.810059 2.74246 0.810059 6.11336C0.810059 9.48425 3.54068 12.2267 6.89706 12.2267C8.176 12.2267 9.36378 11.8282 10.3445 11.1488L15.1958 16L16.8101 14.3788L11.9499 9.51862ZM6.89706 10.5097C4.48871 10.5097 2.52931 8.54181 2.52931 6.12299C2.52931 3.70421 4.48868 1.73634 6.89706 1.73634C9.30543 1.73634 11.2648 3.70421 11.2648 6.12302C11.2648 8.54184 9.3054 10.5097 6.89706 10.5097Z" fill="#767676"/>
</svg>

After

Width:  |  Height:  |  Size: 619 B

@ -37,6 +37,7 @@
"back": "السابق", "back": "السابق",
"search": "بحث", "search": "بحث",
"searchByName": "بحث بالاسم", "searchByName": "بحث بالاسم",
"searchByAssetNumber": "بحث برقم الجهاز",
"address": "العنوان", "address": "العنوان",
"addressNotFound": "لا يوجد عنوان", "addressNotFound": "لا يوجد عنوان",
"addressValidateMessage": "العنوان مطلوب", "addressValidateMessage": "العنوان مطلوب",

@ -37,6 +37,7 @@
"back": "Back", "back": "Back",
"search": "Search", "search": "Search",
"searchByName": "Search by name", "searchByName": "Search by name",
"searchByAssetNumber": "Search by asset number",
"address": "Address", "address": "Address",
"addressNotFound": "Address not found", "addressNotFound": "Address not found",
"addressValidateMessage": "Address validateMessage", "addressValidateMessage": "Address validateMessage",

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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/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_color.dart';
import 'package:test_sa/new_views/app_style/app_text_style.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 TextAlign textAlign;
final FocusNode node; final FocusNode node;
final Widget suffixIcon; final Widget suffixIcon;
final Widget prefixIcon;
final IconData prefixIconData; final IconData prefixIconData;
final int prefixIconSize; final int prefixIconSize;
final TextEditingController controller; final TextEditingController controller;
final TextInputAction textInputAction; final TextInputAction textInputAction;
final VoidCallback onAction; final VoidCallback onAction;
final Color backgroundColor;
const AppTextFormField({ const AppTextFormField({
Key key, Key key,
@ -42,11 +43,13 @@ class AppTextFormField extends StatefulWidget {
this.style, this.style,
this.textAlign, this.textAlign,
this.suffixIcon, this.suffixIcon,
this.prefixIcon,
this.prefixIconData, this.prefixIconData,
this.prefixIconSize, this.prefixIconSize,
this.controller, this.controller,
this.textInputAction, this.textInputAction,
this.onAction, this.onAction,
this.backgroundColor,
}) : super(key: key); }) : super(key: key);
@override @override
@ -93,19 +96,20 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
constraints: const BoxConstraints(), constraints: const BoxConstraints(),
suffixIconConstraints: const BoxConstraints(minWidth: 0), suffixIconConstraints: const BoxConstraints(minWidth: 0),
filled: true, 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), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20),
hintText: widget.hintText ?? "", hintText: widget.hintText ?? "",
labelText: widget.labelText ?? "", labelText: widget.labelText ?? "",
suffixIcon: widget.suffixIcon ?? prefixIcon: widget.prefixIcon ??
(widget.prefixIconData == null (widget.prefixIconData == null
? null ? null
: Icon( : Icon(
widget.prefixIconData, widget.prefixIconData,
size: widget.prefixIconSize == null ? 20.toScreenWidth : (widget.prefixIconSize - 10).toScreenWidth, size: widget.prefixIconSize == null ? 20.toScreenWidth : (widget.prefixIconSize - 10).toScreenWidth,
color: AppColor.neutral70, color: AppColor.neutral70,
)), )),
suffixIcon: widget.suffixIcon,
), ),
), ),
); );

@ -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),
);
}
}

@ -1,12 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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/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/views/widgets/equipment/single_device_picker.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart';
import '../../../models/device/device.dart'; import '../../../models/device/device.dart';
import '../../../new_views/app_style/app_color.dart'; import '../../../new_views/app_style/app_color.dart';
import '../../../new_views/common_widgets/asset_info_card.dart';
class PickAsset extends StatelessWidget { class PickAsset extends StatelessWidget {
final Function(Device) onPickAsset; final Function(Device) onPickAsset;
@ -36,29 +36,11 @@ class PickAsset extends StatelessWidget {
Device device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device; Device device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device;
onPickAsset(device); onPickAsset(device);
}).expanded, }).expanded,
"qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight).onPress(() { "qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight, color: context.isDark ? AppColor.primary40 : AppColor.primary70),
/// TODO [Zaid] : open qr reader
}),
], ],
).paddingOnly(start: 16, end: 16, top: 8, bottom: 8), ).paddingOnly(start: 16, end: 16, top: 8, bottom: 8),
), ),
if (device != null) if (device != null) AssetInfoCard(asset: device).paddingOnly(top: 8),
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),
], ],
); );
} }

@ -1,17 +1,20 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.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/devices_provider.dart';
import 'package:test_sa/controllers/providers/api/user_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/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.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/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import '../../../models/device/device.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'; import '../qr/scan_qr.dart';
class SingleDevicePicker extends StatefulWidget { class SingleDevicePicker extends StatefulWidget {
@ -30,7 +33,6 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
List<Device> _initList = []; List<Device> _initList = [];
bool _firstTime = true; bool _firstTime = true;
TextEditingController numberController = TextEditingController(); TextEditingController numberController = TextEditingController();
TextEditingController snController = TextEditingController(); TextEditingController snController = TextEditingController();
@ -100,11 +102,11 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: Column( child: Column(
children: [ children: [
ATextFormField( AppTextFormField(
hintText: "Search by Asset Number", labelText: context.translation.searchByAssetNumber,
controller: numberController, controller: numberController,
style: Theme.of(context).textTheme.subtitle1, prefixIcon: "search".toSvgAsset().paddingAll(16),
suffixIcon: const Icon(Icons.search_rounded), backgroundColor: context.isDark ? AppColor.neutral40 : AppColor.neutral30,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () async { onAction: () async {
_devicesProvider.reset(); _devicesProvider.reset();
@ -117,11 +119,11 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ATextFormField( AppTextFormField(
hintText: context.translation.searchBySn, labelText: context.translation.searchBySn,
controller: snController, controller: snController,
style: Theme.of(context).textTheme.subtitle1, prefixIcon: "search".toSvgAsset().paddingAll(16),
suffixIcon: const Icon(Icons.search_rounded), backgroundColor: context.isDark ? AppColor.neutral40 : AppColor.neutral30,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () async { onAction: () async {
_devicesProvider.reset(); _devicesProvider.reset();
@ -146,16 +148,13 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text);
}, },
child: ListView.builder( child: ListView.builder(
padding: EdgeInsets.zero, padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
shrinkWrap: true, shrinkWrap: true,
itemCount: _searchableList.length, itemCount: _searchableList.length,
itemBuilder: (listContext, itemIndex) { itemBuilder: (listContext, itemIndex) {
return DeviceItem( return AssetInfoCard(asset: _searchableList[itemIndex]).onPress(() {
device: _searchableList[itemIndex], Navigator.of(context).pop(_searchableList[itemIndex]);
onPressed: (device) { });
Navigator.of(context).pop(device);
},
);
}, },
), ),
)), )),
@ -165,7 +164,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
heroTag: "some tag 2", 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 { onPressed: () async {
String result = await Navigator.of(context).push( String result = await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const ScanQr()), MaterialPageRoute(builder: (_) => const ScanQr()),

@ -1,5 +1,6 @@
import 'package:audioplayers/audioplayers.dart'; import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.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/extensions/widget_extensions.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/app_style/app_text_style.dart'; import 'package:test_sa/new_views/app_style/app_text_style.dart';
@ -30,13 +31,14 @@ class _ASoundPlayerState extends State<ASoundPlayer> {
decoration: ShapeDecoration( decoration: ShapeDecoration(
color: Theme.of(context).cardColor, color: Theme.of(context).cardColor,
shape: RoundedRectangleBorder( 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), borderRadius: BorderRadius.circular(32),
), ),
), ),
child: Icon( child: Icon(
icon, icon,
color: Theme.of(context).primaryColor, size: 30,
color: (context.isDark ? AppColor.primary40 : AppColor.primary70).withOpacity(0.5),
), ),
).onPress(onpress); ).onPress(onpress);
} }
@ -63,7 +65,7 @@ class _ASoundPlayerState extends State<ASoundPlayer> {
rebuild(); rebuild();
}); });
case PlayerState.stopped: 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; _failedToLoad = false;
try { try {
await _audioPlayer.play( await _audioPlayer.play(
@ -179,7 +181,7 @@ class _ASoundPlayerState extends State<ASoundPlayer> {
value: _audioPosition?.inMilliseconds?.toDouble() ?? 0.0, value: _audioPosition?.inMilliseconds?.toDouble() ?? 0.0,
min: 0, min: 0,
max: _audioTime?.inMilliseconds?.toDouble() ?? 60.0, max: _audioTime?.inMilliseconds?.toDouble() ?? 60.0,
activeColor: Theme.of(context).primaryColor, activeColor: context.isDark ? AppColor.primary40 : AppColor.primary70,
inactiveColor: AppColor.neutral30, inactiveColor: AppColor.neutral30,
onChangeStart: (value) { onChangeStart: (value) {
_sliderMoving = true; _sliderMoving = true;

Loading…
Cancel
Save