diff --git a/assets/subtitles/ar_subtitle.json b/assets/translations/ar.json similarity index 100% rename from assets/subtitles/ar_subtitle.json rename to assets/translations/ar.json diff --git a/assets/subtitles/en_subtitle.json b/assets/translations/en.json similarity index 100% rename from assets/subtitles/en_subtitle.json rename to assets/translations/en.json diff --git a/ios/Podfile.lock b/ios/Podfile.lock index cbf76fea..71e55807 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -213,4 +213,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 -COCOAPODS: 1.11.3 +COCOAPODS: 1.10.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a5559bc2..5116f0d6 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -227,6 +227,7 @@ }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -258,6 +259,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 347cd5f4..86b0405c 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -60,5 +60,7 @@ UIViewControllerBasedStatusBarAppearance + UIApplicationSupportsIndirectInputEvents + diff --git a/lib/controllers/http_status_manger/http_status_manger.dart b/lib/controllers/http_status_manger/http_status_manger.dart deleted file mode 100644 index 012a9a23..00000000 --- a/lib/controllers/http_status_manger/http_status_manger.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:test_sa/models/subtitle.dart'; -import 'package:meta/meta.dart'; - -class HttpStatusManger{ - static String getStatusMessage({ - @required int status, - @required Subtitle subtitle, - String messageFor400, - String messageFor200, - }){ - if(status == null) - // no status code - code error no need for subtitle - return "careful null status"; - if(status == -1) - // client's request in process - return subtitle.currentlyServiceNotAvailable; - if(status == -2){ - // client's request in process - return subtitle.waitUntilYourRequestComplete; - }else if(status >= 200 && status < 300){ - // client's request was successfully received - return messageFor200 ?? subtitle.requestCompleteSuccessfully; - } else if(status >= 400 && status < 500){ - // client's request have error - switch(status){ - case 400: - return messageFor400 ?? subtitle.failedToCompleteRequest; - default: - return subtitle.failedToCompleteRequest; - } - } else if(status >= 500){ - // server error - return subtitle.currentlyServiceNotAvailable; - } else { - // no error match so return default error - return subtitle.failedToCompleteRequest; - } - - } -} \ No newline at end of file diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart deleted file mode 100644 index 7dba6a8c..00000000 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ /dev/null @@ -1,172 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/user.dart'; - -class GasRefillProvider extends ChangeNotifier{ - - // number of items call in each request - final pageItemNumber = 50; - - //reset provider data - void reset(){ - items = null; - nextPage = true; - stateCode = null; - } - - // state code of current request to defied error message - // like 400 customer request failed - // 500 service not available - int stateCode; - - // true if there is next page in product list and false if not - bool nextPage = true; - - // list of user requests - List items; - - // when requests in-process _loading = true - // done _loading = true - // failed _loading = false - bool isLoading; - - /// 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 getRequests ({ - @required String host, - @required User user, - }) async { - if(isLoading == true) - return -2; - isLoading = true; - Response response; - try{ - response = await get( - Uri.parse( - "$host${URLs.getGasRefill}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); - stateCode = response.statusCode; - if(stateCode >= 200 && stateCode < 300) { - // client's request was successfully received - List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); - List itemsPage = requestsListJson.map( - (request) => GasRefillModel.fromJson(request)).toList(); - items ??= []; - items.addAll(itemsPage); - if(itemsPage.length == pageItemNumber){ - nextPage = true; - }else{ - nextPage = false; - } - } - isLoading = false; - notifyListeners(); - return response.statusCode; - - } catch(error) { - isLoading = false; - stateCode = -1; - notifyListeners(); - return -1; - } - - } - - Future createModel ({ - @required String host, - @required User user, - @required GasRefillModel model, - }) async { - Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "title": model.title ?? "", - "status": "0",//model.status.value.toString(), - }; - - body["details"] = jsonEncode(model.details.map((model) => { - "type": model.type.id?.toString(), - "size": model.cylinderSize?.id.toString(), - "requsted_qty": model.requestedQuantity.toString(), - }).toList()); - - Response response; - try{ - response = await post( - Uri.parse( - host+URLs.requestGasRefill), - body: body, - ); - - stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - if(items != null) { - items.insert( - 0, - GasRefillModel.fromJson( - json.decode(utf8.decode(response.bodyBytes))[0] - ) - ); - notifyListeners(); - } - } - return response.statusCode; - - } catch(error) { - return -1; - } - - } - - Future updateModel ({ - @required String host, - @required User user, - @required GasRefillModel oldModel, - @required GasRefillModel newModel, - }) async { - Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "title": newModel.title ?? "", - "status": newModel.status.id.toString(), - }; - - body["details"] = jsonEncode(newModel.details.map((model) => { - "type": model.type.id.toString(), - "size": model.cylinderSize.id.toString(), - "requsted_qty": model.requestedQuantity.toString(), - "deliverd_qty": model.deliveredQuantity.toString(), - }).toList()); - - Response response; - try{ - response = await post( - Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), - body: body, - ); - - stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - oldModel.fromGasRefillModel(newModel); - notifyListeners(); - } - return response.statusCode; - - } catch(error) { - return -1; - } - - } -} \ No newline at end of file diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart deleted file mode 100644 index 040ed855..00000000 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ /dev/null @@ -1,422 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; -import 'package:test_sa/models/issue.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/timer_model.dart'; -import 'package:test_sa/models/user.dart'; - -class ServiceRequestsProvider extends ChangeNotifier{ - - // number of items call in each request - final pageItemNumber = 50; - - //reset provider data - void reset(){ - serviceRequests = null; - nextPage = true; - stateCode = null; - } - - // state code of current request to defied error message - // like 400 customer request failed - // 500 service not available - int stateCode; - - // true if there is next page in product list and false if not - bool nextPage = true; - - // list of user requests - List serviceRequests; - - // when requests in-process _loading = true - // done _loading = true - // failed _loading = false - bool isLoading; - - ServiceRequestSearch search = ServiceRequestSearch(); - - /// 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 getRequests ({ - @required String host, - @required User user, - @required String hospitalId, - }) async { - if(isLoading == true) - return -2; - isLoading = true; - Response response; - try{ - response = await get( - Uri.parse( - host+URLs.getServiceRequests - +"?uid=${user.id}" - +(hospitalId == null? "" :"&client_nid=$hospitalId") - +"&token=${user.token}" - "&page=${(serviceRequests?.length ?? 0) ~/pageItemNumber}" - +search?.toSearchString() ?? "" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); - stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - // client's request was successfully received - List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); - List _serviceRequestsPage = requestsListJson.map( - (request) => ServiceRequest.fromJson(request)).toList(); - if(serviceRequests == null) - serviceRequests = []; - serviceRequests.addAll(_serviceRequestsPage); - if(_serviceRequestsPage.length == pageItemNumber){ - nextPage = true; - }else{ - nextPage = false; - } - } - isLoading = false; - notifyListeners(); - return response.statusCode; - - } catch(error) { - isLoading = false; - stateCode = -1; - notifyListeners(); - return -1; - } - - } - - Future getSingleServiceRequest({ - @required String requestId, - @required String host, - @required User user, - @required Subtitle subtitle, - }) async { - String userData = ''; - if(user != null){ - userData += "&uid="+user.id; - userData += "&token="+user.token; - } - - Response response; - try{ - response = await get( - Uri.parse( - host+URLs.getSingleServiceRequest - +'?call_nid=$requestId' - '$userData',) - ); - }catch(error){ - throw(HttpStatusManger.getStatusMessage( - status: -1, subtitle: subtitle)); - } - - // If the call to the server was successful, parse the JSON. - if (response.statusCode >= 200 && response.statusCode < 300){ - // If the call to the server was successful, parse the JSON. - List jsonList = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); - List _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList(); - return _requests[0]; - }else{ - throw(HttpStatusManger.getStatusMessage( - status: response.statusCode, subtitle: subtitle)); - } - - } - - Future createRequest ({ - @required String host, - @required User user, - @required ServiceRequest serviceRequest, - }) async { - - var body = { - "uid": user.id, - "token": user.token ?? "", - "sn_id": serviceRequest.deviceId ?? "", - "date": (DateTime.now().millisecondsSinceEpoch).toString(), - "client": user.hospital.id ?? '', - "complaint": serviceRequest.maintenanceIssue, - "image": json.encode(serviceRequest.devicePhotos), - "priority": (serviceRequest.priority?.id).toString(), - "defect_types": (serviceRequest.defectType?.id).toString(), - }; - if(serviceRequest.audio != null){ - body["audio"] = serviceRequest.audio; - } - Response response; - try{ - response = await post( - Uri.parse( - host+URLs.createRequest), - body: body, - ); - stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - if(serviceRequests != null) - serviceRequests.insert( - 0, - ServiceRequest.fromJson( - json.decode(utf8.decode(response.bodyBytes))[0] - ) - ); - notifyListeners(); - } - return response.statusCode; - - } catch(error) { - return -1; - } - - } - - Future createIssueReport ({ - @required String host, - @required User user, - @required Issue issue, - }) async { - Response response; - Map body = issue.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - try{ - response = await post( - Uri.parse(host+URLs.createReport), - body: body, - ); - - stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - - } - return response.statusCode; - - } catch(error) { - return -1; - } - - } - - Future updateDate ({ - @required String host, - @required User user, - @required String newDate, - @required Lookup employee, - @required ServiceRequest request, - }) async { - Response response; - Map body = {}; - body["uid"] = user.id; - body["token"] = user.token; - body["nid"] = request.id; - if(newDate != null) body["date"] = newDate; - if(employee != null) body["ass_emp"] = employee.id.toString(); - try{ - response = await post( - Uri.parse( - host+URLs.updateRequestDate), - body: body, - ); - stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - request.engineerName = employee.label; - notifyListeners(); - } - return response.statusCode; - - } catch(error) { - return -1; - } - - } - - Future createServiceReport ({ - @required String host, - @required User user, - @required ServiceReport report, - @required ServiceRequest request, - }) async { - Response response; - Map body = report.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - body["job_id"] = request.id; - try{ - response = await post( - Uri.parse( - host+URLs.createServiceReport), - body: body, - ); - - stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - reset(); - notifyListeners(); - } - return response.statusCode; - - } catch(error) { - - return -1; - } - - } - - Future createDuplicatedReport ({ - @required String host, - @required User user, - @required ServiceRequest request, - }) async { - Response response; - String userData = ''; - if(user != null){ - userData += "&uid="+user.id; - userData += "&token="+user.token; - } - - try{ - response = await get( - Uri.parse( - host+URLs.createDuplicatedReport - +"?nid=${request.id}" - +userData), - ); - - stateCode = response.statusCode; - - if(response.statusCode >= 200 && response.statusCode < 300) { - reset(); - notifyListeners(); - } - return response.statusCode; - - } catch(error) { - - return -1; - } - - } - - Future updateServiceReport ({ - @required String host, - @required User user, - @required ServiceReport report, - @required ServiceRequest request, - }) async { - Response response; - Map body = report.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - body["job_id"] = request.id; - body["report_id"] = request.reportID; - try{ - response = await post( - Uri.parse( - host+URLs.updateServiceReport), - body: body, - ); - stateCode = response.statusCode; - - if(response.statusCode >= 200 && response.statusCode < 300) { - reset(); - notifyListeners(); - } - return response.statusCode; - - } catch(error) { - - return -1; - } - - } - - Future updateServiceReportTimer ({ - @required String host, - @required User user, - @required TimerModel timer, - @required ServiceRequest request, - }) async { - Response response; - Map body = {}; - body["uid"] = user.id; - body["token"] = user.token; - body["job_id"] = request.id; - body["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); - body["end_time"] = (timer.endAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); - body["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); - body["report_id"] = request.reportID; - try{ - response = await post( - Uri.parse( - host+URLs.updateServiceReport), - body: body, - ); - //stateCode = response.statusCode; - - if(response.statusCode >= 200 && response.statusCode < 300) { - // reset(); - // notifyListeners(); - } - return response.statusCode; - - } catch(error) { - - return -1; - } - - } - - Future getSingleServiceReport({ - @required String reportId, - @required String host, - @required User user, - @required Subtitle subtitle, - }) async { - String userData = ''; - if(user != null){ - userData += "&uid="+user.id; - userData += "&token="+user.token; - } - - Response response; - try{ - - response = await get( - Uri.parse( - host+URLs.getServiceReport - +'?report_id=$reportId' - '$userData',) - ); - - }catch(error){ - throw(HttpStatusManger.getStatusMessage( - status: -1, subtitle: subtitle)); - } - - // If the call to the server was successful, parse the JSON. - if (response.statusCode >= 200 && response.statusCode < 300){ - // If the call to the server was successful, parse the JSON. - return ServiceReport.fromJson( - json.decode(utf8.decode(response.bodyBytes)),reportId); - }else{ - throw(HttpStatusManger.getStatusMessage( - status: response.statusCode, subtitle: subtitle)); - } - - } - - -} \ No newline at end of file diff --git a/lib/core/app_configs/app_localizations.dart b/lib/core/app_configs/app_localizations.dart new file mode 100644 index 00000000..b26ef59c --- /dev/null +++ b/lib/core/app_configs/app_localizations.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:test_sa/core/enums.dart' show SupportedLanguagesEnum; + +class AppLocalizations { + AppLocalizations._(); + + static List supportedLocales = + SupportedLanguagesEnum.values.map((e) => Locale(e.name)).toList(); + + static List get delegates => const [ + // AppLocalization.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ]; +} diff --git a/lib/core/app_configs/app_routes.dart b/lib/core/app_configs/app_routes.dart new file mode 100644 index 00000000..a45d0a44 --- /dev/null +++ b/lib/core/app_configs/app_routes.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/screens/login_screen/login_screen.dart'; +import 'package:test_sa/screens/splash_screen/splash_screen.dart'; + +Map appRoutes = { + SplashScreen.routeName: (_) => const SplashScreen(), + LoginScreen.routeName: (_) => const LoginScreen(), + // LandPage.routeName: (_) => const LandPage(), + // Register.routeName: (_) => Register(), + // ProfilePage.routeName: (_) => ProfilePage(), + // ReportIssuesPage.routeName: (_) => const ReportIssuesPage(), + // RequestGasRefill.routeName: (_) => const RequestGasRefill(), + // CreateRequestPage.routeName: (_) => CreateRequestPage(), + // SingleHospitalPicker.routeName: (_) => SingleHospitalPicker(), + // SingleDevicePicker.routeName: (_) => SingleDevicePicker(), + // SingleDepartmentPicker.routeName: (_) => SingleDepartmentPicker(), + // ServiceRequestsPage.routeName: (_) => ServiceRequestsPage(), + // NotificationsPage.routeName: (_) => NotificationsPage(), + // FutureRequestServiceDetails.routeName: (_) => + // FutureRequestServiceDetails(), + // PreventiveMaintenanceVisitsPage.routeName: (_) => + // PreventiveMaintenanceVisitsPage(), + // RegularVisitsPage.routeName: (_) => RegularVisitsPage(), + // TrackGasRefillPage.routeName: (_) => const TrackGasRefillPage(), + // RequestDeviceTransfer.routeName: (_) => + // const RequestDeviceTransfer(), + // TrackDeviceTransferPage.routeName: (_) => + // const TrackDeviceTransferPage(), +}; diff --git a/lib/core/app_configs/app_theme.dart b/lib/core/app_configs/app_theme.dart new file mode 100644 index 00000000..ae61fed9 --- /dev/null +++ b/lib/core/app_configs/app_theme.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/core/constants/app_colors.dart'; + +class AppTheme { + AppTheme._(); + + static get theme => ThemeData( + fontFamily: "Poppins", + canvasColor: AppColors.primaryColor, + scaffoldBackgroundColor: AppColors.scaffoldBackgroundColor, + primaryColor: AppColors.primaryColor, + indicatorColor: AppColors.primaryColor, + colorScheme: const ColorScheme.light( + primary: AppColors.primaryColor, + onPrimary: Colors.white, + secondary: AppColors.secondaryColor, + onSecondary: Colors.white, + ), + ); +} diff --git a/lib/core/constants/api_constants.dart b/lib/core/constants/api_constants.dart new file mode 100644 index 00000000..7738c43a --- /dev/null +++ b/lib/core/constants/api_constants.dart @@ -0,0 +1,66 @@ +class ApiConstants { + ApiConstants._(); + static const host2 = "http://194.163.164.213/atoms/api"; + static const host1 = "https://atoms.hmg.com/api"; + + // API Routes + static const login = "/handle/user/login"; // post + static const register = "/handle/create/user"; // post + static const updateProfile = "/update/user/profile"; // post + static const getHospitals = "/handle/return/all/clients"; // get + static const getDepartments = "/handle/return/all/departments"; // get + static const getEquipment = "/handle/return/all/client/equipments"; // get ?client=208051 + static const getServiceRequests = "/return/user/calls"; // get + + static const getPreventiveMaintenanceVisits = "/return/user/calibrations"; // get + static const updatePreventiveMaintenanceVisits = "/update/user/calibrations"; // get + + static const getRegularVisits = "/return/user/ppm"; // get + static const updateRegularVisits = "/update/user/ppm"; // get + + static const getSingleServiceRequest = "/return/call/information"; // get + static const getNotifications = "/return/user/notification"; // get + static const getRecentNotifications = "/return/user/recent/notification"; // get + static const createRequest = "/handle/create/request"; // get + static const createReport = "/handle/create/report/issue"; // get + static const updateRequestDate = "/handle/update/request"; // get + + // service report + static const createServiceReport = "/handle/create/service/report"; // get + static const updateServiceReport = "/handle/update/service/report"; // get + static const getServiceReport = "/handle/view/service/report"; // get + static const createDuplicatedReport = "/handle/duplicate/request"; // get + + static const getServiceReportReasons = "/return/service/report/reasons"; // get + static const getServiceReportTypes = "/return/service/report/type"; // get + static const getServiceReportStatus = "/return/service/report/status"; // get + static const getServiceReportLastCalls = "/return/call/last/situation"; // get + static const getServiceTypes = "/return/service/type"; // get + static const getPartNumber = "/handle/return/all/parts"; // get + static const getServiceReportPriority = "/return/call/priority/list"; // get + static const getServiceReportDefectTypes = "/return/call/defect/type/list"; // get + + //gas refill + static const getGasTypes = "/return/gas/refill/types"; // get + static const getGasCylinderSize = "/return/gas/refill/size/cylinder"; // get + static const getGasStatus = "/return/gas/refill/status"; // get + static const requestGasRefill = "/create/gas/refill"; // get + static const updateGasRefill = "/update/gas/refill/"; // get + static const getGasRefill = "/search/gas/refill"; // get + + //device transfer + static const requestDeviceTransfer = "/create/transfer/asset"; // get + static const updateDeviceTransfer = "/update/transfer/asset"; // get + static const getDeviceTransfer = "/search/transfer/asset"; // get + + // employee + static const getEmployees = "/return/assigned/employee"; // get + // pentry + static const getPentry = "/return/pentry/details"; // get + static const updatePentry = "/update/pentry/details"; // get + static const getPentryTaskStatus = "/return/pentry/task/status"; // get + static const getPentryVisitStatus = "/return/pentry/visit/status/list"; // get + static const getPentryStatus = "/return/pentry/status/list"; // get + // contacts + static const getPentryContacts = "/handle/return/all/contacts"; // get +} diff --git a/lib/core/constants/app_colors.dart b/lib/core/constants/app_colors.dart new file mode 100644 index 00000000..a8ebe4ce --- /dev/null +++ b/lib/core/constants/app_colors.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +class AppColors { + AppColors._(); + + static const Color white = Color(0xffffffff); + static const Color black = Color(0xff000000); + static const Color grey3A = Color(0xff2e303a); + static const Color grey = Color(0xffe1e7e7); + static const green = Colors.green; + static const Color orange = Colors.orange; + static const Color deepOrange = Colors.deepOrangeAccent; + static const Color red = Colors.red; + static const Color deepRed = Color(0xFFD32F2F); + static const Color scaffoldBackgroundColor = Color(0xffffffff); + static const Color secondaryColor = Color(0xff111427); + static const Color primaryColor = Color(0xff5bb0da); + static const Color cyan = Color(0xff4A8DB7); + static const Color onPrimaryColor = Color(0xffffffff); + static const Color inputFieldBackgroundColor = Color(0xfff5f5f5); + static const Color greyEF = Color(0xffEFEFEF); + + static Color getRequestStatusColor(int id) { + switch (id) { + case 4: + return deepRed; + case 6: + return green; + case 5: + return orange; + case 8: + return green; + case 9: + return orange; + default: + return grey; + } + } + + static Color getGasStatusColor(int id) { + switch (id) { + case 0: + return orange; + case 1: + return green; + default: + return grey; + } + } +} diff --git a/lib/core/enums.dart b/lib/core/enums.dart new file mode 100644 index 00000000..c5cc7bbe --- /dev/null +++ b/lib/core/enums.dart @@ -0,0 +1,20 @@ +enum SupportedLanguagesEnum { ar, en } + +enum RequestMethod { get, post, put, delete } + +enum ApiExceptionsEnum { + badRequest(10), + unauthorized(10), + forbidden(10), + notFound(10), + internalServerError(10), + upgradeRequired(10), + badResponseFormat(10), + other(10), + timeout(10), + unknown(10); + + final int statusCode; + + const ApiExceptionsEnum(this.statusCode); +} diff --git a/lib/core/extensions/context_extension.dart b/lib/core/extensions/context_extension.dart new file mode 100644 index 00000000..65f8e468 --- /dev/null +++ b/lib/core/extensions/context_extension.dart @@ -0,0 +1,3 @@ +import 'package:flutter/widgets.dart'; + +extension ContextExtension on BuildContext {} diff --git a/lib/core/extensions/num_extension.dart b/lib/core/extensions/num_extension.dart new file mode 100644 index 00000000..440d8401 --- /dev/null +++ b/lib/core/extensions/num_extension.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/core/constants/app_colors.dart'; + +extension NumExtension on num { + Widget get height => SizedBox(height: toDouble()); + + Widget get width => SizedBox(width: toDouble()); + + Widget get divider => Divider( + height: toDouble(), + thickness: toDouble(), + color: AppColors.greyEF, + ); + + Widget get makeItSquare => SizedBox(width: toDouble(), height: toDouble()); +} diff --git a/lib/core/extensions/string_extension.dart b/lib/core/extensions/string_extension.dart new file mode 100644 index 00000000..4259e1e7 --- /dev/null +++ b/lib/core/extensions/string_extension.dart @@ -0,0 +1 @@ +extension StringExtension on String {} diff --git a/lib/core/extensions/widget_extension.dart b/lib/core/extensions/widget_extension.dart new file mode 100644 index 00000000..134f9496 --- /dev/null +++ b/lib/core/extensions/widget_extension.dart @@ -0,0 +1,3 @@ +import 'package:flutter/material.dart'; + +extension WidgetExtension on Widget {} diff --git a/lib/core/utils/provider_scope.dart b/lib/core/utils/provider_scope.dart new file mode 100644 index 00000000..5d83ff39 --- /dev/null +++ b/lib/core/utils/provider_scope.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/providers/settings_provider.dart'; + +class ProviderScope extends StatelessWidget { + final Widget child; + + const ProviderScope({required this.child, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MultiProvider( + providers: [ + ChangeNotifierProvider(create: (_) => SettingsProvider()), + // ChangeNotifierProvider(create: (_) => UserProvider()), + // ChangeNotifierProvider(create: (_) => HospitalsProvider()), + // ChangeNotifierProvider(create: (_) => DevicesProvider()), + // ChangeNotifierProvider(create: (_) => ServiceRequestsProvider()), + // ChangeNotifierProvider(create: (_) => DepartmentsProvider()), + // ChangeNotifierProvider(create: (_) => NotificationsProvider()), + // ChangeNotifierProvider( + // create: (_) => PreventiveMaintenanceVisitsProvider()), + // ChangeNotifierProvider(create: (_) => RegularVisitsProvider()), + // ChangeNotifierProvider(create: (_) => PartsProvider()), + // ChangeNotifierProvider(create: (_) => ServiceReportReasonsProvider()), + // ChangeNotifierProvider(create: (_) => ServiceReportStatusProvider()), + // ChangeNotifierProvider(create: (_) => ServiceReportTypesProvider()), + // ChangeNotifierProvider(create: (_) => ServiceStatusProvider()), + // ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()), + // ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()), + // ChangeNotifierProvider(create: (_) => GasStatusProvider()), + // ChangeNotifierProvider(create: (_) => GasTypesProvider()), + // ChangeNotifierProvider(create: (_) => GasRefillProvider()), + // ChangeNotifierProvider(create: (_) => DeviceTransferProvider()), + // ChangeNotifierProvider(create: (_) => EmployeesProvider()), + // ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), + // ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()), + // ChangeNotifierProvider(create: (_) => PentryStatusProvider()), + // ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()), + // ChangeNotifierProvider( + // create: (_) => ServiceRequestDefectTypesProvider()), + ], + child: child, + ); + } +} diff --git a/lib/data/api/api_client.dart b/lib/data/api/api_client.dart new file mode 100644 index 00000000..71192923 --- /dev/null +++ b/lib/data/api/api_client.dart @@ -0,0 +1,57 @@ +import 'dart:convert'; + +import 'package:http/http.dart' as http; +import 'package:test_sa/core/enums.dart'; + +class ApiClient { + final String baseUrl, endPoint; + final RequestMethod requestMethod; + + ApiClient.request({ + required this.baseUrl, + required this.endPoint, + required this.requestMethod, + }); + + Future> execute({ + Map? headers, + Map? queryParameters, + Object? body, + }) async { + final url = Uri.tryParse(baseUrl + endPoint); + if (url != null) { + late http.Response response; + switch (requestMethod) { + case RequestMethod.get: + response = await http.get(url, headers: headers); + break; + case RequestMethod.post: + response = await http.post(url, headers: headers, body: body); + break; + case RequestMethod.put: + response = await http.put(url, headers: headers, body: body); + break; + case RequestMethod.delete: + response = await http.delete(url, headers: headers, body: body); + break; + } + return await _handleResponse(response); + } else { + throw ApiExceptionsEnum.other; + } + } + + Future> _handleResponse(http.Response response) { + print('status code ${response.statusCode} : ${response.request?.url}'); + if (response.statusCode == 200) { + return jsonDecode(response.body); + } else if (response.statusCode == 401) { + throw ApiExceptionsEnum.unauthorized; + } else if (response.statusCode == 400) { + throw ApiExceptionsEnum.badRequest; + } else if (response.statusCode == 500) { + throw ApiExceptionsEnum.internalServerError; + } + throw ApiExceptionsEnum.unknown; + } +} diff --git a/lib/data/api/services/user_service.dart b/lib/data/api/services/user_service.dart new file mode 100644 index 00000000..98e98dde --- /dev/null +++ b/lib/data/api/services/user_service.dart @@ -0,0 +1,18 @@ +import 'package:test_sa/core/enums.dart'; +import 'package:test_sa/data/api/api_client.dart'; +import 'package:test_sa/data/models/user_model.dart'; + +class UserService { + static UserService instance = UserService._internal(); + + UserService._internal(); + + Future getUser() async { + final response = await ApiClient.request( + baseUrl: 'baseUrl', + endPoint: 'endPoint', + requestMethod: RequestMethod.get, + ).execute(); + return UserModel.fromJson(response); + } +} diff --git a/lib/data/models/user_model.dart b/lib/data/models/user_model.dart new file mode 100644 index 00000000..0eef497b --- /dev/null +++ b/lib/data/models/user_model.dart @@ -0,0 +1,7 @@ +class UserModel { + UserModel(); + + factory UserModel.fromJson(Map json) { + return UserModel(); + } +} diff --git a/lib/main.dart b/lib/main.dart index dea92839..cb0bb858 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,169 +2,58 @@ import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/departments_provider.dart'; -import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; -import 'package:test_sa/controllers/providers/api/devices_provider.dart'; -import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; -import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; -import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; -import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/views/app_style/colors.dart'; -import 'package:test_sa/views/pages/login.dart'; -import 'package:test_sa/views/pages/register.dart'; -import 'package:test_sa/views/pages/splash_screen.dart'; -import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; -import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; -import 'package:test_sa/views/pages/user/land_page.dart'; -import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; -import 'package:test_sa/views/pages/user/profile_page.dart'; -import 'package:test_sa/views/pages/user/report_issues_page.dart'; -import 'package:test_sa/views/pages/user/requests/create_request.dart'; -import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart'; -import 'package:test_sa/views/pages/user/requests/requests_page.dart'; -import 'package:test_sa/views/pages/user/visits/preventive_maintenance_visits_page.dart'; -import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; -import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; -import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; +import 'package:test_sa/providers/settings_provider.dart'; +import 'package:test_sa/screens/splash_screen/splash_screen.dart'; -import 'controllers/providers/api/parts_provider.dart'; -import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; -import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_status_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_types_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_types_provider.dart'; -import 'controllers/providers/api/user_provider.dart'; -import 'controllers/providers/settings/setting_provider.dart'; -import 'views/pages/device_transfer/request_device_transfer.dart'; -import 'views/pages/device_transfer/track_device_transfer.dart'; -import 'views/widgets/hospitals/single_hospital_picker.dart'; +import 'core/app_configs/app_localizations.dart'; +import 'core/app_configs/app_routes.dart'; +import 'core/app_configs/app_theme.dart'; +import 'core/utils/provider_scope.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); if (Platform.isIOS) { await Firebase.initializeApp( - options: const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"), + options: const FirebaseOptions( + apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", + appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", + messagingSenderId: "973582662416", + projectId: "atoms-fb912", + ), ); } else { await Firebase.initializeApp(); } - runApp( - ChangeNotifierProvider( - create: (_) => SettingProvider(), - child: MyApp(), - ) - ); + runApp(const EntryPoint()); } -class MyApp extends StatelessWidget { - // This widget is the root of your application. +class EntryPoint extends StatelessWidget { + const EntryPoint({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { - final _settingProvider = Provider.of(context); - return MultiProvider( - providers: [ - ChangeNotifierProvider(create: (_) => UserProvider()), - ChangeNotifierProvider(create: (_) => HospitalsProvider()), - ChangeNotifierProvider(create: (_) => DevicesProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestsProvider()), - ChangeNotifierProvider(create: (_) => DepartmentsProvider()), - ChangeNotifierProvider(create: (_) => NotificationsProvider()), - ChangeNotifierProvider(create: (_) => PreventiveMaintenanceVisitsProvider()), - ChangeNotifierProvider(create: (_) => RegularVisitsProvider()), - ChangeNotifierProvider(create: (_) => PartsProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportReasonsProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportStatusProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportTypesProvider()), - ChangeNotifierProvider(create: (_) => ServiceStatusProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()), - ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()), - ChangeNotifierProvider(create: (_) => GasStatusProvider()), - ChangeNotifierProvider(create: (_) => GasTypesProvider()), - ChangeNotifierProvider(create: (_) => GasRefillProvider()), - ChangeNotifierProvider(create: (_) => DeviceTransferProvider()), - ChangeNotifierProvider(create: (_) => EmployeesProvider()), - ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), - ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()), - ChangeNotifierProvider(create: (_) => PentryStatusProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()), - ], + return ProviderScope( child: GestureDetector( onTap: () { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { - FocusManager.instance.primaryFocus.unfocus(); + FocusManager.instance.primaryFocus?.unfocus(); } }, - child: MaterialApp( - title: 'ATOMS', - debugShowCheckedModeBanner: false, - theme: ThemeData( - fontFamily: "Poppins", - //canvasColor: AColors.primaryColor, - scaffoldBackgroundColor: AColors.scaffoldBackgroundColor, - primaryColor: AColors.primaryColor, - indicatorColor: AColors.primaryColor, - colorScheme: const ColorScheme.light( - primary: AColors.primaryColor, - onPrimary: Colors.white, - secondary: AColors.secondaryColor, - onSecondary: Colors.white - ) + child: Consumer( + builder: (context, settingProvider, _) => MaterialApp( + title: 'ATOMS', + debugShowCheckedModeBanner: false, + theme: AppTheme.theme, + localizationsDelegates: AppLocalizations.delegates, + supportedLocales: AppLocalizations.supportedLocales, + locale: settingProvider.locale, + initialRoute: SplashScreen.routeName, + routes: appRoutes, ), - localizationsDelegates: const [ - // ... app-specific localization delegate[s] here - AppLocalization.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], - supportedLocales: const [ - Locale('en'), - Locale('ar'), - ], - locale: Locale(_settingProvider.language ?? 'en'), - initialRoute: SplashScreen.id, - routes: { - SplashScreen.id: (_)=> const SplashScreen(), - LandPage.id: (_)=> const LandPage(), - Login.id: (_)=> Login(), - Register.id: (_)=> Register(), - ProfilePage.id: (_)=> ProfilePage(), - ReportIssuesPage.id: (_)=> const ReportIssuesPage(), - RequestGasRefill.id: (_)=> const RequestGasRefill(), - CreateRequestPage.id: (_)=> CreateRequestPage(), - SingleHospitalPicker.id: (_)=> SingleHospitalPicker(), - SingleDevicePicker.id: (_)=> SingleDevicePicker(), - SingleDepartmentPicker.id: (_)=> SingleDepartmentPicker(), - ServiceRequestsPage.id: (_)=> ServiceRequestsPage(), - NotificationsPage.id: (_)=> NotificationsPage(), - FutureRequestServiceDetails.id: (_)=> FutureRequestServiceDetails(), - PreventiveMaintenanceVisitsPage.id: (_)=> PreventiveMaintenanceVisitsPage(), - RegularVisitsPage.id: (_)=> RegularVisitsPage(), - TrackGasRefillPage.id: (_)=> const TrackGasRefillPage(), - RequestDeviceTransfer.id: (_)=> const RequestDeviceTransfer(), - TrackDeviceTransferPage.id: (_)=> const TrackDeviceTransferPage(), - }, ), ), ); } } - - - diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart deleted file mode 100644 index d62913ab..00000000 --- a/lib/models/device/device_transfer.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/device/device_transfer_info.dart'; - -class DeviceTransfer{ - String id; - String userId; - String title; - Device device; - DeviceTransferInfo sender; - DeviceTransferInfo receiver; - - DeviceTransfer({ - this.id, - this.device, - this.title, - this.userId, - this.sender, - this.receiver, - }); - - bool validate(){ - if(device == null) return false; - return receiver.validate(); - } - - fromDeviceTransfer(DeviceTransfer old){ - id = old.id; - title = old.title; - userId = old.userId; - device = Device.fromDevice(old.device); - final sender = DeviceTransferInfo(); - sender.fromDetails(old.sender); - this.sender = sender; - final receiver = DeviceTransferInfo(); - receiver.fromDetails(old.receiver); - this.receiver = receiver; - } - - factory DeviceTransfer.fromJson(Map parsedJson){ - return DeviceTransfer( - id: parsedJson["id"], - title: parsedJson["title"], - userId: parsedJson["uid"], - device: Device.fromJson(parsedJson["eq_sn"]), - sender: DeviceTransferInfo.fromJson(parsedJson,"sender_"), - receiver: DeviceTransferInfo.fromJson(parsedJson,"receiver_"), - ); - } -} - diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart deleted file mode 100644 index d3645b9d..00000000 --- a/lib/models/device/device_transfer_info.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:test_sa/models/department.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/lookup.dart'; - -class DeviceTransferInfo{ - String userId; - String comment; - Hospital client; - Department department; - String workingHours; - String travelingHours; - String name; - String signature; - Lookup status; - - DeviceTransferInfo({ - this.userId, - this.comment, - this.department, - this.client, - this.name, - this.travelingHours, - this.workingHours, - this.signature, - this.status, - }); - - MaptoJson(bool isSender){ - Map body = {}; - final baseKey = isSender ? "sender_" : "receiver_"; - - if(comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; - if(workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; - if(travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = comment; - if(status != null) body["${baseKey}status"] = status.id.toString(); - if(signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; - return body; - } - - bool validate(){ - if(client == null) return false; - if(department == null) return false; - return true; - } - - fromDetails(DeviceTransferInfo old,{bool withSignature = true}){ - userId = old.userId; - name = old.name; - client = Hospital.fromHospital(old.client); - department = Department.fromDepartment(old.department); - workingHours = old.workingHours; - travelingHours = old.travelingHours; - comment = old.comment; - if(withSignature) signature = old.signature; - status = old.status; - } - - factory DeviceTransferInfo.fromJson(Map parsedJson,String key){ - return DeviceTransferInfo( - workingHours: parsedJson["${key}working_hours"], - travelingHours: parsedJson["${key}travel_hours"], - name: parsedJson["${key}name"], - signature: parsedJson["${key}image"], - userId: parsedJson["${key}id"], - comment: parsedJson["${key}comment"], - client: Hospital.fromJson(parsedJson["${key}client"]), - department: Department.fromJson(parsedJson["${key}department"]), - status: Lookup.fromJson(parsedJson["${key}status"]), - ); - } -} - diff --git a/lib/models/gas_refill/gas_refill_details.dart b/lib/models/gas_refill/gas_refill_details.dart deleted file mode 100644 index f150e150..00000000 --- a/lib/models/gas_refill/gas_refill_details.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:test_sa/models/lookup.dart'; - -class GasRefillDetails{ - Lookup type; - Lookup cylinderSize; - int requestedQuantity; - int deliveredQuantity; - - GasRefillDetails({ - this.type, - this.cylinderSize, - this.requestedQuantity, - this.deliveredQuantity, - }); - - bool validate(){ - //if(cylinderSize == null) return false; - if(type == null) return false; - if(requestedQuantity == null) return false; - return true; - } - factory GasRefillDetails.fromJson(Map parsedJson){ - return GasRefillDetails( - type: Lookup.fromJson(parsedJson["type"]), - - cylinderSize: Lookup.fromJson(parsedJson["size"]), - requestedQuantity: parsedJson["requsted_qty"] == null - ? 0 : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0, - deliveredQuantity: parsedJson["deliverd_qty"] == null - ? 0 : int.tryParse(parsedJson["deliverd_qty"].toString()) ?? 0, - ); - } - - factory GasRefillDetails.fromDetails(GasRefillDetails details){ - return GasRefillDetails( - type: Lookup.fromStatus(details.type), - cylinderSize:Lookup.fromStatus(details.cylinderSize), - requestedQuantity: details.requestedQuantity, - deliveredQuantity: details.deliveredQuantity, - ); - } -} - diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart deleted file mode 100644 index 28773fac..00000000 --- a/lib/models/gas_refill/gas_refill_model.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/models/lookup.dart'; - -class GasRefillModel{ - String id; - String userId; - String clientName; - String title; - Lookup status; - List details; - - GasRefillModel({ - this.id, - this.userId, - this.clientName, - this.title, - this.status, - this.details, - }); - - bool validate(){ - if(title == null) return false; - if(status == null) return false; - if(details == null && details.isEmpty) return false; - return true; - } - - fromGasRefillModel(GasRefillModel model){ - id = model.id; - userId = model.userId; - clientName = model.clientName; - title = model.title; - status = Lookup.fromStatus(model.status); - details = model.details.map((e) => GasRefillDetails.fromDetails(e)).toList(); - } - - factory GasRefillModel.fromJson(Map parsedJson){ - List details = []; - if(parsedJson["details"] != null){ - List list = parsedJson["details"]; - details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); - } - return GasRefillModel( - id: parsedJson["id"], - userId: parsedJson["uid"], - title: parsedJson["title"], - clientName: parsedJson["client"], - status: Lookup.fromJson(parsedJson["status"]), - details: details, - ); - } -} - diff --git a/lib/models/pantry/calibration_tools.dart b/lib/models/pantry/calibration_tools.dart deleted file mode 100644 index 2c70c6d2..00000000 --- a/lib/models/pantry/calibration_tools.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:test_sa/models/lookup.dart'; - -class CalibrationTool{ - Lookup assetsNumber; - DateTime dataOfTesting; - - CalibrationTool({ - this.assetsNumber, - this.dataOfTesting, - }); - - Map toMap() { - return { - if(assetsNumber != null) 'assetsSN': (assetsNumber?.id).toString(), - if(dataOfTesting != null) 'dataOfTesting': (dataOfTesting.millisecondsSinceEpoch ~/ 1000).toString(), - }; - } - - factory CalibrationTool.fromMap(Map map) { - return CalibrationTool( - assetsNumber: Lookup.fromJson(map['assetsSN']), - dataOfTesting: map['dataOfTesting'] == null || map['dataOfTesting'] == "" ? null : - DateTime.fromMillisecondsSinceEpoch(int.tryParse(map['dataOfTesting']) * 1000), - ); - } -} \ No newline at end of file diff --git a/lib/models/pantry/contact.dart b/lib/models/pantry/contact.dart deleted file mode 100644 index 50748bea..00000000 --- a/lib/models/pantry/contact.dart +++ /dev/null @@ -1,41 +0,0 @@ -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 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 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, - ); - } -} \ No newline at end of file diff --git a/lib/models/pantry/lookups/contact_title.dart b/lib/models/pantry/lookups/contact_title.dart deleted file mode 100644 index 5231712c..00000000 --- a/lib/models/pantry/lookups/contact_title.dart +++ /dev/null @@ -1,15 +0,0 @@ -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 parsedJson){ - return ContactTitle( - label: parsedJson["value"], - id: parsedJson["id"], - ); - } -} \ No newline at end of file diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart deleted file mode 100644 index ebd855dc..00000000 --- a/lib/models/pantry/pentry.dart +++ /dev/null @@ -1,120 +0,0 @@ -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/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 contacts; - List ppmCheckLists; - List calibrationTools; - List 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 toMap() { - Map 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 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 map) { - // List contacts = []; - // if(map['contacts'] != null){ - // contacts =(map['contacts'] as List) - // .map((e) => Contact.fromMap(e as Map)) - // .toList(); - // } - - List pmKits = []; - if(map['pmKits'] != null){ - pmKits =(map['pmKits'] as List) - .map((e) => PMKit.fromMap(e as Map)) - .toList(); - } - - List ppmCheckLists = []; - if(map['ppmCheckLists'] != null){ - ppmCheckLists =(map['ppmCheckLists'] as List) - .map((e) => PPMCheckList.fromMap(e as Map)) - .toList(); - } - - List calibrationTools = []; - if(map['calibrationTools'] != null){ - calibrationTools =(map['calibrationTools'] as List) - .map((e) => CalibrationTool.fromMap(e as Map)) - .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); - } -} \ No newline at end of file diff --git a/lib/models/service_request/service_request_search.dart b/lib/models/service_request/service_request_search.dart deleted file mode 100644 index 257f25f5..00000000 --- a/lib/models/service_request/service_request_search.dart +++ /dev/null @@ -1,46 +0,0 @@ -class ServiceRequestSearch{ - String deviceSerialNumber; - String deviceName; - String hospital; - String model; - int statusValue; - - - ServiceRequestSearch({ - this.deviceSerialNumber, - this.statusValue, - this.deviceName, - this.model, - this.hospital, - }); - - fromSearch(ServiceRequestSearch newSearch){ - deviceSerialNumber = newSearch.deviceSerialNumber; - statusValue = newSearch.statusValue; - hospital = newSearch.hospital; - model = newSearch.model; - } - - String toSearchString(){ - String _search = ""; - if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ - _search += "&sn_id=$deviceSerialNumber"; - } - - if(statusValue != null){ - _search += "&status=$statusValue"; - } - - if(deviceName != null && deviceName.isNotEmpty){ - _search += "&equipment_en_name=$deviceName"; - } - - if(hospital != null && hospital.isNotEmpty){ - _search += "&client=$hospital"; - } - if(model != null && model.isNotEmpty){ - _search += "&model=$model"; - } - return _search; - } -} \ No newline at end of file diff --git a/lib/models/visits/visits_group.dart b/lib/models/visits/visits_group.dart deleted file mode 100644 index abe6dfc0..00000000 --- a/lib/models/visits/visits_group.dart +++ /dev/null @@ -1,45 +0,0 @@ - -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/visits/visit.dart'; - -class VisitsGroup{ - String userId; - String workingHours; - String travelingHours; - String jobSheetNumber; - String image; - Lookup status; - Lookup taskStatus; - DateTime date; - List visits; - - VisitsGroup({ - this.userId, - this.status, - this.date, - this.jobSheetNumber, - this.travelingHours, - this.workingHours, - this.visits, - this.image, - this.taskStatus, - }); - - Map toJson(){ - Map jsonObject = {}; - jsonObject["nids"] = visits.map((e) => e.id).toList().join(','); - if(status != null) jsonObject["status"] = status.id.toString(); - if(date != null) jsonObject["date"] = date.toString().split(" ").first; - if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) - jsonObject["job_sheet_no"] = jobSheetNumber; - if(travelingHours != null && travelingHours.isNotEmpty) - jsonObject["traveling_hours"] = travelingHours; - if(workingHours != null && workingHours.isNotEmpty) - jsonObject["working_hours"] = workingHours; - if(image != null) jsonObject["image"] = image; - if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString(); - return jsonObject; - } - - -} \ No newline at end of file diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart new file mode 100644 index 00000000..c1916cd4 --- /dev/null +++ b/lib/providers/settings_provider.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class SettingsProvider with ChangeNotifier { + Locale? _locale; + + Locale? get locale => _locale; + + set locale(Locale? value) { + _locale = value; + notifyListeners(); + } +} diff --git a/lib/screens/login_screen/login_screen.dart b/lib/screens/login_screen/login_screen.dart new file mode 100644 index 00000000..c611693d --- /dev/null +++ b/lib/screens/login_screen/login_screen.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class LoginScreen extends StatelessWidget { + static const routeName = '/loginScreen'; + + const LoginScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Scaffold(); + } +} diff --git a/lib/screens/splash_screen/splash_screen.dart b/lib/screens/splash_screen/splash_screen.dart new file mode 100644 index 00000000..bc01283f --- /dev/null +++ b/lib/screens/splash_screen/splash_screen.dart @@ -0,0 +1,32 @@ +import 'package:flare_flutter/flare_actor.dart'; +import 'package:flutter/material.dart'; +import 'package:test_sa/screens/login_screen/login_screen.dart'; + +class SplashScreen extends StatelessWidget { + static const routeName = "/splashScreen"; + + const SplashScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Center( + child: SizedBox( + width: MediaQuery.of(context).size.width / 1.1, + child: FlareActor( + "assets/rives/atoms_splash.flr", + fit: BoxFit.contain, + animation: "splash", + callback: (animation) async { + Navigator.of(context).pushNamed(LoginScreen.routeName); + // if (_settingProvider.isLoaded && _settingProvider.user != null) { + // _goToUserScreen(_settingProvider.user); + // } + }, + ), + ), + ), + ); + } +} diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart deleted file mode 100644 index a7bfa347..00000000 --- a/lib/views/pages/splash_screen.dart +++ /dev/null @@ -1,86 +0,0 @@ -import 'dart:convert'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flare_flutter/flare_actor.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/notification/notification_manger.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/app_notification.dart'; -import 'package:test_sa/models/user.dart'; -import 'package:test_sa/views/pages/user/land_page.dart'; - -import 'login.dart'; - -class SplashScreen extends StatefulWidget { - static const String id = '/splash'; - const SplashScreen({Key key}) : super(key: key); - - @override - State createState() => _SplashScreenState(); -} - -class _SplashScreenState extends State { - - SettingProvider _settingProvider; - UserProvider _userProvider; - - _goToUserScreen(User user){ - _userProvider.user = user; - // Navigator.of(context).pushNamed(Login.id); - Navigator.of(context).pushNamed(LandPage.id); - } - - @override - void initState() { - Firebase.initializeApp(); - - NotificationManger.initialisation( - (notificationDetails) { - AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload)); - if(notification.path == null || notification.path.isEmpty) - return; - Navigator.pushNamed( - context, - notification.path, - arguments: notification.requestId - ); - } - , (id, title, body, payload) async { - }); - super.initState(); - } - - @override - Widget build(BuildContext context) { - _settingProvider = Provider.of(context,listen: false); - _userProvider = Provider.of(context,listen: false); - return Scaffold( - backgroundColor: Colors.white, - body: Center( - child: SizedBox( - width: MediaQuery.of(context).size.width/1.1, - child: FlareActor( - "assets/rives/atoms_splash.flr", - fit: BoxFit.contain, - animation: "splash", - callback: (animation) async { - print(await FirebaseMessaging.instance.getToken()); - Navigator.of(context).pushNamed(Login.id); - if(_settingProvider.isLoaded && _settingProvider.user != null){ - _goToUserScreen(_settingProvider.user); - } - }, - ), - //const Center(child: CircularProgressIndicator()) - - // Image.asset("assets/images/logo.png", - // fit: BoxFit.contain, - // ), - ), - ), - ); - } -} diff --git a/lib/views/pages/user/notifications/notifications_list.dart b/lib/views/pages/user/notifications/notifications_list.dart deleted file mode 100644 index 2df3171d..00000000 --- a/lib/views/pages/user/notifications/notifications_list.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/app_notification.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart'; -import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/notifications/notification_item.dart'; -import 'package:flutter/material.dart'; -class NotificationsList extends StatelessWidget { - final List notifications; - final bool nextPage; - final Future Function() onLazyLoad; - - const NotificationsList({Key key, this.notifications, this.nextPage, this.onLazyLoad}) : super(key: key); - - @override - Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(notifications.length == 0){ - return NoItemFound(message: _subtitle.notificationsNotFound,); - } - return LazyLoading( - nextPage: nextPage, - onLazyLoad: onLazyLoad, - child: ListView.builder( - physics: BouncingScrollPhysics(), - itemCount: notifications.length, - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ - return NotificationItem( - notification: notifications[itemIndex], - onPressed: (notification){ - Navigator.of(context).pushNamed( - FutureRequestServiceDetails.id, - arguments: notification.requestId - ); - }, - ); - } - ), - ); - } -} diff --git a/lib/views/widgets/app_text_form_field.dart b/lib/views/widgets/app_text_form_field.dart deleted file mode 100644 index 24ea9922..00000000 --- a/lib/views/widgets/app_text_form_field.dart +++ /dev/null @@ -1,107 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; - -class ATextFormField extends StatefulWidget { - final Function(String) onSaved; - final Function(String) validator; - final Function(String) onChange; - final bool obscureText; - final VoidCallback showPassword; - final String hintText; - final String labelText; - final TextInputType textInputType; - final String initialValue; - final TextStyle style; - final bool enable; - final TextAlign textAlign; - final FocusNode node; - final Widget suffixIcon; - final IconData prefixIconData; - final double prefixIconSize; - final TextEditingController controller; - final TextInputAction textInputAction; - final VoidCallback onAction; - - const ATextFormField( - {Key key, - this.onSaved, - this.validator, - this.node, - this.onChange, - this.obscureText, - this.showPassword, - this.hintText, - this.labelText, - this.textInputType = TextInputType.text, - this.initialValue, - this.enable = true, - this.style, - this.textAlign, - this.suffixIcon, - this.prefixIconData, - this.prefixIconSize, - this.controller, - this.textInputAction, - this.onAction}) - : super(key: key); - - @override - State createState() => _ATextFormFieldState(); -} - -class _ATextFormFieldState extends State { - @override - void initState() { - if (widget.controller != null) widget.controller.text = widget.initialValue; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Container( - height: widget.textInputType == TextInputType.multiline ? null : 50, - padding: EdgeInsets.only(left: 12, right: 12), - decoration: BoxDecoration( - color: Color(0xfff5f5f5), - border: Border.all( - color: Color(0xffefefef), - ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - ), - child: TextFormField( - focusNode: widget.node, - enabled: widget.enable, - onSaved: widget.onSaved, - initialValue: widget.controller != null ? null : widget.initialValue, - validator: widget.validator, - onChanged: widget.onChange, - textAlign: TextAlign.left, - obscureText: widget.obscureText ?? false, - keyboardType: widget.textInputType, - maxLines: widget.textInputType == TextInputType.multiline ? null : 1, - obscuringCharacter: "●", - controller: widget.controller, - textInputAction: widget.textInputType == TextInputType.multiline ? null : widget.textInputAction ?? TextInputAction.next, - onEditingComplete: widget.onAction ?? () => FocusScope.of(context).nextFocus(), - // style: widget.style, - style: Theme.of(context).textTheme.bodyText1, - decoration: InputDecoration( - border: InputBorder.none, - suffixIconConstraints: BoxConstraints(minWidth: 0), - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - constraints: BoxConstraints(), - errorStyle: TextStyle(height: 0.3), - //contentPadding: EdgeInsets.only(left: 0), - hintText: widget.hintText, - labelText: widget.labelText, - //suffixIcon: widget.suffixIcon, - suffixIcon: widget.prefixIconData == null - ? null - : Icon(widget.prefixIconData, - size: widget.prefixIconSize == null ? 20 * AppStyle.getScaleFactor(context) : (widget.prefixIconSize - 10) * AppStyle.getScaleFactor(context), color: Color(0xff2e303a))), - ), - ); - } -} diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart deleted file mode 100644 index 169e16f1..00000000 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/device/device_transfer_info.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:test_sa/views/widgets/requests/info_row.dart'; -import 'package:test_sa/views/widgets/requests/request_status.dart'; -class DeviceTransferInfoSection extends StatelessWidget { - final DeviceTransferInfo info; - final VoidCallback onEdit; - const DeviceTransferInfoSection({Key key, this.info, this.onEdit}) : super(key: key); - - @override - Widget build(BuildContext context) { - final subtitle = AppLocalization.of(context).subtitle; - return Column( - children: [ - RequestInfoRow( - title: subtitle.hospital, - info: info.client.name, - ), - RequestInfoRow( - title: subtitle.unite, - info: info.department.name, - ), - RequestInfoRow( - title: subtitle.engineerName, - info: info.name, - ), - RequestInfoRow( - title: subtitle.workingHours, - info: info.workingHours, - ), - RequestInfoRow( - title: subtitle.travelingHours, - info: info.travelingHours, - ), - RequestInfoRow( - title: "Comment", - info: info.comment, - ), - RequestInfoRow( - title: "Signature", - info: info.signature?.isEmpty != false - ? subtitle.noDateFound : null, - contentWidget: info.signature?.isEmpty != false ? null : - ImageLoader( - url: info.signature, - ), - ), - RequestInfoRow( - title: subtitle.status, - infoWidget: StatusLabel( - label: info.status?.label, - color: AColors.getGasStatusColor(info.status?.id) - ), - ), - ], - ); - } -} diff --git a/lib/views/widgets/device_trancfer/device_transfer_list.dart b/lib/views/widgets/device_trancfer/device_transfer_list.dart deleted file mode 100644 index 18bee922..00000000 --- a/lib/views/widgets/device_trancfer/device_transfer_list.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/device/device_transfer.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart'; -import 'package:test_sa/views/widgets/device_trancfer/device_transfer_item.dart'; -import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -class DeviceTransferList extends StatelessWidget { - final List items; - final bool nextPage; - final Future Function() onLazyLoad; - - const DeviceTransferList({Key key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); - - @override - Widget build(BuildContext context) { - - if(items.length == 0){ - Subtitle subtitle = AppLocalization.of(context).subtitle; - return NoItemFound(message: subtitle.noServiceRequestFound,); - } - return LazyLoading( - nextPage: nextPage, - onLazyLoad: onLazyLoad, - child: ListView.builder( - //physics: const BouncingScrollPhysics(), - itemCount: items.length, - padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ - return DeviceTransferItem( - index: itemIndex, - item: items[itemIndex], - onPressed: (model){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> DeviceTransferDetails(model: model,) - ) - ); - }, - ); - } - ), - ); - } -} diff --git a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart deleted file mode 100644 index 0ccd9e45..00000000 --- a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; -import 'package:test_sa/views/widgets/requests/info_row.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:test_sa/views/widgets/titles/app_title.dart'; -class GasRefillUpdateDetailsItem extends StatelessWidget { - - final GasRefillDetails details; - final bool enableEdit; - final bool validate; - - const GasRefillUpdateDetailsItem({Key key, this.details, this.enableEdit, this.validate}) : super(key: key); - - @override - Widget build(BuildContext context) { - Subtitle subtitle = AppLocalization.of(context).subtitle; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ATitle(details.type.label), - RequestInfoRow( - title: "Cylinder Size", - info: details.cylinderSize.label, - ), - RequestInfoRow( - title: "Requested Quantity", - info: details.requestedQuantity.toStringAsFixed(0), - ), - enableEdit ? - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(subtitle.quantity), - if(validate && details.deliveredQuantity == null) - ASubTitle(subtitle.requiredWord,color: Colors.red,), - SizedBox(height: 4,), - ATextFormField( - initialValue: (details.deliveredQuantity ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : "allow numbers only", - textInputType: TextInputType.number, - onSaved: (value){ - details.deliveredQuantity = int.tryParse(value); - }, - ), - ], - ): - RequestInfoRow( - title: "Delivered Quantity", - info: details.deliveredQuantity.toStringAsFixed(0), - ), - //SizedBox(height: 16,) - ], - ); - } -} diff --git a/lib/views/widgets/requests/info_row.dart b/lib/views/widgets/requests/info_row.dart deleted file mode 100644 index d8fe0bc6..00000000 --- a/lib/views/widgets/requests/info_row.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -class RequestInfoRow extends StatelessWidget { - final String title; - final String info; - final String content; - final Widget contentWidget; - final Widget infoWidget; - - const RequestInfoRow({Key key, this.title, this.info,this.content, this.contentWidget, this.infoWidget}) : super(key: key); - @override - Widget build(BuildContext context) { - if(info != null && info.isEmpty){ - return SizedBox.shrink(); - } - if(content != null && content.isEmpty){ - return SizedBox.shrink(); - } - return Column( - children: [ - Row( - children: [ - Text( - title + " : ", - style: Theme.of(context).textTheme.subtitle2.copyWith( - //fontSize: 12 - ), - textScaleFactor: AppStyle.getScaleFactor(context), - ), - - if(info != null) - Expanded( - child: Text( - info, - style: Theme.of(context).textTheme.bodyText2, - textAlign: TextAlign.right, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ), - if(infoWidget != null) - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - infoWidget, - ], - ), - ), - ], - ), - - if(content != null) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Row( - children: [ - Expanded( - child: Text( - content ?? 'No data found', - style: Theme.of(context).textTheme.bodyText2, - textAlign: TextAlign.center, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ), - ], - ), - ), - if(contentWidget != null) - contentWidget, - Divider(color: Theme.of(context).primaryColor,), - ], - ); - } -} \ No newline at end of file diff --git a/lib/views/widgets/requests/request_status.dart b/lib/views/widgets/requests/request_status.dart deleted file mode 100644 index c953efc8..00000000 --- a/lib/views/widgets/requests/request_status.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -class StatusLabel extends StatelessWidget { - final String label; - final Color color; - - const StatusLabel({Key key, this.label, this.color}) : super(key: key); - - - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(vertical: 2,horizontal: 8), - alignment: Alignment.center, - decoration: BoxDecoration( - color: color ?? Colors.green, - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), - child: Text( - label ?? "no status", - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: color.computeLuminance() > 0.5 - ? AColors.black : Colors.white, - ), - ) - ); - } -} diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart deleted file mode 100644 index 448cb53e..00000000 --- a/lib/views/widgets/requests/service_request_item.dart +++ /dev/null @@ -1,266 +0,0 @@ -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_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/enums/user_types.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/user.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/views/widgets/timer/app_timer.dart'; - -import '../../../controllers/http_status_manger/http_status_manger.dart'; -class ServiceRequestItem extends StatelessWidget { - final int index; - final ServiceRequest request; - final Function(ServiceRequest) onPressed; - const ServiceRequestItem({Key key, this.request, this.onPressed, this.index}) : super(key: key); - - @override - Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - User _user = Provider.of(context,listen: false).user; - final servicesProvider = Provider.of(context,listen: false); - final settingProvider = Provider.of(context,listen: false); - Color itemColor = index % 2 == 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; - Color onItemColor = index % 2 != 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - primary: itemColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - ), - ), - //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - onPressed: (){ - onPressed(request); - }, - child: Row( - children: [ - //Placeholder(color: onItemColor,fallbackWidth: 80,fallbackHeight: 80,), - _user.type == UsersTypes.normal_user && request.devicePhotos.isEmpty ? SizedBox.shrink(): - SizedBox( - width: 80, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - request.devicePhotos.isEmpty ? SizedBox.shrink(): - Column( - children: [ - SizedBox( - height: 80, - width: 80, - child: ImageLoader( - url: request.devicePhotos.first, - boxFit: BoxFit.cover, - ), - ), - SizedBox(height: 24,), - ], - ), - - _user.type == UsersTypes.engineer ? - Material( - color: onItemColor, - elevation: 6, - shape: CircleBorder(), - child: IconButton( - icon: Icon( - Icons.description, - color: itemColor, - size: 32, - ), - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => CreateServiceReport( - request: request, - ) - ), - ); - }, - ), - ) :SizedBox.shrink(), - //SizedBox(height: 8,), - - ], - ), - ), - SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: request.requestCode == null ? SizedBox.shrink(): - Text( - request.requestCode ?? "-----", - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 16, - fontWeight: FontWeight.bold - ), - ), - ), - request.engineerName == null ? SizedBox.shrink(): - Text( - request.engineerName ?? "", - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), - - ], - ), - Divider(color: onItemColor,), - Row( - children: [ - Expanded( - child: request.deviceModel == null ? SizedBox.shrink(): - Text( - request.deviceModel ?? "Model not available", - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), - ), - request.engineerMobile == null ? SizedBox.shrink(): - Text( - request.engineerMobile, - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), - ], - ), - Divider(color: onItemColor,), - Row( - children: [ - Expanded( - child: request.deviceSerialNumber == null ? SizedBox.shrink(): - Text( - request.deviceSerialNumber, - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), - ), - ], - ), - request.deviceEnName == null ? SizedBox.shrink(): - Row( - children: [ - Expanded( - child: Text( - request.deviceEnName, - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), - ), - ], - ), - ], - ), - ), - - ], - ), - - Divider(color: onItemColor,), - Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Text( - request.maintenanceIssue ?? "No maintenance issue found", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor - ), - textAlign: TextAlign.center, - ), - ), - ), - Divider(color: onItemColor,), - Row( - children: [ - Text( - request.date ?? "Date not available", - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor - ), - ), - Spacer(), - StatusLabel(label: request.statusLabel, - color: AColors.getRequestStatusColor(request.statusValue)), - ], - ), - request.nextVisitDate == null ? SizedBox.shrink() : - Column( - children: [ - Divider(color: onItemColor,), - Row( - children: [ - Text( - _subtitle.nextVisitDate, - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor - ), - ), - Spacer(), - Text( - DateFormat('EE dd/MM/yyyy').format(request.nextVisitDate), - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor - ), - ), - ], - ), - ], - ), - ], - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/views/widgets/requests/service_request_list.dart b/lib/views/widgets/requests/service_request_list.dart deleted file mode 100644 index 7cd71079..00000000 --- a/lib/views/widgets/requests/service_request_list.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/pages/user/requests/request_details.dart'; -import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/requests/service_request_item.dart'; -class ServiceRequestsList extends StatelessWidget { - final List requests; - final bool nextPage; - final Future Function() onLazyLoad; - - const ServiceRequestsList({Key key, this.requests, this.nextPage, this.onLazyLoad}) : super(key: key); - - @override - Widget build(BuildContext context) { - - Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(requests.length == 0){ - return NoItemFound(message: _subtitle.noServiceRequestFound,); - } - return LazyLoading( - nextPage: nextPage, - onLazyLoad: onLazyLoad, - child: ListView.builder( - //physics: BouncingScrollPhysics(), - itemCount: requests.length, - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ - return ServiceRequestItem( - index: itemIndex, - request: requests[itemIndex], - onPressed: (request){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> RequestDetailsPage(serviceRequest: request,) - ) - ); - }, - ); - } - ), - ); - } -} diff --git a/lib/views/widgets/requests/service_request_update_dialog.dart b/lib/views/widgets/requests/service_request_update_dialog.dart deleted file mode 100644 index bde17432..00000000 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ /dev/null @@ -1,149 +0,0 @@ -import 'package:flutter/cupertino.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/service_requests_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/service_request/service_request.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/subtitle.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/hospitals/hospital_auto_complete_field.dart'; -import 'package:flutter/material.dart'; -import 'package:test_sa/views/widgets/status/employee/employee_mune.dart'; - -import '../app_text_form_field.dart'; - -class ServiceRequestsUpdateDialog extends StatefulWidget { - final ServiceRequest request; - const ServiceRequestsUpdateDialog({ - Key key, this.request, - }) : super(key: key); - @override - State createState() => _ServiceRequestsUpdateDialogState(); -} - -class _ServiceRequestsUpdateDialogState extends State - with TickerProviderStateMixin{ - - DateTime _dateTime; - Lookup _employee; - Subtitle _subtitle; - UserProvider _userProvider; - SettingProvider _settingProvider; - ServiceRequestsProvider _serviceRequestsProvider; - - final GlobalKey _formKey = GlobalKey(); - - _update() async { - if(_dateTime == null && _employee == null){ - Fluttertoast.showToast( - msg: _subtitle.noDateFound, - ); - return; - } - showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return CupertinoAlertDialog( - title: Text(_subtitle.updatingDots), - content: Center(child: CircularProgressIndicator()), - ); - }, - ); - int status = await _serviceRequestsProvider.updateDate( - user: _userProvider.user, - host: _settingProvider.host, - request: widget.request, - newDate: _dateTime?.toString()?.split(" ")?.first, - employee: _employee - ); - if(status == 200) Navigator.of(context).pop(); - Navigator.of(context).pop(); - Fluttertoast.showToast( - msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), - ); - } - - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; - _userProvider = Provider.of(context,listen: false); - _settingProvider = Provider.of(context,listen: false); - _serviceRequestsProvider = Provider.of(context,listen: false); - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - // height: MediaQuery.of(context).size.height / 1.2, - child: Form( - key: _formKey, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ASmallButton( - text: _subtitle.cancel, - onPressed: (){ - Navigator.of(context).pop(); - }, - ), - - ASmallButton( - text: _subtitle.update, - onPressed: _update, - ) - ], - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - Row( - children: [ - Expanded( - child: Text( - _subtitle.date, - style: Theme.of(context).textTheme.subtitle1, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ), - ADatePicker( - date: _dateTime, - from: DateTime.now(), - onDatePicker: (date){ - _dateTime = date; - setState(() {}); - }, - ), - ], - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - EmployeeMenu( - initialValue: _employee, - onSelect: (employee){ - _employee = employee; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ], - ), - ), - ), - ), - ], - ); - } -} diff --git a/lib/views/widgets/search/filter_item.dart b/lib/views/widgets/search/filter_item.dart deleted file mode 100644 index 10d708a0..00000000 --- a/lib/views/widgets/search/filter_item.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; - -class FilterItem extends StatelessWidget { - final bool isSelected; - final Lookup status; - final VoidCallback onSelected; - - const FilterItem({ - Key key, - this.status, - this.isSelected, - this.onSelected - }) : super(key: key); - - Color getStatusColor(){ - switch(status.id){ - case 0: return AColors.green; - case 4: return AColors.deepRed; - case 6: return AColors.green; - case 5: return AColors.orange; - case 8: return AColors.green; - case 9: return AColors.orange; - default : return AColors.grey; - } - } - - @override - Widget build(BuildContext context) { - return Opacity( - opacity: isSelected ? 1 : .5, - child: SizedBox( - height: 30, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(horizontal: 8), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ) - ), - primary: getStatusColor(), - ), - child: Text( - status.label??"", - style: Theme.of(context).textTheme.bodyText1.copyWith( - color:getStatusColor().computeLuminance() > 0.5 - ? AColors.black : Colors.white, - ), - textScaleFactor: AppStyle.getScaleFactor(context), - ), - onPressed:onSelected, - ), - ), - ); - } -} diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart deleted file mode 100644 index a1f78945..00000000 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ /dev/null @@ -1,188 +0,0 @@ -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/service_request/service_request_search.dart'; -import 'package:test_sa/models/subtitle.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/hospitals/hospital_auto_complete_field.dart'; - -import '../app_text_form_field.dart'; -import 'filter_item.dart'; -class ServiceRequestsSearchDialog extends StatefulWidget { - final ServiceRequestSearch initialSearchValue; - final bool expandedSearch; - final Function(ServiceRequestSearch) onSearch; - - const ServiceRequestsSearchDialog({ - Key key, - this.initialSearchValue, - this.expandedSearch, - this.onSearch - }) : super(key: key); - @override - _ServiceRequestsSearchDialogState createState() => _ServiceRequestsSearchDialogState(); -} - -class _ServiceRequestsSearchDialogState extends State - with TickerProviderStateMixin{ - ServiceRequestSearch _search; - List status = [ - Lookup(label: "New", id: 4,), - - Lookup(label: "Repaired", id: 6,), - Lookup(label: "Repeated", id: 8), - Lookup(label: "Closed", id: 9,), - Lookup(label: "Under Repair", id: 5,), - ]; - - final GlobalKey _formKey = GlobalKey(); - - @override - void initState() { - super.initState(); - _search = ServiceRequestSearch(); - _search.fromSearch(widget.initialSearchValue); - } - @override - Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - return SizedBox( - height: MediaQuery.of(context).size.height / 1.2, - child: Form( - key: _formKey, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ASmallButton( - text: _subtitle.cancel, - onPressed: (){ - Navigator.of(context).pop(); - }, - ), - - ASmallButton( - text: _subtitle.search, - onPressed: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - ) - ], - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _search.deviceSerialNumber, - hintText: _subtitle.serialNumber, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - onSaved: (value){ - _search.deviceSerialNumber = value; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - HospitalAutoCompleteField( - initialValue: _search.hospital, - onSave: (value){ - _search.hospital = value; - }, - onSearch: (value){ - _search.hospital = value; - Navigator.of(context).pop(_search); - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _search.deviceName, - hintText: _subtitle.deviceName, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - onSaved: (value){ - _search.deviceName = value; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _search.model, - hintText: _subtitle.model, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - onSaved: (value){ - _search.model = value; - }, - ), - SizedBox(height: 16 * AppStyle.getScaleFactor(context),), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), - child: Wrap( - spacing: 10, - runSpacing: 10, - alignment: WrapAlignment.spaceEvenly, - children: List.generate( - status.length, - (index) { - bool isSelected = _search.statusValue == status[index].id; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _search.statusValue = null; - else - _search.statusValue = status[index].id; - - setState(() {}); - }, - status: status[index], - ); - } - - ), - ), - ), - - Visibility( - visible: widget.initialSearchValue.toSearchString().isNotEmpty, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), - child: AButton( - padding: EdgeInsets.zero, - text: _subtitle.clearSearch, - onPressed: (){ - _search = ServiceRequestSearch(); - Navigator.of(context).pop(_search); - }, - ), - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/views/widgets/search/visits_search_bar.dart b/lib/views/widgets/search/visits_search_bar.dart deleted file mode 100644 index 17805c20..00000000 --- a/lib/views/widgets/search/visits_search_bar.dart +++ /dev/null @@ -1,242 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/visits/visits_search.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/from_to_date_bar.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; - -import '../app_text_form_field.dart'; -import 'filter_item.dart'; -class VisitsSearchDialog extends StatefulWidget { - final VisitsSearch initialSearchValue; - final bool expandedSearch; - final Function(VisitsSearch) onSearch; - - const VisitsSearchDialog({ - Key key, - this.initialSearchValue, - this.expandedSearch, - this.onSearch - }) : super(key: key); - @override - _VisitsSearchDialogState createState() => _VisitsSearchDialogState(); -} - -class _VisitsSearchDialogState extends State - with TickerProviderStateMixin{ - VisitsSearch _search; - List status = [ - Lookup(label: "Done", id: 0,), - Lookup(label: "Not Yet", id: 1), - Lookup(label: "On Hold", id: 2,), - ]; - - List contactStatus = [ - Lookup(label: "Hospital Employee", key: "H",), - Lookup(label: "Under Warranty", key: "CW"), - Lookup(label: "Under Maintenance Contract", key: "CC",), - ]; - - - final GlobalKey _formKey = GlobalKey(); - - @override - void initState() { - super.initState(); - _search = VisitsSearch(); - _search.fromSearch(widget.initialSearchValue); - } - @override - Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - DateTime today = DateTime.now(); - return SizedBox( - height: MediaQuery.of(context).size.height / 1.3, - child: Form( - key: _formKey, - child: ListView( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ASmallButton( - text: _subtitle.cancel, - onPressed: (){ - Navigator.of(context).pop(); - }, - ), - - ASmallButton( - text: _subtitle.search, - onPressed: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - ) - ], - ), - ATextFormField( - initialValue: _search.deviceSerialNumber, - hintText: _subtitle.serialNumber, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - onSaved: (value){ - _search.deviceSerialNumber = value; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - HospitalAutoCompleteField( - initialValue: _search.hospitalName, - onSave: (value){ - _search.hospitalName = value; - }, - onSearch: (value){ - _search.hospitalName = value; - Navigator.of(context).pop(_search); - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _search.brand, - hintText: _subtitle.brand, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - onSaved: (value){ - _search.brand = value; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _search.model, - hintText: _subtitle.model, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - onSaved: (value){ - _search.model = value; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ASubTitle(_subtitle.status), - SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), - Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - status.length, - (index) { - bool isSelected = _search.statusValue == status[index].id; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _search.statusValue = null; - else - _search.statusValue = status[index].id; - - setState(() {}); - }, - status: status[index], - ); - } - - ), - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ASubTitle(_subtitle.contactStatus), - SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), - Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - contactStatus.length, - (index) { - bool isSelected = _search.contactStatus == contactStatus[index].key; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _search.contactStatus = null; - else - _search.contactStatus = contactStatus[index].key; - - setState(() {}); - }, - status: contactStatus[index], - ); - } - - ), - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ASubTitle(_subtitle.actualDate), - SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), - FromToDateBar( - from: _search.actualDateFrom , - to: _search.actualDateTo, - onPickFrom: (date){ - _search.actualDateFrom = date; - }, - onPickTo: (date){ - _search.actualDateTo = date; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ASubTitle(_subtitle.expectDate), - SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), - FromToDateBar( - from: _search.expectedDateFrom ?? DateTime(today.year, today.month, 1), - to: _search.expectedDateTo ?? DateTime(today.year, (today.month +1).clamp(1, 12) , today.month == 12 ? 31 : 0), - onPickFrom: (date){ - _search.expectedDateFrom = date; - }, - onPickTo: (date){ - _search.expectedDateTo = date; - }, - ), - Visibility( - visible: _search.toSearchString().isNotEmpty, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), - child: AButton( - padding: EdgeInsets.zero, - text: _subtitle.clearSearch, - onPressed: (){ - _search = VisitsSearch(); - Navigator.of(context).pop(_search); - }, - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/views/widgets/sound/sound_player.dart b/lib/views/widgets/sound/sound_player.dart deleted file mode 100644 index 1422f24e..00000000 --- a/lib/views/widgets/sound/sound_player.dart +++ /dev/null @@ -1,239 +0,0 @@ -import 'dart:typed_data'; - -import 'package:audioplayers/audioplayers.dart'; -import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; - -import '../../app_style/colors.dart'; - -class ASoundPlayer extends StatefulWidget { - - final String audio; - - const ASoundPlayer({Key key, this.audio}) : super(key: key); - - @override - _ASoundPlayerState createState() => _ASoundPlayerState(); -} - -class _ASoundPlayerState extends State { - - //FlutterSoundPlayer _myPlayer = FlutterSoundPlayer(); - bool _sliderMoving = false; - Duration _audioTime; - Duration _audioPosition; - String _audio; - bool _isLocalFile = false; - bool _failedToLoad = false; - AudioPlayer _audioPlayer; - - Widget _getAudioButton(){ - switch(_audioPlayer.state){ - case PlayerState.playing: - return IconButton( - icon: const Icon(Icons.pause_rounded), - onPressed: () async { - _failedToLoad = false; - await _audioPlayer.pause(); - rebuild(); - } - ); - case PlayerState.paused: - return IconButton( - icon: const Icon(Icons.play_arrow_rounded), - onPressed: () async { - _failedToLoad = false; - await _audioPlayer.resume(); - rebuild(); - } - ); - case PlayerState.completed: - return IconButton( - icon: const Icon(Icons.replay_rounded), - onPressed: () async { - _failedToLoad = false; - await _audioPlayer.stop(); - await _audioPlayer.resume(); - rebuild(); - } - ); - case PlayerState.stopped: - return IconButton( - icon: Icon( _isLocalFile - ? Icons.play_circle_fill_outlined - : Icons.download_rounded - - ), - onPressed: () async { - _failedToLoad = false; - try { - await _audioPlayer.play( - _isLocalFile? - DeviceFileSource(_audio):UrlSource(_audio), - ); - rebuild(); - } on Exception catch (e) { - _failedToLoad = true; - } - } - ); - default: return IconButton( - icon: const Icon( Icons.replay_rounded), - onPressed: () async { - _failedToLoad = false; - try { - _audioPlayer.seek(const Duration(milliseconds: 0)); - _audioPlayer.stop(); - await _audioPlayer.play( - _isLocalFile? - DeviceFileSource(_audio):UrlSource(_audio), - ); - rebuild(); - } on Exception catch (e) { - _failedToLoad = true; - } - } - ); - } - } - - String format(Duration d) { - if(d == null) - return "00:00"; - return d.toString().substring(2, 7); - } - - rebuild(){ - if (!mounted) return; - setState(() {}); - } - - bool _isLocalUrl(String url) { - if(url?.isEmpty != false) return false; - return url.startsWith("/") || - url.startsWith("file://") || - url.substring(1).startsWith(':\\'); - } - - @override - void initState() { - super.initState(); - _audioPlayer = AudioPlayer(); - _audioPlayer.release(); - _audio = widget.audio; - _isLocalFile = _isLocalUrl(_audio); - _audioPlayer.setReleaseMode(ReleaseMode.stop); - if(_isLocalFile){ - _audioPlayer.setSourceDeviceFile(_audio).then((value) {rebuild();}); - } else{ - _audioPlayer.setReleaseMode(ReleaseMode.stop); - } - // set up listeners - _audioPlayer.onPositionChanged.listen((Duration duration) { - if(!_sliderMoving){ - _audioPosition = duration; - rebuild(); - } - //setState(() => position = p); - }); - _audioPlayer.onPlayerStateChanged.listen((event) { - //_audioPosition = _audioTime; - rebuild(); - }); - _audioPlayer.onDurationChanged.listen((Duration duration) { - _audioTime = duration; - rebuild(); - }); - _audioPlayer.onSeekComplete.listen((event) { - rebuild(); - }); - } - - @override - void dispose() { - super.dispose(); - // _myPlayer.closeAudioSession(); - _audioPlayer.release(); - _audioPlayer.dispose(); - - } - - @override - Widget build(BuildContext context) { - if(_audio != widget.audio){ - WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { - _audio = widget.audio; - if(_isLocalFile){ - await _audioPlayer.setSourceDeviceFile(_audio); - }else{ - await _audioPlayer.setSourceUrl(_audio); - } - _audioPlayer.seek(const Duration(milliseconds: 0)); - _audioPlayer.stop(); - rebuild(); - }); - } - return Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row( - children: [ - Material( - color: Colors.transparent, - child: _getAudioButton() - ), - Expanded( - child: Slider( - value: _audioPosition?.inMilliseconds?.toDouble() ?? 0.0, - min: 0, - max: _audioTime?.inMilliseconds?.toDouble() ?? 60.0, - onChangeStart: (value){ - _sliderMoving = true; - }, - onChanged: (value){ - _audioPosition = Duration(milliseconds: value.round()); - rebuild(); - }, - onChangeEnd: (value){ - _sliderMoving = false; - _audioPlayer.seek(Duration(milliseconds: value.round())); - rebuild(); - } - - ), - ), - ], - ), - Row( - children: [ - Expanded( - child: Visibility( - visible: _failedToLoad, - child: Row( - children: [ - Text( - "Failed to load", - style: Theme.of(context).textTheme.overline.copyWith( - color: AColors.red - ), - textScaleFactor: AppStyle.getScaleFactor(context), - ), - - ], - ), - ), - ), - Visibility( - visible: _audioPlayer.state != PlayerState.stopped, - child: Text( - "${format(_audioPosition)}/${format(_audioTime)}", - style: Theme.of(context).textTheme.overline, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ), - ], - ) - ], - ); - } -} diff --git a/lib/views/widgets/status/employee/employee_mune.dart b/lib/views/widgets/status/employee/employee_mune.dart deleted file mode 100644 index 5ea741d4..00000000 --- a/lib/views/widgets/status/employee/employee_mune.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_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 EmployeeMenu extends StatelessWidget { - final Function(Lookup) onSelect; - final Lookup initialValue; - - const EmployeeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); - @override - Widget build(BuildContext context) { - final settingProvider = Provider.of(context); - final userProvider = Provider.of(context); - final menuProvider = Provider.of(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, - ) - ); - } -} diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart deleted file mode 100644 index 358226b0..00000000 --- a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_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 GasCylinderSizeMenu extends StatelessWidget { - final Function(Lookup) onSelect; - final Lookup initialValue; - - const GasCylinderSizeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); - @override - Widget build(BuildContext context) { - final settingProvider = Provider.of(context); - final userProvider = Provider.of(context); - final menuProvider = Provider.of(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, - ) - ); - } -} diff --git a/lib/views/widgets/status/gas_refill/gas_type.dart b/lib/views/widgets/status/gas_refill/gas_type.dart deleted file mode 100644 index 8d3b9e61..00000000 --- a/lib/views/widgets/status/gas_refill/gas_type.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_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 GasTypeMenu extends StatelessWidget { - final Function(Lookup) onSelect; - final Lookup initialValue; - - const GasTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); - @override - Widget build(BuildContext context) { - final settingProvider = Provider.of(context); - final userProvider = Provider.of(context); - final menuProvider = Provider.of(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, - ) - ); - } -} diff --git a/lib/views/widgets/status/multi_status_menu.dart b/lib/views/widgets/status/multi_status_menu.dart deleted file mode 100644 index 99a52a87..00000000 --- a/lib/views/widgets/status/multi_status_menu.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.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 MultiStatusMenu extends StatefulWidget { - final List statuses; - final List initialSelectedStatus; - final Function(List) onSelect; - - const MultiStatusMenu({Key key, this.statuses, this.onSelect, this.initialSelectedStatus}) : super(key: key); - @override - _MultiStatusMenuState createState() => _MultiStatusMenuState(); -} - -class _MultiStatusMenuState extends State { - - List _selectedStatus = []; - TextEditingController _controller; - - @override - void initState() { - _controller = TextEditingController(); - _selectedStatus.addAll(widget.initialSelectedStatus); - super.initState(); - } - - @override - void dispose() { - _controller.clear(); - super.dispose(); - } - @override - Widget build(BuildContext context) { - return - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Wrap( - crossAxisAlignment: WrapCrossAlignment.start, - alignment: WrapAlignment.start, - runAlignment: WrapAlignment.start, - children: List.generate( - _selectedStatus.length, - (index) { - final status = _selectedStatus[index]; - return Container( - height: 36 * AppStyle.getScaleFactor(context), - margin: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), - //padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary, - borderRadius: BorderRadius.circular(8) - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(width: 12,), - Text( - status.label, - style: Theme.of(context).textTheme.bodyText1.copyWith( - color:Theme.of(context).colorScheme.onPrimary, - ), - ), - IconButton( - color:Theme.of(context).colorScheme.onPrimary, - onPressed: (){ - _selectedStatus.remove(status); - widget.onSelect(_selectedStatus); - setState(() {}); - }, - icon: const Icon(Icons.delete) - ) - ], - ) - ); - } - ), - ), - 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( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.subtitle1, - 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) { - return widget.statuses.where((Lookup option) { - return option.label.toLowerCase().contains(_controller.text); - }); - }, - itemBuilder: (context, part) { - return ListTile( - title: Text(part.label), - ); - }, - onSuggestionSelected: (status) { - _controller.clear(); - if(!_selectedStatus.contains(status)){ - _selectedStatus.add(status); - widget.onSelect(_selectedStatus); - setState(() {}); - } - }, - ), - ), - ], - ); - } -} diff --git a/lib/views/widgets/status/pentry/pentry_status_mune.dart b/lib/views/widgets/status/pentry/pentry_status_mune.dart deleted file mode 100644 index b0813f22..00000000 --- a/lib/views/widgets/status/pentry/pentry_status_mune.dart +++ /dev/null @@ -1,37 +0,0 @@ -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(context); - final userProvider = Provider.of(context); - final menuProvider = Provider.of(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, - ) - ); - } -} diff --git a/lib/views/widgets/status/pentry/pentry_task_status_mune.dart b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart deleted file mode 100644 index 8564410d..00000000 --- a/lib/views/widgets/status/pentry/pentry_task_status_mune.dart +++ /dev/null @@ -1,37 +0,0 @@ -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(context); - final userProvider = Provider.of(context); - final menuProvider = Provider.of(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, - ) - ); - } -} diff --git a/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart deleted file mode 100644 index 4df17a49..00000000 --- a/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart +++ /dev/null @@ -1,37 +0,0 @@ -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(context); - final userProvider = Provider.of(context); - final menuProvider = Provider.of(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, - ) - ); - } -} diff --git a/lib/views/widgets/status/report/service_report_last_call.dart b/lib/views/widgets/status/report/service_report_last_call.dart deleted file mode 100644 index a3f59211..00000000 --- a/lib/views/widgets/status/report/service_report_last_call.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -class ServiceReportLastCallsMenu extends StatelessWidget { - final Function(Lookup) onSelect; - final ServiceReport report; - - const ServiceReportLastCallsMenu({ - Key key,@required this.onSelect,@required this.report}) : super(key: key); - @override - Widget build(BuildContext context) { - ServiceReportLastCallsProvider _menuProvider = Provider.of(context); - return LoadingManager( - isLoading: _menuProvider.isLoading, - isFailedLoading: _menuProvider.calls == null, - stateCode: _menuProvider.stateCode, - onRefresh: () async {}, - child: SingleStatusMenu( - initialStatus: report?.callLastSituation, - statuses: _menuProvider.calls, - onSelect: onSelect, - ) - ); - } -} diff --git a/lib/views/widgets/status/report/service_report_reasons.dart b/lib/views/widgets/status/report/service_report_reasons.dart deleted file mode 100644 index dbdd48ef..00000000 --- a/lib/views/widgets/status/report/service_report_reasons.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_reasons_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 ServiceReportReasonsMenu extends StatelessWidget { - final Lookup initialValue; - final Function(Lookup) onSelect; - - const ServiceReportReasonsMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); - @override - Widget build(BuildContext context) { - SettingProvider _settingProvider = Provider.of(context); - UserProvider _userProvider = Provider.of(context); - ServiceReportReasonsProvider _menuProvider = Provider.of(context); - return LoadingManager( - isLoading: _menuProvider.isLoading, - isFailedLoading: _menuProvider.reasons == null, - stateCode: _menuProvider.stateCode, - onRefresh: () async { - _menuProvider.reset(); - await _menuProvider.getTypes( - user: _userProvider.user, - host: _settingProvider.host, - - ); - }, - child: SingleStatusMenu( - initialStatus: initialValue, - statuses: _menuProvider.reasons, - onSelect: onSelect, - ) - ); - } -} diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart deleted file mode 100644 index 8a4d1c98..00000000 --- a/lib/views/widgets/status/report/service_report_status.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_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/models/service_report.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -class ServiceReportStatusMenu extends StatefulWidget { - final Function(Lookup) onSelect; - final ServiceReport report; - - const ServiceReportStatusMenu({Key key, this.onSelect, this.report}) : super(key: key); - - @override - State createState() => _ServiceReportStatusMenuState(); -} - -class _ServiceReportStatusMenuState extends State { - bool firstTime = true; - @override - Widget build(BuildContext context) { - SettingProvider _settingProvider = Provider.of(context); - UserProvider _userProvider = Provider.of(context); - ServiceReportStatusProvider _menuProvider = Provider.of(context); - ServiceReportLastCallsProvider _callsLastSituationsProvider = Provider.of(context,listen: false); - if(firstTime){ - _callsLastSituationsProvider.reset(); - - firstTime = false; - } - return LoadingManager( - isLoading: _menuProvider.isLoading == true || _callsLastSituationsProvider.isLoading == true, - isFailedLoading: _menuProvider.statuses == null || _callsLastSituationsProvider.calls == null, - stateCode: _menuProvider.stateCode == null || _callsLastSituationsProvider.stateCode == null ? null: - max(_menuProvider.stateCode ?? 0,_callsLastSituationsProvider.stateCode ?? 0), - onRefresh: () async { - if(_menuProvider.stateCode == null){ - _menuProvider.reset(); - await _menuProvider.getTypes( - user: _userProvider.user, - host: _settingProvider.host - ); - } - await _callsLastSituationsProvider.getCalls( - user: _userProvider.user, - host: _settingProvider.host, - serviceStatus: widget.report.status?.id.toString() - ); - }, - child: SingleStatusMenu( - statuses: _menuProvider.statuses, - initialStatus: widget.report.status, - onSelect: (status){ - _callsLastSituationsProvider.getCalls( - user: _userProvider.user, - host: _settingProvider.host, - serviceStatus: status.id.toString() - ); - widget.report.callLastSituation = null; - widget.onSelect(status); - }, - ) - ); - } -} diff --git a/lib/views/widgets/status/report/service_status.dart b/lib/views/widgets/status/report/service_status.dart deleted file mode 100644 index 37eb554e..00000000 --- a/lib/views/widgets/status/report/service_status.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_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 ServiceStatusMenu extends StatelessWidget { - final Function(Lookup) onSelect; - final Lookup initialValue; - - const ServiceStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); - @override - Widget build(BuildContext context) { - SettingProvider _settingProvider = Provider.of(context); - UserProvider _userProvider = Provider.of(context); - ServiceStatusProvider _menuProvider = Provider.of(context); - return LoadingManager( - isLoading: _menuProvider.isLoading, - isFailedLoading: _menuProvider.statuses == null, - stateCode: _menuProvider.stateCode, - onRefresh: () async { - _menuProvider.reset(); - await _menuProvider.getTypes( - user: _userProvider.user, - host: _settingProvider.host - ); - }, - child: SingleStatusMenu( - initialStatus: initialValue, - statuses: _menuProvider.statuses, - onSelect: onSelect, - ) - ); - } -} diff --git a/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart deleted file mode 100644 index be02c54e..00000000 --- a/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart +++ /dev/null @@ -1,37 +0,0 @@ -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(context); - final userProvider = Provider.of(context); - final menuProvider = Provider.of(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, - ) - ); - } -} diff --git a/lib/views/widgets/status/service_request/service_request_priority_mune.dart b/lib/views/widgets/status/service_request/service_request_priority_mune.dart deleted file mode 100644 index fe3bd6db..00000000 --- a/lib/views/widgets/status/service_request/service_request_priority_mune.dart +++ /dev/null @@ -1,37 +0,0 @@ -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(context); - final userProvider = Provider.of(context); - final menuProvider = Provider.of(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, - ) - ); - } -} diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart deleted file mode 100644 index 95f4fbe7..00000000 --- a/lib/views/widgets/timer/app_timer.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:test_sa/models/timer_model.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/app_loading.dart'; -class AppTimer extends StatefulWidget { - final TimerModel timer; - final Future Function(TimerModel) onChange; - final TextStyle style; - const AppTimer({ - Key key, - this.timer, - this.onChange, - this.style, - }) : super(key: key); - - @override - State createState() => _AppTimerState(); -} - -class _AppTimerState extends State { - Timer _timer; - DateTime _startAt; - DateTime _endAt; - int _delay = 0; - bool _running = false; - bool _loading = false; - final ValueNotifier _period = ValueNotifier("0:00:00"); - - _startTimer() async { - if (!_running) { - final time = DateTime.now(); - bool result = await widget.onChange( - TimerModel(startAt: time,endAt: null,durationInSecond: _delay)); - if(!result) return; - _running = true; - - if(_endAt != null){ - _delay += _endAt.difference(_startAt).inSeconds; - } - _startAt = time.subtract(Duration(seconds: _delay)); - _endAt = null; - } - - _timer = Timer.periodic(const Duration(seconds: 1), (timer) { - if(_loading == true) return; - _period.value = (_endAt ?? DateTime.now()).difference( - _startAt - ).toString().split(".").first; - }); - } - - _stopTimer() async { - final time = DateTime.now(); - final tempStartAt = _startAt.add(Duration(seconds: _delay)); - bool result = await widget.onChange( - TimerModel(startAt: tempStartAt,endAt: time,durationInSecond: _delay)); - if(!result) return; - _running = false; - _endAt = time; - _startAt = tempStartAt; - _timer?.cancel(); - } - - _onPressed() async { - _loading = true; - setState(() {}); - if(!_running){ - await _startTimer(); - }else{ - await _stopTimer(); - } - _loading = false; - setState(() {}); - } - - @override - void initState() { - _startAt = widget.timer?.startAt; - _endAt = widget.timer?.endAt; - _running = _startAt != null && _endAt == null; - _delay = (widget.timer?.durationInSecond ?? 0); - final difference = _startAt == null ? 0: - (_endAt ?? DateTime.now())?.difference(_startAt)?.inSeconds ?? 0; - _period.value = Duration(seconds: _running ? difference : _delay + difference).toString().split(".").first; - super.initState(); - if(_running){_startTimer();} - } - - @override - void dispose() { - super.dispose(); - } - @override - Widget build(BuildContext context) { - return SizedBox( - width: 100 * AppStyle.getScaleFactor(context), - height: 28 * AppStyle.getScaleFactor(context), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - minimumSize: const Size(1, 1), - padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), - backgroundColor: _running ? AColors.green[300] : AColors.grey, - foregroundColor: Colors.black - ), - onPressed: _loading ? null : _onPressed, - child: _loading ? const SizedBox.square( - dimension: 18,child: CircularProgressIndicator(color: Colors.white,)): - Row( - children: [ - Icon(_running ? Icons.pause : Icons.play_arrow), - Expanded( - child: Center( - child: ValueListenableBuilder( - valueListenable: _period, - builder: (context,value,_){ - return Text(value, - style: widget.style, - ); - } - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/views/widgets/titles/app_title.dart b/lib/views/widgets/titles/app_title.dart deleted file mode 100644 index e97f8b9d..00000000 --- a/lib/views/widgets/titles/app_title.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; -class ATitle extends StatelessWidget { - final String text; - final EdgeInsets padding; - final bool center; - const ATitle(this.text, {Key key,this.padding,this.center= false}) : super(key: key); - @override - Widget build(BuildContext context) { - return Padding( - padding: padding ?? EdgeInsets.symmetric(horizontal: 16,vertical: 8), - child: Row( - mainAxisAlignment: center - ? MainAxisAlignment.center - : MainAxisAlignment.start, - children: [ - Text( - text, - style: Theme.of(context).textTheme.headline6, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ], - ), - ); - } -} diff --git a/lib/views/widgets/titles/expandable_info_row.dart b/lib/views/widgets/titles/expandable_info_row.dart deleted file mode 100644 index b5d24e62..00000000 --- a/lib/views/widgets/titles/expandable_info_row.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -class ExpandableInfoRow extends StatefulWidget { - final IconData iconData; - final String title; - final Widget child; - - const ExpandableInfoRow({Key key, this.iconData, this.title, this.child}) : super(key: key); - - @override - _ExpandableInfoRowState createState() => _ExpandableInfoRowState(); -} - -class _ExpandableInfoRowState extends State - with TickerProviderStateMixin{ - bool _isExpanded = false; - @override - Widget build(BuildContext context) { - return InkWell( - onTap: (){ - _isExpanded = !_isExpanded; - setState(() {}); - }, - child: Column( - children: [ - Row( - children: [ - widget.iconData != null ? - Padding( - padding: EdgeInsets.symmetric( - horizontal: 8 * AppStyle.getScaleFactor(context), - vertical: 2 * AppStyle.getScaleFactor(context), - ), - child: FaIcon( - widget.iconData, - color: Theme.of(context).primaryColor, - size: 20 * AppStyle.getScaleFactor(context), - ), - ):SizedBox.shrink(), - Expanded( - flex: 2, - child: Text( - widget.title, - style: TextStyle( - //color: Theme.of(context).dividerColor, - fontSize: 14, - fontWeight: FontWeight.bold, - ), - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ), - AnimatedSwitcher( - duration: Duration(milliseconds: 400), - transitionBuilder: (Widget child, Animation animation) { - return FadeTransition( - child: ScaleTransition( - child: child, - scale: animation - ), - opacity: animation, - ); - }, - child: Icon( - _isExpanded - ? Icons.keyboard_arrow_up - : Icons.keyboard_arrow_down, - key: ValueKey(_isExpanded - ? "Icons.keyboard_arrow_up" - : "Icons.keyboard_arrow_down"), - color: Theme.of(context).primaryColor, - size: 24 * AppStyle.getScaleFactor(context), - ), - ), - ], - ), - AnimatedSize( - duration: Duration(milliseconds: 300), - child: Visibility( - visible: _isExpanded, - child: Padding( - padding: EdgeInsets.symmetric(vertical: 8 * AppStyle.getScaleFactor(context)), - child: widget.child, - ) - ), - ), - Divider(height: 2 * AppStyle.getScaleFactor(context),), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - ], - ), - ); - } -} diff --git a/lib/views/widgets/visits/visit_status.dart b/lib/views/widgets/visits/visit_status.dart deleted file mode 100644 index 871287fe..00000000 --- a/lib/views/widgets/visits/visit_status.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -class VisitStatusLabel extends StatelessWidget { - final Visit visit; - - const VisitStatusLabel({Key key, this.visit}) : super(key: key); - - Color getStatusColor(){ - switch(visit.status.id){ - case 0: return AColors.green; - case 1: return AColors.grey; - case 2: return AColors.grey; - default : return AColors.grey; - } - } - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(vertical: 2,horizontal: 8), - alignment: Alignment.center, - decoration: BoxDecoration( - color: getStatusColor(), - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), - child: Text( - visit.status.label == null - || visit.status.label.isEmpty - ? "no status" :visit.status.label, - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: getStatusColor().computeLuminance() > 0.5 - ? AColors.black : Colors.white, - ), - ) - ); - } -} diff --git a/lib/views/widgets/timer/timer_manager.dart b/lib/widgets/shared_widget.dart similarity index 100% rename from lib/views/widgets/timer/timer_manager.dart rename to lib/widgets/shared_widget.dart diff --git a/lib/controllers/api_routes/urls.dart b/old_lib/controllers/api_routes/urls.dart similarity index 100% rename from lib/controllers/api_routes/urls.dart rename to old_lib/controllers/api_routes/urls.dart diff --git a/old_lib/controllers/http_status_manger/http_status_manger.dart b/old_lib/controllers/http_status_manger/http_status_manger.dart new file mode 100644 index 00000000..fa03cd0e --- /dev/null +++ b/old_lib/controllers/http_status_manger/http_status_manger.dart @@ -0,0 +1,38 @@ +import '../../models/subtitle.dart'; + +class HttpStatusManger { + static String getStatusMessage({ + required int? status, + required Subtitle? subtitle, + String? messageFor400, + String? messageFor200, + }) { + if (status == null) { + return "careful null status"; + } + if (status == -1) { + return subtitle?.currentlyServiceNotAvailable??""; + } + if (status == -2) { + // client's request in process + return subtitle?.waitUntilYourRequestComplete??""; + } else if (status >= 200 && status < 300) { + // client's request was successfully received + return messageFor200 ?? subtitle?.requestCompleteSuccessfully??""; + } else if (status >= 400 && status < 500) { + // client's request have error + switch (status) { + case 400: + return messageFor400 ?? subtitle?.failedToCompleteRequest??""; + default: + return subtitle?.failedToCompleteRequest??""; + } + } else if (status >= 500) { + // server error + return subtitle?.currentlyServiceNotAvailable??""; + } else { + // no error match so return default error + return subtitle?.failedToCompleteRequest??""; + } + } +} diff --git a/lib/controllers/localization/localization.dart b/old_lib/controllers/localization/localization.dart similarity index 67% rename from lib/controllers/localization/localization.dart rename to old_lib/controllers/localization/localization.dart index a6e7fe82..b07f0aef 100644 --- a/lib/controllers/localization/localization.dart +++ b/old_lib/controllers/localization/localization.dart @@ -2,29 +2,33 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:test_sa/models/subtitle.dart'; + +import '../../models/subtitle.dart'; + class AppLocalization { AppLocalization(this.locale); final Locale locale; - static AppLocalization of(BuildContext context) { + + static AppLocalization? of(BuildContext context) { return Localizations.of(context, AppLocalization); } - Subtitle _subtitle; - Subtitle get subtitle => _subtitle; + Subtitle? _subtitle; + + Subtitle? get subtitle => _subtitle; Future load() async { - String jsonStringValues = - await rootBundle.loadString('assets/subtitles/${locale.languageCode}_subtitle.json'); + String jsonStringValues = await rootBundle + .loadString('assets/subtitles/${locale.languageCode}_subtitle.json'); _subtitle = Subtitle.fromJson(json.decode(jsonStringValues)); } // static member to have simple access to the delegate from Material App static const LocalizationsDelegate delegate = - _DemoLocalizationsDelegate(); + _DemoLocalizationsDelegate(); } class _DemoLocalizationsDelegate @@ -33,16 +37,16 @@ class _DemoLocalizationsDelegate @override bool isSupported(Locale locale) { - return ['en','ar'].contains(locale.languageCode); + return ['en', 'ar'].contains(locale.languageCode); } @override Future load(Locale locale) async { - AppLocalization localization = new AppLocalization(locale); + AppLocalization localization = AppLocalization(locale); await localization.load(); return localization; } @override bool shouldReload(LocalizationsDelegate old) => false; -} \ No newline at end of file +} diff --git a/lib/controllers/notification/firebase_notification_manger.dart b/old_lib/controllers/notification/firebase_notification_manger.dart similarity index 69% rename from lib/controllers/notification/firebase_notification_manger.dart rename to old_lib/controllers/notification/firebase_notification_manger.dart index 153d28fa..3ea76b41 100644 --- a/lib/controllers/notification/firebase_notification_manger.dart +++ b/old_lib/controllers/notification/firebase_notification_manger.dart @@ -3,16 +3,15 @@ import 'dart:convert'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; -import 'package:test_sa/models/app_notification.dart'; +import '../../models/app_notification.dart'; import 'notification_manger.dart'; -class FirebaseNotificationManger{ - +class FirebaseNotificationManger { static FirebaseMessaging messaging = FirebaseMessaging.instance; - static String token; + static String? token; - static Future getToken() async { + static Future getToken() async { NotificationSettings settings = await messaging.requestPermission( alert: true, announcement: false, @@ -23,7 +22,7 @@ class FirebaseNotificationManger{ sound: true, ); - if(settings.authorizationStatus == AuthorizationStatus.authorized){ + if (settings.authorizationStatus == AuthorizationStatus.authorized) { token = await messaging.getToken(); } return token; @@ -32,7 +31,7 @@ class FirebaseNotificationManger{ static initialized(BuildContext context) async { await Firebase.initializeApp(); NotificationSettings settings; - try{ + try { settings = await messaging.requestPermission( alert: true, announcement: false, @@ -42,11 +41,11 @@ class FirebaseNotificationManger{ provisional: false, sound: true, ); - }catch(error){ + } catch (error) { return; } - if(settings.authorizationStatus != AuthorizationStatus.authorized){ + if (settings.authorizationStatus != AuthorizationStatus.authorized) { return; } @@ -56,28 +55,24 @@ class FirebaseNotificationManger{ FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { AppNotification notification = AppNotification.fromJson(message.data); - if(notification.path == null - || notification.path.isEmpty) - return; Navigator.pushNamed( - context, - notification.path, - arguments: notification.requestId + context, + notification.path??"", + arguments: notification.requestId, ); }); FirebaseMessaging.onMessage.listen((RemoteMessage message) { AppNotification notification = AppNotification.fromJson(message.data); NotificationManger.showNotification( - title: message.notification.title, - subtext: message.notification.body, - hashcode: int.tryParse(notification.requestId ?? "") ?? 1, - payload: json.encode(message.data) + title: message.notification?.title, + subtext: message.notification?.body, + hashcode: int.tryParse(notification.requestId??"0") ?? 1, + payload: json.encode(message.data), ); return; }); } } -Future firebaseMessagingBackgroundHandler(RemoteMessage message) async { -} \ No newline at end of file +Future firebaseMessagingBackgroundHandler(RemoteMessage message) async {} diff --git a/lib/controllers/notification/notification_manger.dart b/old_lib/controllers/notification/notification_manger.dart similarity index 60% rename from lib/controllers/notification/notification_manger.dart rename to old_lib/controllers/notification/notification_manger.dart index a568d5d3..8892f17c 100644 --- a/lib/controllers/notification/notification_manger.dart +++ b/old_lib/controllers/notification/notification_manger.dart @@ -1,54 +1,54 @@ -import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -class NotificationManger{ +import '../../views/app_style/colors.dart'; + +class NotificationManger { // private constructor to avoid create object NotificationManger._(); - static FlutterLocalNotificationsPlugin localNotificationsPlugin = FlutterLocalNotificationsPlugin(); + static FlutterLocalNotificationsPlugin localNotificationsPlugin = + FlutterLocalNotificationsPlugin(); /// initialisation setting for all platform /// onNotificationPressed action when notification pressed to open tap /// onIOSNotificationPressed action when notification pressed /// to open tap in iOS versions older than 10 - static initialisation( - Function(NotificationResponse) onNotificationPressed, - DidReceiveLocalNotificationCallback onIOSNotificationPressed - ) async { + static initialisation(Function(NotificationResponse) onNotificationPressed, + DidReceiveLocalNotificationCallback onIOSNotificationPressed) async { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = - FlutterLocalNotificationsPlugin(); + FlutterLocalNotificationsPlugin(); // initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project const AndroidInitializationSettings initializationSettingsAndroid = - AndroidInitializationSettings('app_icon',); + AndroidInitializationSettings( + 'app_icon', + ); final DarwinInitializationSettings initializationSettingsDarwin = - DarwinInitializationSettings( - onDidReceiveLocalNotification: onIOSNotificationPressed); + DarwinInitializationSettings( + onDidReceiveLocalNotification: onIOSNotificationPressed); - final InitializationSettings initializationSettings = InitializationSettings( - android: initializationSettingsAndroid, - iOS: initializationSettingsDarwin, - macOS: initializationSettingsDarwin); + final InitializationSettings initializationSettings = + InitializationSettings( + android: initializationSettingsAndroid, + iOS: initializationSettingsDarwin, + macOS: initializationSettingsDarwin); - await flutterLocalNotificationsPlugin.initialize( - initializationSettings, + await flutterLocalNotificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: onNotificationPressed); } // push new notification - static Future showNotification( - { - @required String title, - @required String subtext, - @required int hashcode, - String payload - }) async { - - const AndroidNotificationDetails androidChannel = AndroidNotificationDetails( + static Future showNotification({ + required String? title, + required String? subtext, + required int hashcode, + String? payload, + }) async { + const AndroidNotificationDetails androidChannel = + AndroidNotificationDetails( 'com.newtrack.testsa', 'Test SA', - channelDescription:'Push notification service for Test SA', + channelDescription: 'Push notification service for Test SA', importance: Importance.max, priority: Priority.max, playSound: true, @@ -63,7 +63,7 @@ class NotificationManger{ ); const DarwinNotificationDetails iosNotificationDetails = - DarwinNotificationDetails( + DarwinNotificationDetails( categoryIdentifier: "testSA", ); @@ -81,5 +81,4 @@ class NotificationManger{ payload: payload, ); } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/departments_provider.dart b/old_lib/controllers/providers/api/departments_provider.dart similarity index 60% rename from lib/controllers/providers/api/departments_provider.dart rename to old_lib/controllers/providers/api/departments_provider.dart index 0bcd0f02..ed29c683 100644 --- a/lib/controllers/providers/api/departments_provider.dart +++ b/old_lib/controllers/providers/api/departments_provider.dart @@ -2,13 +2,13 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/department.dart'; -class DepartmentsProvider extends ChangeNotifier{ +import '../../../models/department.dart'; +import '../../api_routes/urls.dart'; +class DepartmentsProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { departments = null; stateCode = null; } @@ -16,52 +16,51 @@ class DepartmentsProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int stateCode; - + int? stateCode; // contain user data // when user not login or register _user = null - List departments; + List? departments; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool isLoading; - + bool? isLoading; /// 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 getDepartment (String host) async { - if(isLoading == true) + Future getDepartment(String host) async { + if (isLoading == true) { return -2; + } isLoading = true; notifyListeners(); Response response; - try{ + try { response = await get( - Uri.parse(host + URLs.getDepartments), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Uri.parse(host + URLs.getDepartments), + headers: {"Content-Type": "application/json; charset=utf-8"}, ); - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); - departments = listJson.map((department) => Department.fromJson(department)).toList(); + List listJson = + json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + departments = listJson + .map((department) => Department.fromJson(department)) + .toList(); } isLoading = false; notifyListeners(); return response.statusCode; } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/old_lib/controllers/providers/api/device_transfer_provider.dart similarity index 57% rename from lib/controllers/providers/api/device_transfer_provider.dart rename to old_lib/controllers/providers/api/device_transfer_provider.dart index 1d433c11..cd38307c 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/old_lib/controllers/providers/api/device_transfer_provider.dart @@ -2,18 +2,18 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.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/user.dart'; -class DeviceTransferProvider extends ChangeNotifier{ +import '../../../models/device/device_transfer.dart'; +import '../../../models/device/device_transfer_info.dart'; +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; +class DeviceTransferProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { items = null; nextPage = true; stateCode = null; @@ -22,30 +22,31 @@ class DeviceTransferProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int stateCode; + int? stateCode; // true if there is next page in product list and false if not - bool nextPage = true; + bool? nextPage = true; // list of user requests - List items; + List? items; // when requests in-process _loading = true // done _loading = true // failed _loading = false - bool isLoading; + bool? isLoading; /// 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 getRequests ({ - @required String host, - @required User user, + Future getRequests({ + required String host, + required User user, }) async { - if(isLoading == true) + if (isLoading == true) { return -2; + } isLoading = true; // isLoading = false; @@ -63,108 +64,97 @@ class DeviceTransferProvider extends ChangeNotifier{ // notifyListeners(); // return 200; Response response; - try{ + try { response = await get( - Uri.parse( - "$host${URLs.getDeviceTransfer}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + Uri.parse("$host${URLs.getDeviceTransfer}?uid=${user.id}" + "&token=${user.token}&page=${(items?.length ?? 0) ~/ pageItemNumber}"), + headers: {"Content-Type": "application/json; charset=utf-8"}); stateCode = response.statusCode; - if(stateCode >= 200 && stateCode < 300) { + if (stateCode != null && stateCode! >= 200 && stateCode! < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); - List itemsPage = listJson.map( - (request) => DeviceTransfer.fromJson(request)).toList(); + List listJson = + json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List itemsPage = listJson + .map((request) => DeviceTransfer.fromJson(request)) + .toList(); items ??= []; - items.addAll(itemsPage); - if(itemsPage.length == pageItemNumber){ + items?.addAll(itemsPage); + if (itemsPage.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } } isLoading = false; notifyListeners(); return response.statusCode; - - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } - Future createRequest ({ - @required String host, - @required User user, - @required DeviceTransfer model, + Future createRequest({ + required String host, + required User? user, + required DeviceTransfer model, }) async { - Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "serial_id": model.device.id ?? "", - "destination_client": model.receiver.client.id ?? "", - "destination_department": model.receiver.department.id ?? "", + Map body = { + "uid": user?.id.toString(), + "token": user?.token ?? "", + "serial_id": model.device?.id ?? "", + "destination_client": model.receiver?.client?.id ?? "", + "destination_department": model.receiver?.department?.id ?? "", }; - Response response; - try{ + try { response = await post( - Uri.parse( - host+URLs.requestDeviceTransfer), - body: body, + Uri.parse(host + URLs.requestDeviceTransfer), + body: body, ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - if(items != null) { + if (response.statusCode >= 200 && response.statusCode < 300) { + final items = this.items; + if (items != null) { items.insert( 0, DeviceTransfer.fromJson( - json.decode(utf8.decode(response.bodyBytes))[0] - ) - ); + json.decode(utf8.decode(response.bodyBytes))[0])); notifyListeners(); } } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } - Future updateRequest ({ - @required String host, - @required User user, - @required bool isSender, - @required String requestId, - @required DeviceTransfer oldModel, - @required DeviceTransferInfo newModel, + Future updateRequest({ + required String host, + required User user, + required bool isSender, + required String requestId, + required DeviceTransfer? oldModel, + required DeviceTransferInfo newModel, }) async { - - Map body = { + Map body = { "uid": user.id.toString(), "token": user.token ?? "", "current_user": user.id ?? "", }; - + body.addAll(newModel.toJson(isSender)); Response response; - try{ + try { response = await post( Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), body: body, ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { reset(); // oldModel.fromDeviceTransfer( // DeviceTransfer.fromJson( @@ -174,10 +164,8 @@ class DeviceTransferProvider extends ChangeNotifier{ notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/devices_provider.dart b/old_lib/controllers/providers/api/devices_provider.dart similarity index 53% rename from lib/controllers/providers/api/devices_provider.dart rename to old_lib/controllers/providers/api/devices_provider.dart index b55d1733..150acfdc 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/old_lib/controllers/providers/api/devices_provider.dart @@ -2,14 +2,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/user.dart'; -class DevicesProvider extends ChangeNotifier{ +import '../../../models/device/device.dart'; +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; +class DevicesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _devices = null; _stateCode = null; } @@ -17,18 +17,22 @@ class DevicesProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; - List _devices; - List get devices => _devices; + int? get stateCode => _stateCode; + + List? _devices; + + List? get devices => _devices; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -38,34 +42,33 @@ class DevicesProvider extends ChangeNotifier{ /// 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 getEquipment ({ - @required String host, - @required User user, - @required String hospitalId - }) async { - if(_loading == true) + Future getEquipment( + {required String host, + required User user, + required String hospitalId}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ + try { response = await get( - Uri.parse(host + URLs.getEquipment+"?client=$hospitalId"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Uri.parse("${host + URLs.getEquipment}?client=$hospitalId"), + headers: {"Content-Type": "application/json; charset=utf-8"}, ); - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(utf8.decode(response.bodyBytes)); - _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); + _devices = + equipmentListJson.map((device) => Device.fromJson(device)).toList(); } _loading = false; notifyListeners(); @@ -77,32 +80,32 @@ class DevicesProvider extends ChangeNotifier{ /// 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> getDevicesList ({ - @required String host, - @required User user, - @required String hospitalId, - String serialNumber, - String number, + Future> getDevicesList({ + required String host, + required User user, + required String hospitalId, + String? serialNumber, + String? number, }) async { Response response; - try{ + try { response = await get( - Uri.parse("$host${URLs.getEquipment}?client=$hospitalId" - "${serialNumber?.isEmpty == false ? "&name=$serialNumber" :""}" - "${number?.isEmpty == false ? "&number=$number" : ""}" - ), + Uri.parse("$host${URLs.getEquipment}?client=$hospitalId" + "${serialNumber?.isEmpty == false ? "&name=$serialNumber" : ""}" + "${number?.isEmpty == false ? "&number=$number" : ""}"), ); - List page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + List page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); + page = categoriesListJson + .map((device) => Device.fromJson(device)) + .toList(); } return page; - } catch(error) { + } catch (error) { return []; } - } /// return -2 if request in progress @@ -110,33 +113,34 @@ class DevicesProvider extends ChangeNotifier{ /// 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> getDevicesListBySN ({ - @required String host, - @required User user, - @required String hospitalId, - @required String sn + Future> getDevicesListBySN({ + required String host, + required User user, + required String hospitalId, + required String sn, }) async { Response response; - try{ + try { response = await get( - Uri.parse(host + URLs.getEquipment+"?client=$hospitalId" - + ( sn == null || sn.isEmpty ? "" : "&serial_qr=$sn" )), + Uri.parse( + "$host${URLs.getEquipment}?client=$hospitalId${sn.isEmpty ? "" : "&serial_qr=$sn"}"), ); _stateCode = response.statusCode; - List _page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + List page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); + page = categoriesListJson + .map((device) => Device.fromJson(device)) + .toList(); } - return _page; - } catch(error) { + return page; + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return []; } - } -} \ No newline at end of file +} diff --git a/old_lib/controllers/providers/api/gas_refill_provider.dart b/old_lib/controllers/providers/api/gas_refill_provider.dart new file mode 100644 index 00000000..70a33bc4 --- /dev/null +++ b/old_lib/controllers/providers/api/gas_refill_provider.dart @@ -0,0 +1,165 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; + +import '../../../models/gas_refill/gas_refill_model.dart'; +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; + +class GasRefillProvider extends ChangeNotifier { + // number of items call in each request + final pageItemNumber = 50; + + //reset provider data + void reset() { + items = null; + nextPage = true; + stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int? stateCode; + + // true if there is next page in product list and false if not + bool nextPage = true; + + // list of user requests + List? items; + + // when requests in-process _loading = true + // done _loading = true + // failed _loading = false + bool? isLoading; + + /// 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 getRequests({ + required String host, + required User user, + }) async { + if (isLoading == true) { + return -2; + } + isLoading = true; + Response response; + try { + response = await get( + Uri.parse("$host${URLs.getGasRefill}?uid=${user.id}" + "&token=${user.token}&page=${(items?.length ?? 0) ~/ pageItemNumber}"), + headers: {"Content-Type": "application/json; charset=utf-8"}); + stateCode = response.statusCode; + if (stateCode != null && stateCode! >= 200 && stateCode! < 300) { + // client's request was successfully received + List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); + List itemsPage = requestsListJson + .map((request) => GasRefillModel.fromJson(request)) + .toList(); + items ??= []; + items?.addAll(itemsPage); + if (itemsPage.length == pageItemNumber) { + nextPage = true; + } else { + nextPage = false; + } + } + isLoading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + isLoading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } + + Future createModel({ + required String host, + required User user, + required GasRefillModel model, + }) async { + Map body = { + "uid": user.id.toString(), + "token": user.token ?? "", + "title": model.title ?? "", + "status": "0", //model.status.value.toString(), + }; + + body["details"] = jsonEncode(model.details + ?.map((model) => { + "type": model.type?.id.toString(), + "size": model.cylinderSize?.id.toString(), + "requsted_qty": model.requestedQuantity.toString(), + }) + .toList()); + + Response response; + try { + response = await post( + Uri.parse(host + URLs.requestGasRefill), + body: body, + ); + + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + final items = this.items; + if (items != null) { + items.insert( + 0, + GasRefillModel.fromJson( + json.decode(utf8.decode(response.bodyBytes))[0])); + notifyListeners(); + } + } + return response.statusCode; + } catch (error) { + return -1; + } + } + + Future updateModel({ + required String host, + required User user, + required GasRefillModel? oldModel, + required GasRefillModel newModel, + }) async { + Map body = { + "uid": user.id.toString(), + "token": user.token, + "title": newModel.title ?? "", + "status": newModel.status?.id.toString(), + }; + + body["details"] = jsonEncode(newModel.details + ?.map((model) => { + "type": model.type?.id.toString(), + "size": model.cylinderSize?.id.toString(), + "requsted_qty": model.requestedQuantity.toString(), + "deliverd_qty": model.deliveredQuantity.toString(), + }) + .toList()); + + Response response; + try { + response = await post( + Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), + body: body, + ); + + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + oldModel?.fromGasRefillModel(newModel); + notifyListeners(); + } + return response.statusCode; + } catch (error) { + return -1; + } + } +} diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/old_lib/controllers/providers/api/hospitals_provider.dart similarity index 51% rename from lib/controllers/providers/api/hospitals_provider.dart rename to old_lib/controllers/providers/api/hospitals_provider.dart index df70994f..54c687b4 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/old_lib/controllers/providers/api/hospitals_provider.dart @@ -3,17 +3,17 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/user.dart'; -class HospitalsProvider extends ChangeNotifier{ +import '../../../models/hospital.dart'; +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; +class HospitalsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { _hospitals = null; _stateCode = null; } @@ -21,24 +21,29 @@ class HospitalsProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // true if there is next page in product list and false if not bool _nextPage = true; + bool get nextPage => _nextPage; // contain user data // when user not login or register _user = null - List _hospitals; - List get hospitals => _hospitals; + List? _hospitals; + + List? get hospitals => _hospitals; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -48,77 +53,80 @@ class HospitalsProvider extends ChangeNotifier{ /// 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 getHospitals ({String host,User user,String title}) async { - if(_loading == true) + Future getHospitals({ + required String host, + required User user, + required String? title, + }) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse( - host + URLs.getHospitals - + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" - + ( title == null || title.isEmpty ? "" : "&name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + try { + response = await get( + Uri.parse( + "${host + URLs.getHospitals}?page=${(_hospitals?.length ?? 0) ~/ pageItemNumber}${title == null || title.isEmpty ? "" : "&name=$title"}", + ), + headers: {"Content-Type": "application/json; charset=utf-8"}, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - List _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); - if(hospitals == null) - _hospitals = []; + List page = categoriesListJson + .map((category) => Hospital.fromJson(category)) + .toList(); + if (hospitals == null) _hospitals = []; - _hospitals.addAll(_page); - if(_page.length >= pageItemNumber){ + _hospitals?.addAll(page); + if (page.length >= pageItemNumber) { _nextPage = true; - }else{ + } else { _nextPage = false; } } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - Future> getHospitalsList ({String host,User user,String title}) async { + Future> getHospitalsList({ + required String host, + required User user, + required String title, + }) async { Response response; - try{ - + try { response = await get( - Uri.parse(host + URLs.getHospitals - + ( title == null || title.isEmpty ? "" : "?name=$title" )), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Uri.parse( + host + URLs.getHospitals + (title.isEmpty ? "" : "?name=$title"), + ), + headers: {"Content-Type": "application/json; charset=utf-8"}, ); _stateCode = response.statusCode; - List _page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + List page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); + page = categoriesListJson + .map((category) => Hospital.fromJson(category)) + .toList(); } - return _page; - } catch(error) { + return page; + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return []; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/notifications_provider.dart b/old_lib/controllers/providers/api/notifications_provider.dart similarity index 52% rename from lib/controllers/providers/api/notifications_provider.dart rename to old_lib/controllers/providers/api/notifications_provider.dart index d21ec77b..15c8bf64 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/old_lib/controllers/providers/api/notifications_provider.dart @@ -2,17 +2,17 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/app_notification.dart'; -import 'package:test_sa/models/user.dart'; -class NotificationsProvider extends ChangeNotifier{ +import '../../../models/app_notification.dart'; +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; +class NotificationsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 20; //reset provider data - void reset(){ + void reset() { notifications = null; nextPage = true; stateCode = null; @@ -21,71 +21,66 @@ class NotificationsProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int stateCode; + int? stateCode; // true if there is next page in product list and false if not - bool nextPage = true; + bool? nextPage = true; // list of user requests - List notifications; + List? notifications; // when requests in-process _loading = true // done _loading = true // failed _loading = false - bool isLoading; - + bool? isLoading; /// 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 getNotifications ({ - @required String host, - @required User user, - @required String hospitalId, + Future getNotifications({ + required String host, + required User user, + required String hospitalId, }) async { - if(isLoading == true) + if (isLoading == true) { return -2; + } isLoading = true; notifyListeners(); Response response; - // userId = 397.toString(); // testing id to view data - try{ + // userId = 397.toString(); // testing id to view data + try { response = await get( - Uri.parse(host+URLs.getNotifications - +"?uid=${user.id}" - "&token=${user.token}" - "&page=${(notifications?.length ?? 0) ~/pageItemNumber}"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + Uri.parse( + "${host + URLs.getNotifications}?uid=${user.id}&token=${user.token}&page=${(notifications?.length ?? 0) ~/ pageItemNumber}", + ), + headers: {"Content-Type": "application/json; charset=utf-8"}); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); - List _serviceRequestsPage = requestsListJson.map( - (request) => AppNotification.fromJson(request)).toList(); - if(notifications == null) - notifications = []; - notifications.addAll(_serviceRequestsPage); - if(_serviceRequestsPage.length == pageItemNumber){ + List serviceRequestsPage = requestsListJson + .map((request) => AppNotification.fromJson(request)) + .toList(); + notifications ??= []; + notifications?.addAll(serviceRequestsPage); + if (serviceRequestsPage.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } } isLoading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } /// return -2 if request in progress @@ -93,35 +88,31 @@ class NotificationsProvider extends ChangeNotifier{ /// 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> getRecentNotifications ({ - @required String host, - @required User user, + Future?> getRecentNotifications({ + required String host, + required User user, }) async { Response response; //userId = 397.toString(); // testing id to view data - try{ + try { response = await get( - Uri.parse(host+URLs.getNotifications - +"?uid=${user.id}&token=${user.token}"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + Uri.parse( + "$host${URLs.getNotifications}?uid=${user.id}&token=${user.token}"), + headers: {"Content-Type": "application/json; charset=utf-8"}); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); - List _recentNotifications = requestsListJson.map( - (request) => AppNotification.fromJson(request)).toList(); - return _recentNotifications; + List recentNotifications = requestsListJson + .map((request) => AppNotification.fromJson(request)) + .toList(); + return recentNotifications; } return null; - - } catch(error) { + } catch (error) { return null; } - } -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/parts_provider.dart b/old_lib/controllers/providers/api/parts_provider.dart similarity index 55% rename from lib/controllers/providers/api/parts_provider.dart rename to old_lib/controllers/providers/api/parts_provider.dart index 6f763f77..a2d16fde 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/old_lib/controllers/providers/api/parts_provider.dart @@ -1,19 +1,19 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/part.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -class PartsProvider extends ChangeNotifier{ +import '../../../models/part.dart'; +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; +class PartsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { _parts = null; _stateCode = null; } @@ -21,24 +21,29 @@ class PartsProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // true if there is next page in product list and false if not bool _nextPage = true; + bool get nextPage => _nextPage; // contain user data // when user not login or register _user = null - List _parts; - List get parts => _parts; + List? _parts; + + List? get parts => _parts; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -48,48 +53,46 @@ class PartsProvider extends ChangeNotifier{ /// 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 getParts ({String host,User user,String title}) async { - if(_loading == true) - return -2; + Future getParts({ + required String host, + required User user, + required String? title, + }) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await get( - Uri.parse( - host + URLs.getPartNumber - + "?page=${(_parts?.length ?? 0) ~/pageItemNumber}" - + ( title == null || title.isEmpty ? "" : "&name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Uri.parse( + "$host${URLs.getPartNumber}?page=${(_parts?.length ?? 0) ~/ pageItemNumber}${title == null || title.isEmpty ? "" : "&name=$title"}", + ), + headers: {"Content-Type": "application/json; charset=utf-8"}, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - List _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); - if(parts == null) - _parts = []; + List page = + categoriesListJson.map((part) => Part.fromJson(part)).toList(); + if (parts == null) _parts = []; - _parts.addAll(_page); - if(_page.length >= pageItemNumber){ + _parts?.addAll(page); + if (page.length >= pageItemNumber) { _nextPage = true; - }else{ + } else { _nextPage = false; } } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } /// return -2 if request in progress @@ -97,30 +100,27 @@ class PartsProvider extends ChangeNotifier{ /// 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> getPartsList ({String host,User user,String title}) async { + Future> getPartsList({ + required String host, + required User user, + required String? title, + }) async { Response response; - try{ - + try { response = await get( - Uri.parse( - host + URLs.getPartNumber - + ( title == null || title.isEmpty ? "" : "?name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); - List _page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + Uri.parse(host + + URLs.getPartNumber + + (title == null || title.isEmpty ? "" : "?name=$title")), + headers: {"Content-Type": "application/json; charset=utf-8"}); + List page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); + page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); } - return _page; - } catch(error) { + return page; + } catch (error) { return []; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart b/old_lib/controllers/providers/api/preventive_maintenance_visits_provider.dart similarity index 56% rename from lib/controllers/providers/api/preventive_maintenance_visits_provider.dart rename to old_lib/controllers/providers/api/preventive_maintenance_visits_provider.dart index 14103fd6..a260bfc6 100644 --- a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart +++ b/old_lib/controllers/providers/api/preventive_maintenance_visits_provider.dart @@ -1,20 +1,20 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/user.dart'; -import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/models/visits/visits_group.dart'; -import 'package:test_sa/models/visits/visits_search.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; -class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ +import '../../../models/user.dart'; +import '../../../models/visits/visit.dart'; +import '../../../models/visits/visits_group.dart'; +import '../../../models/visits/visits_search.dart'; +import '../../api_routes/urls.dart'; +class PreventiveMaintenanceVisitsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { visits = null; nextPage = true; stateCode = null; @@ -23,67 +23,58 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int stateCode; + int? stateCode; // true if there is next page in product list and false if not - bool nextPage = true; + bool? nextPage = true; // list of user requests - List visits; + List? visits; // when requests in-process _loading = true // done _loading = true // failed _loading = false - bool isLoading; + bool? isLoading; - VisitsSearch visitsSearch = VisitsSearch(); + VisitsSearch? visitsSearch = VisitsSearch(); /// 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 getVisits ({ - @required String host, - @required User user, - // VisitsSearch visitsSearch, + Future getVisits({ + required String host, + required User user, + // VisitsSearch visitsSearch, }) async { - if(isLoading == true) - return -2; + if (isLoading == true) return -2; isLoading = true; Response response; //userId = 397.toString(); // testing id to view data - try{ + try { response = await get( - Uri.parse( - host + URLs.getPreventiveMaintenanceVisits - +"?uid=${user.id}" - "&token=${user.token}" - "&page=${(visits?.length ?? 0) ~/pageItemNumber}" - +visitsSearch?.toSearchString() ?? "" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Uri.parse( + "${host + URLs.getPreventiveMaintenanceVisits}?uid=${user.id}&token=${user.token}&page=${(visits?.length ?? 0) ~/ pageItemNumber}${visitsSearch?.toSearchString()}", + ), + headers: {"Content-Type": "application/json; charset=utf-8"}, ); - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); - List _visits = requestsListJson.map( - (request) => Visit.fromJson(request)).toList(); - if(visits == null) - visits = []; - visits.addAll(_visits); - if(_visits.length == pageItemNumber){ + List visits = + requestsListJson.map((request) => Visit.fromJson(request)).toList(); + visits.addAll(visits); + if (visits.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } } @@ -97,41 +88,39 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ /// 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 updateGroupOfVisits ({ - @required String host, - @required User user, - VisitsGroup group, + Future updateGroupOfVisits({ + required String host, + required User user, + required VisitsGroup group, }) async { Response response; - Map body = group.toJson(); - body["token"] = user.token ?? ""; - body["uid"] = user.id; + Map body = group.toJson(); + body["token"] = user.token??""; + body["uid"] = user.id??""; //userId = 397.toString(); // testing id to view data - try{ + try { response = await post( - Uri.parse( - host+URLs.updatePreventiveMaintenanceVisits - ), + Uri.parse(host + URLs.updatePreventiveMaintenanceVisits), body: body, ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - group.visits.forEach((visit) { + for (var visit in (group.visits??[])) { visit.status = group.status; visit.actualDate = group.date.toString().split(" ").first; - }); - group.visits.clear(); + } + group.visits?.clear(); notifyListeners(); } return response.statusCode; - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } } -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/old_lib/controllers/providers/api/regular_visits_provider.dart similarity index 51% rename from lib/controllers/providers/api/regular_visits_provider.dart rename to old_lib/controllers/providers/api/regular_visits_provider.dart index 03737f73..4f3de068 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/old_lib/controllers/providers/api/regular_visits_provider.dart @@ -1,21 +1,21 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/pantry/pentry.dart'; -import 'package:test_sa/models/user.dart'; -import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/models/visits/visits_group.dart'; -import 'package:test_sa/models/visits/visits_search.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; -class RegularVisitsProvider extends ChangeNotifier{ +import '../../../models/pantry/pentry.dart'; +import '../../../models/user.dart'; +import '../../../models/visits/visit.dart'; +import '../../../models/visits/visits_group.dart'; +import '../../../models/visits/visits_search.dart'; +import '../../api_routes/urls.dart'; +class RegularVisitsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { visits = null; nextPage = true; stateCode = null; @@ -24,78 +24,70 @@ class RegularVisitsProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int stateCode; + int? stateCode; // true if there is next page in product list and false if not bool nextPage = true; // list of user requests - List visits; + List? visits; // when requests in-process _loading = true // done _loading = true // failed _loading = false - bool isLoading; + bool? isLoading; - VisitsSearch visitsSearch = VisitsSearch(); + VisitsSearch? visitsSearch = VisitsSearch(); /// 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 getVisits ({ - @required String host, - @required User user, - // VisitsSearch visitsSearch, + Future getVisits({ + required String host, + required User user, + // VisitsSearch visitsSearch, }) async { - if(isLoading == true) + if (isLoading == true) { return -2; + } isLoading = true; Response response; //userId = 397.toString(); // testing id to view data - try{ + try { response = await get( - Uri.parse( - host+URLs.getRegularVisits - +"?uid=${user.id}" - "&token=${user.token}" - "&page=${(visits?.length ?? 0) ~/pageItemNumber}" - +visitsSearch?.toSearchString() ?? "" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Uri.parse( + "$host${URLs.getRegularVisits}?uid=${user.id}&token=${user.token}&page=${(visits?.length ?? 0) ~/ pageItemNumber}${visitsSearch?.toSearchString()}", + ), + headers: {"Content-Type": "application/json; charset=utf-8"}, ); - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - try{ - List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); - List _visits = requestsListJson.map( - (request) => Visit.fromJson(request) - ).toList(); - if(visits == null) - visits = []; - visits.addAll(_visits); - if(_visits.length == pageItemNumber){ + try { + List requestsListJson = + json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List visits = + requestsListJson.map((request) => Visit.fromJson(request)).toList(); + visits.addAll(visits); + if (visits.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } - }catch(error){ + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } isLoading = false; notifyListeners(); @@ -107,30 +99,30 @@ class RegularVisitsProvider extends ChangeNotifier{ /// 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 updateGroupOfVisits ({ - @required String host, - @required User user, - VisitsGroup group, + Future updateGroupOfVisits({ + required String host, + required User user, + required VisitsGroup group, }) async { Response response; - Map body = group.toJson(); + Map body = group.toJson(); body["token"] = user.token ?? ""; - body["uid"] = user.id; + body["uid"] = user.id??""; //userId = 397.toString(); // testing id to view data - try{ + try { response = await post( - Uri.parse(host+URLs.updateRegularVisits), - body: body, + Uri.parse(host + URLs.updateRegularVisits), + body: body, ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received reset(); notifyListeners(); } return response.statusCode; - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); @@ -138,46 +130,46 @@ class RegularVisitsProvider extends ChangeNotifier{ } } - Future getPently({String host,User user,String id}) async { + Future getPently({ + required String host, + required User user, + required String id, + }) async { Response response; response = await get( - Uri.parse("$host${URLs.getPentry}/$id"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Uri.parse("$host${URLs.getPentry}/$id"), + headers: {"Content-Type": "application/json; charset=utf-8"}, ); - Pentry pantry; - if(response.statusCode >= 200 && response.statusCode < 300) { + Pentry? pantry; + if (response.statusCode >= 200 && response.statusCode < 300) { pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes))); } return pantry; } - Future updatePentry ({ - @required String host, - @required User user, - @required Pentry pentry, - @required Visit visit, + Future updatePentry({ + required String host, + required User user, + required Pentry pentry, + required Visit visit, }) async { - try{ + try { Response response; - Map body = pentry.toMap(); - body["uid"] = user.id; - body["token"] = user.token; + Map body = pentry.toMap(); + body["uid"] = user.id??""; + body["token"] = user.token??""; response = await post( - Uri.parse(host+URLs.updatePentry + "/${visit.id}"), + Uri.parse("$host${URLs.updatePentry}/${visit.id}"), body: body, ); - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { visit.status = pentry.ppmVisitStatus; notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } -} \ No newline at end of file +} diff --git a/old_lib/controllers/providers/api/service_requests_provider.dart b/old_lib/controllers/providers/api/service_requests_provider.dart new file mode 100644 index 00000000..a62c08ce --- /dev/null +++ b/old_lib/controllers/providers/api/service_requests_provider.dart @@ -0,0 +1,378 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; + +import '../../../models/issue.dart'; +import '../../../models/lookup.dart'; +import '../../../models/service_report.dart'; +import '../../../models/service_request/service_request.dart'; +import '../../../models/service_request/service_request_search.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/timer_model.dart'; +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; +import '../../http_status_manger/http_status_manger.dart'; + +class ServiceRequestsProvider extends ChangeNotifier { + // number of items call in each request + final pageItemNumber = 50; + + //reset provider data + void reset() { + serviceRequests = null; + nextPage = true; + stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int? stateCode; + + // true if there is next page in product list and false if not + bool? nextPage = true; + + // list of user requests + List? serviceRequests; + + // when requests in-process _loading = true + // done _loading = true + // failed _loading = false + bool? isLoading; + + ServiceRequestSearch? search = ServiceRequestSearch(); + + /// 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 getRequests({ + required String host, + required User user, + required String? hospitalId, + }) async { + if (isLoading == true) { + return -2; + } + isLoading = true; + Response response; + try { + response = await get( + Uri.parse( + "$host${URLs.getServiceRequests}?uid=${user.id}${hospitalId == null ? "" : "&client_nid=$hospitalId"}&token=${user.token}&page=${(serviceRequests?.length ?? 0) ~/ pageItemNumber}${search?.toSearchString()}", + ), + headers: {"Content-Type": "application/json; charset=utf-8"}, + ); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List requestsListJson = + json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List _serviceRequestsPage = requestsListJson + .map((request) => ServiceRequest.fromJson(request)) + .toList(); + serviceRequests ??= []; + serviceRequests?.addAll(_serviceRequestsPage); + if (_serviceRequestsPage.length == pageItemNumber) { + nextPage = true; + } else { + nextPage = false; + } + } + isLoading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + isLoading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } + + Future getSingleServiceRequest({ + required String requestId, + required String host, + required User user, + required Subtitle subtitle, + }) async { + String userData = ''; + userData += "&uid=${user.id}"; + userData += "&token=${user.token}"; + + Response response; + try { + response = await get(Uri.parse( + '$host${URLs.getSingleServiceRequest}?call_nid=$requestId$userData', + )); + } catch (error) { + throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle) ?? ''); + } + + // If the call to the server was successful, parse the JSON. + if (response.statusCode >= 200 && response.statusCode < 300) { + // If the call to the server was successful, parse the JSON. + List jsonList = + json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List requests = + jsonList.map((i) => ServiceRequest.fromJson(i)).toList(); + return requests[0]; + } else { + throw (HttpStatusManger.getStatusMessage( + status: response.statusCode, subtitle: subtitle) ?? ""); + } + } + + Future createRequest({ + required String host, + required User user, + required ServiceRequest serviceRequest, + }) async { + var body = { + "uid": user.id, + "token": user.token ?? "", + "sn_id": serviceRequest.deviceId ?? "", + "date": (DateTime.now().millisecondsSinceEpoch).toString(), + "client": user.hospital?.id ?? '', + "complaint": serviceRequest.maintenanceIssue, + "image": json.encode(serviceRequest.devicePhotos), + "priority": (serviceRequest.priority?.id).toString(), + "defect_types": (serviceRequest.defectType?.id).toString(), + }; + body["audio"] = serviceRequest.audio; + Response response; + try { + response = await post( + Uri.parse(host + URLs.createRequest), + body: body, + ); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + final serviceRequests = this.serviceRequests; + if (serviceRequests != null) { + serviceRequests.insert( + 0, + ServiceRequest.fromJson( + json.decode(utf8.decode(response.bodyBytes))[0], + ), + ); + } + notifyListeners(); + } + return response.statusCode; + } catch (error) { + return -1; + } + } + + Future createIssueReport({ + required String host, + required User user, + required Issue issue, + }) async { + Response response; + Map body = issue.toMap(); + body["uid"] = user.id??""; + body["token"] = user.token??""; + try { + response = await post( + Uri.parse(host + URLs.createReport), + body: body, + ); + + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) {} + return response.statusCode; + } catch (error) { + return -1; + } + } + + Future updateDate({ + required String? host, + required User? user, + required String? newDate, + required Lookup? employee, + required ServiceRequest? request, + }) async { + Response response; + Map body = {}; + body["uid"] = user?.id ?? ''; + body["token"] = user?.token ?? ''; + body["nid"] = request?.id ?? ''; + body["date"] = newDate ?? ''; + body["ass_emp"] = employee?.id.toString() ?? ''; + try { + response = await post( + Uri.parse((host ?? '') + URLs.updateRequestDate), + body: body, + ); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + request?.engineerName = employee?.label; + notifyListeners(); + } + return response.statusCode; + } catch (error) { + return -1; + } + } + + Future createServiceReport({ + required String host, + required User user, + required ServiceReport report, + required ServiceRequest request, + }) async { + Response response; + Map body = report.toMap(); + body["uid"] = user.id??""; + body["token"] = user.token??""; + body["job_id"] = request.id ?? ''; + try { + response = await post( + Uri.parse(host + URLs.createServiceReport), + body: body, + ); + + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + reset(); + notifyListeners(); + } + return response.statusCode; + } catch (error) { + return -1; + } + } + + Future createDuplicatedReport({ + required String host, + required User user, + required ServiceRequest request, + }) async { + Response response; + String userData = ''; + userData += "&uid=${user.id}"; + userData += "&token=${user.token}"; + + try { + response = await get( + Uri.parse( + "$host${URLs.createDuplicatedReport}?nid=${request.id}$userData", + ), + ); + + stateCode = response.statusCode; + + if (response.statusCode >= 200 && response.statusCode < 300) { + reset(); + notifyListeners(); + } + return response.statusCode; + } catch (error) { + return -1; + } + } + + Future updateServiceReport({ + required String host, + required User user, + required ServiceReport report, + required ServiceRequest request, + }) async { + Response response; + Map body = report.toMap(); + body["uid"] = user.id??""; + body["token"] = user.token??""; + body["job_id"] = request.id ?? ''; + body["report_id"] = request.reportID ?? ''; + try { + response = await post( + Uri.parse(host + URLs.updateServiceReport), + body: body, + ); + stateCode = response.statusCode; + + if (response.statusCode >= 200 && response.statusCode < 300) { + reset(); + notifyListeners(); + } + return response.statusCode; + } catch (error) { + return -1; + } + } + + Future updateServiceReportTimer({ + required String host, + required User user, + required TimerModel timer, + required ServiceRequest request, + }) async { + Response response; + Map body = {}; + body["uid"] = user.id??""; + body["token"] = user.token??""; + body["job_id"] = request.id ?? ''; + body["start_time"] = ((timer.startAt?.millisecondsSinceEpoch ?? 0) / 1000) + .toStringAsFixed(0); + body["end_time"] = + ((timer.endAt?.millisecondsSinceEpoch ?? 0) / 1000).toStringAsFixed(0); + body["working_hours"] = + ((timer.durationInSecond ?? 0) / 60 / 60).toStringAsFixed(5); + body["report_id"] = request.reportID ?? ''; + try { + response = await post( + Uri.parse(host + URLs.updateServiceReport), + body: body, + ); + //stateCode = response.statusCode; + + if (response.statusCode >= 200 && response.statusCode < 300) { + // reset(); + // notifyListeners(); + } + return response.statusCode; + } catch (error) { + return -1; + } + } + + Future getSingleServiceReport({ + required String reportId, + required String host, + required User user, + required Subtitle subtitle, + }) async { + String userData = ''; + userData += "&uid=${user.id}"; + userData += "&token=${user.token}"; + + Response response; + try { + response = await get(Uri.parse( + '$host${URLs.getServiceReport}?report_id=$reportId$userData', + )); + } catch (error) { + throw (HttpStatusManger.getStatusMessage( + status: -1, subtitle: subtitle) ?? + ''); + } + + // If the call to the server was successful, parse the JSON. + if (response.statusCode >= 200 && response.statusCode < 300) { + // If the call to the server was successful, parse the JSON. + return ServiceReport.fromJson( + json.decode(utf8.decode(response.bodyBytes)), reportId); + } else { + throw (HttpStatusManger.getStatusMessage( + status: response.statusCode, + subtitle: subtitle, + ) ?? + ''); + } + } +} diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart b/old_lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart similarity index 63% rename from lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart index 03370135..f3ece855 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class PentryTaskStatusProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class EmployeesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -18,20 +18,24 @@ class PentryTaskStatusProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,35 +45,30 @@ class PentryTaskStatusProvider extends ChangeNotifier{ /// 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({required String? host, required User? user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await get( - Uri.parse( - host + URLs.getPentryTaskStatus), + Uri.parse((host ?? '') + URLs.getEmployees), ); - _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + 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(); + _items = + categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart b/old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart similarity index 63% rename from lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart index b4112034..76bc2096 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class GasCylinderSizesProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class GasCylinderSizesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _loading = null; _stateCode = null; @@ -19,20 +19,24 @@ class GasCylinderSizesProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,32 +46,35 @@ class GasCylinderSizesProvider extends ChangeNotifier{ /// 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 getData ({String host,User user,}) async { - if(_loading == true) + Future getData({ + required String? host, + required User? user, + }) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ + try { response = await get( - Uri.parse(host + URLs.getGasCylinderSize), + Uri.parse((host ?? '') + URLs.getGasCylinderSize), ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + _items = + categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart b/old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart similarity index 62% rename from lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart index 24b4e018..7884951a 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart @@ -1,16 +1,16 @@ 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 GasStatusProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class GasStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _loading = null; _stateCode = null; @@ -19,20 +19,24 @@ class GasStatusProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,31 +46,28 @@ class GasStatusProvider extends ChangeNotifier{ /// 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 getData ({String host,User user,}) async { - if(_loading == true) return -2; + Future getData({required String? host, required User? user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse(host + URLs.getGasStatus), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getGasStatus)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + _items = + categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart similarity index 62% rename from lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index f444c233..cd6bb132 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -1,16 +1,16 @@ 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 GasTypesProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class GasTypesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _loading = null; _stateCode = null; @@ -19,20 +19,24 @@ class GasTypesProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,31 +46,28 @@ class GasTypesProvider extends ChangeNotifier{ /// 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 getData ({String host,User user,}) async { - if(_loading == true) return -2; + Future getData({required String? host, required User? user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse(host + URLs.getGasTypes), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getGasTypes)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + _items = + categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart b/old_lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart similarity index 66% rename from lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart index 8e3168d9..afffadf3 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class PentryStatusProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class PentryStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -18,20 +18,24 @@ class PentryStatusProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,20 +45,18 @@ class PentryStatusProvider extends ChangeNotifier{ /// 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 getData ({String host,User user}) async { - if(_loading == true) + Future getData({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse( - host + URLs.getPentryStatus), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getPentryStatus)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + 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(); @@ -62,14 +64,11 @@ class PentryStatusProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart b/old_lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart similarity index 61% rename from lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart index 04f6d5b6..0d2d722b 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class EmployeesProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class PentryTaskStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -18,20 +18,24 @@ class EmployeesProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,34 +45,32 @@ class EmployeesProvider extends ChangeNotifier{ /// 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 getData ({String host,User user}) async { - if(_loading == true) + Future getData({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse( - host + URLs.getEmployees), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getPentryTaskStatus)); + _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + 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.fromJson(type)).toList(); + _items = categoriesListJson + .map((type) => Lookup.fromIntIdJson(type)) + .toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart b/old_lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart similarity index 65% rename from lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart index 09b52cbb..c2a94c04 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class PentryVisitStatusProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class PentryVisitStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -18,20 +18,24 @@ class PentryVisitStatusProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,20 +45,18 @@ class PentryVisitStatusProvider extends ChangeNotifier{ /// 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 getData ({String host,User user}) async { - if(_loading == true) + Future getData({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse( - host + URLs.getPentryVisitStatus), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getPentryVisitStatus)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + 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(); @@ -62,13 +64,11 @@ class PentryVisitStatusProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart b/old_lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart similarity index 65% rename from lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart index 58fc2d98..c014457f 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class ServiceRequestPriorityProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class ServiceRequestDefectTypesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -18,20 +18,24 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,20 +45,18 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ /// 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 getData ({String host,User user}) async { - if(_loading == true) + Future getData({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportPriority), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getServiceReportDefectTypes)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + 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(); @@ -62,13 +64,11 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/old_lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart similarity index 58% rename from lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index 50de291f..d7d456e5 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class ServiceReportLastCallsProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class ServiceReportLastCallsProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _calls = null; _loading = null; _stateCode = null; @@ -19,20 +19,24 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _calls; - List get calls => _calls; + List? _calls; + + List? get calls => _calls; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,35 +46,39 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ /// 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 getCalls ({String host,User user,String serviceStatus}) async { - if(_loading == true) - return -2; + Future getCalls({ + required String? host, + required User? user, + String? serviceStatus, + }) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await get( - Uri.parse( - host + URLs.getServiceReportLastCalls - +(serviceStatus == null ? "" : "?service_status=$serviceStatus") - ), + Uri.parse( + (host ?? '') + + URLs.getServiceReportLastCalls + + (serviceStatus == null ? "" : "?service_status=$serviceStatus"), + ), ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _calls = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + _calls = categoriesListJson + .map((type) => Lookup.fromIntIdJson(type)) + .toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart b/old_lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart similarity index 65% rename from lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart index 50efd414..cbb65669 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class ServiceRequestDefectTypesProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class ServiceRequestPriorityProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -18,20 +18,24 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List? _items; + + List? 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){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,20 +45,18 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ /// 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 getData ({String host,User user}) async { - if(_loading == true) + Future getData({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportDefectTypes), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getServiceReportPriority)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + 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(); @@ -62,14 +64,11 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart b/old_lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart similarity index 60% rename from lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart index bac49f9f..e7d24bc3 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class ServiceReportReasonsProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class ServiceReportReasonsProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _reasons = null; _stateCode = null; } @@ -18,20 +18,24 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _reasons; - List get reasons => _reasons; + List? _reasons; + + List? get reasons => _reasons; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,33 +45,31 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ /// 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 getTypes ({String host,User user}) async { - if(_loading == true) + Future getTypes({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportReasons), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getServiceReportReasons)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _reasons = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + _reasons = categoriesListJson + .map((type) => Lookup.fromIntIdJson(type)) + .toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart b/old_lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart similarity index 61% rename from lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart index 89cb100f..299dc9f3 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class ServiceReportStatusProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class ServiceReportStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _status = null; _stateCode = null; } @@ -18,20 +18,24 @@ class ServiceReportStatusProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _status; - List get statuses => _status; + List? _status; + + List? get statuses => _status; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,34 +45,31 @@ class ServiceReportStatusProvider extends ChangeNotifier{ /// 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 getTypes ({String host,User user}) async { - if(_loading == true) + Future getTypes({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportStatus), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getServiceReportStatus)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _status = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + _status = categoriesListJson + .map((type) => Lookup.fromIntIdJson(type)) + .toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart b/old_lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart similarity index 61% rename from lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart index a8b07c08..d4ad68e1 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class ServiceReportTypesProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class ServiceReportTypesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _types = null; _stateCode = null; } @@ -18,20 +18,24 @@ class ServiceReportTypesProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _types; - List get types => _types; + List? _types; + + List? get types => _types; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,34 +45,31 @@ class ServiceReportTypesProvider extends ChangeNotifier{ /// 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 getTypes ({String host,User user}) async { - if(_loading == true) + Future getTypes({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - - response = await get( - Uri.parse( - host + URLs.getServiceReportTypes), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getServiceReportTypes)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _types = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + _types = categoriesListJson + .map((type) => Lookup.fromIntIdJson(type)) + .toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart b/old_lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart similarity index 61% rename from lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart rename to old_lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart index a5bcb0a5..0a576571 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart +++ b/old_lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart @@ -3,14 +3,14 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; -class ServiceStatusProvider extends ChangeNotifier{ +import '../../../../../models/lookup.dart'; +import '../../../../../models/user.dart'; +import '../../../../api_routes/urls.dart'; +class ServiceStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _statuses = null; _stateCode = null; } @@ -18,20 +18,24 @@ class ServiceStatusProvider extends ChangeNotifier{ // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int _stateCode; - int get stateCode => _stateCode; + int? _stateCode; + + int? get stateCode => _stateCode; // contain user data // when user not login or register _user = null - List _statuses; - List get statuses => _statuses; + List? _statuses; + + List? get statuses => _statuses; // when categories in-process _loading = true // done _loading = true // failed _loading = false - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading){ + bool? _loading; + + bool? get isLoading => _loading; + + set isLoading(bool? isLoading) { _loading = isLoading; notifyListeners(); } @@ -41,35 +45,30 @@ class ServiceStatusProvider extends ChangeNotifier{ /// 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 getTypes ({String host,User user}) async { - if(_loading == true) + Future getTypes({required String? host, required User? user}) async { + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - - response = await get( - Uri.parse( - host + URLs.getServiceTypes), - ); + try { + response = await get(Uri.parse((host ?? '') + URLs.getServiceTypes)); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _statuses = categoriesListJson.map((e) => Lookup.fromIntIdJson(e)).toList(); - + _statuses = + categoriesListJson.map((e) => Lookup.fromIntIdJson(e)).toList(); } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/user_provider.dart b/old_lib/controllers/providers/api/user_provider.dart similarity index 67% rename from lib/controllers/providers/api/user_provider.dart rename to old_lib/controllers/providers/api/user_provider.dart index 843746c9..5265114e 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/old_lib/controllers/providers/api/user_provider.dart @@ -1,32 +1,35 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -class UserProvider extends ChangeNotifier{ +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; +class UserProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _user = null; _loading = false; } // contain user data // when user not login or register _user = null - User _user; - User get user => _user; - set user(User user) { + User? _user; + + User? get user => _user; + + set user(User? user) { _user = user; notifyListeners(); } - // when login or register in-process _login = true // when login or register is done or not start = false bool _loading = false; + bool get isLoading => _loading; + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); @@ -38,32 +41,31 @@ class UserProvider extends ChangeNotifier{ /// 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 login ({ - @required String host, - @required User user, + Future login({ + required String host, + required User user, }) async { - if(_loading == true) + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ + try { response = await post( - Uri.parse( - host+URLs.login), + Uri.parse(host + URLs.login), body: await user.toLoginJson(), ); _loading = false; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); - return response.statusCode; } notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; notifyListeners(); return -1; @@ -76,32 +78,30 @@ class UserProvider extends ChangeNotifier{ /// return state code if request complete may be 200, 404 or 403 /// for more details about state codes check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future register ({ - @required String host, - @required User user, + Future register({ + required String host, + required User user, }) async { - if(_loading == true) + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - try{ - response = await post( - Uri.parse( - host+URLs.register), - body: await user.toRegisterJson() - ); - } catch(error) { + try { + response = await post(Uri.parse(host + URLs.register), + body: await user.toRegisterJson()); + } catch (error) { _loading = false; notifyListeners(); return -1; } _loading = false; notifyListeners(); - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); - _user.hospital = user.hospital; + _user?.hospital = user.hospital; notifyListeners(); return response.statusCode; } @@ -114,32 +114,33 @@ class UserProvider extends ChangeNotifier{ /// return state code if request complete may be 200, 404 or 403 /// for more details about state codes check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future updateProfile ({ - @required String host, - @required User user, + Future updateProfile({ + required String host, + required User user, }) async { - if(_loading == true) + if (_loading == true) { return -2; + } _loading = true; notifyListeners(); Response response; - Map jsonObject ={}; + Map jsonObject = {}; jsonObject["uid"] = user.id; jsonObject["token"] = user.token; - if(user.department.id != _user.department.id) - jsonObject["department"] = user.department.id; - if(user.whatsApp != _user.whatsApp) + if (user.department?.id != _user?.department?.id) { + jsonObject["department"] = user.department?.id; + } + if (user.whatsApp != _user?.whatsApp) { jsonObject["whatsapp"] = user.whatsApp; - if(user.phoneNumber != _user.phoneNumber) + } + if (user.phoneNumber != _user?.phoneNumber) { jsonObject["phone"] = user.phoneNumber; - try{ - response = await post( - Uri.parse( - host+URLs.updateProfile), - body: jsonObject - ); - } catch(error) { + } + try { + response = + await post(Uri.parse(host + URLs.updateProfile), body: jsonObject); + } catch (error) { _loading = false; notifyListeners(); return -1; @@ -148,15 +149,14 @@ class UserProvider extends ChangeNotifier{ _loading = false; notifyListeners(); - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); - _user.hospital = user.hospital; - _user.department = user.department; + _user?.hospital = user.hospital; + _user?.department = user.department; notifyListeners(); return response.statusCode; } return response.statusCode; } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/settings/app_settings.dart b/old_lib/controllers/providers/settings/app_settings.dart similarity index 100% rename from lib/controllers/providers/settings/app_settings.dart rename to old_lib/controllers/providers/settings/app_settings.dart diff --git a/lib/controllers/providers/settings/setting_provider.dart b/old_lib/controllers/providers/settings/setting_provider.dart similarity index 70% rename from lib/controllers/providers/settings/setting_provider.dart rename to old_lib/controllers/providers/settings/setting_provider.dart index 118b24c1..13d90030 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/old_lib/controllers/providers/settings/setting_provider.dart @@ -1,15 +1,14 @@ import 'dart:async'; import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../settings/app_settings.dart'; +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; +import 'app_settings.dart'; -class SettingProvider extends ChangeNotifier{ - +class SettingProvider extends ChangeNotifier { resetSettings() async { SharedPreferences prefs = await SharedPreferences.getInstance(); user = null; @@ -21,7 +20,7 @@ class SettingProvider extends ChangeNotifier{ bool isLoaded = false; // contain saved user data - User user; + User? user; Future setUser(User user) async { SharedPreferences prefs = await SharedPreferences.getInstance(); @@ -30,8 +29,10 @@ class SettingProvider extends ChangeNotifier{ notifyListeners(); } - String _host; - String get host => _host; + String? _host; + + String? get host => _host; + Future setHost(String host) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(ASettings.host, host); @@ -39,8 +40,10 @@ class SettingProvider extends ChangeNotifier{ notifyListeners(); } - String _language; - String get language => _language; + String? _language; + + String? get language => _language; + Future setLanguage(String currentLanguage) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(ASettings.language, currentLanguage); @@ -48,8 +51,10 @@ class SettingProvider extends ChangeNotifier{ notifyListeners(); } - String _speechToText; - String get speechToText => _speechToText; + String? _speechToText; + + String? get speechToText => _speechToText; + Future setSpeechToText(String currentLanguage) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(ASettings.speechToText, currentLanguage); @@ -58,40 +63,38 @@ class SettingProvider extends ChangeNotifier{ } // call loadSharedPreferences when provider initialise - SettingProvider(){ + SettingProvider() { loadSharedPreferences(); } // get app setting Future loadSharedPreferences() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - if(prefs.containsKey(ASettings.language)){ + if (prefs.containsKey(ASettings.language)) { _language = prefs.getString(ASettings.language); - }else{ - _language = 'en'; + } else { + _language = 'en'; } - if(prefs.containsKey(ASettings.speechToText)){ + if (prefs.containsKey(ASettings.speechToText)) { _speechToText = prefs.getString(ASettings.speechToText); - }else{ - _speechToText = 'ar'; + } else { + _speechToText = 'ar'; } - if(prefs.containsKey(ASettings.user)){ - String userJson = prefs.getString(ASettings.user); - user = User.fromJson(json.decode(userJson)); + if (prefs.containsKey(ASettings.user)) { + String? userJson = prefs.getString(ASettings.user); + user = User.fromJson(json.decode(userJson ?? '')); } - if(prefs.containsKey(ASettings.host)){ + if (prefs.containsKey(ASettings.host)) { _host = prefs.getString(ASettings.host); - } else{ + } else { _host = URLs.host1; } isLoaded = true; notifyListeners(); } - -} \ No newline at end of file +} diff --git a/lib/controllers/validator/validator.dart b/old_lib/controllers/validator/validator.dart similarity index 100% rename from lib/controllers/validator/validator.dart rename to old_lib/controllers/validator/validator.dart diff --git a/lib/extensions/int_extensions.dart b/old_lib/extensions/int_extensions.dart similarity index 57% rename from lib/extensions/int_extensions.dart rename to old_lib/extensions/int_extensions.dart index 5f1e672e..b913a064 100644 --- a/lib/extensions/int_extensions.dart +++ b/old_lib/extensions/int_extensions.dart @@ -1,13 +1,14 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/colors.dart'; + +import '../views/app_style/colors.dart'; extension IntExtensions on int { Widget get height => SizedBox(height: toDouble()); Widget get width => SizedBox(width: toDouble()); - Widget get divider => Divider(height: toDouble(), thickness: toDouble(), color: AColors.greyEF); + Widget get divider => + Divider(height: toDouble(), thickness: toDouble(), color: AColors.greyEF); Widget get makeItSquare => SizedBox(width: toDouble(), height: toDouble()); } diff --git a/lib/extensions/string_extensions.dart b/old_lib/extensions/string_extensions.dart similarity index 100% rename from lib/extensions/string_extensions.dart rename to old_lib/extensions/string_extensions.dart diff --git a/lib/extensions/widget_extensions.dart b/old_lib/extensions/widget_extensions.dart similarity index 100% rename from lib/extensions/widget_extensions.dart rename to old_lib/extensions/widget_extensions.dart diff --git a/lib/models/app_notification.dart b/old_lib/models/app_notification.dart similarity index 73% rename from lib/models/app_notification.dart rename to old_lib/models/app_notification.dart index d199a07e..528b412a 100644 --- a/lib/models/app_notification.dart +++ b/old_lib/models/app_notification.dart @@ -1,11 +1,12 @@ -import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart'; + +import '../views/pages/user/requests/future_request_service_details.dart'; class AppNotification{ - String requestId; - String title; - String description; - String date; - String path; + String? requestId; + String? title; + String? description; + String? date; + String? path; AppNotification({ this.requestId, diff --git a/lib/models/department.dart b/old_lib/models/department.dart similarity index 79% rename from lib/models/department.dart rename to old_lib/models/department.dart index 27df7b06..6cb481bb 100644 --- a/lib/models/department.dart +++ b/old_lib/models/department.dart @@ -1,6 +1,6 @@ class Department{ - String id; - String name; + String? id; + String? name; Department({ this.id, @@ -13,7 +13,7 @@ class Department{ name: parsedJson["dept_name"] ?? parsedJson["value"], ); } - factory Department.fromDepartment(Department department){ + factory Department.fromDepartment(Department? department){ return Department( id: department?.id, name: department?.name, diff --git a/lib/models/device/device.dart b/old_lib/models/device/device.dart similarity index 72% rename from lib/models/device/device.dart rename to old_lib/models/device/device.dart index b84b8715..b5d1f486 100644 --- a/lib/models/device/device.dart +++ b/old_lib/models/device/device.dart @@ -1,15 +1,15 @@ -class Device{ - String id; - String serialNumber; - String number; - String brand; - String model; - DateTime productionDate; - DateTime supplyDate; - DateTime installDate; - DateTime receivingDate; - DateTime operationDate; - DateTime warrantyDate; +class Device { + String? id; + String? serialNumber; + String? number; + String? brand; + String? model; + DateTime? productionDate; + DateTime? supplyDate; + DateTime? installDate; + DateTime? receivingDate; + DateTime? operationDate; + DateTime? warrantyDate; Device({ this.id, @@ -25,7 +25,7 @@ class Device{ this.warrantyDate, }); - factory Device.fromJson(Map parsedJson){ + factory Device.fromJson(Map parsedJson) { return Device( id: parsedJson["nid"] ?? parsedJson["id"], serialNumber: parsedJson["sn"] ?? parsedJson["value"], @@ -41,7 +41,7 @@ class Device{ ); } - factory Device.fromDevice(Device device){ + factory Device.fromDevice(Device device) { return Device( id: device.id, serialNumber: device.serialNumber, @@ -58,9 +58,9 @@ class Device{ } } -DateTime getDateFromString(String unixDate){ - if(unixDate == null) +DateTime? getDateFromString(String? unixDate) { + if (unixDate == null) { return null; - return DateTime.fromMillisecondsSinceEpoch( - int.parse(unixDate)); -} \ No newline at end of file + } + return DateTime.fromMillisecondsSinceEpoch(int.parse(unixDate)); +} diff --git a/old_lib/models/device/device_transfer.dart b/old_lib/models/device/device_transfer.dart new file mode 100644 index 00000000..bb6d6d21 --- /dev/null +++ b/old_lib/models/device/device_transfer.dart @@ -0,0 +1,53 @@ +import 'device.dart'; +import 'device_transfer_info.dart'; + +class DeviceTransfer { + String? id; + String? userId; + String? title; + Device? device; + DeviceTransferInfo? sender; + DeviceTransferInfo? receiver; + + DeviceTransfer({ + this.id, + this.device, + this.title, + this.userId, + this.sender, + this.receiver, + }); + + bool validate() { + if (device == null) return false; + return receiver?.validate() ?? false; + } + + fromDeviceTransfer(DeviceTransfer old) { + id = old.id; + title = old.title; + userId = old.userId; + device = old.device != null ? Device.fromDevice(old.device!) : null; + final sender = DeviceTransferInfo(); + if (old.sender != null) { + sender.fromDetails(old.sender!); + } + this.sender = sender; + final receiver = DeviceTransferInfo(); + if (old.receiver != null) { + receiver.fromDetails(old.receiver!); + } + this.receiver = receiver; + } + + factory DeviceTransfer.fromJson(Map parsedJson) { + return DeviceTransfer( + id: parsedJson["id"], + title: parsedJson["title"], + userId: parsedJson["uid"], + device: Device.fromJson(parsedJson["eq_sn"]), + sender: DeviceTransferInfo.fromJson(parsedJson, "sender_"), + receiver: DeviceTransferInfo.fromJson(parsedJson, "receiver_"), + ); + } +} diff --git a/old_lib/models/device/device_transfer_info.dart b/old_lib/models/device/device_transfer_info.dart new file mode 100644 index 00000000..3a39a0c2 --- /dev/null +++ b/old_lib/models/device/device_transfer_info.dart @@ -0,0 +1,78 @@ +import '../department.dart'; +import '../hospital.dart'; +import '../lookup.dart'; + +class DeviceTransferInfo { + String? userId; + String? comment; + Hospital? client; + Department? department; + String? workingHours; + String? travelingHours; + String? name; + String? signature; + Lookup? status; + + DeviceTransferInfo({ + this.userId, + this.comment, + this.department, + this.client, + this.name, + this.travelingHours, + this.workingHours, + this.signature, + this.status, + }); + + Map toJson(bool isSender) { + Map body = {}; + final baseKey = isSender ? "sender_" : "receiver_"; + + if (comment?.isNotEmpty ?? false) body["${baseKey}comment"] = comment!; + if (workingHours?.isNotEmpty ?? false) { + body["${baseKey}working_hours"] = workingHours!; + } + if (travelingHours?.isNotEmpty ?? false) { + body["${baseKey}travel_hours"] = comment!; + } + final status = this.status; + if (status != null) body["${baseKey}status"] = status.id.toString(); + if (signature?.isNotEmpty ?? false) body["${baseKey}image"] = signature!; + return body; + } + + bool validate() { + if (client == null) return false; + if (department == null) return false; + return true; + } + + fromDetails(DeviceTransferInfo? old, {bool withSignature = true}) { + userId = old?.userId; + name = old?.name; + client = old?.client != null ? Hospital.fromHospital(old?.client) : null; + department = + department != null ? Department.fromDepartment(old?.department!) : null; + workingHours = old?.workingHours; + travelingHours = old?.travelingHours; + comment = old?.comment; + if (withSignature) signature = old?.signature; + status = old?.status; + } + + factory DeviceTransferInfo.fromJson( + Map parsedJson, String key) { + return DeviceTransferInfo( + workingHours: parsedJson["${key}working_hours"], + travelingHours: parsedJson["${key}travel_hours"], + name: parsedJson["${key}name"], + signature: parsedJson["${key}image"], + userId: parsedJson["${key}id"], + comment: parsedJson["${key}comment"], + client: Hospital.fromJson(parsedJson["${key}client"]), + department: Department.fromJson(parsedJson["${key}department"]), + status: Lookup.fromJson(parsedJson["${key}status"]), + ); + } +} diff --git a/lib/models/enums/user_types.dart b/old_lib/models/enums/user_types.dart similarity index 100% rename from lib/models/enums/user_types.dart rename to old_lib/models/enums/user_types.dart diff --git a/old_lib/models/gas_refill/gas_refill_details.dart b/old_lib/models/gas_refill/gas_refill_details.dart new file mode 100644 index 00000000..7148c9da --- /dev/null +++ b/old_lib/models/gas_refill/gas_refill_details.dart @@ -0,0 +1,46 @@ +import '../lookup.dart'; + +class GasRefillDetails { + Lookup? type; + Lookup? cylinderSize; + int? requestedQuantity; + int? deliveredQuantity; + + GasRefillDetails({ + this.type, + this.cylinderSize, + this.requestedQuantity, + this.deliveredQuantity, required model, + }); + + bool validate() { + //if(cylinderSize == null) return false; + if (type == null) return false; + if (requestedQuantity == null) return false; + return true; + } + + factory GasRefillDetails.fromJson(Map parsedJson) { + return GasRefillDetails( + type: Lookup.fromJson(parsedJson["type"]), + cylinderSize: Lookup.fromJson(parsedJson["size"]), + requestedQuantity: parsedJson["requsted_qty"] == null + ? 0 + : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0, + deliveredQuantity: parsedJson["deliverd_qty"] == null + ? 0 + : int.tryParse(parsedJson["deliverd_qty"].toString()) ?? 0, model: null, + ); + } + + factory GasRefillDetails.fromDetails(GasRefillDetails details) { + return GasRefillDetails( + type: details.type != null ? Lookup.fromStatus(details.type!) : null, + cylinderSize: details.cylinderSize != null + ? Lookup.fromStatus(details.cylinderSize!) + : null, + requestedQuantity: details.requestedQuantity, + deliveredQuantity: details.deliveredQuantity, model: null, + ); + } +} diff --git a/old_lib/models/gas_refill/gas_refill_model.dart b/old_lib/models/gas_refill/gas_refill_model.dart new file mode 100644 index 00000000..09a8f517 --- /dev/null +++ b/old_lib/models/gas_refill/gas_refill_model.dart @@ -0,0 +1,54 @@ +import '../lookup.dart'; +import 'gas_refill_details.dart'; + +class GasRefillModel { + String? id; + String? userId; + String? clientName; + String? title; + Lookup? status; + List? details; + + GasRefillModel({ + this.id, + this.userId, + this.clientName, + this.title, + this.status, + this.details, + }); + + bool validate() { + if (title == null) return false; + if (status == null) return false; + if (details == null && (details?.isEmpty ?? true)) return false; + return true; + } + + fromGasRefillModel(GasRefillModel model) { + id = model.id; + userId = model.userId; + clientName = model.clientName; + title = model.title; + status = model.status != null ? Lookup.fromStatus(model.status!) : null; + details = model.details + ?.map((e) => GasRefillDetails.fromDetails(e)) + .toList(); + } + + factory GasRefillModel.fromJson(Map parsedJson) { + List details = []; + if (parsedJson["details"] != null) { + List list = parsedJson["details"]; + details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); + } + return GasRefillModel( + id: parsedJson["id"], + userId: parsedJson["uid"], + title: parsedJson["title"], + clientName: parsedJson["client"], + status: Lookup.fromJson(parsedJson["status"]), + details: details, + ); + } +} diff --git a/lib/models/hospital.dart b/old_lib/models/hospital.dart similarity index 80% rename from lib/models/hospital.dart rename to old_lib/models/hospital.dart index 34e2e3a9..bf2d8712 100644 --- a/lib/models/hospital.dart +++ b/old_lib/models/hospital.dart @@ -1,6 +1,6 @@ class Hospital{ - String id; - String name; + String? id; + String? name; Hospital({ this.id, @@ -14,7 +14,7 @@ class Hospital{ ); } - factory Hospital.fromHospital(Hospital hospital){ + factory Hospital.fromHospital(Hospital? hospital){ return Hospital( id: hospital?.id, name: hospital?.name, diff --git a/lib/models/issue.dart b/old_lib/models/issue.dart similarity index 55% rename from lib/models/issue.dart rename to old_lib/models/issue.dart index cc186eb6..bca0e70f 100644 --- a/lib/models/issue.dart +++ b/old_lib/models/issue.dart @@ -1,10 +1,10 @@ class Issue{ - String title; - String userId; - List reports; - String serviceRequestId; - String description; - bool isSelected; + String? title; + String? userId; + List? reports; + String? serviceRequestId; + String? description; + bool? isSelected; Issue({ this.description, @@ -17,11 +17,11 @@ class Issue{ Map toMap(){ Map map ={}; - if(title != null) map["title"] = title; + if(title != null) map["title"] = title??""; if(reports != null) map["issue_report"] = reports.toString(); - if(userId != null) map["uid"] = userId; - if(description != null) map["desc"] = description; - if(serviceRequestId != null) map["call_id"] = serviceRequestId; + if(userId != null) map["uid"] = userId??""; + if(description != null) map["desc"] = description??""; + if(serviceRequestId != null) map["call_id"] = serviceRequestId??""; return map; } } \ No newline at end of file diff --git a/lib/models/lookup.dart b/old_lib/models/lookup.dart similarity index 86% rename from lib/models/lookup.dart rename to old_lib/models/lookup.dart index 93e1f9ec..0ddf72f4 100644 --- a/lib/models/lookup.dart +++ b/old_lib/models/lookup.dart @@ -1,8 +1,8 @@ class Lookup{ - final String label; - final String key; - final int id; + final String? label; + final String? key; + final int? id; const Lookup({ this.label, @@ -29,7 +29,6 @@ class Lookup{ } factory Lookup.fromJson(Map parsedJson){ - if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; return Lookup( label: parsedJson["value"], id: parsedJson["id"] is int diff --git a/old_lib/models/pantry/calibration_tools.dart b/old_lib/models/pantry/calibration_tools.dart new file mode 100644 index 00000000..5a258c6e --- /dev/null +++ b/old_lib/models/pantry/calibration_tools.dart @@ -0,0 +1,31 @@ +import '../lookup.dart'; + +class CalibrationTool { + Lookup? assetsNumber; + DateTime? dataOfTesting; + + CalibrationTool({ + this.assetsNumber, + this.dataOfTesting, + }); + + Map toMap() { + return { + if (assetsNumber != null) 'assetsSN': (assetsNumber?.id).toString(), + if (dataOfTesting != null) + 'dataOfTesting': + ((dataOfTesting?.millisecondsSinceEpoch ?? 0) ~/ 1000).toString(), + }; + } + + factory CalibrationTool.fromMap(Map map) { + return CalibrationTool( + assetsNumber: Lookup.fromJson(map['assetsSN']), + dataOfTesting: map['dataOfTesting'] == null || map['dataOfTesting'] == "" + ? null + : DateTime.fromMillisecondsSinceEpoch( + (int.tryParse(map['dataOfTesting']) ?? 0) * 1000, + ), + ); + } +} diff --git a/old_lib/models/pantry/contact.dart b/old_lib/models/pantry/contact.dart new file mode 100644 index 00000000..bda3e4a7 --- /dev/null +++ b/old_lib/models/pantry/contact.dart @@ -0,0 +1,40 @@ +import '../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 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 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, + ); + } +} diff --git a/lib/models/pantry/lookups/contact_person.dart b/old_lib/models/pantry/lookups/contact_person.dart similarity index 76% rename from lib/models/pantry/lookups/contact_person.dart rename to old_lib/models/pantry/lookups/contact_person.dart index 5231712c..f89c17cf 100644 --- a/lib/models/pantry/lookups/contact_person.dart +++ b/old_lib/models/pantry/lookups/contact_person.dart @@ -1,9 +1,10 @@ -import 'package:test_sa/models/lookup.dart'; + +import '../../lookup.dart'; class ContactTitle extends Lookup { ContactTitle({ - int id, - String label + required int id, + required String label }):super(id: id,label: label); factory ContactTitle.fromMap(Map parsedJson){ diff --git a/old_lib/models/pantry/lookups/contact_title.dart b/old_lib/models/pantry/lookups/contact_title.dart new file mode 100644 index 00000000..f4edb581 --- /dev/null +++ b/old_lib/models/pantry/lookups/contact_title.dart @@ -0,0 +1,13 @@ +import '../../lookup.dart'; + +class ContactTitle extends Lookup { + ContactTitle({required int id, required String label}) + : super(id: id, label: label); + + factory ContactTitle.fromMap(Map parsedJson) { + return ContactTitle( + label: parsedJson["value"], + id: parsedJson["id"], + ); + } +} diff --git a/old_lib/models/pantry/pentry.dart b/old_lib/models/pantry/pentry.dart new file mode 100644 index 00000000..a90dd9b5 --- /dev/null +++ b/old_lib/models/pantry/pentry.dart @@ -0,0 +1,128 @@ +import 'dart:convert'; +import 'dart:io'; + +import '../lookup.dart'; +import '../timer_model.dart'; +import 'calibration_tools.dart'; +import 'pm_kit.dart'; +import 'ppm_check_list.dart'; + +class Pentry { + Lookup? ppmVisitStatus; + Lookup? status; + TimerModel? timer; + DateTime? actualVisitDate; + String? travelingHours; + String? image; + File? imageFile; + List? ppmCheckLists; + List? calibrationTools; + List? 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 toMap() { + Map map = {}; + if (ppmVisitStatus != null) + 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 ?? 0) / 1000) + .toStringAsFixed(0); + if (timer != null) { + map["start_date"] = + ((timer!.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0); + map["end_date"] = + (((timer!.endAt)?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0); + map["working_hours"] = + ((timer!.durationInSecond??0) / 60 / 60).toStringAsFixed(5); + } + // if(contacts?.isNotEmpty == true) { + // for(int i = 0;i 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 map) { + // List contacts = []; + // if(map['contacts'] != null){ + // contacts =(map['contacts'] as List) + // .map((e) => Contact.fromMap(e as Map)) + // .toList(); + // } + + List pmKits = []; + if (map['pmKits'] != null) { + pmKits = (map['pmKits'] as List) + .map((e) => PMKit.fromMap(e as Map)) + .toList(); + } + + List ppmCheckLists = []; + if (map['ppmCheckLists'] != null) { + ppmCheckLists = (map['ppmCheckLists'] as List) + .map((e) => PPMCheckList.fromMap(e as Map)) + .toList(); + } + + List calibrationTools = []; + if (map['calibrationTools'] != null) { + calibrationTools = (map['calibrationTools'] as List) + .map((e) => CalibrationTool.fromMap(e as Map)) + .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.isEmpty + ? null + : DateTime.fromMillisecondsSinceEpoch((int.tryParse(date) ?? 0) * 1000); + } +} diff --git a/lib/models/pantry/pm_kit.dart b/old_lib/models/pantry/pm_kit.dart similarity index 73% rename from lib/models/pantry/pm_kit.dart rename to old_lib/models/pantry/pm_kit.dart index 0a008e5f..09c9b78e 100644 --- a/lib/models/pantry/pm_kit.dart +++ b/old_lib/models/pantry/pm_kit.dart @@ -1,13 +1,14 @@ -import 'package:test_sa/models/lookup.dart'; + +import '../lookup.dart'; class PMKit{ - Lookup itemCode; - String itemName; - String preparationTimeFrame; - String kitFrequencyDemand; - String availability; - String quantityNeeded; - String quantityReserved; + Lookup? itemCode; + String? itemName; + String? preparationTimeFrame; + String? kitFrequencyDemand; + String? availability; + String? quantityNeeded; + String? quantityReserved; PMKit({ this.itemCode, @@ -22,12 +23,12 @@ class PMKit{ Map 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, + 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!, }; } diff --git a/lib/models/pantry/ppm_check_list.dart b/old_lib/models/pantry/ppm_check_list.dart similarity index 57% rename from lib/models/pantry/ppm_check_list.dart rename to old_lib/models/pantry/ppm_check_list.dart index 8f1a14d7..444a1086 100644 --- a/lib/models/pantry/ppm_check_list.dart +++ b/old_lib/models/pantry/ppm_check_list.dart @@ -1,10 +1,11 @@ -import 'package:test_sa/models/lookup.dart'; + +import '../lookup.dart'; class PPMCheckList{ - Lookup status; - String title; - String comment; - String measuredValue; + Lookup? status; + String? title; + String? comment; + String? measuredValue; PPMCheckList({ this.title, @@ -15,10 +16,10 @@ class PPMCheckList{ Map toMap() { return { - if(status != null) 'status': status?.id.toString(), - if(title != null) 'title': title, - if(comment != null) 'comment': comment, - if(measuredValue != null) 'measuredValue': measuredValue, + if(status != null) 'status': status!.id.toString(), + if(title != null) 'title': title!, + if(comment != null) 'comment': comment!, + if(measuredValue != null) 'measuredValue': measuredValue!, }; } diff --git a/lib/models/part.dart b/old_lib/models/part.dart similarity index 90% rename from lib/models/part.dart rename to old_lib/models/part.dart index d75bb493..d70baf72 100644 --- a/lib/models/part.dart +++ b/old_lib/models/part.dart @@ -1,7 +1,7 @@ class Part{ - String id; - String code; - String name; + String? id; + String? code; + String? name; int quantity; Part({ diff --git a/lib/models/service_report.dart b/old_lib/models/service_report.dart similarity index 54% rename from lib/models/service_report.dart rename to old_lib/models/service_report.dart index 81047ec1..b9f2b464 100644 --- a/lib/models/service_report.dart +++ b/old_lib/models/service_report.dart @@ -1,32 +1,31 @@ import 'dart:convert'; -import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/part.dart'; -import 'package:test_sa/models/timer_model.dart'; +import 'device/device.dart'; +import 'lookup.dart'; +import 'part.dart'; +import 'timer_model.dart'; class ServiceReport { - String id; - String operatingHours; - DateTime visitDate; - DateTime endDate; - Lookup serviceType; - Lookup callLastSituation; - Lookup status; - Lookup type; - Lookup reason; - String faultDescription; - String workPreformed; - //String workHours; - String travelingHours; - String invoiceNumber; - String invoiceCode; - List parts; - String image; - Device device; - String quantity; - String jobSheetNumber; - TimerModel timer; + String? id; + String? operatingHours; + DateTime? visitDate; + DateTime? endDate; + Lookup? serviceType; + Lookup? callLastSituation; + Lookup? status; + Lookup? type; + Lookup? reason; + String? faultDescription; + String? workPreformed; + String? travelingHours; + String? invoiceNumber; + String? invoiceCode; + List? parts; + String? image; + Device? device; + String? quantity; + String? jobSheetNumber; + TimerModel? timer; ServiceReport({ this.id, @@ -36,7 +35,6 @@ class ServiceReport { this.status, this.type, this.faultDescription, - //this.workHours, this.travelingHours, this.parts, this.workPreformed, @@ -54,38 +52,39 @@ class ServiceReport { Map toMap(){ Map _map = {}; - if(id != null) _map["id"] = id; - if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString(); - if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if(status != null) _map["status"] = status.id.toString(); - if(type != null) _map["service_report_type"] = type.id.toString(); - if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription; + if(id != null) _map["id"] = id??""; + if(visitDate != null) _map["visit_date"] = ((visitDate?.millisecondsSinceEpoch??0) ~/ 1000).toString(); + if(serviceType != null) _map["service_type"] = serviceType?.id.toString()??""; + if(status != null) _map["status"] = status?.id.toString()??""; + if(type != null) _map["service_report_type"] = type?.id.toString()??""; + if(faultDescription != null && (faultDescription?.isNotEmpty??false)) _map["fault_description"] = faultDescription??""; //if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours; if(timer != null){ - _map["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); - _map["end_time"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); - _map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + _map["start_time"] = ((timer?.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0); + _map["end_time"] = ((timer?.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); + _map["working_hours"] = ((timer?.durationInSecond??0) / 60 / 60).toStringAsFixed(5); } - if(travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; - if(workPreformed != null && workPreformed.isNotEmpty) _map["work_performed"] = workPreformed; - if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; - if(parts != null && parts.isNotEmpty){ + if(travelingHours != null && (travelingHours?.isNotEmpty??false)) _map["traveling_hours"] = travelingHours??""; + if(workPreformed != null && (workPreformed?.isNotEmpty??false)) _map["work_performed"] = workPreformed??""; + if(jobSheetNumber != null && (jobSheetNumber?.isNotEmpty??false)) _map["job_sheet_no"] = jobSheetNumber??""; + if(parts != null && (parts?.isNotEmpty??false)){ Map _partsMap = {}; - parts.forEach((part) { - if(part.id.isNotEmpty) - _partsMap[part.id] = part.quantity; + parts?.forEach((part) { + if((part.id?.isNotEmpty??false)) { + _partsMap[part?.id??""] = part.quantity; + } }); _map["parts"] = json.encode(_partsMap); } - if(device?.id != null && device.id != null) _map["eq_id"] = device.id; - if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; - if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); - if(reason != null) _map["reasons"] = reason.id.toString(); - if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; - if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation.id.toString(); - if(image != null) _map["image"] = image; - if(invoiceCode != null) _map["invoice_no"] = invoiceCode; - if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; + if(device?.id != null && device?.id != null) _map["eq_id"] = device?.id??""; + if(quantity != null && (quantity?.isNotEmpty??false)) _map["qty"] = quantity??""; + if(endDate != null) _map["end_date"] = ((endDate?.millisecondsSinceEpoch??0) ~/ 1000).toString(); + if(reason != null) _map["reasons"] = reason?.id.toString()??""; + if(operatingHours != null && (operatingHours?.isNotEmpty??false)) _map["operation_hours"] = operatingHours??""; + if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation?.id.toString()??""; + if(image != null) _map["image"] = image??""; + if(invoiceCode != null) _map["invoice_no"] = invoiceCode??""; + if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber??""; return _map; } @@ -102,7 +101,7 @@ class ServiceReport { if(parts == null) return false; //if(endDate == null) return false; //if(reason == null) return false; - if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false; + if((device?.id == null ||(device?.id?.isEmpty??false)) && type?.id != 1) return false; //if(quantity == null || quantity.isEmpty) return false; //if(image == null) return false; return true; @@ -144,6 +143,6 @@ class ServiceReport { static getDate(String date){ return date == null || date.isEmpty - ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); + ? null : DateTime.fromMillisecondsSinceEpoch((int.tryParse(date)??0) * 1000); } } \ No newline at end of file diff --git a/lib/models/service_request/service_request.dart b/old_lib/models/service_request/service_request.dart similarity index 62% rename from lib/models/service_request/service_request.dart rename to old_lib/models/service_request/service_request.dart index edf66852..8cc04bd0 100644 --- a/lib/models/service_request/service_request.dart +++ b/old_lib/models/service_request/service_request.dart @@ -1,35 +1,35 @@ -import 'package:test_sa/models/lookup.dart'; +import '../lookup.dart'; -class ServiceRequest{ - String id; - String requestCode; - String deviceSerialNumber; - String deviceId; - String deviceArName; - String deviceEnName; - List devicePhotos; - String maintenanceIssue; - String hospitalName; - String hospitalId; - String departmentName; - String engineerName; - String date; - String audio; - int statusValue; - String statusLabel; +class ServiceRequest { + String? id; + String? requestCode; + String? deviceSerialNumber; + String? deviceId; + String? deviceArName; + String? deviceEnName; + List? devicePhotos; + String? maintenanceIssue; + String? hospitalName; + String? hospitalId; + String? departmentName; + String? engineerName; + String? date; + String? audio; + int? statusValue; + String? statusLabel; - bool viewReport; - String engineerMobile; - String deviceModel; - String faultDescription; - String workPerformed; - String visitDate; - DateTime nextVisitDate; - String jobSheetNumber; - String reportID; - String deviceNumber; - Lookup priority; - Lookup defectType; + bool? viewReport; + String? engineerMobile; + String? deviceModel; + String? faultDescription; + String? workPerformed; + String? visitDate; + DateTime? nextVisitDate; + String? jobSheetNumber; + String? reportID; + String? deviceNumber; + Lookup? priority; + Lookup? defectType; ServiceRequest({ this.id, @@ -48,7 +48,6 @@ class ServiceRequest{ this.deviceId, this.audio, this.engineerName, - this.viewReport = false, this.deviceModel, this.engineerMobile, @@ -61,42 +60,46 @@ class ServiceRequest{ this.defectType, this.priority, this.deviceNumber, - }); - factory ServiceRequest.fromJson(Map parsedJson){ + factory ServiceRequest.fromJson(Map parsedJson) { return ServiceRequest( id: parsedJson["nid"], - requestCode: parsedJson["call_id"] ?? parsedJson["jobcode"] , + requestCode: parsedJson["call_id"] ?? parsedJson["jobcode"], hospitalName: parsedJson["call_client"], deviceNumber: parsedJson["device_no"], deviceId: parsedJson["deviceid"], audio: parsedJson["audio"] ?? "", deviceArName: parsedJson["equipment_arabic_name"] == false - ? "No Name found" : parsedJson["equipment_arabic_name"], + ? "No Name found" + : parsedJson["equipment_arabic_name"], deviceEnName: parsedJson["equipment_english_name"] == false - ? "No Name found" : parsedJson["equipment_english_name"], + ? "No Name found" + : parsedJson["equipment_english_name"], devicePhotos: List.from(parsedJson["image"]), deviceSerialNumber: parsedJson["call_sn"], date: parsedJson["call_data"], maintenanceIssue: parsedJson["call_complaint"] ?? parsedJson["complaint"], statusLabel: parsedJson["status_value"], - statusValue: int.tryParse(parsedJson["status"]??"-1"), + statusValue: int.tryParse(parsedJson["status"] ?? "-1"), departmentName: parsedJson["department_name"], engineerName: parsedJson["employee_name"], hospitalId: parsedJson["client"], reportID: parsedJson["service_report_nid"] is String ? parsedJson["service_report_nid"] - : null , + : null, viewReport: parsedJson["service_report_nid"] is bool ? false : true, deviceModel: parsedJson["device_model"], engineerMobile: parsedJson["engineer_mobile"], faultDescription: parsedJson["fault_desc"], jobSheetNumber: parsedJson["job_sheet_number"], visitDate: parsedJson["visit_date"], - nextVisitDate:parsedJson["next_visit_date"] == null - ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(parsedJson["next_visit_date"]) * 1000), + nextVisitDate: parsedJson["next_visit_date"] == null + ? null + : DateTime.fromMillisecondsSinceEpoch( + (int.tryParse(parsedJson["next_visit_date"]) ?? 0) * 1000, + ), workPerformed: parsedJson["work_performed"], ); } -} \ No newline at end of file +} diff --git a/old_lib/models/service_request/service_request_search.dart b/old_lib/models/service_request/service_request_search.dart new file mode 100644 index 00000000..51516636 --- /dev/null +++ b/old_lib/models/service_request/service_request_search.dart @@ -0,0 +1,46 @@ +class ServiceRequestSearch { + String? deviceSerialNumber; + String? deviceName; + String? hospital; + String? model; + int? statusValue; + + ServiceRequestSearch({ + this.deviceSerialNumber, + this.statusValue, + this.deviceName, + this.model, + this.hospital, + }); + + fromSearch(ServiceRequestSearch newSearch) { + deviceSerialNumber = newSearch.deviceSerialNumber; + statusValue = newSearch.statusValue; + hospital = newSearch.hospital; + model = newSearch.model; + } + + String toSearchString() { + String search = ""; + if (deviceSerialNumber != null && + (deviceSerialNumber?.isNotEmpty ?? false)) { + search += "&sn_id=$deviceSerialNumber"; + } + + if (statusValue != null) { + search += "&status=$statusValue"; + } + + if (deviceName != null && (deviceName?.isNotEmpty ?? false)) { + search += "&equipment_en_name=$deviceName"; + } + + if (hospital != null && (hospital?.isNotEmpty ?? false)) { + search += "&client=$hospital"; + } + if (model != null && (model?.isNotEmpty ?? false)) { + search += "&model=$model"; + } + return search; + } +} diff --git a/lib/models/subtitle.dart b/old_lib/models/subtitle.dart similarity index 69% rename from lib/models/subtitle.dart rename to old_lib/models/subtitle.dart index a2f212c2..495238ca 100644 --- a/lib/models/subtitle.dart +++ b/old_lib/models/subtitle.dart @@ -179,7 +179,7 @@ class Subtitle{ String requiredStatus; String visitInformation; String expectDate; - String actualDate; + String? actualDate; String noVisitsFound; String contactStatus; String workingHours; @@ -226,187 +226,187 @@ class Subtitle{ } Subtitle({ - @required this.currentlyServiceNotAvailable, - @required this.waitUntilYourRequestComplete, - @required this.requestCompleteSuccessfully, - @required this.failedToCompleteRequest, - @required this.update, - @required this.cancel, - @required this.confirm, - @required this.exit, - @required this.exitAlert, - @required this.signOutAlert, - @required this.language, - @required this.name, - @required this.email, - @required this.phoneNumber, - @required this.password, - @required this.forgetPassword, - @required this.confirmPassword, - @required this.signIn, - @required this.signUp, - @required this.nameValidateMessage, - @required this.emailValidateMessage, - @required this.phoneNumberValidateMessage, - @required this.passwordValidateMessage, - @required this.confirmPasswordValidateMessage, - @required this.emailExist, - @required this.forgetPasswordWithMark, - @required this.phoneNumberExist, - @required this.showPassword, - @required this.signOut, - @required this.wrongEmailOrPassword, - @required this.next, - @required this.back, - @required this.search, - @required this.searchByName, - @required this.address, - @required this.description, - @required this.title, - @required this.addressNotFound, - @required this.addressValidateMessage, - @required this.dataNotFound, - @required this.descriptionNotFound, - @required this.descriptionValidateMessage, - @required this.edit, - @required this.emailNotFound, - @required this.from, - @required this.linkNotFound, - @required this.nameNotFound, - @required this.phoneNumberNotFound, - @required this.titleNotFound, - @required this.titleValidateMessage, - @required this.to, - @required this.urlNotFound, + required this.currentlyServiceNotAvailable, + required this.waitUntilYourRequestComplete, + required this.requestCompleteSuccessfully, + required this.failedToCompleteRequest, + required this.update, + required this.cancel, + required this.confirm, + required this.exit, + required this.exitAlert, + required this.signOutAlert, + required this.language, + required this.name, + required this.email, + required this.phoneNumber, + required this.password, + required this.forgetPassword, + required this.confirmPassword, + required this.signIn, + required this.signUp, + required this.nameValidateMessage, + required this.emailValidateMessage, + required this.phoneNumberValidateMessage, + required this.passwordValidateMessage, + required this.confirmPasswordValidateMessage, + required this.emailExist, + required this.forgetPasswordWithMark, + required this.phoneNumberExist, + required this.showPassword, + required this.signOut, + required this.wrongEmailOrPassword, + required this.next, + required this.back, + required this.search, + required this.searchByName, + required this.address, + required this.description, + required this.title, + required this.addressNotFound, + required this.addressValidateMessage, + required this.dataNotFound, + required this.descriptionNotFound, + required this.descriptionValidateMessage, + required this.edit, + required this.emailNotFound, + required this.from, + required this.linkNotFound, + required this.nameNotFound, + required this.phoneNumberNotFound, + required this.titleNotFound, + required this.titleValidateMessage, + required this.to, + required this.urlNotFound, - @required this.nameExist, - @required this.unitRequired, - @required this.unite, - @required this.hospitalRequired, - @required this.whatsApp, - @required this.submit, - @required this.shareAntherIssue, - @required this.reportIssue, - @required this.noUniteFound, - @required this.pickUnite, - @required this.noHospitalFound, - @required this.pickHospital, - @required this.shareApp, - @required this.ourWebsite, - @required this.linkedIn, - @required this.facebook, - @required this.hotLine, - @required this.trackServiceRequest, - @required this.newServiceRequest, - @required this.deviceModel, - @required this.noServiceRequestFound, - @required this.engineerName, - @required this.serviceRequests, - @required this.jobSheetNumber, - @required this.visitDate, - @required this.workPerformed, - @required this.faultDescription, - @required this.serviceRequestInformation, - @required this.maintenanceIssue, - @required this.deviceArName, - @required this.hospital, - @required this.status, - @required this.date, - @required this.engineerPhone, - @required this.device, - @required this.deviceSN, - @required this.details, - @required this.requestInformation, - @required this.model, - @required this.brand, - @required this.noDeviceFound, - @required this.noDateFound, - @required this.searchBySn, - @required this.pickDevice, - @required this.notifications, - @required this.notificationsNotFound, - @required this.twitter, - @required this.add, - @required this.code, - @required this.deviceEnName, - @required this.deviceName, - @required this.serialNumber, - @required this.policy, - @required this.clearSearch, - @required this.closed, - @required this.create, - @required this.createServiceRequest, - @required this.delete, - @required this.deviceImages, - @required this.deviceRequired, - @required this.general, - @required this.maintenanceIssueRequired, - @required this.maxImagesNumberIs5, - @required this.newWord, - @required this.noModelFound, - @required this.noSnFound, - @required this.reason1, - @required this.reason2, - @required this.reason3, - @required this.reason4, - @required this.reason5, - @required this.repaired, - @required this.repeated, - @required this.sn, - @required this.underRepair, - @required this.actualDate, - @required this.expectDate, - @required this.visitInformation, - @required this.regularVisitsUpdatedSuccessfully, - @required this.regularVisits, - @required this.updateRegularVisits, - @required this.updatingDots, - @required this.preventiveMaintenanceUpdatedSuccessfully, - @required this.updatePreventiveMaintenance, - @required this.preventiveMaintenance, - @required this.requiredStatus, - @required this.noSerialNumberFound, - @required this.updateVisitsGroup, - @required this.pickFromGallery, - @required this.pickFromCamera, - @required this.images, - @required this.done, - @required this.imagesRequired, - @required this.notYet, - @required this.noVisitsFound, - @required this.onHold, - @required this.nextVisitDate, - @required this.contactStatus, - @required this.travelingHours, - @required this.workingHours, - @required this.taskStatus, - @required this.image, - @required this.pickImage, - @required this.requiredImage, - @required this.activationAlert, + required this.nameExist, + required this.unitRequired, + required this.unite, + required this.hospitalRequired, + required this.whatsApp, + required this.submit, + required this.shareAntherIssue, + required this.reportIssue, + required this.noUniteFound, + required this.pickUnite, + required this.noHospitalFound, + required this.pickHospital, + required this.shareApp, + required this.ourWebsite, + required this.linkedIn, + required this.facebook, + required this.hotLine, + required this.trackServiceRequest, + required this.newServiceRequest, + required this.deviceModel, + required this.noServiceRequestFound, + required this.engineerName, + required this.serviceRequests, + required this.jobSheetNumber, + required this.visitDate, + required this.workPerformed, + required this.faultDescription, + required this.serviceRequestInformation, + required this.maintenanceIssue, + required this.deviceArName, + required this.hospital, + required this.status, + required this.date, + required this.engineerPhone, + required this.device, + required this.deviceSN, + required this.details, + required this.requestInformation, + required this.model, + required this.brand, + required this.noDeviceFound, + required this.noDateFound, + required this.searchBySn, + required this.pickDevice, + required this.notifications, + required this.notificationsNotFound, + required this.twitter, + required this.add, + required this.code, + required this.deviceEnName, + required this.deviceName, + required this.serialNumber, + required this.policy, + required this.clearSearch, + required this.closed, + required this.create, + required this.createServiceRequest, + required this.delete, + required this.deviceImages, + required this.deviceRequired, + required this.general, + required this.maintenanceIssueRequired, + required this.maxImagesNumberIs5, + required this.newWord, + required this.noModelFound, + required this.noSnFound, + required this.reason1, + required this.reason2, + required this.reason3, + required this.reason4, + required this.reason5, + required this.repaired, + required this.repeated, + required this.sn, + required this.underRepair, + required this.actualDate, + required this.expectDate, + required this.visitInformation, + required this.regularVisitsUpdatedSuccessfully, + required this.regularVisits, + required this.updateRegularVisits, + required this.updatingDots, + required this.preventiveMaintenanceUpdatedSuccessfully, + required this.updatePreventiveMaintenance, + required this.preventiveMaintenance, + required this.requiredStatus, + required this.noSerialNumberFound, + required this.updateVisitsGroup, + required this.pickFromGallery, + required this.pickFromCamera, + required this.images, + required this.done, + required this.imagesRequired, + required this.notYet, + required this.noVisitsFound, + required this.onHold, + required this.nextVisitDate, + required this.contactStatus, + required this.travelingHours, + required this.workingHours, + required this.taskStatus, + required this.image, + required this.pickImage, + required this.requiredImage, + required this.activationAlert, - @required this.callId, - @required this.requiredWord, - @required this.quantity, - @required this.callLastSituation, - @required this.invoiceNumber, - @required this.invoiceCode, - @required this.attachImage, - @required this.customer, - @required this.editServiceReport, - @required this.newServiceReport, - @required this.number, - @required this.operatingHours, - @required this.partNumber, - @required this.reasons, - @required this.reportStatus, - @required this.reportType, - @required this.serviceType, - @required this.workPreformed, - @required this.alert, - @required this.duplicateAlert, - @required this.duplicateAlertMessage, - @required this.duplicateRequest, + required this.callId, + required this.requiredWord, + required this.quantity, + required this.callLastSituation, + required this.invoiceNumber, + required this.invoiceCode, + required this.attachImage, + required this.customer, + required this.editServiceReport, + required this.newServiceReport, + required this.number, + required this.operatingHours, + required this.partNumber, + required this.reasons, + required this.reportStatus, + required this.reportType, + required this.serviceType, + required this.workPreformed, + required this.alert, + required this.duplicateAlert, + required this.duplicateAlertMessage, + required this.duplicateRequest, }); factory Subtitle.fromJson(Map parsedJson){ diff --git a/lib/models/timer_model.dart b/old_lib/models/timer_model.dart similarity index 55% rename from lib/models/timer_model.dart rename to old_lib/models/timer_model.dart index 191128fd..b2a7fd7f 100644 --- a/lib/models/timer_model.dart +++ b/old_lib/models/timer_model.dart @@ -1,7 +1,7 @@ class TimerModel { - DateTime startAt; - DateTime endAt; - int durationInSecond; + DateTime? startAt; + DateTime? endAt; + int? durationInSecond; TimerModel({this.startAt,this.endAt,this.durationInSecond}); } \ No newline at end of file diff --git a/lib/models/user.dart b/old_lib/models/user.dart similarity index 78% rename from lib/models/user.dart rename to old_lib/models/user.dart index caa9e7fb..69e5d3fe 100644 --- a/lib/models/user.dart +++ b/old_lib/models/user.dart @@ -1,20 +1,22 @@ -import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; -import 'package:test_sa/models/department.dart'; -import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/hospital.dart'; + + +import '../controllers/notification/firebase_notification_manger.dart'; +import 'department.dart'; +import 'enums/user_types.dart'; +import 'hospital.dart'; class User { - String id; + String? id; String userName; String password; String email; - String image; - Hospital hospital; - Department department; - UsersTypes type; - String phoneNumber; - String whatsApp; - String token; + String? image; + Hospital? hospital; + Department? department; + UsersTypes? type; + String? phoneNumber; + String? whatsApp; + String? token; bool isActive; User( @@ -22,7 +24,7 @@ class User { this.userName = "", this.email = "", this.password = "", - this.phoneNumber = "", + this.phoneNumber, this.hospital, this.image, this.department, @@ -42,9 +44,9 @@ class User { Map toUpdateProfileJson() { Map jsonObject = {}; - if (department?.id != null && department.id.isNotEmpty) jsonObject["department"] = department.id; - if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; - if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber; + if (department?.id != null && (department?.id?.isNotEmpty??false)) jsonObject["department"] = department?.id??""; + if (whatsApp != null && (whatsApp?.isNotEmpty??false)) jsonObject["whatsapp"] = whatsApp; + if (phoneNumber != null && (phoneNumber?.isNotEmpty??false)) jsonObject["phone"] = phoneNumber; return jsonObject; } @@ -54,7 +56,7 @@ class User { "username": userName, "email": email, "whatsapp": whatsApp, - "client": hospital.id, + "client": hospital?.id, "department": department?.id, "phone": phoneNumber, "pass": password, diff --git a/lib/models/visits/visit.dart b/old_lib/models/visits/visit.dart similarity index 73% rename from lib/models/visits/visit.dart rename to old_lib/models/visits/visit.dart index b6562e4c..f3823b77 100644 --- a/lib/models/visits/visit.dart +++ b/old_lib/models/visits/visit.dart @@ -1,24 +1,25 @@ -import 'package:test_sa/models/lookup.dart'; + +import '../lookup.dart'; class Visit{ - String id; - String serialNumber; - String expectDate; - String actualDate; - String hospitalId; - String hospitalName; - String deviceId; - String deviceSerialNumber; - String deviceArabicName; - String deviceEnglishName; - String employId; - String employName; - String modelAndBrand; - String contactStatus; - Lookup status; - String assignTo; - String deviceNumber; - List images; + String? id; + String? serialNumber; + String? expectDate; + String? actualDate; + String? hospitalId; + String? hospitalName; + String? deviceId; + String? deviceSerialNumber; + String? deviceArabicName; + String? deviceEnglishName; + String? employId; + String? employName; + String? modelAndBrand; + String? contactStatus; + Lookup? status; + String? assignTo; + String? deviceNumber; + List? images; Visit({ this.id, @@ -60,7 +61,7 @@ class Visit{ contactStatus: parsedJson["contactStatus"], images: List.from(parsedJson["images"] ?? []), status: Lookup( - id: int.tryParse(parsedJson["status"] ?? "-1"), // actual value (0,1,2) + id: int.tryParse(parsedJson["status"] ?? "-1")??-1, // actual value (0,1,2) label: parsedJson["status_value"] // text value ), assignTo: parsedJson["assigned_to"], diff --git a/old_lib/models/visits/visits_group.dart b/old_lib/models/visits/visits_group.dart new file mode 100644 index 00000000..05ca4c65 --- /dev/null +++ b/old_lib/models/visits/visits_group.dart @@ -0,0 +1,50 @@ + + + +import '../lookup.dart'; +import 'visit.dart'; + +class VisitsGroup{ + String? userId; + String? workingHours; + String? travelingHours; + String? jobSheetNumber; + String? image; + Lookup? status; + Lookup? taskStatus; + DateTime? date; + List? visits; + + VisitsGroup({ + this.userId, + this.status, + this.date, + this.jobSheetNumber, + this.travelingHours, + this.workingHours, + this.visits, + this.image, + this.taskStatus, + }); + + Map toJson(){ + Map jsonObject = {}; + jsonObject["nids"] = visits!.map((e) => e.id).toList().join(','); + if(status != null) jsonObject["status"] = status?.id.toString()??""; + if(date != null) jsonObject["date"] = date.toString().split(" ").first; + if(jobSheetNumber != null && (jobSheetNumber?.isNotEmpty??false)) { + jsonObject["job_sheet_no"] = jobSheetNumber!; + } + if(travelingHours != null &&(travelingHours?.isNotEmpty??false)) { + jsonObject["traveling_hours"] = travelingHours??""; + } + if(workingHours != null && (workingHours?.isNotEmpty??false)) { + jsonObject["working_hours"] = workingHours??""; + } + if(image != null) jsonObject["image"] = image??""; + if(taskStatus != null) jsonObject["task_status"] = taskStatus?.id.toString()??""; + return jsonObject; + } + + +} \ No newline at end of file diff --git a/lib/models/visits/visits_search.dart b/old_lib/models/visits/visits_search.dart similarity index 60% rename from lib/models/visits/visits_search.dart rename to old_lib/models/visits/visits_search.dart index 7cfd4ceb..70454b9b 100644 --- a/lib/models/visits/visits_search.dart +++ b/old_lib/models/visits/visits_search.dart @@ -1,14 +1,14 @@ class VisitsSearch{ - String deviceSerialNumber; - String hospitalName; - String brand; - String model; - String contactStatus; - DateTime expectedDateFrom; - DateTime expectedDateTo; - DateTime actualDateFrom; - DateTime actualDateTo; - int statusValue; + String? deviceSerialNumber; + String? hospitalName; + String? brand; + String? model; + String? contactStatus; + DateTime? expectedDateFrom; + DateTime? expectedDateTo; + DateTime? actualDateFrom; + DateTime? actualDateTo; + int? statusValue; VisitsSearch({ this.deviceSerialNumber, @@ -38,36 +38,36 @@ class VisitsSearch{ String toSearchString(){ String _search = ""; - if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ + if(deviceSerialNumber != null && (deviceSerialNumber?.isNotEmpty??false)){ _search += "&sn_id=$deviceSerialNumber"; } - if(hospitalName != null && hospitalName.isNotEmpty){ + if(hospitalName != null && (hospitalName?.isNotEmpty??false)){ _search += "&client=$hospitalName"; } - if(brand != null && brand.isNotEmpty){ + if(brand != null && (brand?.isNotEmpty??false)){ _search += "&brand=$brand"; } - if(model != null && model.isNotEmpty){ + if(model != null && (model?.isNotEmpty??false)){ _search += "&model=$model"; } if(expectedDateFrom != null){ - _search += "&expected_date_from=${expectedDateFrom.millisecondsSinceEpoch ~/ 1000}"; + _search += "&expected_date_from=${(expectedDateFrom?.millisecondsSinceEpoch??0) ~/ 1000}"; } if(expectedDateTo != null){ - _search += "&expected_date_to=${expectedDateTo.millisecondsSinceEpoch~/1000}"; + _search += "&expected_date_to=${(expectedDateTo?.millisecondsSinceEpoch??0) ~/1000}"; } if(actualDateFrom != null){ - _search += "&actual_date_from=${actualDateFrom.millisecondsSinceEpoch ~/ 1000}"; + _search += "&actual_date_from=${(actualDateFrom?.millisecondsSinceEpoch??0) ~/ 1000}"; } if(actualDateTo != null){ - _search += "&actual_date_to=${actualDateTo.millisecondsSinceEpoch~/1000}"; + _search += "&actual_date_to=${(actualDateTo?.millisecondsSinceEpoch??0) ~/1000}"; } if(statusValue != null){ diff --git a/lib/views/app_style/colors.dart b/old_lib/views/app_style/colors.dart similarity index 96% rename from lib/views/app_style/colors.dart rename to old_lib/views/app_style/colors.dart index b6200b0e..f358210b 100644 --- a/lib/views/app_style/colors.dart +++ b/old_lib/views/app_style/colors.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/lookup.dart'; +//import 'package:test_sa/models/lookup.dart'; + class AColors { AColors._(); static const Color white = Color(0xffffffff); diff --git a/lib/views/app_style/sizing.dart b/old_lib/views/app_style/sizing.dart similarity index 100% rename from lib/views/app_style/sizing.dart rename to old_lib/views/app_style/sizing.dart diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/old_lib/views/pages/device_transfer/device_transfer_details.dart similarity index 70% rename from lib/views/pages/device_transfer/device_transfer_details.dart rename to old_lib/views/pages/device_transfer/device_transfer_details.dart index 7b36058c..20353f59 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/old_lib/views/pages/device_transfer/device_transfer_details.dart @@ -1,24 +1,24 @@ 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/device_transfer_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/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/device_transfer/update_device_transfer.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; -import 'package:test_sa/views/widgets/device_trancfer/device_transfer_info_section.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/requests/info_row.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/device_transfer_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/device/device_transfer.dart'; +import '../../../models/device/device_transfer_info.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../../widgets/buttons/app_back_button.dart'; +import '../../widgets/buttons/app_small_button.dart'; +import '../../widgets/device_trancfer/device_transfer_info_section.dart'; +import '../../widgets/loaders/loading_manager.dart'; +import '../../widgets/requests/info_row.dart'; +import 'update_device_transfer.dart'; class DeviceTransferDetails extends StatefulWidget { final DeviceTransfer model; - const DeviceTransferDetails({Key key, this.model}) : super(key: key); + const DeviceTransferDetails({Key? key, required this.model}) : super(key: key); @override State createState() => _DeviceTransferDetailsState(); @@ -29,29 +29,27 @@ class _DeviceTransferDetailsState extends State { final DeviceTransferInfo _model = DeviceTransferInfo(); bool _isSender = false; bool _isReceiver = false; - UserProvider _userProvider; - SettingProvider _settingProvider; - DeviceTransferProvider _deviceTransferProvider; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + DeviceTransferProvider? _deviceTransferProvider; bool _isLoading = false; - Subtitle _subtitle; + Subtitle? _subtitle; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); @override void initState() { - - super.initState(); } @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _deviceTransferProvider = Provider.of(context); - _isSender = _userProvider.user.id == widget.model.sender?.userId; - _isReceiver = _userProvider.user.id == widget.model.receiver?.userId; + _isSender = _userProvider?.user?.id == widget.model.sender?.userId; + _isReceiver = _userProvider?.user?.id == widget.model.receiver?.userId; return Scaffold( key: _scaffoldKey, body: SafeArea( @@ -69,12 +67,12 @@ class _DeviceTransferDetailsState extends State { padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), child: Row( children: [ - const ABackButton(), + ABackButton(), Expanded( child: Center( child: Text( - _subtitle.details, - style: Theme.of(context).textTheme.headline6.copyWith( + _subtitle?.details??"", + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontStyle: FontStyle.italic ), @@ -92,12 +90,12 @@ class _DeviceTransferDetailsState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ RequestInfoRow( - title: _subtitle.title, - info: widget.model.title, + title: _subtitle?.title??"", + info: widget.model.title??"", ), RequestInfoRow( - title: _subtitle.device, - info: widget.model.device.serialNumber, + title: _subtitle?.device??"", + info: widget.model.device?.serialNumber??"", ), const SizedBox(height:8), Row( @@ -110,7 +108,7 @@ class _DeviceTransferDetailsState extends State { ), if(_isSender) ASmallButton( - text: _subtitle.edit, + text: _subtitle?.edit??"", onPressed: (){ Navigator.of(context).push( MaterialPageRoute( @@ -123,7 +121,7 @@ class _DeviceTransferDetailsState extends State { ), const SizedBox(height:12), DeviceTransferInfoSection( - info: widget.model.sender, + info: widget.model.sender!, ), const SizedBox(height:8), Row( @@ -136,7 +134,7 @@ class _DeviceTransferDetailsState extends State { ), if(_isReceiver) ASmallButton( - text: _subtitle.edit, + text: _subtitle?.edit??"", onPressed: (){ Navigator.of(context).push( MaterialPageRoute( @@ -149,7 +147,7 @@ class _DeviceTransferDetailsState extends State { ), const SizedBox(height:12), DeviceTransferInfoSection( - info: widget.model.receiver, + info: widget.model.receiver!, ), ], diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/old_lib/views/pages/device_transfer/request_device_transfer.dart similarity index 70% rename from lib/views/pages/device_transfer/request_device_transfer.dart rename to old_lib/views/pages/device_transfer/request_device_transfer.dart index eaaed184..0bbe80d3 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/old_lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,27 +1,27 @@ 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/providers/api/device_transfer_provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/extensions/int_extensions.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/subtitle.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/departments/department_button.dart'; -import 'package:test_sa/views/widgets/equipment/device_button.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import '../../../../controllers/localization/localization.dart'; +import '../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/device_transfer_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../extensions/int_extensions.dart'; +import '../../../models/device/device_transfer.dart'; +import '../../../models/device/device_transfer_info.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/sizing.dart'; +import '../../widgets/buttons/app_button.dart'; +import '../../widgets/departments/department_button.dart'; +import '../../widgets/equipment/device_button.dart'; +import '../../widgets/hospitals/hospital_button.dart'; +import '../../widgets/loaders/loading_manager.dart'; +import '../../widgets/titles/app_sub_title.dart'; class RequestDeviceTransfer extends StatefulWidget { static const String id = "/request-device-transfer"; - const RequestDeviceTransfer({Key key}) : super(key: key); + const RequestDeviceTransfer({Key? key}) : super(key: key); @override State createState() => _RequestDeviceTransferState(); @@ -30,10 +30,10 @@ class RequestDeviceTransfer extends StatefulWidget { class _RequestDeviceTransferState extends State { bool _isLoading = false; bool _validate = false; - Subtitle _subtitle; - UserProvider _userProvider; - SettingProvider _settingProvider; - DeviceTransferProvider _deviceTransferProvider; + Subtitle? _subtitle; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + DeviceTransferProvider? _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo()); final GlobalKey _formKey = GlobalKey(); @@ -46,11 +46,11 @@ class _RequestDeviceTransferState extends State { _onSubmit() async { _validate = true; - if (!_formKey.currentState.validate()) { + if ((_formKey.currentState?.validate()??false)) { setState(() {}); return false; } - _formKey.currentState.save(); + _formKey.currentState?.save(); if (!_formModel.validate()) { setState(() {}); @@ -60,16 +60,16 @@ class _RequestDeviceTransferState extends State { _isLoading = true; setState(() {}); - int status = await _deviceTransferProvider.createRequest( - user: _userProvider.user, - host: _settingProvider.host, + int? status = await _deviceTransferProvider?.createRequest( + user: _userProvider?.user, + host: _settingProvider?.host??"", model: _formModel, ); _isLoading = false; setState(() {}); - if (status >= 200 && status < 300) { + if (status!=null && status >= 200 && status < 300) { Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle?.requestCompleteSuccessfully??"", ); Navigator.of(context).pop(); } else { @@ -88,7 +88,7 @@ class _RequestDeviceTransferState extends State { @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _deviceTransferProvider = Provider.of(context, listen: false); @@ -112,7 +112,7 @@ class _RequestDeviceTransferState extends State { padding: const EdgeInsets.all(8.0), child: Text( "Transfer Device", - style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), + style: Theme.of(context).textTheme.headline5?.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), ), ), ), @@ -134,12 +134,12 @@ class _RequestDeviceTransferState extends State { const ASubTitle("Device"), if (_validate && _formModel.device == null) ASubTitle( - _subtitle.requiredWord, + _subtitle?.requiredWord??"", color: Colors.red, ), 6.height, DeviceButton( - device: _formModel.device, + device: _formModel.device!, onDevicePick: (device) { _formModel.device = device; setState(() {}); @@ -159,37 +159,37 @@ class _RequestDeviceTransferState extends State { // ), 12.height, const ASubTitle("Destination Client"), - if (_validate && _formModel.receiver.client == null) + if (_validate && _formModel.receiver?.client == null) ASubTitle( - _subtitle.requiredWord, + _subtitle?.requiredWord??"", color: Colors.red, ), 6.height, HospitalButton( - hospital: _formModel.receiver.client, + hospital: _formModel.receiver!.client!, onHospitalPick: (hospital) { - _formModel.receiver.client = hospital; + _formModel.receiver?.client = hospital; setState(() {}); }, ), 12.height, const ASubTitle("Destination Department"), - if (_validate && _formModel.receiver.department == null) + if (_validate && _formModel.receiver?.department == null) ASubTitle( - _subtitle.requiredWord, + _subtitle?.requiredWord??"", color: Colors.red, ), 6.height, DepartmentButton( - department: _formModel.receiver.department, + department: _formModel.receiver?.department, onDepartmentPick: (department) { - _formModel.receiver.department = department; + _formModel.receiver?.department = department; setState(() {}); }, ), 12.height, AButton( - text: _subtitle.submit, + text: _subtitle?.submit??"", onPressed: _onSubmit, ), const SizedBox( diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/old_lib/views/pages/device_transfer/track_device_transfer.dart similarity index 68% rename from lib/views/pages/device_transfer/track_device_transfer.dart rename to old_lib/views/pages/device_transfer/track_device_transfer.dart index 454d6d30..8e5c7733 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/old_lib/views/pages/device_transfer/track_device_transfer.dart @@ -1,18 +1,21 @@ 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/device_transfer_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/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/device_transfer_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../widgets/buttons/app_back_button.dart'; +import '../../widgets/device_trancfer/device_transfer_list.dart'; +import '../../widgets/loaders/loading_manager.dart'; + class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; - const TrackDeviceTransferPage({Key key}) : super(key: key); + const TrackDeviceTransferPage({Key? key}) : super(key: key); @override State createState() => _TrackDeviceTransferPageState(); @@ -20,27 +23,27 @@ class TrackDeviceTransferPage extends StatefulWidget { class _TrackDeviceTransferPageState extends State with TickerProviderStateMixin{ - DeviceTransferProvider _deviceTransferProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; + late DeviceTransferProvider _deviceTransferProvider; + UserProvider? _userProvider; + late SettingProvider _settingProvider; @override Widget build(BuildContext context) { _deviceTransferProvider = Provider.of(context); _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( body: SafeArea( child: LoadingManager( - isLoading: _deviceTransferProvider.isLoading, + isLoading: _deviceTransferProvider.isLoading??false, isFailedLoading: _deviceTransferProvider.items == null, - stateCode: _deviceTransferProvider.stateCode, + stateCode: _deviceTransferProvider.stateCode??0, onRefresh: () async { _deviceTransferProvider.reset(); await _deviceTransferProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider?.user??User(), + host: _settingProvider.host??"", ); }, child: Stack( @@ -59,7 +62,7 @@ class _TrackDeviceTransferPageState extends State child: Center( child: Text( "Device Transfer", - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontStyle: FontStyle.italic ), @@ -78,8 +81,8 @@ class _TrackDeviceTransferPageState extends State nextPage: _deviceTransferProvider.nextPage, onLazyLoad: () async { await _deviceTransferProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider?.user??User(), + host: _settingProvider.host??"", ); }, items: _deviceTransferProvider.items, diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/old_lib/views/pages/device_transfer/update_device_transfer.dart similarity index 65% rename from lib/views/pages/device_transfer/update_device_transfer.dart rename to old_lib/views/pages/device_transfer/update_device_transfer.dart index 2b407a48..b677cc9f 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/old_lib/views/pages/device_transfer/update_device_transfer.dart @@ -4,26 +4,28 @@ import 'package:flutter/foundation.dart'; 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/providers/api/device_transfer_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/subtitle.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/e_signature/e_signature.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import '../../../../controllers/localization/localization.dart'; +import '../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/device_transfer_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/device/device_transfer.dart'; +import '../../../models/device/device_transfer_info.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; +import '../../app_style/sizing.dart'; +import '../../widgets/app_text_form_field.dart'; +import '../../widgets/buttons/app_button.dart'; +import '../../widgets/e_signature/e_signature.dart'; +import '../../widgets/loaders/loading_manager.dart'; +import '../../widgets/status/gas_refill/gas_status.dart'; +import '../../widgets/titles/app_sub_title.dart'; + class UpdateDeviceTransfer extends StatefulWidget { - final DeviceTransfer model; - final bool isSender; - const UpdateDeviceTransfer({Key key, this.model, this.isSender}) : super(key: key); + final DeviceTransfer? model; + final bool? isSender; + const UpdateDeviceTransfer({Key? key, this.model, this.isSender}) : super(key: key); @override State createState() => _UpdateDeviceTransferState(); @@ -32,11 +34,11 @@ class UpdateDeviceTransfer extends StatefulWidget { class _UpdateDeviceTransferState extends State { bool _isLoading = false; bool _validate = false; - Subtitle _subtitle; - UserProvider _userProvider; - SettingProvider _settingProvider; - Uint8List _signature; - DeviceTransferProvider _deviceTransferProvider; + Subtitle? _subtitle; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + Uint8List? _signature; + DeviceTransferProvider? _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); final DeviceTransferInfo _formModel = DeviceTransferInfo(); final GlobalKey _formKey = GlobalKey(); @@ -44,27 +46,27 @@ class _UpdateDeviceTransferState extends State { _update() async { _validate = true; - if(!_formKey.currentState.validate()){ + if((_formKey.currentState?.validate()??false)){ setState(() {}); return false; } - _formKey.currentState.save(); + _formKey.currentState?.save(); _isLoading =true; setState(() {}); - int status = await _deviceTransferProvider.updateRequest( - user: _userProvider.user, - host: _settingProvider.host, - requestId: widget.model.id, - isSender: widget.isSender, + int? status = await _deviceTransferProvider?.updateRequest( + user: _userProvider?.user??User(), + host: _settingProvider?.host??"", + requestId: widget.model?.id??"", + isSender: widget.isSender??false, newModel: _formModel, oldModel: widget.model ); _isLoading =false; setState(() {}); - if(status >= 200 && status < 300){ + if(status!=null && status >= 200 && status < 300){ Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle?.requestCompleteSuccessfully??"", ); _validate = false; Navigator.of(context).pop(); @@ -89,8 +91,7 @@ class _UpdateDeviceTransferState extends State { @override void initState() { - _formModel.fromDetails(widget.isSender - ? widget.model.sender : widget.model.receiver, + _formModel.fromDetails((widget.isSender??false) ? widget.model?.sender : widget.model?.receiver, withSignature: false ); super.initState(); @@ -104,7 +105,7 @@ class _UpdateDeviceTransferState extends State { @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _deviceTransferProvider = Provider.of(context,listen: false); @@ -128,7 +129,7 @@ class _UpdateDeviceTransferState extends State { padding: const EdgeInsets.all(8.0), child: Text( "Edit Transfer Device", - style: Theme.of(context).textTheme.headline5.copyWith( + style: Theme.of(context).textTheme.headline5?.copyWith( color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold @@ -141,7 +142,7 @@ class _UpdateDeviceTransferState extends State { const SizedBox(height: 4,), ATextFormField( - initialValue: _formModel?.comment, + initialValue: _formModel.comment??"", textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.text, @@ -150,10 +151,10 @@ class _UpdateDeviceTransferState extends State { }, ), const SizedBox(height: 8,), - ASubTitle(_subtitle.travelingHours), + ASubTitle(_subtitle?.travelingHours??""), const SizedBox(height: 4,), ATextFormField( - initialValue: _formModel?.travelingHours, + initialValue: _formModel.travelingHours??"", textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.number, @@ -162,10 +163,10 @@ class _UpdateDeviceTransferState extends State { }, ), const SizedBox(height: 8,), - ASubTitle(_subtitle.workingHours), + ASubTitle(_subtitle?.workingHours??""), const SizedBox(height: 4,), ATextFormField( - initialValue: _formModel?.workingHours, + initialValue: _formModel.workingHours??"", textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.number, @@ -173,20 +174,8 @@ class _UpdateDeviceTransferState extends State { _formModel.workingHours = value; }, ), - // const SizedBox(height: 8,), - // const ASubTitle("Sender Department"), - // if(_validate && _formModel.senderDepartment == null) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // DepartmentButton( - // department: _formModel.senderDepartment, - // onDepartmentPick: (department){ - // _formModel.senderDepartment = department; - // setState(() {}); - // }, - // ), const SizedBox(height: 8,), - ASubTitle(_subtitle.status), + ASubTitle(_subtitle?.status??""), const SizedBox(height: 4,), GasStatusMenu( initialValue: _formModel.status, @@ -201,9 +190,9 @@ class _UpdateDeviceTransferState extends State { // ASubTitle(_subtitle.requiredWord,color: Colors.red,), const SizedBox(height: 4,), ESignature( - oldSignature: widget.isSender - ? widget.model.sender.signature - : widget.model.receiver.signature, + oldSignature: (widget.isSender??false) + ? widget.model?.sender?.signature + : widget.model?.receiver?.signature, newSignature: _signature, onSaved: (signature){ _signature = signature; @@ -213,7 +202,7 @@ class _UpdateDeviceTransferState extends State { Padding( padding: const EdgeInsets.all(16.0), child: AButton( - text: _subtitle.update, + text: _subtitle?.update??"", onPressed: _update, ), ), diff --git a/lib/views/pages/login.dart b/old_lib/views/pages/login.dart similarity index 68% rename from lib/views/pages/login.dart rename to old_lib/views/pages/login.dart index 33372b50..b42a5c0b 100644 --- a/lib/views/pages/login.dart +++ b/old_lib/views/pages/login.dart @@ -1,21 +1,20 @@ 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/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/user.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/register.dart'; -import 'package:test_sa/views/pages/user/land_page.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/loaders/loading_manager.dart'; -import '../widgets/buttons/app_outlined_button.dart'; +import '../../controllers/http_status_manger/http_status_manger.dart'; +import '../../controllers/localization/localization.dart'; +import '../../controllers/providers/api/user_provider.dart'; +import '../../controllers/providers/settings/setting_provider.dart'; +import '../../controllers/validator/validator.dart'; +import '../../models/subtitle.dart'; +import '../../models/user.dart'; +import '../app_style/sizing.dart'; +import '../widgets/app_text_form_field.dart'; +import '../widgets/buttons/app_button.dart'; +import '../widgets/loaders/loading_manager.dart'; +import 'user/land_page.dart'; + class Login extends StatefulWidget { static final String id = "/login"; @@ -25,14 +24,14 @@ class Login extends StatefulWidget { } class _LoginState extends State { - UserProvider _userProvider; - SettingProvider _settingProvider; + UserProvider? _userProvider; + SettingProvider? _settingProvider; User _user = User(); bool _obscurePassword = true; bool _firstTime = true; - double _height; - double _width; - String _payload; + late double _height; + late double _width; + late String _payload; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); @@ -42,12 +41,12 @@ class _LoginState extends State { _settingProvider = Provider.of(context); _height = MediaQuery.of(context).size.height; _width = MediaQuery.of(context).size.width; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( key: _scaffoldKey, body: SafeArea( child: LoadingManager( - isLoading: _userProvider.isLoading || !_settingProvider.isLoaded, + isLoading: (_userProvider?.isLoading??false) || !(_settingProvider?.isLoaded??false), isFailedLoading: false, stateCode: 200, onRefresh: () async {}, @@ -77,54 +76,54 @@ class _LoginState extends State { height: 24 * AppStyle.getScaleFactor(context), ), ATextFormField( - initialValue: _user?.userName, - hintText: _subtitle.name, + initialValue: _user?.userName??"", + hintText: _subtitle?.name??"", textAlign: TextAlign.left, style: Theme.of(context).textTheme.bodyText1, prefixIconData: Icons.account_circle, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage, + validator: (value) => Validator.hasValue(value!) ? '' : _subtitle?.nameValidateMessage??"", textInputType: TextInputType.name, onSaved: (value) { - _user.userName = value; + _user.userName = value!; }, ), SizedBox(height: 12), ATextFormField( - initialValue: _user?.password, - hintText: _subtitle.password, + initialValue: _user.password, + hintText: _subtitle?.password??"", obscureText: _obscurePassword, style: Theme.of(context).textTheme.bodyText1, prefixIconData: Icons.vpn_key_sharp, textAlign: TextAlign.left, - validator: (value) => Validator.isValidPassword(value) ? null : _subtitle.passwordValidateMessage, + validator: (value) => Validator.isValidPassword(value!) ? '' : _subtitle?.passwordValidateMessage??"", showPassword: () { _obscurePassword = !_obscurePassword; setState(() {}); }, onSaved: (value) { - _user.password = value; + _user.password = value!; }, ), SizedBox( height: 32 * AppStyle.getScaleFactor(context), ), AButton( - text: _subtitle.signIn, + text: _subtitle?.signIn??"", onPressed: () async { - if (!_formKey.currentState.validate()) return; - _formKey.currentState.save(); - int status = await _userProvider.login( + if (!(_formKey.currentState?.validate()??false)) return; + _formKey.currentState?.save(); + int? status = await _userProvider?.login( user: _user, - host: _settingProvider.host, + host: _settingProvider?.host??"", ); - if (status >= 200 && status < 300) { - _settingProvider.setUser(_userProvider.user); - if (_userProvider.user.isActive) + if (status !=null && status >= 200 && status < 300) { + _settingProvider?.setUser(_userProvider?.user??User()); + if (_userProvider?.user?.isActive??false) Navigator.of(context).pushNamed(LandPage.id); else - Fluttertoast.showToast(msg: _subtitle.activationAlert); + Fluttertoast.showToast(msg: _subtitle?.activationAlert??""); } else { - String errorMessage = status == 400 ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + String errorMessage = status == 400 ? _subtitle?.wrongEmailOrPassword??"" : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(errorMessage), )); diff --git a/lib/views/pages/register.dart b/old_lib/views/pages/register.dart similarity index 69% rename from lib/views/pages/register.dart rename to old_lib/views/pages/register.dart index af5f83cd..aca5ff1d 100644 --- a/lib/views/pages/register.dart +++ b/old_lib/views/pages/register.dart @@ -2,19 +2,22 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.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/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/user.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/departments/department_button.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + +import '../../controllers/http_status_manger/http_status_manger.dart'; +import '../../controllers/localization/localization.dart'; +import '../../controllers/providers/api/user_provider.dart'; +import '../../controllers/providers/settings/setting_provider.dart'; +import '../../controllers/validator/validator.dart'; +import '../../models/hospital.dart'; +import '../../models/subtitle.dart'; +import '../../models/user.dart'; +import '../widgets/app_text_form_field.dart'; +import '../widgets/buttons/app_back_button.dart'; +import '../widgets/buttons/app_button.dart'; +import '../widgets/departments/department_button.dart'; +import '../widgets/hospitals/hospital_button.dart'; +import '../widgets/loaders/loading_manager.dart'; + class Register extends StatefulWidget { static final String id = "/register"; @@ -24,10 +27,10 @@ class Register extends StatefulWidget { } class _RegisterState extends State { - UserProvider _userProvider; - SettingProvider _settingProvider; - double _width; - double _height; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + late double _width; + late double _height; User _user = User(); bool _obscurePassword = true; final GlobalKey _formKey = GlobalKey(); @@ -39,11 +42,11 @@ class _RegisterState extends State { _settingProvider = Provider.of(context); _width = MediaQuery.of(context).size.width; _height = MediaQuery.of(context).size.height; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( key: _scaffoldKey, body: LoadingManager( - isLoading: _userProvider.isLoading, + isLoading: _userProvider?.isLoading??false, isFailedLoading: false, stateCode: 200, onRefresh: () async {}, @@ -69,40 +72,40 @@ class _RegisterState extends State { ), ATextFormField( initialValue: _user.userName, - hintText: _subtitle.name, + hintText: _subtitle?.name??"", prefixIconData: Icons.account_circle, style: Theme.of(context).textTheme.headline6, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage, + validator: (value) => Validator.hasValue(value!) ? '' : _subtitle?.nameValidateMessage??"", onSaved: (value) { - _user.userName = value; + _user.userName = value!; }, ), const SizedBox(height: 12), ATextFormField( initialValue: _user.email, - hintText: _subtitle.email, + hintText: _subtitle?.email??"", prefixIconData: Icons.email, textInputType: TextInputType.emailAddress, style: Theme.of(context).textTheme.headline6, - validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage, + validator: (value) => Validator.isEmail(value!) ? '' : _subtitle?.emailValidateMessage??"", onSaved: (value) { - _user.email = value; + _user.email = value!; }, ), const SizedBox(height: 12), ATextFormField( initialValue: _user.password, - hintText: _subtitle.password, + hintText: _subtitle?.password??"", prefixIconData: Icons.vpn_key_sharp, style: Theme.of(context).textTheme.headline6, obscureText: _obscurePassword, - validator: (value) => Validator.isValidPassword(value) ? null : _subtitle.passwordValidateMessage, + validator: (value) => Validator.isValidPassword(value!) ? '' : _subtitle?.passwordValidateMessage??'', showPassword: () { _obscurePassword = !_obscurePassword; setState(() {}); }, onSaved: (value) { - _user.password = value; + _user.password = value!; }, onChange: (value) { _user.password = value; @@ -112,10 +115,10 @@ class _RegisterState extends State { ATextFormField( initialValue: _user.password, prefixIconData: Icons.vpn_key_sharp, - hintText: _subtitle.confirmPassword, + hintText: _subtitle?.confirmPassword??"", style: Theme.of(context).textTheme.headline6, obscureText: _obscurePassword, - validator: (value) => _user.password == value ? null : _subtitle.confirmPasswordValidateMessage, + validator: (value) => _user.password == value ? '' : _subtitle?.confirmPasswordValidateMessage??"", showPassword: () { _obscurePassword = !_obscurePassword; setState(() {}); @@ -123,7 +126,7 @@ class _RegisterState extends State { ), const SizedBox(height: 12), HospitalButton( - hospital: _user.hospital, + hospital: _user.hospital??Hospital(), onHospitalPick: (hospital) { _user.hospital = hospital; setState(() {}); @@ -139,11 +142,11 @@ class _RegisterState extends State { ), const SizedBox(height: 12), ATextFormField( - initialValue: _user.phoneNumber, - hintText: _subtitle.phoneNumber, + initialValue: _user.phoneNumber??"", + hintText: _subtitle?.phoneNumber??"", style: Theme.of(context).textTheme.headline6, prefixIconData: Icons.phone_android, - validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + validator: (value) => Validator.isPhoneNumber(value!) ? '' : _subtitle?.phoneNumberValidateMessage??"", textInputType: TextInputType.phone, onSaved: (value) { _user.phoneNumber = value; @@ -151,12 +154,12 @@ class _RegisterState extends State { ), SizedBox(height: 8), ATextFormField( - initialValue: _user.whatsApp, - hintText: _subtitle.whatsApp, + initialValue: _user.whatsApp??"", + hintText: _subtitle?.whatsApp??"", style: Theme.of(context).textTheme.headline6, prefixIconData: FontAwesomeIcons.whatsapp, prefixIconSize: 36, - validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + validator: (value) => (Validator.isPhoneNumber(value!)) ? "" : _subtitle?.phoneNumberValidateMessage??"", textInputType: TextInputType.phone, onSaved: (value) { _user.whatsApp = value; @@ -164,37 +167,37 @@ class _RegisterState extends State { ), const SizedBox(height: 12), AButton( - text: _subtitle.signUp, + text: _subtitle?.signUp??"", onPressed: () async { - if (!_formKey.currentState.validate()) return; - _formKey.currentState.save(); + if (!(_formKey.currentState?.validate()??false)) return; + _formKey.currentState?.save(); if (_user.hospital == null) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(_subtitle.hospitalRequired), + content: Text(_subtitle?.hospitalRequired??""), )); return; } if (_user.department == null) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(_subtitle.unitRequired), + content: Text(_subtitle?.unitRequired??""), )); return; } - int status = await _userProvider.register( + int? status = await _userProvider?.register( user: _user, - host: _settingProvider.host, + host: _settingProvider?.host??"", ); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: _subtitle.activationAlert); + if (status != null && status >= 200 && status < 300) { + Fluttertoast.showToast(msg: _subtitle?.activationAlert??""); Navigator.of(context).pop(); } else { - String errorMessage = status == 402 - ? _subtitle.nameExist + String? errorMessage = status == 402 + ? _subtitle?.nameExist : status == 401 - ? _subtitle.emailExist + ? _subtitle?.emailExist : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(errorMessage), + content: Text(errorMessage??""), )); } }, diff --git a/old_lib/views/pages/splash_screen.dart b/old_lib/views/pages/splash_screen.dart new file mode 100644 index 00000000..003b0599 --- /dev/null +++ b/old_lib/views/pages/splash_screen.dart @@ -0,0 +1,80 @@ +import 'dart:convert'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flare_flutter/flare_actor.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../controllers/notification/notification_manger.dart'; +import '../../controllers/providers/api/user_provider.dart'; +import '../../controllers/providers/settings/setting_provider.dart'; +import '../../models/app_notification.dart'; +import '../../models/user.dart'; +import 'login.dart'; +import 'user/land_page.dart'; + +class SplashScreen extends StatefulWidget { + static const String routeName = '/splashScreen'; + + const SplashScreen({Key? key}) : super(key: key); + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + SettingProvider? _settingProvider; + UserProvider? _userProvider; + + _goToUserScreen(User? user) { + _userProvider?.user = user; + // Navigator.of(context).pushNamed(Login.id); + Navigator.of(context).pushNamed(LandPage.id); + } + + @override + void initState() { + Firebase.initializeApp(); + + NotificationManger.initialisation((notificationDetails) { + AppNotification notification = + AppNotification.fromJson(json.decode(notificationDetails.payload??"")); + if (notification.path == null || (notification.path?.isEmpty??false)) return; + Navigator.pushNamed(context, notification.path??"", + arguments: notification.requestId); + }, (id, title, body, payload) async {}); + super.initState(); + } + + @override + Widget build(BuildContext context) { + _settingProvider = Provider.of(context, listen: false); + _userProvider = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: Colors.white, + body: Center( + child: SizedBox( + width: MediaQuery.of(context).size.width / 1.1, + child: FlareActor( + "assets/rives/atoms_splash.flr", + fit: BoxFit.contain, + animation: "splash", + callback: (animation) async { + print(await FirebaseMessaging.instance.getToken()); + Navigator.of(context).pushNamed(Login.id); + if ((_settingProvider?.isLoaded??false) && _settingProvider?.user != null) { + _goToUserScreen(_settingProvider?.user); + } + }, + ), + //const Center(child: CircularProgressIndicator()) + + // Image.asset("assets/images/logo.png", + // fit: BoxFit.contain, + // ), + ), + ), + ); + } +} diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/old_lib/views/pages/user/gas_refill/gas_refill_details.dart similarity index 69% rename from lib/views/pages/user/gas_refill/gas_refill_details.dart rename to old_lib/views/pages/user/gas_refill/gas_refill_details.dart index d1d41eac..d70a8e9b 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/old_lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -1,29 +1,30 @@ 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/gas_refill_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/enums/user_types.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_update_details_item.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/requests/info_row.dart'; -import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/gas_refill_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/enums/user_types.dart'; +import '../../../../models/gas_refill/gas_refill_model.dart'; +import '../../../../models/subtitle.dart'; +import '../../../../models/user.dart'; import '../../../app_style/colors.dart'; +import '../../../app_style/sizing.dart'; +import '../../../widgets/buttons/app_back_button.dart'; +import '../../../widgets/buttons/app_button.dart'; +import '../../../widgets/buttons/app_icon_button.dart'; +import '../../../widgets/gas_refill/gas_refill_update_details_item.dart'; +import '../../../widgets/loaders/loading_manager.dart'; +import '../../../widgets/requests/info_row.dart'; +import '../../../widgets/requests/request_status.dart'; +import '../../../widgets/status/gas_refill/gas_status.dart'; +import '../../../widgets/titles/app_sub_title.dart'; class GasRefillDetails extends StatefulWidget { - final GasRefillModel model; - const GasRefillDetails({Key key, this.model}) : super(key: key); + final GasRefillModel? model; + const GasRefillDetails({Key? key, this.model}) : super(key: key); @override State createState() => _GasRefillDetailsState(); @@ -34,34 +35,34 @@ class _GasRefillDetailsState extends State { final GasRefillModel _model = GasRefillModel(); bool _enableEdit = false; bool _validate = false; - UserProvider _userProvider; - SettingProvider _settingProvider; - GasRefillProvider _gasRefillProvider; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + GasRefillProvider? _gasRefillProvider; bool _isLoading = false; - Subtitle _subtitle; + Subtitle? _subtitle; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); _update() async { _validate = true; - if(!_formKey.currentState.validate()){ + if(!(_formKey.currentState?.validate()??false)){ setState(() {}); return false; } - _formKey.currentState.save(); + _formKey.currentState?.save(); _isLoading =true; setState(() {}); - int status = await _gasRefillProvider.updateModel( - user: _userProvider.user, - host: _settingProvider.host, + int? status = await _gasRefillProvider?.updateModel( + user: _userProvider?.user??User(), + host: _settingProvider?.host??"", newModel: _model, oldModel: widget.model ); _isLoading =false; setState(() {}); - if(status >= 200 && status < 300){ + if(status != null && status >= 200 && status < 300){ Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle?.requestCompleteSuccessfully??"", ); _enableEdit = false; _validate = false; @@ -81,13 +82,13 @@ class _GasRefillDetailsState extends State { @override void initState() { - _model.fromGasRefillModel(widget.model); + _model.fromGasRefillModel(widget.model??GasRefillModel()); super.initState(); } @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _gasRefillProvider = Provider.of(context); @@ -108,19 +109,19 @@ class _GasRefillDetailsState extends State { padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), child: Row( children: [ - const ABackButton(), + ABackButton(), Expanded( child: Center( child: Text( - _subtitle.details, - style: Theme.of(context).textTheme.headline6.copyWith( + _subtitle?.details??"", + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontStyle: FontStyle.italic ), ), ), ), - if(_userProvider.user.type == UsersTypes.engineer) + if(_userProvider?.user?.type == UsersTypes.engineer) AIconButton( iconData: _enableEdit ? Icons.cancel : Icons.edit, color: Theme.of(context).colorScheme.onPrimary, @@ -128,7 +129,7 @@ class _GasRefillDetailsState extends State { backgroundColor: AColors.green, onPressed: () async { _enableEdit = !_enableEdit; - _model.fromGasRefillModel(widget.model); + _model.fromGasRefillModel(widget.model??GasRefillModel()); setState(() {}); }, ), @@ -143,21 +144,21 @@ class _GasRefillDetailsState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ RequestInfoRow( - title: _subtitle.title, - info: _model.title, + title: _subtitle?.title??"", + info: _model.title??"", ), RequestInfoRow( - title: _subtitle.hospital, - info: _model.clientName, + title: _subtitle?.hospital??"", + info: _model.clientName??"", ), _enableEdit ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 8,), - ASubTitle(_subtitle.status), + ASubTitle(_subtitle?.status??""), if(_validate && _model.status == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,), const SizedBox(height: 4,), GasStatusMenu( initialValue: _model.status, @@ -171,13 +172,13 @@ class _GasRefillDetailsState extends State { children: [ Expanded( child: Text( - "${_subtitle.status} : ", + "${_subtitle?.status} : ", style: Theme.of(context).textTheme.subtitle2, textScaleFactor: AppStyle.getScaleFactor(context), ), ), - StatusLabel(label: _model.status.label, - color: AColors.getGasStatusColor(_model.status.id) + StatusLabel(label: _model.status?.label??"", + color: AColors.getGasStatusColor(_model.status?.id??0) ), ], ), @@ -187,9 +188,9 @@ class _GasRefillDetailsState extends State { ListView.builder( shrinkWrap: true, physics: const ClampingScrollPhysics(), - itemCount: _model.details.length, + itemCount: _model.details?.length, itemBuilder: (context,index){ - final details = _model.details[index]; + final details = _model.details![index]; return GasRefillUpdateDetailsItem( details: details, validate: _validate, @@ -202,7 +203,7 @@ class _GasRefillDetailsState extends State { children: [ const SizedBox(height: 16,), AButton( - text: _subtitle.update, + text: _subtitle?.update??"", onPressed: _update, ), ], diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/old_lib/views/pages/user/gas_refill/request_gas_refill.dart similarity index 73% rename from lib/views/pages/user/gas_refill/request_gas_refill.dart rename to old_lib/views/pages/user/gas_refill/request_gas_refill.dart index 8e1f05ca..2e1ae890 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/old_lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -1,28 +1,27 @@ 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/providers/api/gas_refill_provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/subtitle.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/gas_refill/gas_refill_create_details_item.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_size.dart'; -import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; -import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../../controllers/http_status_manger/http_status_manger.dart'; import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/gas_refill_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../controllers/validator/validator.dart'; +import '../../../../models/gas_refill/gas_refill_details.dart'; +import '../../../../models/gas_refill/gas_refill_model.dart'; +import '../../../../models/subtitle.dart'; +import '../../../../models/user.dart'; +import '../../../app_style/sizing.dart'; +import '../../../widgets/app_text_form_field.dart'; +import '../../../widgets/buttons/app_button.dart'; +import '../../../widgets/gas_refill/gas_refill_create_details_item.dart'; +import '../../../widgets/loaders/loading_manager.dart'; +import '../../../widgets/status/gas_refill/gas_type.dart'; +import '../../../widgets/titles/app_sub_title.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; - const RequestGasRefill({Key key}) : super(key: key); + const RequestGasRefill({Key? key}) : super(key: key); @override State createState() => _RequestGasRefillState(); @@ -31,11 +30,11 @@ class RequestGasRefill extends StatefulWidget { class _RequestGasRefillState extends State { bool _isLoading = false; bool _validate = false; - Subtitle _subtitle; - UserProvider _userProvider; - SettingProvider _settingProvider; - GasRefillProvider _gasRefillProvider; - GasRefillDetails _currentDetails = GasRefillDetails(); + Subtitle? _subtitle; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + GasRefillProvider? _gasRefillProvider; + GasRefillDetails _currentDetails = GasRefillDetails(model: null); final TextEditingController _requestedQuantityController = TextEditingController(); final GasRefillModel _formModel = GasRefillModel(details: []); final GlobalKey _formKey = GlobalKey(); @@ -48,23 +47,23 @@ class _RequestGasRefillState extends State { } _onSubmit() async { - if(_formModel.details.isEmpty){ + if((_formModel.details?.isEmpty??false)){ if(!_addNewModel()) return; } _isLoading =true; setState(() {}); - int status = await _gasRefillProvider.createModel( - user: _userProvider.user, - host: _settingProvider.host, + int? status = await _gasRefillProvider?.createModel( + user: _userProvider?.user??User(), + host: _settingProvider?.host??"", model: _formModel, ); _isLoading =false; setState(() {}); - if(status >= 200 && status < 300){ + if(status != null && status >= 200 && status < 300){ Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle?.requestCompleteSuccessfully??"", ); Navigator.of(context).pop(); }else{ @@ -82,22 +81,22 @@ class _RequestGasRefillState extends State { bool _addNewModel(){ _validate = true; - if(!_formKey.currentState.validate()){ + if(!(_formKey.currentState?.validate()??false)){ setState(() {}); return false; } - _formKey.currentState.save(); + _formKey.currentState?.save(); if(!_currentDetails.validate()) { setState(() { }); return false; } - _formModel.details.insert(0,_currentDetails); + _formModel.details?.insert(0,_currentDetails); _validate = false; - Scrollable.ensureVisible(_DetailsKey.currentContext); + Scrollable.ensureVisible(_DetailsKey.currentContext!); _requestedQuantityController.clear(); - _currentDetails = GasRefillDetails(); + _currentDetails = GasRefillDetails(model: null); setState(() {}); return true; } @@ -109,7 +108,7 @@ class _RequestGasRefillState extends State { } @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _gasRefillProvider = Provider.of(context,listen: false); @@ -133,7 +132,7 @@ class _RequestGasRefillState extends State { padding: const EdgeInsets.all(8.0), child: Text( "Request Gas Refill", - style: Theme.of(context).textTheme.headline5.copyWith( + style: Theme.of(context).textTheme.headline5?.copyWith( color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold @@ -171,7 +170,7 @@ class _RequestGasRefillState extends State { const SizedBox(height: 4,), const ASubTitle("Type"), if(_validate && _currentDetails.type == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,), const SizedBox(height: 4,), GasTypeMenu( initialValue: _currentDetails.type, @@ -192,9 +191,9 @@ class _RequestGasRefillState extends State { // }, // ), const SizedBox(height: 8,), - ASubTitle(_subtitle.quantity), + ASubTitle(_subtitle?.quantity??""), if(_validate && _currentDetails.requestedQuantity == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,), SizedBox(height: 4,), ATextFormField( initialValue: (_currentDetails?.requestedQuantity ?? "").toString(), @@ -202,31 +201,31 @@ class _RequestGasRefillState extends State { controller: _requestedQuantityController, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.isNumeric(value) - ? null : "allow numbers only", + Validator.isNumeric(value!) + ? '' : "allow numbers only", textInputType: TextInputType.number, onSaved: (value){ - _currentDetails.requestedQuantity = int.tryParse(value); + _currentDetails.requestedQuantity = int.tryParse(value!); }, ), const SizedBox(height: 16), AButton( - text: _subtitle.add, + text: _subtitle?.add??"", onPressed: _addNewModel, ), - if(_formModel.details.isNotEmpty) + if((_formModel.details?.isNotEmpty??false)) const ASubTitle("Gas Requests"), ListView.builder( key: _DetailsKey, shrinkWrap: true, physics: const ClampingScrollPhysics(), - itemCount: _formModel.details.length, + itemCount: _formModel.details?.length, itemBuilder: (context,index){ - final model = _formModel.details[index]; + final model = _formModel.details![index]; return GasRefillCreateDetailsItem( model: model, onDelete: (){ - _formModel.details.remove(model); + _formModel.details?.remove(model); setState(() {}); }, ); @@ -234,7 +233,7 @@ class _RequestGasRefillState extends State { ), const SizedBox(height: 16), AButton( - text: _subtitle.submit, + text: _subtitle?.submit??"", onPressed: _onSubmit, ), const SizedBox(height: 100,) diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/old_lib/views/pages/user/gas_refill/track_gas_refill.dart similarity index 57% rename from lib/views/pages/user/gas_refill/track_gas_refill.dart rename to old_lib/views/pages/user/gas_refill/track_gas_refill.dart index 713c9530..05f92035 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/old_lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -1,18 +1,21 @@ 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/gas_refill_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/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + +import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/gas_refill_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/subtitle.dart'; +import '../../../../models/user.dart'; +import '../../../app_style/colors.dart'; +import '../../../widgets/buttons/app_back_button.dart'; +import '../../../widgets/gas_refill/gas_refill_list.dart'; +import '../../../widgets/loaders/loading_manager.dart'; + class TrackGasRefillPage extends StatefulWidget { static const String id = "/track-gas-refill"; - const TrackGasRefillPage({Key key}) : super(key: key); + const TrackGasRefillPage({Key? key}) : super(key: key); @override State createState() => _TrackGasRefillPageState(); @@ -20,27 +23,27 @@ class TrackGasRefillPage extends StatefulWidget { class _TrackGasRefillPageState extends State with TickerProviderStateMixin{ - GasRefillProvider _gasRefillProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; + GasRefillProvider? _gasRefillProvider; + UserProvider? _userProvider; + SettingProvider? _settingProvider; @override Widget build(BuildContext context) { _gasRefillProvider = Provider.of(context); _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( body: SafeArea( child: LoadingManager( - isLoading: _gasRefillProvider.isLoading, - isFailedLoading: _gasRefillProvider.items == null, - stateCode: _gasRefillProvider.stateCode, + isLoading: _gasRefillProvider?.isLoading??false, + isFailedLoading: _gasRefillProvider?.items == null, + stateCode: _gasRefillProvider?.stateCode??0, onRefresh: () async { - _gasRefillProvider.reset(); - await _gasRefillProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, + _gasRefillProvider?.reset(); + await _gasRefillProvider?.getRequests( + user: _userProvider?.user??User(), + host: _settingProvider?.host??"", ); }, child: Stack( @@ -58,8 +61,8 @@ class _TrackGasRefillPageState extends State Expanded( child: Center( child: Text( - _subtitle.serviceRequests, - style: Theme.of(context).textTheme.headline6.copyWith( + _subtitle?.serviceRequests??"", + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.grey3A, fontStyle: FontStyle.italic ), @@ -75,14 +78,14 @@ class _TrackGasRefillPageState extends State ), Expanded( child: GasRefillList( - nextPage: _gasRefillProvider.nextPage, + nextPage: _gasRefillProvider?.nextPage??false, onLazyLoad: () async { - await _gasRefillProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, + await _gasRefillProvider?.getRequests( + user: _userProvider?.user??User(), + host: _settingProvider?.host??"", ); }, - items: _gasRefillProvider.items, + items: _gasRefillProvider?.items??[], ), ), ], diff --git a/lib/views/pages/user/land_page.dart b/old_lib/views/pages/user/land_page.dart similarity index 82% rename from lib/views/pages/user/land_page.dart rename to old_lib/views/pages/user/land_page.dart index dd37a8af..cccf3b7f 100644 --- a/lib/views/pages/user/land_page.dart +++ b/old_lib/views/pages/user/land_page.dart @@ -7,58 +7,58 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:package_info/package_info.dart'; import 'package:provider/provider.dart'; import 'package:share/share.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; -import 'package:test_sa/controllers/providers/api/departments_provider.dart'; -import 'package:test_sa/controllers/providers/api/devices_provider.dart'; -import 'package:test_sa/controllers/providers/api/preventive_maintenance_visits_provider.dart'; -import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; -import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; -import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; -import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; -import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; -import 'package:test_sa/views/pages/user/requests/create_request.dart'; -import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/dialogs/dialog.dart'; -import 'package:test_sa/views/widgets/drawer/drawer_item.dart'; import 'package:url_launcher/url_launcher.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/notification/firebase_notification_manger.dart'; +import '../../../controllers/providers/api/departments_provider.dart'; +import '../../../controllers/providers/api/devices_provider.dart'; +import '../../../controllers/providers/api/preventive_maintenance_visits_provider.dart'; +import '../../../controllers/providers/api/regular_visits_provider.dart'; +import '../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../extensions/int_extensions.dart'; +import '../../../extensions/widget_extensions.dart'; +import '../../../models/enums/user_types.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../../widgets/buttons/app_back_button.dart'; +import '../../widgets/buttons/app_icon_button.dart'; +import '../../widgets/dialogs/dialog.dart'; +import '../../widgets/drawer/drawer_item.dart'; import '../../widgets/land_page/land_page_item.dart'; +import '../device_transfer/request_device_transfer.dart'; +import '../device_transfer/track_device_transfer.dart'; +import 'gas_refill/request_gas_refill.dart'; +import 'gas_refill/track_gas_refill.dart'; +import 'notifications/notifications_page.dart'; +import 'requests/create_request.dart'; import 'requests/requests_page.dart'; +import 'visits/regular_visits_page.dart'; class LandPage extends StatefulWidget { static const String id = "/land-page"; - const LandPage({Key key}) : super(key: key); + const LandPage({Key? key}) : super(key: key); @override State createState() => _LandPageState(); } class _LandPageState extends State { - double _height; - double _width; - UserProvider _userProvider; - SettingProvider _settingProvider; - DepartmentsProvider _departmentsProvider; - DevicesProvider _devicesProvider; - double _buttonHeight; - bool firstTime = true; - ServiceRequestsProvider _serviceRequestsProvider; - PreventiveMaintenanceVisitsProvider _preventiveMaintenanceVisitsProvider; - RegularVisitsProvider _regularVisitsProvider; + late double _height; + late double _width; + late UserProvider _userProvider; + late SettingProvider _settingProvider; + late DepartmentsProvider _departmentsProvider; + late DevicesProvider _devicesProvider; + late double _buttonHeight; + late bool firstTime = true; + late ServiceRequestsProvider _serviceRequestsProvider; + late PreventiveMaintenanceVisitsProvider _preventiveMaintenanceVisitsProvider; + late RegularVisitsProvider _regularVisitsProvider; final GlobalKey _scaffoldKey = GlobalKey(); @override @@ -73,7 +73,7 @@ class _LandPageState extends State { @override Widget build(BuildContext context) { - String path = ModalRoute.of(context).settings.arguments; + String path = ModalRoute.of(context)!.settings.arguments.toString(); _height = MediaQuery.of(context).size.height; _width = MediaQuery.of(context).size.width; _settingProvider = Provider.of(context); @@ -83,7 +83,7 @@ class _LandPageState extends State { _serviceRequestsProvider = Provider.of(context); _preventiveMaintenanceVisitsProvider = Provider.of(context); _regularVisitsProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; if (firstTime) { if (path != null) { Navigator.of(context).pushNamed("/" + path.split("/").first, arguments: path.split("/").last); @@ -153,7 +153,7 @@ class _LandPageState extends State { mainAxisSpacing: 12, childAspectRatio: 1, children: [ - if (_userProvider.user.type == UsersTypes.normal_user) + if (_userProvider.user!.type == UsersTypes.normal_user) LandPageItem( text: _subtitle.newServiceRequest, icon: FontAwesomeIcons.tools, @@ -184,7 +184,7 @@ class _LandPageState extends State { // Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id); // }, // ), - if (_userProvider.user.type != UsersTypes.engineer) + if (_userProvider.user?.type != UsersTypes.engineer) LandPageItem( text: "Request Gas Refill", icon: FontAwesomeIcons.truckFast, @@ -250,7 +250,7 @@ class _LandPageState extends State { buttonSize: 42, backgroundColor: AColors.white, onPressed: () { - _scaffoldKey.currentState.openEndDrawer(); + _scaffoldKey.currentState?.openEndDrawer(); }, ), ), @@ -284,8 +284,8 @@ class _LandPageState extends State { ), 12.width, Text( - _userProvider.user.userName, - style: Theme.of(context).textTheme.headline6.copyWith( + _userProvider.user?.userName??"", + style: Theme.of(context).textTheme.headline6?.copyWith( fontWeight: FontWeight.w600, ), textScaleFactor: AppStyle.getScaleFactor(context), @@ -307,11 +307,11 @@ class _LandPageState extends State { focusColor: AColors.grey3A, groupValue: _settingProvider.language, onChanged: (value) { - _settingProvider.setLanguage(value); + _settingProvider.setLanguage(value!); }), Text( "English", - style: Theme.of(context).textTheme.bodyText1.copyWith(color: AColors.grey3A), + style: Theme.of(context).textTheme.bodyText1?.copyWith(color: AColors.grey3A), textScaleFactor: AppStyle.getScaleFactor(context), ), Radio( @@ -320,11 +320,11 @@ class _LandPageState extends State { focusColor: AColors.grey3A, groupValue: _settingProvider.language, onChanged: (value) { - _settingProvider.setLanguage(value); + _settingProvider.setLanguage(value!); }), Text( "عربي", - style: Theme.of(context).textTheme.bodyText1.copyWith(color: AColors.grey3A), + style: Theme.of(context).textTheme.bodyText1?.copyWith(color: AColors.grey3A), textScaleFactor: AppStyle.getScaleFactor(context), ), ], @@ -381,7 +381,7 @@ class _LandPageState extends State { children: [ Text( "Powered By NewTrack", - style: Theme.of(context).textTheme.headline6.copyWith(fontWeight: FontWeight.w500, color: AColors.grey3A, fontSize: 12), + style: Theme.of(context).textTheme.headline6?.copyWith(fontWeight: FontWeight.w500, color: AColors.grey3A, fontSize: 12), textScaleFactor: AppStyle.getScaleFactor(context), ), 6.width, diff --git a/old_lib/views/pages/user/notifications/notifications_list.dart b/old_lib/views/pages/user/notifications/notifications_list.dart new file mode 100644 index 00000000..2a00737e --- /dev/null +++ b/old_lib/views/pages/user/notifications/notifications_list.dart @@ -0,0 +1,46 @@ + +import 'package:flutter/material.dart'; + +import '../../../../controllers/localization/localization.dart'; +import '../../../../models/app_notification.dart'; +import '../../../../models/subtitle.dart'; +import '../../../widgets/loaders/lazy_loading.dart'; +import '../../../widgets/loaders/no_item_found.dart'; +import '../../../widgets/notifications/notification_item.dart'; +import '../requests/future_request_service_details.dart'; +class NotificationsList extends StatelessWidget { + final List? notifications; + final bool? nextPage; + final Future Function()? onLazyLoad; + + const NotificationsList({Key? key, this.notifications, this.nextPage, this.onLazyLoad}) : super(key: key); + + @override + Widget build(BuildContext context) { + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; + if((notifications?.isEmpty??false)){ + return NoItemFound(message: _subtitle?.notificationsNotFound??"",); + } + return LazyLoading( + nextPage: nextPage??false, + onLazyLoad: onLazyLoad??()async{}, + onLoadingEnd: () { }, + child: ListView.builder( + physics: BouncingScrollPhysics(), + itemCount: notifications?.length, + padding: EdgeInsets.symmetric(horizontal: 16,vertical: 8), + itemBuilder: (context,itemIndex){ + return NotificationItem( + notification: notifications![itemIndex], + onPressed: (notification){ + Navigator.of(context).pushNamed( + FutureRequestServiceDetails.id, + arguments: notification.requestId + ); + }, + ); + } + ), + ); + } +} diff --git a/lib/views/pages/user/notifications/notifications_page.dart b/old_lib/views/pages/user/notifications/notifications_page.dart similarity index 55% rename from lib/views/pages/user/notifications/notifications_page.dart rename to old_lib/views/pages/user/notifications/notifications_page.dart index a0e85259..ded4d5f3 100644 --- a/lib/views/pages/user/notifications/notifications_page.dart +++ b/old_lib/views/pages/user/notifications/notifications_page.dart @@ -1,14 +1,17 @@ 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/notifications_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/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/pages/user/notifications/notifications_list.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + +import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/notifications_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/subtitle.dart'; +import '../../../../models/user.dart'; +import '../../../app_style/colors.dart'; +import '../../../widgets/buttons/app_back_button.dart'; +import '../../../widgets/loaders/loading_manager.dart'; +import 'notifications_list.dart'; + class NotificationsPage extends StatefulWidget { static final String id = "/notifications"; @override @@ -17,28 +20,28 @@ class NotificationsPage extends StatefulWidget { class _NotificationsPageState extends State with TickerProviderStateMixin{ - NotificationsProvider _notificationsProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; - Subtitle _subtitle; + NotificationsProvider? _notificationsProvider; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + Subtitle? _subtitle; @override Widget build(BuildContext context) { _notificationsProvider = Provider.of(context); _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( body: SafeArea( child: LoadingManager( - isLoading: _notificationsProvider.isLoading, - isFailedLoading: _notificationsProvider.notifications == null, - stateCode: _notificationsProvider.stateCode, + isLoading: _notificationsProvider?.isLoading??false, + isFailedLoading: _notificationsProvider?.notifications == null, + stateCode: _notificationsProvider?.stateCode??0, onRefresh: () async { - _notificationsProvider.reset(); - await _notificationsProvider.getNotifications( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + _notificationsProvider?.reset(); + await _notificationsProvider?.getNotifications( + user: _userProvider?.user??User(), + host: _settingProvider?.host??"", + hospitalId: _userProvider?.user?.hospital?.id??"", ); }, child: Stack( @@ -56,8 +59,8 @@ class _NotificationsPageState extends State Expanded( child: Center( child: Text( - _subtitle.notifications, - style: Theme.of(context).textTheme.headline6.copyWith( + _subtitle?.notifications??"", + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontStyle: FontStyle.italic ), @@ -73,15 +76,15 @@ class _NotificationsPageState extends State ), Expanded( child: NotificationsList( - nextPage: _notificationsProvider.nextPage, + nextPage: _notificationsProvider?.nextPage, onLazyLoad: () async { - await _notificationsProvider.getNotifications( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + await _notificationsProvider?.getNotifications( + user: _userProvider?.user??User(), + host: _settingProvider?.host??"", + hospitalId: _userProvider?.user?.hospital?.id??"", ); }, - notifications: _notificationsProvider.notifications, + notifications: _notificationsProvider?.notifications, ), ), ], diff --git a/lib/views/pages/user/profile_page.dart b/old_lib/views/pages/user/profile_page.dart similarity index 80% rename from lib/views/pages/user/profile_page.dart rename to old_lib/views/pages/user/profile_page.dart index 514655e9..4d8e18f8 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/old_lib/views/pages/user/profile_page.dart @@ -1,21 +1,22 @@ -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/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/user.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_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/departments/department_button.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; + +import '../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../controllers/validator/validator.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../../widgets/app_text_form_field.dart'; +import '../../widgets/buttons/app_back_button.dart'; +import '../../widgets/buttons/app_button.dart'; +import '../../widgets/departments/department_button.dart'; +import '../../widgets/hospitals/hospital_button.dart'; +import '../../widgets/loaders/loading_manager.dart'; class ProfilePage extends StatefulWidget { static final String id = "/user/profile"; @override @@ -23,10 +24,10 @@ class ProfilePage extends StatefulWidget { } class _ProfilePageState extends State { - UserProvider _userProvider; - SettingProvider _settingProvider; - double _width; - double _height; + late UserProvider _userProvider; + late SettingProvider _settingProvider; + late double _width; + late double _height; User _user = User(); bool _firstTime = true; final GlobalKey _formKey = GlobalKey(); @@ -37,9 +38,9 @@ class _ProfilePageState extends State { _settingProvider = Provider.of(context); _width = MediaQuery.of(context).size.width; _height = MediaQuery.of(context).size.height; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; if(_firstTime){ - _user = User.fromJson(_userProvider.user.toJson()); + _user = User.fromJson(_userProvider.user!.toJson()); _firstTime = false; } return Scaffold( @@ -85,10 +86,10 @@ class _ProfilePageState extends State { enable: false, prefixIconData: Icons.account_circle, style: Theme.of(context).textTheme.headline6, - validator: (value) => Validator.hasValue(value) - ? null : _subtitle.nameValidateMessage, + validator: (value) => Validator.hasValue(value!) + ? '' : _subtitle.nameValidateMessage, onSaved: (value){ - _user.userName = value; + _user.userName = value!; }, ), SizedBox(height: 8,), @@ -99,16 +100,16 @@ class _ProfilePageState extends State { prefixIconData: Icons.email, textInputType: TextInputType.emailAddress, style: Theme.of(context).textTheme.headline6, - validator: (value) => Validator.isEmail(value) - ? null : _subtitle.emailValidateMessage, + validator: (value) => Validator.isEmail(value!) + ? '' : _subtitle.emailValidateMessage, onSaved: (value){ - _user.email = value; + _user.email = value!; }, ), SizedBox(height: 8,), AbsorbPointer( child: HospitalButton( - hospital: _user.hospital, + hospital: _user.hospital!, onHospitalPick: (hospital){ _user.hospital = hospital; setState(() {}); @@ -130,7 +131,7 @@ class _ProfilePageState extends State { style: Theme.of(context).textTheme.headline6, prefixIconData: Icons.phone_android, validator: (value) => - Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + Validator.isPhoneNumber(value!) ? '' : _subtitle.phoneNumberValidateMessage, textInputType: TextInputType.phone, onSaved: (value){ _user.phoneNumber = value; @@ -144,7 +145,7 @@ class _ProfilePageState extends State { prefixIconData: FontAwesomeIcons.whatsapp, prefixIconSize: 36, validator: (value) => - Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + Validator.isPhoneNumber(value!) ? '' : _subtitle.phoneNumberValidateMessage, textInputType: TextInputType.phone, onSaved: (value){ _user.whatsApp = value; @@ -161,9 +162,9 @@ class _ProfilePageState extends State { child: AButton( text: _subtitle.update, onPressed: () async { - if(!_formKey.currentState.validate()) + if(!(_formKey.currentState?.validate()??false)) return; - _formKey.currentState.save(); + _formKey.currentState?.save(); if(_user.department?.id == null){ ScaffoldMessenger.of(context).showSnackBar( SnackBar( @@ -176,10 +177,10 @@ class _ProfilePageState extends State { } int status = await _userProvider.updateProfile( user: _user, - host: _settingProvider.host, + host: _settingProvider.host!, ); if(status >= 200 && status < 300){ - _settingProvider.setUser(_userProvider.user); + _settingProvider.setUser(_userProvider.user!); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( diff --git a/lib/views/pages/user/report_issues_page.dart b/old_lib/views/pages/user/report_issues_page.dart similarity index 78% rename from lib/views/pages/user/report_issues_page.dart rename to old_lib/views/pages/user/report_issues_page.dart index a1641b24..64154fba 100644 --- a/lib/views/pages/user/report_issues_page.dart +++ b/old_lib/views/pages/user/report_issues_page.dart @@ -1,26 +1,29 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/issue.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.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_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/issues/report_issue_item.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../controllers/validator/validator.dart'; +import '../../../models/issue.dart'; +import '../../../models/service_request/service_request.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../../widgets/app_text_form_field.dart'; +import '../../widgets/buttons/app_back_button.dart'; +import '../../widgets/buttons/app_button.dart'; +import '../../widgets/issues/report_issue_item.dart'; +import '../../widgets/loaders/loading_manager.dart'; + class ReportIssuesPage extends StatefulWidget { static final String id = "/report-issue"; final ServiceRequest serviceRequest; - const ReportIssuesPage({Key key, this.serviceRequest}) : super(key: key); + const ReportIssuesPage({Key? key, required this.serviceRequest}) : super(key: key); @override _ReportIssuesPageState createState() => _ReportIssuesPageState(); } @@ -28,15 +31,15 @@ class ReportIssuesPage extends StatefulWidget { class _ReportIssuesPageState extends State { List _issues = []; Issue _issue = Issue(reports: []); - double _height; + late double _height; bool _isLoading = false; - ServiceRequestsProvider _serviceRequestsProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; + late ServiceRequestsProvider _serviceRequestsProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; final GlobalKey _formKey = GlobalKey(); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; _serviceRequestsProvider = Provider.of(context); _userProvider = Provider.of(context); _settingProvider = Provider.of(context); @@ -64,7 +67,7 @@ class _ReportIssuesPageState extends State { ), child: Text( _subtitle.reportIssue, - style: Theme.of(context).textTheme.headline5.copyWith( + style: Theme.of(context).textTheme.headline5?.copyWith( color: AColors.cyan, fontWeight: FontWeight.bold ), @@ -103,8 +106,8 @@ class _ReportIssuesPageState extends State { textAlign: TextAlign.center, style: Theme.of(context).textTheme.headline6, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.titleValidateMessage, + Validator.hasValue(value!) + ? '' : _subtitle.titleValidateMessage, textInputType: TextInputType.name, onSaved: (value){ _issue.title = value; @@ -115,13 +118,13 @@ class _ReportIssuesPageState extends State { children: List.generate( _issues.length, (index) => ReportIssueItem( - isSelected: _issue.reports.contains(index), + isSelected: _issue.reports?.contains(index), issueInfo: _issues[index], onChange: (info,value){ if(value){ - _issue.reports.add(index); + _issue.reports?.add(index); } else { - _issue.reports.remove(index); + _issue.reports?.remove(index); } setState(() {}); }, @@ -148,15 +151,15 @@ class _ReportIssuesPageState extends State { child: AButton( text: _subtitle.submit, onPressed: () async { - if(!_formKey.currentState.validate()) + if(!(_formKey.currentState?.validate()??false)) return; - _formKey.currentState.save(); + _formKey.currentState?.save(); _issue.serviceRequestId = widget.serviceRequest.id; _isLoading =true; setState(() {}); int status = await _serviceRequestsProvider.createIssueReport( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user??User(), + host: _settingProvider.host??"", issue: _issue, ); _isLoading =false; diff --git a/lib/views/pages/user/requests/create_request.dart b/old_lib/views/pages/user/requests/create_request.dart similarity index 76% rename from lib/views/pages/user/requests/create_request.dart rename to old_lib/views/pages/user/requests/create_request.dart index 86b819e8..b39505ee 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/old_lib/views/pages/user/requests/create_request.dart @@ -5,29 +5,31 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.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/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/equipment/device_button.dart'; -import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/sound/record_sound.dart'; -import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; -import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; -import 'package:test_sa/views/widgets/status/service_request/service_request_priority_mune.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../controllers/validator/validator.dart'; +import '../../../../extensions/int_extensions.dart'; +import '../../../../extensions/widget_extensions.dart'; +import '../../../../models/device/device.dart'; +import '../../../../models/service_request/service_request.dart'; +import '../../../../models/subtitle.dart'; +import '../../../app_style/colors.dart'; +import '../../../widgets/app_text_form_field.dart'; +import '../../../widgets/buttons/app_back_button.dart'; +import '../../../widgets/buttons/app_button.dart'; +import '../../../widgets/equipment/device_button.dart'; +import '../../../widgets/images/multi_image_picker.dart'; +import '../../../widgets/loaders/loading_manager.dart'; +import '../../../widgets/sound/record_sound.dart'; +import '../../../widgets/speech_to_text/speech_to_text.dart'; +import '../../../widgets/status/service_request/service_request_defect_types_mune.dart'; +import '../../../widgets/status/service_request/service_request_priority_mune.dart'; +import '../../../widgets/titles/app_sub_title.dart'; + class CreateRequestPage extends StatefulWidget { static final String id = "/create-request"; @@ -37,18 +39,18 @@ class CreateRequestPage extends StatefulWidget { } class _CreateRequestPageState extends State { - double _height; - UserProvider _userProvider; - SettingProvider _settingProvider; - ServiceRequestsProvider _serviceRequestsProvider; + late double _height; + late UserProvider _userProvider; + late SettingProvider _settingProvider; + late ServiceRequestsProvider _serviceRequestsProvider; ServiceRequest _serviceRequest = ServiceRequest(); List _deviceImages = []; bool _isLoading = false; - Device _device; - Subtitle _subtitle; + late Device _device; + late Subtitle _subtitle; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - TextEditingController _controller; + late TextEditingController _controller; @override void initState() { @@ -68,7 +70,7 @@ class _CreateRequestPageState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)!.subtitle!; return Scaffold( key: _scaffoldKey, body: SafeArea( @@ -99,7 +101,7 @@ class _CreateRequestPageState extends State { padding: const EdgeInsets.all(8.0), child: Text( _subtitle.newServiceRequest, - style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.w600), + style: Theme.of(context).textTheme.headline5?.copyWith(color: AColors.cyan, fontWeight: FontWeight.w600), ), ), ), @@ -107,21 +109,21 @@ class _CreateRequestPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ 12.height, - _userProvider.user.hospital == null + _userProvider.user?.hospital == null ? SizedBox.shrink() : ATextFormField( enable: false, - initialValue: _userProvider.user.hospital?.name ?? _subtitle.noHospitalFound, + initialValue: _userProvider.user?.hospital?.name ?? _subtitle.noHospitalFound, hintText: _subtitle.hospital, prefixIconData: FontAwesomeIcons.hospital, style: Theme.of(context).textTheme.subtitle1, ), 12.height, - _userProvider.user.department == null + _userProvider.user?.department == null ? SizedBox.shrink() : ATextFormField( enable: false, - initialValue: _userProvider.user.department?.name ?? _subtitle.noUniteFound, + initialValue: _userProvider.user?.department?.name ?? _subtitle.noUniteFound, hintText: _subtitle.unite, prefixIconData: FontAwesomeIcons.hospitalUser, style: Theme.of(context).textTheme.subtitle1, @@ -167,7 +169,7 @@ class _CreateRequestPageState extends State { prefixIconData: FontAwesomeIcons.triangleExclamation, style: Theme.of(context).textTheme.headline6, textInputType: TextInputType.multiline, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.maintenanceIssueRequired, + validator: (value) => Validator.hasValue(value!) ? '' : _subtitle.maintenanceIssueRequired, onSaved: (value) { _serviceRequest.maintenanceIssue = value; }, @@ -184,19 +186,19 @@ class _CreateRequestPageState extends State { child: AButton( text: _subtitle.submit, onPressed: () async { - if (!_formKey.currentState.validate()) return; - _formKey.currentState.save(); + if (!(_formKey.currentState?.validate()??false)) return; + _formKey.currentState?.save(); _serviceRequest.deviceId = _device?.id ?? ""; _isLoading = true; setState(() {}); _serviceRequest.devicePhotos = _deviceImages.map((e) => base64Encode(e.readAsBytesSync())).toList(); if (_serviceRequest.audio != null) { - final file = File(_serviceRequest.audio); + final file = File(_serviceRequest.audio!); _serviceRequest.audio = base64Encode(file.readAsBytesSync()); } int status = await _serviceRequestsProvider.createRequest( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user!, + host: _settingProvider.host??"", serviceRequest: _serviceRequest, ); _isLoading = false; diff --git a/lib/views/pages/user/requests/future_request_service_details.dart b/old_lib/views/pages/user/requests/future_request_service_details.dart similarity index 56% rename from lib/views/pages/user/requests/future_request_service_details.dart rename to old_lib/views/pages/user/requests/future_request_service_details.dart index 7f56dd5f..f5688090 100644 --- a/lib/views/pages/user/requests/future_request_service_details.dart +++ b/old_lib/views/pages/user/requests/future_request_service_details.dart @@ -1,14 +1,16 @@ -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_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/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/pages/user/requests/request_details.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; -import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; + +import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/service_request/service_request.dart'; +import '../../../../models/subtitle.dart'; +import '../../../widgets/loaders/app_loading.dart'; +import '../../../widgets/loaders/failed_loading.dart'; +import 'request_details.dart'; class FutureRequestServiceDetails extends StatefulWidget { static final String id = "/service-request-details"; @@ -18,20 +20,20 @@ class FutureRequestServiceDetails extends StatefulWidget { class _FutureRequestServiceDetailsState extends State { - UserProvider _userProvider; - SettingProvider _settingProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; @override Widget build(BuildContext context) { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - String requestId = ModalRoute.of(context).settings.arguments; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + String requestId = ModalRoute.of(context)!.settings.arguments.toString(); + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; return Scaffold( body: FutureBuilder( future: ServiceRequestsProvider().getSingleServiceRequest( requestId: requestId, - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user!, + host: _settingProvider.host??"", subtitle: _subtitle ), builder: (BuildContext context, AsyncSnapshot snapshot){ @@ -42,7 +44,7 @@ class _FutureRequestServiceDetailsState extends State _CreateServiceReportState(); } @@ -49,16 +49,16 @@ class CreateServiceReport extends StatefulWidget { class _CreateServiceReportState extends State with TickerProviderStateMixin{ - UserProvider _userProvider; - SettingProvider _settingProvider; - ServiceRequestsProvider _serviceRequestsProvider; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + ServiceRequestsProvider? _serviceRequestsProvider; bool _validate = false; - ServiceReport _serviceReport; + ServiceReport? _serviceReport; bool _isLoading = false; - Subtitle _subtitle; - File _image; + Subtitle? _subtitle; + File? _image; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); TextEditingController _faultController = TextEditingController(); @@ -70,8 +70,8 @@ class _CreateServiceReportState extends State with TickerPr visitDate: DateTime.now(), type: const Lookup(id: 2), device: Device( - id: widget.request.deviceId, - serialNumber: widget.request.deviceSerialNumber, + id: widget.request?.deviceId, + serialNumber: widget.request?.deviceSerialNumber, ), parts: [] ); @@ -89,7 +89,7 @@ class _CreateServiceReportState extends State with TickerPr _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( key: _scaffoldKey, body: SafeArea( @@ -110,8 +110,8 @@ class _CreateServiceReportState extends State with TickerPr child: Padding( padding: const EdgeInsets.all(8.0), child: Text( - _subtitle.newServiceReport, - style: Theme.of(context).textTheme.headline5.copyWith( + _subtitle?.newServiceReport??"", + style: Theme.of(context).textTheme.headline5?.copyWith( color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold @@ -139,12 +139,12 @@ class _CreateServiceReportState extends State with TickerPr Wrap( spacing: 10, children: [ - ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,), - widget.request.deviceSerialNumber == null ? const SizedBox(): - ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), + ASubTitle("${_subtitle?.callId}: ${widget.request?.requestCode}",font: 14,), + widget.request?.deviceSerialNumber == null ? const SizedBox(): + ASubTitle("${_subtitle?.deviceSN}: ${widget.request?.deviceSerialNumber}",font: 14,), Text( - "${_subtitle.customer}: ${widget.request.hospitalName}", - style: Theme.of(context).textTheme.subtitle1.copyWith( + "${_subtitle?.customer}: ${widget.request?.hospitalName}", + style: Theme.of(context).textTheme.subtitle1?.copyWith( fontWeight: FontWeight.bold, fontSize: 12, ), @@ -183,19 +183,19 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): + ASubTitle(_subtitle?.visitDate??""), + _validate && _serviceReport?.visitDate == null ? + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,): const SizedBox.shrink(), Row( children: [ Expanded( child: ADatePicker( - date: _serviceReport.visitDate, + date: _serviceReport?.visitDate??DateTime.now(), from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), onDatePicker: (date){ - _serviceReport.visitDate = date; + _serviceReport?.visitDate = date; setState(() {}); }, ), @@ -211,19 +211,19 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox(height: 8,), // device sn Visibility( - visible: widget.request.deviceSerialNumber == null, + visible: widget.request?.deviceSerialNumber == null, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): + ASubTitle(_subtitle?.deviceSN??""), + _validate && _serviceReport?.device?.id == null ? + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,): const SizedBox.shrink(), AutoCompleteDeviceField( - hospitalId: widget.request.hospitalId, - initialValue: _serviceReport.device, + hospitalId: widget.request?.hospitalId??"", + initialValue: _serviceReport!.device!, onPick: (id){ - _serviceReport.device.id = id; + _serviceReport?.device?.id = id; }, ), const SizedBox(height: 8,), @@ -231,15 +231,15 @@ class _CreateServiceReportState extends State with TickerPr ), ), const SizedBox(height: 8,), - ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.serviceType == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): + ASubTitle(_subtitle?.serviceType??""), + _validate && _serviceReport?.serviceType == null ? + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,): const SizedBox.shrink(), const SizedBox(height: 4,), ServiceStatusMenu( - initialValue: _serviceReport.serviceType, + initialValue: _serviceReport?.serviceType, onSelect: (status){ - _serviceReport.serviceType = status; + _serviceReport?.serviceType = status; }, ), const SizedBox(height: 8,), @@ -251,15 +251,15 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): + ASubTitle(_subtitle?.reportStatus??""), + _validate && _serviceReport?.status == null ? + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,): const SizedBox.shrink(), const SizedBox(height: 4,), ServiceReportStatusMenu( report: _serviceReport, onSelect: (status){ - _serviceReport.status = status; + _serviceReport?.status = status; }, ), ], @@ -274,20 +274,20 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): + ASubTitle(_subtitle?.callLastSituation??""), + _validate && _serviceReport?.callLastSituation == null ? + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,): const SizedBox.shrink(), const SizedBox(height: 4,), ServiceReportLastCallsMenu( report: _serviceReport, onSelect: (status){ if(status?.id == 12 - || _serviceReport.callLastSituation?.id == 12){ - _serviceReport.callLastSituation = status; + || _serviceReport?.callLastSituation?.id == 12){ + _serviceReport?.callLastSituation = status; setState(() {}); } else { - _serviceReport.callLastSituation = status; + _serviceReport?.callLastSituation = status; } }, ), @@ -298,25 +298,25 @@ class _CreateServiceReportState extends State with TickerPr ), const SizedBox(height: 8,), // invoice number & code - _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): + _serviceReport?.callLastSituation?.id != 12 ? const SizedBox.shrink(): Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.invoiceNumber), + ASubTitle(_subtitle?.invoiceNumber??""), const SizedBox(height: 8,), ATextFormField( - initialValue: _serviceReport?.invoiceNumber, + initialValue: _serviceReport?.invoiceNumber??"", textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, + Validator.hasValue(value!) + ? '' : _subtitle?.requiredWord??"", textInputType: TextInputType.number, onSaved: (value){ - _serviceReport.invoiceNumber = value; + _serviceReport?.invoiceNumber = value; }, ), ], @@ -327,18 +327,18 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.invoiceCode), + ASubTitle(_subtitle?.invoiceCode??""), const SizedBox(height: 4,), ATextFormField( - initialValue: _serviceReport?.invoiceCode, + initialValue: _serviceReport?.invoiceCode??"", textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, + Validator.hasValue(value!) + ? '' : _subtitle?.requiredWord??"", textInputType: TextInputType.text, onSaved: (value){ - _serviceReport.invoiceCode = value; + _serviceReport?.invoiceCode = value; }, ), ], @@ -350,7 +350,7 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox(height: 8,), Row( children: [ - ASubTitle(_subtitle.faultDescription), + ASubTitle(_subtitle?.faultDescription??""), Expanded( child: SizedBox( height: 32 * AppStyle.getScaleFactor(context), @@ -364,22 +364,22 @@ class _CreateServiceReportState extends State with TickerPr ), const SizedBox(height: 4,), ATextFormField( - initialValue: _serviceReport?.faultDescription, + initialValue: _serviceReport?.faultDescription??"", textAlign: TextAlign.center, controller: _faultController, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, + Validator.hasValue(value!) + ? '' : _subtitle?.requiredWord??"", textInputType: TextInputType.multiline, onSaved: (value){ - _serviceReport.faultDescription = value; + _serviceReport?.faultDescription = value; }, ), const SizedBox(height: 8,), Row( children: [ - ASubTitle(_subtitle.workPreformed), + ASubTitle(_subtitle?.workPreformed??""), Expanded( child: SizedBox( height: 32 * AppStyle.getScaleFactor(context), @@ -393,16 +393,16 @@ class _CreateServiceReportState extends State with TickerPr ), const SizedBox(height: 4,), ATextFormField( - initialValue: _serviceReport?.workPreformed, + initialValue: _serviceReport?.workPreformed??"", textAlign: TextAlign.center, controller: _workPreformedController, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, + Validator.hasValue(value!) + ? '' : _subtitle?.requiredWord??"", textInputType: TextInputType.multiline, onSaved: (value){ - _serviceReport.workPreformed = value; + _serviceReport?.workPreformed = value; }, ), const SizedBox(height: 8,), @@ -415,12 +415,12 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reasons), + ASubTitle(_subtitle?.reasons??""), const SizedBox(height: 4,), ServiceReportReasonsMenu( - initialValue: _serviceReport.reason, + initialValue: _serviceReport?.reason, onSelect: (status){ - _serviceReport.reason = status; + _serviceReport?.reason = status; }, ), ], @@ -431,13 +431,13 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.attachImage), + ASubTitle(_subtitle?.attachImage??""), AMiniOneImagePicker( //error: _validate && _serviceReport.image == null, image: _image, onPick: (image){ _image =image; - _serviceReport.image = base64Encode(image.readAsBytesSync()); + _serviceReport?.image = base64Encode(image.readAsBytesSync()); }, ), ], @@ -453,12 +453,12 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.workingHours), + ASubTitle(_subtitle?.workingHours??""), const SizedBox(height: 8,), AppTimer( - timer: _serviceReport.timer, + timer: _serviceReport?.timer, onChange: (timer) async{ - _serviceReport.timer = timer; + _serviceReport?.timer = timer; return true; }, ), @@ -483,7 +483,7 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.travelingHours), + ASubTitle(_subtitle?.travelingHours??""), const SizedBox(height: 4,), ATextFormField( initialValue: _serviceReport?.travelingHours, @@ -495,7 +495,7 @@ class _CreateServiceReportState extends State with TickerPr // ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value){ - _serviceReport.travelingHours = value; + _serviceReport?.travelingHours = value; }, ), ], @@ -534,7 +534,7 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.jobSheetNumber), + ASubTitle(_subtitle?.jobSheetNumber??""), const SizedBox(height: 4,), ATextFormField( initialValue: _serviceReport?.jobSheetNumber, @@ -542,7 +542,7 @@ class _CreateServiceReportState extends State with TickerPr style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.name, onSaved: (value){ - _serviceReport.jobSheetNumber = value; + _serviceReport?.jobSheetNumber = value; }, ), ], @@ -559,14 +559,14 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.partNumber), - _validate && _serviceReport.parts == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): + ASubTitle(_subtitle?.partNumber??""), + _validate && _serviceReport?.parts == null ? + ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,): const SizedBox.shrink(), const SizedBox(height: 4,), AutoCompletePartsField( onPick: (part){ - _serviceReport.parts.add(part); + _serviceReport?.parts?.add(part); }, ), ], @@ -578,19 +578,19 @@ class _CreateServiceReportState extends State with TickerPr SizedBox(height: 8*AppStyle.getScaleFactor(context),), Row( children: [ - Expanded(flex:3,child: Text(_subtitle.number)), - Expanded(flex: 1,child: Text(_subtitle.quantity)), + Expanded(flex:3,child: Text(_subtitle?.number??"")), + Expanded(flex: 1,child: Text(_subtitle?.quantity??"")), ], ), Column( children: List.generate( - _serviceReport.parts.length, + _serviceReport!.parts!.length, (index) { - Part _part = _serviceReport.parts[index]; + Part _part = _serviceReport!.parts![index]; return PartItem( part: _part, onDelete: (part){ - _serviceReport.parts.remove(part); + _serviceReport!.parts!.remove(part); setState(() {}); }, ); @@ -606,30 +606,30 @@ class _CreateServiceReportState extends State with TickerPr Padding( padding: const EdgeInsets.all(16.0), child: AButton( - text: _subtitle.submit, + text: _subtitle?.submit??"", onPressed: () async { _validate = true; - if(!_formKey.currentState.validate()){ + if(!(_formKey.currentState?.validate()??false)){ setState(() {}); return; } - if(!_serviceReport.validate()) return; - _formKey.currentState.save(); + if(!(_serviceReport?.validate()??false)) return; + _formKey.currentState?.save(); _isLoading =true; setState(() {}); - int status = await _serviceRequestsProvider.createServiceReport( - user: _userProvider.user, - host: _settingProvider.host, - report: _serviceReport, - request: widget.request + int? status = await _serviceRequestsProvider?.createServiceReport( + user: _userProvider!.user!, + host: _settingProvider?.host??"", + report: _serviceReport!, + request: widget.request! ); _isLoading =false; setState(() {}); - if(status >= 200 && status < 300){ + if(status != null && status >= 200 && status < 300){ Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle?.requestCompleteSuccessfully??"", ); Navigator.of(context).pop(); Navigator.of(context).pop(); diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/old_lib/views/pages/user/requests/report/edit_service_report.dart similarity index 88% rename from lib/views/pages/user/requests/report/edit_service_report.dart rename to old_lib/views/pages/user/requests/report/edit_service_report.dart index 0b268fc7..d4254887 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/old_lib/views/pages/user/requests/report/edit_service_report.dart @@ -5,42 +5,44 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.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/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/part.dart'; -import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.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_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; -import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; -import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; -import 'package:test_sa/views/widgets/status/report/service_status.dart'; -import 'package:test_sa/views/widgets/timer/app_timer.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../../../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../../../controllers/localization/localization.dart'; +import '../../../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; +import '../../../../../controllers/providers/api/user_provider.dart'; +import '../../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../../controllers/validator/validator.dart'; +import '../../../../../models/part.dart'; +import '../../../../../models/service_report.dart'; +import '../../../../../models/service_request/service_request.dart'; +import '../../../../../models/subtitle.dart'; +import '../../../../app_style/colors.dart'; +import '../../../../app_style/sizing.dart'; +import '../../../../widgets/app_text_form_field.dart'; +import '../../../../widgets/buttons/app_back_button.dart'; +import '../../../../widgets/buttons/app_button.dart'; +import '../../../../widgets/date_and_time/date_picker.dart'; +import '../../../../widgets/equipment/auto_complete_devices_field.dart'; +import '../../../../widgets/images/mini_one_image_picker.dart'; +import '../../../../widgets/loaders/loading_manager.dart'; +import '../../../../widgets/parts/auto_complete_parts_field.dart'; +import '../../../../widgets/parts/part_item.dart'; +import '../../../../widgets/speech_to_text/speech_to_text.dart'; +import '../../../../widgets/status/report/service_report_last_call.dart'; +import '../../../../widgets/status/report/service_report_reasons.dart'; +import '../../../../widgets/status/report/service_report_status.dart'; +import '../../../../widgets/status/report/service_report_type.dart'; +import '../../../../widgets/status/report/service_status.dart'; +import '../../../../widgets/timer/app_timer.dart'; +import '../../../../widgets/titles/app_sub_title.dart'; + class EditServiceReport extends StatefulWidget { static final String id = "/edit-service-report"; final ServiceRequest request ; final ServiceReport report; - const EditServiceReport({Key key, this.request, this.report}) : super(key: key); + const EditServiceReport({Key? key, required this.request, required this.report}) : super(key: key); @override _EditServiceReportState createState() => _EditServiceReportState(); } @@ -48,16 +50,16 @@ class EditServiceReport extends StatefulWidget { class _EditServiceReportState extends State with TickerProviderStateMixin{ - UserProvider _userProvider; - SettingProvider _settingProvider; - ServiceRequestsProvider _serviceRequestsProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; + late ServiceRequestsProvider _serviceRequestsProvider; bool _validate = false; - ServiceReport _serviceReport; + late ServiceReport _serviceReport; bool _isLoading = false; - Subtitle _subtitle; - File _image; + late Subtitle _subtitle; + late File _image; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); TextEditingController _faultController = TextEditingController(); @@ -80,7 +82,7 @@ class _EditServiceReportState extends State with TickerProvid _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)!.subtitle!; return Scaffold( key: _scaffoldKey, body: SafeArea( @@ -102,7 +104,7 @@ class _EditServiceReportState extends State with TickerProvid padding: const EdgeInsets.all(8.0), child: Text( _subtitle.editServiceReport, - style: Theme.of(context).textTheme.headline5.copyWith( + style: Theme.of(context).textTheme.headline5?.copyWith( color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold @@ -117,7 +119,7 @@ class _EditServiceReportState extends State with TickerProvid color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ - const BoxShadow( + BoxShadow( color: AColors.grey, offset: Offset(0,-1), ) @@ -135,7 +137,7 @@ class _EditServiceReportState extends State with TickerProvid ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), Text( "${_subtitle.customer}: ${widget.request.hospitalName}", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.subtitle1?.copyWith( fontWeight: FontWeight.bold, fontSize: 12, ), @@ -212,9 +214,9 @@ class _EditServiceReportState extends State with TickerProvid const SizedBox.shrink(), AutoCompleteDeviceField( hospitalId: widget.request.hospitalId, - initialValue: _serviceReport.device, + initialValue: _serviceReport.device!, onPick: (id){ - _serviceReport.device.id = id; + _serviceReport.device?.id = id; }, ), const SizedBox(height: 8,), @@ -303,8 +305,8 @@ class _EditServiceReportState extends State with TickerProvid textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, + Validator.hasValue(value!) + ? '' : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value){ _serviceReport.invoiceNumber = value; @@ -325,8 +327,8 @@ class _EditServiceReportState extends State with TickerProvid textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, + Validator.hasValue(value!) + ? '' : _subtitle.requiredWord, textInputType: TextInputType.text, onSaved: (value){ _serviceReport.invoiceCode = value; @@ -360,8 +362,8 @@ class _EditServiceReportState extends State with TickerProvid controller: _faultController, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, + Validator.hasValue(value!) + ? '' : _subtitle.requiredWord, textInputType: TextInputType.multiline, onSaved: (value){ _serviceReport.faultDescription = value; @@ -389,8 +391,8 @@ class _EditServiceReportState extends State with TickerProvid controller: _workPreformedController, style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, + Validator.hasValue(value!) + ? '' : _subtitle.requiredWord, textInputType: TextInputType.multiline, onSaved: (value){ _serviceReport.workPreformed = value; @@ -482,8 +484,8 @@ class _EditServiceReportState extends State with TickerProvid hintText: "i.e 3, 3.5, 4", style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, + Validator.isNumeric(value!) + ? '' : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value){ _serviceReport.travelingHours = value; @@ -510,8 +512,8 @@ class _EditServiceReportState extends State with TickerProvid hintText: "i.e 3, 3.5, 4", style: Theme.of(context).textTheme.subtitle1, validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, + Validator.isNumeric(value!) + ? '' : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value){ _serviceReport.operatingHours = value; @@ -557,7 +559,7 @@ class _EditServiceReportState extends State with TickerProvid const SizedBox(height: 4,), AutoCompletePartsField( onPick: (part){ - _serviceReport.parts.add(part); + _serviceReport.parts?.add(part); setState(() {}); }, ), @@ -576,13 +578,13 @@ class _EditServiceReportState extends State with TickerProvid ), Column( children: List.generate( - _serviceReport.parts.length, + _serviceReport.parts!.length, (index) { - Part _part = _serviceReport.parts[index]; + Part _part = _serviceReport.parts![index]; return PartItem( part: _part, onDelete: (part){ - _serviceReport.parts.remove(part); + _serviceReport.parts?.remove(part); setState(() {}); }, ); @@ -601,7 +603,7 @@ class _EditServiceReportState extends State with TickerProvid text: _subtitle.update, onPressed: () async { _validate = true; - if(!_formKey.currentState.validate()){ + if(!(_formKey.currentState?.validate()??false)){ setState(() {}); return; } @@ -609,14 +611,14 @@ class _EditServiceReportState extends State with TickerProvid setState(() {}); return; } - _formKey.currentState.save(); + _formKey.currentState?.save(); _isLoading =true; setState(() {}); int status = await _serviceRequestsProvider.updateServiceReport( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user!, + host: _settingProvider.host??"", report: _serviceReport, request: widget.request ); diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/old_lib/views/pages/user/requests/report/future_service_report.dart similarity index 55% rename from lib/views/pages/user/requests/report/future_service_report.dart rename to old_lib/views/pages/user/requests/report/future_service_report.dart index 5ee16ea2..657ffac0 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/old_lib/views/pages/user/requests/report/future_service_report.dart @@ -1,20 +1,20 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_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/service_report.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; -import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; +import '../../../../../controllers/localization/localization.dart'; +import '../../../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../../../controllers/providers/api/user_provider.dart'; +import '../../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../../models/service_report.dart'; +import '../../../../../models/service_request/service_request.dart'; +import '../../../../../models/subtitle.dart'; +import '../../../../widgets/loaders/app_loading.dart'; +import '../../../../widgets/loaders/failed_loading.dart'; import 'edit_service_report.dart'; class FutureServiceReport extends StatefulWidget { final ServiceRequest request; - const FutureServiceReport({Key key, this.request}) : super(key: key); + const FutureServiceReport({Key? key, required this.request}) : super(key: key); @override _FutureServiceReportState createState() => _FutureServiceReportState(); @@ -22,19 +22,19 @@ class FutureServiceReport extends StatefulWidget { class _FutureServiceReportState extends State { - UserProvider _userProvider; - SettingProvider _settingProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; @override Widget build(BuildContext context) { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; return Scaffold( body: FutureBuilder( future: ServiceRequestsProvider().getSingleServiceReport( - reportId: widget.request.reportID, - user: _userProvider.user, - host: _settingProvider.host, + reportId: widget.request.reportID??"", + user: _userProvider.user!, + host: _settingProvider.host??"", subtitle: _subtitle ), builder: (BuildContext context, AsyncSnapshot snapshot){ @@ -45,7 +45,7 @@ class _FutureServiceReportState extends State { ); if(snapshot.hasData){ return EditServiceReport( - report: snapshot.data, + report: snapshot.data!, request: widget.request, ); } diff --git a/lib/views/pages/user/requests/request_details.dart b/old_lib/views/pages/user/requests/request_details.dart similarity index 86% rename from lib/views/pages/user/requests/request_details.dart rename to old_lib/views/pages/user/requests/request_details.dart index 2ada571e..060b1ea3 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/old_lib/views/pages/user/requests/request_details.dart @@ -2,39 +2,40 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.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/service_requests_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/enums/user_types.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/dialogs/dialog.dart'; -import 'package:test_sa/views/widgets/images/images_list.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:test_sa/views/widgets/requests/info_row.dart'; -import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dart'; -import 'package:test_sa/views/widgets/sound/sound_player.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/enums/user_types.dart'; +import '../../../../models/service_request/service_request.dart'; +import '../../../../models/subtitle.dart'; +import '../../../app_style/colors.dart'; +import '../../../app_style/sizing.dart'; +import '../../../widgets/buttons/app_back_button.dart'; +import '../../../widgets/buttons/app_button.dart'; +import '../../../widgets/buttons/app_icon_button.dart'; +import '../../../widgets/dialogs/dialog.dart'; +import '../../../widgets/images/images_list.dart'; +import '../../../widgets/loaders/image_loader.dart'; +import '../../../widgets/requests/info_row.dart'; +import '../../../widgets/requests/request_status.dart'; +import '../../../widgets/requests/service_request_update_dialog.dart'; +import '../../../widgets/sound/sound_player.dart'; +import '../../../widgets/titles/app_sub_title.dart'; import '../report_issues_page.dart'; +import 'report/create_service_report.dart'; import 'report/future_service_report.dart'; class RequestDetailsPage extends StatelessWidget { static final String id = "/call-details"; final ServiceRequest serviceRequest; - const RequestDetailsPage({Key key, this.serviceRequest}) : super(key: key); + const RequestDetailsPage({Key? key, required this.serviceRequest}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; UserProvider _userProvider = Provider.of(context); SettingProvider _settingProvider = Provider.of(context); ServiceRequestsProvider _serviceRequestsProvider = Provider.of(context); @@ -54,7 +55,7 @@ class RequestDetailsPage extends StatelessWidget { child: Center( child: Text( _subtitle.details, - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontStyle: FontStyle.italic ), @@ -62,7 +63,7 @@ class RequestDetailsPage extends StatelessWidget { ), ), Visibility( - visible: _userProvider.user.type == UsersTypes.normal_user, + visible: _userProvider.user?.type == UsersTypes.normal_user, replacement: AIconButton( iconData: Icons.edit, color: AColors.white, @@ -122,7 +123,7 @@ class RequestDetailsPage extends StatelessWidget { ), ), - serviceRequest.devicePhotos.isEmpty ? SizedBox.shrink(): + (serviceRequest.devicePhotos?.isEmpty??false) ? SizedBox.shrink(): Column( children: [ SizedBox(height: 8,), @@ -135,7 +136,7 @@ class RequestDetailsPage extends StatelessWidget { body: InteractiveViewer( child: Center( child: ImageLoader( - url: serviceRequest.devicePhotos.first, + url: serviceRequest.devicePhotos?.first, boxFit: BoxFit.contain, ), ), @@ -148,7 +149,7 @@ class RequestDetailsPage extends StatelessWidget { height: 140 * AppStyle.getScaleFactor(context), width: MediaQuery.of(context).size.width, child: ImageLoader( - url: serviceRequest.devicePhotos.first, + url: serviceRequest.devicePhotos?.first, boxFit: BoxFit.cover, ), ), @@ -157,7 +158,7 @@ class RequestDetailsPage extends StatelessWidget { SizedBox( height: 60* AppStyle.getScaleFactor(context), child: ImagesList( - images: serviceRequest.devicePhotos, + images: serviceRequest.devicePhotos!, ), ), ], @@ -208,7 +209,7 @@ class RequestDetailsPage extends StatelessWidget { serviceRequest.nextVisitDate == null ? SizedBox.shrink() : RequestInfoRow( title: _subtitle.nextVisitDate, - info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate), + info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate!), ), Row( children: [ @@ -220,7 +221,7 @@ class RequestDetailsPage extends StatelessWidget { ), ), StatusLabel(label: serviceRequest.statusLabel, - color: AColors.getRequestStatusColor(serviceRequest.statusValue) + color: AColors.getRequestStatusColor(serviceRequest.statusValue!) ), ], ), @@ -270,8 +271,8 @@ class RequestDetailsPage extends StatelessWidget { } ); int status = await _serviceRequestsProvider.createDuplicatedReport( - host: _settingProvider.host, - user: _userProvider.user, + host: _settingProvider.host??"", + user: _userProvider.user!, request: serviceRequest ); Navigator.of(context).pop(); @@ -289,7 +290,7 @@ class RequestDetailsPage extends StatelessWidget { ) ], ), - serviceRequest.viewReport ? + serviceRequest.viewReport??false ? ListView( padding: EdgeInsets.symmetric(horizontal: 16), children: [ @@ -309,7 +310,7 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.jobSheetNumber, info: serviceRequest.jobSheetNumber, ), - _userProvider.user.type == UsersTypes.engineer ? + _userProvider.user?.type == UsersTypes.engineer ? Padding( padding: EdgeInsets.all(32), child: AButton( @@ -327,7 +328,7 @@ class RequestDetailsPage extends StatelessWidget { ): SizedBox.shrink(), ], ): - _userProvider.user.type == UsersTypes.engineer ? + _userProvider.user?.type == UsersTypes.engineer ? Center( child: Padding( padding: EdgeInsets.all(32), diff --git a/lib/views/pages/user/requests/requests_page.dart b/old_lib/views/pages/user/requests/requests_page.dart similarity index 71% rename from lib/views/pages/user/requests/requests_page.dart rename to old_lib/views/pages/user/requests/requests_page.dart index e535d03b..cc1bb294 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/old_lib/views/pages/user/requests/requests_page.dart @@ -1,17 +1,19 @@ 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/service_requests_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/service_request/service_request_search.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/requests/service_request_list.dart'; -import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; + +import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/service_request/service_request_search.dart'; +import '../../../../models/subtitle.dart'; +import '../../../app_style/colors.dart'; +import '../../../widgets/buttons/app_back_button.dart'; +import '../../../widgets/buttons/app_icon_button.dart'; +import '../../../widgets/loaders/loading_manager.dart'; +import '../../../widgets/requests/service_request_list.dart'; +import '../../../widgets/search/service_request_search_bar.dart'; + class ServiceRequestsPage extends StatefulWidget { static final String id = "/service-requests"; @override @@ -20,9 +22,9 @@ class ServiceRequestsPage extends StatefulWidget { class _ServiceRequestsPageState extends State with TickerProviderStateMixin{ - ServiceRequestsProvider _serviceRequestsProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; + late ServiceRequestsProvider _serviceRequestsProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; bool _expandedSearch = false; bool _firstTime = true; @override @@ -30,7 +32,7 @@ class _ServiceRequestsPageState extends State _serviceRequestsProvider = Provider.of(context); _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; if(_firstTime){ _serviceRequestsProvider.reset(); _firstTime = false; @@ -45,9 +47,9 @@ class _ServiceRequestsPageState extends State onRefresh: () async { _serviceRequestsProvider.reset(); await _serviceRequestsProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + user: _userProvider.user!, + host: _settingProvider.host??"", + hospitalId: _userProvider.user!.hospital!.id, ); }, child: Stack( @@ -66,10 +68,9 @@ class _ServiceRequestsPageState extends State child: Center( child: Text( _subtitle.serviceRequests, - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, - fontStyle: FontStyle.italic - ), + fontStyle: FontStyle.italic ), ), ), ), @@ -80,12 +81,12 @@ class _ServiceRequestsPageState extends State buttonSize: 42, backgroundColor: AColors.white, onPressed: () async { - ServiceRequestSearch _temp = await showModalBottomSheet( + ServiceRequestSearch? _temp = await showModalBottomSheet( context: context, isScrollControlled: true, builder: (context){ return ServiceRequestsSearchDialog( - initialSearchValue: _serviceRequestsProvider.search, + initialSearchValue: _serviceRequestsProvider.search!, ); }); if(_temp != null){ @@ -104,15 +105,15 @@ class _ServiceRequestsPageState extends State ), Expanded( child: ServiceRequestsList( - nextPage: _serviceRequestsProvider.nextPage, + nextPage: _serviceRequestsProvider.nextPage!, onLazyLoad: () async { await _serviceRequestsProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + user: _userProvider.user!, + host: _settingProvider.host??"", + hospitalId: _userProvider.user!.hospital!.id, ); }, - requests: _serviceRequestsProvider.serviceRequests, + requests: _serviceRequestsProvider.serviceRequests!, ), ), ], diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/old_lib/views/pages/user/visits/pantry/edit_pentry.dart similarity index 78% rename from lib/views/pages/user/visits/pantry/edit_pentry.dart rename to old_lib/views/pages/user/visits/pantry/edit_pentry.dart index 7c9201b1..b47a889f 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/old_lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -1,25 +1,26 @@ 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'; + +import '../../../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../../../controllers/localization/localization.dart'; +import '../../../../../controllers/providers/api/regular_visits_provider.dart'; +import '../../../../../controllers/providers/api/user_provider.dart'; +import '../../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../../models/pantry/pentry.dart'; +import '../../../../../models/subtitle.dart'; +import '../../../../../models/visits/visit.dart'; +import '../../../../widgets/buttons/app_small_button.dart'; +import '../../../../widgets/loaders/loading_manager.dart'; +import '../../../../widgets/pentry/pentry_calibration_tool_form.dart'; +import '../../../../widgets/pentry/pentry_info_form.dart'; +import '../../../../widgets/pentry/pentry_pm_kit_form.dart'; +import '../../../../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); + final Pentry? pentry; + final Visit? visit; + const EditPentry({Key? key,this.pentry, this.visit}) : super(key: key); @override State createState() => _EditPentryState(); @@ -28,14 +29,14 @@ class EditPentry extends StatefulWidget { class _EditPentryState extends State with SingleTickerProviderStateMixin{ bool _isLoading = false; bool _validate = false; - Subtitle _subtitle; - UserProvider _userProvider; - SettingProvider _settingProvider; - RegularVisitsProvider _regularVisitsProvider; - Pentry _pentry; + late Subtitle _subtitle; + late UserProvider _userProvider; + late SettingProvider _settingProvider; + late RegularVisitsProvider _regularVisitsProvider; + late Pentry _pentry; final GlobalKey _scaffoldKey = GlobalKey(); - TabController _tabController; + late TabController _tabController; _onSubmit() async { _validate = true; @@ -48,10 +49,10 @@ class _EditPentryState extends State with SingleTickerProviderStateM setState(() {}); int status = await _regularVisitsProvider.updatePentry( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user!, + host: _settingProvider.host??"", pentry: _pentry, - visit: widget.visit + visit: widget.visit! ); _isLoading =false; setState(() {}); @@ -71,7 +72,7 @@ class _EditPentryState extends State with SingleTickerProviderStateM @override void initState() { - _pentry = widget.pentry; + _pentry = widget.pentry!; _tabController = TabController(length: 4, vsync: this); super.initState(); } @@ -84,7 +85,7 @@ class _EditPentryState extends State with SingleTickerProviderStateM @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)!.subtitle!; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _regularVisitsProvider = Provider.of(context); diff --git a/lib/views/pages/user/visits/pantry/future_edit_pently.dart b/old_lib/views/pages/user/visits/pantry/future_edit_pently.dart similarity index 50% rename from lib/views/pages/user/visits/pantry/future_edit_pently.dart rename to old_lib/views/pages/user/visits/pantry/future_edit_pently.dart index 161df3ce..0bc98c69 100644 --- a/lib/views/pages/user/visits/pantry/future_edit_pently.dart +++ b/old_lib/views/pages/user/visits/pantry/future_edit_pently.dart @@ -1,20 +1,22 @@ 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'; + +import '../../../../../controllers/localization/localization.dart'; +import '../../../../../controllers/providers/api/regular_visits_provider.dart'; +import '../../../../../controllers/providers/api/user_provider.dart'; +import '../../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../../models/pantry/pentry.dart'; +import '../../../../../models/subtitle.dart'; +import '../../../../../models/visits/visit.dart'; +import '../../../../widgets/loaders/app_loading.dart'; +import '../../../../widgets/loaders/failed_loading.dart'; +import 'edit_pentry.dart'; + class FutureEditPentry extends StatefulWidget { final Visit visit; - const FutureEditPentry({Key key, this.visit}) : super(key: key); + const FutureEditPentry({Key? key, required this.visit}) : super(key: key); @override State createState() => _FutureEditPentryState(); @@ -22,22 +24,22 @@ class FutureEditPentry extends StatefulWidget { class _FutureEditPentryState extends State { - UserProvider _userProvider; - SettingProvider _settingProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; @override Widget build(BuildContext context) { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); //String requestId = ModalRoute.of(context).settings.arguments; - Subtitle subtitle = AppLocalization.of(context).subtitle; + Subtitle subtitle = AppLocalization.of(context)!.subtitle!; return Scaffold( - body: FutureBuilder( + body: FutureBuilder( future: RegularVisitsProvider().getPently( - user: _userProvider.user, - host: _settingProvider.host, - id: widget.visit.id + user: _userProvider.user!, + host: _settingProvider.host??"", + id: widget.visit.id! ), - builder: (BuildContext context, AsyncSnapshot snapshot){ + builder: (BuildContext context, AsyncSnapshot snapshot){ if(snapshot.hasError) { return FailedLoading( diff --git a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart b/old_lib/views/pages/user/visits/preventive_maintenance_visits_page.dart similarity index 76% rename from lib/views/pages/user/visits/preventive_maintenance_visits_page.dart rename to old_lib/views/pages/user/visits/preventive_maintenance_visits_page.dart index 7c1c57c2..ab1cbd2a 100644 --- a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart +++ b/old_lib/views/pages/user/visits/preventive_maintenance_visits_page.dart @@ -2,22 +2,24 @@ import 'package:flutter/cupertino.dart'; 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/preventive_maintenance_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/subtitle.dart'; -import 'package:test_sa/models/visits/visits_group.dart'; -import 'package:test_sa/models/visits/visits_search.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; -import 'package:test_sa/views/widgets/visits/visits_list.dart'; + +import '../../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/preventive_maintenance_visits_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/subtitle.dart'; +import '../../../../models/visits/visits_group.dart'; +import '../../../../models/visits/visits_search.dart'; +import '../../../app_style/colors.dart'; +import '../../../widgets/buttons/app_back_button.dart'; +import '../../../widgets/buttons/app_button.dart'; +import '../../../widgets/buttons/app_icon_button.dart'; +import '../../../widgets/loaders/loading_manager.dart'; +import '../../../widgets/search/visits_search_bar.dart'; +import '../../../widgets/visits/visits_list.dart'; +import 'update_visits_group_sheet.dart'; + class PreventiveMaintenanceVisitsPage extends StatefulWidget { static final String id = "/preventive-maintenance-visits"; @override @@ -26,17 +28,17 @@ class PreventiveMaintenanceVisitsPage extends StatefulWidget { class _PreventiveMaintenanceVisitsPageState extends State with TickerProviderStateMixin{ - PreventiveMaintenanceVisitsProvider _visitsProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; - Subtitle _subtitle; + late PreventiveMaintenanceVisitsProvider _visitsProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; + late Subtitle _subtitle; @override Widget build(BuildContext context) { _visitsProvider = Provider.of(context); _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)!.subtitle!; return Scaffold( body: SafeArea( child: LoadingManager( @@ -47,8 +49,8 @@ class _PreventiveMaintenanceVisitsPageState extends State with TickerProviderStateMixin{ - RegularVisitsProvider _visitsProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; + late RegularVisitsProvider _visitsProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; bool _expandedSearch = false; - Subtitle _subtitle; + late Subtitle _subtitle; @override Widget build(BuildContext context) { _visitsProvider = Provider.of(context); _settingProvider = Provider.of(context); _userProvider = Provider.of(context); - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)!.subtitle!; return Scaffold( body: SafeArea( child: LoadingManager( @@ -47,8 +49,8 @@ class _RegularVisitsPageState extends State _visitsProvider.reset(); //_visitsProvider.visitsSearch = VisitsSearch(); await _visitsProvider.getVisits( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user!, + host: _settingProvider.host!, ); }, child: Stack( @@ -67,7 +69,7 @@ class _RegularVisitsPageState extends State child: Center( child: Text( _subtitle.preventiveMaintenance, - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontStyle: FontStyle.italic ), @@ -88,11 +90,11 @@ class _RegularVisitsPageState extends State isScrollControlled: true, builder: (context){ return VisitsSearchDialog( - initialSearchValue: _visitsProvider.visitsSearch, + initialSearchValue: _visitsProvider.visitsSearch!, onSearch: (VisitsSearch ) { }, ); }); if(_temp != null){ - _visitsProvider.visitsSearch.fromSearch(_temp) ; + _visitsProvider.visitsSearch?.fromSearch(_temp) ; _visitsProvider.reset(); setState(() {}); } @@ -107,7 +109,7 @@ class _RegularVisitsPageState extends State ), ), Visibility( - visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty, + visible: _visitsProvider.visitsSearch?.toSearchString().isNotEmpty??false, child: Padding( padding: const EdgeInsets.all(8.0), child: AButton( @@ -125,8 +127,8 @@ class _RegularVisitsPageState extends State nextPage: _visitsProvider.nextPage, onLazyLoad: () async { await _visitsProvider.getVisits( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user!, + host: _settingProvider.host??"", ); }, onEditGroup: (visits) async { @@ -149,8 +151,8 @@ class _RegularVisitsPageState extends State }, ); int status = await _visitsProvider.updateGroupOfVisits( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user!, + host: _settingProvider.host??"", group: _group ); Navigator.of(context).pop(); @@ -172,7 +174,7 @@ class _RegularVisitsPageState extends State } } }, - visits: _visitsProvider.visits, + visits: _visitsProvider.visits!, ), ), ], diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/old_lib/views/pages/user/visits/update_visits_group_sheet.dart similarity index 85% rename from lib/views/pages/user/visits/update_visits_group_sheet.dart rename to old_lib/views/pages/user/visits/update_visits_group_sheet.dart index 724f4657..cfc02674 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/old_lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -2,24 +2,26 @@ import 'dart:convert'; import 'dart:io'; 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/subtitle.dart'; -import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/models/visits/visits_group.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/one_image_picker.dart'; -import 'package:test_sa/views/widgets/search/filter_item.dart'; -import 'package:test_sa/views/widgets/visits/visit_status.dart'; + +import '../../../../controllers/localization/localization.dart'; +import '../../../../models/lookup.dart'; +import '../../../../models/subtitle.dart'; +import '../../../../models/visits/visit.dart'; +import '../../../../models/visits/visits_group.dart'; +import '../../../app_style/colors.dart'; +import '../../../app_style/sizing.dart'; +import '../../../widgets/app_text_form_field.dart'; +import '../../../widgets/buttons/app_button.dart'; +import '../../../widgets/buttons/app_small_button.dart'; +import '../../../widgets/date_and_time/date_picker.dart'; +import '../../../widgets/images/one_image_picker.dart'; +import '../../../widgets/search/filter_item.dart'; +import '../../../widgets/visits/visit_status.dart'; + class UpdateVisitsGroupSheet extends StatefulWidget { - final List visits; - final String title; - const UpdateVisitsGroupSheet({Key key, this.visits, this.title}) : super(key: key); + final List? visits; + final String? title; + const UpdateVisitsGroupSheet({Key? key, this.visits, this.title}) : super(key: key); @override _UpdateVisitsGroupSheetState createState() => _UpdateVisitsGroupSheetState(); @@ -37,8 +39,8 @@ class _UpdateVisitsGroupSheetState extends State { Lookup(label: "Failed", id: 1), ]; VisitsGroup _group = VisitsGroup(); - File _image; - Subtitle _subtitle; + late File _image; + late Subtitle _subtitle; @override void initState() { @@ -49,7 +51,7 @@ class _UpdateVisitsGroupSheetState extends State { @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)!.subtitle!; return Container( height: MediaQuery.of(context).size.height / 1.3, padding: EdgeInsets.symmetric( @@ -198,9 +200,9 @@ class _UpdateVisitsGroupSheetState extends State { SizedBox(height: 8 * AppStyle.getScaleFactor(context),), Expanded( child: ListView.builder( - itemCount: widget.visits.length, + itemCount: widget.visits?.length, itemBuilder: (context,index){ - Visit visit = widget.visits[index]; + Visit visit = widget.visits![index]; return Container( padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), margin: EdgeInsets.symmetric(vertical: 4), @@ -217,8 +219,8 @@ class _UpdateVisitsGroupSheetState extends State { children: [ Expanded( child: Text( - "${_subtitle.sn}: "+visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound, - style: Theme.of(context).textTheme.headline6.copyWith( + "${_subtitle.sn}: ${visit.deviceSerialNumber?? _subtitle.noSerialNumberFound}" , + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontSize: 16, fontWeight: FontWeight.bold diff --git a/lib/views/pages/user/visits/visit_details.dart b/old_lib/views/pages/user/visits/visit_details.dart similarity index 83% rename from lib/views/pages/user/visits/visit_details.dart rename to old_lib/views/pages/user/visits/visit_details.dart index e191cf67..ce4a049d 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/old_lib/views/pages/user/visits/visit_details.dart @@ -1,29 +1,29 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/images/images_list.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:test_sa/views/widgets/requests/info_row.dart'; -import 'package:test_sa/views/widgets/visits/visit_status.dart'; +import '../../../../controllers/localization/localization.dart'; import '../../../../controllers/providers/api/regular_visits_provider.dart'; +import '../../../../models/subtitle.dart'; +import '../../../../models/visits/visit.dart'; +import '../../../app_style/colors.dart'; +import '../../../app_style/sizing.dart'; +import '../../../widgets/buttons/app_back_button.dart'; +import '../../../widgets/buttons/app_icon_button.dart'; +import '../../../widgets/images/images_list.dart'; +import '../../../widgets/loaders/image_loader.dart'; +import '../../../widgets/requests/info_row.dart'; +import '../../../widgets/visits/visit_status.dart'; +import 'pantry/future_edit_pently.dart'; class VisitDetailsPage extends StatelessWidget { static final String id = "/visit-details"; final Visit visit; - const VisitDetailsPage({Key key, this.visit}) : super(key: key); + const VisitDetailsPage({Key? key, required this.visit}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; final regularVisitsProvider = Provider.of(context); return Scaffold( @@ -40,7 +40,7 @@ class VisitDetailsPage extends StatelessWidget { child: Center( child: Text( _subtitle.visitInformation, - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontStyle: FontStyle.italic ), @@ -76,7 +76,7 @@ class VisitDetailsPage extends StatelessWidget { body: InteractiveViewer( child: Center( child: ImageLoader( - url: visit.images.first, + url: visit.images?.first, boxFit: BoxFit.contain, ), ), @@ -89,7 +89,7 @@ class VisitDetailsPage extends StatelessWidget { height: 140 * AppStyle.getScaleFactor(context), width: MediaQuery.of(context).size.width, child: ImageLoader( - url: visit.images.isEmpty ? " ":visit.images.first, + url: (visit.images?.isEmpty??false) ? " ":visit.images?.first, boxFit: BoxFit.cover, ), ), @@ -98,7 +98,7 @@ class VisitDetailsPage extends StatelessWidget { SizedBox( height: 60* AppStyle.getScaleFactor(context), child: ImagesList( - images: visit.images, + images: visit.images!, ), ), SizedBox(height: 8,), @@ -128,7 +128,7 @@ class VisitDetailsPage extends StatelessWidget { Expanded( child: Text( "${_subtitle.status} : ", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.subtitle1?.copyWith( fontWeight: FontWeight.bold ), textScaleFactor: AppStyle.getScaleFactor(context), diff --git a/lib/views/widgets/app_name_bar.dart b/old_lib/views/widgets/app_name_bar.dart similarity index 53% rename from lib/views/widgets/app_name_bar.dart rename to old_lib/views/widgets/app_name_bar.dart index 8aebd901..e00c6fae 100644 --- a/lib/views/widgets/app_name_bar.dart +++ b/old_lib/views/widgets/app_name_bar.dart @@ -1,20 +1,24 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../app_style/colors.dart'; +import '../app_style/sizing.dart'; + class AppNameBar extends StatelessWidget { + const AppNameBar({super.key}); + @override Widget build(BuildContext context) { return Container( height: 50 * AppStyle.getScaleFactor(context), - color:AColors.primaryColor, + color: AColors.primaryColor, padding: const EdgeInsets.all(8.0), child: Center( child: Text( "Test SA", - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context) + .textTheme + .titleLarge + ?.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ); diff --git a/old_lib/views/widgets/app_text_form_field.dart b/old_lib/views/widgets/app_text_form_field.dart new file mode 100644 index 00000000..fbd4fb9c --- /dev/null +++ b/old_lib/views/widgets/app_text_form_field.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; + +import '../app_style/sizing.dart'; + +class ATextFormField extends StatefulWidget { + final Function(String?)? onSaved; + final String Function(String?)? validator; + final Function(String)? onChange; + final bool? obscureText; + final VoidCallback? showPassword; + final String? hintText; + final String? labelText; + final TextInputType? textInputType; + final String? initialValue; + final TextStyle? style; + final bool? enable; + final TextAlign? textAlign; + final FocusNode? node; + final Widget? suffixIcon; + final IconData? prefixIconData; + final double? prefixIconSize; + final TextEditingController? controller; + final TextInputAction? textInputAction; + final VoidCallback? onAction; + + const ATextFormField({ + Key? key, + this.initialValue, + this.node, + this.onChange, + this.showPassword, + this.hintText, + this.labelText, + this.style, + this.textAlign, + this.suffixIcon, + this.prefixIconSize, + this.textInputAction, + this.onAction, + this.obscureText, + this.textInputType = TextInputType.text, + this.enable = true, + this.prefixIconData, + this.controller, + this.onSaved, + this.validator, + }) : super(key: key); + + @override + State createState() => _ATextFormFieldState(); +} + +class _ATextFormFieldState extends State { + @override + void initState() { + if (widget.controller != null) { + widget.controller!.text = widget.initialValue ?? ''; + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + height: widget.textInputType == TextInputType.multiline ? null : 50, + padding: const EdgeInsets.only(left: 12, right: 12), + decoration: BoxDecoration( + color: const Color(0xfff5f5f5), + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context), + ), + ), + child: TextFormField( + focusNode: widget.node, + enabled: widget.enable, + onSaved: widget.onSaved, + initialValue: widget.controller != null ? null : widget.initialValue, + validator: widget.validator, + onChanged: widget.onChange, + textAlign: TextAlign.left, + obscureText: widget.obscureText ?? false, + keyboardType: widget.textInputType, + maxLines: widget.textInputType == TextInputType.multiline ? null : 1, + obscuringCharacter: "●", + controller: widget.controller, + textInputAction: widget.textInputType == TextInputType.multiline + ? null + : widget.textInputAction ?? TextInputAction.next, + onEditingComplete: + widget.onAction ?? () => FocusScope.of(context).nextFocus(), + // style: widget.style, + style: Theme.of(context).textTheme.bodyLarge, + decoration: InputDecoration( + border: InputBorder.none, + suffixIconConstraints: const BoxConstraints(minWidth: 0), + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + constraints: const BoxConstraints(), + errorStyle: const TextStyle(height: 0.3), + //contentPadding: EdgeInsets.only(left: 0), + hintText: widget.hintText, + labelText: widget.labelText, + //suffixIcon: widget.suffixIcon, + suffixIcon: widget.prefixIconData == null + ? null + : Icon(widget.prefixIconData, + size: widget.prefixIconSize == null + ? 20 * AppStyle.getScaleFactor(context) + : (widget.prefixIconSize! - 10) * + AppStyle.getScaleFactor(context), + color: const Color(0xff2e303a))), + ), + ); + } +} diff --git a/lib/views/widgets/buttons/app_back_button.dart b/old_lib/views/widgets/buttons/app_back_button.dart similarity index 76% rename from lib/views/widgets/buttons/app_back_button.dart rename to old_lib/views/widgets/buttons/app_back_button.dart index a7ce9c2b..33843525 100644 --- a/lib/views/widgets/buttons/app_back_button.dart +++ b/old_lib/views/widgets/buttons/app_back_button.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/colors.dart'; +import '../../app_style/colors.dart'; import 'app_icon_button.dart'; class ABackButton extends StatelessWidget { - final VoidCallback onPressed; - final IconData icon; + final VoidCallback? onPressed; + final IconData? icon; - const ABackButton({Key key, this.onPressed,this.icon}) : super(key: key); + const ABackButton({Key? key, this.onPressed, this.icon}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/buttons/app_button.dart b/old_lib/views/widgets/buttons/app_button.dart similarity index 68% rename from lib/views/widgets/buttons/app_button.dart rename to old_lib/views/widgets/buttons/app_button.dart index 6c0459d5..a8e21249 100644 --- a/lib/views/widgets/buttons/app_button.dart +++ b/old_lib/views/widgets/buttons/app_button.dart @@ -1,16 +1,17 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; class AButton extends StatelessWidget { final String text; final Color color; - final EdgeInsets padding; + final EdgeInsets? padding; - final TextStyle textStyle; - final VoidCallback onPressed; + final TextStyle? textStyle; + final VoidCallback? onPressed; - const AButton({Key key, this.color = AColors.primaryColor, this.text, this.padding, this.onPressed, this.textStyle}) : super(key: key); + const AButton({Key? key, this.color = AColors.primaryColor, required this.text, this.padding, this.onPressed, this.textStyle}) : super(key: key); @override Widget build(BuildContext context) { @@ -27,7 +28,7 @@ class AButton extends StatelessWidget { onPressed: onPressed, child: Text( text ?? "", - style: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.white, fontSize: 14,fontWeight: FontWeight.w600), + style: textStyle ?? Theme.of(context).textTheme.subtitle2?.copyWith(color: AColors.white, fontSize: 14,fontWeight: FontWeight.w600), textScaleFactor: AppStyle.getScaleFactor(context), ), ), diff --git a/lib/views/widgets/buttons/app_flat_button.dart b/old_lib/views/widgets/buttons/app_flat_button.dart similarity index 64% rename from lib/views/widgets/buttons/app_flat_button.dart rename to old_lib/views/widgets/buttons/app_flat_button.dart index 903b05e2..465252bf 100644 --- a/lib/views/widgets/buttons/app_flat_button.dart +++ b/old_lib/views/widgets/buttons/app_flat_button.dart @@ -1,14 +1,15 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import '../../app_style/sizing.dart'; + class AFlatButton extends StatelessWidget { final String text; - final Color textColor; - final TextStyle style; - final EdgeInsets padding; - final VoidCallback onPressed; + final Color? textColor; + final TextStyle? style; + final EdgeInsets? padding; + final VoidCallback? onPressed; - const AFlatButton({Key key, this.text, this.textColor,this.style ,this.onPressed,this.padding}) : super(key: key); + const AFlatButton({Key? key, required this.text, this.textColor,this.style ,this.onPressed, this.padding}) : super(key: key); @override Widget build(BuildContext context) { return TextButton( diff --git a/lib/views/widgets/buttons/app_icon_button.dart b/old_lib/views/widgets/buttons/app_icon_button.dart similarity index 81% rename from lib/views/widgets/buttons/app_icon_button.dart rename to old_lib/views/widgets/buttons/app_icon_button.dart index 07e9c9a3..5a2ae5b2 100644 --- a/lib/views/widgets/buttons/app_icon_button.dart +++ b/old_lib/views/widgets/buttons/app_icon_button.dart @@ -1,20 +1,22 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + class AIconButton extends StatelessWidget { final IconData iconData; - final Color color; - final Color backgroundColor; - final VoidCallback onPressed; - final double iconSize; + final Color? color; + final Color? backgroundColor; + final VoidCallback? onPressed; + final double? iconSize; final double buttonSize; const AIconButton({ - Key key, - this.iconData, + Key? key, + required this.iconData, this.onPressed, this.color, this.iconSize, diff --git a/lib/views/widgets/buttons/app_icon_button2.dart b/old_lib/views/widgets/buttons/app_icon_button2.dart similarity index 83% rename from lib/views/widgets/buttons/app_icon_button2.dart rename to old_lib/views/widgets/buttons/app_icon_button2.dart index 1a9bc78e..3f9e6d28 100644 --- a/lib/views/widgets/buttons/app_icon_button2.dart +++ b/old_lib/views/widgets/buttons/app_icon_button2.dart @@ -1,15 +1,16 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +import '../../app_style/sizing.dart'; class AIconButton2 extends StatelessWidget { final IconData iconData; - final Color color; - final VoidCallback onPressed; + final Color? color; + final VoidCallback? onPressed; const AIconButton2({ - Key key, - this.iconData, + Key? key, + required this.iconData, this.onPressed, this.color, }) : super(key: key); diff --git a/lib/views/widgets/buttons/app_outlined_button.dart b/old_lib/views/widgets/buttons/app_outlined_button.dart similarity index 66% rename from lib/views/widgets/buttons/app_outlined_button.dart rename to old_lib/views/widgets/buttons/app_outlined_button.dart index ddfb3042..0aa4d979 100644 --- a/lib/views/widgets/buttons/app_outlined_button.dart +++ b/old_lib/views/widgets/buttons/app_outlined_button.dart @@ -1,15 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; class AOutLinedButton extends StatelessWidget { final String text; - final Color color; - final EdgeInsets padding; - final TextStyle textStyle; - final VoidCallback onPressed; + final Color? color; + final EdgeInsets? padding; + final TextStyle? textStyle; + final VoidCallback? onPressed; - const AOutLinedButton({Key key, this.color = AColors.primaryColor, this.text, this.padding, this.onPressed, this.textStyle}) : super(key: key); + const AOutLinedButton({Key? key, this.color = AColors.primaryColor, required this.text, this.padding, this.onPressed, this.textStyle}) : super(key: key); @override Widget build(BuildContext context) { @@ -20,7 +21,7 @@ class AOutLinedButton extends StatelessWidget { .of(context) .textTheme .subtitle2 - .copyWith(fontSize: 18), + ?.copyWith(fontSize: 18), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context))), ), onPressed: onPressed, @@ -33,7 +34,7 @@ class AOutLinedButton extends StatelessWidget { .of(context) .textTheme .subtitle2 - .copyWith(color: AColors.primaryColor, fontSize: 14, fontWeight: FontWeight.w600), + ?.copyWith(color: AColors.primaryColor, fontSize: 14, fontWeight: FontWeight.w600), textAlign: TextAlign.center, textScaleFactor: AppStyle.getScaleFactor(context), ), diff --git a/lib/views/widgets/buttons/app_small_button.dart b/old_lib/views/widgets/buttons/app_small_button.dart similarity index 64% rename from lib/views/widgets/buttons/app_small_button.dart rename to old_lib/views/widgets/buttons/app_small_button.dart index b2f71626..fe9e6285 100644 --- a/lib/views/widgets/buttons/app_small_button.dart +++ b/old_lib/views/widgets/buttons/app_small_button.dart @@ -1,14 +1,15 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import '../../app_style/sizing.dart'; + class ASmallButton extends StatelessWidget { - final String text; - final TextStyle style; - final Color color; - final EdgeInsets padding; - final VoidCallback onPressed; + final String? text; + final TextStyle? style; + final Color? color; + final EdgeInsets? padding; + final VoidCallback? onPressed; - const ASmallButton({Key key, this.text, this.style ,this.onPressed,this.padding, this.color}) : super(key: key); + const ASmallButton({Key? key, required this.text, this.style ,this.onPressed,this.padding, this.color}) : super(key: key); @override Widget build(BuildContext context) { return ElevatedButton( @@ -21,7 +22,7 @@ class ASmallButton extends StatelessWidget { ), child: Text( text??"", - style: style ?? Theme.of(context).textTheme.bodyText1.copyWith( + style: style ?? Theme.of(context).textTheme.bodyText1?.copyWith( color: color == Colors.white ? Theme.of(context).primaryColor : Colors.white ), diff --git a/lib/views/widgets/custom_clip_path/carve_in_image.dart b/old_lib/views/widgets/custom_clip_path/carve_in_image.dart similarity index 100% rename from lib/views/widgets/custom_clip_path/carve_in_image.dart rename to old_lib/views/widgets/custom_clip_path/carve_in_image.dart diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/old_lib/views/widgets/date_and_time/date_picker.dart similarity index 73% rename from lib/views/widgets/date_and_time/date_picker.dart rename to old_lib/views/widgets/date_and_time/date_picker.dart index ee68b716..e35cde28 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/old_lib/views/widgets/date_and_time/date_picker.dart @@ -1,13 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/sizing.dart'; class ADatePicker extends StatelessWidget { - final DateTime date; - final DateTime from; - final DateTime to; - final Function(DateTime) onDatePicker; + final DateTime? date; + final DateTime? from; + final DateTime? to; + final Function(DateTime)? onDatePicker; - const ADatePicker({Key key, this.date, this.onDatePicker, this.from, this.to}) : super(key: key); + const ADatePicker({Key? key, this.date, this.onDatePicker, this.from, this.to}) : super(key: key); @override Widget build(BuildContext context) { @@ -28,13 +29,13 @@ class ADatePicker extends StatelessWidget { textScaleFactor: AppStyle.getScaleFactor(context), ), onPressed: () async { - DateTime picked = await showDatePicker( + DateTime? picked = await showDatePicker( context: context, initialDate: DateTime.now(), firstDate: from ?? DateTime.now(), lastDate: to ?? DateTime.now().add(Duration(days: 365)) ); - onDatePicker(picked); + onDatePicker!(picked!); }, ); } diff --git a/lib/views/widgets/date_and_time/from_to_date_bar.dart b/old_lib/views/widgets/date_and_time/from_to_date_bar.dart similarity index 69% rename from lib/views/widgets/date_and_time/from_to_date_bar.dart rename to old_lib/views/widgets/date_and_time/from_to_date_bar.dart index 4ef79e81..13b7ca52 100644 --- a/lib/views/widgets/date_and_time/from_to_date_bar.dart +++ b/old_lib/views/widgets/date_and_time/from_to_date_bar.dart @@ -1,23 +1,23 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/sizing.dart'; import 'date_picker.dart'; class FromToDateBar extends StatefulWidget { final DateTime from; final DateTime to; - final Function(DateTime) onPickFrom; - final Function(DateTime) onPickTo; + final Function(DateTime)? onPickFrom; + final Function(DateTime)? onPickTo; - const FromToDateBar({Key key, this.from, this.to, this.onPickFrom, this.onPickTo}) : super(key: key); + const FromToDateBar({Key? key, required this.from, required this.to, this.onPickFrom, this.onPickTo}) : super(key: key); @override _FromToDateBarState createState() => _FromToDateBarState(); } class _FromToDateBarState extends State { - DateTime _from; - DateTime _to; + late DateTime _from; + late DateTime _to; @override void initState() { @@ -28,7 +28,7 @@ class _FromToDateBarState extends State { @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ @@ -37,8 +37,8 @@ class _FromToDateBarState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - _subtitle.from, - style: Theme.of(context).textTheme.bodyText1.copyWith( + _subtitle?.from??'', + style: Theme.of(context).textTheme.bodyText1?.copyWith( fontSize: 12, fontWeight: FontWeight.normal ), @@ -50,7 +50,7 @@ class _FromToDateBarState extends State { onDatePicker: (date){ _from = date; setState(() {}); - widget.onPickFrom(date); + widget.onPickFrom!(date); }, ), ], @@ -59,8 +59,8 @@ class _FromToDateBarState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - _subtitle.to, - style: Theme.of(context).textTheme.bodyText1.copyWith( + _subtitle?.to??"", + style: Theme.of(context).textTheme.bodyText1?.copyWith( fontSize: 12, fontWeight: FontWeight.normal ), @@ -72,7 +72,7 @@ class _FromToDateBarState extends State { onDatePicker: (date){ _to = date; setState(() {}); - widget.onPickTo(date); + widget.onPickTo!(date); }, ), ], diff --git a/lib/views/widgets/departments/department_button.dart b/old_lib/views/widgets/departments/department_button.dart similarity index 65% rename from lib/views/widgets/departments/department_button.dart rename to old_lib/views/widgets/departments/department_button.dart index 5aa8b0e4..e020f661 100644 --- a/lib/views/widgets/departments/department_button.dart +++ b/old_lib/views/widgets/departments/department_button.dart @@ -1,20 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/department.dart'; -import 'package:test_sa/models/subtitle.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/departments/single_department_picker.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/department.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import 'single_department_picker.dart'; class DepartmentButton extends StatelessWidget { - final Function(Department) onDepartmentPick; - final Department department; + final Function(Department)? onDepartmentPick; + final Department? department; - const DepartmentButton({Key key, this.department, this.onDepartmentPick}) : super(key: key); + const DepartmentButton({Key? key, this.department, this.onDepartmentPick}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return ElevatedButton( style: ElevatedButton.styleFrom( elevation: 0, @@ -31,7 +32,7 @@ class DepartmentButton extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Text( - department?.name ?? _subtitle.pickUnite, + department?.name ?? _subtitle?.pickUnite??"", style: Theme.of(context).textTheme.bodyText1, textScaleFactor: AppStyle.getScaleFactor(context), textDirection: TextDirection.rtl, @@ -44,7 +45,7 @@ class DepartmentButton extends StatelessWidget { ), onPressed: () async { Department _department = await Navigator.of(context).pushNamed(SingleDepartmentPicker.id) as Department; - onDepartmentPick(_department); + onDepartmentPick!(_department); }); } } diff --git a/lib/views/widgets/departments/department_item.dart b/old_lib/views/widgets/departments/department_item.dart similarity index 62% rename from lib/views/widgets/departments/department_item.dart rename to old_lib/views/widgets/departments/department_item.dart index 4ac240e9..59ba9f11 100644 --- a/lib/views/widgets/departments/department_item.dart +++ b/old_lib/views/widgets/departments/department_item.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/department.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../models/department.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + class DepartmentItem extends StatelessWidget { - final Department department; - final Function(Department) onPressed; + final Department? department; + final Function(Department)? onPressed; - const DepartmentItem({Key key, this.department, this.onPressed}) : super(key: key); + const DepartmentItem({Key? key, this.department, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { return Padding( @@ -21,12 +23,12 @@ class DepartmentItem extends StatelessWidget { ), ), onPressed: (){ - onPressed(department); + onPressed!(department!); }, child: ListTile( title: Text( - department.name ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( + department?.name ?? "", + style: Theme.of(context).textTheme.subtitle1?.copyWith( color: AColors.white ), textDirection: TextDirection.rtl, diff --git a/lib/views/widgets/departments/single_department_picker.dart b/old_lib/views/widgets/departments/single_department_picker.dart similarity index 57% rename from lib/views/widgets/departments/single_department_picker.dart rename to old_lib/views/widgets/departments/single_department_picker.dart index e5fb916b..6520f5c5 100644 --- a/lib/views/widgets/departments/single_department_picker.dart +++ b/old_lib/views/widgets/departments/single_department_picker.dart @@ -1,15 +1,15 @@ 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/departments_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/department.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/widgets/departments/department_item.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/departments_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/department.dart'; +import '../../../models/subtitle.dart'; import '../app_text_form_field.dart'; +import '../loaders/loading_manager.dart'; +import '../loaders/no_item_found.dart'; +import 'department_item.dart'; class SingleDepartmentPicker extends StatefulWidget { static final String id = "/single-Department-Picker"; @override @@ -17,30 +17,30 @@ class SingleDepartmentPicker extends StatefulWidget { } class _SingleDepartmentPickerState extends State { - DepartmentsProvider _departmentsProvider; - SettingProvider _settingProvider; + DepartmentsProvider? _departmentsProvider; + SettingProvider? _settingProvider; List _searchableList = []; bool _firstTime = true; @override Widget build(BuildContext context) { _departmentsProvider = Provider.of(context); _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(_firstTime && _departmentsProvider.departments != null){ - _searchableList.addAll(_departmentsProvider.departments); + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; + if(_firstTime && _departmentsProvider?.departments != null){ + _searchableList.addAll(_departmentsProvider?.departments??[]); _firstTime = false; } return Scaffold( resizeToAvoidBottomInset: false, body: LoadingManager( - isLoading: _departmentsProvider.isLoading, - stateCode: _departmentsProvider.stateCode, - isFailedLoading: _departmentsProvider.departments == null, + isLoading: _departmentsProvider?.isLoading??false, + stateCode: _departmentsProvider?.stateCode??0, + isFailedLoading: _departmentsProvider?.departments == null, onRefresh: () async { - _departmentsProvider.reset(); - await _departmentsProvider.getDepartment( - _settingProvider.host, + _departmentsProvider?.reset(); + await _departmentsProvider?.getDepartment( + _settingProvider?.host??"", ); }, child: Column( @@ -49,15 +49,12 @@ class _SingleDepartmentPickerState extends State { Padding( padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), child: ATextFormField( - hintText: _subtitle.searchByName, + hintText: _subtitle?.searchByName??"", style: Theme.of(context).textTheme.headline6, suffixIcon: Icon(Icons.search_rounded), onChange: (value){ _searchableList.clear(); - _searchableList.addAll(_departmentsProvider.departments.where( - (element) => element.name.toLowerCase().contains( - value.toLowerCase() - ) + _searchableList.addAll(_departmentsProvider!.departments!.where( (element) => element.name!.toLowerCase().contains(value.toLowerCase()) ).toList()); setState(() {}); }, @@ -65,7 +62,7 @@ class _SingleDepartmentPickerState extends State { ), Expanded( child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle.noUniteFound,): + NoItemFound(message: _subtitle?.noUniteFound??"",): ListView.builder( padding: EdgeInsets.zero, shrinkWrap: true, diff --git a/old_lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/old_lib/views/widgets/device_trancfer/device_transfer_info_section.dart new file mode 100644 index 00000000..58fac4b5 --- /dev/null +++ b/old_lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/device/device_transfer_info.dart'; +import '../../app_style/colors.dart'; +import '../loaders/image_loader.dart'; +import '../requests/info_row.dart'; +import '../requests/request_status.dart'; + +class DeviceTransferInfoSection extends StatelessWidget { + final DeviceTransferInfo info; + final VoidCallback? onEdit; + const DeviceTransferInfoSection({Key? key, required this.info, this.onEdit}) : super(key: key); + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context)?.subtitle; + return Column( + children: [ + RequestInfoRow( + title: subtitle?.hospital??"", + info: info.client?.name??"", + ), + RequestInfoRow( + title: subtitle?.unite??"", + info: info.department?.name??"", + ), + RequestInfoRow( + title: subtitle?.engineerName??"", + info: info.name??"", + ), + RequestInfoRow( + title: subtitle?.workingHours??"", + info: info.workingHours??"", + ), + RequestInfoRow( + title: subtitle?.travelingHours??"", + info: info.travelingHours??"", + ), + RequestInfoRow( + title: "Comment", + info: info.comment??"", + ), + RequestInfoRow( + title: "Signature", + info: (info.signature?.isEmpty??false) != false + ? subtitle?.noDateFound??"" : "", + contentWidget: (info.signature?.isEmpty??false) != false ? Container() : + ImageLoader( + url: info.signature??"", + ), + ), + RequestInfoRow( + title: subtitle?.status??"", + infoWidget: StatusLabel( + label: info.status?.label??"", + color: AColors.getGasStatusColor(info.status?.id??0) + ), + ), + ], + ); + } +} diff --git a/lib/views/widgets/device_trancfer/device_transfer_item.dart b/old_lib/views/widgets/device_trancfer/device_transfer_item.dart similarity index 70% rename from lib/views/widgets/device_trancfer/device_transfer_item.dart rename to old_lib/views/widgets/device_trancfer/device_transfer_item.dart index 0cd2adbf..6e8d9403 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/old_lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -1,31 +1,26 @@ -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/models/device/device_transfer.dart'; -import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/user.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:test_sa/views/widgets/requests/request_status.dart'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../models/device/device_transfer.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../requests/request_status.dart'; class DeviceTransferItem extends StatelessWidget { final int index; final DeviceTransfer item; - final Function(DeviceTransfer) onPressed; - const DeviceTransferItem({Key key, this.item, this.onPressed, this.index}) : super(key: key); + final Function(DeviceTransfer)? onPressed; + const DeviceTransferItem({Key? key, required this.item, this.onPressed, required this.index}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - User _user = Provider.of(context,listen: false).user; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; + User? _user = Provider.of(context,listen: false).user; Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; @@ -47,7 +42,7 @@ class DeviceTransferItem extends StatelessWidget { ), //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), onPressed: (){ - onPressed(item); + onPressed!(item); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -60,7 +55,7 @@ class DeviceTransferItem extends StatelessWidget { children: [ Text( item.title ?? "-----", - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold @@ -71,15 +66,15 @@ class DeviceTransferItem extends StatelessWidget { children: [ Expanded( child: Text( - _subtitle.from, - style: Theme.of(context).textTheme.subtitle2.copyWith( + _subtitle?.from??"", + style: Theme.of(context).textTheme.subtitle2?.copyWith( color: onItemColor, ), ), ), StatusLabel( - color: AColors.getRequestStatusColor(item.sender.status?.id), - label: item.sender.status?.label, + color: AColors.getRequestStatusColor(item.sender?.status?.id??0), + label: item.sender?.status?.label??"", ) ], @@ -89,8 +84,8 @@ class DeviceTransferItem extends StatelessWidget { children: [ Expanded( child: Text( - item.sender.client.name, - style: Theme.of(context).textTheme.subtitle2.copyWith( + item.sender?.client?.name??"", + style: Theme.of(context).textTheme.subtitle2?.copyWith( color: onItemColor, ), ), @@ -100,8 +95,8 @@ class DeviceTransferItem extends StatelessWidget { ], ), Text( - item.sender.department.name, - style: Theme.of(context).textTheme.bodySmall.copyWith( + item.sender?.department?.name??"", + style: Theme.of(context).textTheme.bodySmall?.copyWith( color: onItemColor, ), ), @@ -110,15 +105,15 @@ class DeviceTransferItem extends StatelessWidget { children: [ Expanded( child: Text( - _subtitle.to, - style: Theme.of(context).textTheme.subtitle2.copyWith( + _subtitle?.to??"", + style: Theme.of(context).textTheme.subtitle2?.copyWith( color: onItemColor, ), ), ), StatusLabel( - color: AColors.getRequestStatusColor(item.receiver.status?.id), - label: item.receiver.status?.label, + color: AColors.getRequestStatusColor(item.receiver?.status?.id??0), + label: item.receiver?.status?.label??"", ) ], @@ -128,8 +123,8 @@ class DeviceTransferItem extends StatelessWidget { children: [ Expanded( child: Text( - item.receiver.client.name, - style: Theme.of(context).textTheme.subtitle2.copyWith( + item.receiver?.client?.name??"", + style: Theme.of(context).textTheme.subtitle2?.copyWith( color: onItemColor, ), ), @@ -139,8 +134,8 @@ class DeviceTransferItem extends StatelessWidget { ], ), Text( - item.receiver.department.name, - style: Theme.of(context).textTheme.bodySmall.copyWith( + item.receiver?.department?.name??"", + style: Theme.of(context).textTheme.bodySmall?.copyWith( color: onItemColor, ), ), diff --git a/old_lib/views/widgets/device_trancfer/device_transfer_list.dart b/old_lib/views/widgets/device_trancfer/device_transfer_list.dart new file mode 100644 index 00000000..8d975f3d --- /dev/null +++ b/old_lib/views/widgets/device_trancfer/device_transfer_list.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/device/device_transfer.dart'; +import '../../../models/subtitle.dart'; +import '../../pages/device_transfer/device_transfer_details.dart'; +import '../loaders/lazy_loading.dart'; +import '../loaders/no_item_found.dart'; +import 'device_transfer_item.dart'; + +class DeviceTransferList extends StatelessWidget { + final List? items; + final bool? nextPage; + final Future Function()? onLazyLoad; + + const DeviceTransferList({Key? key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); + + @override + Widget build(BuildContext context) { + + if((items?.isEmpty??0) == 0){ + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + return NoItemFound(message: subtitle?.noServiceRequestFound??"",); + } + return LazyLoading( + nextPage: nextPage??false, + onLazyLoad: onLazyLoad??()async{}, + onLoadingEnd: () { }, + child: ListView.builder( + //physics: const BouncingScrollPhysics(), + itemCount: items?.length, + padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 8), + itemBuilder: (context,itemIndex){ + return DeviceTransferItem( + index: itemIndex, + item: items![itemIndex], + onPressed: (model){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (_)=> DeviceTransferDetails(model: model,) + ) + ); + }, + ); + } + ), + ); + } +} diff --git a/lib/views/widgets/dialogs/dialog.dart b/old_lib/views/widgets/dialogs/dialog.dart similarity index 56% rename from lib/views/widgets/dialogs/dialog.dart rename to old_lib/views/widgets/dialogs/dialog.dart index fa20a8f3..c9a44178 100644 --- a/lib/views/widgets/dialogs/dialog.dart +++ b/old_lib/views/widgets/dialogs/dialog.dart @@ -1,32 +1,34 @@ -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/subtitle.dart'; class AAlertDialog extends StatelessWidget { - final String title; - final String content; + final String? title; + final String? content; - const AAlertDialog({Key key, this.title, this.content}) : super(key: key); + const AAlertDialog({Key? key, this.title, this.content}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return CupertinoAlertDialog( title: title != null - ? Text(title) + ? Text(title??"") : null, content: content != null - ? Text(content) + ? Text(content??"") : null, actions: [ TextButton( - child: Text(_subtitle.confirm), + child: Text(_subtitle?.confirm??""), onPressed: () { Navigator.of(context).pop(true); }, ), TextButton( - child: Text(_subtitle.cancel), + child: Text(_subtitle?.cancel??""), onPressed: () { Navigator.of(context).pop(false); }, diff --git a/lib/views/widgets/drawer/drawer_item.dart b/old_lib/views/widgets/drawer/drawer_item.dart similarity index 63% rename from lib/views/widgets/drawer/drawer_item.dart rename to old_lib/views/widgets/drawer/drawer_item.dart index 1bbc2474..942da289 100644 --- a/lib/views/widgets/drawer/drawer_item.dart +++ b/old_lib/views/widgets/drawer/drawer_item.dart @@ -1,15 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../extensions/int_extensions.dart'; +import '../../../extensions/widget_extensions.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; class DrawerItem extends StatelessWidget { - final String title; + final String? title; final IconData icon; - final VoidCallback onPressed; + final VoidCallback? onPressed; - const DrawerItem({Key key, this.title, this.icon, this.onPressed}) : super(key: key); + const DrawerItem({Key? key, this.title, required this.icon, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { @@ -28,8 +29,8 @@ class DrawerItem extends StatelessWidget { Icon(icon, color: AColors.grey3A,size: 20), 12.width, Text( - title, - style: Theme.of(context).textTheme.headline6.copyWith(fontSize: 14, color: AColors.grey3A), + title??"", + style: Theme.of(context).textTheme.headline6?.copyWith(fontSize: 14, color: AColors.grey3A), textScaleFactor: AppStyle.getScaleFactor(context), ), ], diff --git a/lib/views/widgets/e_signature/e_signature.dart b/old_lib/views/widgets/e_signature/e_signature.dart similarity index 87% rename from lib/views/widgets/e_signature/e_signature.dart rename to old_lib/views/widgets/e_signature/e_signature.dart index c48ce9b5..dee119bf 100644 --- a/lib/views/widgets/e_signature/e_signature.dart +++ b/old_lib/views/widgets/e_signature/e_signature.dart @@ -1,15 +1,16 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:signature/signature.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/image_loader.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../loaders/image_loader.dart'; class ESignature extends StatefulWidget { - final String oldSignature; - final Uint8List newSignature; - final Function(Uint8List) onSaved; - const ESignature({Key key, this.oldSignature, this.onSaved, this.newSignature}) : super(key: key); + final String? oldSignature; + final Uint8List? newSignature; + final Function(Uint8List)? onSaved; + const ESignature({Key? key, this.oldSignature, this.onSaved, this.newSignature}) : super(key: key); @override State createState() => _ESignatureState(); @@ -23,7 +24,7 @@ class _ESignatureState extends State { exportBackgroundColor: Colors.white, ); - Uint8List signature; + Uint8List? signature; bool _unpaint = false; @override @@ -51,14 +52,14 @@ class _ESignatureState extends State { padding: const EdgeInsets.only(bottom: 8), height: 90 * AppStyle.getScaleFactor(context), child: signature != null ? - Image.memory(signature): + Image.memory(signature!): ImageLoader( boxFit: BoxFit.contain, - url: widget.oldSignature) + url: widget.oldSignature??"") ), FormField( onSaved: (_) async { - widget.onSaved(signature); + widget.onSaved!(signature!); }, builder: (FormFieldState state) { return Column( diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/old_lib/views/widgets/equipment/auto_complete_devices_field.dart similarity index 65% rename from lib/views/widgets/equipment/auto_complete_devices_field.dart rename to old_lib/views/widgets/equipment/auto_complete_devices_field.dart index 0756bc70..59e2dbf4 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/old_lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -1,18 +1,21 @@ 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/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../controllers/providers/api/devices_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/device/device.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + class AutoCompleteDeviceField extends StatefulWidget { final Device initialValue; - final String hospitalId; - final Function(String) onPick; + final String? hospitalId; + final Function(String)? onPick; - const AutoCompleteDeviceField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); + const AutoCompleteDeviceField({Key? key, required this.initialValue, this.onPick, this.hospitalId}) : super(key: key); @override _AutoCompleteDeviceFieldState createState() => _AutoCompleteDeviceFieldState(); @@ -20,10 +23,10 @@ class AutoCompleteDeviceField extends StatefulWidget { class _AutoCompleteDeviceFieldState extends State { - SettingProvider _settingProvider; - DevicesProvider _devicesProvider; - UserProvider _userProvider; - TextEditingController _controller; + SettingProvider? _settingProvider; + DevicesProvider? _devicesProvider; + UserProvider? _userProvider; + TextEditingController? _controller; @override void initState() { @@ -33,7 +36,7 @@ class _AutoCompleteDeviceFieldState extends State { @override void dispose() { - _controller.dispose(); + _controller?.dispose(); super.dispose(); } @override @@ -70,22 +73,22 @@ class _AutoCompleteDeviceFieldState extends State { textInputAction: TextInputAction.search, ), suggestionsCallback: (value) async { - return await _devicesProvider.getDevicesList( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId, + return await _devicesProvider!.getDevicesList( + host: _settingProvider?.host??"", + user: _userProvider?.user??User(), + hospitalId: widget.hospitalId??"", serialNumber: value, ); }, itemBuilder: (context, device) { return ListTile( - title: Text(device.serialNumber), - subtitle: Text(device.model+"/"+device.brand), + title: Text(device.serialNumber??""), + subtitle: Text("${device.model??""}/${device.brand??""}"), ); }, onSuggestionSelected: (device) { - _controller.text = device.serialNumber; - widget.onPick(device.id); + _controller?.text = device.serialNumber??""; + widget.onPick!(device.id??""); }, ), ); diff --git a/lib/views/widgets/equipment/device_button.dart b/old_lib/views/widgets/equipment/device_button.dart similarity index 74% rename from lib/views/widgets/equipment/device_button.dart rename to old_lib/views/widgets/equipment/device_button.dart index 571a0b02..044ec0a0 100644 --- a/lib/views/widgets/equipment/device_button.dart +++ b/old_lib/views/widgets/equipment/device_button.dart @@ -1,20 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/subtitle.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/equipment/single_device_picker.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/device/device.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import 'single_device_picker.dart'; class DeviceButton extends StatelessWidget { - final Function(Device) onDevicePick; + final Function(Device)? onDevicePick; final Device device; - const DeviceButton({Key key, this.device, this.onDevicePick}) : super(key: key); + const DeviceButton({Key? key, required this.device, this.onDevicePick}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return ElevatedButton( style: ElevatedButton.styleFrom( elevation: 0, @@ -32,7 +33,7 @@ class DeviceButton extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 6), child: Text( - _subtitle.pickDevice, + _subtitle?.pickDevice??"", style: Theme.of(context).textTheme.subtitle1, textScaleFactor: AppStyle.getScaleFactor(context), textDirection: TextDirection.rtl, @@ -44,24 +45,24 @@ class DeviceButton extends StatelessWidget { child: ListTile( contentPadding: EdgeInsets.all(0), title: Text( - "${_subtitle.sn} : " + device.serialNumber, + "${_subtitle?.sn??""} : ${device.serialNumber??""}", style: Theme.of(context).textTheme.subtitle1, ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Divider( - color: Theme.of(context).textTheme.subtitle1.color, + color: Theme.of(context).textTheme.subtitle1?.color, ), Text( - "${_subtitle.brand} : " + device.brand, + "${_subtitle?.brand} : ${device.brand}", style: Theme.of(context).textTheme.subtitle2, ), Divider( - color: Theme.of(context).textTheme.subtitle1.color, + color: Theme.of(context).textTheme.subtitle1?.color, ), Text( - "${_subtitle.model} : " + device.model, + "${_subtitle?.model} : ${device.model}", style: Theme.of(context).textTheme.subtitle2, ), ], @@ -72,7 +73,7 @@ class DeviceButton extends StatelessWidget { ), onPressed: () async { Device _device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device; - onDevicePick(_device); + onDevicePick!(_device); }); } } diff --git a/lib/views/widgets/equipment/device_item.dart b/old_lib/views/widgets/equipment/device_item.dart similarity index 56% rename from lib/views/widgets/equipment/device_item.dart rename to old_lib/views/widgets/equipment/device_item.dart index df07096b..ebe9774c 100644 --- a/lib/views/widgets/equipment/device_item.dart +++ b/old_lib/views/widgets/equipment/device_item.dart @@ -1,17 +1,19 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/device/device.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + class DeviceItem extends StatelessWidget { final Device device; - final Function(Device) onPressed; + final Function(Device)? onPressed; - const DeviceItem({Key key, this.device, this.onPressed}) : super(key: key); + const DeviceItem({Key? key, required this.device, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return Padding( padding: EdgeInsets.symmetric(horizontal: 16,vertical: 6), child: ElevatedButton( @@ -25,11 +27,11 @@ class DeviceItem extends StatelessWidget { ), onPressed: (){ - onPressed(device); + onPressed!(device); }, child: ListTile( - title: Text("${_subtitle.sn} : " + device.serialNumber, - style: Theme.of(context).textTheme.headline6.copyWith( + title: Text("${_subtitle?.sn} : ${device.serialNumber}", + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white ), @@ -38,14 +40,14 @@ class DeviceItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Divider(color: Theme.of(context).scaffoldBackgroundColor,), - Text("${_subtitle.brand} : " + device.brand, - style: Theme.of(context).textTheme.subtitle1.copyWith( + Text("${_subtitle?.brand} : ${device.brand}", + style: Theme.of(context).textTheme.subtitle1?.copyWith( color: AColors.white ), ), Divider(color: Theme.of(context).scaffoldBackgroundColor,), - Text("${_subtitle.model} : " + device.model, - style: Theme.of(context).textTheme.subtitle1.copyWith( + Text("${_subtitle?.model} : ${device.model}", + style: Theme.of(context).textTheme.subtitle1?.copyWith( color: AColors.white ), ), diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/old_lib/views/widgets/equipment/single_device_picker.dart similarity index 63% rename from lib/views/widgets/equipment/single_device_picker.dart rename to old_lib/views/widgets/equipment/single_device_picker.dart index bc8bf527..10649db0 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/old_lib/views/widgets/equipment/single_device_picker.dart @@ -1,18 +1,19 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/devices_provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/widgets/equipment/device_item.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/qr/scan_qr.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/devices_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/device/device.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; import '../app_text_form_field.dart'; +import '../loaders/loading_manager.dart'; +import '../loaders/no_item_found.dart'; +import '../qr/scan_qr.dart'; +import 'device_item.dart'; class SingleDevicePicker extends StatefulWidget { static final String id = "/single-device-Picker"; final bool sandraChoice = true; @@ -21,12 +22,12 @@ class SingleDevicePicker extends StatefulWidget { } class _SingleDevicePickerState extends State { - DevicesProvider _devicesProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; + DevicesProvider? _devicesProvider; + UserProvider? _userProvider; + SettingProvider? _settingProvider; List _searchableList = []; bool _firstTime = true; - Subtitle _subtitle; + Subtitle? _subtitle; _getDevice(String result) async { if(result == null) return; @@ -37,15 +38,15 @@ class _SingleDevicePickerState extends State { return const Center(child: CircularProgressIndicator()); } ); - List devices = await _devicesProvider.getDevicesListBySN( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: _userProvider.user.hospital.id, + List devices = await _devicesProvider!.getDevicesListBySN( + host: _settingProvider?.host??"", + user: _userProvider?.user??User(), + hospitalId: _userProvider?.user?.hospital?.id??"", sn: result ); Navigator.of(context).pop(); if(devices.isEmpty){ - Fluttertoast.showToast(msg: _subtitle.noDeviceFound); + Fluttertoast.showToast(msg: _subtitle?.noDeviceFound??""); return; } Navigator.of(context).pop(devices.first); @@ -67,23 +68,23 @@ class _SingleDevicePickerState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - if(_firstTime && _devicesProvider.devices != null){ - _searchableList.addAll(_devicesProvider.devices); + if(_firstTime && _devicesProvider?.devices != null){ + _searchableList.addAll(_devicesProvider?.devices??[]); _firstTime = false; } - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( resizeToAvoidBottomInset: false, body: LoadingManager( - isLoading: _devicesProvider.isLoading, - stateCode: _devicesProvider.stateCode, - isFailedLoading: _devicesProvider.devices == null, + isLoading: _devicesProvider?.isLoading??false, + stateCode: _devicesProvider?.stateCode??0, + isFailedLoading: _devicesProvider?.devices == null, onRefresh: () async { - _devicesProvider.reset(); - await _devicesProvider.getEquipment( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id + _devicesProvider?.reset(); + await _devicesProvider?.getEquipment( + user: _userProvider?.user??User(), + host: _settingProvider?.host??"", + hospitalId: _userProvider?.user?.hospital?.id??"" ); }, child: Column( @@ -94,13 +95,13 @@ class _SingleDevicePickerState extends State { child: Column( children: [ ATextFormField( - hintText: _subtitle.searchBySn, + hintText: _subtitle?.searchBySn??"", style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), onChange: (value){ _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices.where( - (element) => element.serialNumber.toLowerCase().contains( + _searchableList.addAll(_devicesProvider!.devices!.where( + (element) => element.serialNumber!.toLowerCase().contains( value.toLowerCase() ) ).toList()); @@ -114,8 +115,8 @@ class _SingleDevicePickerState extends State { suffixIcon: const Icon(Icons.search_rounded), onChange: (value){ _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices.where( - (element) => element.number.toLowerCase().contains( + _searchableList.addAll(_devicesProvider!.devices!.where( + (element) => element.number!.toLowerCase().contains( value.toLowerCase() ) ).toList()); @@ -127,7 +128,7 @@ class _SingleDevicePickerState extends State { ), Expanded( child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle.noDeviceFound,): + NoItemFound(message: _subtitle?.noDeviceFound??"",): ListView.builder( padding: EdgeInsets.zero, shrinkWrap: true, @@ -150,7 +151,7 @@ class _SingleDevicePickerState extends State { child: const Icon(Icons.qr_code_scanner), onPressed: () async { String result = await Navigator.of(context).push( - MaterialPageRoute(builder: (_)=> const ScanQr()), + MaterialPageRoute(builder: (_)=> ScanQr()), ) as String; _getDevice(result); }, diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/old_lib/views/widgets/gas_refill/gas_refill_create_details_item.dart similarity index 63% rename from lib/views/widgets/gas_refill/gas_refill_create_details_item.dart rename to old_lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index d246d05d..a2bcb5b7 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/old_lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/views/app_style/colors.dart'; + +import '../../../models/gas_refill/gas_refill_details.dart'; +import '../../app_style/colors.dart'; + class GasRefillCreateDetailsItem extends StatelessWidget { final GasRefillDetails model; - final VoidCallback onDelete; + final VoidCallback? onDelete; - const GasRefillCreateDetailsItem({Key key, this.model, this.onDelete}) : super(key: key); + const GasRefillCreateDetailsItem({Key? key, required this.model, this.onDelete}) : super(key: key); @override Widget build(BuildContext context) { @@ -15,7 +17,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text(model.type.label)), + Expanded(child: Text(model.type?.label??"")), IconButton( onPressed: onDelete, color: AColors.red, @@ -25,14 +27,14 @@ class GasRefillCreateDetailsItem extends StatelessWidget { ), Row( children: [ - Text(model.requestedQuantity.toStringAsFixed(0)), + Text(model.requestedQuantity?.toStringAsFixed(0)??""), ], ), if(model.deliveredQuantity != null) Row( children: [ const Text("Delivered Quantity"), - Text(model.deliveredQuantity.toStringAsFixed(0)), + Text(model.deliveredQuantity?.toStringAsFixed(0)??""), ], ), const Divider(), diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/old_lib/views/widgets/gas_refill/gas_refill_item.dart similarity index 67% rename from lib/views/widgets/gas_refill/gas_refill_item.dart rename to old_lib/views/widgets/gas_refill/gas_refill_item.dart index e9bf3d02..3f7c354c 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/old_lib/views/widgets/gas_refill/gas_refill_item.dart @@ -1,30 +1,26 @@ -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/user.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; + import 'package:provider/provider.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../models/gas_refill/gas_refill_model.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../requests/request_status.dart'; class GasRefillItem extends StatelessWidget { final int index; final GasRefillModel item; - final Function(GasRefillModel) onPressed; - const GasRefillItem({Key key, this.item, this.onPressed, this.index}) : super(key: key); + final Function(GasRefillModel)? onPressed; + const GasRefillItem({Key? key, required this.item, this.onPressed, required this.index}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - User _user = Provider.of(context,listen: false).user; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; + User? _user = Provider.of(context,listen: false).user; Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; @@ -46,7 +42,7 @@ class GasRefillItem extends StatelessWidget { ), //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), onPressed: (){ - onPressed(item); + onPressed!(item); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -59,7 +55,7 @@ class GasRefillItem extends StatelessWidget { children: [ Text( item.title ?? "-----", - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold @@ -69,15 +65,15 @@ class GasRefillItem extends StatelessWidget { children: [ Expanded( child: Text( - _subtitle.hospital, - style: Theme.of(context).textTheme.subtitle2.copyWith( + _subtitle?.hospital??"", + style: Theme.of(context).textTheme.subtitle2?.copyWith( color: onItemColor, ), ), ), Text( - item.clientName, - style: Theme.of(context).textTheme.subtitle2.copyWith( + item.clientName??"", + style: Theme.of(context).textTheme.subtitle2?.copyWith( color: onItemColor, ), ), @@ -89,14 +85,14 @@ class GasRefillItem extends StatelessWidget { children: [ Expanded( child: Text( - _subtitle.status, - style: Theme.of(context).textTheme.subtitle2.copyWith( + _subtitle?.status??"", + style: Theme.of(context).textTheme.subtitle2?.copyWith( color: onItemColor, ), ), ), - StatusLabel(label: item.status.label, - color: AColors.getGasStatusColor(item.status.id) + StatusLabel(label: item.status?.label??"", + color: AColors.getGasStatusColor(item.status?.id??0) ), ], ), diff --git a/lib/views/widgets/gas_refill/gas_refill_list.dart b/old_lib/views/widgets/gas_refill/gas_refill_list.dart similarity index 58% rename from lib/views/widgets/gas_refill/gas_refill_list.dart rename to old_lib/views/widgets/gas_refill/gas_refill_list.dart index e25797d2..32535cbc 100644 --- a/lib/views/widgets/gas_refill/gas_refill_list.dart +++ b/old_lib/views/widgets/gas_refill/gas_refill_list.dart @@ -1,28 +1,31 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_item.dart'; -import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/gas_refill/gas_refill_model.dart'; +import '../../../models/subtitle.dart'; +import '../../pages/user/gas_refill/gas_refill_details.dart'; +import '../loaders/lazy_loading.dart'; +import '../loaders/no_item_found.dart'; +import 'gas_refill_item.dart'; + class GasRefillList extends StatelessWidget { final List items; final bool nextPage; final Future Function() onLazyLoad; - const GasRefillList({Key key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); + const GasRefillList({Key? key, required this.items, required this.nextPage, required this.onLazyLoad}) : super(key: key); @override Widget build(BuildContext context) { if(items.length == 0){ - Subtitle subtitle = AppLocalization.of(context).subtitle; - return NoItemFound(message: subtitle.noServiceRequestFound,); + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + return NoItemFound(message: subtitle?.noServiceRequestFound??"",); } return LazyLoading( nextPage: nextPage, onLazyLoad: onLazyLoad, + onLoadingEnd: () {}, child: ListView.builder( //physics: const BouncingScrollPhysics(), itemCount: items.length, diff --git a/old_lib/views/widgets/gas_refill/gas_refill_update_details_item.dart b/old_lib/views/widgets/gas_refill/gas_refill_update_details_item.dart new file mode 100644 index 00000000..1ae5959c --- /dev/null +++ b/old_lib/views/widgets/gas_refill/gas_refill_update_details_item.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/validator/validator.dart'; +import '../../../models/gas_refill/gas_refill_details.dart'; +import '../../../models/subtitle.dart'; +import '../app_text_form_field.dart'; +import '../requests/info_row.dart'; +import '../titles/app_sub_title.dart'; +import '../titles/app_title.dart'; + +class GasRefillUpdateDetailsItem extends StatelessWidget { + + final GasRefillDetails details; + final bool? enableEdit; + final bool? validate; + + const GasRefillUpdateDetailsItem({Key? key, required this.details, this.enableEdit, this.validate}) : super(key: key); + + @override + Widget build(BuildContext context) { + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ATitle(details.type?.label??""), + RequestInfoRow( + title: "Cylinder Size", + info: details.cylinderSize?.label??"", + ), + RequestInfoRow( + title: "Requested Quantity", + info: details.requestedQuantity?.toStringAsFixed(0)??"", + ), + (enableEdit??false) ? + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(subtitle?.quantity??""), + if((validate??false) && details.deliveredQuantity == null) + ASubTitle(subtitle?.requiredWord??"",color: Colors.red,), + SizedBox(height: 4,), + ATextFormField( + initialValue: (details.deliveredQuantity ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => + Validator.isNumeric(value!) + ? "" : "allow numbers only", + textInputType: TextInputType.number, + onSaved: (value){ + details.deliveredQuantity = int.tryParse(value!); + }, + ), + ], + ): + RequestInfoRow( + title: "Delivered Quantity", + info: details.deliveredQuantity?.toStringAsFixed(0)??"", + ), + //SizedBox(height: 16,) + ], + ); + } +} diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart b/old_lib/views/widgets/hospitals/hospital_auto_complete_field.dart similarity index 67% rename from lib/views/widgets/hospitals/hospital_auto_complete_field.dart rename to old_lib/views/widgets/hospitals/hospital_auto_complete_field.dart index 863ebc08..3803db01 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart +++ b/old_lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -1,29 +1,31 @@ import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/subtitle.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/hospitals/hospital_item.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/hospitals_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/hospital.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import 'hospital_item.dart'; class HospitalAutoCompleteField extends StatefulWidget { - final String initialValue; - final Function(String) onSearch; - final Function(String) onSave; + final String? initialValue; + final Function(String)? onSearch; + final Function(String)? onSave; - const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, this.onSave}) : super(key: key); + const HospitalAutoCompleteField({Key? key, this.onSearch, this.initialValue, this.onSave}) : super(key: key); @override _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); } class _HospitalAutoCompleteFieldState extends State { - SettingProvider _settingProvider; - TextEditingController _controller; + SettingProvider? _settingProvider; + late TextEditingController _controller; @override void initState() { @@ -40,7 +42,7 @@ class _HospitalAutoCompleteFieldState extends State { @override Widget build(BuildContext context) { _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return Container( padding: EdgeInsets.symmetric(horizontal: 16), decoration: BoxDecoration( @@ -60,7 +62,7 @@ class _HospitalAutoCompleteFieldState extends State { controller: _controller, textAlign: TextAlign.center, decoration: InputDecoration( - hintText: _subtitle.hospital, + hintText: _subtitle?.hospital, border: InputBorder.none, disabledBorder: InputBorder.none, focusedBorder: InputBorder.none, @@ -68,10 +70,10 @@ class _HospitalAutoCompleteFieldState extends State { ), textInputAction: TextInputAction.search, onEditingComplete: () { - widget.onSearch(_controller.text); + widget.onSearch!(_controller.text); }), suggestionsCallback: (vale) async { - return await HospitalsProvider().getHospitalsList(host: _settingProvider.host, title: vale); + return await HospitalsProvider().getHospitalsList(host: _settingProvider?.host??"", title: vale, user: User()); }, itemBuilder: (context, hospital) { return HospitalItem( @@ -79,7 +81,7 @@ class _HospitalAutoCompleteFieldState extends State { ); }, onSuggestionSelected: (hospital) { - widget.onSearch(hospital.name); + widget.onSearch!(hospital.name??""); }, ), ); diff --git a/lib/views/widgets/hospitals/hospital_button.dart b/old_lib/views/widgets/hospitals/hospital_button.dart similarity index 62% rename from lib/views/widgets/hospitals/hospital_button.dart rename to old_lib/views/widgets/hospitals/hospital_button.dart index 0abefbe4..d5990340 100644 --- a/lib/views/widgets/hospitals/hospital_button.dart +++ b/old_lib/views/widgets/hospitals/hospital_button.dart @@ -1,20 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/subtitle.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/hospitals/single_hospital_picker.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/hospital.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import 'single_hospital_picker.dart'; class HospitalButton extends StatelessWidget { - final Function(Hospital) onHospitalPick; + final Function(Hospital)? onHospitalPick; final Hospital hospital; - const HospitalButton({Key key, this.hospital, this.onHospitalPick}) : super(key: key); + const HospitalButton({Key? key, required this.hospital, this.onHospitalPick}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return ElevatedButton( style: ElevatedButton.styleFrom( elevation: 0, @@ -29,8 +30,8 @@ class HospitalButton extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Text( - hospital?.name ?? _subtitle.pickHospital, - style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 14, color: AColors.grey3A), + hospital.name ?? _subtitle?.pickHospital??"", + style: Theme.of(context).textTheme.bodyText1?.copyWith(fontSize: 14, color: AColors.grey3A), // textScaleFactor: AppStyle.getScaleFactor(context), textDirection: TextDirection.rtl, textAlign: TextAlign.left, @@ -42,7 +43,7 @@ class HospitalButton extends StatelessWidget { ), onPressed: () async { Hospital _hospital = await Navigator.of(context).pushNamed(SingleHospitalPicker.id) as Hospital; - onHospitalPick(_hospital); + onHospitalPick!(_hospital); }); } } diff --git a/lib/views/widgets/hospitals/hospital_item.dart b/old_lib/views/widgets/hospitals/hospital_item.dart similarity index 69% rename from lib/views/widgets/hospitals/hospital_item.dart rename to old_lib/views/widgets/hospitals/hospital_item.dart index 523dace6..ab7cc8c8 100644 --- a/lib/views/widgets/hospitals/hospital_item.dart +++ b/old_lib/views/widgets/hospitals/hospital_item.dart @@ -1,12 +1,14 @@ -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; + +import '../../../models/hospital.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + class HospitalItem extends StatelessWidget { final Hospital hospital; - final Function(Hospital) onPressed; + final Function(Hospital)? onPressed; - const HospitalItem({Key key, this.hospital, this.onPressed}) : super(key: key); + const HospitalItem({Key? key, required this.hospital, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { return Padding( @@ -22,12 +24,12 @@ class HospitalItem extends StatelessWidget { ), onPressed: onPressed == null ? null : (){ - onPressed(hospital); + onPressed!(hospital); }, child: ListTile( title: Text( hospital.name ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.subtitle1?.copyWith( color: AColors.white ), textDirection: TextDirection.rtl, diff --git a/lib/views/widgets/hospitals/single_hospital_picker.dart b/old_lib/views/widgets/hospitals/single_hospital_picker.dart similarity index 60% rename from lib/views/widgets/hospitals/single_hospital_picker.dart rename to old_lib/views/widgets/hospitals/single_hospital_picker.dart index 27ca0861..4a99a6a0 100644 --- a/lib/views/widgets/hospitals/single_hospital_picker.dart +++ b/old_lib/views/widgets/hospitals/single_hospital_picker.dart @@ -1,15 +1,16 @@ 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/hospitals_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/hospitals_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/hospital.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; import '../app_text_form_field.dart'; +import '../loaders/loading_manager.dart'; +import '../loaders/no_item_found.dart'; +import 'hospital_item.dart'; class SingleHospitalPicker extends StatefulWidget { static final String id = "/single-Hospital-Picker"; final bool sandraChoice = true; @@ -18,28 +19,28 @@ class SingleHospitalPicker extends StatefulWidget { } class _SingleHospitalPickerState extends State { - HospitalsProvider _hospitalsProvider; - SettingProvider _settingProvider; + HospitalsProvider? _hospitalsProvider; + SettingProvider? _settingProvider; List _searchableList = []; bool _firstTime = true; @override Widget build(BuildContext context) { _hospitalsProvider = Provider.of(context); _settingProvider = Provider.of(context); - if(_firstTime && _hospitalsProvider.hospitals != null){ - _searchableList.addAll(_hospitalsProvider.hospitals); + if(_firstTime && _hospitalsProvider?.hospitals != null){ + _searchableList.addAll(_hospitalsProvider?.hospitals??[]); _firstTime = false; } - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( resizeToAvoidBottomInset: false, body: LoadingManager( - isLoading: _hospitalsProvider.isLoading, - stateCode: _hospitalsProvider.stateCode, - isFailedLoading: _hospitalsProvider.hospitals == null, + isLoading: _hospitalsProvider?.isLoading??false, + stateCode: _hospitalsProvider?.stateCode??0, + isFailedLoading: _hospitalsProvider?.hospitals == null, onRefresh: () async { - _hospitalsProvider.reset(); - await _hospitalsProvider.getHospitals(host: _settingProvider.host,); + _hospitalsProvider?.reset(); + await _hospitalsProvider?.getHospitals(host: _settingProvider?.host??"", user: User(), title: ''); }, child: Column( children: [ @@ -47,13 +48,13 @@ class _SingleHospitalPickerState extends State { Padding( padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), child: ATextFormField( - hintText: _subtitle.searchByName, + hintText: _subtitle?.searchByName??"", style: Theme.of(context).textTheme.headline6, suffixIcon: Icon(Icons.search_rounded), onChange: (value){ _searchableList.clear(); - _searchableList.addAll(_hospitalsProvider.hospitals.where( - (element) => element.name.toLowerCase().contains( + _searchableList.addAll(_hospitalsProvider!.hospitals!.where( + (element) => element.name!.toLowerCase().contains( value.toLowerCase() ) ).toList()); @@ -63,7 +64,7 @@ class _SingleHospitalPickerState extends State { ), Expanded( child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle.noHospitalFound,): + NoItemFound(message: _subtitle?.noHospitalFound??"",): ListView.builder( padding: EdgeInsets.zero, shrinkWrap: true, diff --git a/lib/views/widgets/images/image_item.dart b/old_lib/views/widgets/images/image_item.dart similarity index 88% rename from lib/views/widgets/images/image_item.dart rename to old_lib/views/widgets/images/image_item.dart index 5e2412a0..e1d611a0 100644 --- a/lib/views/widgets/images/image_item.dart +++ b/old_lib/views/widgets/images/image_item.dart @@ -1,16 +1,18 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.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/image_loader.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../loaders/image_loader.dart'; + class ImageItem extends StatelessWidget { final String url; final bool isVideo; - final VoidCallback onPressed; + final VoidCallback? onPressed; const ImageItem({ - Key key, - this.url, + Key? key, + required this.url, this.isVideo = false, this.onPressed }) : super(key: key); diff --git a/lib/views/widgets/images/images_list.dart b/old_lib/views/widgets/images/images_list.dart similarity index 83% rename from lib/views/widgets/images/images_list.dart rename to old_lib/views/widgets/images/images_list.dart index df2bdb0d..2e53d7a2 100644 --- a/lib/views/widgets/images/images_list.dart +++ b/old_lib/views/widgets/images/images_list.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; +import '../../app_style/sizing.dart'; import 'image_item.dart'; import 'images_viewer.dart'; class ImagesList extends StatelessWidget { final List images; - final EdgeInsets padding; + final EdgeInsets? padding; - const ImagesList({Key key, this.images, this.padding}) : super(key: key); + const ImagesList({Key? key, required this.images, this.padding}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/images/images_viewer.dart b/old_lib/views/widgets/images/images_viewer.dart similarity index 94% rename from lib/views/widgets/images/images_viewer.dart rename to old_lib/views/widgets/images/images_viewer.dart index 865f0306..37f200a5 100644 --- a/lib/views/widgets/images/images_viewer.dart +++ b/old_lib/views/widgets/images/images_viewer.dart @@ -1,13 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; + +import '../../app_style/sizing.dart'; +import '../loaders/image_loader.dart'; class ImagesViewer extends StatelessWidget { final List images; final int initialIndex; const ImagesViewer({ - Key key, - this.images, + Key? key, + required this.images, this.initialIndex = 0, }) : super(key: key); diff --git a/lib/views/widgets/images/mini_one_image_picker.dart b/old_lib/views/widgets/images/mini_one_image_picker.dart similarity index 81% rename from lib/views/widgets/images/mini_one_image_picker.dart rename to old_lib/views/widgets/images/mini_one_image_picker.dart index 710e960d..e4ab3646 100644 --- a/lib/views/widgets/images/mini_one_image_picker.dart +++ b/old_lib/views/widgets/images/mini_one_image_picker.dart @@ -3,24 +3,25 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/sizing.dart'; class AMiniOneImagePicker extends StatefulWidget { - final Function(File) onPick; - final File image; - final String label; - final bool error; - const AMiniOneImagePicker({Key key, this.label, this.error,this.image, this.onPick}) : super(key: key); + final Function(File)? onPick; + final File? image; + final String? label; + final bool? error; + const AMiniOneImagePicker({Key? key, this.label, this.error,this.image, this.onPick}) : super(key: key); @override _AMiniOneImagePickerState createState() => _AMiniOneImagePickerState(); } class _AMiniOneImagePickerState extends State { - File _image; - Subtitle _subtitle; + late File? _image; + late Subtitle _subtitle; @override void initState() { super.initState(); @@ -28,7 +29,7 @@ class _AMiniOneImagePickerState extends State { } @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)!.subtitle!; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -52,7 +53,7 @@ class _AMiniOneImagePickerState extends State { SizedBox(height: 4,), Text( _subtitle.requiredImage, - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: Colors.red ), textScaleFactor: AppStyle.getScaleFactor(context), @@ -78,12 +79,12 @@ class _AMiniOneImagePickerState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Text( - _image == null ? _subtitle.pickImage : _image.path.split("/").last, + _image == null ? _subtitle.pickImage : _image!.path.split("/").last, textScaleFactor: AppStyle.getScaleFactor(context), ), ), onPressed: () async { - ImageSource source = await showDialog( + ImageSource? source = await showDialog( context: context, builder: (_) => CupertinoAlertDialog( actions: [ @@ -102,8 +103,9 @@ class _AMiniOneImagePickerState extends State { ], ) ); - if(source == null) + if(source == null) { return; + } final pickedFile = await ImagePicker().pickImage( source: source, @@ -116,7 +118,7 @@ class _AMiniOneImagePickerState extends State { setState(() { if (pickedFile != null) { _image = File(pickedFile.path); - widget.onPick(_image); + widget.onPick!(_image!); } else { } diff --git a/lib/views/widgets/images/multi_image_picker.dart b/old_lib/views/widgets/images/multi_image_picker.dart similarity index 82% rename from lib/views/widgets/images/multi_image_picker.dart rename to old_lib/views/widgets/images/multi_image_picker.dart index 854209bb..fecdd1e8 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/old_lib/views/widgets/images/multi_image_picker.dart @@ -4,33 +4,33 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/models/subtitle.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/buttons/app_flat_button.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../extensions/int_extensions.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../buttons/app_flat_button.dart'; import 'multi_image_picker_item.dart'; class MultiImagesPicker extends StatefulWidget { - final String label; - final bool error; - final List images; + final String? label; + final bool? error; + final List? images; - const MultiImagesPicker({Key key, this.images, this.label, this.error = false}) : super(key: key); + const MultiImagesPicker({Key? key, this.images, this.label, this.error = false}) : super(key: key); @override _MultiImagesPickerState createState() => _MultiImagesPickerState(); } class _MultiImagesPickerState extends State with TickerProviderStateMixin { - Size _size; + late Size _size; @override Widget build(BuildContext context) { _size = MediaQuery.of(context).size; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; return Container( padding: EdgeInsets.all(12), decoration: BoxDecoration( @@ -49,7 +49,7 @@ class _MultiImagesPickerState extends State with TickerProvid Expanded( child: Text( widget.label ?? _subtitle.images, - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( fontSize: 14, ), textScaleFactor: AppStyle.getScaleFactor(context), @@ -66,14 +66,14 @@ class _MultiImagesPickerState extends State with TickerProvid 12.height, AnimatedSize( duration: Duration(milliseconds: 400), - child: !widget.error + child: !(widget.error??false) ? SizedBox.shrink() : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( _subtitle.imagesRequired, - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( fontSize: 14, color: AColors.red, ), @@ -88,7 +88,7 @@ class _MultiImagesPickerState extends State with TickerProvid AnimatedSwitcher( duration: Duration(milliseconds: 400), child: Container( - key: ValueKey(widget.images.length), + key: ValueKey(widget.images?.length), width: _size.width, height: 200 * AppStyle.getScaleFactor(context), padding: EdgeInsets.all( @@ -99,7 +99,7 @@ class _MultiImagesPickerState extends State with TickerProvid border: Border.all(color: Theme.of(context).primaryColor, width: 2), borderRadius: BorderRadius.circular(8 * AppStyle.getScaleFactor(context)), ), - child: widget.images.isEmpty + child: (widget.images?.isEmpty??false) ? MaterialButton( onPressed: () { onImagePick(_subtitle); @@ -117,12 +117,12 @@ class _MultiImagesPickerState extends State with TickerProvid scrollDirection: Axis.horizontal, mainAxisSpacing: 10, crossAxisSpacing: 10, - children: List.generate(widget.images.length, (index) { - File _image = widget.images[index]; + children: List.generate(widget.images!.length, (index) { + File _image = widget.images![index]; return MultiImagesPickerItem( image: _image, onRemoveTap: (image) { - widget.images.remove(image); + widget.images?.remove(image); setState(() {}); }, ); @@ -136,7 +136,7 @@ class _MultiImagesPickerState extends State with TickerProvid } onImagePick(Subtitle _subtitle) async { - if (widget.images.length >= 5) { + if (widget.images!.length >= 5) { Fluttertoast.showToast(msg: _subtitle.maxImagesNumberIs5); return; } @@ -165,7 +165,7 @@ class _MultiImagesPickerState extends State with TickerProvid if (pickedFile != null) { File _fileImage = File(pickedFile.path); if (_fileImage != null) { - widget.images.insert(0, _fileImage); + widget.images?.insert(0, _fileImage); setState(() {}); } } diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/old_lib/views/widgets/images/multi_image_picker_item.dart similarity index 85% rename from lib/views/widgets/images/multi_image_picker_item.dart rename to old_lib/views/widgets/images/multi_image_picker_item.dart index be1d1b15..7353d1a1 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/old_lib/views/widgets/images/multi_image_picker_item.dart @@ -1,17 +1,18 @@ import 'dart:io'; import 'package:flutter/material.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/buttons/app_back_button.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../buttons/app_back_button.dart'; class MultiImagesPickerItem extends StatelessWidget { final File image; - final Function(File) onRemoveTap; + final Function(File)? onRemoveTap; - const MultiImagesPickerItem({Key key, this.image, this.onRemoveTap}) : super(key: key); + const MultiImagesPickerItem({Key? key, required this.image, this.onRemoveTap}) : super(key: key); @override Widget build(BuildContext context) { @@ -66,7 +67,7 @@ class MultiImagesPickerItem extends StatelessWidget { child: Icon(Icons.remove_circle,color: AColors.red,) ), onPressed: (){ - onRemoveTap(image); + onRemoveTap!(image); }, ) ), diff --git a/lib/views/widgets/images/one_image_picker.dart b/old_lib/views/widgets/images/one_image_picker.dart similarity index 85% rename from lib/views/widgets/images/one_image_picker.dart rename to old_lib/views/widgets/images/one_image_picker.dart index 3ff3ebbf..ead5e13f 100644 --- a/lib/views/widgets/images/one_image_picker.dart +++ b/old_lib/views/widgets/images/one_image_picker.dart @@ -3,24 +3,25 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/sizing.dart'; class AOneImagePicker extends StatefulWidget { - final Function(File) onPick; + final Function(File)? onPick; final File image; - final String label; - final bool error; - const AOneImagePicker({Key key, this.label, this.error,this.image, this.onPick}) : super(key: key); + final String? label; + final bool? error; + const AOneImagePicker({Key? key, this.label, this.error,required this.image, this.onPick}) : super(key: key); @override _AOneImagePickerState createState() => _AOneImagePickerState(); } class _AOneImagePickerState extends State { - File _image; - Subtitle _subtitle; + late File _image; + Subtitle? _subtitle; @override void initState() { super.initState(); @@ -28,7 +29,7 @@ class _AOneImagePickerState extends State { } @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; + _subtitle = AppLocalization.of(context)?.subtitle; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -51,8 +52,8 @@ class _AOneImagePickerState extends State { children: [ SizedBox(height: 4,), Text( - _subtitle.requiredImage, - style: Theme.of(context).textTheme.headline6.copyWith( + _subtitle?.requiredImage??"", + style: Theme.of(context).textTheme.headline6?.copyWith( color: Colors.red ), textScaleFactor: AppStyle.getScaleFactor(context), @@ -77,7 +78,7 @@ class _AOneImagePickerState extends State { child: _image == null ? Text( - _subtitle.pickImage, + _subtitle?.pickImage??"", style: Theme.of(context).textTheme.headline6, textScaleFactor: AppStyle.getScaleFactor(context), ): @@ -126,7 +127,7 @@ class _AOneImagePickerState extends State { setState(() { if (pickedFile != null) { _image = File(pickedFile.path); - widget.onPick(_image); + widget.onPick!(_image); } }); }, diff --git a/lib/views/widgets/issues/report_issue_item.dart b/old_lib/views/widgets/issues/report_issue_item.dart similarity index 82% rename from lib/views/widgets/issues/report_issue_item.dart rename to old_lib/views/widgets/issues/report_issue_item.dart index 8a952be7..d8c11e26 100644 --- a/lib/views/widgets/issues/report_issue_item.dart +++ b/old_lib/views/widgets/issues/report_issue_item.dart @@ -1,13 +1,15 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + class ReportIssueItem extends StatelessWidget { - final bool isSelected; - final String issueInfo; - final Function(String,bool) onChange; + final bool? isSelected; + final String? issueInfo; + final Function(String,bool)? onChange; const ReportIssueItem({ - Key key, + Key? key, this.isSelected, this.issueInfo, this.onChange @@ -19,7 +21,7 @@ class ReportIssueItem extends StatelessWidget { splashColor: AColors.secondaryColor.withOpacity(.5), padding: EdgeInsets.symmetric(vertical: 4), onPressed: (){ - onChange(issueInfo,!isSelected); + onChange!(issueInfo!,!isSelected!); }, child: Column( children: [ @@ -43,7 +45,7 @@ class ReportIssueItem extends StatelessWidget { child: Checkbox( value: isSelected, onChanged: (value){ - onChange(issueInfo,value); + onChange!(issueInfo!,value!); }, ), ), diff --git a/lib/views/widgets/land_page/land_page_item.dart b/old_lib/views/widgets/land_page/land_page_item.dart similarity index 74% rename from lib/views/widgets/land_page/land_page_item.dart rename to old_lib/views/widgets/land_page/land_page_item.dart index a3085e65..8a7796ad 100644 --- a/lib/views/widgets/land_page/land_page_item.dart +++ b/old_lib/views/widgets/land_page/land_page_item.dart @@ -1,13 +1,15 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + class LandPageItem extends StatelessWidget { - final String text; - final IconData icon; - final VoidCallback onPressed; + final String? text; + final IconData? icon; + final VoidCallback? onPressed; - const LandPageItem({Key key, this.text, this.icon, this.onPressed}) : super(key: key); + const LandPageItem({Key? key, this.text, this.icon, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { @@ -35,7 +37,7 @@ class LandPageItem extends StatelessWidget { color: AColors.primaryColor, size: 42 * AppStyle.getScaleFactor(context), ), - Text(text, style: TextStyle(color: AColors.grey3A)), + Text(text??"", style: TextStyle(color: AColors.grey3A)), ], ), ), diff --git a/lib/views/widgets/loaders/app_lazy_loading.dart b/old_lib/views/widgets/loaders/app_lazy_loading.dart similarity index 91% rename from lib/views/widgets/loaders/app_lazy_loading.dart rename to old_lib/views/widgets/loaders/app_lazy_loading.dart index e3378c98..5d05d738 100644 --- a/lib/views/widgets/loaders/app_lazy_loading.dart +++ b/old_lib/views/widgets/loaders/app_lazy_loading.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; +import '../../app_style/sizing.dart'; import 'app_loading.dart'; class ALazyLoading extends StatelessWidget { @override diff --git a/lib/views/widgets/loaders/app_loading.dart b/old_lib/views/widgets/loaders/app_loading.dart similarity index 81% rename from lib/views/widgets/loaders/app_loading.dart rename to old_lib/views/widgets/loaders/app_loading.dart index 71623050..fcec6457 100644 --- a/lib/views/widgets/loaders/app_loading.dart +++ b/old_lib/views/widgets/loaders/app_loading.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; class ALoading extends StatelessWidget { - const ALoading({Key key}) : super(key: key); + const ALoading({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/loaders/failed_loading.dart b/old_lib/views/widgets/loaders/failed_loading.dart similarity index 85% rename from lib/views/widgets/loaders/failed_loading.dart rename to old_lib/views/widgets/loaders/failed_loading.dart index 5039628b..79cac9b2 100644 --- a/lib/views/widgets/loaders/failed_loading.dart +++ b/old_lib/views/widgets/loaders/failed_loading.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/sizing.dart'; + class FailedLoading extends StatelessWidget { - final String message; - final VoidCallback onReload; + final String? message; + final VoidCallback? onReload; const FailedLoading({ - Key key, + Key? key, this.message, this.onReload }) : super(key: key); diff --git a/lib/views/widgets/loaders/image_loader.dart b/old_lib/views/widgets/loaders/image_loader.dart similarity index 82% rename from lib/views/widgets/loaders/image_loader.dart rename to old_lib/views/widgets/loaders/image_loader.dart index 7550de1d..c7f892f8 100644 --- a/lib/views/widgets/loaders/image_loader.dart +++ b/old_lib/views/widgets/loaders/image_loader.dart @@ -1,13 +1,13 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; class ImageLoader extends StatelessWidget { - final String url; - final BoxFit boxFit; - final Color color; - final Alignment alignment; + final String? url; + final BoxFit? boxFit; + final Color? color; + final Alignment? alignment; const ImageLoader({ - Key key, - @required this.url, + Key? key, + this.url, this.boxFit, this.color, this.alignment diff --git a/lib/views/widgets/loaders/lazy_loading.dart b/old_lib/views/widgets/loaders/lazy_loading.dart similarity index 83% rename from lib/views/widgets/loaders/lazy_loading.dart rename to old_lib/views/widgets/loaders/lazy_loading.dart index d5e5f2ed..a6df6105 100644 --- a/lib/views/widgets/loaders/lazy_loading.dart +++ b/old_lib/views/widgets/loaders/lazy_loading.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; - +import '../../app_style/sizing.dart'; import 'app_loading.dart'; + class LazyLoading extends StatefulWidget { final Widget child; final bool nextPage; @@ -9,11 +9,11 @@ class LazyLoading extends StatefulWidget { final VoidCallback onLoadingEnd; const LazyLoading({ - Key key, + Key? key, this.nextPage = false, - this.child, - this.onLazyLoad, - this.onLoadingEnd, + required this.child, + required this.onLazyLoad, + required this.onLoadingEnd, }) : super(key: key); @override @@ -22,17 +22,17 @@ class LazyLoading extends StatefulWidget { class _LazyLoadingState extends State with TickerProviderStateMixin { - AnimationController _animationController; - Animation _offsetAnimation; + late AnimationController _animationController; + late Animation _offsetAnimation; _scrollListener() async { if (!_animationController.isAnimating && !_animationController.isCompleted && widget.nextPage) { - _animationController.forward(); + _animationController?.forward(); setState(() {}); await widget.onLazyLoad(); await Future.delayed(Duration(milliseconds: 600)); setState(() {}); - _animationController.reverse(); + _animationController?.reverse(); } } @@ -57,7 +57,7 @@ class _LazyLoadingState extends State with TickerProviderStateMixin @override void dispose() { super.dispose(); - _animationController.dispose(); + _animationController?.dispose(); } @override @@ -77,7 +77,7 @@ class _LazyLoadingState extends State with TickerProviderStateMixin position: _offsetAnimation, child: Center( child: Visibility( - visible: _animationController.isAnimating || _animationController.isCompleted, + visible: (_animationController?.isAnimating??false) || (_animationController?.isCompleted??false), child: Container( height: 36 * AppStyle.getScaleFactor(context), width: 36 * AppStyle.getScaleFactor(context), diff --git a/lib/views/widgets/loaders/loading_manager.dart b/old_lib/views/widgets/loaders/loading_manager.dart similarity index 65% rename from lib/views/widgets/loaders/loading_manager.dart rename to old_lib/views/widgets/loaders/loading_manager.dart index 8ed322e0..83403ee0 100644 --- a/lib/views/widgets/loaders/loading_manager.dart +++ b/old_lib/views/widgets/loaders/loading_manager.dart @@ -1,27 +1,27 @@ import 'package:flutter/material.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/models/subtitle.dart'; +import '../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../models/subtitle.dart'; import 'app_loading.dart'; import 'failed_loading.dart'; class LoadingManager extends StatefulWidget { - final bool isLoading; - final bool isFailedLoading; - final bool isNotPage; - final int progress; - final bool askOnBack; - final int stateCode; - final Future Function() onRefresh; - final Widget child; + final bool? isLoading; + final bool? isFailedLoading; + final bool? isNotPage; + final int? progress; + final bool? askOnBack; + final int? stateCode; + final Future Function()? onRefresh; + final Widget? child; LoadingManager({ - Key key, - @required this.isLoading, - @required this.isFailedLoading, - @required this.stateCode, - @required this.onRefresh, - @required this.child, + Key? key, + this.isLoading, + this.isFailedLoading, + this.stateCode, + this.onRefresh, + this.child, this.progress, this.isNotPage = false, this.askOnBack = false, @@ -37,7 +37,7 @@ class _LoadingManagerState extends State { void initState() { if(widget.onRefresh != null && widget.stateCode == null){ WidgetsBinding.instance.addPostFrameCallback((timeStamp) { - widget.onRefresh(); + widget.onRefresh!(); }); } super.initState(); @@ -45,12 +45,12 @@ class _LoadingManagerState extends State { @override Widget build(BuildContext context) { - Subtitle subtitle = AppLocalization.of(context).subtitle; - Widget placeHolder; + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + Widget? placeHolder; // to load data if load not start if(widget.isLoading == false && widget.stateCode == null){ WidgetsBinding.instance.addPostFrameCallback((timeStamp) { - widget.onRefresh(); + widget.onRefresh!(); }); } @@ -58,7 +58,7 @@ class _LoadingManagerState extends State { // return loading widget if(widget.isLoading != false || widget.stateCode == null){ placeHolder = ALoading(); - }else if(widget.isFailedLoading && !widget.isNotPage){ + }else if((widget.isFailedLoading??false) && !(widget.isNotPage??false)){ // if failed return failed widget placeHolder = FailedLoading( message: HttpStatusManger.getStatusMessage( @@ -70,7 +70,7 @@ class _LoadingManagerState extends State { // if load end successfully return loaded widget return RefreshIndicator( onRefresh: () async{ - await widget.onRefresh(); + await widget.onRefresh!(); }, child: AnimatedSwitcher( duration: const Duration(milliseconds: 400), diff --git a/lib/views/widgets/loaders/no_item_found.dart b/old_lib/views/widgets/loaders/no_item_found.dart similarity index 84% rename from lib/views/widgets/loaders/no_item_found.dart rename to old_lib/views/widgets/loaders/no_item_found.dart index 5ed637e7..1275f30e 100644 --- a/lib/views/widgets/loaders/no_item_found.dart +++ b/old_lib/views/widgets/loaders/no_item_found.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/sizing.dart'; class NoItemFound extends StatelessWidget { - final String message; + final String? message; const NoItemFound({ - Key key, + Key? key, this.message, }) : super(key: key); diff --git a/lib/views/widgets/notifications/notification_item.dart b/old_lib/views/widgets/notifications/notification_item.dart similarity index 78% rename from lib/views/widgets/notifications/notification_item.dart rename to old_lib/views/widgets/notifications/notification_item.dart index e29cc3c4..28183931 100644 --- a/lib/views/widgets/notifications/notification_item.dart +++ b/old_lib/views/widgets/notifications/notification_item.dart @@ -1,12 +1,14 @@ -import 'package:test_sa/models/app_notification.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; + +import '../../../models/app_notification.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; class NotificationItem extends StatelessWidget { final AppNotification notification; - final Function(AppNotification) onPressed; - const NotificationItem({Key key, this.notification, this.onPressed}) : super(key: key); + final Function(AppNotification)? onPressed; + const NotificationItem({Key? key, required this.notification, this.onPressed}) : super(key: key); @override @@ -25,7 +27,7 @@ class NotificationItem extends StatelessWidget { ), onPressed: (){ - onPressed(notification); + onPressed!(notification); }, child:Column( @@ -36,7 +38,7 @@ class NotificationItem extends StatelessWidget { Expanded( child: Text( notification.title ?? "No Hospital Found", - style: Theme.of(context).textTheme.headline6.copyWith( + style: Theme.of(context).textTheme.headline6?.copyWith( color: AColors.white, fontSize: 16, fontWeight: FontWeight.bold @@ -45,7 +47,7 @@ class NotificationItem extends StatelessWidget { ), Text( notification.date ?? "complaint not available", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.subtitle1?.copyWith( color: AColors.white, fontSize: 12, fontWeight: FontWeight.bold @@ -56,7 +58,7 @@ class NotificationItem extends StatelessWidget { Divider(color: AColors.white,), Text( notification.description ?? "complaint not available", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.subtitle1?.copyWith( color: AColors.white, fontSize: 14, ), diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/old_lib/views/widgets/parts/auto_complete_parts_field.dart similarity index 68% rename from lib/views/widgets/parts/auto_complete_parts_field.dart rename to old_lib/views/widgets/parts/auto_complete_parts_field.dart index 9c31d01e..f31203be 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/old_lib/views/widgets/parts/auto_complete_parts_field.dart @@ -1,19 +1,22 @@ import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/parts_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/part.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 '../../../controllers/providers/api/parts_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/part.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../loaders/loading_manager.dart'; + class AutoCompletePartsField extends StatefulWidget { - final String initialValue; - final Function(Part) onPick; - final bool clearAfterPick; + final String? initialValue; + final Function(Part)? onPick; + final bool? clearAfterPick; - const AutoCompletePartsField({Key key, this.initialValue, this.onPick, this.clearAfterPick = true}) : super(key: key); + const AutoCompletePartsField({Key? key, this.initialValue, this.onPick, this.clearAfterPick = true}) : super(key: key); @override _AutoCompletePartsFieldState createState() => _AutoCompletePartsFieldState(); @@ -21,10 +24,10 @@ class AutoCompletePartsField extends StatefulWidget { class _AutoCompletePartsFieldState extends State { - SettingProvider _settingProvider; - PartsProvider _partsProvider; - UserProvider _userProvider; - TextEditingController _controller; + late SettingProvider _settingProvider; + late PartsProvider _partsProvider; + late UserProvider _userProvider; + late TextEditingController _controller; @override void initState() { @@ -50,8 +53,9 @@ class _AutoCompletePartsFieldState extends State { onRefresh: () async { _partsProvider.reset(); await _partsProvider.getParts( - host: _settingProvider.host, - user: _userProvider.user, + host: _settingProvider.host??"", + user: _userProvider.user??User(), + title: '', ); }, child: Container( @@ -83,23 +87,24 @@ class _AutoCompletePartsFieldState extends State { ), suggestionsCallback: (vale) async { return await _partsProvider.getPartsList( - host: _settingProvider.host, - title: vale + host: _settingProvider.host??"", + title: vale, + user: User() ); }, itemBuilder: (context, part) { return ListTile( - title: Text(part.code), - subtitle: Text(part.name, style: Theme.of(context).textTheme.caption,), + title: Text(part.code??""), + subtitle: Text(part.name??"", style: Theme.of(context).textTheme.caption,), ); }, onSuggestionSelected: (part) { - if(widget.clearAfterPick){ + if(widget.clearAfterPick??false){ _controller.clear(); } else{ - _controller.text = part.code; + _controller.text = part.code??""; } - widget.onPick(part); + widget.onPick!(part); }, ), ), diff --git a/lib/views/widgets/parts/part_item.dart b/old_lib/views/widgets/parts/part_item.dart similarity index 72% rename from lib/views/widgets/parts/part_item.dart rename to old_lib/views/widgets/parts/part_item.dart index 354e4302..0b4ed9b7 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/old_lib/views/widgets/parts/part_item.dart @@ -1,13 +1,14 @@ -import 'package:test_sa/models/part.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; import 'package:flutter/material.dart'; + +import '../../../models/part.dart'; +import '../../app_style/sizing.dart'; +import '../buttons/app_icon_button2.dart'; class PartItem extends StatefulWidget { - final Part part; - final Function(Part) onDelete; + final Part? part; + final Function(Part)? onDelete; - const PartItem({Key key, this.part, this.onDelete}) : super(key: key); + const PartItem({Key? key, this.part, this.onDelete}) : super(key: key); @override _PartItemState createState() => _PartItemState(); @@ -29,8 +30,8 @@ class _PartItemState extends State { Row( children: [ Expanded( - child: Text(widget.part.code, - style: Theme.of(context).textTheme.bodyText1.copyWith( + child: Text(widget.part?.code??"", + style: Theme.of(context).textTheme.bodyText1?.copyWith( fontSize: 12, fontWeight: FontWeight.bold ), @@ -40,21 +41,21 @@ class _PartItemState extends State { iconData: Icons.add, color: Theme.of(context).primaryColor, onPressed: (){ - widget.part.quantity++; + widget.part?.quantity++; setState(() {}); }, ), AIconButton2( iconData: Icons.remove, color: Theme.of(context).primaryColor, - onPressed: widget.part.quantity < 2 ? null : (){ - widget.part.quantity--; + onPressed: widget.part!.quantity < 2 ? null : (){ + widget.part?.quantity--; setState(() {}); }, ), SizedBox(width: 8*AppStyle.getScaleFactor(context),), - Text(widget.part.quantity.toString(), - style: Theme.of(context).textTheme.headline6.copyWith( + Text(widget.part?.quantity.toString()??"", + style: Theme.of(context).textTheme.headline6?.copyWith( //fontSize: 12, //fontWeight: FontWeight.bold ), @@ -62,9 +63,9 @@ class _PartItemState extends State { SizedBox(width: 8*AppStyle.getScaleFactor(context),), ], ), - widget.part.name == null ? SizedBox.shrink() : - Text(widget.part.name, - style: Theme.of(context).textTheme.caption.copyWith( + widget.part?.name == null ? SizedBox.shrink() : + Text(widget.part?.name??"", + style: Theme.of(context).textTheme.caption?.copyWith( fontSize: 11, fontWeight: FontWeight.bold ), @@ -77,7 +78,7 @@ class _PartItemState extends State { iconData: Icons.close, color: Colors.red, onPressed: (){ - widget.onDelete(widget.part); + widget.onDelete!(widget.part!); }, ), diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/old_lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart similarity index 66% rename from lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart rename to old_lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index ea2228cd..a6b42448 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/old_lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -1,19 +1,24 @@ 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'; + +import '../../../../controllers/providers/api/devices_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/device/device.dart'; +import '../../../../models/lookup.dart'; +import '../../../../models/user.dart'; +import '../../../app_style/colors.dart'; +import '../../../app_style/sizing.dart'; + class AutoCompleteDeviceNumberField extends StatefulWidget { - final Lookup initialValue; - final String hospitalId; - final Function(Lookup) onPick; + final Lookup? initialValue; + final String? hospitalId; + final Function(Lookup)? onPick; + + const AutoCompleteDeviceNumberField({Key? - const AutoCompleteDeviceNumberField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); + key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); @override State createState() => _AutoCompleteDeviceNumberFieldState(); @@ -21,10 +26,10 @@ class AutoCompleteDeviceNumberField extends StatefulWidget { class _AutoCompleteDeviceNumberFieldState extends State { - SettingProvider _settingProvider; - DevicesProvider _devicesProvider; - UserProvider _userProvider; - TextEditingController _controller; + late SettingProvider _settingProvider; + late DevicesProvider _devicesProvider; + late UserProvider _userProvider; + late TextEditingController _controller; @override void initState() { @@ -72,21 +77,21 @@ class _AutoCompleteDeviceNumberFieldState extends State models; - final bool enableValidate; + final List? models; + final bool? enableValidate; const PentryCalibrationToolForm({ - Key key, this.models, this.enableValidate, + Key? key, this.models, this.enableValidate, }) : super(key: key); @override @@ -25,7 +27,7 @@ class _PentryCalibrationToolFormState extends State { @override Widget build(BuildContext context) { - final subtitle = AppLocalization.of(context).subtitle; + final subtitle = AppLocalization.of(context)?.subtitle; final userProvider = Provider.of(context); return ListView.builder( padding: EdgeInsets.only( @@ -34,18 +36,18 @@ class _PentryCalibrationToolFormState extends State { right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context) ), - itemCount: widget.models.length + 1, + itemCount: widget.models!.length + 1, itemBuilder: (context,index){ - if(index == widget.models.length){ + if(index == widget.models?.length){ return AButton( - text: subtitle.add, + text: subtitle?.add??"", onPressed: (){ - widget.models.add(CalibrationTool()); + widget.models?.add(CalibrationTool()); setState(() {}); }, ); } - final model = widget.models[index]; + final model = widget.models![index]; return ListView( shrinkWrap: true, physics: const ClampingScrollPhysics(), @@ -57,9 +59,9 @@ class _PentryCalibrationToolFormState extends State { if(index != 0) ASmallButton( color: Theme.of(context).colorScheme.error, - text: subtitle.delete, + text: subtitle?.delete??"", onPressed: (){ - widget.models.remove(model); + widget.models?.remove(model); setState(() {}); }, ), @@ -70,7 +72,7 @@ class _PentryCalibrationToolFormState extends State { const SizedBox(height: 4,), AutoCompleteDeviceNumberField( initialValue: model.assetsNumber, - hospitalId: userProvider.user.hospital.id, + hospitalId: userProvider.user?.hospital?.id, onPick: (number){ model.assetsNumber = number; }, @@ -86,7 +88,7 @@ class _PentryCalibrationToolFormState extends State { }, ), const SizedBox(height: 8,), - Divider(color: Theme.of(context).textTheme.titleMedium.color,), + Divider(color: Theme.of(context).textTheme.titleMedium?.color,), ], ); } diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/old_lib/views/widgets/pentry/pentry_info_form.dart similarity index 56% rename from lib/views/widgets/pentry/pentry_info_form.dart rename to old_lib/views/widgets/pentry/pentry_info_form.dart index 1fadc1c9..dfaef01e 100644 --- a/lib/views/widgets/pentry/pentry_info_form.dart +++ b/old_lib/views/widgets/pentry/pentry_info_form.dart @@ -1,21 +1,23 @@ 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'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../models/pantry/pentry.dart'; +import '../../app_style/sizing.dart'; +import '../app_text_form_field.dart'; +import '../date_and_time/date_picker.dart'; +import '../images/mini_one_image_picker.dart'; +import '../status/pentry/pentry_status_mune.dart'; +import '../status/pentry/pentry_visit_status_mune.dart'; +import '../timer/app_timer.dart'; +import '../titles/app_sub_title.dart'; + class PentryInfoForm extends StatefulWidget { - final Pentry model; - final bool enableValidate; + final Pentry? model; + final bool? enableValidate; const PentryInfoForm({ - Key key, this.model, this.enableValidate, + Key? key, this.model, this.enableValidate, }) : super(key: key); @override @@ -26,7 +28,7 @@ class _PentryInfoFormState extends State { @override Widget build(BuildContext context) { - final subtitle = AppLocalization.of(context).subtitle; + final subtitle = AppLocalization.of(context)!.subtitle; final userProvider = Provider.of(context); return ListView( padding: EdgeInsets.only( @@ -40,24 +42,24 @@ class _PentryInfoFormState extends State { children: [ const SizedBox(height: 8,), const ASubTitle("PPM Visit Status"), - if(widget.enableValidate && widget.model.ppmVisitStatus == null) - ASubTitle(subtitle.requiredWord,color: Colors.red,), + if((widget.enableValidate??false) && widget.model?.ppmVisitStatus == null) + ASubTitle(subtitle?.requiredWord??"",color: Colors.red,), const SizedBox(height: 4,), PentryVisitsStatusMenu( - initialValue: widget.model.ppmVisitStatus, + initialValue: widget.model?.ppmVisitStatus, onSelect: (status){ - widget.model.ppmVisitStatus = 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,), + if((widget.enableValidate??false) && widget.model?.timer?.endAt == null) + ASubTitle(subtitle?.requiredWord??"",color: Colors.red,), const SizedBox(height: 4,), AppTimer( - timer: widget.model.timer, + timer: widget.model?.timer, onChange: (timer) async{ - widget.model.timer = timer; + widget.model?.timer = timer; return true; }, ), @@ -67,22 +69,22 @@ class _PentryInfoFormState extends State { // ASubTitle(subtitle.requiredWord,color: Colors.red,), const SizedBox(height: 4,), PentryStatusMenu( - initialValue: widget.model.status, + initialValue: widget.model?.status, onSelect: (status){ - widget.model.status = 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,), + if((widget.enableValidate ?? false ) && widget.model?.actualVisitDate == null) + ASubTitle(subtitle?.requiredWord??"",color: Colors.red,), const SizedBox(height: 4,), ADatePicker( - date: widget.model.actualVisitDate, + date: widget.model?.actualVisitDate, from: DateTime.now().subtract(const Duration(days: 30)), onDatePicker: (date){ if(date == null) return; - widget.model.actualVisitDate = date; + widget.model?.actualVisitDate = date; setState(() {}); }, ), @@ -90,21 +92,21 @@ class _PentryInfoFormState extends State { const ASubTitle("Traveling Hours"), const SizedBox(height: 4,), ATextFormField( - initialValue: (widget.model.travelingHours ?? "").toString(), + initialValue: (widget.model?.travelingHours ?? "").toString(), textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.number, onChange: (value){ - widget.model.travelingHours = value; + widget.model?.travelingHours = value; }, ), const SizedBox(height: 12,), const ASubTitle("PPM Attachment"), AMiniOneImagePicker( //error: _validate && _serviceReport.image == null, - image: widget.model.imageFile, + image: widget.model?.imageFile, onPick: (image){ - widget.model.imageFile =image; + widget.model?.imageFile =image; }, ), const SizedBox(height: 8,), diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/old_lib/views/widgets/pentry/pentry_pm_kit_form.dart similarity index 82% rename from lib/views/widgets/pentry/pentry_pm_kit_form.dart rename to old_lib/views/widgets/pentry/pentry_pm_kit_form.dart index 6fdd3b43..1d024b2e 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/old_lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -1,18 +1,20 @@ 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'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/lookup.dart'; +import '../../../models/pantry/pm_kit.dart'; +import '../../app_style/sizing.dart'; +import '../app_text_form_field.dart'; +import '../buttons/app_button.dart'; +import '../buttons/app_small_button.dart'; +import '../parts/auto_complete_parts_field.dart'; +import '../titles/app_sub_title.dart'; + class PentryPMKitForm extends StatefulWidget { - final List models; - final bool enableValidate; + final List? models; + final bool? enableValidate; const PentryPMKitForm({ - Key key, this.models, this.enableValidate, + Key? key, this.models, this.enableValidate, }) : super(key: key); @override @@ -23,7 +25,7 @@ class _PentryPMKitFormState extends State { @override Widget build(BuildContext context) { - final subtitle = AppLocalization.of(context).subtitle; + final subtitle = AppLocalization.of(context)?.subtitle; return ListView.builder( padding: EdgeInsets.only( top: 12 * AppStyle.getScaleFactor(context), @@ -31,18 +33,18 @@ class _PentryPMKitFormState extends State { right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context) ), - itemCount: widget.models.length + 1, + itemCount: (widget.models?.length??0) + 1, itemBuilder: (context,index){ - if(index == widget.models.length){ + if(index == widget.models?.length){ return AButton( - text: subtitle.add, + text: subtitle?.add??"", onPressed: (){ - widget.models.add(PMKit()); + widget.models?.add(PMKit()); setState(() {}); }, ); } - final model = widget.models[index]; + final model = widget.models![index]; return ListView( shrinkWrap: true, physics: const ClampingScrollPhysics(), @@ -54,9 +56,9 @@ class _PentryPMKitFormState extends State { if(index != 0) ASmallButton( color: Theme.of(context).colorScheme.error, - text: subtitle.delete, + text: subtitle?.delete??"", onPressed: (){ - widget.models.remove(model); + widget.models?.remove(model); setState(() {}); }, ), @@ -69,7 +71,7 @@ class _PentryPMKitFormState extends State { clearAfterPick: false, initialValue: (model.itemCode?.label ?? "").toString(), onPick: (part){ - model.itemCode = Lookup(id: int.tryParse(part.id),label: part.code); + model.itemCode = Lookup(id: int.tryParse(part.id!),label: part.code); }, ), const SizedBox(height: 8,), @@ -145,7 +147,7 @@ class _PentryPMKitFormState extends State { }, ), const SizedBox(height: 8,), - Divider(color: Theme.of(context).textTheme.titleMedium.color,), + Divider(color: Theme.of(context).textTheme.titleMedium?.color,), ], ); } diff --git a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart b/old_lib/views/widgets/pentry/pentry_ppm_check_list_form.dart similarity index 75% rename from lib/views/widgets/pentry/pentry_ppm_check_list_form.dart rename to old_lib/views/widgets/pentry/pentry_ppm_check_list_form.dart index 201c7498..b00c458c 100644 --- a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart +++ b/old_lib/views/widgets/pentry/pentry_ppm_check_list_form.dart @@ -1,17 +1,19 @@ 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'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/pantry/ppm_check_list.dart'; +import '../../app_style/sizing.dart'; +import '../app_text_form_field.dart'; +import '../buttons/app_button.dart'; +import '../buttons/app_small_button.dart'; +import '../status/pentry/pentry_task_status_mune.dart'; +import '../titles/app_sub_title.dart'; + class PentryPPMCheckListForm extends StatefulWidget { - final List models; - final bool enableValidate; + final List? models; + final bool? enableValidate; const PentryPPMCheckListForm({ - Key key, this.models, this.enableValidate, + Key? key, this.models, this.enableValidate, }) : super(key: key); @override @@ -23,7 +25,7 @@ class _PentryPPMCheckListFormState extends State { @override Widget build(BuildContext context) { - final subtitle = AppLocalization.of(context).subtitle; + final subtitle = AppLocalization.of(context)?.subtitle; return ListView.builder( padding: EdgeInsets.only( top: 12 * AppStyle.getScaleFactor(context), @@ -31,18 +33,18 @@ class _PentryPPMCheckListFormState extends State { right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context) ), - itemCount: widget.models.length + 1, + itemCount: (widget.models?.length??0) + 1, itemBuilder: (context,index){ - if(index == widget.models.length){ + if(index == widget.models?.length){ return AButton( - text: subtitle.add, + text: subtitle?.add??"", onPressed: (){ - widget.models.add(PPMCheckList()); + widget.models!.add(PPMCheckList()); setState(() {}); }, ); } - final model = widget.models[index]; + final model = widget.models![index]; return ListView( shrinkWrap: true, physics: const ClampingScrollPhysics(), @@ -54,9 +56,9 @@ class _PentryPPMCheckListFormState extends State { if(index != 0) ASmallButton( color: Theme.of(context).colorScheme.error, - text: subtitle.delete, + text: subtitle!.delete, onPressed: (){ - widget.models.remove(model); + widget.models!.remove(model); setState(() {}); }, ), @@ -75,7 +77,7 @@ class _PentryPPMCheckListFormState extends State { }, ), const SizedBox(height: 8,), - ASubTitle(subtitle.status), + ASubTitle(subtitle?.status??""), const SizedBox(height: 4,), PentryTaskStatusMenu( initialValue: model.status, @@ -108,7 +110,7 @@ class _PentryPPMCheckListFormState extends State { }, ), const SizedBox(height: 8,), - Divider(color: Theme.of(context).textTheme.titleMedium.color,), + Divider(color: Theme.of(context).textTheme.titleMedium?.color,), ], ); } diff --git a/lib/views/widgets/qr/scan_qr.dart b/old_lib/views/widgets/qr/scan_qr.dart similarity index 88% rename from lib/views/widgets/qr/scan_qr.dart rename to old_lib/views/widgets/qr/scan_qr.dart index 0c1cf10b..52c970db 100644 --- a/lib/views/widgets/qr/scan_qr.dart +++ b/old_lib/views/widgets/qr/scan_qr.dart @@ -5,16 +5,16 @@ import 'package:qr_code_scanner/qr_code_scanner.dart'; import '../buttons/app_icon_button.dart'; class ScanQr extends StatefulWidget { - const ScanQr({Key key}) : super(key: key); + const ScanQr({Key? key}) : super(key: key); @override - _ScanQrState createState() => _ScanQrState(); + ScanQrState createState() => ScanQrState(); } -class _ScanQrState extends State { +class ScanQrState extends State { - Barcode result; - QRViewController _controller; + Barcode? result; + QRViewController? _controller; bool _scanDone = false; final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner'); @@ -64,7 +64,7 @@ class _ScanQrState extends State { ), SafeArea( child: Padding( - padding: EdgeInsets.all(12.0), + padding: const EdgeInsets.all(12.0), child: AIconButton( iconData:Icons.arrow_back, onPressed: (){ diff --git a/old_lib/views/widgets/requests/info_row.dart b/old_lib/views/widgets/requests/info_row.dart new file mode 100644 index 00000000..b3d49716 --- /dev/null +++ b/old_lib/views/widgets/requests/info_row.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; + +import '../../app_style/sizing.dart'; + +class RequestInfoRow extends StatelessWidget { + final String? title; + final String? info; + final String? content; + final Widget? contentWidget; + final Widget? infoWidget; + + const RequestInfoRow({ + Key? key, + this.title, + this.info, + this.content, + this.contentWidget, + this.infoWidget, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + if (info != null && info!.isEmpty) { + return const SizedBox.shrink(); + } + if (content != null && content!.isEmpty) { + return const SizedBox.shrink(); + } + return Column( + children: [ + Row( + children: [ + Text( + "$title : ", + style: Theme.of(context).textTheme.titleSmall?.copyWith( + //fontSize: 12 + ), + textScaleFactor: AppStyle.getScaleFactor(context), + ), + if (info != null) + Expanded( + child: Text( + info ?? '', + style: Theme.of(context).textTheme.bodyMedium, + textAlign: TextAlign.right, + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ), + if (infoWidget != null) + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + infoWidget ?? const SizedBox(), + ], + ), + ), + ], + ), + if (content != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Row( + children: [ + Expanded( + child: Text( + content ?? 'No data found', + style: Theme.of(context).textTheme.bodyMedium, + textAlign: TextAlign.center, + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ), + ], + ), + ), + if (contentWidget != null) contentWidget!, + Divider( + color: Theme.of(context).primaryColor, + ), + ], + ); + } +} diff --git a/old_lib/views/widgets/requests/request_status.dart b/old_lib/views/widgets/requests/request_status.dart new file mode 100644 index 00000000..1722728a --- /dev/null +++ b/old_lib/views/widgets/requests/request_status.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + +class StatusLabel extends StatelessWidget { + final String? label; + final Color? color; + + const StatusLabel({ + Key? key, + this.label, + this.color, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 8), + alignment: Alignment.center, + decoration: BoxDecoration( + color: color ?? Colors.green, + borderRadius: BorderRadius.circular( + AppStyle.getBorderRadius(context), + ), + boxShadow: const [AppStyle.boxShadow], + ), + child: Text( + label ?? "no status", + style: Theme.of(context).textTheme.titleSmall?.copyWith( + color: color != null + ? color!.computeLuminance() > 0.5 + ? AColors.black + : Colors.white + : null, + ), + )); + } +} diff --git a/old_lib/views/widgets/requests/service_request_item.dart b/old_lib/views/widgets/requests/service_request_item.dart new file mode 100644 index 00000000..7b616df6 --- /dev/null +++ b/old_lib/views/widgets/requests/service_request_item.dart @@ -0,0 +1,312 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/enums/user_types.dart'; +import '../../../models/service_request/service_request.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/user.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; +import '../../pages/user/requests/report/create_service_report.dart'; +import '../loaders/image_loader.dart'; +import 'request_status.dart'; + +class ServiceRequestItem extends StatelessWidget { + final int index; + final ServiceRequest request; + final Function(ServiceRequest) onPressed; + + const ServiceRequestItem({ + Key? key, + required this.request, + required this.onPressed, + required this.index, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + User? user = Provider.of(context, listen: false).user; + Color itemColor = index % 2 == 0 + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.onPrimary; + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), + backgroundColor: itemColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + AppStyle.getBorderRadius(context), + ), + ), + ), + onPressed: () { + onPressed(request); + }, + child: Row( + children: [ + user?.type == UsersTypes.normal_user && + (request.devicePhotos?.isEmpty ?? true) + ? const SizedBox.shrink() + : SizedBox( + width: 80, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + request.devicePhotos?.isEmpty ?? true + ? const SizedBox.shrink() + : Column( + children: [ + SizedBox( + height: 80, + width: 80, + child: ImageLoader( + url: request.devicePhotos?.first ?? '', + boxFit: BoxFit.cover, + ), + ), + const SizedBox( + height: 24, + ), + ], + ), + + user?.type == UsersTypes.engineer + ? Material( + color: onItemColor, + elevation: 6, + shape: const CircleBorder(), + child: IconButton( + icon: Icon( + Icons.description, + color: itemColor, + size: 32, + ), + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => CreateServiceReport( + request: request, + ), + ), + ); + }, + ), + ) + : const SizedBox.shrink(), + //SizedBox(height: 8,), + ], + ), + ), + const SizedBox( + width: 8, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: request.requestCode == null + ? const SizedBox.shrink() + : Text( + request.requestCode ?? "-----", + style: Theme.of(context) + .textTheme + .titleLarge + ?.copyWith( + color: onItemColor, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + request.engineerName == null + ? const SizedBox.shrink() + : Text( + request.engineerName ?? "", + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith( + color: onItemColor, + fontSize: 12, + fontWeight: FontWeight.normal, + ), + ), + ], + ), + Divider( + color: onItemColor, + ), + Row( + children: [ + Expanded( + child: request.deviceModel == null + ? const SizedBox.shrink() + : Text( + request.deviceModel ?? + "Model not available", + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith( + color: onItemColor, + fontSize: 12, + fontWeight: FontWeight.normal, + ), + ), + ), + request.engineerMobile == null + ? const SizedBox.shrink() + : Text( + request.engineerMobile ?? '', + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith( + color: onItemColor, + fontSize: 12, + fontWeight: FontWeight.normal, + ), + ), + ], + ), + Divider( + color: onItemColor, + ), + Row( + children: [ + Expanded( + child: request.deviceSerialNumber == null + ? const SizedBox.shrink() + : Text( + request.deviceSerialNumber ?? '', + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith( + color: onItemColor, + fontSize: 12, + fontWeight: FontWeight.normal, + ), + ), + ), + ], + ), + request.deviceEnName == null + ? const SizedBox.shrink() + : Row( + children: [ + Expanded( + child: Text( + request.deviceEnName ?? '', + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith( + color: onItemColor, + fontSize: 12, + fontWeight: FontWeight.normal, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ), + Divider( + color: onItemColor, + ), + Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Text( + request.maintenanceIssue ?? + "No maintenance issue found", + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith(color: onItemColor), + textAlign: TextAlign.center, + ), + ), + ), + Divider(color: onItemColor), + Row( + children: [ + Text( + request.date ?? "Date not available", + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith(color: onItemColor), + ), + const Spacer(), + StatusLabel( + label: request.statusLabel, + color: AColors.getRequestStatusColor( + request.statusValue ?? 0, + ), + ), + ], + ), + request.nextVisitDate == null + ? const SizedBox.shrink() + : Column( + children: [ + Divider( + color: onItemColor, + ), + Row( + children: [ + Text( + subtitle?.nextVisitDate ?? '', + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith(color: onItemColor), + ), + const Spacer(), + Text( + DateFormat('EE dd/MM/yyyy') + .format(request.nextVisitDate!), + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith(color: onItemColor), + ), + ], + ), + ], + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/old_lib/views/widgets/requests/service_request_list.dart b/old_lib/views/widgets/requests/service_request_list.dart new file mode 100644 index 00000000..c9c677f6 --- /dev/null +++ b/old_lib/views/widgets/requests/service_request_list.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/service_request/service_request.dart'; +import '../../../models/subtitle.dart'; +import '../../pages/user/requests/request_details.dart'; +import '../loaders/lazy_loading.dart'; +import '../loaders/no_item_found.dart'; +import 'service_request_item.dart'; + +class ServiceRequestsList extends StatelessWidget { + final List requests; + final bool nextPage; + final Future Function() onLazyLoad; + + const ServiceRequestsList({ + Key? key, + required this.requests, + required this.nextPage, + required this.onLazyLoad, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + if (requests.isEmpty) { + return NoItemFound(message: subtitle?.noServiceRequestFound); + } + return LazyLoading( + nextPage: nextPage, + onLazyLoad: onLazyLoad, + onLoadingEnd: () { }, + child: ListView.builder( + //physics: BouncingScrollPhysics(), + itemCount: requests.length, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { + return ServiceRequestItem( + index: itemIndex, + request: requests[itemIndex], + onPressed: (request) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => RequestDetailsPage( + serviceRequest: request, + ), + ), + ); + }, + ); + }, + ), + ); + } +} diff --git a/old_lib/views/widgets/requests/service_request_update_dialog.dart b/old_lib/views/widgets/requests/service_request_update_dialog.dart new file mode 100644 index 00000000..f444debb --- /dev/null +++ b/old_lib/views/widgets/requests/service_request_update_dialog.dart @@ -0,0 +1,154 @@ +import 'package:flutter/cupertino.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter/material.dart'; + +import '../../../controllers/http_status_manger/http_status_manger.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../models/lookup.dart'; +import '../../../models/service_request/service_request.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/sizing.dart'; +import '../buttons/app_small_button.dart'; +import '../date_and_time/date_picker.dart'; +import '../status/employee/employee_mune.dart'; + +class ServiceRequestsUpdateDialog extends StatefulWidget { + final ServiceRequest request; + + const ServiceRequestsUpdateDialog({ + Key? key, + required this.request, + }) : super(key: key); + + @override + State createState() => + _ServiceRequestsUpdateDialogState(); +} + +class _ServiceRequestsUpdateDialogState + extends State with TickerProviderStateMixin { + DateTime? _dateTime; + Lookup? _employee; + Subtitle? _subtitle; + UserProvider? _userProvider; + SettingProvider? _settingProvider; + ServiceRequestsProvider? _serviceRequestsProvider; + + final GlobalKey _formKey = GlobalKey(); + + _update() async { + if (_dateTime == null && _employee == null) { + Fluttertoast.showToast(msg: _subtitle?.noDateFound ?? ''); + return; + } + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: Text(_subtitle?.updatingDots ?? ''), + content: const Center(child: CircularProgressIndicator()), + ); + }, + ); + int? status = await _serviceRequestsProvider?.updateDate( + user: _userProvider?.user, + host: _settingProvider?.host, + request: widget.request, + newDate: _dateTime?.toString().split(" ").first, + employee: _employee, + ); + if (status == 200) Navigator.of(context).pop(); + Navigator.of(context).pop(); + Fluttertoast.showToast( + msg: HttpStatusManger.getStatusMessage( + status: status, + subtitle: _subtitle, + ) ?? + '', + ); + } + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + _subtitle = AppLocalization.of(context)?.subtitle; + _userProvider = Provider.of(context, listen: false); + _settingProvider = Provider.of(context, listen: false); + _serviceRequestsProvider = + Provider.of(context, listen: false); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + // height: MediaQuery.of(context).size.height / 1.2, + child: Form( + key: _formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASmallButton( + text: _subtitle?.cancel, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ASmallButton( + text: _subtitle?.update, + onPressed: _update, + ) + ], + ), + SizedBox(height: 8.0 * AppStyle.getScaleFactor(context)), + Row( + children: [ + Expanded( + child: Text( + _subtitle?.date ?? '', + style: Theme.of(context).textTheme.subtitle1, + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ), + ADatePicker( + date: _dateTime!, + from: DateTime.now(), + onDatePicker: (date) { + _dateTime = date; + setState(() {}); + }, + ), + ], + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + EmployeeMenu( + initialValue: _employee, + onSelect: (employee) { + _employee = employee; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ], + ), + ), + ), + ), + ], + ); + } +} diff --git a/old_lib/views/widgets/search/filter_item.dart b/old_lib/views/widgets/search/filter_item.dart new file mode 100644 index 00000000..baeff0e8 --- /dev/null +++ b/old_lib/views/widgets/search/filter_item.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import '../../../models/lookup.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + +class FilterItem extends StatelessWidget { + final bool isSelected; + final Lookup? status; + final VoidCallback onSelected; + + const FilterItem({ + Key? key, + this.status, + required this.isSelected, + required this.onSelected, + }) : super(key: key); + + Color getStatusColor() { + switch (status?.id) { + case 0: + return AColors.green; + case 4: + return AColors.deepRed; + case 6: + return AColors.green; + case 5: + return AColors.orange; + case 8: + return AColors.green; + case 9: + return AColors.orange; + default: + return AColors.grey; + } + } + + @override + Widget build(BuildContext context) { + return Opacity( + opacity: isSelected ? 1 : .5, + child: SizedBox( + height: 30, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(horizontal: 8), + backgroundColor: getStatusColor(), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + AppStyle.getBorderRadius(context), + ), + ), + ), + onPressed: onSelected, + child: Text( + status?.label ?? "", + style: Theme.of(context).textTheme.bodyLarge?.copyWith( + color: getStatusColor().computeLuminance() > 0.5 + ? AColors.black + : Colors.white, + ), + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ), + ), + ); + } +} diff --git a/old_lib/views/widgets/search/service_request_search_bar.dart b/old_lib/views/widgets/search/service_request_search_bar.dart new file mode 100644 index 00000000..f284ce49 --- /dev/null +++ b/old_lib/views/widgets/search/service_request_search_bar.dart @@ -0,0 +1,189 @@ +import 'package:flutter/material.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../../models/lookup.dart'; +import '../../../models/service_request/service_request_search.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/sizing.dart'; +import '../app_text_form_field.dart'; +import '../buttons/app_button.dart'; +import '../buttons/app_small_button.dart'; +import '../hospitals/hospital_auto_complete_field.dart'; +import 'filter_item.dart'; + +class ServiceRequestsSearchDialog extends StatefulWidget { + final ServiceRequestSearch initialSearchValue; + final bool? expandedSearch; + final Function(ServiceRequestSearch)? onSearch; + + const ServiceRequestsSearchDialog({ + Key? key, + required this.initialSearchValue, + this.expandedSearch, + this.onSearch, + }) : super(key: key); + + @override + ServiceRequestsSearchDialogState createState() => + ServiceRequestsSearchDialogState(); +} + +class ServiceRequestsSearchDialogState + extends State with TickerProviderStateMixin { + final GlobalKey _formKey = GlobalKey(); + + late ServiceRequestSearch _search; + late List status = const [ + Lookup(label: "New", id: 4), + Lookup(label: "Repaired", id: 6), + Lookup(label: "Repeated", id: 8), + Lookup(label: "Closed", id: 9), + Lookup(label: "Under Repair", id: 5), + ]; + + @override + void initState() { + super.initState(); + _search = ServiceRequestSearch(); + _search.fromSearch(widget.initialSearchValue); + } + + @override + Widget build(BuildContext context) { + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + return SizedBox( + height: MediaQuery.of(context).size.height / 1.2, + child: Form( + key: _formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASmallButton( + text: subtitle?.cancel, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ASmallButton( + text: subtitle?.search, + onPressed: () { + if (!(_formKey.currentState?.validate() ?? true)) return; + _formKey.currentState?.save(); + Navigator.of(context).pop(_search); + }, + ) + ], + ), + SizedBox(height: 8.0 * AppStyle.getScaleFactor(context)), + ATextFormField( + initialValue: _search.deviceSerialNumber, + hintText: subtitle?.serialNumber, + style: Theme.of(context).textTheme.titleLarge, + textInputAction: TextInputAction.search, + onAction: () { + if (!(_formKey.currentState?.validate() ?? true)) return; + _formKey.currentState?.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.deviceSerialNumber = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + HospitalAutoCompleteField( + initialValue: _search.hospital ?? '', + onSave: (value) { + _search.hospital = value; + }, + onSearch: (value) { + _search.hospital = value; + Navigator.of(context).pop(_search); + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.deviceName, + hintText: subtitle?.deviceName, + style: Theme.of(context).textTheme.titleLarge, + textInputAction: TextInputAction.search, + onAction: () { + if (!(_formKey.currentState?.validate() ?? true)) return; + _formKey.currentState?.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.deviceName = value; + }, + ), + SizedBox(height: 8.0 * AppStyle.getScaleFactor(context)), + ATextFormField( + initialValue: _search.model, + hintText: subtitle?.model, + style: Theme.of(context).textTheme.titleLarge, + textInputAction: TextInputAction.search, + onAction: () { + if (!(_formKey.currentState?.validate() ?? true)) return; + _formKey.currentState?.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.model = value; + }, + ), + SizedBox( + height: 16 * AppStyle.getScaleFactor(context), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Wrap( + spacing: 10, + runSpacing: 10, + alignment: WrapAlignment.spaceEvenly, + children: List.generate(status.length, (index) { + bool isSelected = _search.statusValue == status[index].id; + return FilterItem( + isSelected: isSelected, + onSelected: () { + if (isSelected) { + _search.statusValue = null; + } else { + _search.statusValue = status[index].id; + } + setState(() {}); + }, + status: status[index], + ); + }), + ), + ), + Visibility( + visible: widget.initialSearchValue.toSearchString().isNotEmpty, + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 8, + horizontal: 16, + ), + child: AButton( + padding: EdgeInsets.zero, + text: subtitle?.clearSearch ?? '', + onPressed: () { + _search = ServiceRequestSearch(); + Navigator.of(context).pop(_search); + }, + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/old_lib/views/widgets/search/visits_search_bar.dart b/old_lib/views/widgets/search/visits_search_bar.dart new file mode 100644 index 00000000..a9d2ce72 --- /dev/null +++ b/old_lib/views/widgets/search/visits_search_bar.dart @@ -0,0 +1,272 @@ +import 'package:flutter/material.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/lookup.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/visits/visits_search.dart'; +import '../../app_style/sizing.dart'; +import '../app_text_form_field.dart'; +import '../buttons/app_button.dart'; +import '../buttons/app_small_button.dart'; +import '../date_and_time/from_to_date_bar.dart'; +import '../hospitals/hospital_auto_complete_field.dart'; +import '../titles/app_sub_title.dart'; +import 'filter_item.dart'; + +class VisitsSearchDialog extends StatefulWidget { + final VisitsSearch initialSearchValue; + final bool? expandedSearch; + final Function(VisitsSearch) onSearch; + + const VisitsSearchDialog({ + Key? key, + required this.initialSearchValue, + this.expandedSearch, + required this.onSearch, + }) : super(key: key); + + @override + VisitsSearchDialogState createState() => VisitsSearchDialogState(); +} + +class VisitsSearchDialogState extends State + with TickerProviderStateMixin { + VisitsSearch? _search; + List status = const [ + Lookup( + label: "Done", + id: 0, + ), + Lookup(label: "Not Yet", id: 1), + Lookup( + label: "On Hold", + id: 2, + ), + ]; + + List contactStatus = const [ + Lookup( + label: "Hospital Employee", + key: "H", + ), + Lookup(label: "Under Warranty", key: "CW"), + Lookup( + label: "Under Maintenance Contract", + key: "CC", + ), + ]; + + final GlobalKey _formKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _search = VisitsSearch(); + _search?.fromSearch(widget.initialSearchValue); + } + + @override + Widget build(BuildContext context) { + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + DateTime today = DateTime.now(); + return SizedBox( + height: MediaQuery.of(context).size.height / 1.3, + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASmallButton( + text: subtitle?.cancel, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ASmallButton( + text: subtitle?.search, + onPressed: () { + if (!(_formKey.currentState?.validate() ?? true)) { + return; + } + _formKey.currentState?.save(); + Navigator.of(context).pop(_search); + }, + ) + ], + ), + ATextFormField( + initialValue: _search?.deviceSerialNumber, + hintText: subtitle?.serialNumber, + style: Theme.of(context).textTheme.titleLarge, + textInputAction: TextInputAction.search, + onAction: () { + if (!(_formKey.currentState?.validate() ?? true)) return; + _formKey.currentState?.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search?.deviceSerialNumber = value ?? ''; + }, + ), + SizedBox(height: 8.0 * AppStyle.getScaleFactor(context)), + HospitalAutoCompleteField( + initialValue: _search?.hospitalName ?? '', + onSave: (value) { + _search?.hospitalName = value; + }, + onSearch: (value) { + _search?.hospitalName = value; + Navigator.of(context).pop(_search); + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search?.brand, + hintText: subtitle?.brand, + style: Theme.of(context).textTheme.titleLarge, + textInputAction: TextInputAction.search, + onAction: () { + if (!(_formKey.currentState?.validate() ?? false)) return; + _formKey.currentState?.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search?.brand = value ?? ''; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search?.model, + hintText: subtitle?.model, + style: Theme.of(context).textTheme.titleLarge, + textInputAction: TextInputAction.search, + onAction: () { + if (!(_formKey.currentState?.validate() ?? true)) return; + _formKey.currentState?.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search?.model = value ?? ''; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ASubTitle(subtitle?.status ?? ''), + SizedBox( + height: 4.0 * AppStyle.getScaleFactor(context), + ), + Wrap( + spacing: 10, + runSpacing: 10, + children: List.generate(status.length, (index) { + bool isSelected = _search?.statusValue == status[index].id; + return FilterItem( + isSelected: isSelected, + onSelected: () { + if (isSelected) { + _search?.statusValue = null; + } else { + _search?.statusValue = status[index].id; + } + setState(() {}); + }, + status: status[index], + ); + }), + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ASubTitle(subtitle?.contactStatus ?? ''), + SizedBox( + height: 4.0 * AppStyle.getScaleFactor(context), + ), + Wrap( + spacing: 10, + runSpacing: 10, + children: List.generate( + contactStatus.length, + (index) { + bool isSelected = + _search?.contactStatus == contactStatus[index].key; + return FilterItem( + isSelected: isSelected, + onSelected: () { + if (isSelected) { + _search?.contactStatus = null; + } else { + _search?.contactStatus = contactStatus[index].key; + } + setState(() {}); + }, + status: contactStatus[index], + ); + }, + ), + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ASubTitle(subtitle?.actualDate ?? ''), + SizedBox( + height: 4.0 * AppStyle.getScaleFactor(context), + ), + FromToDateBar( + from: _search!.actualDateFrom!, + to: _search!.actualDateTo!, + onPickFrom: (date) { + _search?.actualDateFrom = date; + }, + onPickTo: (date) { + _search?.actualDateTo = date; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ASubTitle(subtitle?.expectDate ?? ''), + SizedBox( + height: 4.0 * AppStyle.getScaleFactor(context), + ), + FromToDateBar( + from: _search?.expectedDateFrom ?? + DateTime(today.year, today.month, 1), + to: _search?.expectedDateTo ?? + DateTime(today.year, (today.month + 1).clamp(1, 12), + today.month == 12 ? 31 : 0), + onPickFrom: (date) { + _search?.expectedDateFrom = date; + }, + onPickTo: (date) { + _search?.expectedDateTo = date; + }, + ), + Visibility( + visible: _search?.toSearchString().isNotEmpty ?? false, + child: Padding( + padding: + const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: AButton( + padding: EdgeInsets.zero, + text: subtitle?.clearSearch ?? '', + onPressed: () { + _search = VisitsSearch(); + Navigator.of(context).pop(_search); + }, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/sound/record_sound.dart b/old_lib/views/widgets/sound/record_sound.dart similarity index 80% rename from lib/views/widgets/sound/record_sound.dart rename to old_lib/views/widgets/sound/record_sound.dart index 5ca797e4..d22ec9fe 100644 --- a/lib/views/widgets/sound/record_sound.dart +++ b/old_lib/views/widgets/sound/record_sound.dart @@ -3,28 +3,30 @@ import 'package:flutter/services.dart'; import 'package:flutter_sound/flutter_sound.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:rive/rive.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; -import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; -import 'package:test_sa/views/widgets/sound/sound_player.dart'; - import '../../app_style/sizing.dart'; +import '../buttons/app_icon_button2.dart'; +import '../buttons/app_small_button.dart'; +import 'sound_player.dart'; class RecordSound extends StatefulWidget { - final Function(String) onRecord; + final Function(String?) onRecord; - const RecordSound({Key key, @required this.onRecord}) : super(key: key); + const RecordSound({ + Key? key, + required this.onRecord, + }) : super(key: key); @override State createState() => _RecordSoundState(); } class _RecordSoundState extends State { - FlutterSoundRecorder _myRecorder = FlutterSoundRecorder(); + FlutterSoundRecorder? _myRecorder = FlutterSoundRecorder(); bool _recorderIsOpened = false; bool _recording = false; bool _fastTab = false; - String _record; - Artboard _rive; + String? _record; + late Artboard _rive; @override void setState(VoidCallback fn) { @@ -34,7 +36,7 @@ class _RecordSoundState extends State { @override void initState() { super.initState(); - _myRecorder.openRecorder().then((value) { + _myRecorder?.openRecorder().then((value) { _recorderIsOpened = true; setState(() {}); }); @@ -61,7 +63,7 @@ class _RecordSoundState extends State { @override void dispose() { // Be careful : you must `close` the audio session when you have finished with it. - _myRecorder.closeRecorder(); + _myRecorder?.closeRecorder(); _myRecorder = null; super.dispose(); } @@ -75,11 +77,15 @@ class _RecordSoundState extends State { } _rive.addController(SimpleAnimation('recording')); if (!_recorderIsOpened) { - await _myRecorder.openRecorder(); + await _myRecorder?.openRecorder(); _recorderIsOpened = true; } - await _myRecorder.startRecorder(toFile: "record_${DateTime.now().millisecondsSinceEpoch}.mp4", codec: Codec.aacMP4, sampleRate: 360000, bitRate: 360000); + await _myRecorder?.startRecorder( + toFile: "record_${DateTime.now().millisecondsSinceEpoch}.mp4", + codec: Codec.aacMP4, + sampleRate: 360000, + bitRate: 360000); _recording = true; setState(() {}); @@ -91,7 +97,7 @@ class _RecordSoundState extends State { setState(() {}); return; } - String path = (await _myRecorder.stopRecorder()).toString(); + String path = (await _myRecorder?.stopRecorder()).toString(); _record = path; widget.onRecord(path); _recording = false; @@ -100,8 +106,8 @@ class _RecordSoundState extends State { _cancelRecording() async { if (!_recording) return; - String path = await _myRecorder.stopRecorder(); - _myRecorder.deleteRecord(fileName: path); + final path = await _myRecorder?.stopRecorder(); + _myRecorder?.deleteRecord(fileName: path ?? ''); _rive.addController(SimpleAnimation('delete')); // rebuild(); @@ -114,13 +120,14 @@ class _RecordSoundState extends State { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.only(left: 12, right: 0), + padding: const EdgeInsets.only(left: 12, right: 0), decoration: BoxDecoration( - color: Color(0xfff5f5f5), + color: const Color(0xfff5f5f5), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), child: Column( children: [ @@ -140,13 +147,15 @@ class _RecordSoundState extends State { child: Stack( children: [ SizedBox( - height: 24 * AppStyle.getScaleFactor(context), + height: + 24 * AppStyle.getScaleFactor(context), child: Rive( artboard: _rive, )), InkWell( child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), + height: + 32 * AppStyle.getScaleFactor(context), width: MediaQuery.of(context).size.width, ), onTap: () { diff --git a/old_lib/views/widgets/sound/sound_player.dart b/old_lib/views/widgets/sound/sound_player.dart new file mode 100644 index 00000000..f6a4f143 --- /dev/null +++ b/old_lib/views/widgets/sound/sound_player.dart @@ -0,0 +1,226 @@ +import 'package:audioplayers/audioplayers.dart'; +import 'package:flutter/material.dart'; + +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + +class ASoundPlayer extends StatefulWidget { + final String? audio; + + const ASoundPlayer({Key? key, this.audio}) : super(key: key); + + @override + ASoundPlayerState createState() => ASoundPlayerState(); +} + +class ASoundPlayerState extends State { + //FlutterSoundPlayer _myPlayer = FlutterSoundPlayer(); + bool _sliderMoving = false; + Duration? _audioTime; + Duration? _audioPosition; + String? _audio; + bool _isLocalFile = false; + bool _failedToLoad = false; + AudioPlayer? _audioPlayer; + + Widget _getAudioButton() { + switch (_audioPlayer?.state) { + case PlayerState.playing: + return IconButton( + icon: const Icon(Icons.pause_rounded), + onPressed: () async { + _failedToLoad = false; + await _audioPlayer?.pause(); + rebuild(); + }); + case PlayerState.paused: + return IconButton( + icon: const Icon(Icons.play_arrow_rounded), + onPressed: () async { + _failedToLoad = false; + await _audioPlayer?.resume(); + rebuild(); + }); + case PlayerState.completed: + return IconButton( + icon: const Icon(Icons.replay_rounded), + onPressed: () async { + _failedToLoad = false; + await _audioPlayer?.stop(); + await _audioPlayer?.resume(); + rebuild(); + }); + case PlayerState.stopped: + return IconButton( + icon: Icon(_isLocalFile + ? Icons.play_circle_fill_outlined + : Icons.download_rounded), + onPressed: () async { + _failedToLoad = false; + try { + await _audioPlayer?.play( + _isLocalFile + ? DeviceFileSource(_audio ?? '') + : UrlSource(_audio ?? ''), + ); + rebuild(); + } on Exception catch (e) { + _failedToLoad = true; + } + }); + default: + return IconButton( + icon: const Icon(Icons.replay_rounded), + onPressed: () async { + _failedToLoad = false; + try { + _audioPlayer?.seek(const Duration(milliseconds: 0)); + _audioPlayer?.stop(); + await _audioPlayer?.play( + _isLocalFile + ? DeviceFileSource(_audio ?? '') + : UrlSource(_audio ?? ''), + ); + rebuild(); + } on Exception catch (e) { + _failedToLoad = true; + } + }); + } + } + + String format(Duration? d) { + if (d == null) return "00:00"; + return d.toString().substring(2, 7); + } + + rebuild() { + if (!mounted) return; + setState(() {}); + } + + bool _isLocalUrl(String url) { + if (url.isEmpty != false) return false; + return url.startsWith("/") || + url.startsWith("file://") || + url.substring(1).startsWith(':\\'); + } + + @override + void initState() { + super.initState(); + _audioPlayer = AudioPlayer(); + _audioPlayer?.release(); + _audio = widget.audio; + _isLocalFile = _isLocalUrl(_audio ?? ''); + _audioPlayer?.setReleaseMode(ReleaseMode.stop); + if (_isLocalFile) { + _audioPlayer?.setSourceDeviceFile(_audio ?? '').then((value) { + rebuild(); + }); + } else { + _audioPlayer?.setReleaseMode(ReleaseMode.stop); + } + // set up listeners + _audioPlayer?.onPositionChanged.listen((Duration duration) { + if (!_sliderMoving) { + _audioPosition = duration; + rebuild(); + } + //setState(() => position = p); + }); + _audioPlayer?.onPlayerStateChanged.listen((event) { + //_audioPosition = _audioTime; + rebuild(); + }); + _audioPlayer?.onDurationChanged.listen((Duration duration) { + _audioTime = duration; + rebuild(); + }); + _audioPlayer?.onSeekComplete.listen((event) { + rebuild(); + }); + } + + @override + void dispose() { + super.dispose(); + // _myPlayer.closeAudioSession(); + _audioPlayer?.release(); + _audioPlayer?.dispose(); + } + + @override + Widget build(BuildContext context) { + if (_audio != widget.audio) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + _audio = widget.audio; + if (_isLocalFile) { + await _audioPlayer?.setSourceDeviceFile(_audio ?? ''); + } else { + await _audioPlayer?.setSourceUrl(_audio ?? ''); + } + _audioPlayer?.seek(const Duration(milliseconds: 0)); + _audioPlayer?.stop(); + rebuild(); + }); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + children: [ + Material(color: Colors.transparent, child: _getAudioButton()), + Expanded( + child: Slider( + value: _audioPosition?.inMilliseconds.toDouble() ?? 0.0, + min: 0, + max: _audioTime?.inMilliseconds.toDouble() ?? 60.0, + onChangeStart: (value) { + _sliderMoving = true; + }, + onChanged: (value) { + _audioPosition = Duration(milliseconds: value.round()); + rebuild(); + }, + onChangeEnd: (value) { + _sliderMoving = false; + _audioPlayer?.seek(Duration(milliseconds: value.round())); + rebuild(); + }), + ), + ], + ), + Row( + children: [ + Expanded( + child: Visibility( + visible: _failedToLoad, + child: Row( + children: [ + Text( + "Failed to load", + style: Theme.of(context) + .textTheme + .labelSmall + ?.copyWith(color: AColors.red), + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ], + ), + ), + ), + Visibility( + visible: _audioPlayer?.state != PlayerState.stopped, + child: Text( + "${format(_audioPosition)}/${format(_audioTime)}", + style: Theme.of(context).textTheme.labelSmall, + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ), + ], + ) + ], + ); + } +} diff --git a/lib/views/widgets/speech_to_text/speech_to_text.dart b/old_lib/views/widgets/speech_to_text/speech_to_text.dart similarity index 65% rename from lib/views/widgets/speech_to_text/speech_to_text.dart rename to old_lib/views/widgets/speech_to_text/speech_to_text.dart index 7d4b96d7..dfda51f5 100644 --- a/lib/views/widgets/speech_to_text/speech_to_text.dart +++ b/old_lib/views/widgets/speech_to_text/speech_to_text.dart @@ -4,25 +4,27 @@ import 'package:provider/provider.dart'; import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_recognition_result.dart'; import 'package:speech_to_text/speech_to_text.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../app_style/sizing.dart'; +import '../buttons/app_icon_button2.dart'; +import '../titles/app_sub_title.dart'; class SpeechToTextButton extends StatefulWidget { - final TextEditingController controller; + final TextEditingController? controller; final bool mini; - const SpeechToTextButton({Key key, this.controller, this.mini = false}) : super(key: key); + const SpeechToTextButton({Key? key, this.controller, this.mini = false}) + : super(key: key); @override - _SpeechToTextButtonState createState() => _SpeechToTextButtonState(); + SpeechToTextButtonState createState() => SpeechToTextButtonState(); } -class _SpeechToTextButtonState extends State { +class SpeechToTextButtonState extends State { bool _speechEnabled = false; - SettingProvider _settingProvider; - SpeechToText _speechToText = SpeechToText(); + SettingProvider? _settingProvider; + final SpeechToText _speechToText = SpeechToText(); /// This has to happen only once per app void _initSpeech() async { @@ -44,10 +46,10 @@ class _SpeechToTextButtonState extends State { if (!_speechEnabled) return; await _speechToText.listen( onResult: (SpeechRecognitionResult result) { - widget.controller.text = result.recognizedWords; + widget.controller?.text = result.recognizedWords; setState(() {}); }, - localeId: _settingProvider.speechToText); + localeId: _settingProvider?.speechToText); setState(() {}); } @@ -68,7 +70,7 @@ class _SpeechToTextButtonState extends State { @override void setState(VoidCallback fn) { - if (!this.mounted) return; + if (!mounted) return; super.setState(fn); } @@ -76,41 +78,43 @@ class _SpeechToTextButtonState extends State { Widget build(BuildContext context) { _settingProvider = Provider.of(context); return Container( - padding: EdgeInsets.only(left: 12, right: 12), + padding: const EdgeInsets.only(left: 12, right: 12), decoration: BoxDecoration( - color: Color(0xfff5f5f5), + color: const Color(0xfff5f5f5), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context), ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), child: Row( children: [ - widget.mini ? SizedBox.shrink() : ASubTitle("Text To Speech"), - widget.controller.text.isNotEmpty + widget.mini ? const SizedBox.shrink() : ASubTitle("Text To Speech"), + widget.controller?.text.isNotEmpty ?? false ? AIconButton2( iconData: Icons.delete, onPressed: () { - widget.controller.clear(); + widget.controller?.clear(); setState(() {}); }, ) - : SizedBox.shrink(), - Spacer(), + : const SizedBox.shrink(), + const Spacer(), TextButton( onPressed: () { if (_speechToText.isListening) return; - if (_settingProvider.speechToText == "ar") { - _settingProvider.setSpeechToText("en"); + if (_settingProvider?.speechToText == "ar") { + _settingProvider?.setSpeechToText("en"); } else { - _settingProvider.setSpeechToText("ar"); + _settingProvider?.setSpeechToText("ar"); } }, - child: Text(_settingProvider.speechToText)), + child: Text(_settingProvider?.speechToText ?? '')), GestureDetector( child: _speechToText.isListening - ? Icon( + ? const Icon( Icons.fiber_manual_record, color: Colors.red, ) diff --git a/old_lib/views/widgets/status/employee/employee_mune.dart b/old_lib/views/widgets/status/employee/employee_mune.dart new file mode 100644 index 00000000..fcec5e2f --- /dev/null +++ b/old_lib/views/widgets/status/employee/employee_mune.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../../../controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + +class EmployeeMenu extends StatelessWidget { + final Function(Lookup?) onSelect; + final Lookup? initialValue; + + const EmployeeMenu({ + Key? key, + required this.onSelect, + required this.initialValue, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(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, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/gas_refill/gas_cylinder_size.dart b/old_lib/views/widgets/status/gas_refill/gas_cylinder_size.dart new file mode 100644 index 00000000..6dd4f243 --- /dev/null +++ b/old_lib/views/widgets/status/gas_refill/gas_cylinder_size.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../../../controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + +class GasCylinderSizeMenu extends StatelessWidget { + final Function(Lookup?)? onSelect; + final Lookup? initialValue; + + const GasCylinderSizeMenu({ + Key? key, + this.onSelect, + this.initialValue, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(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, + ), + ); + } +} diff --git a/lib/views/widgets/status/gas_refill/gas_status.dart b/old_lib/views/widgets/status/gas_refill/gas_status.dart similarity index 53% rename from lib/views/widgets/status/gas_refill/gas_status.dart rename to old_lib/views/widgets/status/gas_refill/gas_status.dart index 1dce0c71..3652e46b 100644 --- a/lib/views/widgets/status/gas_refill/gas_status.dart +++ b/old_lib/views/widgets/status/gas_refill/gas_status.dart @@ -1,16 +1,20 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_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 '../../../../controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + class GasStatusMenu extends StatelessWidget { - final Function(Lookup) onSelect; - final Lookup initialValue; + final Function(Lookup?)? onSelect; + final Lookup? initialValue; + + const GasStatusMenu({Key? key, this.onSelect, this.initialValue}) + : super(key: key); - const GasStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { final settingProvider = Provider.of(context); @@ -23,15 +27,12 @@ class GasStatusMenu extends StatelessWidget { onRefresh: () async { menuProvider.reset(); await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/old_lib/views/widgets/status/gas_refill/gas_type.dart b/old_lib/views/widgets/status/gas_refill/gas_type.dart new file mode 100644 index 00000000..35d6aba8 --- /dev/null +++ b/old_lib/views/widgets/status/gas_refill/gas_type.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../../../controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + +class GasTypeMenu extends StatelessWidget { + final Function(Lookup?)? onSelect; + final Lookup? initialValue; + + const GasTypeMenu({ + Key? key, + this.onSelect, + this.initialValue, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(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, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/multi_status_menu.dart b/old_lib/views/widgets/status/multi_status_menu.dart new file mode 100644 index 00000000..9510daea --- /dev/null +++ b/old_lib/views/widgets/status/multi_status_menu.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; + +import '../../../models/lookup.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + +class MultiStatusMenu extends StatefulWidget { + final List statuses; + final List initialSelectedStatus; + final Function(List) onSelect; + + const MultiStatusMenu({ + Key? key, + required this.statuses, + required this.onSelect, + required this.initialSelectedStatus, + }) : super(key: key); + + @override + MultiStatusMenuState createState() => MultiStatusMenuState(); +} + +class MultiStatusMenuState extends State { + final List _selectedStatus = []; + late TextEditingController _controller; + + @override + void initState() { + _controller = TextEditingController(); + _selectedStatus.addAll(widget.initialSelectedStatus); + super.initState(); + } + + @override + void dispose() { + _controller.clear(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + crossAxisAlignment: WrapCrossAlignment.start, + alignment: WrapAlignment.start, + runAlignment: WrapAlignment.start, + children: List.generate(_selectedStatus.length, (index) { + final status = _selectedStatus[index]; + return Container( + height: (36 * AppStyle.getScaleFactor(context)).toDouble(), + margin: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), + //padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primary, + borderRadius: BorderRadius.circular(8)), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + width: 12, + ), + Text( + status.label ?? '', + style: Theme.of(context).textTheme.bodyLarge?.copyWith( + color: Theme.of(context).colorScheme.onPrimary, + ), + ), + IconButton( + color: Theme.of(context).colorScheme.onPrimary, + onPressed: () { + _selectedStatus.remove(status); + widget.onSelect(_selectedStatus); + setState(() {}); + }, + icon: const Icon(Icons.delete)) + ], + )); + }), + ), + 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( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.titleMedium, + 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) { + return widget.statuses.where((Lookup option) { + return option.label?.toLowerCase().contains(_controller.text) ?? + false; + }); + }, + itemBuilder: (context, part) { + return ListTile(title: Text(part.label ?? '')); + }, + onSuggestionSelected: (status) { + _controller.clear(); + if (!_selectedStatus.contains(status)) { + _selectedStatus.add(status); + widget.onSelect(_selectedStatus); + setState(() {}); + } + }, + ), + ), + ], + ); + } +} diff --git a/old_lib/views/widgets/status/pentry/pentry_status_mune.dart b/old_lib/views/widgets/status/pentry/pentry_status_mune.dart new file mode 100644 index 00000000..2b272260 --- /dev/null +++ b/old_lib/views/widgets/status/pentry/pentry_status_mune.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../../../../controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../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(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(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, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/pentry/pentry_task_status_mune.dart b/old_lib/views/widgets/status/pentry/pentry_task_status_mune.dart new file mode 100644 index 00000000..fa4ea95d --- /dev/null +++ b/old_lib/views/widgets/status/pentry/pentry_task_status_mune.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../../../controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../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(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(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, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/pentry/pentry_visit_status_mune.dart b/old_lib/views/widgets/status/pentry/pentry_visit_status_mune.dart new file mode 100644 index 00000000..b34e82b2 --- /dev/null +++ b/old_lib/views/widgets/status/pentry/pentry_visit_status_mune.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../../../controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../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(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(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, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/report/service_report_last_call.dart b/old_lib/views/widgets/status/report/service_report_last_call.dart new file mode 100644 index 00000000..e8e021eb --- /dev/null +++ b/old_lib/views/widgets/status/report/service_report_last_call.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../../../models/service_report.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + +class ServiceReportLastCallsMenu extends StatelessWidget { + final Function(Lookup?)? onSelect; + final ServiceReport? report; + + const ServiceReportLastCallsMenu({ + Key? key, + required this.onSelect, + required this.report, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + ServiceReportLastCallsProvider menuProvider = + Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.calls == null, + stateCode: menuProvider.stateCode, + onRefresh: () async {}, + child: SingleStatusMenu( + initialStatus: report?.callLastSituation, + statuses: menuProvider.calls, + onSelect: onSelect, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/report/service_report_reasons.dart b/old_lib/views/widgets/status/report/service_report_reasons.dart new file mode 100644 index 00000000..3f68dfa9 --- /dev/null +++ b/old_lib/views/widgets/status/report/service_report_reasons.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../../../../controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + +class ServiceReportReasonsMenu extends StatelessWidget { + final Lookup? initialValue; + final Function(Lookup?)? onSelect; + + const ServiceReportReasonsMenu({ + Key? key, + this.onSelect, + this.initialValue, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceReportReasonsProvider menuProvider = + Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.reasons == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getTypes( + user: userProvider.user, + host: settingProvider.host, + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.reasons, + onSelect: onSelect, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/report/service_report_status.dart b/old_lib/views/widgets/status/report/service_report_status.dart new file mode 100644 index 00000000..aa622d3a --- /dev/null +++ b/old_lib/views/widgets/status/report/service_report_status.dart @@ -0,0 +1,82 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; +import '../../../../controllers/providers/api/status_drop_down/report/service_report_status_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../../../models/service_report.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + +class ServiceReportStatusMenu extends StatefulWidget { + final Function(Lookup?) onSelect; + final ServiceReport? report; + + const ServiceReportStatusMenu({ + Key? key, + required this.onSelect, + this.report, + }) : super(key: key); + + @override + State createState() => + _ServiceReportStatusMenuState(); +} + +class _ServiceReportStatusMenuState extends State { + bool firstTime = true; + + @override + Widget build(BuildContext context) { + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceReportStatusProvider menuProvider = + Provider.of(context); + ServiceReportLastCallsProvider callsLastSituationsProvider = + Provider.of(context, listen: false); + if (firstTime) { + callsLastSituationsProvider.reset(); + + firstTime = false; + } + return LoadingManager( + isLoading: menuProvider.isLoading == true || + callsLastSituationsProvider.isLoading == true, + isFailedLoading: menuProvider.statuses == null || + callsLastSituationsProvider.calls == null, + stateCode: menuProvider.stateCode == null || + callsLastSituationsProvider.stateCode == null + ? null + : max(menuProvider.stateCode ?? 0, + callsLastSituationsProvider.stateCode ?? 0), + onRefresh: () async { + if (menuProvider.stateCode == null) { + menuProvider.reset(); + await menuProvider.getTypes( + user: userProvider.user, + host: settingProvider.host, + ); + } + await callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: widget.report?.status?.id.toString()); + }, + child: SingleStatusMenu( + statuses: menuProvider.statuses, + initialStatus: widget.report?.status, + onSelect: (status) { + callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: status?.id.toString()); + widget.report?.callLastSituation = null; + widget.onSelect(status); + }, + )); + } +} diff --git a/lib/views/widgets/status/report/service_report_type.dart b/old_lib/views/widgets/status/report/service_report_type.dart similarity index 54% rename from lib/views/widgets/status/report/service_report_type.dart rename to old_lib/views/widgets/status/report/service_report_type.dart index fb315747..486f43ad 100644 --- a/lib/views/widgets/status/report/service_report_type.dart +++ b/old_lib/views/widgets/status/report/service_report_type.dart @@ -1,21 +1,29 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_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'; + +import '../../../../controllers/providers/api/status_drop_down/report/service_report_types_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + class ServiceReportTypeMenu extends StatelessWidget { - final Function(Lookup) onSelect; - final Lookup initialValue; + final Function(Lookup?) onSelect; + final Lookup? initialValue; + + const ServiceReportTypeMenu({ + Key? key, + required this.onSelect, + this.initialValue, + }) : super(key: key); - const ServiceReportTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { SettingProvider settingProvider = Provider.of(context); UserProvider userProvider = Provider.of(context); - ServiceReportTypesProvider menuProvider = Provider.of(context); + ServiceReportTypesProvider menuProvider = + Provider.of(context); return LoadingManager( isLoading: menuProvider.isLoading, isFailedLoading: menuProvider.types == null, @@ -24,7 +32,7 @@ class ServiceReportTypeMenu extends StatelessWidget { menuProvider.reset(); await menuProvider.getTypes( user: userProvider.user, - host: settingProvider.host + host: settingProvider.host, ); onSelect(initialValue ?? menuProvider.types?.last); }, @@ -32,7 +40,6 @@ class ServiceReportTypeMenu extends StatelessWidget { initialStatus: initialValue ?? menuProvider.types?.last, statuses: menuProvider.types, onSelect: onSelect, - ) - ); + )); } } diff --git a/old_lib/views/widgets/status/report/service_status.dart b/old_lib/views/widgets/status/report/service_status.dart new file mode 100644 index 00000000..5d6e1f75 --- /dev/null +++ b/old_lib/views/widgets/status/report/service_status.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../single_status_menu.dart'; + +class ServiceStatusMenu extends StatelessWidget { + final Function(Lookup?)? onSelect; + final Lookup? initialValue; + + const ServiceStatusMenu({ + Key? key, + this.onSelect, + this.initialValue, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceStatusProvider menuProvider = + Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.statuses == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getTypes( + user: userProvider.user, + host: settingProvider.host, + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.statuses, + onSelect: onSelect, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/service_request/service_request_defect_types_mune.dart b/old_lib/views/widgets/status/service_request/service_request_defect_types_mune.dart new file mode 100644 index 00000000..bed2a80c --- /dev/null +++ b/old_lib/views/widgets/status/service_request/service_request_defect_types_mune.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../../../../controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../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(context); + final userProvider = Provider.of(context); + final menuProvider = + Provider.of(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, + ), + ); + } +} diff --git a/old_lib/views/widgets/status/service_request/service_request_priority_mune.dart b/old_lib/views/widgets/status/service_request/service_request_priority_mune.dart new file mode 100644 index 00000000..47c72743 --- /dev/null +++ b/old_lib/views/widgets/status/service_request/service_request_priority_mune.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../../../../controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../controllers/providers/settings/setting_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../loaders/loading_manager.dart'; +import '../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(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(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, + ), + ); + } +} diff --git a/lib/views/widgets/status/single_status_menu.dart b/old_lib/views/widgets/status/single_status_menu.dart similarity index 53% rename from lib/views/widgets/status/single_status_menu.dart rename to old_lib/views/widgets/status/single_status_menu.dart index 212cd1c8..3e58db78 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/old_lib/views/widgets/status/single_status_menu.dart @@ -1,27 +1,33 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../models/lookup.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; class SingleStatusMenu extends StatefulWidget { - final List statuses; - final Lookup initialStatus; - final Function(Lookup) onSelect; + final List? statuses; + final Lookup? initialStatus; + final Function(Lookup?)? onSelect; - const SingleStatusMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); + const SingleStatusMenu({ + Key? key, + this.onSelect, + this.statuses, + this.initialStatus, + }) : super(key: key); @override - _SingleStatusMenuState createState() => _SingleStatusMenuState(); + SingleStatusMenuState createState() => SingleStatusMenuState(); } -class _SingleStatusMenuState extends State { - Lookup _selectedStatus; +class SingleStatusMenuState extends State { + Lookup? _selectedStatus; @override void didUpdateWidget(covariant SingleStatusMenu oldWidget) { if (widget.initialStatus != null) { _selectedStatus = widget.statuses?.firstWhere((element) { - return element?.id == widget.initialStatus.id; + return element.id == widget.initialStatus?.id; }); } else { _selectedStatus = null; @@ -33,7 +39,7 @@ class _SingleStatusMenuState extends State { void initState() { if (widget.initialStatus != null) { _selectedStatus = widget.statuses?.firstWhere((element) { - return element?.id == widget.initialStatus.id; + return element.id == widget.initialStatus?.id; }); } @@ -47,9 +53,11 @@ class _SingleStatusMenuState extends State { decoration: BoxDecoration( color: AColors.inputFieldBackgroundColor, border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context), ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), // boxShadow: const [ // AppStyle.boxShadow // ] @@ -57,7 +65,7 @@ class _SingleStatusMenuState extends State { child: DropdownButton( value: _selectedStatus, iconSize: 24, - icon: Icon(Icons.keyboard_arrow_down_rounded), + icon: const Icon(Icons.keyboard_arrow_down_rounded), elevation: 0, isExpanded: true, hint: Text( @@ -65,19 +73,23 @@ class _SingleStatusMenuState extends State { style: Theme.of(context).textTheme.subtitle1, ), style: TextStyle(color: Theme.of(context).primaryColor), - underline: SizedBox.shrink(), - onChanged: (Lookup newValue) { + underline: const SizedBox.shrink(), + onChanged: (Lookup? newValue) { setState(() { _selectedStatus = newValue; }); - widget.onSelect(newValue); + if (widget.onSelect != null) { + widget.onSelect!(newValue); + } }, - items: widget.statuses.map>((Lookup value) { + items: widget.statuses?.map>((Lookup value) { return DropdownMenuItem( value: value, child: Text( - value.label, - style: Theme.of(context).textTheme.subtitle1.copyWith(color: Theme.of(context).primaryColor, fontWeight: FontWeight.w600), + value.label ?? '', + style: Theme.of(context).textTheme.titleMedium?.copyWith( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.w600), ), ); }).toList(), diff --git a/old_lib/views/widgets/timer/app_timer.dart b/old_lib/views/widgets/timer/app_timer.dart new file mode 100644 index 00000000..4ddbcbf4 --- /dev/null +++ b/old_lib/views/widgets/timer/app_timer.dart @@ -0,0 +1,147 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import '../../../models/timer_model.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + +class AppTimer extends StatefulWidget { + final TimerModel? timer; + final Future Function(TimerModel) onChange; + final TextStyle? style; + + const AppTimer({ + Key? key, + this.timer, + this.style, + required this.onChange, + }) : super(key: key); + + @override + State createState() => _AppTimerState(); +} + +class _AppTimerState extends State { + Timer? _timer; + DateTime? _startAt; + DateTime? _endAt; + int _delay = 0; + bool _running = false; + bool _loading = false; + final ValueNotifier _period = ValueNotifier("0:00:00"); + + _startTimer() async { + if (!_running) { + final time = DateTime.now(); + bool result = await widget.onChange( + TimerModel(startAt: time, endAt: null, durationInSecond: _delay), + ); + if (!result) return; + _running = true; + + if (_endAt != null && _startAt != null) { + _delay += _endAt!.difference(_startAt!).inSeconds; + } + _startAt = time.subtract(Duration(seconds: _delay)); + _endAt = null; + } + + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (_loading == true) return; + _period.value = (_endAt ?? DateTime.now()) + .difference(_startAt!) + .toString() + .split(".") + .first; + }); + } + + _stopTimer() async { + final time = DateTime.now(); + final tempStartAt = _startAt?.add(Duration(seconds: _delay)); + bool result = await widget.onChange(TimerModel( + startAt: tempStartAt, endAt: time, durationInSecond: _delay)); + if (!result) return; + _running = false; + _endAt = time; + _startAt = tempStartAt; + _timer?.cancel(); + } + + _onPressed() async { + _loading = true; + setState(() {}); + if (!_running) { + await _startTimer(); + } else { + await _stopTimer(); + } + _loading = false; + setState(() {}); + } + + @override + void initState() { + _startAt = widget.timer?.startAt; + _endAt = widget.timer?.endAt; + _running = _startAt != null && _endAt == null; + _delay = (widget.timer?.durationInSecond ?? 0); + final difference = _startAt == null + ? 0 + : (_endAt ?? DateTime.now()).difference(_startAt!).inSeconds; + _period.value = + Duration(seconds: _running ? difference : _delay + difference) + .toString() + .split(".") + .first; + super.initState(); + if (_running) { + _startTimer(); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 100 * AppStyle.getScaleFactor(context), + height: 28 * AppStyle.getScaleFactor(context), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: const Size(1, 1), + padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), + backgroundColor: _running ? AColors.green[300] : AColors.grey, + foregroundColor: Colors.black), + onPressed: _loading ? null : _onPressed, + child: _loading + ? const SizedBox.square( + dimension: 18, + child: CircularProgressIndicator( + color: Colors.white, + )) + : Row( + children: [ + Icon(_running ? Icons.pause : Icons.play_arrow), + Expanded( + child: Center( + child: ValueListenableBuilder( + valueListenable: _period, + builder: (context, value, _) { + return Text( + value, + style: widget.style, + ); + }), + ), + ), + ], + ), + ), + ); + } +} diff --git a/old_lib/views/widgets/timer/timer_manager.dart b/old_lib/views/widgets/timer/timer_manager.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/views/widgets/titles/app_sub_title.dart b/old_lib/views/widgets/titles/app_sub_title.dart similarity index 60% rename from lib/views/widgets/titles/app_sub_title.dart rename to old_lib/views/widgets/titles/app_sub_title.dart index f5651c65..8e25778b 100644 --- a/lib/views/widgets/titles/app_sub_title.dart +++ b/old_lib/views/widgets/titles/app_sub_title.dart @@ -1,18 +1,20 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../app_style/sizing.dart'; + class ASubTitle extends StatelessWidget { final String text; - final EdgeInsets padding; - final Color color; - final double font; - const ASubTitle(this.text, {Key key,this.padding, this.color, this.font}) : super(key: key); + final EdgeInsets? padding; + final Color? color; + final double? font; + const ASubTitle(this.text, {Key? key,this.padding, this.color, this.font}) : super(key: key); @override Widget build(BuildContext context) { return Padding( padding: padding ?? EdgeInsets.zero, child: Text( text, - style: Theme.of(context).textTheme.bodyText1.copyWith( + style: Theme.of(context).textTheme.bodyText1?.copyWith( // fontWeight: FontWeight.bold, fontSize: font, color: color diff --git a/old_lib/views/widgets/titles/app_title.dart b/old_lib/views/widgets/titles/app_title.dart new file mode 100644 index 00000000..0394566d --- /dev/null +++ b/old_lib/views/widgets/titles/app_title.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +import '../../app_style/sizing.dart'; + +class ATitle extends StatelessWidget { + final String text; + final EdgeInsets? padding; + final bool center; + + const ATitle(this.text, {Key? key, this.padding, this.center = false}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: padding ?? + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Row( + mainAxisAlignment: + center ? MainAxisAlignment.center : MainAxisAlignment.start, + children: [ + Text( + text, + style: Theme.of(context).textTheme.titleLarge, + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ], + ), + ); + } +} diff --git a/old_lib/views/widgets/titles/expandable_info_row.dart b/old_lib/views/widgets/titles/expandable_info_row.dart new file mode 100644 index 00000000..b1583489 --- /dev/null +++ b/old_lib/views/widgets/titles/expandable_info_row.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +import '../../app_style/sizing.dart'; + +class ExpandableInfoRow extends StatefulWidget { + final IconData? iconData; + final String title; + final Widget child; + + const ExpandableInfoRow({ + Key? key, + this.iconData, + required this.title, + required this.child, + }) : super(key: key); + + @override + ExpandableInfoRowState createState() => ExpandableInfoRowState(); +} + +class ExpandableInfoRowState extends State + with TickerProviderStateMixin { + bool _isExpanded = false; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + _isExpanded = !_isExpanded; + setState(() {}); + }, + child: Column( + children: [ + Row( + children: [ + widget.iconData != null + ? Padding( + padding: EdgeInsets.symmetric( + horizontal: 8 * AppStyle.getScaleFactor(context), + vertical: 2 * AppStyle.getScaleFactor(context), + ), + child: FaIcon( + widget.iconData, + color: Theme.of(context).primaryColor, + size: 20 * AppStyle.getScaleFactor(context), + ), + ) + : const SizedBox.shrink(), + Expanded( + flex: 2, + child: Text( + widget.title, + style: const TextStyle( + //color: Theme.of(context).dividerColor, + fontSize: 14, + fontWeight: FontWeight.bold, + ), + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ), + AnimatedSwitcher( + duration: const Duration(milliseconds: 400), + transitionBuilder: (Widget child, Animation animation) { + return FadeTransition( + opacity: animation, + child: ScaleTransition(scale: animation, child: child), + ); + }, + child: Icon( + _isExpanded + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + key: ValueKey(_isExpanded + ? "Icons.keyboard_arrow_up" + : "Icons.keyboard_arrow_down"), + color: Theme.of(context).primaryColor, + size: 24 * AppStyle.getScaleFactor(context), + ), + ), + ], + ), + AnimatedSize( + duration: const Duration(milliseconds: 300), + child: Visibility( + visible: _isExpanded, + child: Padding( + padding: EdgeInsets.symmetric( + vertical: 8 * AppStyle.getScaleFactor(context)), + child: widget.child, + )), + ), + Divider( + height: 2 * AppStyle.getScaleFactor(context), + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ], + ), + ); + } +} diff --git a/lib/views/widgets/visits/visit_item.dart b/old_lib/views/widgets/visits/visit_item.dart similarity index 60% rename from lib/views/widgets/visits/visit_item.dart rename to old_lib/views/widgets/visits/visit_item.dart index bd456d19..f0c7afdf 100644 --- a/lib/views/widgets/visits/visit_item.dart +++ b/old_lib/views/widgets/visits/visit_item.dart @@ -1,13 +1,12 @@ -import 'package:flutter/cupertino.dart'; 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/enums/user_types.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/visits/visit_status.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../models/enums/user_types.dart'; +import '../../../models/visits/visit.dart'; +import '../../app_style/sizing.dart'; +import 'visit_status.dart'; class VisitItem extends StatelessWidget { final Visit visit; @@ -18,31 +17,47 @@ class VisitItem extends StatelessWidget { final Function(Visit) onLongPress; final Function(Visit) onSelect; - const VisitItem({Key key, this.visit, this.onPressed, this.isSelected = false, this.activeSelectMod = false, this.onLongPress, this.onSelect, this.index}) : super(key: key); + const VisitItem({ + Key? key, + this.isSelected = false, + this.activeSelectMod = false, + required this.visit, + required this.onPressed, + required this.onLongPress, + required this.onSelect, + required this.index, + }) : super(key: key); @override Widget build(BuildContext context) { - UserProvider _userProvider = Provider.of(context); - Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; - Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + UserProvider userProvider = Provider.of(context); + Color itemColor = index % 2 == 0 + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.onPrimary; + final subtitle = AppLocalization.of(context)?.subtitle; return Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), primary: itemColor, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), + borderRadius: + BorderRadius.circular(AppStyle.getBorderRadius(context)), ), ), onPressed: () { - if (activeSelectMod && _userProvider.user.type == UsersTypes.engineer) + if (activeSelectMod && + userProvider.user?.type == UsersTypes.engineer) { onSelect(visit); - else + } else { onPressed(visit); + } }, - onLongPress: _userProvider.user.type == UsersTypes.engineer + onLongPress: userProvider.user?.type == UsersTypes.engineer ? () { onLongPress(visit); } @@ -54,12 +69,15 @@ class VisitItem extends StatelessWidget { children: [ Expanded( child: Text( - "S.N: " + visit.deviceSerialNumber ?? "No serial number", - style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + "S.N: ${visit.deviceSerialNumber ?? "No serial number"}", + style: Theme.of(context).textTheme.titleLarge?.copyWith( + color: onItemColor, + fontSize: 16, + fontWeight: FontWeight.bold), ), ), AnimatedSwitcher( - duration: Duration(milliseconds: 400), + duration: const Duration(milliseconds: 400), child: Visibility( key: ValueKey(activeSelectMod), visible: activeSelectMod, @@ -87,7 +105,7 @@ class VisitItem extends StatelessWidget { Expanded( child: Text( visit.hospitalName ?? "No client found", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.titleMedium?.copyWith( color: onItemColor, fontSize: 14, ), @@ -97,7 +115,7 @@ class VisitItem extends StatelessWidget { ), Text( visit.modelAndBrand ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.titleMedium?.copyWith( color: onItemColor, fontSize: 14, ), @@ -110,12 +128,15 @@ class VisitItem extends StatelessWidget { Expanded( child: Text( visit.employName ?? "No employ found", - style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 14, fontWeight: FontWeight.bold), + style: Theme.of(context).textTheme.titleLarge?.copyWith( + color: onItemColor, + fontSize: 14, + fontWeight: FontWeight.bold), ), ), Text( visit.contactStatus ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.titleMedium?.copyWith( color: onItemColor, fontSize: 14, ), @@ -132,15 +153,15 @@ class VisitItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - _subtitle.expectDate, - style: Theme.of(context).textTheme.headline6.copyWith( + subtitle?.expectDate ?? '', + style: Theme.of(context).textTheme.titleLarge?.copyWith( color: onItemColor, fontSize: 14, ), ), Text( - visit.expectDate ?? _subtitle.noDateFound, - style: Theme.of(context).textTheme.headline6.copyWith( + visit.expectDate ?? subtitle?.noDateFound ?? '', + style: Theme.of(context).textTheme.titleLarge?.copyWith( color: onItemColor, fontSize: 14, ), @@ -152,15 +173,15 @@ class VisitItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - _subtitle.actualDate, - style: Theme.of(context).textTheme.headline6.copyWith( + subtitle?.actualDate ?? '', + style: Theme.of(context).textTheme.titleLarge?.copyWith( color: onItemColor, fontSize: 14, ), ), Text( - visit.actualDate ?? _subtitle.noDateFound, - style: Theme.of(context).textTheme.headline6.copyWith( + visit.actualDate ?? subtitle?.noDateFound ?? '', + style: Theme.of(context).textTheme.titleLarge?.copyWith( color: onItemColor, fontSize: 14, ), diff --git a/old_lib/views/widgets/visits/visit_status.dart b/old_lib/views/widgets/visits/visit_status.dart new file mode 100644 index 00000000..91a42cce --- /dev/null +++ b/old_lib/views/widgets/visits/visit_status.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +import '../../../models/visits/visit.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + +class VisitStatusLabel extends StatelessWidget { + final Visit visit; + + const VisitStatusLabel({Key? key, required this.visit}) : super(key: key); + + Color getStatusColor() { + switch (visit.status?.id) { + case 0: + return AColors.green; + case 1: + return AColors.grey; + case 2: + return AColors.grey; + default: + return AColors.grey; + } + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 8), + alignment: Alignment.center, + decoration: BoxDecoration( + color: getStatusColor(), + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), + boxShadow: const [AppStyle.boxShadow], + ), + child: Text( + visit.status?.label == null || (visit.status?.label?.isEmpty??false) + ? "no status" + : visit.status?.label??"", + style: Theme.of(context).textTheme.titleSmall?.copyWith( + color: getStatusColor().computeLuminance() > 0.5 + ? AColors.black + : Colors.white, + ), + ), + ); + } +} diff --git a/lib/views/widgets/visits/visits_list.dart b/old_lib/views/widgets/visits/visits_list.dart similarity index 54% rename from lib/views/widgets/visits/visits_list.dart rename to old_lib/views/widgets/visits/visits_list.dart index a5b05966..f995d93f 100644 --- a/lib/views/widgets/visits/visits_list.dart +++ b/old_lib/views/widgets/visits/visits_list.dart @@ -1,12 +1,14 @@ -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/visits/visit_details.dart'; -import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/visits/visit_item.dart'; import 'package:flutter/material.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/subtitle.dart'; +import '../../../models/visits/visit.dart'; +import '../../app_style/sizing.dart'; +import '../../pages/user/visits/visit_details.dart'; +import '../loaders/lazy_loading.dart'; +import '../loaders/no_item_found.dart'; +import 'visit_item.dart'; + class VisitsList extends StatefulWidget { final List visits; final bool nextPage; @@ -14,64 +16,66 @@ class VisitsList extends StatefulWidget { final Function(List) onEditGroup; const VisitsList({ - Key key, - this.visits, - this.nextPage, - this.onLazyLoad, - this.onEditGroup + Key? key, + required this.visits, + required this.nextPage, + required this.onLazyLoad, + required this.onEditGroup, }) : super(key: key); @override - _VisitsListState createState() => _VisitsListState(); + VisitsListState createState() => VisitsListState(); } -class _VisitsListState extends State { - List _selectedVisits = []; +class VisitsListState extends State { + final List _selectedVisits = []; + @override void initState() { _selectedVisits.clear(); super.initState(); } + @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(widget.visits.length == 0){ - return NoItemFound(message: _subtitle.noVisitsFound,); + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; + if (widget.visits.isEmpty) { + return NoItemFound(message: subtitle?.noVisitsFound); } return Stack( children: [ LazyLoading( nextPage: widget.nextPage, onLazyLoad: widget.onLazyLoad, + onLoadingEnd: () {}, child: ListView.builder( - //physics: BouncingScrollPhysics(), - itemCount: widget.visits.length, - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ - Visit _visit = widget.visits[itemIndex]; - bool _isSelected = _selectedVisits.contains(_visit); + //physics: BouncingScrollPhysics(), + itemCount: widget.visits.length, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { + Visit visit = widget.visits[itemIndex]; + bool isSelected = _selectedVisits.contains(visit); return VisitItem( - visit: _visit, - isSelected: _isSelected, + visit: visit, + isSelected: isSelected, index: itemIndex, activeSelectMod: _selectedVisits.isNotEmpty, - onPressed: (visit){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> VisitDetailsPage(visit: visit,) - ) - ); + onPressed: (visit) { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => VisitDetailsPage( + visit: visit, + ))); }, - onSelect: (visit){ - if(_isSelected){ + onSelect: (visit) { + if (isSelected) { _selectedVisits.remove(visit); } else { _selectedVisits.add(visit); } setState(() {}); }, - onLongPress: (visit){ - if(_isSelected){ + onLongPress: (visit) { + if (isSelected) { _selectedVisits.remove(visit); } else { _selectedVisits.add(visit); @@ -79,15 +83,14 @@ class _VisitsListState extends State { setState(() {}); }, ); - } - ), + }), ), Align( alignment: Alignment.bottomLeft, child: Padding( padding: EdgeInsets.all(8.0 * AppStyle.getScaleFactor(context)), child: AnimatedSwitcher( - duration: Duration(milliseconds: 400), + duration: const Duration(milliseconds: 400), child: Visibility( key: ValueKey(_selectedVisits.isNotEmpty), visible: _selectedVisits.isNotEmpty, @@ -96,17 +99,17 @@ class _VisitsListState extends State { children: [ FloatingActionButton( heroTag: "cancel", - child: Icon(Icons.cancel), - onPressed: (){ + child: const Icon(Icons.cancel), + onPressed: () { _selectedVisits.clear(); setState(() {}); }, ), FloatingActionButton( heroTag: "edit", - child: Icon(Icons.edit), - onPressed: (){ - if(!widget.visits.contains(_selectedVisits.first)){ + child: const Icon(Icons.edit), + onPressed: () { + if (!widget.visits.contains(_selectedVisits.first)) { _selectedVisits.clear(); setState(() {}); return; diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index 8608b33d..00000000 --- a/pubspec.lock +++ /dev/null @@ -1,1025 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.12" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.3.5" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.1" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - audioplayers: - dependency: "direct main" - description: - name: audioplayers - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - audioplayers_android: - dependency: transitive - description: - name: audioplayers_android - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.3" - audioplayers_darwin: - dependency: transitive - description: - name: audioplayers_darwin - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - audioplayers_linux: - dependency: transitive - description: - name: audioplayers_linux - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - audioplayers_platform_interface: - dependency: transitive - description: - name: audioplayers_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - audioplayers_web: - dependency: transitive - description: - name: audioplayers_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - audioplayers_windows: - dependency: transitive - description: - name: audioplayers_windows - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - cached_network_image: - dependency: "direct main" - description: - name: cached_network_image - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.3" - cached_network_image_platform_interface: - dependency: transitive - description: - name: cached_network_image_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - cached_network_image_web: - dependency: transitive - description: - name: cached_network_image_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - carousel_slider: - dependency: "direct main" - description: - name: carousel_slider - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.1" - cross_file: - dependency: transitive - description: - name: cross_file - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3+2" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" - dbus: - dependency: transitive - description: - name: dbus - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.8" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.4" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "2.4.1" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.5.2" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - firebase_messaging: - dependency: "direct main" - description: - name: firebase_messaging - url: "https://pub.dartlang.org" - source: hosted - version: "14.2.1" - firebase_messaging_platform_interface: - dependency: transitive - description: - name: firebase_messaging_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.10" - firebase_messaging_web: - dependency: transitive - description: - name: firebase_messaging_web - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.11" - flare_flutter: - dependency: "direct main" - description: - name: flare_flutter - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_blurhash: - dependency: transitive - description: - name: flutter_blurhash - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.0" - flutter_cache_manager: - dependency: transitive - description: - name: flutter_cache_manager - url: "https://pub.dartlang.org" - source: hosted - version: "3.3.0" - flutter_keyboard_visibility: - dependency: transitive - description: - name: flutter_keyboard_visibility - url: "https://pub.dartlang.org" - source: hosted - version: "5.4.0" - flutter_keyboard_visibility_linux: - dependency: transitive - description: - name: flutter_keyboard_visibility_linux - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - flutter_keyboard_visibility_macos: - dependency: transitive - description: - name: flutter_keyboard_visibility_macos - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - flutter_keyboard_visibility_platform_interface: - dependency: transitive - description: - name: flutter_keyboard_visibility_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - flutter_keyboard_visibility_web: - dependency: transitive - description: - name: flutter_keyboard_visibility_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - flutter_keyboard_visibility_windows: - dependency: transitive - description: - name: flutter_keyboard_visibility_windows - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - flutter_launcher_icons: - dependency: "direct main" - description: - name: flutter_launcher_icons - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - flutter_local_notifications: - dependency: "direct main" - description: - name: flutter_local_notifications - url: "https://pub.dartlang.org" - source: hosted - version: "12.0.4" - flutter_local_notifications_linux: - dependency: transitive - description: - name: flutter_local_notifications_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - flutter_local_notifications_platform_interface: - dependency: transitive - description: - name: flutter_local_notifications_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.0" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.7" - flutter_sound: - dependency: "direct main" - description: - name: flutter_sound - url: "https://pub.dartlang.org" - source: hosted - version: "9.2.13" - flutter_sound_platform_interface: - dependency: transitive - description: - name: flutter_sound_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "9.2.13" - flutter_sound_web: - dependency: transitive - description: - name: flutter_sound_web - url: "https://pub.dartlang.org" - source: hosted - version: "9.2.13" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.6" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_typeahead: - dependency: "direct main" - description: - name: flutter_typeahead - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.1" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - fluttertoast: - dependency: "direct main" - description: - name: fluttertoast - url: "https://pub.dartlang.org" - source: hosted - version: "8.1.2" - font_awesome_flutter: - dependency: "direct main" - description: - name: font_awesome_flutter - url: "https://pub.dartlang.org" - source: hosted - version: "10.3.0" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - http: - dependency: "direct main" - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.5" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.2" - image: - dependency: transitive - description: - name: image - url: "https://pub.dartlang.org" - source: hosted - version: "3.3.0" - image_picker: - dependency: "direct main" - description: - name: image_picker - url: "https://pub.dartlang.org" - source: hosted - version: "0.8.6" - image_picker_android: - dependency: transitive - description: - name: image_picker_android - url: "https://pub.dartlang.org" - source: hosted - version: "0.8.5+4" - image_picker_for_web: - dependency: transitive - description: - name: image_picker_for_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.10" - image_picker_ios: - dependency: transitive - description: - name: image_picker_ios - url: "https://pub.dartlang.org" - source: hosted - version: "0.8.6+5" - image_picker_platform_interface: - dependency: transitive - description: - name: image_picker_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.6.2" - intl: - dependency: "direct main" - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.7.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - logger: - dependency: transitive - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.12" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.5" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - octo_image: - dependency: transitive - description: - name: octo_image - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - package_info: - dependency: "direct main" - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.11" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.22" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.11" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.6" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - url: "https://pub.dartlang.org" - source: hosted - version: "10.2.0" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - url: "https://pub.dartlang.org" - source: hosted - version: "10.2.0" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.7" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.9.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.2" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.3" - pointycastle: - dependency: transitive - description: - name: pointycastle - url: "https://pub.dartlang.org" - source: hosted - version: "3.6.2" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: "direct main" - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.5" - qr_code_scanner: - dependency: "direct main" - description: - name: qr_code_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - recase: - dependency: transitive - description: - name: recase - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - rive: - dependency: "direct main" - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.7" - share: - dependency: "direct main" - description: - name: share - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.15" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.14" - shared_preferences_ios: - dependency: transitive - description: - name: shared_preferences_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - shared_preferences_macos: - dependency: transitive - description: - name: shared_preferences_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - signature: - dependency: "direct main" - description: - name: signature - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.0" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - speech_to_text: - dependency: "direct main" - description: - name: speech_to_text - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.1" - speech_to_text_macos: - dependency: transitive - description: - name: speech_to_text_macos - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - speech_to_text_platform_interface: - dependency: transitive - description: - name: speech_to_text_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - sqflite: - dependency: transitive - description: - name: sqflite - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.2" - sqflite_common: - dependency: transitive - description: - name: sqflite_common - url: "https://pub.dartlang.org" - source: hosted - version: "2.4.0+2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.1" - synchronized: - dependency: transitive - description: - name: synchronized - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0+3" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.12" - timezone: - dependency: transitive - description: - name: timezone - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.7" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.22" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.17" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.13" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - uuid: - dependency: transitive - description: - name: uuid - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.7" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.3" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+2" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.1" -sdks: - dart: ">=2.18.0 <3.0.0" - flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index 99885208..473d7070 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.1+2 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: ">=2.18.0 <3.0.0" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -89,7 +89,7 @@ flutter: assets: - assets/ - assets/images/ - - assets/subtitles/ + - assets/translations/ - assets/rives/ fonts: - family: Swiss diff --git a/test/widget_test.dart b/test/widget_test.dart index 9018cb41..bf07a5a4 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -7,13 +7,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; - import 'package:test_sa/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); + await tester.pumpWidget(const EntryPoint()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget);