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

@ -1,44 +1,44 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:test_sa/models/subtitle.dart';
class AppLocalization {
AppLocalization(this.locale);
final Locale locale;
static AppLocalization of(BuildContext context) {
return Localizations.of<AppLocalization>(context, AppLocalization);
}
Subtitle _subtitle;
Subtitle get subtitle => _subtitle;
Future<void> load() async {
String jsonStringValues = await rootBundle.loadString('assets/subtitles/${locale.languageCode}_subtitle.json');
_subtitle = Subtitle.fromJson(json.decode(jsonStringValues));
}
// static member to have simple access to the delegate from Material App
static const LocalizationsDelegate<AppLocalization> delegate = _DemoLocalizationsDelegate();
}
class _DemoLocalizationsDelegate extends LocalizationsDelegate<AppLocalization> {
const _DemoLocalizationsDelegate();
@override
bool isSupported(Locale locale) {
return ['en', 'ar'].contains(locale.languageCode);
}
@override
Future<AppLocalization> load(Locale locale) async {
AppLocalization localization = new AppLocalization(locale);
await localization.load();
return localization;
}
@override
bool shouldReload(LocalizationsDelegate<AppLocalization> old) => false;
}
// import 'dart:convert';
//
// import 'package:flutter/material.dart';
// import 'package:flutter/services.dart';
// import 'package:flutter_gen/gen_l10n/app_localizations.dart';
//
// class AppLocalization {
// AppLocalization(this.locale);
//
// final Locale locale;
// static AppLocalization of(BuildContext context) {
// return Localizations.of<AppLocalization>(context, AppLocalization);
// }
//
// AppLocalizations _subtitle;
// Subtitle get subtitle => _subtitle;
//
// Future<void> load() async {
// String jsonStringValues = await rootBundle.loadString('assets/subtitles/${locale.languageCode}_subtitle.json');
// _subtitle = Subtitle.fromJson(json.decode(jsonStringValues));
// }
//
// // static member to have simple access to the delegate from Material App
// static const LocalizationsDelegate<AppLocalization> delegate = _DemoLocalizationsDelegate();
// }
//
// class _DemoLocalizationsDelegate extends LocalizationsDelegate<AppLocalization> {
// const _DemoLocalizationsDelegate();
//
// @override
// bool isSupported(Locale locale) {
// return ['en', 'ar'].contains(locale.languageCode);
// }
//
// @override
// Future<AppLocalization> load(Locale locale) async {
// AppLocalization localization = new AppLocalization(locale);
// await localization.load();
// return localization;
// }
//
// @override
// 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_request/service_request.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 '../../../models/service_request/search_work_order.dart';
@ -100,7 +100,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
@required String requestId,
@required String host,
@required User user,
@required Subtitle subtitle,
@required AppLocalizations subtitle,
}) async {
String userData = '';
if (user != null) {
@ -598,7 +598,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
@required int reportId,
@required String host,
@required User user,
@required Subtitle subtitle,
@required AppLocalizations subtitle,
}) async {
Response response;
try {

@ -1,15 +1,14 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:localization/localization.dart';
import 'package:provider/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 {
String translate(TranslationKeys translationKey) {
return translationKey.name.i18n([Localizations.localeOf(this).toString()]);
}
AppLocalizations get translation => AppLocalizations.of(this);
List<String> get getIssues => [translation.reason1, translation.reason2, translation.reason3, translation.reason4, translation.reason5];
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 'new_views/pages/new_gas_refill_request_page.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
if (Platform.isIOS) {
@ -119,8 +121,6 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => CylinderSizeProvider()),
ChangeNotifierProvider(create: (_) => DepartmentProvider()),
ChangeNotifierProvider(create: (_) => SiteProvider()),
ChangeNotifierProvider(create: (_) => HospitalsProvider()),
ChangeNotifierProvider(create: (_) => DevicesProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestsProvider()),
@ -159,11 +159,6 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportAssistantsEmployeeProvider()),
],
child: GestureDetector(
onTap: () {
@ -176,14 +171,8 @@ class MyApp extends StatelessWidget {
title: 'ATOMS',
debugShowCheckedModeBanner: false,
theme: settingProvider.theme == "dark" ? AppThemes.darkTheme : AppThemes.lightTheme,
localizationsDelegates: [
LocalJsonLocalization.delegate,
AppLocalization.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [Locale('en'), Locale('ar')],
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
locale: Locale(settingProvider.language ?? 'en'),
initialRoute: SplashPage.routeName,
routes: {
@ -194,7 +183,6 @@ class MyApp extends StatelessWidget {
NewServiceRequestPage.routeName: (_) => const NewServiceRequestPage(),
NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(),
NewTransferRequestPage.routeName: (_) => const NewTransferRequestPage(),
ReportIssuesPage.id: (_) => const ReportIssuesPage(),
RequestGasRefill.id: (_) => const RequestGasRefill(),
CreateRequestPage.id: (_) => const CreateRequestPage(),

@ -59,6 +59,7 @@ class GasRefillModel {
});
}
}
num id;
String gazRefillNo;
String expectedDate;
@ -77,6 +78,7 @@ class GasRefillModel {
AssignedEmployee assignedEmployee;
Lookup status;
List<GasRefillDetails> gazRefillDetails;
GasRefillModel copyWith({
num id,
String gazRefillNo,
@ -117,6 +119,7 @@ class GasRefillModel {
status: status ?? this.status,
gazRefillDetails: gazRefillDetails ?? this.gazRefillDetails,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
@ -156,16 +159,16 @@ class GasRefillModel {
Future<bool> validate(BuildContext context) async {
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;
} 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;
} 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;
} 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 true;
@ -190,12 +193,14 @@ class GasRefillDetails {
requestedQty = json['requestedQty'];
deliverdQty = json['deliverdQty'];
}
num id;
Lookup gasType;
Lookup cylinderType;
Lookup cylinderSize;
num requestedQty;
num deliverdQty;
GasRefillDetails copyWith({
num id,
Lookup gasType,
@ -212,6 +217,7 @@ class GasRefillDetails {
requestedQty: requestedQty ?? this.requestedQty,
deliverdQty: deliverdQty ?? this.deliverdQty,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
@ -231,13 +237,13 @@ class GasRefillDetails {
Future<bool> validate(BuildContext context) async {
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;
} 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;
} 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 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 {
final Function(int index) onPressed;
final int selectedIndex;
const AppBottomNavigationBar({
Key key,
@required this.onPressed,
@ -25,10 +26,10 @@ class AppBottomNavigationBar extends StatelessWidget {
),
child: BottomNavigationBar(
items: <BottomNavigationBarItem>[
navBarItem(context, index: 0, iconName: "overview", label: TranslationKeys.overview),
navBarItem(context, index: 1, iconName: "requests", label: TranslationKeys.myRequests),
navBarItem(context, index: 2, iconName: "assets", label: TranslationKeys.myAssets),
navBarItem(context, index: 3, iconName: "message", label: TranslationKeys.contactUs),
navBarItem(context, index: 0, iconName: "overview", label: context.translation.overview),
navBarItem(context, index: 1, iconName: "requests", label: context.translation.myRequests),
navBarItem(context, index: 2, iconName: "assets", label: context.translation.myAssets),
navBarItem(context, index: 3, iconName: "message", label: context.translation.contactUs),
],
currentIndex: selectedIndex,
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(
icon: Padding(
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,
),
),
label: context.translate(label),
label: label,
);
}
}

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

@ -8,7 +8,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
class AppFilledButton extends StatelessWidget {
final VoidCallback onPressed;
final TranslationKeys label;
final String label;
final bool maxWidth;
final Color buttonColor;
final Color textColor;
@ -32,7 +32,7 @@ class AppFilledButton extends StatelessWidget {
borderRadius: BorderRadius.circular(10),
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);
}
}

@ -51,11 +51,11 @@ class _AppFloatingActionButtonState extends State<AppFloatingActionButton> {
child: Column(
mainAxisSize: MainAxisSize.min,
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 _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 _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),
),
@ -79,7 +79,7 @@ class _AppFloatingActionButtonState extends State<AppFloatingActionButton> {
class _FloatingButtonListTile extends StatelessWidget {
final String iconName, routeName;
final TranslationKeys label;
final String label;
const _FloatingButtonListTile({
@required this.iconName,
@ -102,7 +102,7 @@ class _FloatingButtonListTile extends StatelessWidget {
color: context.isDark ? AppColor.primary40 : AppColor.primary70,
),
title: Text(
context.translate(label),
label,
style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w500),
),
),

@ -70,11 +70,11 @@ class _AppLoadingManagerState extends State<AppLoadingManager> {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(context.translate(TranslationKeys.httpError), style: Theme.of(context).textTheme.titleMedium),
Text(context.translation.httpError, style: Theme.of(context).textTheme.titleMedium),
4.height,
OutlinedButton(
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 bool obscureText;
final VoidCallback showPassword;
final TranslationKeys hintText;
final TranslationKeys labelText;
final String hintText;
final String labelText;
final TextInputType textInputType;
final String initialValue;
final TextStyle style;
@ -96,8 +96,8 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
fillColor: context.isDark ? AppColor.neutral50 : Colors.white,
errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20),
hintText: widget.hintText != null ? context.translate(widget.hintText) : null,
labelText: widget.labelText != null ? context.translate(widget.labelText) : null,
hintText: widget.hintText ?? "",
labelText: widget.labelText ?? "",
suffixIcon: widget.prefixIconData == null
? null
: Icon(

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

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

@ -34,20 +34,20 @@ class ContactUsBottomSheet extends StatelessWidget {
child: Padding(
padding: EdgeInsets.symmetric(vertical: 16.toScreenHeight),
child: Text(
context.translate(TranslationKeys.contactUs),
context.translation.contactUs,
style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w600),
),
),
),
Row(
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,
Expanded(
child: _ContactCard(
iconName: "whatsapp",
title: context.translate(TranslationKeys.liveChat),
subtitle: context.translate(TranslationKeys.openWhatsapp),
title: context.translation.liveChat,
subtitle: context.translation.openWhatsapp,
),
),
],

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

@ -49,13 +49,13 @@ class _LoginPageState extends State<LoginPage> {
children: [
Hero(tag: "logo", child: "logo".toSvgAsset(height: 64)),
64.height,
context.translate(TranslationKeys.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.login.heading2(context).custom(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.primary50 : AppColor.neutral50),
context.translation.enterCredsToLogin.heading6(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
32.height,
AppTextFormField(
initialValue: _user?.userName,
validator: (value) => Validator.hasValue(value) ? null : context.translate(TranslationKeys.requiredField),
labelText: TranslationKeys.username,
validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField,
labelText: context.translation.username,
textInputType: TextInputType.name,
onSaved: (value) {
_user.userName = value;
@ -64,13 +64,13 @@ class _LoginPageState extends State<LoginPage> {
16.height,
AppTextFormField(
initialValue: _user?.password,
labelText: TranslationKeys.password,
labelText: context.translation.password,
obscureText: true,
validator: (value) => Validator.isValidPassword(value)
? null
: value.isEmpty
? context.translate(TranslationKeys.requiredField)
: context.translate(TranslationKeys.passwordLengthMessage),
? context.translation.requiredField
: context.translation.passwordLengthMessage,
onSaved: (value) {
_user.password = value;
},
@ -82,13 +82,13 @@ class _LoginPageState extends State<LoginPage> {
onTap: () {
/// 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,
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),
),

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

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

@ -1,10 +1,9 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.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/sizing.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;
UserProvider _userProvider;
bool _isLoading = false;
Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -57,7 +55,6 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
if (snapshot.connectionState == ConnectionState.waiting) {
return const ALoading();
} else {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context);
_isSender = _userProvider.user.userID == _model.sender?.userId;
_isReceiver = _userProvider.user.userID == _model.receiver?.userId;
@ -79,7 +76,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
Expanded(
child: Center(
child: Text(
_subtitle.details,
context.translation.details,
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(),
),
RequestInfoRow(
title: _subtitle.assetName,
title: context.translation.assetName,
info: _model.device.assetName,
),
RequestInfoRow(
title: _subtitle.assetSN,
title: context.translation.assetSN,
info: _model.device.serialNumber,
),
RequestInfoRow(
title: _subtitle.assetNumber,
title: context.translation.assetNumber,
info: _model.device.number,
),
RequestInfoRow(
title: _subtitle.destinationSite,
title: context.translation.destinationSite,
info: _model.device.destSiteName,
),
RequestInfoRow(
title: _subtitle.building,
title: context.translation.building,
info: _model.device.destBuildingName,
),
RequestInfoRow(
title: _subtitle.floor,
title: context.translation.floor,
info: _model.device.destFloor,
),
RequestInfoRow(
title: _subtitle.department,
title: context.translation.department,
info: _model.device.destDepartmentName,
),
RequestInfoRow(
title: _subtitle.room,
title: context.translation.room,
info: _model.device.destRoom,
),
RequestInfoRow(
title: _subtitle.actions,
title: context.translation.actions,
info: "",
),
const SizedBox(height: 8),
@ -142,7 +139,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
),
if (_userProvider.user?.type == UsersTypes.engineer)
ASmallButton(
text: _subtitle.edit,
text: context.translation.edit,
onPressed: (_isSender)
? (_model.sender.status?.name == "Closed"
? null
@ -170,7 +167,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
),
if (_userProvider.user?.type == UsersTypes.engineer)
ASmallButton(
text: _subtitle.edit,
text: context.translation.edit,
onPressed: (_isReceiver)
? (_model.receiver.status?.name == "Closed"
? 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/user_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/models/department.dart';
import 'package:test_sa/models/device/device_transfer.dart';
@ -35,7 +36,6 @@ class RequestDeviceTransfer extends StatefulWidget {
class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
bool _isLoading = false;
bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider;
SettingProvider _settingProvider;
DeviceTransferProvider _deviceTransferProvider;
@ -95,7 +95,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
@ -141,7 +140,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
const ASubTitle("Asset"),
if (_validate && _formModel.device == null)
ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
6.height,
@ -276,7 +275,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
),
12.height,
AButton(
text: _subtitle.submit,
text: context.translation.submit,
onPressed: _onSubmit,
),
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/user_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_info.dart';
import 'package:test_sa/models/subtitle.dart';
@ -35,7 +36,6 @@ class UpdateDeviceTransfer extends StatefulWidget {
class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
bool _isLoading = false;
bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider;
SettingProvider _settingProvider;
Uint8List _signature;
@ -68,9 +68,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
);
Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
_validate = false;
Navigator.of(context).pop();
}
@ -95,7 +93,6 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
@ -143,7 +140,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.travelingHours),
ASubTitle(context.translation.travelingHours),
const SizedBox(
height: 4,
),
@ -159,7 +156,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
const SizedBox(
height: 16,
),
ASubTitle(_subtitle.workingHours),
ASubTitle(context.translation.workingHours),
const SizedBox(height: 8),
Row(
children: [
@ -176,7 +173,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
],
),
const SizedBox(height: 16),
ASubTitle(_subtitle.status),
ASubTitle(context.translation.status),
const SizedBox(
height: 4,
),
@ -217,7 +214,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
Padding(
padding: const EdgeInsets.all(16.0),
child: AButton(
text: _subtitle.update,
text: context.translation.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/settings/setting_provider.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/user.dart';
import 'package:test_sa/views/app_style/sizing.dart';
@ -39,7 +40,7 @@ class _LoginState extends State<Login> {
_settingProvider = Provider.of<SettingProvider>(context);
_height = MediaQuery.of(context).size.height;
_width = MediaQuery.of(context).size.width;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
key: _scaffoldKey,
body: SafeArea(
@ -75,11 +76,11 @@ class _LoginState extends State<Login> {
),
ATextFormField(
initialValue: _user?.userName,
hintText: _subtitle.name,
hintText: context.translation.name,
textAlign: TextAlign.left,
style: Theme.of(context).textTheme.bodyText1,
prefixIconData: Icons.account_circle,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage,
validator: (value) => Validator.hasValue(value) ? null : context.translation.nameValidateMessage,
textInputType: TextInputType.name,
onSaved: (value) {
_user.userName = value;
@ -88,12 +89,12 @@ class _LoginState extends State<Login> {
SizedBox(height: 12),
ATextFormField(
initialValue: _user?.password,
hintText: _subtitle.password,
hintText: context.translation.password,
obscureText: _obscurePassword,
style: Theme.of(context).textTheme.bodyText1,
prefixIconData: Icons.vpn_key_sharp,
textAlign: TextAlign.left,
validator: (value) => Validator.isValidPassword(value) ? null : _subtitle.passwordValidateMessage,
validator: (value) => Validator.isValidPassword(value) ? null : context.translation.passwordValidateMessage,
showPassword: () {
_obscurePassword = !_obscurePassword;
setState(() {});
@ -106,7 +107,7 @@ class _LoginState extends State<Login> {
height: 32 * AppStyle.getScaleFactor(context),
),
AButton(
text: _subtitle.signIn,
text: context.translation.signIn,
onPressed: () async {
if (!_formKey.currentState.validate()) return;
_formKey.currentState.save();
@ -124,12 +125,12 @@ class _LoginState extends State<Login> {
// if (_userProvider.user.isActive)
// else
// Fluttertoast.showToast(msg: _subtitle.activationAlert);
// Fluttertoast.showToast(msg: context.translation.activationAlert);
} else {
if (status >= 400 && status < 500) return;
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(
content: Text(errorMessage),
));
@ -140,7 +141,7 @@ class _LoginState extends State<Login> {
// height: 140 * AppStyle.getScaleFactor(context),
// ),
// AOutLinedButton(
// text: _subtitle.signUp,
// text: context.translation.signUp,
// //color: AColors.cyan,
// onPressed: () {
// 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/settings/setting_provider.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/subtitle.dart';
import 'package:test_sa/models/user.dart';
@ -38,7 +39,7 @@ class _RegisterState extends State<Register> {
_settingProvider = Provider.of<SettingProvider>(context);
_width = MediaQuery.of(context).size.width;
_height = MediaQuery.of(context).size.height;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
key: _scaffoldKey,
body: LoadingManager(
@ -68,10 +69,10 @@ class _RegisterState extends State<Register> {
),
ATextFormField(
initialValue: _user.userName,
hintText: _subtitle.name,
hintText: context.translation.name,
prefixIconData: Icons.account_circle,
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) {
_user.userName = value;
},
@ -79,11 +80,11 @@ class _RegisterState extends State<Register> {
const SizedBox(height: 12),
ATextFormField(
initialValue: _user.email,
hintText: _subtitle.email,
hintText: context.translation.email,
prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage,
validator: (value) => Validator.isEmail(value) ? null : context.translation.emailValidateMessage,
onSaved: (value) {
_user.email = value;
},
@ -91,11 +92,11 @@ class _RegisterState extends State<Register> {
const SizedBox(height: 12),
ATextFormField(
initialValue: _user.password,
hintText: _subtitle.password,
hintText: context.translation.password,
prefixIconData: Icons.vpn_key_sharp,
style: Theme.of(context).textTheme.headline6,
obscureText: _obscurePassword,
validator: (value) => Validator.isValidPassword(value) ? null : _subtitle.passwordValidateMessage,
validator: (value) => Validator.isValidPassword(value) ? null : context.translation.passwordValidateMessage,
showPassword: () {
_obscurePassword = !_obscurePassword;
setState(() {});
@ -111,10 +112,10 @@ class _RegisterState extends State<Register> {
ATextFormField(
initialValue: _user.password,
prefixIconData: Icons.vpn_key_sharp,
hintText: _subtitle.confirmPassword,
hintText: context.translation.confirmPassword,
style: Theme.of(context).textTheme.headline6,
obscureText: _obscurePassword,
validator: (value) => _user.password == value ? null : _subtitle.confirmPasswordValidateMessage,
validator: (value) => _user.password == value ? null : context.translation.confirmPasswordValidateMessage,
showPassword: () {
_obscurePassword = !_obscurePassword;
setState(() {});
@ -141,10 +142,10 @@ class _RegisterState extends State<Register> {
const SizedBox(height: 12),
ATextFormField(
initialValue: _user.phoneNumber,
hintText: _subtitle.phoneNumber,
hintText: context.translation.phoneNumber,
style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
validator: (value) => Validator.isPhoneNumber(value) ? null : context.translation.phoneNumberValidateMessage,
textInputType: TextInputType.phone,
onSaved: (value) {
_user.phoneNumber = value;
@ -153,11 +154,11 @@ class _RegisterState extends State<Register> {
SizedBox(height: 8),
// ATextFormField(
// initialValue: _user.whatsApp,
// hintText: _subtitle.whatsApp,
// hintText: context.translation.whatsApp,
// style: Theme.of(context).textTheme.headline6,
// prefixIconData: FontAwesomeIcons.whatsapp,
// prefixIconSize: 36,
// validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
// validator: (value) => Validator.isPhoneNumber(value) ? null : context.translation.phoneNumberValidateMessage,
// textInputType: TextInputType.phone,
// onSaved: (value) {
// _user.whatsApp = value;
@ -165,19 +166,19 @@ class _RegisterState extends State<Register> {
// ),
const SizedBox(height: 12),
AButton(
text: _subtitle.signUp,
text: context.translation.signUp,
onPressed: () async {
if (!_formKey.currentState.validate()) return;
_formKey.currentState.save();
if (_user.clientId == null) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.hospitalRequired),
content: Text(context.translation.hospitalRequired),
));
return;
}
if (_user.departmentId == null) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.unitRequired),
content: Text(context.translation.uniteRequired),
));
return;
}
@ -186,14 +187,14 @@ class _RegisterState extends State<Register> {
host: _settingProvider.host,
);
if (status >= 200 && status < 300) {
Fluttertoast.showToast(msg: _subtitle.activationAlert);
Fluttertoast.showToast(msg: context.translation.activationAlert);
Navigator.of(context).pop();
} else {
String errorMessage = status == 402
? _subtitle.nameExist
? context.translation.nameExist
: status == 401
? _subtitle.emailExist
: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
? context.translation.emailExist
: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));

@ -7,6 +7,7 @@ import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/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/extensions/context_extension.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/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/localization/localization.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/buttons/app_back_button.dart';
import '../../widgets/buttons/app_button.dart';
@ -99,7 +99,6 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
if (_callRequestForWorkOrder == null) {
getAssetType();
}
final Subtitle subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
body: SafeArea(
@ -148,7 +147,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
const ASubTitle("Equipment status"),
if (_validate && _subWorkOrders?.equipmentStatus == null)
ASubTitle(
subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
@ -171,7 +170,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
const ASubTitle("Return to Service"),
// if (_validate && _subWorkOrders.visitDate == null)
// ASubTitle(
// subtitle.requiredWord,
// context.translation.requiredWord,
// color: Colors.red,
// ),
const SizedBox(
@ -197,10 +196,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle("Failure ${subtitle.reasons}"),
ASubTitle("Failure ${context.translation.reasons}"),
if (_validate && _subWorkOrders.reason == null)
ASubTitle(
subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
@ -220,10 +219,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(subtitle.faultDescription),
ASubTitle(context.translation.faultDescription),
if (_validate && _subWorkOrders.faultDescription == null)
ASubTitle(
subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
@ -326,7 +325,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Padding(
padding: const EdgeInsets.all(16.0),
child: AButton(
text: subtitle.create,
text: context.translation.create,
onPressed: () async {
_validate = true;
setState(() {});
@ -343,7 +342,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Fluttertoast.showToast(msg: "Working hours required");
return;
} else if (_subWorkOrders.calllastSituation == null) {
Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required");
Fluttertoast.showToast(msg: "${context.translation.callLastSituation} required");
return;
}
_validate = false;
@ -361,11 +360,11 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully);
Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
Navigator.of(context).pop();
Navigator.of(context).pop();
} 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),
));

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/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/lookup.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> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final SearchWorkOrder _searchWorkOrders = SearchWorkOrder();
Subtitle _subtitle;
bool _isLoading = false;
String _callerId = "", _site = "";
Lookup _dateOperator;
@ -48,7 +49,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
body: SafeArea(
child: SingleChildScrollView(
@ -110,7 +111,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
},
),
const SizedBox(height: 16),
ASubTitle(_subtitle.assignedEmployee),
ASubTitle(context.translation.assignedEmployee),
const SizedBox(height: 4),
ServiceReportAllUsers(
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),
ASubTitle(_subtitle.visitDate),
ASubTitle(context.translation.visitDate),
const SizedBox(height: 4),
ServiceReportVisitDateOperator(
initialValue: _dateOperator,
@ -179,7 +180,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: AButton(
text: _subtitle.search,
text: context.translation.search,
onPressed: () async {
_isLoading = true;
setState(() {});
@ -213,7 +214,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
),
);
} 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)));
}
},

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

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

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/lookup.dart';
import '../../../controllers/localization/localization.dart';
@ -12,11 +13,10 @@ class WorkOrderDetails extends StatelessWidget {
Lookup assetType;
WorkOrderDetails({@required this.item, this.assetType, Key key}) : super(key: key);
Subtitle _subtitle;
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Column(
children: [
Container(
@ -33,15 +33,15 @@ class WorkOrderDetails extends StatelessWidget {
),
child: Column(
children: [
_buildRow(_subtitle.callId, item.callRequest?.id?.toString() ?? "", context),
_buildRow(_subtitle.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context),
_buildRow(context.translation.callId, item.callRequest?.id?.toString() ?? "", context),
_buildRow(context.translation.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context),
_buildRow("WO No", item.workOrderNo, context),
_buildRow(_subtitle.assetName, item.callRequest?.asset?.assetNumber ?? '', context),
_buildRow(_subtitle.department, item.callRequest?.asset?.department ?? '', context),
_buildRow(_subtitle.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context),
_buildRow(_subtitle.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", context),
_buildRow(context.translation.assetName, item.callRequest?.asset?.assetNumber ?? '', context),
_buildRow(context.translation.department, item.callRequest?.asset?.department ?? '', context),
_buildRow(context.translation.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context),
_buildRow(context.translation.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", 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:fluttertoast/fluttertoast.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/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart';
@ -18,7 +19,6 @@ class WorkOrderItem extends StatelessWidget {
@override
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 onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
@ -133,7 +133,7 @@ class WorkOrderItem extends StatelessWidget {
children: [
Expanded(
child: Text(
_subtitle.status,
context.translation.status,
style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor,
),

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

@ -19,12 +19,11 @@ class WorkOrderUpdate extends StatefulWidget {
class _WorkOrderUpdateState extends State<WorkOrderUpdate> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Subtitle _subtitle;
bool _isLoading = false;
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
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/user_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/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart';
@ -41,7 +42,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
SettingProvider _settingProvider;
GasRefillProvider _gasRefillProvider;
bool _isLoading = false;
Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -60,13 +61,13 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: context.translation.successfulRequestMessage,
);
_enableEdit = false;
_validate = false;
//Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
@ -81,7 +82,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_gasRefillProvider = Provider.of<GasRefillProvider>(context);
@ -159,7 +160,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
info: _model.title,
),
RequestInfoRow(
title: _subtitle.hospital,
title: context.translation.hospital,
info: _model.clientName,
),
RequestInfoRow(
@ -175,11 +176,11 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
info: _model.department?.departmentName,
),
RequestInfoRow(
title: _subtitle.startDate,
title: context.translation.startDate,
info: _model.startDate == null ? null : "${DateFormat.yMd().format(_model.startDate)} ${DateFormat.Hms().format(_model.startDate)}",
),
RequestInfoRow(
title: _subtitle.endDate,
title: context.translation.endDate,
info: _model.endDate == null ? null : "${DateFormat.yMd().format(_model.endDate)} ${DateFormat.Hms().format(_model.endDate)}",
),
_enableEdit
@ -189,10 +190,10 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.status),
ASubTitle(context.translation.status),
if (_validate && _model.status == null)
ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
@ -210,7 +211,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
children: [
Expanded(
child: Text(
"${_subtitle.status} : ",
"${context.translation.status} : ",
style: Theme.of(context).textTheme.subtitle2,
textScaleFactor: AppStyle.getScaleFactor(context),
),
@ -244,7 +245,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
height: 16,
),
AButton(
text: _subtitle.update,
text: context.translation.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/settings/setting_provider.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_model.dart';
import 'package:test_sa/models/lookup.dart';
@ -46,7 +47,7 @@ class RequestGasRefill extends StatefulWidget {
class _RequestGasRefillState extends State<RequestGasRefill> {
bool _isLoading = false;
bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider;
SettingProvider _settingProvider;
GasRefillProvider _gasRefillProvider;
@ -108,12 +109,12 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: context.translation.successfulRequestMessage,
);
Navigator.of(context).pop(_formModel);
setState(() {});
} else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
@ -151,7 +152,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
if (_gasRefillProvider == null) {
@ -204,9 +205,9 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
),
),
// const SizedBox(height: 4,),
// ASubTitle(_subtitle.title),
// ASubTitle(context.translation.title),
// if(_validate && _formModel.title == null)
// ASubTitle(_subtitle.requiredWord,color: Colors.red,),
// ASubTitle(context.translation.requiredWord,color: Colors.red,),
// SizedBox(height: 4,),
// ATextFormField(
// initialValue: _formModel?.title,
@ -218,10 +219,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// },
// ),
// const SizedBox(height: 8,),
ASubTitle(_subtitle.status),
ASubTitle(context.translation.status),
if (_validate && _formModel.status == null)
ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
@ -293,7 +294,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
},
),
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)
Row(
@ -382,7 +383,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// ],
// ),
// const SizedBox(height: 8),
// ASubTitle(_subtitle.workingHours),
// ASubTitle(context.translation.workingHours),
// const SizedBox(height: 4),
// ATextFormField(
// initialValue: null,
@ -392,7 +393,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
// enable: false,
// 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,
// onSaved: (value) {
// // _serviceReport.workHours = value;
@ -408,7 +409,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
Divider(color: Theme.of(context).colorScheme.primary),
const SizedBox(height: 4),
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),
GasTypeMenu(
initialValue: _currentDetails.type,
@ -420,7 +421,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
const ASubTitle("Cylinder Size"),
if (_validate && _currentDetails.cylinderSize == null)
ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
@ -438,7 +439,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
const ASubTitle("Cylinder Type"),
if (_validate && _currentDetails.cylinderSize == null)
ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
const SizedBox(
@ -453,10 +454,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.requestedQuantity),
ASubTitle(context.translation.requestedQuantity),
if (_validate && _currentDetails?.requestedQuantity == null)
ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
SizedBox(
@ -474,10 +475,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
},
),
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)
ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
),
if (widget.gasRefillModel != null) const SizedBox(height: 4),
@ -495,7 +496,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
),
const SizedBox(height: 16),
AButton(
text: _subtitle.add,
text: context.translation.add,
onPressed: _addNewModel,
),
],
@ -556,7 +557,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
),
const SizedBox(height: 16),
AButton(
text: widget.gasRefillModel == null ? _subtitle.submit : _subtitle.update,
text: widget.gasRefillModel == null ? context.translation.submit : context.translation.update,
onPressed: _onSubmit,
),
const SizedBox(height: 100)

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

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

@ -1,5 +1,6 @@
import 'package:flutter/material.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/subtitle.dart';
import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart';
@ -16,10 +17,10 @@ class NotificationsList extends StatelessWidget {
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (notifications.length == 0) {
return NoItemFound(
message: _subtitle.notificationsNotFound,
message: context.translation.notificationsNotFound,
);
}
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/user_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/views/app_style/colors.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;
UserProvider _userProvider;
SettingProvider _settingProvider;
Subtitle _subtitle;
@override
Widget build(BuildContext context) {
_notificationsProvider = Provider.of<NotificationsProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
body: SafeArea(
child: LoadingManager(
@ -58,7 +58,7 @@ class _NotificationsPageState extends State<NotificationsPage> with TickerProvid
Expanded(
child: Center(
child: Text(
_subtitle.notifications,
context.translation.notifications,
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/settings/setting_provider.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/subtitle.dart';
import 'package:test_sa/models/user.dart';
@ -38,7 +39,7 @@ class _ProfilePageState extends State<ProfilePage> {
_settingProvider = Provider.of<SettingProvider>(context);
_width = MediaQuery.of(context).size.width;
_height = MediaQuery.of(context).size.height;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (_firstTime) {
_user = User.fromJson(_userProvider.user.toJson());
_firstTime = false;
@ -78,11 +79,11 @@ class _ProfilePageState extends State<ProfilePage> {
children: [
ATextFormField(
initialValue: _user.userName,
hintText: _subtitle.name,
hintText: context.translation.name,
enable: false,
prefixIconData: Icons.account_circle,
style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage,
validator: (value) => Validator.hasValue(value) ? null : context.translation.nameValidateMessage,
onSaved: (value) {
_user.userName = value;
},
@ -92,12 +93,12 @@ class _ProfilePageState extends State<ProfilePage> {
),
ATextFormField(
initialValue: _user.email,
hintText: _subtitle.email,
hintText: context.translation.email,
enable: false,
prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage,
validator: (value) => Validator.isEmail(value) ? null : context.translation.emailValidateMessage,
onSaved: (value) {
_user.email = value;
},
@ -131,10 +132,10 @@ class _ProfilePageState extends State<ProfilePage> {
),
ATextFormField(
initialValue: _user.phoneNumber,
hintText: _subtitle.phoneNumber,
hintText: context.translation.phoneNumber,
style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
validator: (value) => Validator.isPhoneNumber(value) ? null : context.translation.phoneNumberValidateMessage,
textInputType: TextInputType.phone,
onSaved: (value) {
_user.phoneNumber = value;
@ -145,12 +146,12 @@ class _ProfilePageState extends State<ProfilePage> {
),
// ATextFormField(
// initialValue: _user.whatsApp,
// hintText: _subtitle.whatsApp,
// hintText: context.translation.whatsApp,
// style: Theme.of(context).textTheme.headline6,
// prefixIconData: FontAwesomeIcons.whatsapp,
// prefixIconSize: 36,
// validator: (value) =>
// Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
// Validator.isPhoneNumber(value) ? null : context.translation.phoneNumberValidateMessage,
// textInputType: TextInputType.phone,
// onSaved: (value){
// _user.whatsApp = value;
@ -167,13 +168,13 @@ class _ProfilePageState extends State<ProfilePage> {
height: _width / 8,
width: _width / 1.2,
child: AButton(
text: _subtitle.update,
text: context.translation.update,
onPressed: () async {
// if (!_formKey.currentState.validate()) return;
// _formKey.currentState.save();
// if (_user.departmentId == null) {
// ScaffoldMessenger.of(context).showSnackBar(SnackBar(
// content: Text(_subtitle.unitRequired),
// content: Text(context.translation.unitRequired),
// ));
// return;
// }
@ -184,10 +185,10 @@ class _ProfilePageState extends State<ProfilePage> {
// if (status >= 200 && status < 300) {
// _settingProvider.setUser(_userProvider.user);
// ScaffoldMessenger.of(context).showSnackBar(SnackBar(
// content: Text(_subtitle.requestCompleteSuccessfully),
// content: Text(context.translation.requestCompleteSuccessfully),
// ));
// } else {
// String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
// String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
// ScaffoldMessenger.of(context).showSnackBar(SnackBar(
// 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/settings/setting_provider.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/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart';
@ -39,12 +40,11 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_height = MediaQuery.of(context).size.height;
_subtitle.setIssues(_issues);
return Scaffold(
body: SafeArea(
child: Form(
@ -66,7 +66,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
vertical: 24 * AppStyle.getScaleFactor(context),
),
child: Text(
_subtitle.reportIssue,
context.translation.reportIssue,
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.bold),
),
),
@ -97,10 +97,10 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
children: [
ATextFormField(
initialValue: _issue?.title,
hintText: _subtitle.title,
hintText: context.translation.title,
textAlign: TextAlign.center,
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,
onSaved: (value) {
_issue.title = value;
@ -127,12 +127,12 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
"${_subtitle.shareAntherIssue} :",
"${context.translation.shareAntherIssue} :",
style: Theme.of(context).textTheme.headline6,
),
),
ATextFormField(
hintText: _subtitle.description,
hintText: context.translation.description,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.multiline,
onSaved: (value) {
@ -142,7 +142,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
Padding(
padding: const EdgeInsets.all(8.0),
child: AButton(
text: _subtitle.submit,
text: context.translation.submit,
onPressed: () async {
if (!_formKey.currentState.validate()) return;
_formKey.currentState.save();
@ -158,7 +158,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: context.translation.successfulRequestMessage,
);
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/settings/setting_provider.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/widget_extensions.dart';
import 'package:test_sa/models/device/device.dart';
@ -60,7 +61,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
bool _isLoading = false;
bool _showDatePicker = false;
Device _device;
Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _maintenanceController, _commentController, _reviewCommentController;
@ -124,7 +125,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
_height = MediaQuery.of(context).size.height;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
return Scaffold(
@ -154,7 +155,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
child: Padding(
padding: const EdgeInsets.all(8.0),
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),
),
),
@ -167,8 +168,8 @@ class CreateRequestPageState extends State<CreateRequestPage> {
? const SizedBox.shrink()
: ATextFormField(
enable: false,
initialValue: _userProvider.user.clientName ?? _subtitle.noHospitalFound,
hintText: _subtitle.hospital,
initialValue: _userProvider.user.clientName ?? context.translation.noHospitalFound,
hintText: context.translation.hospital,
prefixIconData: FontAwesomeIcons.hospital,
style: Theme.of(context).textTheme.subtitle1,
),
@ -318,7 +319,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
ATextFormField(
controller: _reviewCommentController,
initialValue: _serviceRequest.reviewComment,
hintText: _subtitle.comment,
hintText: context.translation.comment,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline,
onSaved: (value) {
@ -328,7 +329,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
),
12.height,
MultiFilesPicker(
label: _subtitle.deviceFiles,
label: context.translation.deviceFiles,
files: _deviceImages,
enabled: widget.serviceRequest == null ? true : false,
),
@ -341,11 +342,11 @@ class CreateRequestPageState extends State<CreateRequestPage> {
ATextFormField(
controller: _maintenanceController,
initialValue: _serviceRequest.callComments,
hintText: _subtitle.maintenanceIssue,
hintText: context.translation.maintenanceIssue,
prefixIconData: FontAwesomeIcons.triangleExclamation,
style: Theme.of(context).textTheme.titleLarge,
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) {
_serviceRequest.callComments = value;
},
@ -368,7 +369,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
ATextFormField(
controller: _commentController,
initialValue: _serviceRequest.comments,
hintText: _subtitle.comment,
hintText: context.translation.comment,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline,
onSaved: (value) {
@ -380,11 +381,11 @@ class CreateRequestPageState extends State<CreateRequestPage> {
Padding(
padding: const EdgeInsets.all(20.0),
child: AButton(
text: widget.serviceRequest == null ? _subtitle.submit : _subtitle.update,
text: widget.serviceRequest == null ? context.translation.submit : context.translation.update,
onPressed: () async {
if (!_formKey.currentState.validate()) return;
if (_device?.id == null) {
Fluttertoast.showToast(msg: _subtitle.pickDevice);
Fluttertoast.showToast(msg: context.translation.pickDevice);
return;
}
if (_serviceRequest.firstAction?.name == "Need a visit" && _dateTime == null) {
@ -429,11 +430,11 @@ class CreateRequestPageState extends State<CreateRequestPage> {
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: context.translation.successfulRequestMessage,
);
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
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/user_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/subtitle.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);
_settingProvider = Provider.of<SettingProvider>(context);
String requestId = ModalRoute.of(context).settings.arguments;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
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) {
if (snapshot.hasError)
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/settings/setting_provider.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/engineer.dart';
import 'package:test_sa/models/part.dart';
@ -59,7 +60,6 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
bool _isLoading = false;
bool _showCommentField = false;
Subtitle _subtitle;
final List<File> _files = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -110,7 +110,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
(element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: () => null,
);
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
key: _scaffoldKey,
body: SafeArea(
@ -134,7 +134,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
_subtitle.newServiceReport,
context.translation.newServiceReport,
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,
children: [
ASubTitle(
"${_subtitle.callId}: ${widget.request.requestCode}",
"${context.translation.callId}: ${widget.request.requestCode}",
font: 14,
),
ASubTitle(
"${_subtitle.assetNumber}: ${widget.request.deviceNumber}",
"${context.translation.assetNumber}: ${widget.request.deviceNumber}",
font: 14,
),
widget.request.deviceSerialNumber == null
? const SizedBox()
: ASubTitle(
"${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",
"${context.translation.deviceSN}: ${widget.request.deviceSerialNumber}",
font: 14,
),
Text(
"${_subtitle.customer}: ${widget.request.hospitalName}",
"${context.translation.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(
fontWeight: FontWeight.bold,
fontSize: 12,
@ -206,10 +206,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.deviceSN),
ASubTitle(context.translation.deviceSN),
_validate && _serviceReport.device?.id == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -229,10 +229,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.assetType ?? ""),
ASubTitle(context.translation.assetType ?? ""),
_validate && _serviceReport.assetType == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -276,11 +276,11 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// ASubTitle(_subtitle.reportStatus),
// ASubTitle(context.translation.reportStatus),
ASubTitle("Equipment Status"),
_validate && _serviceReport.equipmentStatus == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -317,10 +317,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.callLastSituation),
ASubTitle(context.translation.callLastSituation),
_validate && _serviceReport.callLastSituation == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -370,9 +370,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.reportType),
// ASubTitle(context.translation.reportType),
// _validate && _serviceReport.type == null ?
// ASubTitle(_subtitle.requiredWord,color: Colors.red,):
// ASubTitle(context.translation.requiredWord,color: Colors.red,):
// const SizedBox.shrink(),
// const SizedBox(height: 4,),
// ServiceReportTypeMenu(
@ -393,7 +393,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const ASubTitle("Return to Service"),
// _validate && _serviceReport.returnToService == null
// ? ASubTitle(
// _subtitle.requiredWord,
// context.translation.requiredWord,
// color: Colors.red,
// )
// : const SizedBox.shrink(),
@ -420,7 +420,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.workingHours),
ASubTitle(context.translation.workingHours),
const SizedBox(height: 8),
Row(
children: [
@ -443,10 +443,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.deviceSN),
ASubTitle(context.translation.deviceSN),
_validate && _serviceReport.device?.id == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -494,7 +494,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceNumber),
ASubTitle(context.translation.invoiceNumber),
const SizedBox(
height: 8,
),
@ -502,7 +502,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center,
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,
onSaved: (value) {
_serviceReport.invoiceNumber = value;
@ -518,7 +518,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceCode),
ASubTitle(context.translation.invoiceCode),
const SizedBox(
height: 4,
),
@ -526,7 +526,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center,
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,
onSaved: (value) {
_serviceReport.invoiceCode = value;
@ -538,7 +538,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
],
),
const SizedBox(height: 8),
ASubTitle(_subtitle.faultDescription),
ASubTitle(context.translation.faultDescription),
const SizedBox(
height: 4,
),
@ -560,7 +560,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// textAlign: TextAlign.center,
// controller: _faultController,
// 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,
// onSaved: (value) {
// _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0;
@ -593,7 +593,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
hintText: _serviceReport.faultDescription?.workPerformed ?? "",
controller: _workPreformedController,
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,
onSaved: (value) {
_serviceReport.workPreformed = value;
@ -614,7 +614,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const ASubTitle("Failure Reason"),
_validate && _serviceReport.reason?.id == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -650,7 +650,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox(height: 8),
MultiFilesPicker(label: "Attachments", files: _files),
const SizedBox(height: 8),
ASubTitle(_subtitle.repairLocation),
ASubTitle(context.translation.repairLocation),
const SizedBox(height: 4),
ServiceReportRepairLocation(
initialValue: _serviceReport.repairLocation,
@ -684,7 +684,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.workingHours),
// ASubTitle(context.translation.workingHours),
// const SizedBox(
// height: 8,
// ),
@ -708,7 +708,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// // style: Theme.of(context).textTheme.subtitle1,
// // validator: (value) =>
// // Validator.isNumeric(value)
// // ? null : _subtitle.requiredWord,
// // ? null : context.translation.requiredWord,
// // textInputType: TextInputType.number,
// // onSaved: (value){
// // _serviceReport.workHours = value;
@ -722,7 +722,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.travelingHours),
ASubTitle(context.translation.travelingHours),
const SizedBox(
height: 4,
),
@ -733,7 +733,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
style: Theme.of(context).textTheme.subtitle1,
// validator: (value) =>
// Validator.isNumeric(value)
// ? null : _subtitle.requiredWord,
// ? null : context.translation.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
_serviceReport.travelingHours = double.tryParse(value) ?? 0.0;
@ -754,7 +754,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.operatingHours),
// ASubTitle(context.translation.operatingHours),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: _serviceReport?.operatingHours,
@ -763,7 +763,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// style: Theme.of(context).textTheme.subtitle1,
// validator: (value) =>
// Validator.isNumeric(value)
// ? null : _subtitle.requiredWord,
// ? null : context.translation.requiredWord,
// textInputType: TextInputType.number,
// onSaved: (value){
// _serviceReport.operatingHours = value;
@ -777,7 +777,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.jobSheetNumber),
// ASubTitle(context.translation.jobSheetNumber),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: _serviceReport?.jobSheetNumber,
@ -862,10 +862,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.partNumberName),
ASubTitle(context.translation.partNumberName),
_validate && _serviceReport.parts == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -888,8 +888,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
),
Row(
children: [
Expanded(flex: 3, child: Text(_subtitle.number)),
Expanded(flex: 1, child: Text(_subtitle.quantity)),
Expanded(flex: 3, child: Text(context.translation.number)),
Expanded(flex: 1, child: Text(context.translation.quantity)),
],
),
Column(
@ -913,7 +913,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
],
),
AButton(
text: _subtitle.submit,
text: context.translation.submit,
onPressed: () async {
_validate = true;
// if (!_formKey.currentState.validate()) {
@ -942,12 +942,12 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: context.translation.successfulRequestMessage,
);
Navigator.of(context).pop();
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
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/settings/setting_provider.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/engineer.dart';
import 'package:test_sa/models/part.dart';
@ -60,7 +61,6 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
bool _isLoading = false;
bool _showCommentField = false;
Subtitle _subtitle;
List<File> _images = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -109,7 +109,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
(element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: () => null,
);
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
key: _scaffoldKey,
body: SafeArea(
@ -130,7 +130,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
_subtitle.editServiceReport,
context.translation.editServiceReport,
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,
children: [
ASubTitle(
"${_subtitle.callId}: ${widget.request.requestCode}",
"${context.translation.callId}: ${widget.request.requestCode}",
font: 14,
),
ASubTitle(
"${_subtitle.assetNumber}: ${widget.request.deviceNumber}",
"${context.translation.assetNumber}: ${widget.request.deviceNumber}",
font: 14,
),
widget.request.deviceSerialNumber == null
? const SizedBox()
: ASubTitle(
"${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",
"${context.translation.deviceSN}: ${widget.request.deviceSerialNumber}",
font: 14,
),
Text(
"${_subtitle.customer}: ${widget.request.hospitalName}",
"${context.translation.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(
fontWeight: FontWeight.bold,
fontSize: 12,
@ -203,10 +203,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// // child: Column(
// // crossAxisAlignment: CrossAxisAlignment.start,
// // children: [
// // ASubTitle(_subtitle.reportType),
// // ASubTitle(context.translation.reportType),
// // _validate && _serviceReport.type == null
// // ? ASubTitle(
// // _subtitle.requiredWord,
// // context.translation.requiredWord,
// // color: Colors.red,
// // )
// // : const SizedBox.shrink(),
@ -230,10 +230,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.visitDate),
// ASubTitle(context.translation.visitDate),
// _validate && _serviceReport.visitDate == null
// ? ASubTitle(
// _subtitle.requiredWord,
// context.translation.requiredWord,
// color: Colors.red,
// )
// : const SizedBox.shrink(),
@ -266,10 +266,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.deviceSN),
ASubTitle(context.translation.deviceSN),
_validate && _serviceReport.device?.id == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -285,10 +285,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
),
const SizedBox(height: 8),
ASubTitle(_subtitle.assetType),
ASubTitle(context.translation.assetType),
_validate && _serviceReport.assetType == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -330,11 +330,11 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// ASubTitle(_subtitle.reportStatus),
// ASubTitle(context.translation.reportStatus),
ASubTitle("Equipment Status"),
_validate && _serviceReport.equipmentStatus == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -371,10 +371,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.callLastSituation),
ASubTitle(context.translation.callLastSituation),
_validate && _serviceReport.callLastSituation == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -473,7 +473,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// ),
// _validate && _serviceReport.engineer == null
// ? ASubTitle(
// _subtitle.requiredWord,
// context.translation.requiredWord,
// color: Colors.red,
// )
// : const SizedBox.shrink(),
@ -497,10 +497,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.reportStatus),
// ASubTitle(context.translation.reportStatus),
// _validate && _serviceReport.equipmentStatus == null
// ? ASubTitle(
// _subtitle.requiredWord,
// context.translation.requiredWord,
// color: Colors.red,
// )
// : const SizedBox.shrink(),
@ -527,10 +527,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.callLastSituation),
// ASubTitle(context.translation.callLastSituation),
// _validate && _serviceReport.callLastSituation == null
// ? ASubTitle(
// _subtitle.requiredWord,
// context.translation.requiredWord,
// color: Colors.red,
// )
// : const SizedBox.shrink(),
@ -567,7 +567,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceNumber),
ASubTitle(context.translation.invoiceNumber),
const SizedBox(
height: 8,
),
@ -575,7 +575,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center,
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,
onSaved: (value) {
_serviceReport.invoiceNumber = value;
@ -591,7 +591,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceCode),
ASubTitle(context.translation.invoiceCode),
const SizedBox(
height: 4,
),
@ -599,7 +599,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center,
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,
onSaved: (value) {
_serviceReport.invoiceCode = value;
@ -614,7 +614,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// const SizedBox(height: 8,),
// Row(
// children: [
// ASubTitle(_subtitle.faultDescription),
// ASubTitle(context.translation.faultDescription),
// Expanded(
// child: SizedBox(
// height: 32 * AppStyle.getScaleFactor(context),
@ -634,7 +634,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// style: Theme.of(context).textTheme.subtitle1,
// validator: (value) =>
// Validator.hasValue(value)
// ? null : _subtitle.requiredWord,
// ? null : context.translation.requiredWord,
// textInputType: TextInputType.multiline,
// onSaved: (value){
// _serviceReport.faultDescriptionId = value;
@ -643,7 +643,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// const SizedBox(height: 8,),
// Row(
// children: [
// ASubTitle(_subtitle.workPreformed),
// ASubTitle(context.translation.workPreformed),
// Expanded(
// child: SizedBox(
// height: 32 * AppStyle.getScaleFactor(context),
@ -663,7 +663,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// style: Theme.of(context).textTheme.subtitle1,
// validator: (value) =>
// Validator.hasValue(value)
// ? null : _subtitle.requiredWord,
// ? null : context.translation.requiredWord,
// textInputType: TextInputType.multiline,
// onSaved: (value){
// _serviceReport.workPreformed = value;
@ -671,7 +671,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// ),
// const SizedBox(height: 8,),
const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours),
ASubTitle(context.translation.workingHours),
const SizedBox(height: 8),
Row(
children: [
@ -708,7 +708,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
height: 8 * AppStyle.getScaleFactor(context),
),
const SizedBox(height: 8),
ASubTitle(_subtitle.faultDescription),
ASubTitle(context.translation.faultDescription),
const SizedBox(
height: 4,
),
@ -732,7 +732,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
hintText: _serviceReport.faultDescription?.workPerformed ?? "",
controller: _workPreformedController,
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,
onSaved: (value) {
// _serviceReport.workPreformed = value;
@ -752,7 +752,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.attachImage),
ASubTitle(context.translation.attachImage),
const SizedBox(
height: 4,
),
@ -772,7 +772,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
height: 8,
),
const SizedBox(height: 8),
ASubTitle(_subtitle.repairLocation),
ASubTitle(context.translation.repairLocation),
const SizedBox(height: 4),
ServiceReportRepairLocation(
initialValue: _serviceReport.repairLocation,
@ -787,7 +787,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
ATextFormField(
initialValue: _serviceReport?.travelingExpense?.toString(),
hintText: _subtitle.travelingExpense,
hintText: context.translation.travelingExpense,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.number,
@ -800,7 +800,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
const SizedBox(height: 8),
ASubTitle(_subtitle.travelingHours),
ASubTitle(context.translation.travelingHours),
const SizedBox(height: 4),
ATextFormField(
initialValue: _serviceReport?.travelingHours?.toString(),
@ -809,7 +809,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
style: Theme.of(context).textTheme.subtitle1,
// validator: (value) =>
// Validator.isNumeric(value)
// ? null : _subtitle.requiredWord,
// ? null : context.translation.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
_serviceReport.travelingHours = double.tryParse(value) ?? 0.0;
@ -822,7 +822,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.workingHours),
// ASubTitle(context.translation.workingHours),
// const SizedBox(
// height: 8,
// ),
@ -846,7 +846,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// // style: Theme.of(context).textTheme.subtitle1,
// // validator: (value) =>
// // Validator.isNumeric(value)
// // ? null : _subtitle.requiredWord,
// // ? null : context.translation.requiredWord,
// // textInputType: TextInputType.number,
// // onSaved: (value){
// // _serviceReport.workHours = value;
@ -860,7 +860,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// // child: Column(
// // crossAxisAlignment: CrossAxisAlignment.start,
// // children: [
// // ASubTitle(_subtitle.travelingHours),
// // ASubTitle(context.translation.travelingHours),
// // const SizedBox(height: 4,),
// // ATextFormField(
// // initialValue: _serviceReport?.travelingHours,
@ -869,7 +869,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// // style: Theme.of(context).textTheme.subtitle1,
// // validator: (value) =>
// // Validator.isNumeric(value)
// // ? null : _subtitle.requiredWord,
// // ? null : context.translation.requiredWord,
// // textInputType: TextInputType.number,
// // onSaved: (value){
// // _serviceReport.travelingHours = value;
@ -890,7 +890,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.operatingHours),
// ASubTitle(context.translation.operatingHours),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: _serviceReport?.operatingHours,
@ -899,7 +899,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// style: Theme.of(context).textTheme.subtitle1,
// validator: (value) =>
// Validator.isNumeric(value)
// ? null : _subtitle.requiredWord,
// ? null : context.translation.requiredWord,
// textInputType: TextInputType.number,
// onSaved: (value){
// _serviceReport.operatingHours = value;
@ -913,7 +913,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.jobSheetNumber),
// ASubTitle(context.translation.jobSheetNumber),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: _serviceReport?.jobSheetNumber,
@ -1002,10 +1002,10 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.partNumberName),
ASubTitle(context.translation.partNumberName),
_validate && _serviceReport.parts == null
? ASubTitle(
_subtitle.requiredWord,
context.translation.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
@ -1029,8 +1029,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
Row(
children: [
Expanded(flex: 3, child: Text(_subtitle.number)),
Expanded(flex: 1, child: Text(_subtitle.quantity)),
Expanded(flex: 3, child: Text(context.translation.number)),
Expanded(flex: 1, child: Text(context.translation.quantity)),
],
),
Column(
@ -1052,7 +1052,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
),
AButton(
text: _subtitle.update,
text: context.translation.update,
onPressed: () async {
if (_serviceReport?.workingHours == null) {
await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started");
@ -1079,12 +1079,12 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: context.translation.successfulRequestMessage,
);
Navigator.of(context).pop();
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
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/user_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_request/search_work_order.dart';
import 'package:test_sa/models/service_request/service_request.dart';
@ -31,11 +32,11 @@ class _FutureServiceReportState extends State<FutureServiceReport> {
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(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(
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) {
if (snapshot.hasError) {
return FailedLoading(

@ -43,7 +43,6 @@ class RequestDetailsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
UserProvider _userProvider = Provider.of<UserProvider>(context);
SettingProvider _settingProvider = Provider.of<SettingProvider>(context);
List<SearchWorkOrder> workOrders = [];
@ -85,7 +84,7 @@ class RequestDetailsPage extends StatelessWidget {
8.height,
Text(serviceRequest.deviceEnName, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
Text(
'${_subtitle.assetNumber}: ${serviceRequest.device.number}',
'${context.translation.assetNumber}: ${serviceRequest.device.number}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
@ -155,7 +154,7 @@ class RequestDetailsPage extends StatelessWidget {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: const DefaultAppBar(title: TranslationKeys.serviceRequest),
appBar: DefaultAppBar(title: context.translation.serviceRequest),
backgroundColor: const Color(0xfff8f9fb),
body: SafeArea(
child: FutureBuilder(
@ -176,7 +175,7 @@ class RequestDetailsPage extends StatelessWidget {
Expanded(
child: Center(
child: Text(
_subtitle.details,
context.translation.details,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
@ -229,7 +228,7 @@ class RequestDetailsPage extends StatelessWidget {
// barrierDismissible: false,
// builder: (BuildContext context) {
// return CupertinoAlertDialog(
// title: Text(_subtitle.updatingDots),
// title: Text(context.translation.updatingDots),
// content: Center(child: CircularProgressIndicator()),
// );
// },
@ -242,7 +241,7 @@ class RequestDetailsPage extends StatelessWidget {
// );
// Navigator.of(context).pop();
// 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),
TabBar(labelColor: AColors.primaryColor, tabs: [
Tab(
text: _subtitle.general,
text: context.translation.general,
),
Tab(
text: _subtitle.serviceRequestInformation,
text: context.translation.serviceRequestInformation,
),
]),
SizedBox(
@ -281,7 +280,7 @@ class RequestDetailsPage extends StatelessWidget {
children: [
informationCard(),
RequestInfoRow(
title: _subtitle.callId,
title: context.translation.callId,
info: serviceRequest.requestCode,
),
RequestInfoRow(
@ -289,36 +288,36 @@ class RequestDetailsPage extends StatelessWidget {
info: serviceRequest.deviceNumber,
),
RequestInfoRow(
title: _subtitle.assetName,
title: context.translation.assetName,
info: serviceRequest.deviceEnName,
),
RequestInfoRow(
title: _subtitle.deviceModel,
title: context.translation.deviceModel,
info: serviceRequest.deviceModel,
),
RequestInfoRow(
title: _subtitle.engineerName,
title: context.translation.engineerName,
info: serviceRequest.engineerName,
),
RequestInfoRow(
title: _subtitle.engineerPhone,
title: context.translation.engineerPhone,
info: serviceRequest.engineerMobile,
),
RequestInfoRow(
title: _subtitle.date,
title: context.translation.date,
info: serviceRequest.date,
),
serviceRequest.nextVisitDate == null
? SizedBox.shrink()
: RequestInfoRow(
title: _subtitle.nextVisitDate,
title: context.translation.next,
info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate),
),
Row(
children: [
Expanded(
child: Text(
"${_subtitle.status} : ",
"${context.translation.status} : ",
style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context),
),
@ -330,23 +329,23 @@ class RequestDetailsPage extends StatelessWidget {
color: Theme.of(context).primaryColor,
),
RequestInfoRow(
title: _subtitle.hospital,
title: context.translation.hospital,
info: serviceRequest.hospitalName,
),
RequestInfoRow(
title: _subtitle.unite,
title: context.translation.unite,
info: serviceRequest.departmentName,
),
// RequestInfoRow(
// title: _subtitle.deviceArName,
// title: context.translation.deviceArName,
// content: serviceRequest.deviceArName,
// ),
// RequestInfoRow(
// title: _subtitle.deviceName,
// title: context.translation.deviceName,
// content: serviceRequest.deviceEnName,
// ),
RequestInfoRow(
title: _subtitle.maintenanceIssue,
title: context.translation.maintenanceIssue,
content: serviceRequest.callComments,
),
if (serviceRequest.audio?.isNotEmpty == true)
@ -358,13 +357,13 @@ class RequestDetailsPage extends StatelessWidget {
// child: Padding(
// padding: EdgeInsets.all(32),
// child: AButton(
// text: _subtitle.duplicateRequest,
// text: context.translation.duplicateRequest,
// onPressed: () async {
// bool result = await showDialog(
// context: context,
// builder: (_) => AAlertDialog(
// title: _subtitle.duplicateAlert,
// content: _subtitle.duplicateAlertMessage,
// title: context.translation.duplicateAlert,
// content: context.translation.duplicateAlertMessage,
// )
// );
// if(result == true){
@ -383,7 +382,7 @@ class RequestDetailsPage extends StatelessWidget {
// ScaffoldMessenger.of(context).showSnackBar(
// SnackBar(
// content: Text(
// HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle)
// HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation)
// )
// )
// );
@ -394,7 +393,7 @@ class RequestDetailsPage extends StatelessWidget {
// )
],
).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 ?
@ -432,36 +431,36 @@ class RequestDetailsPage extends StatelessWidget {
child: Column(
children: [
RequestInfoRow(
title: _subtitle.callId,
title: context.translation.callId,
content: serviceRequest.requestCode,
),
RequestInfoRow(
title: _subtitle.orderWorkNumber,
title: context.translation.orderWorkNumber,
info: workOrders[index].workOrderNo.toString(),
),
RequestInfoRow(
title: _subtitle.visitDate,
title: context.translation.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(
title: _subtitle.assetSN,
title: context.translation.assetSN,
info: workOrders[index].callRequest.asset.assetSerialNo,
),
RequestInfoRow(
title: _subtitle.assetName,
title: context.translation.assetName,
info: workOrders[index].callRequest.asset.modelDefinition.assetName,
),
RequestInfoRow(
title: _subtitle.assetNumber,
title: context.translation.assetNumber,
info: workOrders[index].callRequest.asset.assetNumber,
),
RequestInfoRow(
title: _subtitle.model,
title: context.translation.model,
info: workOrders[index].callRequest.asset.modelDefinition.modelName,
),
RequestInfoRow(
title: _subtitle.site,
title: context.translation.site,
info: workOrders[index].callRequest.asset.site.custName,
),
RequestInfoRow(
@ -472,7 +471,7 @@ class RequestDetailsPage extends StatelessWidget {
? Padding(
padding: EdgeInsets.all(32),
child: AButton(
text: _subtitle.editServiceReport,
text: context.translation.editServiceReport,
onPressed: serviceRequest.statusValue == 5 || serviceRequest.statusValue == 3
? null
: () {
@ -514,7 +513,7 @@ class RequestDetailsPage extends StatelessWidget {
children: [
Expanded(
child: Center(
child: ASubTitle(_subtitle.dataNotFound),
child: ASubTitle(context.translation.dataNotFound),
),
),
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/user_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/service_request/service_request_search.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/requests/service_request_list.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 {
static final String id = "/service-requests";
@ -34,14 +36,13 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerPr
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (_firstTime) {
_serviceRequestsProvider.reset();
_firstTime = false;
}
return Scaffold(
appBar: const DefaultAppBar(title: TranslationKeys.serviceRequest),
appBar: DefaultAppBar(title: context.translation.serviceRequest),
backgroundColor: const Color(0xfff8f9fb),
body: SafeArea(
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/user_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/pentry.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 {
bool _isLoading = false;
bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider;
SettingProvider _settingProvider;
RegularVisitsProvider _regularVisitsProvider;
@ -56,13 +56,13 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
setState(() {});
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: context.translation.successfulRequestMessage,
);
Navigator.of(context).pop();
Navigator.of(context).pop();
} else {
// String errorMessage = HttpStatusManger.getStatusMessage(
// status: status, subtitle: _subtitle);
// status: status, subtitle: context.translation);
// Fluttertoast.showToast(
// msg: errorMessage,
// );
@ -87,7 +87,6 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
@ -162,7 +161,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
children: [
if (_tabController.index != 0)
ASmallButton(
text: _subtitle.back,
text: context.translation.back,
onPressed: () {
_tabController.animateTo(
_tabController.index - 1,
@ -173,7 +172,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
const Spacer(),
if (_tabController.index != _tabController.length - 1)
ASmallButton(
text: _subtitle.next,
text: context.translation.next,
onPressed: () {
_tabController.animateTo(
_tabController.index + 1,
@ -183,7 +182,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
),
if (_tabController.index == _tabController.length - 1)
ASmallButton(
text: _subtitle.update,
text: context.translation.update,
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/user_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/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart';
@ -28,14 +29,14 @@ class _FutureEditPentryState extends State<FutureEditPentry> {
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
//String requestId = ModalRoute.of(context).settings.arguments;
Subtitle subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
body: FutureBuilder<Pentry>(
future: RegularVisitsProvider().getPently(user: _userProvider.user, host: _settingProvider.host, id: widget.visit.id),
builder: (BuildContext context, AsyncSnapshot<Pentry> snapshot) {
if (snapshot.hasError) {
return FailedLoading(
message: subtitle.failedToCompleteRequest,
message: context.translation.failedToCompleteRequest,
onReload: () {
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/user_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/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart';
@ -30,14 +31,13 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
PreventiveMaintenanceVisitsProvider _visitsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
Subtitle _subtitle;
@override
Widget build(BuildContext context) {
_visitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
body: SafeArea(
child: LoadingManager(
@ -68,7 +68,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
Expanded(
child: Center(
child: Text(
_subtitle.preventiveMaintenance,
context.translation.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
@ -112,7 +112,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AButton(
text: _subtitle.clearSearch,
text: context.translation.clearSearch,
onPressed: () {
_visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset();
@ -138,7 +138,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
builder: (context) {
return UpdateVisitsGroupSheet(
visits: visits,
title: _subtitle.updatePreventiveMaintenance,
title: context.translation.updatePreventiveMaintenance,
);
},
) as VisitsGroup;
@ -148,7 +148,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
barrierDismissible: false,
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text(_subtitle.updatingDots),
title: Text(context.translation.updatingDots),
content: Center(child: CircularProgressIndicator()),
);
},
@ -157,13 +157,13 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
Navigator.of(context).pop();
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully,
msg: context.translation.preventiveMaintenanceUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
);
} else {
Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle),
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation),
toastLength: Toast.LENGTH_LONG,
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/user_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/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart';
@ -31,14 +32,13 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
UserProvider _userProvider;
SettingProvider _settingProvider;
bool _expandedSearch = false;
Subtitle _subtitle;
@override
Widget build(BuildContext context) {
_visitsProvider = Provider.of<RegularVisitsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
body: SafeArea(
child: LoadingManager(
@ -68,7 +68,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
Expanded(
child: Center(
child: Text(
_subtitle.preventiveMaintenance,
context.translation.preventiveMaintenance,
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(
padding: const EdgeInsets.all(8.0),
child: AButton(
text: _subtitle.clearSearch,
text: context.translation.clearSearch,
onPressed: () {
_visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset();
@ -136,7 +136,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
builder: (context) {
return UpdateVisitsGroupSheet(
visits: visits,
title: _subtitle.updateRegularVisits,
title: context.translation.updateRegularVisits,
);
},
) as VisitsGroup;
@ -146,7 +146,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
barrierDismissible: false,
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text(_subtitle.updatingDots),
title: Text(context.translation.updatingDots),
content: Center(child: CircularProgressIndicator()),
);
},
@ -155,13 +155,13 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
Navigator.of(context).pop();
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully,
msg: context.translation.preventiveMaintenanceUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
);
} else {
Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle),
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation),
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
);

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

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

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

@ -1,5 +1,6 @@
import 'package:flutter/material.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/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart';
@ -14,7 +15,7 @@ class DepartmentButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
@ -31,7 +32,7 @@ class DepartmentButton extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(
department?.name ?? _subtitle.pickUnite,
department?.name ?? context.translation.pickUnite,
style: Theme.of(context).textTheme.bodyText1,
textScaleFactor: AppStyle.getScaleFactor(context),
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/providers/api/departments_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/subtitle.dart';
import 'package:test_sa/views/widgets/departments/department_item.dart';
@ -28,7 +29,6 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
Widget build(BuildContext context) {
_departmentsProvider = Provider.of<DepartmentsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (_firstTime && _departmentsProvider.departments != null) {
_searchableList.addAll(_departmentsProvider.departments);
_firstTime = false;
@ -54,7 +54,7 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ATextFormField(
hintText: _subtitle.searchByName,
hintText: context.translation.searchByName,
style: Theme.of(context).textTheme.headline6,
suffixIcon: Icon(Icons.search_rounded),
onChange: (value) {
@ -67,7 +67,7 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
Expanded(
child: _searchableList.isEmpty
? NoItemFound(
message: _subtitle.noUniteFound,
message: context.translation.noUniteFound,
)
: ListView.builder(
padding: EdgeInsets.zero,

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.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/views/app_style/colors.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart';
@ -19,16 +20,15 @@ class DeviceTransferInfoSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
info.userName = Provider.of<UserProvider>(context).user.username;
final subtitle = AppLocalization.of(context).subtitle;
info.attachments ??= [];
return Column(
children: [
RequestInfoRow(
title: subtitle.hospital,
title: context.translation.hospital,
info: info.client.name,
),
RequestInfoRow(
title: subtitle.department,
title: context.translation.department,
info: info.department.name,
),
// RequestInfoRow(
@ -36,11 +36,11 @@ class DeviceTransferInfoSection extends StatelessWidget {
// info: info.userName,
// ),
RequestInfoRow(
title: subtitle.workingHours,
title: context.translation.workingHours,
info: info.workingHours,
),
RequestInfoRow(
title: subtitle.travelingHours,
title: context.translation.travelingHours,
info: info.travelingHours,
),
RequestInfoRow(
@ -53,7 +53,7 @@ class DeviceTransferInfoSection extends StatelessWidget {
),
RequestInfoRow(
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),
),
Padding(
@ -65,7 +65,7 @@ class DeviceTransferInfoSection extends StatelessWidget {
),
),
RequestInfoRow(
title: subtitle.status,
title: context.translation.status,
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:test_sa/controllers/localization/localization.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/subtitle.dart';
import 'package:test_sa/models/user.dart';
@ -18,7 +19,6 @@ class DeviceTransferItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
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 onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
@ -71,7 +71,7 @@ class DeviceTransferItem extends StatelessWidget {
children: [
Expanded(
child: Text(
_subtitle.from,
context.translation.from,
style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor,
),
@ -110,7 +110,7 @@ class DeviceTransferItem extends StatelessWidget {
children: [
Expanded(
child: Text(
_subtitle.to,
context.translation.to,
style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor,
),

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

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

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

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

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

@ -1,5 +1,6 @@
import 'package:flutter/material.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/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart';
@ -13,7 +14,7 @@ class DeviceItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
child: ElevatedButton(
@ -28,7 +29,7 @@ class DeviceItem extends StatelessWidget {
},
child: ListTile(
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),
),
subtitle: Column(
@ -38,21 +39,21 @@ class DeviceItem extends StatelessWidget {
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
"${_subtitle.assetNumber} : ${device.number}",
"${context.translation.assetNumber} : ${device.number}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
),
Divider(
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
"${_subtitle.brand} : ${device.modelDefinition.manufacturerName}",
"${context.translation.brand} : ${device.modelDefinition.manufacturerName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
),
Divider(
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
"${_subtitle.model} : ${device.modelDefinition.modelName}",
"${context.translation.model} : ${device.modelDefinition.modelName}",
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/user_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/subtitle.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> _initList = [];
bool _firstTime = true;
Subtitle _subtitle;
TextEditingController numberController = TextEditingController();
TextEditingController snController = TextEditingController();
@ -81,7 +82,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
_searchableList.addAll(_devicesProvider.devices);
_initList.addAll(_devicesProvider.devices);
}
_subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
resizeToAvoidBottomInset: false,
body: SafeArea(
@ -118,7 +119,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
height: 8,
),
ATextFormField(
hintText: _subtitle.searchBySn,
hintText: context.translation.searchBySn,
controller: snController,
style: Theme.of(context).textTheme.subtitle1,
suffixIcon: const Icon(Icons.search_rounded),
@ -137,7 +138,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
Expanded(
child: _searchableList.isEmpty
? NoItemFound(
message: _subtitle.noDeviceFound,
message: context.translation.noDeviceFound,
)
: LazyLoading(
nextPage: _devicesProvider.nextPage,

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

@ -1,7 +1,7 @@
import 'package:flutter/material.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/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
@ -15,7 +15,6 @@ class GasRefillItem extends StatelessWidget {
@override
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 onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
@ -50,7 +49,7 @@ class GasRefillItem extends StatelessWidget {
children: [
Expanded(
child: Text(
subtitle.hospital,
context.translation.hospital,
style: Theme.of(context).textTheme.titleSmall.copyWith(
color: onItemColor,
),
@ -69,7 +68,7 @@ class GasRefillItem extends StatelessWidget {
Row(
children: [
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)),
],

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

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

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

@ -1,5 +1,6 @@
import 'package:flutter/material.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/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart';
@ -14,7 +15,6 @@ class HospitalButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
@ -29,7 +29,7 @@ class HospitalButton extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(
hospital?.name ?? _subtitle.pickHospital,
hospital?.name ?? context.translation.pickHospital,
style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 14, color: AColors.grey3A),
// textScaleFactor: AppStyle.getScaleFactor(context),
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/providers/api/hospitals_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/subtitle.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_item.dart';
@ -33,7 +34,7 @@ class _SingleHospitalPickerState extends State<SingleHospitalPicker> {
_searchableList.addAll(_hospitalsProvider.hospitals);
_firstTime = false;
}
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
resizeToAvoidBottomInset: false,
body: LoadingManager(
@ -54,7 +55,7 @@ class _SingleHospitalPickerState extends State<SingleHospitalPicker> {
Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ATextFormField(
hintText: _subtitle.searchByName,
hintText: context.translation.searchByName,
style: Theme.of(context).textTheme.headline6,
suffixIcon: Icon(Icons.search_rounded),
onChange: (value) {
@ -67,7 +68,7 @@ class _SingleHospitalPickerState extends State<SingleHospitalPicker> {
Expanded(
child: _searchableList.isEmpty
? NoItemFound(
message: _subtitle.noHospitalFound,
message: context.translation.noHospitalFound,
)
: ListView.builder(
padding: EdgeInsets.zero,

@ -4,7 +4,8 @@ import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package: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/views/app_style/sizing.dart';
@ -22,7 +23,6 @@ class AMiniOneFilePicker extends StatefulWidget {
class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
File _file;
Subtitle _subtitle;
@override
void initState() {
@ -32,7 +32,7 @@ class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -55,7 +55,7 @@ class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
children: [
const SizedBox(height: 4),
Text(
_subtitle.requiredFile,
context.translation.requiredFile,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: Colors.red),
textScaleFactor: AppStyle.getScaleFactor(context),
),
@ -75,12 +75,12 @@ class _AMiniOneFilePickerState extends State<AMiniOneFilePicker> {
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
_file == null ? _subtitle.pickFile : _file.path.split("/").last,
_file == null ? context.translation.pickFile : _file.path.split("/").last,
textScaleFactor: AppStyle.getScaleFactor(context),
),
),
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(
type: FileType.custom,
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(
context: context,
builder: (dialogContext) => CupertinoAlertDialog(

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

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

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

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

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

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

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

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

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

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

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

@ -1,5 +1,6 @@
import 'package:flutter/material.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/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart';
@ -17,10 +18,9 @@ class ServiceRequestsList extends StatelessWidget {
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (requests.length == 0) {
return NoItemFound(
message: _subtitle.noServiceRequestFound,
message: context.translation.noServiceRequestFound,
);
}
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/user_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/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart';
@ -30,7 +31,7 @@ class ServiceRequestsUpdateDialog extends StatefulWidget {
class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialog> with TickerProviderStateMixin {
DateTime _dateTime;
Lookup _employee;
Subtitle _subtitle;
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
@ -40,7 +41,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
_update() async {
if (_dateTime == null && _employee == null) {
Fluttertoast.showToast(
msg: _subtitle.noDateFound,
msg: context.translation.noDateFound,
);
return;
}
@ -49,7 +50,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
barrierDismissible: false,
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text(_subtitle.updatingDots),
title: Text(context.translation.updatingDots),
content: Center(child: CircularProgressIndicator()),
);
},
@ -58,7 +59,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
if (status == 200) Navigator.of(context).pop();
Navigator.of(context).pop();
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
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context, listen: false);
_settingProvider = Provider.of<SettingProvider>(context, listen: false);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
@ -88,13 +89,13 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ASmallButton(
text: _subtitle.cancel,
text: context.translation.cancel,
onPressed: () {
Navigator.of(context).pop();
},
),
ASmallButton(
text: _subtitle.update,
text: context.translation.update,
onPressed: _update,
)
],
@ -106,7 +107,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
children: [
Expanded(
child: Text(
_subtitle.date,
context.translation.date,
style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context),
),

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

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

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

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

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

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

Loading…
Cancel
Save