Merge branch 'main_latest_merged' into 'majd_development_new'

# Conflicts:
#   lib/controllers/providers/api/device_transfer_provider.dart
#   lib/views/pages/user/land_page.dart
#   lib/views/widgets/status/single_status_menu.dart
merge-requests/23/head
majd alattari 3 years ago
commit ca5e0fa9b4

@ -9,7 +9,6 @@ import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/user.dart';
class DeviceTransferProvider extends ChangeNotifier {
// number of items call in each request
final pageItemNumber = 50;
@ -45,8 +44,7 @@ class DeviceTransferProvider extends ChangeNotifier{
@required String host,
@required User user,
}) async {
if(isLoading == true)
return -2;
if (isLoading == true) return -2;
isLoading = true;
// isLoading = false;
@ -78,8 +76,7 @@ class DeviceTransferProvider extends ChangeNotifier{
if (stateCode >= 200 && stateCode < 300) {
// client's request was successfully received
List listJson = json.decode(response.body)["data"];
List<DeviceTransfer> itemsPage = listJson.map(
(request) => DeviceTransfer.fromJson(request)).toList();
List<DeviceTransfer> itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList();
items ??= [];
items.addAll(itemsPage);
if (itemsPage.length == pageItemNumber) {
@ -91,14 +88,12 @@ class DeviceTransferProvider extends ChangeNotifier{
isLoading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
isLoading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
Future<int> createRequest({
@ -115,31 +110,20 @@ class DeviceTransferProvider extends ChangeNotifier{
"senderSiteId": model.receiver.client.id ?? "",
};
Response response;
try {
response = await ApiManager.instance.post(
URLs.requestDeviceTransfer,
body: body
);
response = await ApiManager.instance.post(URLs.requestDeviceTransfer, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
if (items != null) {
items.insert(
0,
DeviceTransfer.fromJson(
json.decode(utf8.decode(response.bodyBytes))[0]
)
);
items.insert(0, DeviceTransfer.fromJson(json.decode(utf8.decode(response.bodyBytes))[0]));
notifyListeners();
}
}
return response.statusCode;
} catch (error) {
return -1;
}
}
Future<int> updateRequest({
@ -150,7 +134,6 @@ class DeviceTransferProvider extends ChangeNotifier{
@required DeviceTransfer oldModel,
@required DeviceTransferInfo newModel,
}) async {
Map<String, dynamic> body = {
"id": oldModel.id,
"assetId": oldModel.device.id ?? "",
@ -213,10 +196,8 @@ class DeviceTransferProvider extends ChangeNotifier{
notifyListeners();
}
return response.statusCode;
} catch (error) {
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class DevicesProvider extends ChangeNotifier {
//reset provider data
void reset() {
_devices = null;
@ -47,21 +46,17 @@ class DevicesProvider extends ChangeNotifier{
String serialNumber,
String number,
}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.post(
URLs.getEquipment,
body: {
response = await ApiManager.instance.post(URLs.getEquipment, body: {
"pageSize": 50,
"siteId": hospitalId,
if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber,
if (number?.isEmpty == false) "assetNo": number,
}
);
});
} catch (error) {
_loading = false;
_stateCode = -1;
@ -93,15 +88,12 @@ class DevicesProvider extends ChangeNotifier{
}) async {
Response response;
try {
response = await ApiManager.instance.post(
URLs.getEquipment,
body: {
response = await ApiManager.instance.post(URLs.getEquipment, body: {
"pageSize": 50,
"siteId": hospitalId,
if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber,
if (number?.isEmpty == false) "assetNo": number,
}
);
});
// response = await get(
// Uri.parse("$host${URLs.getEquipment}?siteId=$hospitalId"
// "${serialNumber?.isEmpty == false ? "&assetSerialNumber=$serialNumber" :""}"
@ -118,7 +110,6 @@ class DevicesProvider extends ChangeNotifier{
} catch (error) {
return [];
}
}
Future<List<Lookup>> getModels({
@ -133,38 +124,30 @@ class DevicesProvider extends ChangeNotifier{
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
page = categoriesListJson.map((json) =>
Lookup(
page = categoriesListJson
.map((json) => Lookup(
name: json["modelDefCode"],
id: json["id"],
value: json["id"],
)
).toList();
))
.toList();
}
return page;
} catch (error) {
return [];
}
}
/// return -2 if request in progress
/// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<List<Device>> getDevicesListBySN ({
@required String host,
@required User user,
@required int hospitalId,
@required String sn
}) async {
Future<List<Device>> getDevicesListBySN({@required String host, @required User user, @required int hospitalId, @required String sn}) async {
Response response;
try {
response = await get(
Uri.parse(host + URLs.getEquipment+"?client=$hospitalId"
+ ( sn == null || sn.isEmpty ? "" : "&serial_qr=$sn" )),
Uri.parse(URLs.getEquipment + "?client=$hospitalId" + (sn == null || sn.isEmpty ? "" : "&serial_qr=$sn")),
);
_stateCode = response.statusCode;
@ -181,6 +164,5 @@ class DevicesProvider extends ChangeNotifier{
notifyListeners();
return [];
}
}
}

@ -17,9 +17,8 @@ class User{
bool isActive;
DateTime tokenLife;
User({
this.id,
User(
{this.id,
this.userName = "",
this.email = "",
this.password = "",
@ -30,12 +29,10 @@ class User{
this.whatsApp,
this.token,
this.tokenLife,
this.isActive = false
});
this.isActive = false});
Future<Map<String, dynamic>> toLoginJson() async {
if(FirebaseNotificationManger.token == null)
await FirebaseNotificationManger.getToken();
if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
return {
"username": userName,
"password": password,
@ -45,18 +42,14 @@ class User{
Map<String, dynamic> toUpdateProfileJson() {
Map<String, dynamic> jsonObject = {};
if(department?.id != null)
jsonObject["department"] = department.id;
if(whatsApp != null && whatsApp.isNotEmpty)
jsonObject["whatsapp"] = whatsApp;
if(phoneNumber != null && phoneNumber.isNotEmpty)
jsonObject["phone"] = phoneNumber;
if (department?.id != null) jsonObject["department"] = department.id;
if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp;
if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber;
return jsonObject;
}
Future<Map<String, dynamic>> toRegisterJson() async {
if(FirebaseNotificationManger.token == null)
await FirebaseNotificationManger.getToken();
if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
return {
"username": userName,
"email": email,
@ -84,17 +77,14 @@ class User{
//"password":password,
"tokenlife": tokenLife.toIso8601String(),
"active": isActive,
"userRoles": type == UsersTypes.engineer
? "value: R-6" : "value: R-5" ,
"userRoles": type == UsersTypes.engineer ? "value: R-6" : "value: R-5",
// "token":token, pass is token
};
}
factory User.fromJson(Map<String, dynamic> parsedJson) {
UsersTypes type;
if(parsedJson["userRoles"].toString().contains("value: R-4")
|| parsedJson["userRoles"].toString().contains("value: R-5")
|| parsedJson["userRoles"].toString().contains("value: R-7")){
if (parsedJson["userRoles"].toString().contains("value: R-4") || parsedJson["userRoles"].toString().contains("value: R-5") || parsedJson["userRoles"].toString().contains("value: R-7")) {
type = UsersTypes.normal_user;
} else {
type = UsersTypes.engineer;
@ -103,10 +93,7 @@ class User{
id: parsedJson["userID"],
userName: parsedJson["username"],
email: parsedJson["email"],
hospital: Hospital(
id: parsedJson["client_id"],
name: parsedJson["client_name"]
),
hospital: Hospital(id: parsedJson["client_id"], name: parsedJson["client_name"]),
department: Department(
id: parsedJson["department_id"],
name: parsedJson["department_name"],
@ -116,7 +103,6 @@ class User{
token: parsedJson["token"],
isActive: parsedJson["isAuthenticated"],
tokenLife: DateTime.tryParse(parsedJson["tokenlife"] ?? ""),
type:type
);
type: type);
}
}

@ -19,6 +19,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../controllers/localization/localization.dart';
class UpdateDeviceTransfer extends StatefulWidget {
final DeviceTransfer model;
final bool isSender;
@ -52,13 +53,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_isLoading = true;
setState(() {});
int status = await _deviceTransferProvider.updateRequest(
user: _userProvider.user,
host: _settingProvider.host,
requestId: widget.model.id,
isSender: widget.isSender,
newModel: _formModel,
oldModel: widget.model
);
user: _userProvider.user, host: _settingProvider.host, requestId: widget.model.id, isSender: widget.isSender, newModel: _formModel, oldModel: widget.model);
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
@ -78,10 +73,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
@override
void initState() {
_formModel.fromDetails(widget.isSender
? widget.model.sender : widget.model.receiver,
withSignature: false
);
_formModel.fromDetails(widget.isSender ? widget.model.sender : widget.model.receiver, withSignature: false);
super.initState();
}
@ -117,18 +109,18 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
padding: const EdgeInsets.all(8.0),
child: Text(
"Edit Transfer Device",
style: Theme.of(context).textTheme.headline5.copyWith(
color: Theme.of(context).primaryColor,
fontSize: 28,
fontWeight: FontWeight.bold
style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold),
),
),
),
const SizedBox(
height: 8,
),
const SizedBox(height: 8,),
ASubTitle("Comment"),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: _formModel?.comment,
textAlign: TextAlign.center,
@ -138,9 +130,13 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_formModel.comment = value;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.travelingHours),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: _formModel?.travelingHours,
textAlign: TextAlign.center,
@ -150,9 +146,13 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_formModel.travelingHours = value;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: _formModel?.workingHours,
textAlign: TextAlign.center,
@ -174,9 +174,13 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
// setState(() {});
// },
// ),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.status),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
GasStatusMenu(
initialValue: _formModel.status,
onSelect: (status) {
@ -184,21 +188,22 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
setState(() {});
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Signature"),
// if(_validate && _formModel.signature == null)
// ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ESignature(
oldSignature: widget.isSender
? widget.model.sender.signature
: widget.model.receiver.signature,
oldSignature: widget.isSender ? widget.model.sender.signature : widget.model.receiver.signature,
newSignature: _signature,
onSaved: (signature) {
_signature = signature;
if (signature == null || signature.isEmpty) return;
_formModel.signature = base64Encode(signature);
},
),
Padding(
@ -208,7 +213,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
onPressed: _update,
),
),
const SizedBox(height: 100,)
const SizedBox(
height: 100,
)
],
),
),
@ -218,4 +225,3 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
);
}
}

@ -1,6 +1,5 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
@ -26,7 +25,6 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart
import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart';
import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart';
import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart';
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart';
import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
@ -153,7 +151,7 @@ class _LandPageState extends State<LandPage> {
mainAxisSpacing: 12,
childAspectRatio: 1,
children: [
if (_userProvider?.user?.type == UsersTypes.normal_user)
if (_userProvider.user != null && _userProvider.user.type == UsersTypes.normal_user)
LandPageItem(
text: _subtitle.newServiceRequest,
icon: FontAwesomeIcons.tools,
@ -279,7 +277,11 @@ class _LandPageState extends State<LandPage> {
decoration: BoxDecoration(border: Border.all(color: Theme.of(context).primaryColor, width: 2), shape: BoxShape.circle),
child: ClipOval(
child: ClipOval(
child: Icon(Icons.person,size: 36,color: Theme.of(context).colorScheme.primary,),
child: Icon(
Icons.person,
size: 36,
color: Theme.of(context).colorScheme.primary,
),
),
),
),

@ -51,34 +51,20 @@ class _ESignatureState extends State<ESignature> {
width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.only(bottom: 8),
height: 90 * AppStyle.getScaleFactor(context),
child: signature != null ?
Image.memory(signature):
ImageLoader(
boxFit: BoxFit.contain,
url: widget.oldSignature)
),
FormField<String>(
onSaved: (_) async {
child: signature != null ? Image.memory(signature) : ImageLoader(boxFit: BoxFit.contain, url: widget.oldSignature)),
FormField<String>(onSaved: (_) async {
widget.onSaved(signature);
},
builder: (FormFieldState<String> state) {
}, builder: (FormFieldState<String> state) {
return Column(
children: [
Container(
width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.symmetric(
horizontal: 16
),
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
]
),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
boxShadow: const [AppStyle.boxShadow]),
child: AbsorbPointer(
absorbing: _unpaint,
child: Signature(
@ -90,28 +76,45 @@ class _ESignatureState extends State<ESignature> {
),
Row(
children: [
IconButton(onPressed: (){_controller.clear();}, icon: const Icon(Icons.clear)),
IconButton(onPressed: (){_controller.undo();}, icon: const Icon(Icons.undo)),
IconButton(onPressed: (){_controller.redo();}, icon: const Icon(Icons.redo)),
IconButton(onPressed: (){
IconButton(
onPressed: () {
_controller.clear();
},
icon: const Icon(Icons.clear)),
IconButton(
onPressed: () {
_controller.undo();
},
icon: const Icon(Icons.undo)),
IconButton(
onPressed: () {
_controller.redo();
},
icon: const Icon(Icons.redo)),
IconButton(
onPressed: () {
_unpaint = !_unpaint;
setState(() {});
}, icon: Icon(
},
icon: Icon(
_unpaint ? Icons.draw : Icons.ac_unit,
color: _unpaint ? AColors.orange : null,)),
color: _unpaint ? AColors.orange : null,
)),
const Spacer(),
IconButton(onPressed: () async {
IconButton(
onPressed: () async {
signature = await _controller.toPngBytes();
widget.onSaved(signature);
if (widget.onChange != null) {
widget.onChange(signature);
}
setState(() {});
}, icon: const Icon(Icons.check)),
},
icon: const Icon(Icons.check)),
],
)
],
);
}
),
}),
],
);
}

@ -9,11 +9,14 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class PentryCalibrationToolForm extends StatefulWidget {
final List<CalibrationTool> models;
final bool enableValidate;
const PentryCalibrationToolForm({
Key key, this.models, this.enableValidate,
Key key,
this.models,
this.enableValidate,
}) : super(key: key);
@override
@ -21,19 +24,13 @@ class PentryCalibrationToolForm extends StatefulWidget {
}
class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
@override
Widget build(BuildContext context) {
final subtitle = AppLocalization.of(context).subtitle;
final userProvider = Provider.of<UserProvider>(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)
),
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) {
@ -65,9 +62,13 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
),
],
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Asset Number"),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
AutoCompleteDeviceNumberField(
initialValue: model.assetsNumber,
hospitalId: userProvider.user.hospital?.id,
@ -75,9 +76,13 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
model.assetsNumber = number;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Date of Testing"),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ADatePicker(
date: model.dataOfTesting,
onDatePicker: (date) {
@ -85,11 +90,14 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
setState(() {});
},
),
const SizedBox(height: 8,),
Divider(color: Theme.of(context).textTheme.titleMedium.color,),
const SizedBox(
height: 8,
),
Divider(
color: Theme.of(context).textTheme.titleMedium.color,
),
],
);
}
);
});
}
}

