pentry added.
parent
f2aba4b924
commit
14eceb7ae5
@ -0,0 +1,75 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/user.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
|
class PentryStatusProvider extends ChangeNotifier{
|
||||||
|
|
||||||
|
//reset provider data
|
||||||
|
void reset(){
|
||||||
|
_items = null;
|
||||||
|
_stateCode = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// state code of current request to defied error message
|
||||||
|
// like 400 customer request failed
|
||||||
|
// 500 service not available
|
||||||
|
int _stateCode;
|
||||||
|
int get stateCode => _stateCode;
|
||||||
|
|
||||||
|
// contain user data
|
||||||
|
// when user not login or register _user = null
|
||||||
|
List<Lookup> _items;
|
||||||
|
List<Lookup> get items => _items;
|
||||||
|
|
||||||
|
// when categories in-process _loading = true
|
||||||
|
// done _loading = true
|
||||||
|
// failed _loading = false
|
||||||
|
bool _loading;
|
||||||
|
bool get isLoading => _loading;
|
||||||
|
set isLoading(bool isLoading){
|
||||||
|
_loading = isLoading;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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<int> getData ({String host,User user}) async {
|
||||||
|
if(_loading == true)
|
||||||
|
return -2;
|
||||||
|
_loading = true;
|
||||||
|
notifyListeners();
|
||||||
|
Response response;
|
||||||
|
try{
|
||||||
|
response = await get(
|
||||||
|
Uri.parse(
|
||||||
|
host + URLs.getPentryStatus),
|
||||||
|
);
|
||||||
|
|
||||||
|
_stateCode = response.statusCode;
|
||||||
|
if(response.statusCode >= 200 && response.statusCode < 300) {
|
||||||
|
// client's request was successfully received
|
||||||
|
List listJson = json.decode(utf8.decode(response.bodyBytes));
|
||||||
|
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList();
|
||||||
|
}
|
||||||
|
_loading = false;
|
||||||
|
notifyListeners();
|
||||||
|
return response.statusCode;
|
||||||
|
} catch(error) {
|
||||||
|
|
||||||
|
_loading = false;
|
||||||
|
_stateCode = -1;
|
||||||
|
notifyListeners();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/user.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
|
class PentryTaskStatusProvider extends ChangeNotifier{
|
||||||
|
|
||||||
|
//reset provider data
|
||||||
|
void reset(){
|
||||||
|
_items = null;
|
||||||
|
_stateCode = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// state code of current request to defied error message
|
||||||
|
// like 400 customer request failed
|
||||||
|
// 500 service not available
|
||||||
|
int _stateCode;
|
||||||
|
int get stateCode => _stateCode;
|
||||||
|
|
||||||
|
// contain user data
|
||||||
|
// when user not login or register _user = null
|
||||||
|
List<Lookup> _items;
|
||||||
|
List<Lookup> get items => _items;
|
||||||
|
|
||||||
|
// when categories in-process _loading = true
|
||||||
|
// done _loading = true
|
||||||
|
// failed _loading = false
|
||||||
|
bool _loading;
|
||||||
|
bool get isLoading => _loading;
|
||||||
|
set isLoading(bool isLoading){
|
||||||
|
_loading = isLoading;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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<int> getData ({String host,User user}) async {
|
||||||
|
if(_loading == true)
|
||||||
|
return -2;
|
||||||
|
_loading = true;
|
||||||
|
notifyListeners();
|
||||||
|
Response response;
|
||||||
|
try{
|
||||||
|
response = await get(
|
||||||
|
Uri.parse(
|
||||||
|
host + URLs.getPentryTaskStatus),
|
||||||
|
);
|
||||||
|
|
||||||
|
_stateCode = response.statusCode;
|
||||||
|
if(response.statusCode >= 200 && response.statusCode < 300) {
|
||||||
|
// client's request was successfully received
|
||||||
|
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
|
||||||
|
_items = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList();
|
||||||
|
}
|
||||||
|
_loading = false;
|
||||||
|
notifyListeners();
|
||||||
|
return response.statusCode;
|
||||||
|
} catch(error) {
|
||||||
|
|
||||||
|
_loading = false;
|
||||||
|
_stateCode = -1;
|
||||||
|
notifyListeners();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/user.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
|
class PentryVisitStatusProvider extends ChangeNotifier{
|
||||||
|
|
||||||
|
//reset provider data
|
||||||
|
void reset(){
|
||||||
|
_items = null;
|
||||||
|
_stateCode = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// state code of current request to defied error message
|
||||||
|
// like 400 customer request failed
|
||||||
|
// 500 service not available
|
||||||
|
int _stateCode;
|
||||||
|
int get stateCode => _stateCode;
|
||||||
|
|
||||||
|
// contain user data
|
||||||
|
// when user not login or register _user = null
|
||||||
|
List<Lookup> _items;
|
||||||
|
List<Lookup> get items => _items;
|
||||||
|
|
||||||
|
// when categories in-process _loading = true
|
||||||
|
// done _loading = true
|
||||||
|
// failed _loading = false
|
||||||
|
bool _loading;
|
||||||
|
bool get isLoading => _loading;
|
||||||
|
set isLoading(bool isLoading){
|
||||||
|
_loading = isLoading;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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<int> getData ({String host,User user}) async {
|
||||||
|
if(_loading == true)
|
||||||
|
return -2;
|
||||||
|
_loading = true;
|
||||||
|
notifyListeners();
|
||||||
|
Response response;
|
||||||
|
try{
|
||||||
|
response = await get(
|
||||||
|
Uri.parse(
|
||||||
|
host + URLs.getPentryVisitStatus),
|
||||||
|
);
|
||||||
|
|
||||||
|
_stateCode = response.statusCode;
|
||||||
|
if(response.statusCode >= 200 && response.statusCode < 300) {
|
||||||
|
// client's request was successfully received
|
||||||
|
List listJson = json.decode(utf8.decode(response.bodyBytes));
|
||||||
|
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList();
|
||||||
|
}
|
||||||
|
_loading = false;
|
||||||
|
notifyListeners();
|
||||||
|
return response.statusCode;
|
||||||
|
} catch(error) {
|
||||||
|
_loading = false;
|
||||||
|
_stateCode = -1;
|
||||||
|
notifyListeners();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/user.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
|
class ServiceRequestDefectTypesProvider extends ChangeNotifier{
|
||||||
|
|
||||||
|
//reset provider data
|
||||||
|
void reset(){
|
||||||
|
_items = null;
|
||||||
|
_stateCode = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// state code of current request to defied error message
|
||||||
|
// like 400 customer request failed
|
||||||
|
// 500 service not available
|
||||||
|
int _stateCode;
|
||||||
|
int get stateCode => _stateCode;
|
||||||
|
|
||||||
|
// contain user data
|
||||||
|
// when user not login or register _user = null
|
||||||
|
List<Lookup> _items;
|
||||||
|
List<Lookup> get items => _items;
|
||||||
|
|
||||||
|
// when categories in-process _loading = true
|
||||||
|
// done _loading = true
|
||||||
|
// failed _loading = false
|
||||||
|
bool _loading;
|
||||||
|
bool get isLoading => _loading;
|
||||||
|
set isLoading(bool isLoading){
|
||||||
|
_loading = isLoading;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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<int> getData ({String host,User user}) async {
|
||||||
|
if(_loading == true)
|
||||||
|
return -2;
|
||||||
|
_loading = true;
|
||||||
|
notifyListeners();
|
||||||
|
Response response;
|
||||||
|
try{
|
||||||
|
response = await get(
|
||||||
|
Uri.parse(
|
||||||
|
host + URLs.getServiceReportDefectTypes),
|
||||||
|
);
|
||||||
|
|
||||||
|
_stateCode = response.statusCode;
|
||||||
|
if(response.statusCode >= 200 && response.statusCode < 300) {
|
||||||
|
// client's request was successfully received
|
||||||
|
List listJson = json.decode(utf8.decode(response.bodyBytes));
|
||||||
|
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList();
|
||||||
|
}
|
||||||
|
_loading = false;
|
||||||
|
notifyListeners();
|
||||||
|
return response.statusCode;
|
||||||
|
} catch(error) {
|
||||||
|
|
||||||
|
_loading = false;
|
||||||
|
_stateCode = -1;
|
||||||
|
notifyListeners();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/user.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
|
class ServiceRequestPriorityProvider extends ChangeNotifier{
|
||||||
|
|
||||||
|
//reset provider data
|
||||||
|
void reset(){
|
||||||
|
_items = null;
|
||||||
|
_stateCode = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// state code of current request to defied error message
|
||||||
|
// like 400 customer request failed
|
||||||
|
// 500 service not available
|
||||||
|
int _stateCode;
|
||||||
|
int get stateCode => _stateCode;
|
||||||
|
|
||||||
|
// contain user data
|
||||||
|
// when user not login or register _user = null
|
||||||
|
List<Lookup> _items;
|
||||||
|
List<Lookup> get items => _items;
|
||||||
|
|
||||||
|
// when categories in-process _loading = true
|
||||||
|
// done _loading = true
|
||||||
|
// failed _loading = false
|
||||||
|
bool _loading;
|
||||||
|
bool get isLoading => _loading;
|
||||||
|
set isLoading(bool isLoading){
|
||||||
|
_loading = isLoading;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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<int> getData ({String host,User user}) async {
|
||||||
|
if(_loading == true)
|
||||||
|
return -2;
|
||||||
|
_loading = true;
|
||||||
|
notifyListeners();
|
||||||
|
Response response;
|
||||||
|
try{
|
||||||
|
response = await get(
|
||||||
|
Uri.parse(
|
||||||
|
host + URLs.getServiceReportPriority),
|
||||||
|
);
|
||||||
|
|
||||||
|
_stateCode = response.statusCode;
|
||||||
|
if(response.statusCode >= 200 && response.statusCode < 300) {
|
||||||
|
// client's request was successfully received
|
||||||
|
List listJson = json.decode(utf8.decode(response.bodyBytes));
|
||||||
|
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList();
|
||||||
|
}
|
||||||
|
_loading = false;
|
||||||
|
notifyListeners();
|
||||||
|
return response.statusCode;
|
||||||
|
} catch(error) {
|
||||||
|
_loading = false;
|
||||||
|
_stateCode = -1;
|
||||||
|
notifyListeners();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
|
||||||
|
class CalibrationTool{
|
||||||
|
Lookup assetsNumber;
|
||||||
|
DateTime dataOfTesting;
|
||||||
|
|
||||||
|
CalibrationTool({
|
||||||
|
this.assetsNumber,
|
||||||
|
this.dataOfTesting,
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, String> toMap() {
|
||||||
|
return {
|
||||||
|
if(assetsNumber != null) 'assetsSN': (assetsNumber?.id).toString(),
|
||||||
|
if(dataOfTesting != null) 'dataOfTesting': (dataOfTesting.millisecondsSinceEpoch ~/ 1000).toString(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
factory CalibrationTool.fromMap(Map<String, dynamic> map) {
|
||||||
|
return CalibrationTool(
|
||||||
|
assetsNumber: Lookup.fromJson(map['assetsSN']),
|
||||||
|
dataOfTesting: map['dataOfTesting'] == null || map['dataOfTesting'] == "" ? null :
|
||||||
|
DateTime.fromMillisecondsSinceEpoch(int.tryParse(map['dataOfTesting']) * 1000),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
|
||||||
|
class Contact{
|
||||||
|
Lookup title;
|
||||||
|
Lookup contactPerson;
|
||||||
|
String job;
|
||||||
|
String email;
|
||||||
|
String telephone;
|
||||||
|
String landLine;
|
||||||
|
|
||||||
|
Contact({
|
||||||
|
this.title,
|
||||||
|
this.contactPerson,
|
||||||
|
this.job,
|
||||||
|
this.email,
|
||||||
|
this.telephone,
|
||||||
|
this.landLine
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, String> toMap() {
|
||||||
|
return {
|
||||||
|
if (title != null) 'title': title.id.toString(),
|
||||||
|
if (contactPerson != null) 'contactPerson': contactPerson.id.toString(),
|
||||||
|
if (job != null) 'job': job,
|
||||||
|
if (email != null) 'email': email,
|
||||||
|
if (telephone != null) 'telephone': telephone,
|
||||||
|
if (landLine != null) 'landLine': landLine,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
factory Contact.fromMap(Map<String, dynamic> map) {
|
||||||
|
return Contact(
|
||||||
|
title: map['title'] as Lookup,
|
||||||
|
contactPerson: map['contactPerson'] as Lookup,
|
||||||
|
job: map['job'] as String,
|
||||||
|
email: map['email'] as String,
|
||||||
|
telephone: map['telephone'] as String,
|
||||||
|
landLine: map['landLine'] as String,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
|
||||||
|
class ContactTitle extends Lookup {
|
||||||
|
ContactTitle({
|
||||||
|
int id,
|
||||||
|
String label
|
||||||
|
}):super(id: id,label: label);
|
||||||
|
|
||||||
|
factory ContactTitle.fromMap(Map<String,dynamic> parsedJson){
|
||||||
|
return ContactTitle(
|
||||||
|
label: parsedJson["value"],
|
||||||
|
id: parsedJson["id"],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
|
||||||
|
class ContactTitle extends Lookup {
|
||||||
|
ContactTitle({
|
||||||
|
int id,
|
||||||
|
String label
|
||||||
|
}):super(id: id,label: label);
|
||||||
|
|
||||||
|
factory ContactTitle.fromMap(Map<String,dynamic> parsedJson){
|
||||||
|
return ContactTitle(
|
||||||
|
label: parsedJson["value"],
|
||||||
|
id: parsedJson["id"],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,121 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/pantry/calibration_tools.dart';
|
||||||
|
import 'package:test_sa/models/pantry/contact.dart';
|
||||||
|
import 'package:test_sa/models/pantry/pm_kit.dart';
|
||||||
|
import 'package:test_sa/models/pantry/ppm_check_list.dart';
|
||||||
|
import 'package:test_sa/models/timer_model.dart';
|
||||||
|
|
||||||
|
class Pentry{
|
||||||
|
Lookup ppmVisitStatus;
|
||||||
|
Lookup status;
|
||||||
|
TimerModel timer;
|
||||||
|
DateTime actualVisitDate;
|
||||||
|
String travelingHours;
|
||||||
|
String image;
|
||||||
|
File imageFile;
|
||||||
|
// List<Contact> contacts;
|
||||||
|
List<PPMCheckList> ppmCheckLists;
|
||||||
|
List<CalibrationTool> calibrationTools;
|
||||||
|
List<PMKit> pmKits;
|
||||||
|
|
||||||
|
Pentry({
|
||||||
|
this.travelingHours,
|
||||||
|
this.timer,
|
||||||
|
this.status,
|
||||||
|
this.ppmVisitStatus,
|
||||||
|
this.actualVisitDate,
|
||||||
|
this.image,
|
||||||
|
this.imageFile,
|
||||||
|
// this.contacts,
|
||||||
|
this.ppmCheckLists,
|
||||||
|
this.calibrationTools,
|
||||||
|
this.pmKits,
|
||||||
|
});
|
||||||
|
|
||||||
|
bool validate(){
|
||||||
|
if(actualVisitDate == null) return false;
|
||||||
|
if(timer == null && timer.endAt != null) return false;
|
||||||
|
if(ppmVisitStatus == null) return false;
|
||||||
|
//if(status == null) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, String> toMap() {
|
||||||
|
Map<String, String> map = {};
|
||||||
|
map["visit_status"] = ppmVisitStatus?.id.toString();
|
||||||
|
if(status != null) map["pentry_status"] = status?.id.toString();
|
||||||
|
if(travelingHours != null) map["traveling_hours"] = travelingHours;
|
||||||
|
if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync());
|
||||||
|
map["actual_date"] = (actualVisitDate.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
|
||||||
|
if(timer != null){
|
||||||
|
map["start_date"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
|
||||||
|
map["end_date"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0);
|
||||||
|
map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5);
|
||||||
|
}
|
||||||
|
// if(contacts?.isNotEmpty == true) {
|
||||||
|
// for(int i = 0;i<contacts.length;i++){
|
||||||
|
// contacts[i].toMap().forEach((key, value) {
|
||||||
|
// body["contacts[$i].$key"] = value;
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
map["ppmCheckLists"] = jsonEncode(ppmCheckLists.map((e) => e.toMap()).toList());
|
||||||
|
map["calibrationTools"] = jsonEncode(calibrationTools.map((e) => e.toMap()).toList());
|
||||||
|
map["pmKits"] = jsonEncode(pmKits.map((e) => e.toMap()).toList());
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
factory Pentry.fromMap(Map<String, dynamic> map) {
|
||||||
|
// List<Contact> contacts = [];
|
||||||
|
// if(map['contacts'] != null){
|
||||||
|
// contacts =(map['contacts'] as List<dynamic>)
|
||||||
|
// .map((e) => Contact.fromMap(e as Map<String, dynamic>))
|
||||||
|
// .toList();
|
||||||
|
// }
|
||||||
|
|
||||||
|
List<PMKit> pmKits = [];
|
||||||
|
if(map['pmKits'] != null){
|
||||||
|
pmKits =(map['pmKits'] as List<dynamic>)
|
||||||
|
.map((e) => PMKit.fromMap(e as Map<String, dynamic>))
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<PPMCheckList> ppmCheckLists = [];
|
||||||
|
if(map['ppmCheckLists'] != null){
|
||||||
|
ppmCheckLists =(map['ppmCheckLists'] as List<dynamic>)
|
||||||
|
.map((e) => PPMCheckList.fromMap(e as Map<String, dynamic>))
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CalibrationTool> calibrationTools = [];
|
||||||
|
if(map['calibrationTools'] != null){
|
||||||
|
calibrationTools =(map['calibrationTools'] as List<dynamic>)
|
||||||
|
.map((e) => CalibrationTool.fromMap(e as Map<String, dynamic>))
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
return Pentry(
|
||||||
|
status: Lookup.fromJson(map["pentry_status"]),
|
||||||
|
ppmVisitStatus: Lookup.fromJson(map["visit_status"]),
|
||||||
|
actualVisitDate: getDate(map["actual_date"]),
|
||||||
|
travelingHours: map["traveling_hours"],
|
||||||
|
timer: TimerModel(
|
||||||
|
startAt: getDate(map["start_date"]),
|
||||||
|
endAt: getDate(map["end_date"]),
|
||||||
|
durationInSecond: (int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 *60
|
||||||
|
),
|
||||||
|
// contacts: contacts,
|
||||||
|
ppmCheckLists: ppmCheckLists,
|
||||||
|
calibrationTools: calibrationTools,
|
||||||
|
pmKits: pmKits,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static getDate(String date){
|
||||||
|
return date == null || date.isEmpty
|
||||||
|
? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
|
||||||
|
class PMKit{
|
||||||
|
Lookup itemCode;
|
||||||
|
String itemName;
|
||||||
|
String preparationTimeFrame;
|
||||||
|
String kitFrequencyDemand;
|
||||||
|
String availability;
|
||||||
|
String quantityNeeded;
|
||||||
|
String quantityReserved;
|
||||||
|
|
||||||
|
PMKit({
|
||||||
|
this.itemCode,
|
||||||
|
this.itemName,
|
||||||
|
this.preparationTimeFrame,
|
||||||
|
this.kitFrequencyDemand,
|
||||||
|
this.availability,
|
||||||
|
this.quantityNeeded,
|
||||||
|
this.quantityReserved
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, String> toMap() {
|
||||||
|
return {
|
||||||
|
if(itemCode != null) 'itemCode': (itemCode?.id).toString(),
|
||||||
|
if(itemName != null) 'itemName': itemName,
|
||||||
|
if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame,
|
||||||
|
if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand,
|
||||||
|
if(availability != null) 'availability': availability,
|
||||||
|
if(quantityNeeded != null) 'quantityNeeded': quantityNeeded,
|
||||||
|
if(quantityReserved != null) 'quantityReserved': quantityReserved,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
factory PMKit.fromMap(Map<String, dynamic> map) {
|
||||||
|
return PMKit(
|
||||||
|
itemCode: Lookup.fromJson(map['itemCode']),
|
||||||
|
itemName: map['itemName'] as String,
|
||||||
|
preparationTimeFrame: map['preparationTimeFrame'] as String,
|
||||||
|
kitFrequencyDemand: map['kitFrequencyDemand'] as String,
|
||||||
|
availability: map['availability'] as String,
|
||||||
|
quantityNeeded: map['quantityNeeded'] as String,
|
||||||
|
quantityReserved: map['quantityReserved'] as String,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
|
||||||
|
class PPMCheckList{
|
||||||
|
Lookup status;
|
||||||
|
String title;
|
||||||
|
String comment;
|
||||||
|
String measuredValue;
|
||||||
|
|
||||||
|
PPMCheckList({
|
||||||
|
this.title,
|
||||||
|
this.status,
|
||||||
|
this.comment,
|
||||||
|
this.measuredValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, String> toMap() {
|
||||||
|
return {
|
||||||
|
if(status != null) 'status': status?.id.toString(),
|
||||||
|
if(title != null) 'title': title,
|
||||||
|
if(comment != null) 'comment': comment,
|
||||||
|
if(measuredValue != null) 'measuredValue': measuredValue,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
factory PPMCheckList.fromMap(Map<String, dynamic> map) {
|
||||||
|
return PPMCheckList(
|
||||||
|
status: Lookup.fromJson(map['status']),
|
||||||
|
title: map['title'] as String,
|
||||||
|
comment: map['comment'] as String,
|
||||||
|
measuredValue: map['measuredValue'] as String,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,187 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
|
||||||
|
import 'package:test_sa/controllers/localization/localization.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/regular_visits_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/models/pantry/pentry.dart';
|
||||||
|
import 'package:test_sa/models/subtitle.dart';
|
||||||
|
import 'package:test_sa/models/visits/visit.dart';
|
||||||
|
import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
|
||||||
|
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||||
|
import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart';
|
||||||
|
import 'package:test_sa/views/widgets/pentry/pentry_info_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';
|
||||||
|
|
||||||
|
class EditPentry extends StatefulWidget {
|
||||||
|
final Pentry pentry;
|
||||||
|
final Visit visit;
|
||||||
|
const EditPentry({Key key,this.pentry, this.visit}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<EditPentry> createState() => _EditPentryState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin{
|
||||||
|
bool _isLoading = false;
|
||||||
|
bool _validate = false;
|
||||||
|
Subtitle _subtitle;
|
||||||
|
UserProvider _userProvider;
|
||||||
|
SettingProvider _settingProvider;
|
||||||
|
RegularVisitsProvider _regularVisitsProvider;
|
||||||
|
Pentry _pentry;
|
||||||
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||||
|
|
||||||
|
TabController _tabController;
|
||||||
|
_onSubmit() async {
|
||||||
|
_validate = true;
|
||||||
|
|
||||||
|
if(!_pentry.validate()) {
|
||||||
|
setState(() { });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_isLoading = true;
|
||||||
|
setState(() {});
|
||||||
|
|
||||||
|
int status = await _regularVisitsProvider.updatePentry(
|
||||||
|
user: _userProvider.user,
|
||||||
|
host: _settingProvider.host,
|
||||||
|
pentry: _pentry,
|
||||||
|
visit: widget.visit
|
||||||
|
);
|
||||||
|
_isLoading =false;
|
||||||
|
setState(() {});
|
||||||
|
if(status >= 200 && status < 300){
|
||||||
|
Fluttertoast.showToast(
|
||||||
|
msg: _subtitle.requestCompleteSuccessfully,
|
||||||
|
);
|
||||||
|
// Navigator.of(context).pop();
|
||||||
|
}else{
|
||||||
|
String errorMessage = HttpStatusManger.getStatusMessage(
|
||||||
|
status: status, subtitle: _subtitle);
|
||||||
|
Fluttertoast.showToast(
|
||||||
|
msg: errorMessage,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_pentry = widget.pentry;
|
||||||
|
_tabController = TabController(length: 4, vsync: this);
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_tabController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
_subtitle = AppLocalization.of(context).subtitle;
|
||||||
|
_userProvider = Provider.of<UserProvider>(context);
|
||||||
|
_settingProvider = Provider.of<SettingProvider>(context);
|
||||||
|
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
|
||||||
|
return Scaffold(
|
||||||
|
key: _scaffoldKey,
|
||||||
|
body: SafeArea(
|
||||||
|
child: LoadingManager(
|
||||||
|
isLoading: _isLoading,
|
||||||
|
isFailedLoading: false,
|
||||||
|
stateCode: 200,
|
||||||
|
onRefresh: () async {},
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Material(
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(2.0),
|
||||||
|
child: TabBar(
|
||||||
|
controller: _tabController,
|
||||||
|
isScrollable: true,
|
||||||
|
onTap: (index){
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
tabs: const [
|
||||||
|
Tab(text: "PPM Check List",),
|
||||||
|
Tab(text: "Calibration Tools",),
|
||||||
|
Tab(text: "PK Kits",),
|
||||||
|
Tab(text: "Pentry",),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
TabBarView(
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
controller: _tabController,
|
||||||
|
children: [
|
||||||
|
PentryPPMCheckListForm(
|
||||||
|
models: _pentry.ppmCheckLists,
|
||||||
|
enableValidate: _validate,
|
||||||
|
),
|
||||||
|
PentryCalibrationToolForm(
|
||||||
|
models: _pentry.calibrationTools,
|
||||||
|
enableValidate: _validate,
|
||||||
|
),
|
||||||
|
PentryPMKitForm(
|
||||||
|
models: _pentry.pmKits,
|
||||||
|
enableValidate: _validate,
|
||||||
|
),
|
||||||
|
PentryInfoForm(
|
||||||
|
model: _pentry,
|
||||||
|
enableValidate: _validate,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.bottomCenter,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
if(_tabController.index != 0)
|
||||||
|
ASmallButton(
|
||||||
|
text: _subtitle.back,
|
||||||
|
onPressed: (){
|
||||||
|
_tabController.animateTo(_tabController.index - 1,);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const Spacer(),
|
||||||
|
if(_tabController.index != _tabController.length -1)
|
||||||
|
ASmallButton(
|
||||||
|
text: _subtitle.next,
|
||||||
|
onPressed: (){
|
||||||
|
_tabController.animateTo(_tabController.index + 1,);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
if(_tabController.index == _tabController.length -1)
|
||||||
|
ASmallButton(
|
||||||
|
text: _subtitle.update,
|
||||||
|
onPressed: _onSubmit,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
],
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
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/regular_visits_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/models/pantry/pentry.dart';
|
||||||
|
import 'package:test_sa/models/subtitle.dart';
|
||||||
|
import 'package:test_sa/models/visits/visit.dart';
|
||||||
|
import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart';
|
||||||
|
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
|
||||||
|
import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
|
||||||
|
class FutureEditPentry extends StatefulWidget {
|
||||||
|
|
||||||
|
final Visit visit;
|
||||||
|
|
||||||
|
const FutureEditPentry({Key key, this.visit}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<FutureEditPentry> createState() => _FutureEditPentryState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _FutureEditPentryState extends State<FutureEditPentry> {
|
||||||
|
|
||||||
|
UserProvider _userProvider;
|
||||||
|
SettingProvider _settingProvider;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
_userProvider = Provider.of<UserProvider>(context);
|
||||||
|
_settingProvider = Provider.of<SettingProvider>(context);
|
||||||
|
//String requestId = ModalRoute.of(context).settings.arguments;
|
||||||
|
Subtitle subtitle = AppLocalization.of(context).subtitle;
|
||||||
|
return Scaffold(
|
||||||
|
body: FutureBuilder<Pentry>(
|
||||||
|
future: RegularVisitsProvider().getPently(
|
||||||
|
user: _userProvider.user,
|
||||||
|
host: _settingProvider.host,
|
||||||
|
id: widget.visit.id
|
||||||
|
),
|
||||||
|
builder: (BuildContext context, AsyncSnapshot<Pentry> snapshot){
|
||||||
|
if(snapshot.hasError) {
|
||||||
|
|
||||||
|
return FailedLoading(
|
||||||
|
message: subtitle.failedToCompleteRequest,
|
||||||
|
onReload: (){setState(() {});},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if(snapshot.hasData){
|
||||||
|
return EditPentry(
|
||||||
|
pentry: snapshot.data,
|
||||||
|
visit: widget.visit,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return const Center(child: ALoading());
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
||||||
|
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/models/device/device.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 AutoCompleteDeviceNumberField extends StatefulWidget {
|
||||||
|
final Lookup initialValue;
|
||||||
|
final String hospitalId;
|
||||||
|
final Function(Lookup) onPick;
|
||||||
|
|
||||||
|
const AutoCompleteDeviceNumberField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AutoCompleteDeviceNumberField> createState() => _AutoCompleteDeviceNumberFieldState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumberField> {
|
||||||
|
|
||||||
|
SettingProvider _settingProvider;
|
||||||
|
DevicesProvider _devicesProvider;
|
||||||
|
UserProvider _userProvider;
|
||||||
|
TextEditingController _controller;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_controller = TextEditingController(text: widget.initialValue?.label);
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_controller.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
_settingProvider = Provider.of<SettingProvider>(context);
|
||||||
|
_userProvider = Provider.of<UserProvider>(context);
|
||||||
|
_devicesProvider = Provider.of<DevicesProvider>(context);
|
||||||
|
//Subtitle _subtitle = AppLocalization.of(context).subtitle;
|
||||||
|
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: TypeAheadField<Device>(
|
||||||
|
textFieldConfiguration: TextFieldConfiguration(
|
||||||
|
style: Theme.of(context).textTheme.headline6,
|
||||||
|
controller: _controller,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
decoration: const InputDecoration(
|
||||||
|
border: InputBorder.none,
|
||||||
|
disabledBorder: InputBorder.none,
|
||||||
|
focusedBorder: InputBorder.none,
|
||||||
|
enabledBorder: InputBorder.none,
|
||||||
|
),
|
||||||
|
textInputAction: TextInputAction.search,
|
||||||
|
),
|
||||||
|
suggestionsCallback: (vale) async {
|
||||||
|
return await _devicesProvider.getDevicesList(
|
||||||
|
host: _settingProvider.host,
|
||||||
|
user: _userProvider.user,
|
||||||
|
hospitalId: widget.hospitalId,
|
||||||
|
number: vale,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
itemBuilder: (context, device) {
|
||||||
|
return ListTile(
|
||||||
|
title: Text(device.number),
|
||||||
|
subtitle: Text("${device.model}/${device.brand}"),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
onSuggestionSelected: (device) {
|
||||||
|
_controller.text = device.number;
|
||||||
|
widget.onPick(Lookup(id: int.tryParse(device.id),label: device.number));
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,95 @@
|
|||||||
|
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/user_provider.dart';
|
||||||
|
import 'package:test_sa/models/pantry/calibration_tools.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/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,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<PentryCalibrationToolForm> createState() => _PentryCalibrationToolFormState();
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
),
|
||||||
|
itemCount: widget.models.length + 1,
|
||||||
|
itemBuilder: (context,index){
|
||||||
|
if(index == widget.models.length){
|
||||||
|
return AButton(
|
||||||
|
text: subtitle.add,
|
||||||
|
onPressed: (){
|
||||||
|
widget.models.add(CalibrationTool());
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
final model = widget.models[index];
|
||||||
|
return ListView(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const ClampingScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
ASubTitle("#${index+1}"),
|
||||||
|
if(index != 0)
|
||||||
|
ASmallButton(
|
||||||
|
color: Theme.of(context).colorScheme.error,
|
||||||
|
text: subtitle.delete,
|
||||||
|
onPressed: (){
|
||||||
|
widget.models.remove(model);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Asset Number"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
AutoCompleteDeviceNumberField(
|
||||||
|
initialValue: model.assetsNumber,
|
||||||
|
hospitalId: userProvider.user.hospital.id,
|
||||||
|
onPick: (number){
|
||||||
|
model.assetsNumber = number;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Date of Testing"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ADatePicker(
|
||||||
|
date: model.dataOfTesting,
|
||||||
|
onDatePicker: (date){
|
||||||
|
model.dataOfTesting =date;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
Divider(color: Theme.of(context).textTheme.titleMedium.color,),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,114 @@
|
|||||||
|
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/user_provider.dart';
|
||||||
|
import 'package:test_sa/models/pantry/pentry.dart';
|
||||||
|
import 'package:test_sa/views/app_style/sizing.dart';
|
||||||
|
import 'package:test_sa/views/widgets/app_text_form_field.dart';
|
||||||
|
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
|
||||||
|
import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart';
|
||||||
|
import 'package:test_sa/views/widgets/status/pentry/pentry_status_mune.dart';
|
||||||
|
import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart';
|
||||||
|
import 'package:test_sa/views/widgets/timer/app_timer.dart';
|
||||||
|
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
|
||||||
|
class PentryInfoForm extends StatefulWidget {
|
||||||
|
final Pentry model;
|
||||||
|
final bool enableValidate;
|
||||||
|
const PentryInfoForm({
|
||||||
|
Key key, this.model, this.enableValidate,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<PentryInfoForm> createState() => _PentryInfoFormState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PentryInfoFormState extends State<PentryInfoForm> {
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final subtitle = AppLocalization.of(context).subtitle;
|
||||||
|
final userProvider = Provider.of<UserProvider>(context);
|
||||||
|
return ListView(
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: 12 * AppStyle.getScaleFactor(context),
|
||||||
|
left: 12 * AppStyle.getScaleFactor(context),
|
||||||
|
right: 12 * AppStyle.getScaleFactor(context),
|
||||||
|
bottom: 80 * AppStyle.getScaleFactor(context)
|
||||||
|
),
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const ClampingScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("PPM Visit Status"),
|
||||||
|
if(widget.enableValidate && widget.model.ppmVisitStatus == null)
|
||||||
|
ASubTitle(subtitle.requiredWord,color: Colors.red,),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
PentryVisitsStatusMenu(
|
||||||
|
initialValue: widget.model.ppmVisitStatus,
|
||||||
|
onSelect: (status){
|
||||||
|
widget.model.ppmVisitStatus = status;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Timer"),
|
||||||
|
if(widget.enableValidate && widget.model?.timer?.endAt == null)
|
||||||
|
ASubTitle(subtitle.requiredWord,color: Colors.red,),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
AppTimer(
|
||||||
|
timer: widget.model.timer,
|
||||||
|
onChange: (timer) async{
|
||||||
|
widget.model.timer = timer;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Status"),
|
||||||
|
// if(widget.enableValidate && widget.model.status == null)
|
||||||
|
// ASubTitle(subtitle.requiredWord,color: Colors.red,),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
PentryStatusMenu(
|
||||||
|
initialValue: widget.model.status,
|
||||||
|
onSelect: (status){
|
||||||
|
widget.model.status = status;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Actual Visit Date"),
|
||||||
|
if(widget.enableValidate && widget.model.actualVisitDate == null)
|
||||||
|
ASubTitle(subtitle.requiredWord,color: Colors.red,),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ADatePicker(
|
||||||
|
date: widget.model.actualVisitDate,
|
||||||
|
from: DateTime.now().subtract(const Duration(days: 30)),
|
||||||
|
onDatePicker: (date){
|
||||||
|
if(date == null) return;
|
||||||
|
widget.model.actualVisitDate = date;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Traveling Hours"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (widget.model.travelingHours ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.number,
|
||||||
|
onChange: (value){
|
||||||
|
widget.model.travelingHours = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 12,),
|
||||||
|
const ASubTitle("PPM Attachment"),
|
||||||
|
AMiniOneImagePicker(
|
||||||
|
//error: _validate && _serviceReport.image == null,
|
||||||
|
image: widget.model.imageFile,
|
||||||
|
onPick: (image){
|
||||||
|
widget.model.imageFile =image;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,154 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:test_sa/controllers/localization/localization.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/app_text_form_field.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/views/widgets/parts/auto_complete_parts_field.dart';
|
||||||
|
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
|
||||||
|
class PentryPMKitForm extends StatefulWidget {
|
||||||
|
final List<PMKit> models;
|
||||||
|
final bool enableValidate;
|
||||||
|
const PentryPMKitForm({
|
||||||
|
Key key, this.models, this.enableValidate,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<PentryPMKitForm> createState() => _PentryPMKitFormState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PentryPMKitFormState extends State<PentryPMKitForm> {
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final subtitle = AppLocalization.of(context).subtitle;
|
||||||
|
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: subtitle.add,
|
||||||
|
onPressed: (){
|
||||||
|
widget.models.add(PMKit());
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
final model = widget.models[index];
|
||||||
|
return ListView(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const ClampingScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
ASubTitle("#${index+1}"),
|
||||||
|
if(index != 0)
|
||||||
|
ASmallButton(
|
||||||
|
color: Theme.of(context).colorScheme.error,
|
||||||
|
text: subtitle.delete,
|
||||||
|
onPressed: (){
|
||||||
|
widget.models.remove(model);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Item Code"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
AutoCompletePartsField(
|
||||||
|
clearAfterPick: false,
|
||||||
|
initialValue: (model.itemCode?.label ?? "").toString(),
|
||||||
|
onPick: (part){
|
||||||
|
model.itemCode = Lookup(id: int.tryParse(part.id),label: part.code);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Item Name"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.itemName ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
onChange: (value){
|
||||||
|
model.itemName = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Preparation Time Frame"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.preparationTimeFrame ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
onChange: (value){
|
||||||
|
model.preparationTimeFrame = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("kit Frequency Demand"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.kitFrequencyDemand ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
onChange: (value){
|
||||||
|
model.kitFrequencyDemand = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Availability"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.availability ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
onChange: (value){
|
||||||
|
model.availability = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Quantity Needed"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.quantityNeeded ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.number,
|
||||||
|
onChange: (value){
|
||||||
|
model.quantityNeeded = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Quantity Reserved"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.quantityReserved ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.number,
|
||||||
|
onChange: (value){
|
||||||
|
model.quantityReserved = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
Divider(color: Theme.of(context).textTheme.titleMedium.color,),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:test_sa/controllers/localization/localization.dart';
|
||||||
|
import 'package:test_sa/models/pantry/ppm_check_list.dart';
|
||||||
|
import 'package:test_sa/views/app_style/sizing.dart';
|
||||||
|
import 'package:test_sa/views/widgets/app_text_form_field.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/views/widgets/status/pentry/pentry_task_status_mune.dart';
|
||||||
|
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
|
||||||
|
class PentryPPMCheckListForm extends StatefulWidget {
|
||||||
|
final List<PPMCheckList> models;
|
||||||
|
final bool enableValidate;
|
||||||
|
const PentryPPMCheckListForm({
|
||||||
|
Key key, this.models, this.enableValidate,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<PentryPPMCheckListForm> createState() => _PentryPPMCheckListFormState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> {
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final subtitle = AppLocalization.of(context).subtitle;
|
||||||
|
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: subtitle.add,
|
||||||
|
onPressed: (){
|
||||||
|
widget.models.add(PPMCheckList());
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
final model = widget.models[index];
|
||||||
|
return ListView(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const ClampingScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
ASubTitle("#${index+1}"),
|
||||||
|
if(index != 0)
|
||||||
|
ASmallButton(
|
||||||
|
color: Theme.of(context).colorScheme.error,
|
||||||
|
text: subtitle.delete,
|
||||||
|
onPressed: (){
|
||||||
|
widget.models.remove(model);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Task"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.title ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
onChange: (value){
|
||||||
|
model.title = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
ASubTitle(subtitle.status),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
PentryTaskStatusMenu(
|
||||||
|
initialValue: model.status,
|
||||||
|
onSelect: (status){
|
||||||
|
model.status = status;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Comment"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.comment ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
onChange: (value){
|
||||||
|
model.comment = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
const ASubTitle("Measured Value"),
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
ATextFormField(
|
||||||
|
initialValue: (model.measuredValue ?? "").toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
textInputType: TextInputType.text,
|
||||||
|
onChange: (value){
|
||||||
|
model.measuredValue = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8,),
|
||||||
|
Divider(color: Theme.of(context).textTheme.titleMedium.color,),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_status_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/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 PentryStatusMenu extends StatelessWidget {
|
||||||
|
final Function(Lookup) onSelect;
|
||||||
|
final Lookup initialValue;
|
||||||
|
|
||||||
|
const PentryStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final settingProvider = Provider.of<SettingProvider>(context);
|
||||||
|
final userProvider = Provider.of<UserProvider>(context);
|
||||||
|
final menuProvider = Provider.of<PentryStatusProvider>(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
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SingleStatusMenu(
|
||||||
|
initialStatus: initialValue,
|
||||||
|
statuses: menuProvider.items,
|
||||||
|
onSelect: onSelect,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_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/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 PentryTaskStatusMenu extends StatelessWidget {
|
||||||
|
final Function(Lookup) onSelect;
|
||||||
|
final Lookup initialValue;
|
||||||
|
|
||||||
|
const PentryTaskStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final settingProvider = Provider.of<SettingProvider>(context);
|
||||||
|
final userProvider = Provider.of<UserProvider>(context);
|
||||||
|
final menuProvider = Provider.of<PentryTaskStatusProvider>(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
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SingleStatusMenu(
|
||||||
|
initialStatus: initialValue,
|
||||||
|
statuses: menuProvider.items,
|
||||||
|
onSelect: onSelect,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_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/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 PentryVisitsStatusMenu extends StatelessWidget {
|
||||||
|
final Function(Lookup) onSelect;
|
||||||
|
final Lookup initialValue;
|
||||||
|
|
||||||
|
const PentryVisitsStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final settingProvider = Provider.of<SettingProvider>(context);
|
||||||
|
final userProvider = Provider.of<UserProvider>(context);
|
||||||
|
final menuProvider = Provider.of<PentryVisitStatusProvider>(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
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SingleStatusMenu(
|
||||||
|
initialStatus: initialValue,
|
||||||
|
statuses: menuProvider.items,
|
||||||
|
onSelect: onSelect,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_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/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 ServiceRequestDefectTypesMenu extends StatelessWidget {
|
||||||
|
final Function(Lookup) onSelect;
|
||||||
|
final Lookup initialValue;
|
||||||
|
|
||||||
|
const ServiceRequestDefectTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final settingProvider = Provider.of<SettingProvider>(context);
|
||||||
|
final userProvider = Provider.of<UserProvider>(context);
|
||||||
|
final menuProvider = Provider.of<ServiceRequestDefectTypesProvider>(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
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SingleStatusMenu(
|
||||||
|
initialStatus: initialValue,
|
||||||
|
statuses: menuProvider.items,
|
||||||
|
onSelect: onSelect,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_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/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;
|
||||||
|
|
||||||
|
const ServiceRequestPriorityMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
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
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SingleStatusMenu(
|
||||||
|
initialStatus: initialValue,
|
||||||
|
statuses: menuProvider.items,
|
||||||
|
onSelect: onSelect,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue