version 0.7.4 - update pentry
add update pentry add Defect Type and priority for service request rename and remove unused fields add search with asset number and view it in service request and ppm visitmerge-requests/22/head
parent
2d2e22fa11
commit
bba0b3d7d7
@ -0,0 +1,18 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/pantry/pentry.dart';
|
||||||
|
import 'package:test_sa/models/visits/visit.dart';
|
||||||
|
|
||||||
|
import '../../../models/user.dart';
|
||||||
|
import '../../api_routes/urls.dart';
|
||||||
|
|
||||||
|
class PentryController {
|
||||||
|
const PentryController._();
|
||||||
|
|
||||||
|
static const PentryController instance = PentryController._();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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),
|
||||||
|
);
|
||||||
|
print(response.body);
|
||||||
|
_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) {
|
||||||
|
print(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),
|
||||||
|
);
|
||||||
|
print(response.body);
|
||||||
|
_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) {
|
||||||
|
print(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 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),
|
||||||
|
);
|
||||||
|
print(response.body);
|
||||||
|
_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) {
|
||||||
|
print(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),
|
||||||
|
);
|
||||||
|
print(response.body);
|
||||||
|
_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) {
|
||||||
|
print(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 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),
|
||||||
|
);
|
||||||
|
print(response.body);
|
||||||
|
_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) {
|
||||||
|
print(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,192 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/data/pentry/pentry_controller.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/device_transfer_provider.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/device/device_transfer.dart';
|
||||||
|
import 'package:test_sa/models/device/device_transfer_info.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_button.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,60 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/data/pentry/pentry_controller.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) {
|
||||||
|
print(snapshot.error);
|
||||||
|
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,95 @@
|
|||||||
|
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';
|
||||||
|
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
||||||
|
import 'package:provider/provider.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,100 @@
|
|||||||
|
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/models/pantry/contact.dart';
|
||||||
|
import 'package:test_sa/models/pantry/ppm_check_list.dart';
|
||||||
|
import 'package:test_sa/views/app_style/colors.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/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/status/pentry/pentry_task_status_mune.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,123 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:intl/intl.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/models/pantry/contact.dart';
|
||||||
|
import 'package:test_sa/models/pantry/pentry.dart';
|
||||||
|
import 'package:test_sa/models/pantry/ppm_check_list.dart';
|
||||||
|
import 'package:test_sa/views/app_style/colors.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/date_and_time/date_picker.dart';
|
||||||
|
import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart';
|
||||||
|
import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart';
|
||||||
|
import 'package:test_sa/views/widgets/status/pentry/pentry_status_mune.dart';
|
||||||
|
import 'package:test_sa/views/widgets/status/pentry/pentry_task_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,158 @@
|
|||||||
|
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/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/views/app_style/colors.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/status/pentry/pentry_task_status_mune.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,119 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:test_sa/controllers/localization/localization.dart';
|
||||||
|
import 'package:test_sa/models/pantry/contact.dart';
|
||||||
|
import 'package:test_sa/models/pantry/ppm_check_list.dart';
|
||||||
|
import 'package:test_sa/views/app_style/colors.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,40 @@
|
|||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_status_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/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';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.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,38 @@
|
|||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_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';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.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,39 @@
|
|||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_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/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';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.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,41 @@
|
|||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_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/status_drop_down/pentry/pentry_visit_status_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/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';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.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,40 @@
|
|||||||
|
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_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/status_drop_down/pentry/pentry_visit_status_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';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.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