localization i18 implementation

main_design2.0
Sikander Saleem 2 years ago
parent c8e3f2df48
commit 7e17bd2558

@ -0,0 +1,4 @@
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
untranslated-messages-file: localization_error.txt

@ -1,10 +1,10 @@
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class HttpStatusManger { class HttpStatusManger {
static String getStatusMessage({ static String getStatusMessage({
@required int status, @required int status,
@required Subtitle subtitle, @required AppLocalizations subtitle,
String messageFor400, String messageFor400,
String messageFor200, String messageFor200,
}) { }) {
@ -13,27 +13,27 @@ class HttpStatusManger {
return "careful null status"; return "careful null status";
if (status == -1) if (status == -1)
// client's request in process // client's request in process
return subtitle.currentlyServiceNotAvailable; return subtitle.serverErrorMessage;
if (status == -2) { if (status == -2) {
// client's request in process // client's request in process
return subtitle.waitUntilYourRequestComplete; return subtitle.requestLockMessage;
} else if (status >= 200 && status < 300) { } else if (status >= 200 && status < 300) {
// client's request was successfully received // client's request was successfully received
return messageFor200 ?? subtitle.requestCompleteSuccessfully; return messageFor200 ?? subtitle.successfulRequestMessage;
} else if (status >= 400 && status < 500) { } else if (status >= 400 && status < 500) {
// client's request have error // client's request have error
switch (status) { switch (status) {
case 400: case 400:
return messageFor400 ?? subtitle.failedToCompleteRequest; return messageFor400 ?? subtitle.failedRequestMessage;
default: default:
return subtitle.failedToCompleteRequest; return subtitle.failedRequestMessage;
} }
} else if (status >= 500) { } else if (status >= 500) {
// server error // server error
return subtitle.currentlyServiceNotAvailable; return subtitle.serverErrorMessage;
} else { } else {
// no error match so return default error // no error match so return default error
return subtitle.failedToCompleteRequest; return subtitle.failedRequestMessage;
} }
} }
} }

@ -1,44 +1,44 @@
import 'dart:convert'; // import 'dart:convert';
//
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; // import 'package:flutter/services.dart';
import 'package:test_sa/models/subtitle.dart'; // import 'package:flutter_gen/gen_l10n/app_localizations.dart';
//
class AppLocalization { // class AppLocalization {
AppLocalization(this.locale); // AppLocalization(this.locale);
//
final Locale locale; // final Locale locale;
static AppLocalization of(BuildContext context) { // static AppLocalization of(BuildContext context) {
return Localizations.of<AppLocalization>(context, AppLocalization); // return Localizations.of<AppLocalization>(context, AppLocalization);
} // }
//
Subtitle _subtitle; // AppLocalizations _subtitle;
Subtitle get subtitle => _subtitle; // Subtitle get subtitle => _subtitle;
//
Future<void> load() async { // Future<void> 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)); // _subtitle = Subtitle.fromJson(json.decode(jsonStringValues));
} // }
//
// static member to have simple access to the delegate from Material App // // static member to have simple access to the delegate from Material App
static const LocalizationsDelegate<AppLocalization> delegate = _DemoLocalizationsDelegate(); // static const LocalizationsDelegate<AppLocalization> delegate = _DemoLocalizationsDelegate();
} // }
//
class _DemoLocalizationsDelegate extends LocalizationsDelegate<AppLocalization> { // class _DemoLocalizationsDelegate extends LocalizationsDelegate<AppLocalization> {
const _DemoLocalizationsDelegate(); // const _DemoLocalizationsDelegate();
//
@override // @override
bool isSupported(Locale locale) { // bool isSupported(Locale locale) {
return ['en', 'ar'].contains(locale.languageCode); // return ['en', 'ar'].contains(locale.languageCode);
} // }
//
@override // @override
Future<AppLocalization> load(Locale locale) async { // Future<AppLocalization> load(Locale locale) async {
AppLocalization localization = new AppLocalization(locale); // AppLocalization localization = new AppLocalization(locale);
await localization.load(); // await localization.load();
return localization; // return localization;
} // }
//
@override // @override
bool shouldReload(LocalizationsDelegate<AppLocalization> old) => false; // bool shouldReload(LocalizationsDelegate<AppLocalization> old) => false;
} // }

@ -12,7 +12,7 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_report.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.dart';
import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/service_request/service_request_search.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import '../../../models/service_request/search_work_order.dart'; import '../../../models/service_request/search_work_order.dart';
@ -100,7 +100,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
@required String requestId, @required String requestId,
@required String host, @required String host,
@required User user, @required User user,
@required Subtitle subtitle, @required AppLocalizations subtitle,
}) async { }) async {
String userData = ''; String userData = '';
if (user != null) { if (user != null) {
@ -598,7 +598,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
@required int reportId, @required int reportId,
@required String host, @required String host,
@required User user, @required User user,
@required Subtitle subtitle, @required AppLocalizations subtitle,
}) async { }) async {
Response response; Response response;
try { try {

@ -1,15 +1,14 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:localization/localization.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../controllers/providers/settings/setting_provider.dart'; import '../controllers/providers/settings/setting_provider.dart';
import '../models/enums/translation_keys.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
extension BuildContextExtension on BuildContext { extension BuildContextExtension on BuildContext {
String translate(TranslationKeys translationKey) { AppLocalizations get translation => AppLocalizations.of(this);
return translationKey.name.i18n([Localizations.localeOf(this).toString()]);
} List<String> get getIssues => [translation.reason1, translation.reason2, translation.reason3, translation.reason4, translation.reason5];
bool get isDark => Provider.of<SettingProvider>(this).theme == "dark"; bool get isDark => Provider.of<SettingProvider>(this).theme == "dark";
} }

@ -0,0 +1,249 @@
{
"serverErrorMessage": "الخدمة غير متاحة حاليا",
"failedRequestMessage": "الفشل في إكمال الطلب",
"successfulRequestMessage": "تم إكمال الطلب بنجاح",
"requestLockMessage": "انتظر حتى إكمال الطلب",
"cancel": "إلغاء",
"confirm": "تاكيد",
"done": "تم",
"exit": "إغلاق",
"exitAlert": "هل انت متاكد من رغبتك في إغلاق التطبيق؟",
"signOut": "تسجيل الخروج",
"logoutAlert": "هل انت متاكد من رغبتك في تسجيل الخروج؟",
"language": "اللغة",
"name": "الاسم",
"email": "البريد الالكتروني",
"phoneNumber": "رقم الهاتف",
"password": "كلمة المرور",
"confirmPassword": "تاكيد كلمة المرور",
"signIn": "تسجيل الدخول",
"signUp": "انشاء حساب",
"forgetPassword": "نسيت كلمة المرور",
"acceptTermsAndConditions": "موافقة علي الشروط والاحكام",
"emailValidateMessage": "البريد الالكتروني غير صحيح",
"nameValidateMessage": "الاسم مطلوب",
"passwordValidateMessage": "علي الاقل استخدم 6 حروف او ارقام",
"confirmPasswordValidateMessage": "كلمة المرور و تاكيد كلمة المرور غير متطابقان",
"phoneNumberValidateMessage": "رقم الهاتف غير صالح",
"termsAndConditionsValidateMessage": "موافقة علي الشروط والاحكام مطاوبة",
"update": "تحديث",
"step": "خطوة",
"forgetPasswordWithMark": "نسيت كلمة المرور؟",
"showPassword": "اظهار كلمة المرور",
"wrongEmailOrPassword": "البريد الالكتروني او كلمة المرور غير صحيح",
"emailExist": "البريد الالكتروني موجود بالفعل",
"phoneNumberExist": "رقم الهاتف موجود بالفعل",
"next": "التالي",
"back": "السابق",
"search": "بحث",
"searchByName": "بحث بالاسم",
"address": "العنوان",
"addressNotFound": "لا يوجد عنوان",
"addressValidateMessage": "العنوان مطلوب",
"dataNotFound": "لا يوجد تاريخ",
"description": "الوصف",
"descriptionNotFound": "لا يوجد وصف",
"descriptionValidateMessage": "الوصف مطلوب",
"edit": "تعدل",
"emailNotFound": "لا يوجد بريد الكتروني",
"from": "من",
"to": "إلى",
"linkNotFound": "لا يوجد رابط",
"nameNotFound": "لا يوجد إسم",
"phoneNumberNotFound": "لا يوجد رقم هاتف",
"title": "عنوان",
"titleNotFound": "لا يوجد عنوان",
"titleValidateMessage": "العنوان مطلوب",
"urlNotFound": "لا يوجد رابط",
"date": "تاريخ",
"status": "الحالة",
"code": "كود",
"serialNumber": "رقم تسلسلي",
"add": "اضافة",
"brand": "ماركة",
"clearSearch": "تنظيف البحث",
"closed": "غلق",
"create": "انشاء",
"createServiceRequest": "انشاء طلب خدمة",
"delete": "مسح",
"details": "تفاصيل",
"device": "جهاز",
"deviceArName": "اسم الجهاز بعربي",
"deviceName": "اسم الجهاز",
"deviceImages": "صور الجهاز",
"deviceModel": "مركة الجهاز",
"deviceRequired": "الجهاز مطلوب",
"deviceSN": "رقم تسلسلي للجهاز",
"engineerName": "اسم المهندس",
"engineerPhone": "رقم المهندس",
"facebook": "فيسبوك",
"faultDescription": "تفاصيل الخطأ",
"general": "تفاصيل العامة",
"hospital": "العميل",
"hospitalRequired": "العميل مطلوبة",
"hotLine": "الخط ساخن",
"jobSheetNumber": "رقم ورقة العمل",
"linkedIn": "لينكد إن",
"maintenanceIssue": "مشكلة الصيانة",
"maintenanceIssueRequired": "مطلوب مسألة صيانة",
"maxImagesNumberIs5": "أقصى عدد للصورة 5",
"model": "نموذج",
"nameExist": "الاسم موجود",
"newServiceRequest": "طلب خدمة جديدة",
"newWord": "جديد",
"noDateFound": "لم يتم العثور على تاريخ",
"noDeviceFound": "لم يتم العثور على جهاز",
"noHospitalFound": "لا يوجد عميل",
"noModelFound": "لم يتم العثور على نموذج",
"noServiceRequestFound": "لم يتم العثور على طلب خدمة",
"noSnFound": "لم يتم العثور على رقم تسلسلي",
"notifications": "إشعارات",
"notificationsNotFound": "لم يتم العثور على إشعارات",
"noUniteFound": "لا توجد اقسام",
"ourWebsite": "موقعنا",
"pickDevice": "اختر الجهاز",
"pickHospital": "اختر العميل",
"pickUnite": "اختر القسم",
"policy": "سياسة",
"reason1": "لم يؤكد المهندس موعد الزيارة قبل ساعتين من وقت الطلب",
"reason2": "يقوم المهندس بتغيير موعد الزيارة دون التنسيق معي",
"reason3": "لم يحضر المهندس في التاريخ / الوقت",
"reason4": "لا يمكنني الوصول إلى المهندس عن طريق الهاتف أو الرسائل القصيرة",
"reason5": "هناك تأخير في إحضار قطع الغيار",
"repaired": "تم الاصلاح",
"repeated": "معاد",
"reportIssue": "الإبلاغ عن مشكلة",
"requestInformation": "معلومات طلب",
"searchBySn": "البحث بالرقم التسلسلي",
"serviceRequestInformation": "معلومات طلب الخدمة",
"serviceRequests": "طلبات الخدمة",
"shareAntherIssue": "مشاركة قضية أخرى",
"shareApp": "مشاركة التطبيق",
"sn": "الرقم التسلسلي",
"submit": "إرسال",
"trackServiceRequest": "تتبع طلبات الخدمة",
"twitter": "تويتر",
"underRepair": "تحت الاصلاح",
"unite": "قسم",
"uniteRequired": "القسم مطلوب",
"visitDate": "تاريخ الزيارة",
"whatsApp": "واتساب",
"workPerformed": "العمل انجز",
"actualDate": "تاريخ الفعلي",
"expectDate": "التاريخ المتوقع",
"images": "الصور",
"imagesRequired": "الصور مطلوبة",
"noSerialNumberFound": "لا يوجد رقم تسلسلي",
"notYet": "ليس بعد",
"noVisitsFound": "لا توجد زيارات",
"onHold": "معلق",
"pickFromCamera": "الالتقاط من الكاميرا",
"pickFromGallery": "الاختيار من معرض صور",
"preventiveMaintenance": "الصيانة الوقائية",
"preventiveMaintenanceUpdatedSuccessfully": "تم تحديث الصيانة الوقائية بنجاح",
"regularVisits": "زيارات منتظمة",
"regularVisitsUpdatedSuccessfully": "تم تحديث الزيارات المنتظمة بنجاح",
"requiredStatus": "الحالة المطلوبة",
"updatePreventiveMaintenance": "تحديث الصيانة الوقائية",
"updateRegularVisits": "تحديث الزيارات المنتظمة",
"updateVisitsGroup": "تحديث مجموعة الزيارات",
"updatingDots": "تحديث ...",
"expectedVisitDate": "تاريخ الزيارة القادم",
"visitInformation": "معلومات الزيارة",
"travelingHours": "ساعات السفر",
"workingHours": "ساعات العمل",
"contactStatus": "تخصص",
"image": "صورة",
"pickImage": "اختر صورة",
"requiredImage": "الصورة مطلوبة",
"taskStatus": "حالة الطلب",
"activationAlert": "الحساب قيد المراجعة يرجى الانتظار حتى يتم تفعيله",
"attachImage": "ارفق صورة",
"callLastSituation": "اخر موقف للطلب",
"customer": "العميل",
"editServiceReport": "تعديل التقرير الخدمة",
"invoiceCode": "كود الفتورة",
"invoiceNumber": "رقم الفتورة",
"newServiceReport": "تقرير خدمة جديد",
"number": "رقم",
"operatingHours": "ساعات العمل",
"partNumberName": "رقم/اسم القطعة",
"quantity": "كمية",
"reasons": "الاسباب",
"reportStatus": "حالة التقرير",
"reportType": "نوع التقرير",
"callId": "رقم الطلب",
"requiredWord": "مطلوب",
"assetType": "نوع الاصل",
"workPreformed": "العمل المنجز",
"alert": "تنبيه",
"duplicateAlert": "تنبيه التكرار",
"duplicateAlertMessage": "هل أنت متأكد أنك تريد تكرار الطلب؟",
"duplicateRequest": "تكرار الطلب",
"orderWorkNumber": "رقم طلب العمل",
"assignedEmployee": "الموظف المعين",
"assetSN": "رقم تسلسلي للاصل ",
"assetName": "اسم الاصل",
"assetNumber": "رقم الاصل",
"site": "الموقع",
"maintenanceSituation": "موقع الصيانه",
"currentSituation": "الموقع الحالي",
"comment": "تعليق",
"updateServiceRequest": "تعديل طلب الخدمة",
"repairLocation": "موقع الإصلاح",
"travelingExpense": "مصاريف التنقل",
"startDate": "وقت البدء",
"requestedQuantity": "الكمية المطلوبة",
"deliveredQuantity": "الكمية المسلّمة",
"endDate": "وقت الانتهاء",
"destinationSite": "موقع الوجهه",
"building": "بناء",
"floor": "طابق",
"department": "قسم",
"room": "غرفه",
"actions": "اجراءات",
"deviceFiles": "ملفات الجهاز",
"pickFromFiles" : "اختر من الملفات",
"requiredFile" : "الملف مطلوب",
"pickFile" : "اختر ملف",
"login" : "تسجيل الدخول",
"enterCredsToLogin" : "أدخل بياناتك الخاصة لتسجيل الدخول",
"forgotPassword" : "نسيت كلمة السر؟",
"password": "كلمة السر",
"username" : "اسم المستخدم",
"requiredField" : "الحقل مطلوب",
"passwordLengthMessage" : "يجب أن تتكون كلمة السر من 6 خانات على الأقل",
"overview" : "نظرة عامة",
"myRequests" : "طلباتي",
"myAssets" : "ممتلكاتي",
"contactUs": "اتصل بنا",
"welcome" : "مرحبا،",
"openWhatsapp" : "الإنتقال الى الواتس اب",
"callUs" : "إتصل بنا",
"liveChat" : "محادثة حية",
"gasRefillRequest" : "طلب إعادة تعبئة غاز",
"transferRequest" : "طلب نقل",
"serviceRequest" : "طلب خدمة",
"newServiceRequest" : "طلب خدمة جديدة",
"newGasRefillRequest" : "طلب إعادة تعبئة غاز جديد",
"newTransferRequest" : "طلب نقل جديد",
"submitRequest" : "تأكيد الطلب",
"select" : "إختر",
"gasType" : "نوع الغاز",
"quantity" : "الكمية",
"cylinderType" : "نوع الأسطوانة",
"cylinderSize" : "حجم الأسطوانة",
"department" : "القسم",
"httpError" : "خطأ فشل الطلب",
"tryAgain" : "أعد المحاولة",
"destinationSite" : "موقع الوجهة",
"add": "أضف",
"site" : "الموقع",
"onlyNumbers": "يسمح بإدخال الأرقام فقط",
"youHaveToSelect" : "يجب عليك إختيار",
"building" : "المبنى",
"floor" : "الطابق",
"youHaveToAddRequests" : "يجب إضافة طلبات",
"createdSuccessfully" : "إكتمل الطلب بنجاح",
"failedToCompleteRequest" : "فشل إتمام الطلب"
}

@ -0,0 +1,249 @@
{
"serverErrorMessage": "Currently, Service not available",
"failedRequestMessage": "Failed to complete request",
"successfulRequestMessage": "Request complete successfully",
"requestLockMessage": "Wait until your request complete",
"cancel": "Cancel",
"confirm": "Confirm",
"done": "Done",
"exit": "Exit",
"exitAlert": "Are you sure you want to exit?",
"signOut": "Sign Out",
"logoutAlert": "Are you sure you want to Sign Out?",
"language": "English",
"name": "Name",
"email": "Email",
"phoneNumber": "Phone Number",
"password": "Password",
"confirmPassword": "Confirm Password",
"signIn": "Sign In",
"signUp": "Sign Up",
"forgetPassword": "Forget Password",
"acceptTermsAndConditions": "Accept Terms And Conditions",
"emailValidateMessage": "Not valid email",
"nameValidateMessage": "name is required",
"passwordValidateMessage": "at least 6 characters or numbers",
"confirmPasswordValidateMessage": "Password and confirm password not match",
"phoneNumberValidateMessage": "Not valid phone number",
"termsAndConditionsValidateMessage": "Accept terms and conditions is required",
"update": "Update",
"step": "Step",
"forgetPasswordWithMark": "Forget Password?",
"showPassword": "show password",
"wrongEmailOrPassword": "Wrong email or password",
"emailExist": "Email exist",
"phoneNumberExist": "Phone number exist",
"next": "Next",
"back": "Back",
"search": "Search",
"searchByName": "Search by name",
"address": "Address",
"addressNotFound": "Address not found",
"addressValidateMessage": "Address validateMessage",
"dataNotFound": "Data not found",
"description": "Description",
"descriptionNotFound": "Description not found",
"descriptionValidateMessage": "Description can't be empty",
"edit": "Edit",
"emailNotFound": "Email not found",
"from": "From",
"to": "To",
"linkNotFound": "Link not found",
"nameNotFound": "Name not found",
"phoneNumberNotFound": "Phone number not found",
"title": "Title",
"titleNotFound": "Title not found",
"titleValidateMessage": "Title Can't be empty",
"urlNotFound": "URL not found",
"date": "Date",
"status": "Status",
"code": "Code",
"serialNumber": "Serial Number",
"add": "Add",
"brand": "manufacture",
"clearSearch": "Clear Search",
"closed": "Closed",
"create": "Create",
"createServiceRequest": "Create Service Request",
"delete": "Delete",
"details": "Details",
"device": "Asset",
"deviceArName": "Asset Ar Name",
"deviceName": "Asset Name",
"deviceImages": "Asset Images",
"deviceModel": "Asset Model",
"deviceRequired": "Asset Required",
"deviceSN": "Asset Serial Number",
"engineerName": "Engineer Name",
"engineerPhone": "Engineer Phone",
"facebook": "facebook",
"faultDescription": "Fault Description",
"general": "General",
"hospital": "Site",
"hospitalRequired": "Site Required",
"hotLine": "Hot Line",
"jobSheetNumber": "Job Sheet Number",
"linkedIn": "linkedIn",
"maintenanceIssue": "Maintenance Issue",
"maintenanceIssueRequired": "maintenance Issue Required",
"maxImagesNumberIs5": "Maximum Images Number Is 5",
"model": "Model",
"nameExist": "Name Exist",
"newServiceRequest": "New Service Request",
"newWord": "New",
"noDateFound": "No Date Found",
"noDeviceFound": "No Asset Found",
"noHospitalFound": "No Site Found",
"noModelFound": "No Model Found",
"noServiceRequestFound": "No Service Request Found",
"noSnFound": "No SN Found",
"notifications": "Notifications",
"notificationsNotFound": "Notifications Not Found",
"noUniteFound": "No Unit Found",
"ourWebsite": "Our Website",
"pickDevice": "Pick Asset",
"pickHospital": "Pick Site",
"pickUnite": "Pick Unit",
"policy": "Policy",
"reason1": "The engineer didn't confirm visit date with 2 hours from the request time",
"reason2": "The engineer change the visit date without coordination with me",
"reason3": "the engineer didn't attend on date/time",
"reason4": "I can't reach engineer by phone or SMS",
"reason5": "There is delay ib bringing the spare parts",
"repaired": "Repaired",
"repeated": "Repeated",
"reportIssue": "Report a Issue",
"requestInformation": "request Information",
"searchBySn": "Search By Sn",
"serviceRequestInformation": "Service Request Information",
"serviceRequests": "Service Requests",
"shareAntherIssue": "share Another Issue",
"shareApp": "Share App",
"sn": "SN",
"submit": "Submit",
"trackServiceRequest": "Track Service Requests",
"twitter": "Twitter",
"underRepair": "Under Repair",
"unite": "Unit",
"uniteRequired": "Unit Required",
"visitDate": "Visit Date",
"whatsApp": "WhatsApp",
"workPerformed": "Work Performed",
"actualDate": "Actual Date",
"expectDate": "Expect Date",
"images": "Images",
"imagesRequired": "Images Required",
"noSerialNumberFound": "No Serial Number Found",
"notYet": "Not Yet",
"noVisitsFound": "No Visits Found",
"onHold": "On Hold",
"pickFromCamera": "Pick From Camera",
"pickFromGallery": "Pick From Gallery",
"preventiveMaintenance": "Preventive Maintenance",
"preventiveMaintenanceUpdatedSuccessfully": "Preventive Maintenance Updated Successfully",
"regularVisits": "Regular Visits",
"regularVisitsUpdatedSuccessfully": "Regular Visits Updated Successfully",
"requiredStatus": "Required Status",
"updatePreventiveMaintenance": "Update Preventive Maintenance",
"updateRegularVisits": "Update Regular Visits",
"updateVisitsGroup": "Update Visits Group",
"updatingDots": "Updating ...",
"expectedVisitDate": "Next Visit Date",
"visitInformation": "Visit Information",
"travelingHours": "Traveling Hours",
"workingHours": "Working Hours",
"contactStatus": "Assigned To",
"image": "Image",
"pickImage": "Pick Image",
"requiredImage": "Image Required",
"taskStatus": "Task Status",
"activationAlert": "Account under reviewing please wait until be activated",
"attachImage": "Attach Image",
"callLastSituation": "Call's Last Situation",
"customer": "Customer",
"editServiceReport": "Edit Work Order",
"invoiceCode": "Invoice Code",
"invoiceNumber": "Invoice Number",
"newServiceReport": "New Work Order",
"number": "Number",
"operatingHours": "Operating Hours",
"partNumberName": "Part Number/Name",
"quantity": "Quantity",
"reasons": "Reasons",
"reportStatus": "Report Status",
"reportType": "Report Type",
"callId": "Call Id",
"requiredWord": "required",
"assetType": "Asset Type",
"workPreformed": "Work Preformed",
"orderWorkNumber": "Order Work Number",
"assignedEmployee": "Assigned Employee",
"assetSN": "Asset S.N",
"assetName": "Asset Name",
"assetNumber": "Asset Number",
"site": "Site",
"maintenanceSituation": "Maintenance Situation",
"currentSituation": "Current Situation",
"alert": "Alert",
"duplicateAlert": "Duplicate Alert",
"duplicateAlertMessage": "Are you sure you want to duplicate request?",
"duplicateRequest": "Duplicate Request",
"comment": "Comment",
"updateServiceRequest": "Update Service Request",
"repairLocation": "Repair Location",
"travelingExpense": "Traveling Expense",
"startDate": "Start Date",
"requestedQuantity": "Requested Quantity",
"deliveredQuantity": "Delivered Quantity",
"endDate": "End Date",
"destinationSite": "Destination Site",
"building": "Building",
"floor": "Floor",
"department": "Department",
"room": "Room",
"actions": "Actions",
"deviceFiles": "Asset Files",
"pickFromFiles" : "Pick From Files",
"requiredFile" : "File Required",
"pickFile" : "Pick File",
"login" : "Login",
"enterCredsToLogin" : "Enter your credential to login",
"forgotPassword" : "Forgot Password?",
"password" : "Password",
"username" : "Username",
"requiredField" : "Required Field",
"passwordLengthMessage" : "Password must has at least 6 characters",
"overview" : "Overview",
"myRequests" : "My Request",
"myAssets" : "My Assets",
"contactUs": "Contact Us",
"welcome" : "Welcome,",
"openWhatsapp" : "Open WhatsApp",
"callUs" : "Call Us",
"liveChat" : "Live Chat",
"gasRefillRequest" : "Gas Refill Request",
"transferRequest" : "Transfer Request",
"serviceRequest" : "Service Request",
"newServiceRequest" : "New Service Request",
"newGasRefillRequest" : "New Gas Refill Request",
"newTransferRequest" : "New Transfer Request",
"submitRequest" : "Submit Request",
"select" : "Select",
"gasType": "Gas Type",
"quantity" : "Quantity",
"cylinderType" : "Cylinder Type",
"cylinderSize" : "Cylinder Size",
"department" : "Department",
"httpError" : "Error Request Failed",
"tryAgain" : "Try Again",
"destinationSite" : "Destination Site",
"add": "Add",
"site" : "Site",
"onlyNumbers": "Only Numbers Allowed",
"youHaveToSelect" : "You have to select",
"building" : "Building",
"floor" : "Floor",
"youHaveToAddRequests" : "You have to add requests",
"createdSuccessfully" : "Created successfully",
"failedToCompleteRequest" : "Failed to complete request"
}

@ -78,6 +78,8 @@ import 'controllers/providers/api/user_provider.dart';
import 'controllers/providers/settings/setting_provider.dart'; import 'controllers/providers/settings/setting_provider.dart';
import 'new_views/pages/new_gas_refill_request_page.dart'; import 'new_views/pages/new_gas_refill_request_page.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
if (Platform.isIOS) { if (Platform.isIOS) {
@ -119,8 +121,6 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => CylinderSizeProvider()), ChangeNotifierProvider(create: (_) => CylinderSizeProvider()),
ChangeNotifierProvider(create: (_) => DepartmentProvider()), ChangeNotifierProvider(create: (_) => DepartmentProvider()),
ChangeNotifierProvider(create: (_) => SiteProvider()), ChangeNotifierProvider(create: (_) => SiteProvider()),
ChangeNotifierProvider(create: (_) => HospitalsProvider()), ChangeNotifierProvider(create: (_) => HospitalsProvider()),
ChangeNotifierProvider(create: (_) => DevicesProvider()), ChangeNotifierProvider(create: (_) => DevicesProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestsProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestsProvider()),
@ -159,11 +159,6 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()), ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()), ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportAssistantsEmployeeProvider()), ChangeNotifierProvider(create: (_) => ServiceReportAssistantsEmployeeProvider()),
], ],
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
@ -176,14 +171,8 @@ class MyApp extends StatelessWidget {
title: 'ATOMS', title: 'ATOMS',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: settingProvider.theme == "dark" ? AppThemes.darkTheme : AppThemes.lightTheme, theme: settingProvider.theme == "dark" ? AppThemes.darkTheme : AppThemes.lightTheme,
localizationsDelegates: [ localizationsDelegates: AppLocalizations.localizationsDelegates,
LocalJsonLocalization.delegate, supportedLocales: AppLocalizations.supportedLocales,
AppLocalization.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [Locale('en'), Locale('ar')],
locale: Locale(settingProvider.language ?? 'en'), locale: Locale(settingProvider.language ?? 'en'),
initialRoute: SplashPage.routeName, initialRoute: SplashPage.routeName,
routes: { routes: {
@ -194,7 +183,6 @@ class MyApp extends StatelessWidget {
NewServiceRequestPage.routeName: (_) => const NewServiceRequestPage(), NewServiceRequestPage.routeName: (_) => const NewServiceRequestPage(),
NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(), NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(),
NewTransferRequestPage.routeName: (_) => const NewTransferRequestPage(), NewTransferRequestPage.routeName: (_) => const NewTransferRequestPage(),
ReportIssuesPage.id: (_) => const ReportIssuesPage(), ReportIssuesPage.id: (_) => const ReportIssuesPage(),
RequestGasRefill.id: (_) => const RequestGasRefill(), RequestGasRefill.id: (_) => const RequestGasRefill(),
CreateRequestPage.id: (_) => const CreateRequestPage(), CreateRequestPage.id: (_) => const CreateRequestPage(),

@ -59,6 +59,7 @@ class GasRefillModel {
}); });
} }
} }
num id; num id;
String gazRefillNo; String gazRefillNo;
String expectedDate; String expectedDate;
@ -77,6 +78,7 @@ class GasRefillModel {
AssignedEmployee assignedEmployee; AssignedEmployee assignedEmployee;
Lookup status; Lookup status;
List<GasRefillDetails> gazRefillDetails; List<GasRefillDetails> gazRefillDetails;
GasRefillModel copyWith({ GasRefillModel copyWith({
num id, num id,
String gazRefillNo, String gazRefillNo,
@ -117,6 +119,7 @@ class GasRefillModel {
status: status ?? this.status, status: status ?? this.status,
gazRefillDetails: gazRefillDetails ?? this.gazRefillDetails, gazRefillDetails: gazRefillDetails ?? this.gazRefillDetails,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id;
@ -156,16 +159,16 @@ class GasRefillModel {
Future<bool> validate(BuildContext context) async { Future<bool> validate(BuildContext context) async {
if (site == null) { if (site == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.destinationSite)}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.destinationSite}");
return false; return false;
} else if (building == null) { } else if (building == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.building)}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.building}");
return false; return false;
} else if (floor == null) { } else if (floor == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.floor)}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.floor}");
return false; return false;
} else if (department == null) { } else if (department == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.department)}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.department}");
return false; return false;
} }
return true; return true;
@ -190,12 +193,14 @@ class GasRefillDetails {
requestedQty = json['requestedQty']; requestedQty = json['requestedQty'];
deliverdQty = json['deliverdQty']; deliverdQty = json['deliverdQty'];
} }
num id; num id;
Lookup gasType; Lookup gasType;
Lookup cylinderType; Lookup cylinderType;
Lookup cylinderSize; Lookup cylinderSize;
num requestedQty; num requestedQty;
num deliverdQty; num deliverdQty;
GasRefillDetails copyWith({ GasRefillDetails copyWith({
num id, num id,
Lookup gasType, Lookup gasType,
@ -212,6 +217,7 @@ class GasRefillDetails {
requestedQty: requestedQty ?? this.requestedQty, requestedQty: requestedQty ?? this.requestedQty,
deliverdQty: deliverdQty ?? this.deliverdQty, deliverdQty: deliverdQty ?? this.deliverdQty,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id;
@ -231,13 +237,13 @@ class GasRefillDetails {
Future<bool> validate(BuildContext context) async { Future<bool> validate(BuildContext context) async {
if (gasType == null) { if (gasType == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.gasType)}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.gasType}");
return false; return false;
} else if (cylinderType == null) { } else if (cylinderType == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.cylinderType)}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.cylinderType}");
return false; return false;
} else if (cylinderSize == null) { } else if (cylinderSize == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.cylinderSize)}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.cylinderSize}");
return false; return false;
} }
return true; return true;