@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/single_status_menu.dart';
class ServiceRequestPriorityMenu extends StatelessWidget {
final Function(Lookup) onSelect;
final Lookup initialValue;
@ -16,22 +17,19 @@ class ServiceRequestPriorityMenu extends StatelessWidget {
final settingProvider = Provider.of<SettingProvider>(context);
final userProvider = Provider.of<UserProvider>(context);
final menuProvider = Provider.of<ServiceRequestPriorityProvider>(context);
return LoadingManager(
isLoading: menuProvider.isLoading,
isFailedLoading: menuProvider.items == null,
stateCode: menuProvider.stateCode,
onRefresh: () async {
menuProvider.reset();
await menuProvider.getData(
user: userProvider.user,
host: settingProvider.host
);
await menuProvider.getData(user: userProvider.user, host: settingProvider.host);
},
child: SingleStatusMenu(
initialStatus: initialValue,
statuses: menuProvider.items,
onSelect: onSelect,
)
);
));
}
}

@ -2,6 +2,7 @@ import 'package:flutter/material.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';
class SingleStatusMenu extends StatefulWidget {
final List<Lookup> statuses;
final Lookup initialStatus;
@ -14,7 +15,6 @@ class SingleStatusMenu extends StatefulWidget {
}
class _SingleStatusMenuState extends State<SingleStatusMenu> {
Lookup _selectedStatus;
@override
@ -25,8 +25,7 @@ class _SingleStatusMenuState extends State<SingleStatusMenu> {
@override
void didUpdateWidget(covariant SingleStatusMenu oldWidget) {
if (widget.initialStatus != null) {
final result = widget.statuses?.where(
(element) {
final result = widget.statuses?.where((element) {
return element == widget.initialStatus;
});
if (result.isNotEmpty) {
@ -46,8 +45,7 @@ class _SingleStatusMenuState extends State<SingleStatusMenu> {
@override
void initState() {
if (widget.initialStatus != null) {
final result = widget.statuses?.where(
(element) {
final result = widget.statuses?.where((element) {
return element == widget.initialStatus;
});
if (result.isNotEmpty) _selectedStatus = result.first;
@ -76,7 +74,7 @@ class _SingleStatusMenuState extends State<SingleStatusMenu> {
child: DropdownButton<Lookup>(
value: _selectedStatus,
iconSize: 24,
icon: Icon(Icons.keyboard_arrow_down_rounded),
icon: const Icon(Icons.keyboard_arrow_down_rounded),
elevation: 0,
isExpanded: true,
hint: Text(
@ -91,8 +89,7 @@ class _SingleStatusMenuState extends State<SingleStatusMenu> {
});
widget.onSelect(newValue);
},
items: widget.statuses
.map<DropdownMenuItem<Lookup>>((Lookup value) {
items: widget.statuses.map<DropdownMenuItem<Lookup>>((Lookup value) {
return DropdownMenuItem<Lookup>(
value: value,
child: Text(

Loading…
Cancel
Save