File diff suppressed because it is too large Load Diff

@ -8,6 +8,7 @@ import '../../models/enums/translation_keys.dart';
class AppBottomNavigationBar extends StatelessWidget { class AppBottomNavigationBar extends StatelessWidget {
final Function(int index) onPressed; final Function(int index) onPressed;
final int selectedIndex; final int selectedIndex;
const AppBottomNavigationBar({ const AppBottomNavigationBar({
Key key, Key key,
@required this.onPressed, @required this.onPressed,
@ -25,10 +26,10 @@ class AppBottomNavigationBar extends StatelessWidget {
), ),
child: BottomNavigationBar( child: BottomNavigationBar(
items: <BottomNavigationBarItem>[ items: <BottomNavigationBarItem>[
navBarItem(context, index: 0, iconName: "overview", label: TranslationKeys.overview), navBarItem(context, index: 0, iconName: "overview", label: context.translation.overview),
navBarItem(context, index: 1, iconName: "requests", label: TranslationKeys.myRequests), navBarItem(context, index: 1, iconName: "requests", label: context.translation.myRequests),
navBarItem(context, index: 2, iconName: "assets", label: TranslationKeys.myAssets), navBarItem(context, index: 2, iconName: "assets", label: context.translation.myAssets),
navBarItem(context, index: 3, iconName: "message", label: TranslationKeys.contactUs), navBarItem(context, index: 3, iconName: "message", label: context.translation.contactUs),
], ],
currentIndex: selectedIndex, currentIndex: selectedIndex,
selectedFontSize: 12, selectedFontSize: 12,
@ -38,7 +39,7 @@ class AppBottomNavigationBar extends StatelessWidget {
); );
} }
BottomNavigationBarItem navBarItem(BuildContext context, {@required int index, @required String iconName, @required TranslationKeys label}) { BottomNavigationBarItem navBarItem(BuildContext context, {@required int index, @required String iconName, @required String label}) {
return BottomNavigationBarItem( return BottomNavigationBarItem(
icon: Padding( icon: Padding(
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight),
@ -48,7 +49,7 @@ class AppBottomNavigationBar extends StatelessWidget {
color: selectedIndex == index ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor, color: selectedIndex == index ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor,
), ),
), ),
label: context.translate(label), label: label,
); );
} }
} }

@ -19,7 +19,7 @@ class AppDrawer extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
AppFilledButton( AppFilledButton(
label: TranslationKeys.login, label: context.translation.login,
onPressed: () async { onPressed: () async {
/// TODO [zaid] : show dialog before logout /// TODO [zaid] : show dialog before logout
// bool result = await showDialog( // bool result = await showDialog(

@ -8,7 +8,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
class AppFilledButton extends StatelessWidget { class AppFilledButton extends StatelessWidget {
final VoidCallback onPressed; final VoidCallback onPressed;
final TranslationKeys label; final String label;
final bool maxWidth; final bool maxWidth;
final Color buttonColor; final Color buttonColor;
final Color textColor; final Color textColor;
@ -32,7 +32,7 @@ class AppFilledButton extends StatelessWidget {
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
color: buttonColor ?? Theme.of(context).primaryColor, color: buttonColor ?? Theme.of(context).primaryColor,
), ),
child: context.translate(label).heading6(context).custom(color: textColor ?? (context.isDark ? AppColor.neutral60 : Colors.white)), child: label.heading6(context).custom(color: textColor ?? (context.isDark ? AppColor.neutral60 : Colors.white)),
).onPress(onPressed); ).onPress(onPressed);
} }
} }

@ -51,11 +51,11 @@ class _AppFloatingActionButtonState extends State<AppFloatingActionButton> {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
const _FloatingButtonListTile(iconName: "gas_refill_request", label: TranslationKeys.gasRefillRequest, routeName: NewGasRefillRequestPage.routeName), _FloatingButtonListTile(iconName: "gas_refill_request", label: context.translation.gasRefillRequest, routeName: NewGasRefillRequestPage.routeName),
const Divider().defaultStyle(context).paddingOnly(left: 16, right: 16), const Divider().defaultStyle(context).paddingOnly(left: 16, right: 16),
const _FloatingButtonListTile(iconName: "transfer_request", label: TranslationKeys.transferRequest, routeName: NewTransferRequestPage.routeName), _FloatingButtonListTile(iconName: "transfer_request", label: context.translation.transferRequest, routeName: NewTransferRequestPage.routeName),
const Divider().defaultStyle(context).paddingOnly(left: 16, right: 16), const Divider().defaultStyle(context).paddingOnly(left: 16, right: 16),
const _FloatingButtonListTile(iconName: "service_request", label: TranslationKeys.serviceRequest, routeName: NewServiceRequestPage.routeName), _FloatingButtonListTile(iconName: "service_request", label: context.translation.serviceRequest, routeName: NewServiceRequestPage.routeName),
], ],
).paddingOnly(top: 8, bottom: 8), ).paddingOnly(top: 8, bottom: 8),
), ),
@ -79,7 +79,7 @@ class _AppFloatingActionButtonState extends State<AppFloatingActionButton> {
class _FloatingButtonListTile extends StatelessWidget { class _FloatingButtonListTile extends StatelessWidget {
final String iconName, routeName; final String iconName, routeName;
final TranslationKeys label; final String label;
const _FloatingButtonListTile({ const _FloatingButtonListTile({
@required this.iconName, @required this.iconName,
@ -102,7 +102,7 @@ class _FloatingButtonListTile extends StatelessWidget {
color: context.isDark ? AppColor.primary40 : AppColor.primary70, color: context.isDark ? AppColor.primary40 : AppColor.primary70,
), ),
title: Text( title: Text(
context.translate(label), label,
style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w500), style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w500),
), ),
), ),

@ -70,11 +70,11 @@ class _AppLoadingManagerState extends State<AppLoadingManager> {
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text(context.translate(TranslationKeys.httpError), style: Theme.of(context).textTheme.titleMedium), Text(context.translation.httpError, style: Theme.of(context).textTheme.titleMedium),
4.height, 4.height,
OutlinedButton( OutlinedButton(
onPressed: widget.onRefresh, onPressed: widget.onRefresh,
child: Text(context.translate(TranslationKeys.tryAgain)), child: Text(context.translation.tryAgain),
) )
], ],
), ),

@ -11,8 +11,8 @@ class AppTextFormField extends StatefulWidget {
final Function(String) onChange; final Function(String) onChange;
final bool obscureText; final bool obscureText;
final VoidCallback showPassword; final VoidCallback showPassword;
final TranslationKeys hintText; final String hintText;
final TranslationKeys labelText; final String labelText;
final TextInputType textInputType; final TextInputType textInputType;
final String initialValue; final String initialValue;
final TextStyle style; final TextStyle style;
@ -96,8 +96,8 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
fillColor: context.isDark ? AppColor.neutral50 : Colors.white, fillColor: context.isDark ? AppColor.neutral50 : Colors.white,
errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20),
hintText: widget.hintText != null ? context.translate(widget.hintText) : null, hintText: widget.hintText ?? "",
labelText: widget.labelText != null ? context.translate(widget.labelText) : null, labelText: widget.labelText ?? "",
suffixIcon: widget.prefixIconData == null suffixIcon: widget.prefixIconData == null
? null ? null
: Icon( : Icon(

@ -8,7 +8,7 @@ import '../../models/enums/translation_keys.dart';
import '../app_style/app_color.dart'; import '../app_style/app_color.dart';
class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget { class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
final TranslationKeys title; final String title;
const DefaultAppBar({@required this.title, Key key}) : super(key: key); const DefaultAppBar({@required this.title, Key key}) : super(key: key);
@ -23,7 +23,7 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
Navigator.of(context).pop(); Navigator.of(context).pop();
}), }),
Text( Text(
context.translate(title), title,
style: AppTextStyles.heading3?.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.heading3?.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
).expanded, ).expanded,
], ],

@ -15,7 +15,7 @@ class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier> exte
final T initialValue; final T initialValue;
final bool enabled; final bool enabled;
final List<T> staticData; final List<T> staticData;
final TranslationKeys title; final String title;
/// To use a static data (without calling API) /// To use a static data (without calling API)
/// just send [NullableLoadingProvider] as generic data type and fill the [staticData] /// just send [NullableLoadingProvider] as generic data type and fill the [staticData]
@ -108,7 +108,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text( Text(
context.translate(widget.title), widget.title,
style: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500), style: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500),
), ),
DropdownButton<T>( DropdownButton<T>(
@ -119,7 +119,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
elevation: 0, elevation: 0,
isExpanded: true, isExpanded: true,
hint: Text( hint: Text(
context.translate(TranslationKeys.select), context.translation.select,
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
), ),
style: TextStyle(color: Theme.of(context).primaryColor), style: TextStyle(color: Theme.of(context).primaryColor),

@ -34,20 +34,20 @@ class ContactUsBottomSheet extends StatelessWidget {
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(vertical: 16.toScreenHeight), padding: EdgeInsets.symmetric(vertical: 16.toScreenHeight),
child: Text( child: Text(
context.translate(TranslationKeys.contactUs), context.translation.contactUs,
style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w600), style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w600),
), ),
), ),
), ),
Row( Row(
children: [ children: [
Expanded(child: _ContactCard(iconName: "phone", title: context.translate(TranslationKeys.callUs), subtitle: "+966 546345567")), Expanded(child: _ContactCard(iconName: "phone", title: context.translation.callUs, subtitle: "+966 546345567")),
16.width, 16.width,
Expanded( Expanded(
child: _ContactCard( child: _ContactCard(
iconName: "whatsapp", iconName: "whatsapp",
title: context.translate(TranslationKeys.liveChat), title: context.translation.liveChat,
subtitle: context.translate(TranslationKeys.openWhatsapp), subtitle: context.translation.openWhatsapp,
), ),
), ),
], ],

@ -39,7 +39,7 @@ class _DashboardPageState extends State<DashboardPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
context.translate(TranslationKeys.welcome), context.translation.welcome,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(

@ -49,13 +49,13 @@ class _LoginPageState extends State<LoginPage> {
children: [ children: [
Hero(tag: "logo", child: "logo".toSvgAsset(height: 64)), Hero(tag: "logo", child: "logo".toSvgAsset(height: 64)),
64.height, 64.height,
context.translate(TranslationKeys.login).heading2(context).custom(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.primary50 : AppColor.neutral50), context.translation.login.heading2(context).custom(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.primary50 : AppColor.neutral50),
context.translate(TranslationKeys.enterCredsToLogin).heading6(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), context.translation.enterCredsToLogin.heading6(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
32.height, 32.height,
AppTextFormField( AppTextFormField(
initialValue: _user?.userName, initialValue: _user?.userName,
validator: (value) => Validator.hasValue(value) ? null : context.translate(TranslationKeys.requiredField), validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField,
labelText: TranslationKeys.username, labelText: context.translation.username,
textInputType: TextInputType.name, textInputType: TextInputType.name,
onSaved: (value) { onSaved: (value) {
_user.userName = value; _user.userName = value;
@ -64,13 +64,13 @@ class _LoginPageState extends State<LoginPage> {
16.height, 16.height,
AppTextFormField( AppTextFormField(
initialValue: _user?.password, initialValue: _user?.password,
labelText: TranslationKeys.password, labelText: context.translation.password,
obscureText: true, obscureText: true,
validator: (value) => Validator.isValidPassword(value) validator: (value) => Validator.isValidPassword(value)
? null ? null
: value.isEmpty : value.isEmpty
? context.translate(TranslationKeys.requiredField) ? context.translation.requiredField
: context.translate(TranslationKeys.passwordLengthMessage), : context.translation.passwordLengthMessage,
onSaved: (value) { onSaved: (value) {
_user.password = value; _user.password = value;
}, },
@ -82,13 +82,13 @@ class _LoginPageState extends State<LoginPage> {
onTap: () { onTap: () {
/// TODO [zaid] : push to another screen /// TODO [zaid] : push to another screen
}, },
child: context.translate(TranslationKeys.forgotPassword).bodyText(context).custom(color: AppColor.primary50, fontWeight: FontWeight.w500), child: context.translation.forgotPassword.bodyText(context).custom(color: AppColor.primary50, fontWeight: FontWeight.w500),
), ),
), ),
], ],
), ),
).center.expanded, ).center.expanded,
AppFilledButton(label: TranslationKeys.login, maxWidth: true, onPressed: _login), AppFilledButton(label: context.translation.login, maxWidth: true, onPressed: _login),
], ],
).paddingOnly(left: 16, right: 16, bottom: 24, top: 24), ).paddingOnly(left: 16, right: 16, bottom: 24, top: 24),
), ),

@ -30,6 +30,7 @@ import '../common_widgets/default_app_bar.dart';
class NewGasRefillRequestPage extends StatefulWidget { class NewGasRefillRequestPage extends StatefulWidget {
static const String routeName = "/new_gas_refill_request_page"; static const String routeName = "/new_gas_refill_request_page";
const NewGasRefillRequestPage({Key key}) : super(key: key); const NewGasRefillRequestPage({Key key}) : super(key: key);
@override @override
@ -60,7 +61,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: const DefaultAppBar(title: TranslationKeys.newGasRefillRequest), appBar: DefaultAppBar(title: context.translation.newGasRefillRequest),
body: Column( body: Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
@ -71,7 +72,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
16.height, 16.height,
SingleItemDropDownMenu<Lookup, GasTypesProvider>( SingleItemDropDownMenu<Lookup, GasTypesProvider>(
context: context, context: context,
title: TranslationKeys.gasType, title: context.translation.gasType,
onSelect: (value) { onSelect: (value) {
_currentDetails.gasType = value; _currentDetails.gasType = value;
}, },
@ -79,13 +80,13 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
8.height, 8.height,
AppTextFormField( AppTextFormField(
controller: _quantityController, controller: _quantityController,
labelText: TranslationKeys.quantity, labelText: context.translation.quantity,
textInputType: TextInputType.number, textInputType: TextInputType.number,
validator: (value) => Validator.hasValue(value) validator: (value) => Validator.hasValue(value)
? Validator.isNumeric(value) ? Validator.isNumeric(value)
? null ? null
: context.translate(TranslationKeys.onlyNumbers) : context.translation.onlyNumbers
: context.translate(TranslationKeys.requiredField), : context.translation.requiredField,
onSaved: (text) { onSaved: (text) {
_currentDetails.requestedQty = double.tryParse(text ?? "") ?? 0; _currentDetails.requestedQty = double.tryParse(text ?? "") ?? 0;
}, },
@ -93,7 +94,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
8.height, 8.height,
SingleItemDropDownMenu<Lookup, CylinderTypesProvider>( SingleItemDropDownMenu<Lookup, CylinderTypesProvider>(
context: context, context: context,
title: TranslationKeys.cylinderType, title: context.translation.cylinderType,
onSelect: (value) { onSelect: (value) {
_currentDetails.cylinderType = value; _currentDetails.cylinderType = value;
}, },
@ -101,7 +102,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
8.height, 8.height,
SingleItemDropDownMenu<Lookup, CylinderSizeProvider>( SingleItemDropDownMenu<Lookup, CylinderSizeProvider>(
context: context, context: context,
title: TranslationKeys.cylinderSize, title: context.translation.cylinderSize,
onSelect: (value) { onSelect: (value) {
_currentDetails.cylinderSize = value; _currentDetails.cylinderSize = value;
}, },
@ -109,7 +110,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
8.height, 8.height,
SingleItemDropDownMenu<Site, SiteProvider>( SingleItemDropDownMenu<Site, SiteProvider>(
context: context, context: context,
title: TranslationKeys.destinationSite, title: context.translation.destinationSite,
initialValue: _gasModel.site, initialValue: _gasModel.site,
onSelect: (value) { onSelect: (value) {
setState(() { setState(() {
@ -120,7 +121,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
8.height, 8.height,
SingleItemDropDownMenu<Building, NullableLoadingProvider>( SingleItemDropDownMenu<Building, NullableLoadingProvider>(
context: context, context: context,
title: TranslationKeys.building, title: context.translation.building,
initialValue: _gasModel.building, initialValue: _gasModel.building,
enabled: _gasModel.site?.buildings?.isNotEmpty ?? false, enabled: _gasModel.site?.buildings?.isNotEmpty ?? false,
staticData: _gasModel.site?.buildings ?? [], staticData: _gasModel.site?.buildings ?? [],
@ -133,7 +134,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
8.height, 8.height,
SingleItemDropDownMenu<Floor, NullableLoadingProvider>( SingleItemDropDownMenu<Floor, NullableLoadingProvider>(
context: context, context: context,
title: TranslationKeys.floor, title: context.translation.floor,
initialValue: _gasModel.floor, initialValue: _gasModel.floor,
enabled: _gasModel.building?.floors?.isNotEmpty ?? false, enabled: _gasModel.building?.floors?.isNotEmpty ?? false,
staticData: _gasModel.building?.floors ?? [], staticData: _gasModel.building?.floors ?? [],
@ -146,7 +147,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
8.height, 8.height,
SingleItemDropDownMenu<Department, NullableLoadingProvider>( SingleItemDropDownMenu<Department, NullableLoadingProvider>(
context: context, context: context,
title: TranslationKeys.department, title: context.translation.department,
initialValue: _gasModel.department, initialValue: _gasModel.department,
enabled: _gasModel.floor?.departments?.isNotEmpty ?? false, enabled: _gasModel.floor?.departments?.isNotEmpty ?? false,
staticData: _gasModel.floor?.departments ?? [], staticData: _gasModel.floor?.departments ?? [],
@ -157,14 +158,14 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
// 8.height, // 8.height,
// SingleItemDropDownMenu<Department, DepartmentProvider>( // SingleItemDropDownMenu<Department, DepartmentProvider>(
// context: context, // context: context,
// title: TranslationKeys.department, // title: context.translation.department,
// onSelect: (value) { // onSelect: (value) {
// _formModel.department = value; // _formModel.department = value;
// }, // },
// ), // ),
8.height, 8.height,
AppFilledButton( AppFilledButton(
label: TranslationKeys.add, label: context.translation.add,
maxWidth: true, maxWidth: true,
textColor: Colors.white, textColor: Colors.white,
buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50, buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50,
@ -189,9 +190,9 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
children: [ children: [
_gasModel.gazRefillDetails[index].gasType?.name?.heading5(context), _gasModel.gazRefillDetails[index].gasType?.name?.heading5(context),
8.height, 8.height,
("${context.translate(TranslationKeys.quantity)}: ${_gasModel.gazRefillDetails[index].requestedQty}").bodyText(context), ("${context.translation.quantity}: ${_gasModel.gazRefillDetails[index].requestedQty}").bodyText(context),
("${context.translate(TranslationKeys.cylinderSize)}: ${_gasModel.gazRefillDetails[index].cylinderSize?.name}").bodyText(context), ("${context.translation.cylinderSize}: ${_gasModel.gazRefillDetails[index].cylinderSize?.name}").bodyText(context),
("${context.translate(TranslationKeys.cylinderType)}: ${_gasModel.gazRefillDetails[index].cylinderType?.name}").bodyText(context), ("${context.translation.cylinderType}: ${_gasModel.gazRefillDetails[index].cylinderType?.name}").bodyText(context),
], ],
), ),
Container( Container(
@ -209,10 +210,10 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
], ],
), ),
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
("${context.translate(TranslationKeys.site)}: ${_gasModel.site?.custName}").bodyText(context), ("${context.translation.site}: ${_gasModel.site?.custName}").bodyText(context),
("${context.translate(TranslationKeys.building)}: ${_gasModel.building?.name}").bodyText(context), ("${context.translation.building}: ${_gasModel.building?.name}").bodyText(context),
("${context.translate(TranslationKeys.floor)}: ${_gasModel.floor?.name}").bodyText(context), ("${context.translation.floor}: ${_gasModel.floor?.name}").bodyText(context),
("${context.translate(TranslationKeys.department)}: ${_gasModel.department?.departmentName}").bodyText(context), ("${context.translation.department}: ${_gasModel.department?.departmentName}").bodyText(context),
], ],
).paddingAll(16), ).paddingAll(16),
); );
@ -223,7 +224,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
), ),
), ),
).expanded, ).expanded,
AppFilledButton(label: TranslationKeys.submitRequest, maxWidth: true, onPressed: _submit), AppFilledButton(label: context.translation.submitRequest, maxWidth: true, onPressed: _submit),
], ],
).paddingOnly(left: 16, right: 16, bottom: 24), ).paddingOnly(left: 16, right: 16, bottom: 24),
); );
@ -246,7 +247,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
Future<void> _submit() async { Future<void> _submit() async {
if (_gasModel.gazRefillDetails?.isEmpty ?? true) { if (_gasModel.gazRefillDetails?.isEmpty ?? true) {
Fluttertoast.showToast(msg: context.translate(TranslationKeys.youHaveToAddRequests)); Fluttertoast.showToast(msg: context.translation.youHaveToAddRequests);
return; return;
} }
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
@ -256,11 +257,11 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
); );
Navigator.pop(context); Navigator.pop(context);
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast(msg: context.translate(TranslationKeys.createdSuccessfully)); Fluttertoast.showToast(msg: context.translation.createdSuccessfully);
Navigator.of(context).pop(); Navigator.of(context).pop();
setState(() {}); setState(() {});
} else { } else {
Fluttertoast.showToast(msg: context.translate(TranslationKeys.failedToCompleteRequest)); Fluttertoast.showToast(msg: context.translation.failedToCompleteRequest);
} }
} }
} }

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/models/enums/translation_keys.dart';
@ -12,13 +13,13 @@ class NewServiceRequestPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: const DefaultAppBar(title: TranslationKeys.newServiceRequest), appBar: DefaultAppBar(title: context.translation.newServiceRequest),
body: Column( body: Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
child: Column(children: []), child: Column(children: []),
).expanded, ).expanded,
AppFilledButton(label: TranslationKeys.submitRequest, maxWidth: true, onPressed: () {}) AppFilledButton(label: context.translation.submitRequest, maxWidth: true, onPressed: () {})
], ],
).paddingOnly(left: 16, right: 16, bottom: 24), ).paddingOnly(left: 16, right: 16, bottom: 24),
); );

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/models/enums/translation_keys.dart';
@ -12,13 +13,13 @@ class NewTransferRequestPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: const DefaultAppBar(title: TranslationKeys.newTransferRequest), appBar: DefaultAppBar(title: context.translation.newTransferRequest),
body: Column( body: Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
child: Column(children: []), child: Column(children: []),
).expanded, ).expanded,
AppFilledButton(label: TranslationKeys.submitRequest, maxWidth: true, onPressed: () {}) AppFilledButton(label: context.translation.submitRequest, maxWidth: true, onPressed: () {})
], ],
).paddingOnly(left: 16, right: 16, bottom: 24), ).paddingOnly(left: 16, right: 16, bottom: 24),
); );

@ -1,10 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.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/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.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/pages/device_transfer/update_device_transfer.dart';
@ -32,7 +31,6 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
bool _isReceiver = false; bool _isReceiver = false;
UserProvider _userProvider; UserProvider _userProvider;
bool _isLoading = false; bool _isLoading = false;
Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -57,7 +55,6 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting) {
return const ALoading(); return const ALoading();
} else { } else {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_isSender = _userProvider.user.userID == _model.sender?.userId; _isSender = _userProvider.user.userID == _model.sender?.userId;
_isReceiver = _userProvider.user.userID == _model.receiver?.userId; _isReceiver = _userProvider.user.userID == _model.receiver?.userId;
@ -79,7 +76,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
_subtitle.details, context.translation.details,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
), ),
), ),
@ -99,39 +96,39 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
info: _model.title?.toString(), info: _model.title?.toString(),
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.assetName, title: context.translation.assetName,
info: _model.device.assetName, info: _model.device.assetName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.assetSN, title: context.translation.assetSN,
info: _model.device.serialNumber, info: _model.device.serialNumber,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.assetNumber, title: context.translation.assetNumber,
info: _model.device.number, info: _model.device.number,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.destinationSite, title: context.translation.destinationSite,
info: _model.device.destSiteName, info: _model.device.destSiteName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.building, title: context.translation.building,
info: _model.device.destBuildingName, info: _model.device.destBuildingName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.floor, title: context.translation.floor,
info: _model.device.destFloor, info: _model.device.destFloor,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.department, title: context.translation.department,
info: _model.device.destDepartmentName, info: _model.device.destDepartmentName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.room, title: context.translation.room,
info: _model.device.destRoom, info: _model.device.destRoom,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.actions, title: context.translation.actions,
info: "", info: "",
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
@ -142,7 +139,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
), ),
if (_userProvider.user?.type == UsersTypes.engineer) if (_userProvider.user?.type == UsersTypes.engineer)
ASmallButton( ASmallButton(
text: _subtitle.edit, text: context.translation.edit,
onPressed: (_isSender) onPressed: (_isSender)
? (_model.sender.status?.name == "Closed" ? (_model.sender.status?.name == "Closed"
? null ? null
@ -170,7 +167,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
), ),
if (_userProvider.user?.type == UsersTypes.engineer) if (_userProvider.user?.type == UsersTypes.engineer)
ASmallButton( ASmallButton(
text: _subtitle.edit, text: context.translation.edit,
onPressed: (_isReceiver) onPressed: (_isReceiver)
? (_model.receiver.status?.name == "Closed" ? (_model.receiver.status?.name == "Closed"
? null ? null

@ -3,6 +3,7 @@ import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.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/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
@ -35,7 +36,6 @@ class RequestDeviceTransfer extends StatefulWidget {
class _RequestDeviceTransferState extends State<RequestDeviceTransfer> { class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
DeviceTransferProvider _deviceTransferProvider; DeviceTransferProvider _deviceTransferProvider;
@ -95,7 +95,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
@ -141,7 +140,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
const ASubTitle("Asset"), const ASubTitle("Asset"),
if (_validate && _formModel.device == null) if (_validate && _formModel.device == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
6.height, 6.height,
@ -276,7 +275,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
), ),
12.height, 12.height,
AButton( AButton(
text: _subtitle.submit, text: context.translation.submit,
onPressed: _onSubmit, onPressed: _onSubmit,
), ),
const SizedBox( const SizedBox(

@ -7,6 +7,7 @@ import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.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/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device_transfer.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/device/device_transfer_info.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -35,7 +36,6 @@ class UpdateDeviceTransfer extends StatefulWidget {
class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> { class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
Uint8List _signature; Uint8List _signature;
@ -68,9 +68,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_isLoading = false; _isLoading = false;
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
msg: _subtitle.requestCompleteSuccessfully,
);
_validate = false; _validate = false;
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
@ -95,7 +93,6 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
@ -143,7 +140,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(_subtitle.travelingHours), ASubTitle(context.translation.travelingHours),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -159,7 +156,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
const SizedBox( const SizedBox(
height: 16, height: 16,
), ),
ASubTitle(_subtitle.workingHours), ASubTitle(context.translation.workingHours),
const SizedBox(height: 8), const SizedBox(height: 8),
Row( Row(
children: [ children: [
@ -176,7 +173,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
], ],
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
ASubTitle(_subtitle.status), ASubTitle(context.translation.status),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -217,7 +214,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
Padding( Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: AButton( child: AButton(
text: _subtitle.update, text: context.translation.update,
onPressed: _update, onPressed: _update,
), ),
), ),

@ -6,6 +6,7 @@ import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -39,7 +40,7 @@ class _LoginState extends State<Login> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
_width = MediaQuery.of(context).size.width; _width = MediaQuery.of(context).size.width;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
@ -75,11 +76,11 @@ class _LoginState extends State<Login> {
), ),
ATextFormField( ATextFormField(
initialValue: _user?.userName, initialValue: _user?.userName,
hintText: _subtitle.name, hintText: context.translation.name,
textAlign: TextAlign.left, textAlign: TextAlign.left,
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyText1,
prefixIconData: Icons.account_circle, prefixIconData: Icons.account_circle,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage, validator: (value) => Validator.hasValue(value) ? null : context.translation.nameValidateMessage,
textInputType: TextInputType.name, textInputType: TextInputType.name,
onSaved: (value) { onSaved: (value) {
_user.userName = value; _user.userName = value;
@ -88,12 +89,12 @@ class _LoginState extends State<Login> {
SizedBox(height: 12), SizedBox(height: 12),
ATextFormField( ATextFormField(
initialValue: _user?.password, initialValue: _user?.password,
hintText: _subtitle.password, hintText: context.translation.password,
obscureText: _obscurePassword, obscureText: _obscurePassword,
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyText1,
prefixIconData: Icons.vpn_key_sharp, prefixIconData: Icons.vpn_key_sharp,
textAlign: TextAlign.left, textAlign: TextAlign.left,
validator: (value) => Validator.isValidPassword(value) ? null : _subtitle.passwordValidateMessage, validator: (value) => Validator.isValidPassword(value) ? null : context.translation.passwordValidateMessage,
showPassword: () { showPassword: () {
_obscurePassword = !_obscurePassword; _obscurePassword = !_obscurePassword;
setState(() {}); setState(() {});
@ -106,7 +107,7 @@ class _LoginState extends State<Login> {
height: 32 * AppStyle.getScaleFactor(context), height: 32 * AppStyle.getScaleFactor(context),
), ),
AButton( AButton(
text: _subtitle.signIn, text: context.translation.signIn,
onPressed: () async { onPressed: () async {
if (!_formKey.currentState.validate()) return; if (!_formKey.currentState.validate()) return;
_formKey.currentState.save(); _formKey.currentState.save();
@ -124,12 +125,12 @@ class _LoginState extends State<Login> {
// if (_userProvider.user.isActive) // if (_userProvider.user.isActive)
// else // else
// Fluttertoast.showToast(msg: _subtitle.activationAlert); // Fluttertoast.showToast(msg: context.translation.activationAlert);
} else { } else {
if (status >= 400 && status < 500) return; if (status >= 400 && status < 500) return;
String errorMessage = String errorMessage =
status == 400 || _userProvider.user?.userName == null ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); status == 400 || _userProvider.user?.userName == null ? context.translation.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));
@ -140,7 +141,7 @@ class _LoginState extends State<Login> {
// height: 140 * AppStyle.getScaleFactor(context), // height: 140 * AppStyle.getScaleFactor(context),
// ), // ),
// AOutLinedButton( // AOutLinedButton(
// text: _subtitle.signUp, // text: context.translation.signUp,
// //color: AColors.cyan, // //color: AColors.cyan,
// onPressed: () { // onPressed: () {
// Navigator.of(context).pushNamed(Register.id); // Navigator.of(context).pushNamed(Register.id);

@ -6,6 +6,7 @@ import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -38,7 +39,7 @@ class _RegisterState extends State<Register> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_width = MediaQuery.of(context).size.width; _width = MediaQuery.of(context).size.width;
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: LoadingManager( body: LoadingManager(
@ -68,10 +69,10 @@ class _RegisterState extends State<Register> {
), ),
ATextFormField( ATextFormField(
initialValue: _user.userName, initialValue: _user.userName,
hintText: _subtitle.name, hintText: context.translation.name,
prefixIconData: Icons.account_circle, prefixIconData: Icons.account_circle,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage, validator: (value) => Validator.hasValue(value) ? null : context.translation.nameValidateMessage,
onSaved: (value) { onSaved: (value) {
_user.userName = value; _user.userName = value;
}, },
@ -79,11 +80,11 @@ class _RegisterState extends State<Register> {
const SizedBox(height: 12), const SizedBox(height: 12),
ATextFormField( ATextFormField(
initialValue: _user.email, initialValue: _user.email,
hintText: _subtitle.email, hintText: context.translation.email,
prefixIconData: Icons.email, prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage, validator: (value) => Validator.isEmail(value) ? null : context.translation.emailValidateMessage,
onSaved: (value) { onSaved: (value) {
_user.email = value; _user.email = value;
}, },
@ -91,11 +92,11 @@ class _RegisterState extends State<Register> {
const SizedBox(height: 12), const SizedBox(height: 12),
ATextFormField( ATextFormField(
initialValue: _user.password, initialValue: _user.password,
hintText: _subtitle.password, hintText: context.translation.password,
prefixIconData: Icons.vpn_key_sharp, prefixIconData: Icons.vpn_key_sharp,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
obscureText: _obscurePassword, obscureText: _obscurePassword,
validator: (value) => Validator.isValidPassword(value) ? null : _subtitle.passwordValidateMessage, validator: (value) => Validator.isValidPassword(value) ? null : context.translation.passwordValidateMessage,
showPassword: () { showPassword: () {
_obscurePassword = !_obscurePassword; _obscurePassword = !_obscurePassword;
setState(() {}); setState(() {});
@ -111,10 +112,10 @@ class _RegisterState extends State<Register> {
ATextFormField( ATextFormField(
initialValue: _user.password, initialValue: _user.password,
prefixIconData: Icons.vpn_key_sharp, prefixIconData: Icons.vpn_key_sharp,
hintText: _subtitle.confirmPassword, hintText: context.translation.confirmPassword,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
obscureText: _obscurePassword, obscureText: _obscurePassword,
validator: (value) => _user.password == value ? null : _subtitle.confirmPasswordValidateMessage, validator: (value) => _user.password == value ? null : context.translation.confirmPasswordValidateMessage,
showPassword: () { showPassword: () {
_obscurePassword = !_obscurePassword; _obscurePassword = !_obscurePassword;
setState(() {}); setState(() {});
@ -141,10 +142,10 @@ class _RegisterState extends State<Register> {
const SizedBox(height: 12), const SizedBox(height: 12),
ATextFormField( ATextFormField(
initialValue: _user.phoneNumber, initialValue: _user.phoneNumber,
hintText: _subtitle.phoneNumber, hintText: context.translation.phoneNumber,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android, prefixIconData: Icons.phone_android,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, validator: (value) => Validator.isPhoneNumber(value) ? null : context.translation.phoneNumberValidateMessage,
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onSaved: (value) { onSaved: (value) {
_user.phoneNumber = value; _user.phoneNumber = value;
@ -153,11 +154,11 @@ class _RegisterState extends State<Register> {
SizedBox(height: 8), SizedBox(height: 8),
// ATextFormField( // ATextFormField(
// initialValue: _user.whatsApp, // initialValue: _user.whatsApp,
// hintText: _subtitle.whatsApp, // hintText: context.translation.whatsApp,
// style: Theme.of(context).textTheme.headline6, // style: Theme.of(context).textTheme.headline6,
// prefixIconData: FontAwesomeIcons.whatsapp, // prefixIconData: FontAwesomeIcons.whatsapp,
// prefixIconSize: 36, // prefixIconSize: 36,
// validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, // validator: (value) => Validator.isPhoneNumber(value) ? null : context.translation.phoneNumberValidateMessage,
// textInputType: TextInputType.phone, // textInputType: TextInputType.phone,
// onSaved: (value) { // onSaved: (value) {
// _user.whatsApp = value; // _user.whatsApp = value;
@ -165,19 +166,19 @@ class _RegisterState extends State<Register> {
// ), // ),
const SizedBox(height: 12), const SizedBox(height: 12),
AButton( AButton(
text: _subtitle.signUp, text: context.translation.signUp,
onPressed: () async { onPressed: () async {
if (!_formKey.currentState.validate()) return; if (!_formKey.currentState.validate()) return;
_formKey.currentState.save(); _formKey.currentState.save();
if (_user.clientId == null) { if (_user.clientId == null) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.hospitalRequired), content: Text(context.translation.hospitalRequired),
)); ));
return; return;
} }
if (_user.departmentId == null) { if (_user.departmentId == null) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.unitRequired), content: Text(context.translation.uniteRequired),
)); ));
return; return;
} }
@ -186,14 +187,14 @@ class _RegisterState extends State<Register> {
host: _settingProvider.host, host: _settingProvider.host,
); );
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast(msg: _subtitle.activationAlert); Fluttertoast.showToast(msg: context.translation.activationAlert);
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
String errorMessage = status == 402 String errorMessage = status == 402
? _subtitle.nameExist ? context.translation.nameExist
: status == 401 : status == 401
? _subtitle.emailExist ? context.translation.emailExist
: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); : HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));

@ -7,6 +7,7 @@ import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/call_request_for_work_order_model.dart'; import 'package:test_sa/models/call_request_for_work_order_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -23,7 +24,6 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_def
import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/api_routes/http_status_manger.dart';
import '../../../controllers/localization/localization.dart'; import '../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import '../../../controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart';
import '../../../models/subtitle.dart';
import '../../widgets/app_text_form_field.dart'; import '../../widgets/app_text_form_field.dart';
import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_back_button.dart';
import '../../widgets/buttons/app_button.dart'; import '../../widgets/buttons/app_button.dart';
@ -99,7 +99,6 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
if (_callRequestForWorkOrder == null) { if (_callRequestForWorkOrder == null) {
getAssetType(); getAssetType();
} }
final Subtitle subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
@ -148,7 +147,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
const ASubTitle("Equipment status"), const ASubTitle("Equipment status"),
if (_validate && _subWorkOrders?.equipmentStatus == null) if (_validate && _subWorkOrders?.equipmentStatus == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -171,7 +170,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
const ASubTitle("Return to Service"), const ASubTitle("Return to Service"),
// if (_validate && _subWorkOrders.visitDate == null) // if (_validate && _subWorkOrders.visitDate == null)
// ASubTitle( // ASubTitle(
// subtitle.requiredWord, // context.translation.requiredWord,
// color: Colors.red, // color: Colors.red,
// ), // ),
const SizedBox( const SizedBox(
@ -197,10 +196,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle("Failure ${subtitle.reasons}"), ASubTitle("Failure ${context.translation.reasons}"),
if (_validate && _subWorkOrders.reason == null) if (_validate && _subWorkOrders.reason == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -220,10 +219,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(subtitle.faultDescription), ASubTitle(context.translation.faultDescription),
if (_validate && _subWorkOrders.faultDescription == null) if (_validate && _subWorkOrders.faultDescription == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -326,7 +325,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Padding( Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: AButton( child: AButton(
text: subtitle.create, text: context.translation.create,
onPressed: () async { onPressed: () async {
_validate = true; _validate = true;
setState(() {}); setState(() {});
@ -343,7 +342,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Fluttertoast.showToast(msg: "Working hours required"); Fluttertoast.showToast(msg: "Working hours required");
return; return;
} else if (_subWorkOrders.calllastSituation == null) { } else if (_subWorkOrders.calllastSituation == null) {
Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required"); Fluttertoast.showToast(msg: "${context.translation.callLastSituation} required");
return; return;
} }
_validate = false; _validate = false;
@ -361,11 +360,11 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_isLoading = false; _isLoading = false;
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: subtitle); String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/search_work_order.dart';
@ -33,7 +34,7 @@ class SearchSubWorkOrderPage extends StatefulWidget {
class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> { class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final SearchWorkOrder _searchWorkOrders = SearchWorkOrder(); final SearchWorkOrder _searchWorkOrders = SearchWorkOrder();
Subtitle _subtitle;
bool _isLoading = false; bool _isLoading = false;
String _callerId = "", _site = ""; String _callerId = "", _site = "";
Lookup _dateOperator; Lookup _dateOperator;
@ -48,7 +49,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: SingleChildScrollView( child: SingleChildScrollView(
@ -110,7 +111,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
}, },
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
ASubTitle(_subtitle.assignedEmployee), ASubTitle(context.translation.assignedEmployee),
const SizedBox(height: 4), const SizedBox(height: 4),
ServiceReportAllUsers( ServiceReportAllUsers(
initialValue: _searchWorkOrders.assignedEmployee == null ? null : Engineer(id: _searchWorkOrders.assignedEmployee.id, name: _searchWorkOrders.assignedEmployee.name), initialValue: _searchWorkOrders.assignedEmployee == null ? null : Engineer(id: _searchWorkOrders.assignedEmployee.id, name: _searchWorkOrders.assignedEmployee.name),
@ -142,7 +143,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
}, },
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
ASubTitle(_subtitle.visitDate), ASubTitle(context.translation.visitDate),
const SizedBox(height: 4), const SizedBox(height: 4),
ServiceReportVisitDateOperator( ServiceReportVisitDateOperator(
initialValue: _dateOperator, initialValue: _dateOperator,
@ -179,7 +180,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
: Padding( : Padding(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
child: AButton( child: AButton(
text: _subtitle.search, text: context.translation.search,
onPressed: () async { onPressed: () async {
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
@ -213,7 +214,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
), ),
); );
} else { } else {
String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: _subtitle); String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage)));
} }
}, },

@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/part.dart';
import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import '../../../controllers/localization/localization.dart'; import '../../../controllers/localization/localization.dart';
import '../../../models/subtitle.dart';
import '../../app_style/sizing.dart'; import '../../app_style/sizing.dart';
import '../../widgets/app_text_form_field.dart'; import '../../widgets/app_text_form_field.dart';
import '../../widgets/buttons/app_button.dart'; import '../../widgets/buttons/app_button.dart';
@ -42,7 +42,7 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final size = MediaQuery.of(context).size; final size = MediaQuery.of(context).size;
final Subtitle subtitle = AppLocalization.of(context).subtitle;
return Padding( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: ClipRRect( child: ClipRRect(
@ -89,10 +89,10 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(subtitle.partNumberName), ASubTitle(context.translation.partNumberName),
_validate && _workOrder.sparePartsWorkOrders == null _validate && _workOrder.sparePartsWorkOrders == null
? ASubTitle( ? ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -121,8 +121,8 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false) if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false)
Row( Row(
children: [ children: [
Expanded(flex: 3, child: Text(subtitle.number)), Expanded(flex: 3, child: Text(context.translation.number)),
Expanded(flex: 1, child: Text(subtitle.quantity)), Expanded(flex: 1, child: Text(context.translation.quantity)),
], ],
), ),
if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false) if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false)
@ -198,7 +198,7 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
), ),
), ),
AButton( AButton(
text: subtitle.submit, text: context.translation.submit,
onPressed: () async { onPressed: () async {
_formKey.currentState.save(); _formKey.currentState.save();
widget.subWorkOrder.copyFrom(_workOrder); widget.subWorkOrder.copyFrom(_workOrder);

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -58,7 +59,7 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final size = MediaQuery.of(context).size; final size = MediaQuery.of(context).size;
final Subtitle subtitle = AppLocalization.of(context).subtitle;
return Padding( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: ClipRRect( child: ClipRRect(
@ -97,7 +98,7 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(subtitle.workingHours), ASubTitle(context.translation.workingHours),
const SizedBox(height: 8), const SizedBox(height: 8),
Row( Row(
children: [ children: [
@ -132,7 +133,7 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(subtitle.callLastSituation), ASubTitle(context.translation.callLastSituation),
const SizedBox(height: 4), const SizedBox(height: 4),
ServiceReportMaintenanceSituation( ServiceReportMaintenanceSituation(
initialValue: _workOrder.calllastSituation, initialValue: _workOrder.calllastSituation,
@ -209,7 +210,7 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
), ),
), ),
AButton( AButton(
text: subtitle.submit, text: context.translation.submit,
onPressed: () async { onPressed: () async {
if (_workOrder?.workingHours == null) { if (_workOrder?.workingHours == null) {
await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started"); await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started");

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import '../../../controllers/localization/localization.dart'; import '../../../controllers/localization/localization.dart';
@ -12,11 +13,10 @@ class WorkOrderDetails extends StatelessWidget {
Lookup assetType; Lookup assetType;
WorkOrderDetails({@required this.item, this.assetType, Key key}) : super(key: key); WorkOrderDetails({@required this.item, this.assetType, Key key}) : super(key: key);
Subtitle _subtitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Column( return Column(
children: [ children: [
Container( Container(
@ -33,15 +33,15 @@ class WorkOrderDetails extends StatelessWidget {
), ),
child: Column( child: Column(
children: [ children: [
_buildRow(_subtitle.callId, item.callRequest?.id?.toString() ?? "", context), _buildRow(context.translation.callId, item.callRequest?.id?.toString() ?? "", context),
_buildRow(_subtitle.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context), _buildRow(context.translation.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context),
_buildRow("WO No", item.workOrderNo, context), _buildRow("WO No", item.workOrderNo, context),
_buildRow(_subtitle.assetName, item.callRequest?.asset?.assetNumber ?? '', context), _buildRow(context.translation.assetName, item.callRequest?.asset?.assetNumber ?? '', context),
_buildRow(_subtitle.department, item.callRequest?.asset?.department ?? '', context), _buildRow(context.translation.department, item.callRequest?.asset?.department ?? '', context),
_buildRow(_subtitle.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context), _buildRow(context.translation.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context),
_buildRow(_subtitle.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", context), _buildRow(context.translation.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", context),
_buildRow("Manufacturer", item.callRequest?.asset?.modelDefinition?.manufacturerName ?? "", context), _buildRow("Manufacturer", item.callRequest?.asset?.modelDefinition?.manufacturerName ?? "", context),
_buildRow(_subtitle.site, item.callRequest?.asset?.site?.custName ?? "", context), _buildRow(context.translation.site, item.callRequest?.asset?.site?.custName ?? "", context),
], ],
), ),
), ),

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
@ -18,7 +19,6 @@ class WorkOrderItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; 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; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
@ -133,7 +133,7 @@ class WorkOrderItem extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
_subtitle.status, context.translation.status,
style: Theme.of(context).textTheme.subtitle2.copyWith( style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor, color: onItemColor,
), ),

@ -2,6 +2,7 @@ import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/views/pages/sub_workorder/workorder_item.dart'; import 'package:test_sa/views/pages/sub_workorder/workorder_item.dart';
import '../../../controllers/localization/localization.dart'; import '../../../controllers/localization/localization.dart';
@ -36,7 +37,7 @@ class _WorkOrderListState extends State<WorkOrderList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); final serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
Subtitle subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: Column( child: Column(
@ -66,7 +67,7 @@ class _WorkOrderListState extends State<WorkOrderList> {
Expanded( Expanded(
child: _items?.isEmpty ?? [] child: _items?.isEmpty ?? []
? NoItemFound( ? NoItemFound(
message: subtitle.noServiceRequestFound, message: context.translation.noServiceRequestFound,
) )
: LazyLoading( : LazyLoading(
nextPage: serviceRequestsProvider.nextPage, nextPage: serviceRequestsProvider.nextPage,

@ -19,12 +19,11 @@ class WorkOrderUpdate extends StatefulWidget {
class _WorkOrderUpdateState extends State<WorkOrderUpdate> { class _WorkOrderUpdateState extends State<WorkOrderUpdate> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Subtitle _subtitle;
bool _isLoading = false; bool _isLoading = false;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(

@ -7,6 +7,7 @@ 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/gas_refill_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -41,7 +42,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
SettingProvider _settingProvider; SettingProvider _settingProvider;
GasRefillProvider _gasRefillProvider; GasRefillProvider _gasRefillProvider;
bool _isLoading = false; bool _isLoading = false;
Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -60,13 +61,13 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: context.translation.successfulRequestMessage,
); );
_enableEdit = false; _enableEdit = false;
_validate = false; _validate = false;
//Navigator.of(context).pop(); //Navigator.of(context).pop();
} else { } else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));
@ -81,7 +82,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_gasRefillProvider = Provider.of<GasRefillProvider>(context); _gasRefillProvider = Provider.of<GasRefillProvider>(context);
@ -159,7 +160,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
info: _model.title, info: _model.title,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.hospital, title: context.translation.hospital,
info: _model.clientName, info: _model.clientName,
), ),
RequestInfoRow( RequestInfoRow(
@ -175,11 +176,11 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
info: _model.department?.departmentName, info: _model.department?.departmentName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.startDate, title: context.translation.startDate,
info: _model.startDate == null ? null : "${DateFormat.yMd().format(_model.startDate)} ${DateFormat.Hms().format(_model.startDate)}", info: _model.startDate == null ? null : "${DateFormat.yMd().format(_model.startDate)} ${DateFormat.Hms().format(_model.startDate)}",
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.endDate, title: context.translation.endDate,
info: _model.endDate == null ? null : "${DateFormat.yMd().format(_model.endDate)} ${DateFormat.Hms().format(_model.endDate)}", info: _model.endDate == null ? null : "${DateFormat.yMd().format(_model.endDate)} ${DateFormat.Hms().format(_model.endDate)}",
), ),
_enableEdit _enableEdit
@ -189,10 +190,10 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(_subtitle.status), ASubTitle(context.translation.status),
if (_validate && _model.status == null) if (_validate && _model.status == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -210,7 +211,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"${_subtitle.status} : ", "${context.translation.status} : ",
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
@ -244,7 +245,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
height: 16, height: 16,
), ),
AButton( AButton(
text: _subtitle.update, text: context.translation.update,
onPressed: _update, onPressed: _update,
), ),
], ],

@ -8,6 +8,7 @@ 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/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/gas_refill/gas_refill_details.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/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -46,7 +47,7 @@ class RequestGasRefill extends StatefulWidget {
class _RequestGasRefillState extends State<RequestGasRefill> { class _RequestGasRefillState extends State<RequestGasRefill> {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
GasRefillProvider _gasRefillProvider; GasRefillProvider _gasRefillProvider;
@ -108,12 +109,12 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: context.translation.successfulRequestMessage,
); );
Navigator.of(context).pop(_formModel); Navigator.of(context).pop(_formModel);
setState(() {}); setState(() {});
} else { } else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));
@ -151,7 +152,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
if (_gasRefillProvider == null) { if (_gasRefillProvider == null) {
@ -204,9 +205,9 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
), ),
), ),
// const SizedBox(height: 4,), // const SizedBox(height: 4,),
// ASubTitle(_subtitle.title), // ASubTitle(context.translation.title),
// if(_validate && _formModel.title == null) // if(_validate && _formModel.title == null)
// ASubTitle(_subtitle.requiredWord,color: Colors.red,), // ASubTitle(context.translation.requiredWord,color: Colors.red,),
// SizedBox(height: 4,), // SizedBox(height: 4,),
// ATextFormField( // ATextFormField(
// initialValue: _formModel?.title, // initialValue: _formModel?.title,
@ -218,10 +219,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// }, // },
// ), // ),
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
ASubTitle(_subtitle.status), ASubTitle(context.translation.status),
if (_validate && _formModel.status == null) if (_validate && _formModel.status == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -293,7 +294,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
if (widget.gasRefillModel != null) ASubTitle(_subtitle.workingHours), if (widget.gasRefillModel != null) ASubTitle(context.translation.workingHours),
if (widget.gasRefillModel != null) const SizedBox(height: 8), if (widget.gasRefillModel != null) const SizedBox(height: 8),
if (widget.gasRefillModel != null) if (widget.gasRefillModel != null)
Row( Row(
@ -382,7 +383,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// ], // ],
// ), // ),
// const SizedBox(height: 8), // const SizedBox(height: 8),
// ASubTitle(_subtitle.workingHours), // ASubTitle(context.translation.workingHours),
// const SizedBox(height: 4), // const SizedBox(height: 4),
// ATextFormField( // ATextFormField(
// initialValue: null, // initialValue: null,
@ -392,7 +393,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", // : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
// enable: false, // enable: false,
// style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, // validator: (value) => Validator.isNumeric(value) ? null : context.translation.requiredWord,
// textInputType: TextInputType.number, // textInputType: TextInputType.number,
// onSaved: (value) { // onSaved: (value) {
// // _serviceReport.workHours = value; // // _serviceReport.workHours = value;
@ -408,7 +409,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
Divider(color: Theme.of(context).colorScheme.primary), Divider(color: Theme.of(context).colorScheme.primary),
const SizedBox(height: 4), const SizedBox(height: 4),
const ASubTitle("Gas Type"), const ASubTitle("Gas Type"),
if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red), if (_validate && _currentDetails.type == null) ASubTitle(context.translation.requiredWord, color: Colors.red),
const SizedBox(height: 4), const SizedBox(height: 4),
GasTypeMenu( GasTypeMenu(
initialValue: _currentDetails.type, initialValue: _currentDetails.type,
@ -420,7 +421,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
const ASubTitle("Cylinder Size"), const ASubTitle("Cylinder Size"),
if (_validate && _currentDetails.cylinderSize == null) if (_validate && _currentDetails.cylinderSize == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -438,7 +439,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
const ASubTitle("Cylinder Type"), const ASubTitle("Cylinder Type"),
if (_validate && _currentDetails.cylinderSize == null) if (_validate && _currentDetails.cylinderSize == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -453,10 +454,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(_subtitle.requestedQuantity), ASubTitle(context.translation.requestedQuantity),
if (_validate && _currentDetails?.requestedQuantity == null) if (_validate && _currentDetails?.requestedQuantity == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
SizedBox( SizedBox(
@ -474,10 +475,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
}, },
), ),
if (widget.gasRefillModel != null) const SizedBox(height: 16), if (widget.gasRefillModel != null) const SizedBox(height: 16),
if (widget.gasRefillModel != null) ASubTitle(_subtitle.deliveredQuantity), if (widget.gasRefillModel != null) ASubTitle(context.translation.deliveredQuantity),
if (widget.gasRefillModel != null && _validate && _currentDetails?.deliveredQuantity == null) if (widget.gasRefillModel != null && _validate && _currentDetails?.deliveredQuantity == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
if (widget.gasRefillModel != null) const SizedBox(height: 4), if (widget.gasRefillModel != null) const SizedBox(height: 4),
@ -495,7 +496,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
AButton( AButton(
text: _subtitle.add, text: context.translation.add,
onPressed: _addNewModel, onPressed: _addNewModel,
), ),
], ],
@ -556,7 +557,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
AButton( AButton(
text: widget.gasRefillModel == null ? _subtitle.submit : _subtitle.update, text: widget.gasRefillModel == null ? context.translation.submit : context.translation.update,
onPressed: _onSubmit, onPressed: _onSubmit,
), ),
const SizedBox(height: 100) const SizedBox(height: 100)

@ -36,7 +36,6 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProv
} }
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(

@ -75,7 +75,7 @@ class _LandPageState extends State<LandPage> {
// _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); // _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
// _preventiveMaintenanceVisitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context); // _preventiveMaintenanceVisitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context);
// _regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); // _regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
// Subtitle _subtitle = AppLocalization.of(context).subtitle; //
if (firstTime) { if (firstTime) {
if (path != null) { if (path != null) {
Navigator.of(context).pushNamed("/" + path.split("/").first, arguments: path.split("/").last); Navigator.of(context).pushNamed("/" + path.split("/").first, arguments: path.split("/").last);

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/app_notification.dart';
import 'package:test_sa/models/subtitle.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/pages/user/requests/future_request_service_details.dart';
@ -16,10 +17,10 @@ class NotificationsList extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (notifications.length == 0) { if (notifications.length == 0) {
return NoItemFound( return NoItemFound(
message: _subtitle.notificationsNotFound, message: context.translation.notificationsNotFound,
); );
} }
return LazyLoading( return LazyLoading(

@ -4,6 +4,7 @@ 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/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.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/pages/user/notifications/notifications_list.dart';
@ -21,14 +22,13 @@ class _NotificationsPageState extends State<NotificationsPage> with TickerProvid
NotificationsProvider _notificationsProvider; NotificationsProvider _notificationsProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
Subtitle _subtitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_notificationsProvider = Provider.of<NotificationsProvider>(context); _notificationsProvider = Provider.of<NotificationsProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
@ -58,7 +58,7 @@ class _NotificationsPageState extends State<NotificationsPage> with TickerProvid
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
_subtitle.notifications, context.translation.notifications,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
), ),
), ),

@ -4,6 +4,7 @@ import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -38,7 +39,7 @@ class _ProfilePageState extends State<ProfilePage> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_width = MediaQuery.of(context).size.width; _width = MediaQuery.of(context).size.width;
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (_firstTime) { if (_firstTime) {
_user = User.fromJson(_userProvider.user.toJson()); _user = User.fromJson(_userProvider.user.toJson());
_firstTime = false; _firstTime = false;
@ -78,11 +79,11 @@ class _ProfilePageState extends State<ProfilePage> {
children: [ children: [
ATextFormField( ATextFormField(
initialValue: _user.userName, initialValue: _user.userName,
hintText: _subtitle.name, hintText: context.translation.name,
enable: false, enable: false,
prefixIconData: Icons.account_circle, prefixIconData: Icons.account_circle,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage, validator: (value) => Validator.hasValue(value) ? null : context.translation.nameValidateMessage,
onSaved: (value) { onSaved: (value) {
_user.userName = value; _user.userName = value;
}, },
@ -92,12 +93,12 @@ class _ProfilePageState extends State<ProfilePage> {
), ),
ATextFormField( ATextFormField(
initialValue: _user.email, initialValue: _user.email,
hintText: _subtitle.email, hintText: context.translation.email,
enable: false, enable: false,
prefixIconData: Icons.email, prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage, validator: (value) => Validator.isEmail(value) ? null : context.translation.emailValidateMessage,
onSaved: (value) { onSaved: (value) {
_user.email = value; _user.email = value;
}, },
@ -131,10 +132,10 @@ class _ProfilePageState extends State<ProfilePage> {
), ),
ATextFormField( ATextFormField(
initialValue: _user.phoneNumber, initialValue: _user.phoneNumber,
hintText: _subtitle.phoneNumber, hintText: context.translation.phoneNumber,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android, prefixIconData: Icons.phone_android,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, validator: (value) => Validator.isPhoneNumber(value) ? null : context.translation.phoneNumberValidateMessage,
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onSaved: (value) { onSaved: (value) {
_user.phoneNumber = value; _user.phoneNumber = value;
@ -145,12 +146,12 @@ class _ProfilePageState extends State<ProfilePage> {
), ),
// ATextFormField( // ATextFormField(
// initialValue: _user.whatsApp, // initialValue: _user.whatsApp,
// hintText: _subtitle.whatsApp, // hintText: context.translation.whatsApp,
// style: Theme.of(context).textTheme.headline6, // style: Theme.of(context).textTheme.headline6,
// prefixIconData: FontAwesomeIcons.whatsapp, // prefixIconData: FontAwesomeIcons.whatsapp,
// prefixIconSize: 36, // prefixIconSize: 36,
// validator: (value) => // validator: (value) =>
// Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, // Validator.isPhoneNumber(value) ? null : context.translation.phoneNumberValidateMessage,
// textInputType: TextInputType.phone, // textInputType: TextInputType.phone,
// onSaved: (value){ // onSaved: (value){
// _user.whatsApp = value; // _user.whatsApp = value;
@ -167,13 +168,13 @@ class _ProfilePageState extends State<ProfilePage> {
height: _width / 8, height: _width / 8,
width: _width / 1.2, width: _width / 1.2,
child: AButton( child: AButton(
text: _subtitle.update, text: context.translation.update,
onPressed: () async { onPressed: () async {
// if (!_formKey.currentState.validate()) return; // if (!_formKey.currentState.validate()) return;
// _formKey.currentState.save(); // _formKey.currentState.save();
// if (_user.departmentId == null) { // if (_user.departmentId == null) {
// ScaffoldMessenger.of(context).showSnackBar(SnackBar( // ScaffoldMessenger.of(context).showSnackBar(SnackBar(
// content: Text(_subtitle.unitRequired), // content: Text(context.translation.unitRequired),
// )); // ));
// return; // return;
// } // }
@ -184,10 +185,10 @@ class _ProfilePageState extends State<ProfilePage> {
// if (status >= 200 && status < 300) { // if (status >= 200 && status < 300) {
// _settingProvider.setUser(_userProvider.user); // _settingProvider.setUser(_userProvider.user);
// ScaffoldMessenger.of(context).showSnackBar(SnackBar( // ScaffoldMessenger.of(context).showSnackBar(SnackBar(
// content: Text(_subtitle.requestCompleteSuccessfully), // content: Text(context.translation.requestCompleteSuccessfully),
// )); // ));
// } else { // } else {
// String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); // String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
// ScaffoldMessenger.of(context).showSnackBar(SnackBar( // ScaffoldMessenger.of(context).showSnackBar(SnackBar(
// content: Text(errorMessage), // content: Text(errorMessage),
// )); // ));

@ -6,6 +6,7 @@ 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/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/issue.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -39,12 +40,11 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
_subtitle.setIssues(_issues);
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: Form( child: Form(
@ -66,7 +66,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
vertical: 24 * AppStyle.getScaleFactor(context), vertical: 24 * AppStyle.getScaleFactor(context),
), ),
child: Text( child: Text(
_subtitle.reportIssue, context.translation.reportIssue,
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.bold),
), ),
), ),
@ -97,10 +97,10 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
children: [ children: [
ATextFormField( ATextFormField(
initialValue: _issue?.title, initialValue: _issue?.title,
hintText: _subtitle.title, hintText: context.translation.title,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.titleValidateMessage, validator: (value) => Validator.hasValue(value) ? null : context.translation.titleValidateMessage,
textInputType: TextInputType.name, textInputType: TextInputType.name,
onSaved: (value) { onSaved: (value) {
_issue.title = value; _issue.title = value;
@ -127,12 +127,12 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
"${_subtitle.shareAntherIssue} :", "${context.translation.shareAntherIssue} :",
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
), ),
), ),
ATextFormField( ATextFormField(
hintText: _subtitle.description, hintText: context.translation.description,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value) { onSaved: (value) {
@ -142,7 +142,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: AButton( child: AButton(
text: _subtitle.submit, text: context.translation.submit,
onPressed: () async { onPressed: () async {
if (!_formKey.currentState.validate()) return; if (!_formKey.currentState.validate()) return;
_formKey.currentState.save(); _formKey.currentState.save();
@ -158,7 +158,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: context.translation.successfulRequestMessage,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
} }

@ -11,6 +11,7 @@ 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/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device.dart';
@ -60,7 +61,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
bool _isLoading = false; bool _isLoading = false;
bool _showDatePicker = false; bool _showDatePicker = false;
Device _device; Device _device;
Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _maintenanceController, _commentController, _reviewCommentController; TextEditingController _maintenanceController, _commentController, _reviewCommentController;
@ -124,7 +125,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
return Scaffold( return Scaffold(
@ -154,7 +155,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
widget.serviceRequest == null ? _subtitle.newServiceRequest : _subtitle.updateServiceRequest, widget.serviceRequest == null ? context.translation.newServiceRequest : context.translation.updateServiceRequest,
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),
), ),
), ),
@ -167,8 +168,8 @@ class CreateRequestPageState extends State<CreateRequestPage> {
? const SizedBox.shrink() ? const SizedBox.shrink()
: ATextFormField( : ATextFormField(
enable: false, enable: false,
initialValue: _userProvider.user.clientName ?? _subtitle.noHospitalFound, initialValue: _userProvider.user.clientName ?? context.translation.noHospitalFound,
hintText: _subtitle.hospital, hintText: context.translation.hospital,
prefixIconData: FontAwesomeIcons.hospital, prefixIconData: FontAwesomeIcons.hospital,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
), ),
@ -318,7 +319,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
ATextFormField( ATextFormField(
controller: _reviewCommentController, controller: _reviewCommentController,
initialValue: _serviceRequest.reviewComment, initialValue: _serviceRequest.reviewComment,
hintText: _subtitle.comment, hintText: context.translation.comment,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value) { onSaved: (value) {
@ -328,7 +329,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
), ),
12.height, 12.height,
MultiFilesPicker( MultiFilesPicker(
label: _subtitle.deviceFiles, label: context.translation.deviceFiles,
files: _deviceImages, files: _deviceImages,
enabled: widget.serviceRequest == null ? true : false, enabled: widget.serviceRequest == null ? true : false,
), ),
@ -341,11 +342,11 @@ class CreateRequestPageState extends State<CreateRequestPage> {
ATextFormField( ATextFormField(
controller: _maintenanceController, controller: _maintenanceController,
initialValue: _serviceRequest.callComments, initialValue: _serviceRequest.callComments,
hintText: _subtitle.maintenanceIssue, hintText: context.translation.maintenanceIssue,
prefixIconData: FontAwesomeIcons.triangleExclamation, prefixIconData: FontAwesomeIcons.triangleExclamation,
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
validator: (value) => widget.serviceRequest != null || Validator.hasValue(value) ? null : _subtitle.maintenanceIssueRequired, validator: (value) => widget.serviceRequest != null || Validator.hasValue(value) ? null : context.translation.maintenanceIssueRequired,
onSaved: (value) { onSaved: (value) {
_serviceRequest.callComments = value; _serviceRequest.callComments = value;
}, },
@ -368,7 +369,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
ATextFormField( ATextFormField(
controller: _commentController, controller: _commentController,
initialValue: _serviceRequest.comments, initialValue: _serviceRequest.comments,
hintText: _subtitle.comment, hintText: context.translation.comment,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value) { onSaved: (value) {
@ -380,11 +381,11 @@ class CreateRequestPageState extends State<CreateRequestPage> {
Padding( Padding(
padding: const EdgeInsets.all(20.0), padding: const EdgeInsets.all(20.0),
child: AButton( child: AButton(
text: widget.serviceRequest == null ? _subtitle.submit : _subtitle.update, text: widget.serviceRequest == null ? context.translation.submit : context.translation.update,
onPressed: () async { onPressed: () async {
if (!_formKey.currentState.validate()) return; if (!_formKey.currentState.validate()) return;
if (_device?.id == null) { if (_device?.id == null) {
Fluttertoast.showToast(msg: _subtitle.pickDevice); Fluttertoast.showToast(msg: context.translation.pickDevice);
return; return;
} }
if (_serviceRequest.firstAction?.name == "Need a visit" && _dateTime == null) { if (_serviceRequest.firstAction?.name == "Need a visit" && _dateTime == null) {
@ -429,11 +430,11 @@ class CreateRequestPageState extends State<CreateRequestPage> {
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: context.translation.successfulRequestMessage,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));

@ -4,6 +4,7 @@ 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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/pages/user/requests/request_details.dart';
@ -26,10 +27,10 @@ class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetail
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
String requestId = ModalRoute.of(context).settings.arguments; String requestId = ModalRoute.of(context).settings.arguments;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: FutureBuilder<ServiceRequest>( body: FutureBuilder<ServiceRequest>(
future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle), future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation),
builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot) { builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot) {
if (snapshot.hasError) if (snapshot.hasError)
return FailedLoading( return FailedLoading(

@ -11,6 +11,7 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/servic
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/call_request_for_work_order_model.dart'; import 'package:test_sa/models/call_request_for_work_order_model.dart';
import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/part.dart';
@ -59,7 +60,6 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
bool _isLoading = false; bool _isLoading = false;
bool _showCommentField = false; bool _showCommentField = false;
Subtitle _subtitle;
final List<File> _files = []; final List<File> _files = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -110,7 +110,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
(element) => element.value == _callRequestForWorkOrder?.assetType, (element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: () => null, orElse: () => null,
); );
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
@ -134,7 +134,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
_subtitle.newServiceReport, context.translation.newServiceReport,
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold),
), ),
), ),
@ -159,21 +159,21 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
spacing: 10, spacing: 10,
children: [ children: [
ASubTitle( ASubTitle(
"${_subtitle.callId}: ${widget.request.requestCode}", "${context.translation.callId}: ${widget.request.requestCode}",
font: 14, font: 14,
), ),
ASubTitle( ASubTitle(
"${_subtitle.assetNumber}: ${widget.request.deviceNumber}", "${context.translation.assetNumber}: ${widget.request.deviceNumber}",
font: 14, font: 14,
), ),
widget.request.deviceSerialNumber == null widget.request.deviceSerialNumber == null
? const SizedBox() ? const SizedBox()
: ASubTitle( : ASubTitle(
"${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}", "${context.translation.deviceSN}: ${widget.request.deviceSerialNumber}",
font: 14, font: 14,
), ),
Text( Text(
"${_subtitle.customer}: ${widget.request.hospitalName}", "${context.translation.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 12, fontSize: 12,
@ -206,10 +206,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.deviceSN), ASubTitle(context.translation.deviceSN),
_validate && _serviceReport.device?.id == null _validate && _serviceReport.device?.id == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -229,10 +229,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(_subtitle.assetType ?? ""), ASubTitle(context.translation.assetType ?? ""),
_validate && _serviceReport.assetType == null _validate && _serviceReport.assetType == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -276,11 +276,11 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
// ASubTitle(_subtitle.reportStatus), // ASubTitle(context.translation.reportStatus),
ASubTitle("Equipment Status"), ASubTitle("Equipment Status"),
_validate && _serviceReport.equipmentStatus == null _validate && _serviceReport.equipmentStatus == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -317,10 +317,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.callLastSituation), ASubTitle(context.translation.callLastSituation),
_validate && _serviceReport.callLastSituation == null _validate && _serviceReport.callLastSituation == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -370,9 +370,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.reportType), // ASubTitle(context.translation.reportType),
// _validate && _serviceReport.type == null ? // _validate && _serviceReport.type == null ?
// ASubTitle(_subtitle.requiredWord,color: Colors.red,): // ASubTitle(context.translation.requiredWord,color: Colors.red,):
// const SizedBox.shrink(), // const SizedBox.shrink(),
// const SizedBox(height: 4,), // const SizedBox(height: 4,),
// ServiceReportTypeMenu( // ServiceReportTypeMenu(
@ -393,7 +393,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const ASubTitle("Return to Service"), const ASubTitle("Return to Service"),
// _validate && _serviceReport.returnToService == null // _validate && _serviceReport.returnToService == null
// ? ASubTitle( // ? ASubTitle(
// _subtitle.requiredWord, // context.translation.requiredWord,
// color: Colors.red, // color: Colors.red,
// ) // )
// : const SizedBox.shrink(), // : const SizedBox.shrink(),
@ -420,7 +420,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(_subtitle.workingHours), ASubTitle(context.translation.workingHours),
const SizedBox(height: 8), const SizedBox(height: 8),
Row( Row(
children: [ children: [
@ -443,10 +443,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.deviceSN), ASubTitle(context.translation.deviceSN),
_validate && _serviceReport.device?.id == null _validate && _serviceReport.device?.id == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -494,7 +494,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceNumber), ASubTitle(context.translation.invoiceNumber),
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
@ -502,7 +502,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
initialValue: _serviceReport?.invoiceNumber, initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value) { onSaved: (value) {
_serviceReport.invoiceNumber = value; _serviceReport.invoiceNumber = value;
@ -518,7 +518,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceCode), ASubTitle(context.translation.invoiceCode),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -526,7 +526,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
initialValue: _serviceReport?.invoiceCode, initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredWord,
textInputType: TextInputType.text, textInputType: TextInputType.text,
onSaved: (value) { onSaved: (value) {
_serviceReport.invoiceCode = value; _serviceReport.invoiceCode = value;
@ -538,7 +538,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.faultDescription), ASubTitle(context.translation.faultDescription),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -560,7 +560,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// textAlign: TextAlign.center, // textAlign: TextAlign.center,
// controller: _faultController, // controller: _faultController,
// style: Theme.of(context).textTheme.titleMedium, // style: Theme.of(context).textTheme.titleMedium,
// validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, // validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredWord,
// textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
// onSaved: (value) { // onSaved: (value) {
// _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; // _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0;
@ -593,7 +593,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
hintText: _serviceReport.faultDescription?.workPerformed ?? "", hintText: _serviceReport.faultDescription?.workPerformed ?? "",
controller: _workPreformedController, controller: _workPreformedController,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredWord,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value) { onSaved: (value) {
_serviceReport.workPreformed = value; _serviceReport.workPreformed = value;
@ -614,7 +614,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const ASubTitle("Failure Reason"), const ASubTitle("Failure Reason"),
_validate && _serviceReport.reason?.id == null _validate && _serviceReport.reason?.id == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -650,7 +650,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox(height: 8), const SizedBox(height: 8),
MultiFilesPicker(label: "Attachments", files: _files), MultiFilesPicker(label: "Attachments", files: _files),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.repairLocation), ASubTitle(context.translation.repairLocation),
const SizedBox(height: 4), const SizedBox(height: 4),
ServiceReportRepairLocation( ServiceReportRepairLocation(
initialValue: _serviceReport.repairLocation, initialValue: _serviceReport.repairLocation,
@ -684,7 +684,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.workingHours), // ASubTitle(context.translation.workingHours),
// const SizedBox( // const SizedBox(
// height: 8, // height: 8,
// ), // ),
@ -708,7 +708,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// // style: Theme.of(context).textTheme.subtitle1, // // style: Theme.of(context).textTheme.subtitle1,
// // validator: (value) => // // validator: (value) =>
// // Validator.isNumeric(value) // // Validator.isNumeric(value)
// // ? null : _subtitle.requiredWord, // // ? null : context.translation.requiredWord,
// // textInputType: TextInputType.number, // // textInputType: TextInputType.number,
// // onSaved: (value){ // // onSaved: (value){
// // _serviceReport.workHours = value; // // _serviceReport.workHours = value;
@ -722,7 +722,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.travelingHours), ASubTitle(context.translation.travelingHours),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -733,7 +733,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => // validator: (value) =>
// Validator.isNumeric(value) // Validator.isNumeric(value)
// ? null : _subtitle.requiredWord, // ? null : context.translation.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value) { onSaved: (value) {
_serviceReport.travelingHours = double.tryParse(value) ?? 0.0; _serviceReport.travelingHours = double.tryParse(value) ?? 0.0;
@ -754,7 +754,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.operatingHours), // ASubTitle(context.translation.operatingHours),
// const SizedBox(height: 4,), // const SizedBox(height: 4,),
// ATextFormField( // ATextFormField(
// initialValue: _serviceReport?.operatingHours, // initialValue: _serviceReport?.operatingHours,
@ -763,7 +763,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => // validator: (value) =>
// Validator.isNumeric(value) // Validator.isNumeric(value)
// ? null : _subtitle.requiredWord, // ? null : context.translation.requiredWord,
// textInputType: TextInputType.number, // textInputType: TextInputType.number,
// onSaved: (value){ // onSaved: (value){
// _serviceReport.operatingHours = value; // _serviceReport.operatingHours = value;
@ -777,7 +777,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.jobSheetNumber), // ASubTitle(context.translation.jobSheetNumber),
// const SizedBox(height: 4,), // const SizedBox(height: 4,),
// ATextFormField( // ATextFormField(
// initialValue: _serviceReport?.jobSheetNumber, // initialValue: _serviceReport?.jobSheetNumber,
@ -862,10 +862,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.partNumberName), ASubTitle(context.translation.partNumberName),
_validate && _serviceReport.parts == null _validate && _serviceReport.parts == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -888,8 +888,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
Row( Row(
children: [ children: [
Expanded(flex: 3, child: Text(_subtitle.number)), Expanded(flex: 3, child: Text(context.translation.number)),
Expanded(flex: 1, child: Text(_subtitle.quantity)), Expanded(flex: 1, child: Text(context.translation.quantity)),
], ],
), ),
Column( Column(
@ -913,7 +913,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
], ],
), ),
AButton( AButton(
text: _subtitle.submit, text: context.translation.submit,
onPressed: () async { onPressed: () async {
_validate = true; _validate = true;
// if (!_formKey.currentState.validate()) { // if (!_formKey.currentState.validate()) {
@ -942,12 +942,12 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: context.translation.successfulRequestMessage,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));

@ -12,6 +12,7 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/servic
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/call_request_for_work_order_model.dart'; import 'package:test_sa/models/call_request_for_work_order_model.dart';
import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/part.dart';
@ -60,7 +61,6 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
bool _isLoading = false; bool _isLoading = false;
bool _showCommentField = false; bool _showCommentField = false;
Subtitle _subtitle;
List<File> _images = []; List<File> _images = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -109,7 +109,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
(element) => element.value == _callRequestForWorkOrder?.assetType, (element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: () => null, orElse: () => null,
); );
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
@ -130,7 +130,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
_subtitle.editServiceReport, context.translation.editServiceReport,
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold),
), ),
), ),
@ -155,21 +155,21 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
spacing: 10, spacing: 10,
children: [ children: [
ASubTitle( ASubTitle(
"${_subtitle.callId}: ${widget.request.requestCode}", "${context.translation.callId}: ${widget.request.requestCode}",
font: 14, font: 14,
), ),
ASubTitle( ASubTitle(
"${_subtitle.assetNumber}: ${widget.request.deviceNumber}", "${context.translation.assetNumber}: ${widget.request.deviceNumber}",
font: 14, font: 14,
), ),
widget.request.deviceSerialNumber == null widget.request.deviceSerialNumber == null
? const SizedBox() ? const SizedBox()
: ASubTitle( : ASubTitle(
"${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}", "${context.translation.deviceSN}: ${widget.request.deviceSerialNumber}",
font: 14, font: 14,
), ),
Text( Text(
"${_subtitle.customer}: ${widget.request.hospitalName}", "${context.translation.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 12, fontSize: 12,
@ -203,10 +203,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// // child: Column( // // child: Column(
// // crossAxisAlignment: CrossAxisAlignment.start, // // crossAxisAlignment: CrossAxisAlignment.start,
// // children: [ // // children: [
// // ASubTitle(_subtitle.reportType), // // ASubTitle(context.translation.reportType),
// // _validate && _serviceReport.type == null // // _validate && _serviceReport.type == null
// // ? ASubTitle( // // ? ASubTitle(
// // _subtitle.requiredWord, // // context.translation.requiredWord,
// // color: Colors.red, // // color: Colors.red,
// // ) // // )
// // : const SizedBox.shrink(), // // : const SizedBox.shrink(),
@ -230,10 +230,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.visitDate), // ASubTitle(context.translation.visitDate),
// _validate && _serviceReport.visitDate == null // _validate && _serviceReport.visitDate == null
// ? ASubTitle( // ? ASubTitle(
// _subtitle.requiredWord, // context.translation.requiredWord,
// color: Colors.red, // color: Colors.red,
// ) // )
// : const SizedBox.shrink(), // : const SizedBox.shrink(),
@ -266,10 +266,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.deviceSN), ASubTitle(context.translation.deviceSN),
_validate && _serviceReport.device?.id == null _validate && _serviceReport.device?.id == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -285,10 +285,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.assetType), ASubTitle(context.translation.assetType),
_validate && _serviceReport.assetType == null _validate && _serviceReport.assetType == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -330,11 +330,11 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
// ASubTitle(_subtitle.reportStatus), // ASubTitle(context.translation.reportStatus),
ASubTitle("Equipment Status"), ASubTitle("Equipment Status"),
_validate && _serviceReport.equipmentStatus == null _validate && _serviceReport.equipmentStatus == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -371,10 +371,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.callLastSituation), ASubTitle(context.translation.callLastSituation),
_validate && _serviceReport.callLastSituation == null _validate && _serviceReport.callLastSituation == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -473,7 +473,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// ), // ),
// _validate && _serviceReport.engineer == null // _validate && _serviceReport.engineer == null
// ? ASubTitle( // ? ASubTitle(
// _subtitle.requiredWord, // context.translation.requiredWord,
// color: Colors.red, // color: Colors.red,
// ) // )
// : const SizedBox.shrink(), // : const SizedBox.shrink(),
@ -497,10 +497,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.reportStatus), // ASubTitle(context.translation.reportStatus),
// _validate && _serviceReport.equipmentStatus == null // _validate && _serviceReport.equipmentStatus == null
// ? ASubTitle( // ? ASubTitle(
// _subtitle.requiredWord, // context.translation.requiredWord,
// color: Colors.red, // color: Colors.red,
// ) // )
// : const SizedBox.shrink(), // : const SizedBox.shrink(),
@ -527,10 +527,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.callLastSituation), // ASubTitle(context.translation.callLastSituation),
// _validate && _serviceReport.callLastSituation == null // _validate && _serviceReport.callLastSituation == null
// ? ASubTitle( // ? ASubTitle(
// _subtitle.requiredWord, // context.translation.requiredWord,
// color: Colors.red, // color: Colors.red,
// ) // )
// : const SizedBox.shrink(), // : const SizedBox.shrink(),
@ -567,7 +567,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceNumber), ASubTitle(context.translation.invoiceNumber),
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
@ -575,7 +575,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
initialValue: _serviceReport?.invoiceNumber, initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value) { onSaved: (value) {
_serviceReport.invoiceNumber = value; _serviceReport.invoiceNumber = value;
@ -591,7 +591,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceCode), ASubTitle(context.translation.invoiceCode),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -599,7 +599,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
initialValue: _serviceReport?.invoiceCode, initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredWord,
textInputType: TextInputType.text, textInputType: TextInputType.text,
onSaved: (value) { onSaved: (value) {
_serviceReport.invoiceCode = value; _serviceReport.invoiceCode = value;
@ -614,7 +614,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
// Row( // Row(
// children: [ // children: [
// ASubTitle(_subtitle.faultDescription), // ASubTitle(context.translation.faultDescription),
// Expanded( // Expanded(
// child: SizedBox( // child: SizedBox(
// height: 32 * AppStyle.getScaleFactor(context), // height: 32 * AppStyle.getScaleFactor(context),
@ -634,7 +634,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => // validator: (value) =>
// Validator.hasValue(value) // Validator.hasValue(value)
// ? null : _subtitle.requiredWord, // ? null : context.translation.requiredWord,
// textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
// onSaved: (value){ // onSaved: (value){
// _serviceReport.faultDescriptionId = value; // _serviceReport.faultDescriptionId = value;
@ -643,7 +643,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
// Row( // Row(
// children: [ // children: [
// ASubTitle(_subtitle.workPreformed), // ASubTitle(context.translation.workPreformed),
// Expanded( // Expanded(
// child: SizedBox( // child: SizedBox(
// height: 32 * AppStyle.getScaleFactor(context), // height: 32 * AppStyle.getScaleFactor(context),
@ -663,7 +663,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => // validator: (value) =>
// Validator.hasValue(value) // Validator.hasValue(value)
// ? null : _subtitle.requiredWord, // ? null : context.translation.requiredWord,
// textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
// onSaved: (value){ // onSaved: (value){
// _serviceReport.workPreformed = value; // _serviceReport.workPreformed = value;
@ -671,7 +671,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// ), // ),
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours), ASubTitle(context.translation.workingHours),
const SizedBox(height: 8), const SizedBox(height: 8),
Row( Row(
children: [ children: [
@ -708,7 +708,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
height: 8 * AppStyle.getScaleFactor(context), height: 8 * AppStyle.getScaleFactor(context),
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.faultDescription), ASubTitle(context.translation.faultDescription),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -732,7 +732,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
hintText: _serviceReport.faultDescription?.workPerformed ?? "", hintText: _serviceReport.faultDescription?.workPerformed ?? "",
controller: _workPreformedController, controller: _workPreformedController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredWord,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value) { onSaved: (value) {
// _serviceReport.workPreformed = value; // _serviceReport.workPreformed = value;
@ -752,7 +752,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(_subtitle.attachImage), ASubTitle(context.translation.attachImage),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -772,7 +772,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
height: 8, height: 8,
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.repairLocation), ASubTitle(context.translation.repairLocation),
const SizedBox(height: 4), const SizedBox(height: 4),
ServiceReportRepairLocation( ServiceReportRepairLocation(
initialValue: _serviceReport.repairLocation, initialValue: _serviceReport.repairLocation,
@ -787,7 +787,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.travelingExpense?.toString(), initialValue: _serviceReport?.travelingExpense?.toString(),
hintText: _subtitle.travelingExpense, hintText: context.translation.travelingExpense,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.number, textInputType: TextInputType.number,
@ -800,7 +800,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.travelingHours), ASubTitle(context.translation.travelingHours),
const SizedBox(height: 4), const SizedBox(height: 4),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.travelingHours?.toString(), initialValue: _serviceReport?.travelingHours?.toString(),
@ -809,7 +809,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => // validator: (value) =>
// Validator.isNumeric(value) // Validator.isNumeric(value)
// ? null : _subtitle.requiredWord, // ? null : context.translation.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value) { onSaved: (value) {
_serviceReport.travelingHours = double.tryParse(value) ?? 0.0; _serviceReport.travelingHours = double.tryParse(value) ?? 0.0;
@ -822,7 +822,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.workingHours), // ASubTitle(context.translation.workingHours),
// const SizedBox( // const SizedBox(
// height: 8, // height: 8,
// ), // ),
@ -846,7 +846,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// // style: Theme.of(context).textTheme.subtitle1, // // style: Theme.of(context).textTheme.subtitle1,
// // validator: (value) => // // validator: (value) =>
// // Validator.isNumeric(value) // // Validator.isNumeric(value)
// // ? null : _subtitle.requiredWord, // // ? null : context.translation.requiredWord,
// // textInputType: TextInputType.number, // // textInputType: TextInputType.number,
// // onSaved: (value){ // // onSaved: (value){
// // _serviceReport.workHours = value; // // _serviceReport.workHours = value;
@ -860,7 +860,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// // child: Column( // // child: Column(
// // crossAxisAlignment: CrossAxisAlignment.start, // // crossAxisAlignment: CrossAxisAlignment.start,
// // children: [ // // children: [
// // ASubTitle(_subtitle.travelingHours), // // ASubTitle(context.translation.travelingHours),
// // const SizedBox(height: 4,), // // const SizedBox(height: 4,),
// // ATextFormField( // // ATextFormField(
// // initialValue: _serviceReport?.travelingHours, // // initialValue: _serviceReport?.travelingHours,
@ -869,7 +869,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// // style: Theme.of(context).textTheme.subtitle1, // // style: Theme.of(context).textTheme.subtitle1,
// // validator: (value) => // // validator: (value) =>
// // Validator.isNumeric(value) // // Validator.isNumeric(value)
// // ? null : _subtitle.requiredWord, // // ? null : context.translation.requiredWord,
// // textInputType: TextInputType.number, // // textInputType: TextInputType.number,
// // onSaved: (value){ // // onSaved: (value){
// // _serviceReport.travelingHours = value; // // _serviceReport.travelingHours = value;
@ -890,7 +890,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.operatingHours), // ASubTitle(context.translation.operatingHours),
// const SizedBox(height: 4,), // const SizedBox(height: 4,),
// ATextFormField( // ATextFormField(
// initialValue: _serviceReport?.operatingHours, // initialValue: _serviceReport?.operatingHours,
@ -899,7 +899,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => // validator: (value) =>
// Validator.isNumeric(value) // Validator.isNumeric(value)
// ? null : _subtitle.requiredWord, // ? null : context.translation.requiredWord,
// textInputType: TextInputType.number, // textInputType: TextInputType.number,
// onSaved: (value){ // onSaved: (value){
// _serviceReport.operatingHours = value; // _serviceReport.operatingHours = value;
@ -913,7 +913,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.jobSheetNumber), // ASubTitle(context.translation.jobSheetNumber),
// const SizedBox(height: 4,), // const SizedBox(height: 4,),
// ATextFormField( // ATextFormField(
// initialValue: _serviceReport?.jobSheetNumber, // initialValue: _serviceReport?.jobSheetNumber,
@ -1002,10 +1002,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.partNumberName), ASubTitle(context.translation.partNumberName),
_validate && _serviceReport.parts == null _validate && _serviceReport.parts == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
@ -1029,8 +1029,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
Row( Row(
children: [ children: [
Expanded(flex: 3, child: Text(_subtitle.number)), Expanded(flex: 3, child: Text(context.translation.number)),
Expanded(flex: 1, child: Text(_subtitle.quantity)), Expanded(flex: 1, child: Text(context.translation.quantity)),
], ],
), ),
Column( Column(
@ -1052,7 +1052,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
), ),
AButton( AButton(
text: _subtitle.update, text: context.translation.update,
onPressed: () async { onPressed: () async {
if (_serviceReport?.workingHours == null) { if (_serviceReport?.workingHours == null) {
await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started"); await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started");
@ -1079,12 +1079,12 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: context.translation.successfulRequestMessage,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));

@ -4,6 +4,7 @@ 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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_report.dart';
import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
@ -31,11 +32,11 @@ class _FutureServiceReportState extends State<FutureServiceReport> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle subtitle = AppLocalization.of(context).subtitle;
ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: subtitle); ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation);
return Scaffold( return Scaffold(
body: FutureBuilder<ServiceReport>( body: FutureBuilder<ServiceReport>(
future: ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: subtitle), future: ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation),
builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot) { builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return FailedLoading( return FailedLoading(

@ -43,7 +43,6 @@ class RequestDetailsPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
UserProvider _userProvider = Provider.of<UserProvider>(context); UserProvider _userProvider = Provider.of<UserProvider>(context);
SettingProvider _settingProvider = Provider.of<SettingProvider>(context); SettingProvider _settingProvider = Provider.of<SettingProvider>(context);
List<SearchWorkOrder> workOrders = []; List<SearchWorkOrder> workOrders = [];
@ -85,7 +84,7 @@ class RequestDetailsPage extends StatelessWidget {
8.height, 8.height,
Text(serviceRequest.deviceEnName, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), Text(serviceRequest.deviceEnName, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
Text( Text(
'${_subtitle.assetNumber}: ${serviceRequest.device.number}', '${context.translation.assetNumber}: ${serviceRequest.device.number}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
), ),
Text( Text(
@ -155,7 +154,7 @@ class RequestDetailsPage extends StatelessWidget {
return DefaultTabController( return DefaultTabController(
length: 2, length: 2,
child: Scaffold( child: Scaffold(
appBar: const DefaultAppBar(title: TranslationKeys.serviceRequest), appBar: DefaultAppBar(title: context.translation.serviceRequest),
backgroundColor: const Color(0xfff8f9fb), backgroundColor: const Color(0xfff8f9fb),
body: SafeArea( body: SafeArea(
child: FutureBuilder( child: FutureBuilder(
@ -176,7 +175,7 @@ class RequestDetailsPage extends StatelessWidget {
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
_subtitle.details, context.translation.details,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
), ),
), ),
@ -229,7 +228,7 @@ class RequestDetailsPage extends StatelessWidget {
// barrierDismissible: false, // barrierDismissible: false,
// builder: (BuildContext context) { // builder: (BuildContext context) {
// return CupertinoAlertDialog( // return CupertinoAlertDialog(
// title: Text(_subtitle.updatingDots), // title: Text(context.translation.updatingDots),
// content: Center(child: CircularProgressIndicator()), // content: Center(child: CircularProgressIndicator()),
// ); // );
// }, // },
@ -242,7 +241,7 @@ class RequestDetailsPage extends StatelessWidget {
// ); // );
// Navigator.of(context).pop(); // Navigator.of(context).pop();
// Fluttertoast.showToast( // Fluttertoast.showToast(
// msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation),
// ); // );
}, },
), ),
@ -262,10 +261,10 @@ class RequestDetailsPage extends StatelessWidget {
).paddingOnly(top: 4, bottom: 4), ).paddingOnly(top: 4, bottom: 4),
TabBar(labelColor: AColors.primaryColor, tabs: [ TabBar(labelColor: AColors.primaryColor, tabs: [
Tab( Tab(
text: _subtitle.general, text: context.translation.general,
), ),
Tab( Tab(
text: _subtitle.serviceRequestInformation, text: context.translation.serviceRequestInformation,
), ),
]), ]),
SizedBox( SizedBox(
@ -281,7 +280,7 @@ class RequestDetailsPage extends StatelessWidget {
children: [ children: [
informationCard(), informationCard(),
RequestInfoRow( RequestInfoRow(
title: _subtitle.callId, title: context.translation.callId,
info: serviceRequest.requestCode, info: serviceRequest.requestCode,
), ),
RequestInfoRow( RequestInfoRow(
@ -289,36 +288,36 @@ class RequestDetailsPage extends StatelessWidget {
info: serviceRequest.deviceNumber, info: serviceRequest.deviceNumber,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.assetName, title: context.translation.assetName,
info: serviceRequest.deviceEnName, info: serviceRequest.deviceEnName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.deviceModel, title: context.translation.deviceModel,
info: serviceRequest.deviceModel, info: serviceRequest.deviceModel,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.engineerName, title: context.translation.engineerName,
info: serviceRequest.engineerName, info: serviceRequest.engineerName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.engineerPhone, title: context.translation.engineerPhone,
info: serviceRequest.engineerMobile, info: serviceRequest.engineerMobile,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.date, title: context.translation.date,
info: serviceRequest.date, info: serviceRequest.date,
), ),
serviceRequest.nextVisitDate == null serviceRequest.nextVisitDate == null
? SizedBox.shrink() ? SizedBox.shrink()
: RequestInfoRow( : RequestInfoRow(
title: _subtitle.nextVisitDate, title: context.translation.next,
info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate), info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate),
), ),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"${_subtitle.status} : ", "${context.translation.status} : ",
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
@ -330,23 +329,23 @@ class RequestDetailsPage extends StatelessWidget {
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.hospital, title: context.translation.hospital,
info: serviceRequest.hospitalName, info: serviceRequest.hospitalName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.unite, title: context.translation.unite,
info: serviceRequest.departmentName, info: serviceRequest.departmentName,
), ),
// RequestInfoRow( // RequestInfoRow(
// title: _subtitle.deviceArName, // title: context.translation.deviceArName,
// content: serviceRequest.deviceArName, // content: serviceRequest.deviceArName,
// ), // ),
// RequestInfoRow( // RequestInfoRow(
// title: _subtitle.deviceName, // title: context.translation.deviceName,
// content: serviceRequest.deviceEnName, // content: serviceRequest.deviceEnName,
// ), // ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.maintenanceIssue, title: context.translation.maintenanceIssue,
content: serviceRequest.callComments, content: serviceRequest.callComments,
), ),
if (serviceRequest.audio?.isNotEmpty == true) if (serviceRequest.audio?.isNotEmpty == true)
@ -358,13 +357,13 @@ class RequestDetailsPage extends StatelessWidget {
// child: Padding( // child: Padding(
// padding: EdgeInsets.all(32), // padding: EdgeInsets.all(32),
// child: AButton( // child: AButton(
// text: _subtitle.duplicateRequest, // text: context.translation.duplicateRequest,
// onPressed: () async { // onPressed: () async {
// bool result = await showDialog( // bool result = await showDialog(
// context: context, // context: context,
// builder: (_) => AAlertDialog( // builder: (_) => AAlertDialog(
// title: _subtitle.duplicateAlert, // title: context.translation.duplicateAlert,
// content: _subtitle.duplicateAlertMessage, // content: context.translation.duplicateAlertMessage,
// ) // )
// ); // );
// if(result == true){ // if(result == true){
@ -383,7 +382,7 @@ class RequestDetailsPage extends StatelessWidget {
// ScaffoldMessenger.of(context).showSnackBar( // ScaffoldMessenger.of(context).showSnackBar(
// SnackBar( // SnackBar(
// content: Text( // content: Text(
// HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle) // HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation)
// ) // )
// ) // )
// ); // );
@ -394,7 +393,7 @@ class RequestDetailsPage extends StatelessWidget {
// ) // )
], ],
).expanded, ).expanded,
AppFilledButton(label: TranslationKeys.login, maxWidth: true, onPressed: () {}).paddingOnly(left: 16, right: 16, bottom: 24), AppFilledButton(label: context.translation.login, maxWidth: true, onPressed: () {}).paddingOnly(left: 16, right: 16, bottom: 24),
], ],
), ),
// workOrders.isEmpty ? // workOrders.isEmpty ?
@ -432,36 +431,36 @@ class RequestDetailsPage extends StatelessWidget {
child: Column( child: Column(
children: [ children: [
RequestInfoRow( RequestInfoRow(
title: _subtitle.callId, title: context.translation.callId,
content: serviceRequest.requestCode, content: serviceRequest.requestCode,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.orderWorkNumber, title: context.translation.orderWorkNumber,
info: workOrders[index].workOrderNo.toString(), info: workOrders[index].workOrderNo.toString(),
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.visitDate, title: context.translation.visitDate,
info: workOrders[index].visitDate, info: workOrders[index].visitDate,
), ),
RequestInfoRow(title: _subtitle.assignedEmployee, info: workOrders[index].assignedEmployee?.name ?? ""), RequestInfoRow(title: context.translation.assignedEmployee, info: workOrders[index].assignedEmployee?.name ?? ""),
RequestInfoRow( RequestInfoRow(
title: _subtitle.assetSN, title: context.translation.assetSN,
info: workOrders[index].callRequest.asset.assetSerialNo, info: workOrders[index].callRequest.asset.assetSerialNo,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.assetName, title: context.translation.assetName,
info: workOrders[index].callRequest.asset.modelDefinition.assetName, info: workOrders[index].callRequest.asset.modelDefinition.assetName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.assetNumber, title: context.translation.assetNumber,
info: workOrders[index].callRequest.asset.assetNumber, info: workOrders[index].callRequest.asset.assetNumber,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.model, title: context.translation.model,
info: workOrders[index].callRequest.asset.modelDefinition.modelName, info: workOrders[index].callRequest.asset.modelDefinition.modelName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.site, title: context.translation.site,
info: workOrders[index].callRequest.asset.site.custName, info: workOrders[index].callRequest.asset.site.custName,
), ),
RequestInfoRow( RequestInfoRow(
@ -472,7 +471,7 @@ class RequestDetailsPage extends StatelessWidget {
? Padding( ? Padding(
padding: EdgeInsets.all(32), padding: EdgeInsets.all(32),
child: AButton( child: AButton(
text: _subtitle.editServiceReport, text: context.translation.editServiceReport,
onPressed: serviceRequest.statusValue == 5 || serviceRequest.statusValue == 3 onPressed: serviceRequest.statusValue == 5 || serviceRequest.statusValue == 3
? null ? null
: () { : () {
@ -514,7 +513,7 @@ class RequestDetailsPage extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: Center( child: Center(
child: ASubTitle(_subtitle.dataNotFound), child: ASubTitle(context.translation.dataNotFound),
), ),
), ),
if (_userProvider.user.type == UsersTypes.engineer) if (_userProvider.user.type == UsersTypes.engineer)

@ -4,6 +4,7 @@ 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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/models/enums/translation_keys.dart';
import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/service_request/service_request_search.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -14,6 +15,7 @@ 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/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/requests/service_request_list.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 'package:test_sa/views/widgets/search/service_request_search_bar.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class ServiceRequestsPage extends StatefulWidget { class ServiceRequestsPage extends StatefulWidget {
static final String id = "/service-requests"; static final String id = "/service-requests";
@ -34,14 +36,13 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerPr
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (_firstTime) { if (_firstTime) {
_serviceRequestsProvider.reset(); _serviceRequestsProvider.reset();
_firstTime = false; _firstTime = false;
} }
return Scaffold( return Scaffold(
appBar: const DefaultAppBar(title: TranslationKeys.serviceRequest), appBar: DefaultAppBar(title: context.translation.serviceRequest),
backgroundColor: const Color(0xfff8f9fb), backgroundColor: const Color(0xfff8f9fb),
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(

@ -5,6 +5,7 @@ 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/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/calibration_tools.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart';
import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/models/pantry/pm_kit.dart'; import 'package:test_sa/models/pantry/pm_kit.dart';
@ -32,7 +33,6 @@ class EditPentry extends StatefulWidget {
class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin { class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
RegularVisitsProvider _regularVisitsProvider; RegularVisitsProvider _regularVisitsProvider;
@ -56,13 +56,13 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: context.translation.successfulRequestMessage,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
// String errorMessage = HttpStatusManger.getStatusMessage( // String errorMessage = HttpStatusManger.getStatusMessage(
// status: status, subtitle: _subtitle); // status: status, subtitle: context.translation);
// Fluttertoast.showToast( // Fluttertoast.showToast(
// msg: errorMessage, // msg: errorMessage,
// ); // );
@ -87,7 +87,6 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); _regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
@ -162,7 +161,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
children: [ children: [
if (_tabController.index != 0) if (_tabController.index != 0)
ASmallButton( ASmallButton(
text: _subtitle.back, text: context.translation.back,
onPressed: () { onPressed: () {
_tabController.animateTo( _tabController.animateTo(
_tabController.index - 1, _tabController.index - 1,
@ -173,7 +172,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
const Spacer(), const Spacer(),
if (_tabController.index != _tabController.length - 1) if (_tabController.index != _tabController.length - 1)
ASmallButton( ASmallButton(
text: _subtitle.next, text: context.translation.next,
onPressed: () { onPressed: () {
_tabController.animateTo( _tabController.animateTo(
_tabController.index + 1, _tabController.index + 1,
@ -183,7 +182,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
), ),
if (_tabController.index == _tabController.length - 1) if (_tabController.index == _tabController.length - 1)
ASmallButton( ASmallButton(
text: _subtitle.update, text: context.translation.update,
onPressed: _onSubmit, onPressed: _onSubmit,
), ),
], ],

@ -4,6 +4,7 @@ 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/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.dart';
@ -28,14 +29,14 @@ class _FutureEditPentryState extends State<FutureEditPentry> {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
//String requestId = ModalRoute.of(context).settings.arguments; //String requestId = ModalRoute.of(context).settings.arguments;
Subtitle subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: FutureBuilder<Pentry>( body: FutureBuilder<Pentry>(
future: RegularVisitsProvider().getPently(user: _userProvider.user, host: _settingProvider.host, id: widget.visit.id), future: RegularVisitsProvider().getPently(user: _userProvider.user, host: _settingProvider.host, id: widget.visit.id),
builder: (BuildContext context, AsyncSnapshot<Pentry> snapshot) { builder: (BuildContext context, AsyncSnapshot<Pentry> snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return FailedLoading( return FailedLoading(
message: subtitle.failedToCompleteRequest, message: context.translation.failedToCompleteRequest,
onReload: () { onReload: () {
setState(() {}); setState(() {});
}, },

@ -7,6 +7,7 @@ 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/preventive_maintenance_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/models/visits/visits_search.dart';
@ -30,14 +31,13 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
PreventiveMaintenanceVisitsProvider _visitsProvider; PreventiveMaintenanceVisitsProvider _visitsProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
Subtitle _subtitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_visitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context); _visitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
@ -68,7 +68,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
_subtitle.preventiveMaintenance, context.translation.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
), ),
), ),
@ -112,7 +112,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: AButton( child: AButton(
text: _subtitle.clearSearch, text: context.translation.clearSearch,
onPressed: () { onPressed: () {
_visitsProvider.visitsSearch = VisitsSearch(); _visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset(); _visitsProvider.reset();
@ -138,7 +138,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
builder: (context) { builder: (context) {
return UpdateVisitsGroupSheet( return UpdateVisitsGroupSheet(
visits: visits, visits: visits,
title: _subtitle.updatePreventiveMaintenance, title: context.translation.updatePreventiveMaintenance,
); );
}, },
) as VisitsGroup; ) as VisitsGroup;
@ -148,7 +148,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
barrierDismissible: false, barrierDismissible: false,
builder: (BuildContext context) { builder: (BuildContext context) {
return CupertinoAlertDialog( return CupertinoAlertDialog(
title: Text(_subtitle.updatingDots), title: Text(context.translation.updatingDots),
content: Center(child: CircularProgressIndicator()), content: Center(child: CircularProgressIndicator()),
); );
}, },
@ -157,13 +157,13 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
Navigator.of(context).pop(); Navigator.of(context).pop();
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, msg: context.translation.preventiveMaintenanceUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM, gravity: ToastGravity.BOTTOM,
); );
} else { } else {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation),
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM, gravity: ToastGravity.BOTTOM,
); );

@ -7,6 +7,7 @@ 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/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/models/visits/visits_search.dart';
@ -31,14 +32,13 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
bool _expandedSearch = false; bool _expandedSearch = false;
Subtitle _subtitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_visitsProvider = Provider.of<RegularVisitsProvider>(context); _visitsProvider = Provider.of<RegularVisitsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
@ -68,7 +68,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
_subtitle.preventiveMaintenance, context.translation.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
), ),
), ),
@ -111,7 +111,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: AButton( child: AButton(
text: _subtitle.clearSearch, text: context.translation.clearSearch,
onPressed: () { onPressed: () {
_visitsProvider.visitsSearch = VisitsSearch(); _visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset(); _visitsProvider.reset();
@ -136,7 +136,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
builder: (context) { builder: (context) {
return UpdateVisitsGroupSheet( return UpdateVisitsGroupSheet(
visits: visits, visits: visits,
title: _subtitle.updateRegularVisits, title: context.translation.updateRegularVisits,
); );
}, },
) as VisitsGroup; ) as VisitsGroup;
@ -146,7 +146,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
barrierDismissible: false, barrierDismissible: false,
builder: (BuildContext context) { builder: (BuildContext context) {
return CupertinoAlertDialog( return CupertinoAlertDialog(
title: Text(_subtitle.updatingDots), title: Text(context.translation.updatingDots),
content: Center(child: CircularProgressIndicator()), content: Center(child: CircularProgressIndicator()),
); );
}, },
@ -155,13 +155,13 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
Navigator.of(context).pop(); Navigator.of(context).pop();
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, msg: context.translation.preventiveMaintenanceUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM, gravity: ToastGravity.BOTTOM,
); );
} else { } else {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation),
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM, gravity: ToastGravity.BOTTOM,
); );

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.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_group.dart';
@ -34,7 +35,7 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
VisitsGroup _group = VisitsGroup(); VisitsGroup _group = VisitsGroup();
// File _image; // File _image;
Subtitle _subtitle;
@override @override
void initState() { void initState() {
@ -45,7 +46,7 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Container( return Container(
height: MediaQuery.of(context).size.height / 1.3, height: MediaQuery.of(context).size.height / 1.3,
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
@ -61,13 +62,13 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
widget.title ?? _subtitle.updateVisitsGroup, widget.title ?? context.translation.updateVisitsGroup,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
), ),
ASmallButton( ASmallButton(
text: _subtitle.cancel, text: context.translation.cancel,
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
@ -218,7 +219,7 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"${_subtitle.sn}: " + visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound, "${context.translation.sn}: " + visit.deviceSerialNumber ?? context.translation.noSerialNumberFound,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontSize: 16, fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontSize: 16, fontWeight: FontWeight.bold),
), ),
), ),
@ -232,7 +233,7 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
), ),
), ),
AButton( AButton(
text: _subtitle.update, text: context.translation.update,
onPressed: () { onPressed: () {
Navigator.of(context).pop(_group); Navigator.of(context).pop(_group);
}, },

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.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/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -26,7 +26,6 @@ class VisitDetailsPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
UserProvider userProvider = Provider.of<UserProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
return Scaffold( return Scaffold(
@ -42,7 +41,7 @@ class VisitDetailsPage extends StatelessWidget {
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
subtitle.visitInformation, context.translation.visitInformation,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
), ),
), ),
@ -118,7 +117,7 @@ class VisitDetailsPage extends StatelessWidget {
height: 8, height: 8,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.code, title: context.translation.code,
info: visit.serialNumber, info: visit.serialNumber,
), ),
RequestInfoRow( RequestInfoRow(
@ -126,26 +125,26 @@ class VisitDetailsPage extends StatelessWidget {
info: visit.deviceNumber, info: visit.deviceNumber,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.deviceName, title: context.translation.deviceName,
content: visit.deviceEnglishName, content: visit.deviceEnglishName,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.deviceSN, title: context.translation.deviceSN,
info: visit.deviceSerialNumber, info: visit.deviceSerialNumber,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.expectDate, title: context.translation.expectDate,
info: visit.expectDate, info: visit.expectDate,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.actualDate, title: context.translation.actualDate,
info: visit.actualDate, info: visit.actualDate,
), ),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"${subtitle.status} : ", "${context.translation.status} : ",
style: Theme.of(context).textTheme.titleMedium.copyWith(fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.titleMedium.copyWith(fontWeight: FontWeight.bold),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
@ -159,15 +158,15 @@ class VisitDetailsPage extends StatelessWidget {
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.contactStatus, title: context.translation.contactStatus,
info: visit.assignTo, info: visit.assignTo,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.engineerName, title: context.translation.engineerName,
info: visit.employName, info: visit.employName,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.hospital, title: context.translation.hospital,
content: visit.hospitalName, content: visit.hospitalName,
), ),
], ],

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -30,7 +31,7 @@ class _FromToDateBarState extends State<FromToDateBar> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
@ -38,7 +39,7 @@ class _FromToDateBarState extends State<FromToDateBar> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
_subtitle.from, context.translation.from,
style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal), style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
@ -57,7 +58,7 @@ class _FromToDateBarState extends State<FromToDateBar> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
_subtitle.to, context.translation.to,
style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal), style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
@ -14,7 +15,7 @@ class DepartmentButton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return ElevatedButton( return ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
elevation: 0, elevation: 0,
@ -31,7 +32,7 @@ class DepartmentButton extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8), padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text( child: Text(
department?.name ?? _subtitle.pickUnite, department?.name ?? context.translation.pickUnite,
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyText1,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
textDirection: TextDirection.rtl, textDirection: TextDirection.rtl,

@ -3,6 +3,7 @@ import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.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/departments_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/widgets/departments/department_item.dart'; import 'package:test_sa/views/widgets/departments/department_item.dart';
@ -28,7 +29,6 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
_departmentsProvider = Provider.of<DepartmentsProvider>(context); _departmentsProvider = Provider.of<DepartmentsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (_firstTime && _departmentsProvider.departments != null) { if (_firstTime && _departmentsProvider.departments != null) {
_searchableList.addAll(_departmentsProvider.departments); _searchableList.addAll(_departmentsProvider.departments);
_firstTime = false; _firstTime = false;
@ -54,7 +54,7 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ATextFormField( child: ATextFormField(
hintText: _subtitle.searchByName, hintText: context.translation.searchByName,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
suffixIcon: Icon(Icons.search_rounded), suffixIcon: Icon(Icons.search_rounded),
onChange: (value) { onChange: (value) {
@ -67,7 +67,7 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
Expanded( Expanded(
child: _searchableList.isEmpty child: _searchableList.isEmpty
? NoItemFound( ? NoItemFound(
message: _subtitle.noUniteFound, message: context.translation.noUniteFound,
) )
: ListView.builder( : ListView.builder(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device_transfer_info.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/app_style/colors.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart';
@ -19,16 +20,15 @@ class DeviceTransferInfoSection extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
info.userName = Provider.of<UserProvider>(context).user.username; info.userName = Provider.of<UserProvider>(context).user.username;
final subtitle = AppLocalization.of(context).subtitle;
info.attachments ??= []; info.attachments ??= [];
return Column( return Column(
children: [ children: [
RequestInfoRow( RequestInfoRow(
title: subtitle.hospital, title: context.translation.hospital,
info: info.client.name, info: info.client.name,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.department, title: context.translation.department,
info: info.department.name, info: info.department.name,
), ),
// RequestInfoRow( // RequestInfoRow(
@ -36,11 +36,11 @@ class DeviceTransferInfoSection extends StatelessWidget {
// info: info.userName, // info: info.userName,
// ), // ),
RequestInfoRow( RequestInfoRow(
title: subtitle.workingHours, title: context.translation.workingHours,
info: info.workingHours, info: info.workingHours,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.travelingHours, title: context.translation.travelingHours,
info: info.travelingHours, info: info.travelingHours,
), ),
RequestInfoRow( RequestInfoRow(
@ -53,7 +53,7 @@ class DeviceTransferInfoSection extends StatelessWidget {
), ),
RequestInfoRow( RequestInfoRow(
title: "Signature", title: "Signature",
info: info.engSignature?.isEmpty != false ? subtitle.noDateFound : null, info: info.engSignature?.isEmpty != false ? context.translation.noDateFound : null,
contentWidget: info.engSignature?.isEmpty != false ? null : ImageLoader(url: info.engSignature), contentWidget: info.engSignature?.isEmpty != false ? null : ImageLoader(url: info.engSignature),
), ),
Padding( Padding(
@ -65,7 +65,7 @@ class DeviceTransferInfoSection extends StatelessWidget {
), ),
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.status, title: context.translation.status,
infoWidget: StatusLabel(label: info.status?.name, backgroundColor: AColors.getGasStatusColor(info.status?.id)), infoWidget: StatusLabel(label: info.status?.name, backgroundColor: AColors.getGasStatusColor(info.status?.id)),
), ),
], ],

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -18,7 +19,6 @@ class DeviceTransferItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
User _user = Provider.of<UserProvider>(context, listen: false).user; User _user = Provider.of<UserProvider>(context, listen: false).user;
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; 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; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
@ -71,7 +71,7 @@ class DeviceTransferItem extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
_subtitle.from, context.translation.from,
style: Theme.of(context).textTheme.subtitle2.copyWith( style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor, color: onItemColor,
), ),
@ -110,7 +110,7 @@ class DeviceTransferItem extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
_subtitle.to, context.translation.to,
style: Theme.of(context).textTheme.subtitle2.copyWith( style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor, color: onItemColor,
), ),

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/subtitle.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/pages/device_transfer/device_transfer_details.dart';
@ -17,9 +18,8 @@ class DeviceTransferList extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (items.isEmpty) { if (items.isEmpty) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
return NoItemFound( return NoItemFound(
message: subtitle.noServiceRequestFound, message: context.translation.noServiceRequestFound,
); );
} }
return LazyLoading( return LazyLoading(

@ -9,7 +9,7 @@ class AAlertDialog extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// Subtitle _subtitle = AppLocalization.of(context).subtitle; //
return CupertinoAlertDialog( return CupertinoAlertDialog(
title: title != null ? Text(title) : null, title: title != null ? Text(title) : null,
content: content != null ? Text(content) : null, content: content != null ? Text(content) : null,

@ -43,7 +43,7 @@ class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context); _devicesProvider = Provider.of<DevicesProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle; //
return LoadingManager( return LoadingManager(
isLoading: _devicesProvider.isLoading, isLoading: _devicesProvider.isLoading,
isFailedLoading: _devicesProvider.devices == null, isFailedLoading: _devicesProvider.devices == null,

@ -45,7 +45,7 @@ class _AutoCompleteModelFieldState extends State<AutoCompleteModelField> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context); _devicesProvider = Provider.of<DevicesProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle; //
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration( decoration: BoxDecoration(

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
@ -15,7 +16,7 @@ class DeviceButton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return ElevatedButton( return ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
elevation: 0, elevation: 0,
@ -38,7 +39,7 @@ class DeviceButton extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 6), padding: const EdgeInsets.symmetric(horizontal: 6),
child: Text( child: Text(
_subtitle.pickDevice, context.translation.pickDevice,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
textDirection: TextDirection.rtl, textDirection: TextDirection.rtl,
@ -50,7 +51,7 @@ class DeviceButton extends StatelessWidget {
child: ListTile( child: ListTile(
contentPadding: EdgeInsets.all(0), contentPadding: EdgeInsets.all(0),
title: Text( title: Text(
"${_subtitle.sn} : " + device.serialNumber, "${context.translation.sn} : " + device.serialNumber,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
), ),
subtitle: Column( subtitle: Column(
@ -60,28 +61,28 @@ class DeviceButton extends StatelessWidget {
color: Theme.of(context).textTheme.subtitle1.color, color: Theme.of(context).textTheme.subtitle1.color,
), ),
Text( Text(
"${_subtitle.assetNumber} : ${device.number}", "${context.translation.assetNumber} : ${device.number}",
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
), ),
Divider( Divider(
color: Theme.of(context).textTheme.subtitle1.color, color: Theme.of(context).textTheme.subtitle1.color,
), ),
Text( Text(
"${_subtitle.assetName} : ${device.modelDefinition.assetName}", "${context.translation.assetName} : ${device.modelDefinition.assetName}",
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
), ),
Divider( Divider(
color: Theme.of(context).textTheme.subtitle1.color, color: Theme.of(context).textTheme.subtitle1.color,
), ),
Text( Text(
"${_subtitle.brand} : ${device.modelDefinition.manufacturerName}", "${context.translation.brand} : ${device.modelDefinition.manufacturerName}",
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
), ),
Divider( Divider(
color: Theme.of(context).textTheme.subtitle1.color, color: Theme.of(context).textTheme.subtitle1.color,
), ),
Text( Text(
"${_subtitle.model} : ${device.modelDefinition.modelName}", "${context.translation.model} : ${device.modelDefinition.modelName}",
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
), ),
], ],

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
@ -13,7 +14,7 @@ class DeviceItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Padding( return Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6), padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
child: ElevatedButton( child: ElevatedButton(
@ -28,7 +29,7 @@ class DeviceItem extends StatelessWidget {
}, },
child: ListTile( child: ListTile(
title: Text( title: Text(
"${_subtitle.assetName} : \n${device.modelDefinition.assetName}", "${context.translation.assetName} : \n${device.modelDefinition.assetName}",
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white),
), ),
subtitle: Column( subtitle: Column(
@ -38,21 +39,21 @@ class DeviceItem extends StatelessWidget {
color: Theme.of(context).scaffoldBackgroundColor, color: Theme.of(context).scaffoldBackgroundColor,
), ),
Text( Text(
"${_subtitle.assetNumber} : ${device.number}", "${context.translation.assetNumber} : ${device.number}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white), style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
), ),
Divider( Divider(
color: Theme.of(context).scaffoldBackgroundColor, color: Theme.of(context).scaffoldBackgroundColor,
), ),
Text( Text(
"${_subtitle.brand} : ${device.modelDefinition.manufacturerName}", "${context.translation.brand} : ${device.modelDefinition.manufacturerName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white), style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
), ),
Divider( Divider(
color: Theme.of(context).scaffoldBackgroundColor, color: Theme.of(context).scaffoldBackgroundColor,
), ),
Text( Text(
"${_subtitle.model} : ${device.modelDefinition.modelName}", "${context.translation.model} : ${device.modelDefinition.modelName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white), style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
), ),
], ],

@ -4,6 +4,7 @@ import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/widgets/equipment/device_item.dart'; import 'package:test_sa/views/widgets/equipment/device_item.dart';
@ -29,7 +30,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
List<Device> _searchableList = []; List<Device> _searchableList = [];
List<Device> _initList = []; List<Device> _initList = [];
bool _firstTime = true; bool _firstTime = true;
Subtitle _subtitle;
TextEditingController numberController = TextEditingController(); TextEditingController numberController = TextEditingController();
TextEditingController snController = TextEditingController(); TextEditingController snController = TextEditingController();
@ -81,7 +82,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
_searchableList.addAll(_devicesProvider.devices); _searchableList.addAll(_devicesProvider.devices);
_initList.addAll(_devicesProvider.devices); _initList.addAll(_devicesProvider.devices);
} }
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
body: SafeArea( body: SafeArea(
@ -118,7 +119,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
height: 8, height: 8,
), ),
ATextFormField( ATextFormField(
hintText: _subtitle.searchBySn, hintText: context.translation.searchBySn,
controller: snController, controller: snController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
suffixIcon: const Icon(Icons.search_rounded), suffixIcon: const Icon(Icons.search_rounded),
@ -137,7 +138,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
Expanded( Expanded(
child: _searchableList.isEmpty child: _searchableList.isEmpty
? NoItemFound( ? NoItemFound(
message: _subtitle.noDeviceFound, message: context.translation.noDeviceFound,
) )
: LazyLoading( : LazyLoading(
nextPage: _devicesProvider.nextPage, nextPage: _devicesProvider.nextPage,

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart';
import 'package:test_sa/views/app_style/colors.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/app_text_form_field.dart';
@ -29,7 +30,6 @@ class _GasRefillCreateDetailsItemState extends State<GasRefillCreateDetailsItem>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final subtitle = AppLocalization.of(context).subtitle;
final startEditing = widget.isUpdate && (widget.model.selectedForEditing ?? false); final startEditing = widget.isUpdate && (widget.model.selectedForEditing ?? false);
return Form( return Form(
key: _formKey, key: _formKey,
@ -58,7 +58,7 @@ class _GasRefillCreateDetailsItemState extends State<GasRefillCreateDetailsItem>
], ],
), ),
if (startEditing) const SizedBox(height: 16), if (startEditing) const SizedBox(height: 16),
if (startEditing) ASubTitle(subtitle.deliveredQuantity), if (startEditing) ASubTitle(context.translation.deliveredQuantity),
if (startEditing) const SizedBox(height: 4), if (startEditing) const SizedBox(height: 4),
if (startEditing) if (startEditing)
ATextFormField( ATextFormField(
@ -78,7 +78,7 @@ class _GasRefillCreateDetailsItemState extends State<GasRefillCreateDetailsItem>
if (startEditing) const SizedBox(height: 8), if (startEditing) const SizedBox(height: 8),
if (startEditing) if (startEditing)
AButton( AButton(
text: subtitle.edit, text: context.translation.edit,
onPressed: () { onPressed: () {
_formKey.currentState?.save(); _formKey.currentState?.save();
widget.onPressed(); widget.onPressed();

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.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/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
@ -15,7 +15,6 @@ class GasRefillItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; 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; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
@ -50,7 +49,7 @@ class GasRefillItem extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
subtitle.hospital, context.translation.hospital,
style: Theme.of(context).textTheme.titleSmall.copyWith( style: Theme.of(context).textTheme.titleSmall.copyWith(
color: onItemColor, color: onItemColor,
), ),
@ -69,7 +68,7 @@ class GasRefillItem extends StatelessWidget {
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text(subtitle.status, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), child: Text(context.translation.status, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)),
), ),
if (item.status?.id != null) StatusLabel(label: item.status.name, backgroundColor: AColors.getGasStatusColor(item.status.id)), if (item.status?.id != null) StatusLabel(label: item.status.name, backgroundColor: AColors.getGasStatusColor(item.status.id)),
], ],

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/subtitle.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/pages/user/gas_refill/gas_refill_details.dart';
@ -22,9 +23,8 @@ class _GasRefillListState extends State<GasRefillList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (widget.items.length == 0) { if (widget.items.length == 0) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
return NoItemFound( return NoItemFound(
message: subtitle.noServiceRequestFound, message: context.translation.noServiceRequestFound,
); );
} }
return LazyLoading( return LazyLoading(

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart';
import 'package:test_sa/models/subtitle.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/app_text_form_field.dart';
@ -17,7 +18,7 @@ class GasRefillUpdateDetailsItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -34,10 +35,10 @@ class GasRefillUpdateDetailsItem extends StatelessWidget {
? Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(subtitle.quantity), ASubTitle(context.translation.quantity),
if (validate && details.deliveredQuantity == null) if (validate && details.deliveredQuantity == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
SizedBox( SizedBox(

@ -4,6 +4,7 @@ import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.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/api/hospitals_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
@ -53,7 +54,7 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Container( return Container(
padding: EdgeInsets.symmetric(horizontal: 16), padding: EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration( decoration: BoxDecoration(
@ -72,7 +73,7 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
controller: _controller, controller: _controller,
textAlign: TextAlign.center, textAlign: TextAlign.center,
decoration: InputDecoration( decoration: InputDecoration(
hintText: _subtitle.hospital, hintText: context.translation.hospital,
border: InputBorder.none, border: InputBorder.none,
disabledBorder: InputBorder.none, disabledBorder: InputBorder.none,
focusedBorder: InputBorder.none, focusedBorder: InputBorder.none,

@ -4,6 +4,7 @@ import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.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/api/hospitals_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
@ -56,7 +57,7 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Container( return Container(
padding: EdgeInsets.symmetric(horizontal: 16), padding: EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration( decoration: BoxDecoration(
@ -76,7 +77,7 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
controller: _controller, controller: _controller,
textAlign: TextAlign.center, textAlign: TextAlign.center,
decoration: InputDecoration( decoration: InputDecoration(
hintText: _subtitle.hospital, hintText: context.translation.hospital,
border: InputBorder.none, border: InputBorder.none,
disabledBorder: InputBorder.none, disabledBorder: InputBorder.none,
focusedBorder: InputBorder.none, focusedBorder: InputBorder.none,

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
@ -14,7 +15,6 @@ class HospitalButton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return ElevatedButton( return ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
elevation: 0, elevation: 0,
@ -29,7 +29,7 @@ class HospitalButton extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8), padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text( child: Text(
hospital?.name ?? _subtitle.pickHospital, hospital?.name ?? context.translation.pickHospital,
style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 14, color: AColors.grey3A), style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 14, color: AColors.grey3A),
// textScaleFactor: AppStyle.getScaleFactor(context), // textScaleFactor: AppStyle.getScaleFactor(context),
textDirection: TextDirection.rtl, textDirection: TextDirection.rtl,

@ -3,6 +3,7 @@ import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.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/api/hospitals_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_item.dart';
@ -33,7 +34,7 @@ class _SingleHospitalPickerState extends State<SingleHospitalPicker> {
_searchableList.addAll(_hospitalsProvider.hospitals); _searchableList.addAll(_hospitalsProvider.hospitals);
_firstTime = false; _firstTime = false;
} }
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
body: LoadingManager( body: LoadingManager(
@ -54,7 +55,7 @@ class _SingleHospitalPickerState extends State<SingleHospitalPicker> {
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ATextFormField( child: ATextFormField(
hintText: _subtitle.searchByName, hintText: context.translation.searchByName,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
suffixIcon: Icon(Icons.search_rounded), suffixIcon: Icon(Icons.search_rounded),
onChange: (value) { onChange: (value) {
@ -67,7 +68,7 @@ class _SingleHospitalPickerState extends State<SingleHospitalPicker> {
Expanded( Expanded(
child: _searchableList.isEmpty child: _searchableList.isEmpty
? NoItemFound( ? NoItemFound(
message: _subtitle.noHospitalFound, message: context.translation.noHospitalFound,
) )
: ListView.builder( : ListView.builder(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,

@ -4,7 +4,8 @@ import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -22,7 +23,6 @@ class AMiniOneFilePicker extends StatefulWidget {
class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> { class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
File _file; File _file;
Subtitle _subtitle;
@override @override
void initState() { void initState() {
@ -32,7 +32,7 @@ class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -55,7 +55,7 @@ class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
children: [ children: [
const SizedBox(height: 4), const SizedBox(height: 4),
Text( Text(
_subtitle.requiredFile, context.translation.requiredFile,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: Colors.red), style: Theme.of(context).textTheme.titleLarge.copyWith(color: Colors.red),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
@ -75,12 +75,12 @@ class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
_file == null ? _subtitle.pickFile : _file.path.split("/").last, _file == null ? context.translation.pickFile : _file.path.split("/").last,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
), ),
onPressed: () async { onPressed: () async {
onFilePicker(_subtitle); onFilePicker(context.translation);
}, },
), ),
), ),
@ -88,7 +88,7 @@ class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
); );
} }
fromFilePicker(Subtitle subtitle) async { fromFilePicker(AppLocalizations subtitle) async {
FilePickerResult result = await FilePicker.platform.pickFiles( FilePickerResult result = await FilePicker.platform.pickFiles(
type: FileType.custom, type: FileType.custom,
allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'],
@ -102,7 +102,7 @@ class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
} }
} }
onFilePicker(Subtitle subtitle) async { onFilePicker(AppLocalizations subtitle) async {
ImageSource source = await showDialog( ImageSource source = await showDialog(
context: context, context: context,
builder: (dialogContext) => CupertinoAlertDialog( builder: (dialogContext) => CupertinoAlertDialog(

@ -6,11 +6,13 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_flat_button.dart'; import 'package:test_sa/views/widgets/buttons/app_flat_button.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'multi_image_picker_item.dart'; import 'multi_image_picker_item.dart';
@ -32,7 +34,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> with TickerProvider
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_size = MediaQuery.of(context).size; _size = MediaQuery.of(context).size;
Subtitle subtitle = AppLocalization.of(context).subtitle;
return (widget.enabled == false && (widget.files?.isEmpty ?? false)) return (widget.enabled == false && (widget.files?.isEmpty ?? false))
? const SizedBox() ? const SizedBox()
: Container( : Container(
@ -52,7 +54,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> with TickerProvider
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
widget.label ?? subtitle.images, widget.label ?? context.translation.images,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(
fontSize: 14, fontSize: 14,
), ),
@ -61,11 +63,11 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> with TickerProvider
), ),
if (widget.enabled) if (widget.enabled)
AFlatButton( AFlatButton(
text: subtitle.add, text: context.translation.add,
onPressed: widget.enabled onPressed: widget.enabled
? () { ? () {
// onImagePick(_subtitle); // onImagePick(_subtitle);
onFilePicker(subtitle); onFilePicker(context.translation);
} }
: null, : null,
), ),
@ -80,7 +82,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> with TickerProvider
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
subtitle.imagesRequired, context.translation.imagesRequired,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(
fontSize: 14, fontSize: 14,
color: AColors.red, color: AColors.red,
@ -112,7 +114,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> with TickerProvider
onPressed: widget.enabled onPressed: widget.enabled
? () { ? () {
// onImagePick(_subtitle); // onImagePick(_subtitle);
onFilePicker(subtitle); onFilePicker(context.translation);
} }
: null, : null,
child: Center( child: Center(
@ -150,7 +152,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> with TickerProvider
); );
} }
fromFilePicker(Subtitle subtitle) async { fromFilePicker(AppLocalizations subtitle) async {
FilePickerResult result = await FilePicker.platform.pickFiles( FilePickerResult result = await FilePicker.platform.pickFiles(
type: FileType.custom, type: FileType.custom,
allowMultiple: true, allowMultiple: true,
@ -164,7 +166,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> with TickerProvider
} }
} }
onFilePicker(Subtitle subtitle) async { onFilePicker(AppLocalizations subtitle) async {
if (widget.files.length >= 5) { if (widget.files.length >= 5) {
Fluttertoast.showToast(msg: subtitle.maxImagesNumberIs5); Fluttertoast.showToast(msg: subtitle.maxImagesNumberIs5);
return; return;

@ -4,6 +4,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -21,7 +22,6 @@ class AOneImagePicker extends StatefulWidget {
class _AOneImagePickerState extends State<AOneImagePicker> { class _AOneImagePickerState extends State<AOneImagePicker> {
File _image; File _image;
Subtitle _subtitle;
@override @override
void initState() { void initState() {
@ -31,7 +31,7 @@ class _AOneImagePickerState extends State<AOneImagePicker> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -58,7 +58,7 @@ class _AOneImagePickerState extends State<AOneImagePicker> {
height: 4, height: 4,
), ),
Text( Text(
_subtitle.requiredImage, context.translation.requiredImage,
style: Theme.of(context).textTheme.headline6.copyWith(color: Colors.red), style: Theme.of(context).textTheme.headline6.copyWith(color: Colors.red),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
@ -79,7 +79,7 @@ class _AOneImagePickerState extends State<AOneImagePicker> {
), ),
child: _image == null child: _image == null
? Text( ? Text(
_subtitle.pickImage, context.translation.pickImage,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
) )

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'app_loading.dart'; import 'app_loading.dart';
@ -45,7 +46,6 @@ class _LoadingManagerState extends State<LoadingManager> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
Widget placeHolder; Widget placeHolder;
// to load data if load not start // to load data if load not start
if (widget.isLoading != true && widget.stateCode == null) { if (widget.isLoading != true && widget.stateCode == null) {
@ -61,7 +61,7 @@ class _LoadingManagerState extends State<LoadingManager> {
} else if (widget.isFailedLoading && !widget.isNotPage) { } else if (widget.isFailedLoading && !widget.isNotPage) {
// if failed return failed widget // if failed return failed widget
placeHolder = FailedLoading( placeHolder = FailedLoading(
message: HttpStatusManger.getStatusMessage(status: widget.stateCode, subtitle: subtitle), message: HttpStatusManger.getStatusMessage(status: widget.stateCode, subtitle: context.translation),
onReload: widget.onRefresh, onReload: widget.onRefresh,
); );
} }

@ -43,7 +43,7 @@ class _AutoCompletePartsFieldState extends State<AutoCompletePartsField> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_partsProvider = Provider.of<PartsProvider>(context); _partsProvider = Provider.of<PartsProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration( decoration: BoxDecoration(

@ -17,7 +17,7 @@ class PartItem extends StatefulWidget {
class _PartItemState extends State<PartItem> { class _PartItemState extends State<PartItem> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
//final _subtitle = AppLocalization.of(context).subtitle;
return Column( return Column(
children: [ children: [
const Divider(), const Divider(),

@ -43,7 +43,7 @@ class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumber
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context); _devicesProvider = Provider.of<DevicesProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle; //
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration( decoration: BoxDecoration(

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/calibration_tools.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart';
import 'package:test_sa/views/app_style/sizing.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_button.dart';
@ -26,7 +27,7 @@ class PentryCalibrationToolForm extends StatefulWidget {
class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> { class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final subtitle = AppLocalization.of(context).subtitle;
final userProvider = Provider.of<UserProvider>(context); final userProvider = Provider.of<UserProvider>(context);
return ListView.builder( return ListView.builder(
padding: EdgeInsets.only( padding: EdgeInsets.only(
@ -35,7 +36,7 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == widget.models.length) { if (index == widget.models.length) {
return AButton( return AButton(
text: subtitle.add, text: context.translation.add,
onPressed: () { onPressed: () {
widget.models.add(CalibrationTool()); widget.models.add(CalibrationTool());
setState(() {}); setState(() {});
@ -53,7 +54,7 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
if (index != 0) if (index != 0)
ASmallButton( ASmallButton(
color: Theme.of(context).colorScheme.error, color: Theme.of(context).colorScheme.error,
text: subtitle.delete, text: context.translation.delete,
onPressed: () { onPressed: () {
widget.models.remove(model); widget.models.remove(model);
setState(() {}); setState(() {});

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/views/app_style/sizing.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/app_text_form_field.dart';
@ -34,7 +35,7 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
widget.model?.files ??= []; widget.model?.files ??= [];
final subtitle = AppLocalization.of(context).subtitle;
final userProvider = Provider.of<UserProvider>(context); final userProvider = Provider.of<UserProvider>(context);
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
@ -49,7 +50,7 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
const ASubTitle("PPM Visit Status"), const ASubTitle("PPM Visit Status"),
if (widget.enableValidate && widget.model.ppmVisitStatus == null) if (widget.enableValidate && widget.model.ppmVisitStatus == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -69,7 +70,7 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
const ASubTitle("Timer"), const ASubTitle("Timer"),
if (widget.enableValidate && widget.model?.timer?.endAt == null) if (widget.enableValidate && widget.model?.timer?.endAt == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -89,7 +90,7 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
const ASubTitle("Status"), const ASubTitle("Status"),
if (widget.enableValidate && widget.model.status == null) if (widget.enableValidate && widget.model.status == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -107,7 +108,7 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
const ASubTitle("Actual Visit Date"), const ASubTitle("Actual Visit Date"),
if (widget.enableValidate && widget.model.actualVisitDate == null) if (widget.enableValidate && widget.model.actualVisitDate == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(
@ -128,7 +129,7 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
const ASubTitle("Expected Visit Date"), const ASubTitle("Expected Visit Date"),
if (widget.enableValidate && widget.model.expectedVisitDate == null) if (widget.enableValidate && widget.model.expectedVisitDate == null)
ASubTitle( ASubTitle(
subtitle.requiredWord, context.translation.requiredWord,
color: Colors.red, color: Colors.red,
), ),
const SizedBox( const SizedBox(

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/pantry/pm_kit.dart'; import 'package:test_sa/models/pantry/pm_kit.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -26,7 +27,7 @@ class PentryPMKitForm extends StatefulWidget {
class _PentryPMKitFormState extends State<PentryPMKitForm> { class _PentryPMKitFormState extends State<PentryPMKitForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final subtitle = AppLocalization.of(context).subtitle;
return ListView.builder( return ListView.builder(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 12 * AppStyle.getScaleFactor(context), top: 12 * AppStyle.getScaleFactor(context),
@ -39,7 +40,7 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == widget.models.length) { if (index == widget.models.length) {
return AButton( return AButton(
text: subtitle.add, text: context.translation.add,
onPressed: () { onPressed: () {
widget.models.add(PMKit()); widget.models.add(PMKit());
setState(() {}); setState(() {});
@ -57,7 +58,7 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
if (index != 0) if (index != 0)
ASmallButton( ASmallButton(
color: Theme.of(context).colorScheme.error, color: Theme.of(context).colorScheme.error,
text: subtitle.delete, text: context.translation.delete,
onPressed: () { onPressed: () {
widget.models.remove(model); widget.models.remove(model);
setState(() {}); setState(() {});

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/ppm_check_list.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/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart';
@ -25,7 +26,7 @@ class PentryPPMCheckListForm extends StatefulWidget {
class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> { class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final subtitle = AppLocalization.of(context).subtitle;
return ListView.builder( return ListView.builder(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)),
@ -33,7 +34,7 @@ class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == widget.models.length) { if (index == widget.models.length) {
return AButton( return AButton(
text: subtitle.add, text: context.translation.add,
onPressed: () { onPressed: () {
widget.models.add(PPMCheckList()); widget.models.add(PPMCheckList());
setState(() {}); setState(() {});
@ -52,7 +53,7 @@ class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> {
if (index != 0) if (index != 0)
ASmallButton( ASmallButton(
color: Theme.of(context).colorScheme.error, color: Theme.of(context).colorScheme.error,
text: subtitle.delete, text: context.translation.delete,
onPressed: () { onPressed: () {
widget.models.remove(model); widget.models.remove(model);
setState(() {}); setState(() {});
@ -79,7 +80,7 @@ class _PentryPPMCheckListFormState extends State<PentryPPMCheckListForm> {
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(subtitle.status), ASubTitle(context.translation.status),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),

@ -30,7 +30,6 @@ class ServiceRequestItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
User _user = Provider.of<UserProvider>(context, listen: false).user; User _user = Provider.of<UserProvider>(context, listen: false).user;
final servicesProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); final servicesProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
final settingProvider = Provider.of<SettingProvider>(context, listen: false); final settingProvider = Provider.of<SettingProvider>(context, listen: false);
@ -66,13 +65,13 @@ class ServiceRequestItem extends StatelessWidget {
], ],
), ),
8.height, 8.height,
Text(context.translate(TranslationKeys.serviceRequest), style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), Text(context.translation.serviceRequest, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
Text( Text(
'${_subtitle.assetName}: ${request.deviceEnName}', '${context.translation.assetName}: ${request.deviceEnName}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
), ),
Text( Text(
'${_subtitle.assetNumber}: ${request.device.number}', '${context.translation.assetNumber}: ${request.device.number}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
), ),
Text( Text(

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -17,10 +18,9 @@ class ServiceRequestsList extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (requests.length == 0) { if (requests.length == 0) {
return NoItemFound( return NoItemFound(
message: _subtitle.noServiceRequestFound, message: context.translation.noServiceRequestFound,
); );
} }
return LazyLoading( return LazyLoading(

@ -7,6 +7,7 @@ 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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -30,7 +31,7 @@ class ServiceRequestsUpdateDialog extends StatefulWidget {
class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialog> with TickerProviderStateMixin { class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialog> with TickerProviderStateMixin {
DateTime _dateTime; DateTime _dateTime;
Lookup _employee; Lookup _employee;
Subtitle _subtitle;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; ServiceRequestsProvider _serviceRequestsProvider;
@ -40,7 +41,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
_update() async { _update() async {
if (_dateTime == null && _employee == null) { if (_dateTime == null && _employee == null) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.noDateFound, msg: context.translation.noDateFound,
); );
return; return;
} }
@ -49,7 +50,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
barrierDismissible: false, barrierDismissible: false,
builder: (BuildContext context) { builder: (BuildContext context) {
return CupertinoAlertDialog( return CupertinoAlertDialog(
title: Text(_subtitle.updatingDots), title: Text(context.translation.updatingDots),
content: Center(child: CircularProgressIndicator()), content: Center(child: CircularProgressIndicator()),
); );
}, },
@ -58,7 +59,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
if (status == 200) Navigator.of(context).pop(); if (status == 200) Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();
Fluttertoast.showToast( Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation),
); );
} }
@ -69,7 +70,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context, listen: false); _userProvider = Provider.of<UserProvider>(context, listen: false);
_settingProvider = Provider.of<SettingProvider>(context, listen: false); _settingProvider = Provider.of<SettingProvider>(context, listen: false);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
@ -88,13 +89,13 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
ASmallButton( ASmallButton(
text: _subtitle.cancel, text: context.translation.cancel,
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
ASmallButton( ASmallButton(
text: _subtitle.update, text: context.translation.update,
onPressed: _update, onPressed: _update,
) )
], ],
@ -106,7 +107,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
_subtitle.date, context.translation.date,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),

@ -1,7 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device_transfer_search.dart'; import 'package:test_sa/models/device/device_transfer_search.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.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_button.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
@ -39,7 +40,7 @@ class AssetTransferSearchDialogState extends State<AssetTransferSearchDialog> wi
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
return Padding( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: ClipRRect( child: ClipRRect(
@ -58,13 +59,13 @@ class AssetTransferSearchDialogState extends State<AssetTransferSearchDialog> wi
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
ASmallButton( ASmallButton(
text: subtitle.cancel, text: context.translation.cancel,
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
ASmallButton( ASmallButton(
text: subtitle.search, text: context.translation.search,
onPressed: () { onPressed: () {
if (!_formKey.currentState.validate()) { if (!_formKey.currentState.validate()) {
return; return;
@ -94,7 +95,7 @@ class AssetTransferSearchDialogState extends State<AssetTransferSearchDialog> wi
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context)), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context)),
ATextFormField( ATextFormField(
initialValue: _search.title, initialValue: _search.title,
hintText: subtitle.title, hintText: context.translation.title,
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -163,7 +164,7 @@ class AssetTransferSearchDialogState extends State<AssetTransferSearchDialog> wi
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context)), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context)),
ATextFormField( ATextFormField(
initialValue: _search.room, initialValue: _search.room,
hintText: subtitle.room, hintText: context.translation.room,
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -184,7 +185,7 @@ class AssetTransferSearchDialogState extends State<AssetTransferSearchDialog> wi
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: AButton( child: AButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
text: subtitle.clearSearch, text: context.translation.clearSearch,
onPressed: () { onPressed: () {
_search = DeviceTransferSearch(); _search = DeviceTransferSearch();
Navigator.of(context).pop(_search); Navigator.of(context).pop(_search);

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/service_request/service_request_search.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -61,7 +62,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return SizedBox( return SizedBox(
height: MediaQuery.of(context).size.height / 1.2, height: MediaQuery.of(context).size.height / 1.2,
child: Form( child: Form(
@ -76,13 +77,13 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
ASmallButton( ASmallButton(
text: _subtitle.cancel, text: context.translation.cancel,
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
ASmallButton( ASmallButton(
text: _subtitle.search, text: context.translation.search,
onPressed: () { onPressed: () {
if (!_formKey.currentState.validate()) { if (!_formKey.currentState.validate()) {
return; return;
@ -118,7 +119,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
), ),
ATextFormField( ATextFormField(
initialValue: _search.deviceNumber, initialValue: _search.deviceNumber,
hintText: _subtitle.assetNumber, hintText: context.translation.assetNumber,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -137,7 +138,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
), ),
ATextFormField( ATextFormField(
initialValue: _search.deviceSerialNumber, initialValue: _search.deviceSerialNumber,
hintText: _subtitle.serialNumber, hintText: context.translation.serialNumber,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -169,7 +170,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
), ),
ATextFormField( ATextFormField(
initialValue: _search.deviceName, initialValue: _search.deviceName,
hintText: _subtitle.deviceName, hintText: context.translation.deviceName,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -188,7 +189,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
), ),
ATextFormField( ATextFormField(
initialValue: _search.model, initialValue: _search.model,
hintText: _subtitle.model, hintText: context.translation.model,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -218,7 +219,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
SizedBox( SizedBox(
height: 16 * AppStyle.getScaleFactor(context), height: 16 * AppStyle.getScaleFactor(context),
), ),
ASubTitle(_subtitle.assignedEmployee), ASubTitle(context.translation.assignedEmployee),
const SizedBox(height: 4), const SizedBox(height: 4),
ServiceReportAllUsers( ServiceReportAllUsers(
initialValue: _search.assignedEmployee == null ? null : Engineer(id: _search.assignedEmployee.id, name: _search.assignedEmployee.name), initialValue: _search.assignedEmployee == null ? null : Engineer(id: _search.assignedEmployee.id, name: _search.assignedEmployee.name),
@ -312,7 +313,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: AButton( child: AButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
text: _subtitle.clearSearch, text: context.translation.clearSearch,
onPressed: () { onPressed: () {
_search = ServiceRequestSearch(); _search = ServiceRequestSearch();
Navigator.of(context).pop(_search); Navigator.of(context).pop(_search);

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/models/visits/visits_search.dart';
@ -57,7 +58,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
DateTime today = DateTime.now(); DateTime today = DateTime.now();
return SizedBox( return SizedBox(
height: MediaQuery.of(context).size.height / 1.3, height: MediaQuery.of(context).size.height / 1.3,
@ -72,13 +73,13 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
ASmallButton( ASmallButton(
text: _subtitle.cancel, text: context.translation.cancel,
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
ASmallButton( ASmallButton(
text: _subtitle.search, text: context.translation.search,
onPressed: () { onPressed: () {
if (!_formKey.currentState.validate()) { if (!_formKey.currentState.validate()) {
return; return;
@ -102,7 +103,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
), ),
ATextFormField( ATextFormField(
initialValue: _search.deviceNumber, initialValue: _search.deviceNumber,
hintText: _subtitle.assetNumber, hintText: context.translation.assetNumber,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -121,7 +122,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
), ),
ATextFormField( ATextFormField(
initialValue: _search.deviceName, initialValue: _search.deviceName,
hintText: _subtitle.assetName, hintText: context.translation.assetName,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -140,7 +141,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
), ),
ATextFormField( ATextFormField(
initialValue: _search.deviceSerialNumber, initialValue: _search.deviceSerialNumber,
hintText: _subtitle.serialNumber, hintText: context.translation.serialNumber,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () { onAction: () {
@ -213,7 +214,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
SizedBox( SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context), height: 8.0 * AppStyle.getScaleFactor(context),
), ),
ASubTitle(_subtitle.status), ASubTitle(context.translation.status),
SizedBox( SizedBox(
height: 4.0 * AppStyle.getScaleFactor(context), height: 4.0 * AppStyle.getScaleFactor(context),
), ),
@ -250,7 +251,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
SizedBox( SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context), height: 8.0 * AppStyle.getScaleFactor(context),
), ),
ASubTitle(_subtitle.contactStatus), ASubTitle(context.translation.contactStatus),
SizedBox( SizedBox(
height: 4.0 * AppStyle.getScaleFactor(context), height: 4.0 * AppStyle.getScaleFactor(context),
), ),
@ -287,7 +288,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
SizedBox( SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context), height: 8.0 * AppStyle.getScaleFactor(context),
), ),
ASubTitle(_subtitle.actualDate), ASubTitle(context.translation.actualDate),
SizedBox( SizedBox(
height: 4.0 * AppStyle.getScaleFactor(context), height: 4.0 * AppStyle.getScaleFactor(context),
), ),
@ -304,7 +305,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
SizedBox( SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context), height: 8.0 * AppStyle.getScaleFactor(context),
), ),
ASubTitle(_subtitle.expectDate), ASubTitle(context.translation.expectDate),
SizedBox( SizedBox(
height: 4.0 * AppStyle.getScaleFactor(context), height: 4.0 * AppStyle.getScaleFactor(context),
), ),
@ -324,7 +325,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: AButton( child: AButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
text: _subtitle.clearSearch, text: context.translation.clearSearch,
onPressed: () { onPressed: () {
_search = VisitsSearch(); _search = VisitsSearch();
Navigator.of(context).pop(_search); Navigator.of(context).pop(_search);

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.dart';
@ -24,7 +25,7 @@ class VisitItem extends StatelessWidget {
UserProvider userProvider = Provider.of<UserProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; 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; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
Subtitle subtitle = AppLocalization.of(context).subtitle;
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 4),
child: ElevatedButton( child: ElevatedButton(
@ -138,11 +139,11 @@ class VisitItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
subtitle.expectDate, context.translation.expectDate,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
), ),
Text( Text(
visit.expectDate ?? subtitle.noDateFound, visit.expectDate ?? context.translation.noDateFound,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
), ),
], ],
@ -152,11 +153,11 @@ class VisitItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
subtitle.actualDate, context.translation.actualDate,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
), ),
Text( Text(
visit.actualDate ?? subtitle.noDateFound, visit.actualDate ?? context.translation.noDateFound,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
), ),
], ],

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -31,10 +32,9 @@ class _VisitsListState extends State<VisitsList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
if (widget.visits.isEmpty) { if (widget.visits.isEmpty) {
return NoItemFound( return NoItemFound(
message: subtitle.noVisitsFound, message: context.translation.noVisitsFound,
); );
} }
return Stack( return Stack(

@ -92,6 +92,7 @@ flutter:
# The following line ensures that the Material Icons font is # The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in # included with your application, so that you can use the icons in
# the material Icons class. # the material Icons class.
generate: true
uses-material-design: true uses-material-design: true
assets: assets:
- assets/ - assets/

Loading…
Cancel
Save