From 8efab8451599dd00d08a70c33a035e4c2ee23ca1 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Mon, 7 Oct 2024 17:52:48 +0300 Subject: [PATCH] Added Disclosure --- assets/json/disclosure_questions.json | 290 ++ assets/json/disclosure_upcoming.json | 47 + assets/langs/ar-SA.json | 41 +- assets/langs/en-US.json | 27 +- lib/api/marathon/demo_marathon_repo.dart | 21 + lib/classes/decorations_helper.dart | 14 + lib/config/routes.dart | 15 + lib/generated/codegen_loader.g.dart | 2323 +++++++++-------- lib/generated/locale_keys.g.dart | 85 +- lib/main.dart | 5 + .../disclosure/disclosure_details_model.dart | 242 ++ .../disclosure/disclosure_generic_model.dart | 31 + .../disclosure/disclosure_question_model.dart | 122 + lib/provider/dashboard_provider_model.dart | 13 +- lib/ui/chat/create_group.dart | 244 +- .../disclosure/disclosure_intro_screen.dart | 52 + lib/ui/disclosure/disclosure_provider.dart | 343 +++ lib/ui/disclosure/disclosure_screen.dart | 243 ++ .../disclosure/disclosure_waiting_screen.dart | 109 + .../widgets/countdown_timer_main_screen.dart | 176 ++ .../widgets/custom_status_widget.dart | 36 + .../disclosure/widgets/disclosure_banner.dart | 556 ++++ .../widgets/disclosure_details_card.dart | 122 + .../disclosure/widgets/disclosure_footer.dart | 51 + .../disclosure/widgets/disclosure_header.dart | 37 + .../disclosure_progress_container.dart | 122 + .../widgets/disclosure_question_card.dart | 173 ++ .../disclosure_question_card_builder.dart | 51 + .../widgets/disclosure_timer_card.dart | 55 + lib/ui/landing/dashboard_screen.dart | 12 +- .../offers_and_discounts_details.dart | 2 +- .../worklist_fragments/info_fragments.dart | 2 +- 32 files changed, 4294 insertions(+), 1368 deletions(-) create mode 100644 assets/json/disclosure_questions.json create mode 100644 assets/json/disclosure_upcoming.json create mode 100644 lib/models/disclosure/disclosure_details_model.dart create mode 100644 lib/models/disclosure/disclosure_generic_model.dart create mode 100644 lib/models/disclosure/disclosure_question_model.dart create mode 100644 lib/ui/disclosure/disclosure_intro_screen.dart create mode 100644 lib/ui/disclosure/disclosure_provider.dart create mode 100644 lib/ui/disclosure/disclosure_screen.dart create mode 100644 lib/ui/disclosure/disclosure_waiting_screen.dart create mode 100644 lib/ui/disclosure/widgets/countdown_timer_main_screen.dart create mode 100644 lib/ui/disclosure/widgets/custom_status_widget.dart create mode 100644 lib/ui/disclosure/widgets/disclosure_banner.dart create mode 100644 lib/ui/disclosure/widgets/disclosure_details_card.dart create mode 100644 lib/ui/disclosure/widgets/disclosure_footer.dart create mode 100644 lib/ui/disclosure/widgets/disclosure_header.dart create mode 100644 lib/ui/disclosure/widgets/disclosure_progress_container.dart create mode 100644 lib/ui/disclosure/widgets/disclosure_question_card.dart create mode 100644 lib/ui/disclosure/widgets/disclosure_question_card_builder.dart create mode 100644 lib/ui/disclosure/widgets/disclosure_timer_card.dart diff --git a/assets/json/disclosure_questions.json b/assets/json/disclosure_questions.json new file mode 100644 index 0000000..63103b9 --- /dev/null +++ b/assets/json/disclosure_questions.json @@ -0,0 +1,290 @@ +[ + { + "id": "b8f10b10-221c-495d-b99b-6a8094892549", + "titleEn": "Do you (or any of your Relatives) have a relationship or an interest (direct or indirect) with any vendor, contractor, or business entity with which Dr. Sulaiman Al Habib Medical Services Group Company, its affiliates and business (the “Company”) does business or is likely to do business, for which you have an opportunity to influence a related business decision?", + "titleAr": "Do you (or any of your Relatives) have a relationship or an interest (direct or indirect) with any vendor, contractor, or business entity with which Dr. Sulaiman Al Habib Medical Services Group Company, its affiliates and business (the “Company”) does business or is likely to do business, for which you have an opportunity to influence a related business decision?", + "marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "questionTypeId": 1, + "questionTime": 10, + "nextQuestGap": 5, + "gapType": 0, + "gapText": null, + "gapImage": "Questions/51b598b6-c837-45be-8734-1374978bd426_congratulations-gif.gif", + "questOptionsLimit": 0, + "remainingParticipantCount": 1, + "desEn": "If Yes, please provide all related information with required documentation", + "desAr": "If Yes, please provide all related information with required documentation", + "questionOptions": [ + { + "id": "772e6062-543c-4ddc-e516-08dae8b36b35", + "titleEn": "Yes", + "titleAr": "Yes", + "questionId": "b8f10b10-221c-495d-b99b-6a8094892549", + "sequence": 1, + "image": "null", + "isCorrectOption": false + }, + { + "id": "ea3c673e-78c7-41dd-e517-08dae8b36b35", + "titleEn": "No", + "titleAr": "No", + "questionId": "b8f10b10-221c-495d-b99b-6a8094892549", + "sequence": 3, + "image": "null", + "isCorrectOption": true + } + ] + }, + { + "id": "0d60d55f-4067-48f9-9ace-b6309c6a7cf0", + "titleEn": "Do you (or any of your Relatives) have an outside job (employment, position on a board of directors or committee, or other position) that may create a conflict of interest with your employment at the Company inside or outside of the Kingdom of Saudi Arabia?", + "titleAr": "Do you (or any of your Relatives) have an outside job (employment, position on a board of directors or committee, or other position) that may create a conflict of interest with your employment at the Company inside or outside of the Kingdom of Saudi Arabia?", + "marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "questionTypeId": 1, + "questionTime": 10, + "nextQuestGap": 5, + "gapType": 0, + "gapText": null, + "gapImage": "Questions/24dddc50-7583-48b4-9fec-8a490d246191_great-thumbs.gif", + "questOptionsLimit": 0, + "remainingParticipantCount": 0, + "desEn": "If Yes, please provide all related information with required documentation", + "desAr": "If Yes, please provide all related information with required documentation", + "questionOptions": [ + { + "id": "dd0ba127-26ed-4308-e50e-08dae8b36b35", + "titleEn": "Yes", + "titleAr": "Yes", + "questionId": "0d60d55f-4067-48f9-9ace-b6309c6a7cf0", + "sequence": 1, + "image": "null", + "isCorrectOption": false + }, + { + "id": "4748df31-95f0-4fee-e50f-08dae8b36b35", + "titleEn": "No", + "titleAr": "No", + "questionId": "0d60d55f-4067-48f9-9ace-b6309c6a7cf0", + "sequence": 4, + "image": "null", + "isCorrectOption": true + } + ] + }, + { + "id": "489659b0-0400-4b64-8ce2-e6fe48db61db", + "titleEn": "Do you engage in a business that would compete with the Company? Or do you conduct businesses in any of the Company’s activities? Or do you have an interest (ownership, affiliation, employment or position) with an entity that competes with the Company?", + "titleAr": "Do you engage in a business that would compete with the Company? Or do you conduct businesses in any of the Company’s activities? Or do you have an interest (ownership, affiliation, employment or position) with an entity that competes with the Company?", + "marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "questionTypeId": 1, + "questionTime": 10, + "nextQuestGap": 5, + "gapType": 0, + "gapText": null, + "gapImage": "Questions/a9ffa364-231c-4877-824f-84febac51086_thumbs-up-simon-cowell.gif", + "questOptionsLimit": 0, + "remainingParticipantCount": 0, + "desEn": "If Yes, please provide all related information with required documentation", + "desAr": "If Yes, please provide all related information with required documentation", + "questionOptions": [ + { + "id": "7f63cd45-ce2c-417f-e502-08dae8b36b35", + "titleEn": "Yes", + "titleAr": "Yes", + "questionId": "489659b0-0400-4b64-8ce2-e6fe48db61db", + "sequence": 1, + "image": "null", + "isCorrectOption": true + }, + { + "id": "34690bfa-0ffd-453f-e503-08dae8b36b35", + "titleEn": "No", + "titleAr": "No", + "questionId": "489659b0-0400-4b64-8ce2-e6fe48db61db", + "sequence": 2, + "image": "null", + "isCorrectOption": false + } + ] + }, + { + "id": "253fc396-dab9-41ca-82bd-511f98c5dee8", + "titleEn": "Do you have any direct or indirect interest in the businesses and contracts executed for the Company’s account?", + "titleAr": "Do you have any direct or indirect interest in the businesses and contracts executed for the Company’s account?", + "marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "questionTypeId": 1, + "questionTime": 10, + "nextQuestGap": 5, + "gapType": 0, + "gapText": null, + "gapImage": "Questions/012d6493-3612-42c9-8f6f-84417d4736d4_good-job-well-done.gif", + "questOptionsLimit": 0, + "remainingParticipantCount": 0, + "desEn": "If Yes, please provide all related information with required documentation", + "desAr": "If Yes, please provide all related information with required documentation", + "questionOptions": [ + { + "id": "dce4999c-5629-45f4-e4f6-08dae8b36b35", + "titleEn": "Yes", + "titleAr": "Yes", + "questionId": "253fc396-dab9-41ca-82bd-511f98c5dee8", + "sequence": 1, + "image": "null", + "isCorrectOption": false + }, + { + "id": "00913ba1-5ccc-4d7c-e4f7-08dae8b36b35", + "titleEn": "No", + "titleAr": "No", + "questionId": "253fc396-dab9-41ca-82bd-511f98c5dee8", + "sequence": 2, + "image": "null", + "isCorrectOption": false + } + ] + }, + { + "id": "669c4fe2-a3e6-4e29-8c56-ae09efa9ba6c", + "titleEn": "Do you hold 5% or more of the shares of the Company or any other company within its group? Or are you a Relative of who owns such percentage?", + "titleAr": "Do you hold 5% or more of the shares of the Company or any other company within its group? Or are you a Relative of who owns such percentage?", + "marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "questionTypeId": 1, + "questionTime": 10, + "nextQuestGap": 5, + "gapType": 0, + "gapText": null, + "gapImage": "Questions/ca3f32a1-ed9f-45df-b2fb-3d1df78d5651_congrats-14.gif", + "questOptionsLimit": 0, + "remainingParticipantCount": 0, + "desEn": "If Yes, please provide all related information with required documentation", + "desAr": "If Yes, please provide all related information with required documentation", + "questionOptions": [ + { + "id": "597c308e-3f09-4a05-e506-08dae8b36b35", + "titleEn": "Yes", + "titleAr": "Yes", + "questionId": "669c4fe2-a3e6-4e29-8c56-ae09efa9ba6c", + "sequence": 1, + "image": "null", + "isCorrectOption": true + }, + { + "id": "2face927-7c8e-4945-e507-08dae8b36b35", + "titleEn": "No", + "titleAr": "No", + "questionId": "669c4fe2-a3e6-4e29-8c56-ae09efa9ba6c", + "sequence": 2, + "image": "null", + "isCorrectOption": false + } + ] + }, + { + "id": "f91774ce-14f0-4af0-9a77-e649bc013b44", + "titleEn": "Are you a Relative of any of the Board members, or a Relative of any Senior Executive of the Company or any other company within its group?", + "titleAr": "Are you a Relative of any of the Board members, or a Relative of any Senior Executive of the Company or any other company within its group?", + "marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "questionTypeId": 1, + "questionTime": 10, + "nextQuestGap": 5, + "gapType": 0, + "gapText": null, + "gapImage": "Questions/6484c5bc-09fd-4586-8036-67868afbe27b_good-job-well-done.gif", + "questOptionsLimit": 0, + "remainingParticipantCount": 0, + "desEn": "If Yes, please provide all related information with required documentation", + "desAr": "If Yes, please provide all related information with required documentation", + "questionOptions": [ + { + "id": "2f968964-ce91-4478-e512-08dae8b36b35", + "titleEn": "Yes", + "titleAr": "Yes", + "questionId": "f91774ce-14f0-4af0-9a77-e649bc013b44", + "sequence": 1, + "image": "null", + "isCorrectOption": true + }, + { + "id": "4fed9355-2c9f-458d-e513-08dae8b36b35", + "titleEn": "No", + "titleAr": "No", + "questionId": "f91774ce-14f0-4af0-9a77-e649bc013b44", + "sequence": 2, + "image": "null", + "isCorrectOption": false + } + ] + }, + { + "id": "fd3a90e6-5b35-4035-bc1c-4483facaf6d3", + "titleEn": "Do you have any other conflict of interests with your employment in the Company?", + "titleAr": "Do you have any other conflict of interests with your employment in the Company?", + "marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "questionTypeId": 1, + "questionTime": 10, + "nextQuestGap": 5, + "gapType": 0, + "gapText": null, + "gapImage": "Questions/24dddc50-7583-48b4-9fec-8a490d246191_great-thumbs.gif", + "questOptionsLimit": 0, + "remainingParticipantCount": 0, + "desEn": "If Yes, please provide all related information with required documentation", + "desAr": "If Yes, please provide all related information with required documentation", + "questionOptions": [ + { + "id": "9d0743e0-9f3f-48d0-e4fa-08dae8b36b35", + "titleEn": "Yes", + "titleAr": "Yes", + "questionId": "fd3a90e6-5b35-4035-bc1c-4483facaf6d3", + "sequence": 1, + "image": "null", + "isCorrectOption": false + }, + { + "id": "a81eda99-d9ad-49e0-e4fb-08dae8b36b35", + "titleEn": "No", + "titleAr": "No", + "questionId": "fd3a90e6-5b35-4035-bc1c-4483facaf6d3", + "sequence": 2, + "image": "null", + "isCorrectOption": true + } + ] + }, + { + "id": "3a35855d-3ed7-4d45-8864-9135d71378de", + "titleEn": "I have completed the above Conflict of Interests Disclosure Form truthfully and as required by the Company policy.", + "titleAr": "I have completed the above Conflict of Interests Disclosure Form truthfully and as required by the Company policy.", + "marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "questionTypeId": 1, + "questionTime": 10, + "nextQuestGap": 5, + "gapType": 0, + "gapText": null, + "gapImage": "Questions/24dddc50-7583-48b4-9fec-8a490d246191_great-thumbs.gif", + "questOptionsLimit": 0, + "remainingParticipantCount": 0, + "desEn": "If Yes, please provide all related information with required documentation", + "desAr": "If Yes, please provide all related information with required documentation", + "questionOptions": [ + { + "id": "f0766816-837f-47e6-e51a-08dae8b36b35", + "titleEn": "Agree", + "titleAr": "Agree", + "questionId": "3a35855d-3ed7-4d45-8864-9135d71378de", + "sequence": 1, + "image": "null", + "isCorrectOption": false + }, + { + "id": "dc9c68de-afa4-4b63-e51b-08dae8b36b35", + "titleEn": "Disagree", + "titleAr": "Disagree", + "questionId": "3a35855d-3ed7-4d45-8864-9135d71378de", + "sequence": 2, + "image": "null", + "isCorrectOption": false + } + ] + } +] \ No newline at end of file diff --git a/assets/json/disclosure_upcoming.json b/assets/json/disclosure_upcoming.json new file mode 100644 index 0000000..d17b228 --- /dev/null +++ b/assets/json/disclosure_upcoming.json @@ -0,0 +1,47 @@ +{ + "id": "979813be-eafa-4d3e-d27e-08dae8a08a3b", + "titleEn": "Upcoming Disclosure", + "titleAr": "undefined", + "descEn": "Submit disclosure using mobile app", + "descAr": "undefined", + "questionTime": 10, + "winDeciderTime": 30, + "winnersCount": 1, + "questGapTime": 5, + "startTime": "2022-12-28T10:44:41", + "endTime": null, + "marathoneStatusId": 4, + "scheduleTime": "2022-12-28T10:14:41", + "selectedLanguage": 0, + "projects": { + "id": "b1cd3fa3-bb27-422e-a4c1-08dac09254df", + "nameEn": "Cloud Solutions", + "nameAr": "شركة حلول السحابة للاتصالات وتقنية المعلومات", + "projectCode": "CS" + }, + "sponsors": [ + { + "id": "3272b127-b388-4f09-425b-08dac2eb788e", + "nameEn": "Cloud Solutions", + "nameAr": "حل السحابة", + "image": "SponsorImage/b9aed4a8-42b2-45fc-b6f1-47ee0c7b4138_sponsor.jpeg", + "video": "SponsorVideo/9ab678ab-1b4c-4ea4-aaf2-32ce1353d3fe_sample-10s.mp4", + "logo": "SponsorLogo/eb029f0d-bce1-4a61-b0c0-abaa484912a0_sponsor.jpeg", + "videoDuration": null, + "sponsorPrizes": [ + { + "id": "e657a18c-6fb2-4099-07c8-08dae89efcd3", + "marathonPrizeEn": "SAR 500", + "marathonPrizeAr": "SAR 500" + } + ] + } + ], + "questions": null, + "isEmailSent": false, + "totalQuestions": 10, + "cancelReason": null, + "marathonBufferTime": 30, + "currentTime": "2022-12-28T08:03:24.3671803Z", + "displayCorrectAnswer": true +} diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index c59641b..6ecc9f2 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -528,7 +528,7 @@ "noWinner": "حزين! لم يفز أحد اليوم.", "myTeam": "فريقي", "youCanPlayDemo": "لكن يمكنك لعب العرض", - "group" : "مجموعة", + "group": "مجموعة", "searchGroup": "مجموعة البحث", "connectHmgWifi": "قم بتوصيل HMG WIFI", "connectedHmgWifi": "اتصال HMG WIFI", @@ -544,5 +544,42 @@ "addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.", "pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون", "youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني", - "open": "يفتح" + "open": "يفتح", + "disclosure": "الإفصاح", + "groupName": "اسم المجموعة", + "enterGroupNamePlease": "يرجى إدخال اسم المجموعة", + "audioCall": "مكالمة صوتية", + "userSearch": "البحث عن مستخدم", + "shareScreen": "مشاركة الشاشة", + "searchByUserName": "البحث حسب اسم المستخدم", + "manage": "إدارة", + "members": "الأعضاء", + "addUsers": "إضافة مستخدمين", + "areYouSureWantTodelete": "هل أنت متأكد أنك تريد الحذف؟", + "editGroups": "تحرير المجموعات", + "groupMembers": "أعضاء المجموعة", + "manageGroup": "إدارة المجموعة", + "admin": "مسؤول", + "paymentDetails": "تفاصيل الدفع", + "requesterEmpNum": "رقم الموظف الطالب", + "requesterEmpName": "اسم الموظف الطالب", + "prepareEmpName": "اسم الموظف المحضر", + "requesterPositionName": "اسم وظيفة الموظف الطالب", + "preparePositionName": "اسم وظيفة الموظف المحضر", + "requesterPayrollName": "اسم كشف رواتب الموظف الطالب", + "general": "عام", + "payingORGName": "اسم الجهة الدافعة", + "requestAmount": "مبلغ الطلب", + "typeofPayment": "نوع الدفع", + "beneficiaryDetails": "تفاصيل المستفيد", + "beneficiaryName": "اسم المستفيد", + "idIqama": "الهوية/الإقامة", + "beneficiaryBankName": "اسم بنك المستفيد", + "sadadNumber": "رقم سداد", + "beneficiaryIBAN": "رقم الآيبان للمستفيد", + "purchaseOrders": "أوامر الشراء", + "approvalDate": "تاريخ الموافقة", + "versionStatus": "حالة الإصدار", + "supplierNo": "رقم المورد", + "paymentRequest": "طلب الدفع" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 275864f..11983d9 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -563,5 +563,30 @@ "open": "open", "addAtLeastOneAttachment": "Please add at least one attachment.", "pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.", - "youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit." + "youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.", + "disclosure": "Disclosure", + "requesterEmpNum": "Requester Employee Number", + "requesterEmpName": "Requester Employee Name", + "prepareEmpName": "Prepare Employee Name", + "requesterPositionName": "Requester Position Name", + "preparePositionName": "Prepare Position Name", + "requesterPayrollName": "Requester Payroll Name", + "general": "General", + "payingORGName": "Paying Organization Name", + "requestAmount": "Request Amount", + "typeofPayment": "Type of Payment", + "paymentDetails": "Payment Details", + "beneficiaryDetails": "Beneficiary Details", + "beneficiaryName": "Beneficiary Name", + "idIqama": "ID/Iqama", + "beneficiaryBankName": "Beneficiary Bank Name", + "sadadNumber": "SADAD Number", + "beneficiaryIBAN": "Beneficiary IBAN", + "purchaseOrders": "Purchase Orders", + "approvalDate": "Approval Date", + "versionStatus": "Version Status", + "supplierNo": "Supplier Number", + "paymentRequest": "Payment Request", + "pOAmount": "PO Amount" + } \ No newline at end of file diff --git a/lib/api/marathon/demo_marathon_repo.dart b/lib/api/marathon/demo_marathon_repo.dart index 1e53472..a17cd36 100644 --- a/lib/api/marathon/demo_marathon_repo.dart +++ b/lib/api/marathon/demo_marathon_repo.dart @@ -2,6 +2,8 @@ import 'dart:convert'; import 'package:flutter/services.dart'; import 'package:logger/logger.dart' as L; +import 'package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart'; +import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart'; import 'package:mohem_flutter_app/models/marathon/marathon_model.dart'; import 'package:mohem_flutter_app/models/marathon/question_model.dart'; @@ -23,3 +25,22 @@ class DemoMarathonRepo { return currentQuestion; } } + +class DisclosureRepo { + L.Logger logger = L.Logger(); + + Future getDisclosureDetails() async { + String response = await rootBundle.loadString('assets/json/disclosure_upcoming.json'); + var json = jsonDecode(response); + DisclosureDetailsModel marathonDetailModel = DisclosureDetailsModel.fromJson(json); + return marathonDetailModel; + } + + Future getDisclosureNextQuestion({required int currentQuestionNumber}) async { + String response = await rootBundle.loadString('assets/json/disclosure_questions.json'); + List json = jsonDecode(response); + DisclosureQuestionModel currentQuestion = DisclosureQuestionModel.fromJson(json.elementAt(currentQuestionNumber)); + + return currentQuestion; + } +} diff --git a/lib/classes/decorations_helper.dart b/lib/classes/decorations_helper.dart index fd6d4f7..3c87ef2 100644 --- a/lib/classes/decorations_helper.dart +++ b/lib/classes/decorations_helper.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart'; import 'package:mohem_flutter_app/models/marathon/question_model.dart'; class MyDecorations { @@ -36,4 +37,17 @@ class MyDecorations { return getContainersDecoration(MyColors.greyF7Color); } } + + static Decoration getAnswersContainerColorForDisclosure(DisclosureQuestionsOptionStatus questionsOptionStatus) { + switch (questionsOptionStatus) { + case DisclosureQuestionsOptionStatus.correct: + return getContainersDecoration(MyColors.greenColor); + case DisclosureQuestionsOptionStatus.wrong: + return getContainersDecoration(MyColors.redColor); + case DisclosureQuestionsOptionStatus.selected: + return getContainersDecoration(MyColors.blackColor); + case DisclosureQuestionsOptionStatus.unSelected: + return getContainersDecoration(MyColors.greyF7Color); + } + } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 33559e2..4776135 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -24,6 +24,9 @@ import 'package:mohem_flutter_app/ui/login/login_screen.dart'; import 'package:mohem_flutter_app/ui/login/new_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_intro_screen.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_screen.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_waiting_screen.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_intro_screen.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_screen.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_sponsor_video_screen.dart'; @@ -198,6 +201,7 @@ class AppRoutes { static const String manageGroup = "/manageGroup"; static const String groupMembers = "/groupmembers"; static const String groupChatDetailed = "/groupChatDetailed"; + //Marathon static const String marathonIntroScreen = "/marathonIntroScreen"; static const String marathonScreen = "/marathonScreen"; @@ -206,6 +210,13 @@ class AppRoutes { static const String marathonWaitingScreen = "/marathonWaitingScreen"; static const String marathonTutorialScreen = "/marathonTutorialScreen"; + //Disclosure + static const String disclosureIntroScreen = "/disclosureIntroScreen"; + static const String disclosureScreen = "/disclosureScreen"; + static const String disclosureWinnerScreen = "/disclosureWinnerScreen"; + static const String disclosureWaitingScreen = "/disclosureWaitingScreen"; + static const String disclosureTutorialScreen = "/disclosureTutorialScreen"; + static const String unsafeDeviceScreen = "/unsafeDeviceScreen"; static const String appUpdateScreen = "/appUpdateScreen"; @@ -322,6 +333,10 @@ class AppRoutes { marathonSponsorVideoScreen: (BuildContext context) => const SponsorVideoScreen(), marathonWaitingScreen: (BuildContext context) => const MarathonWaitingScreen(), marathonTutorialScreen: (BuildContext context) => const MarathonTutorialViewerScreen(), + // Disclosure + disclosureIntroScreen: (BuildContext context) => DisclosureIntroScreen(), + disclosureScreen: (BuildContext context) => DisclosureScreen(), + disclosureWaitingScreen: (BuildContext context) => const DisclosureWaitingScreen(), unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(), appUpdateScreen: (BuildContext context) => const AppUpdateScreen(), diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 4a0d665..c50597f 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -1,1163 +1,1194 @@ // DO NOT EDIT. This is code generated via package:easy_localization/generate.dart -// ignore_for_file: prefer_single_quotes +// ignore_for_file: prefer_single_quotes, avoid_renaming_method_parameters import 'dart:ui'; import 'package:easy_localization/easy_localization.dart' show AssetLoader; -class CodegenLoader extends AssetLoader { +class CodegenLoader extends AssetLoader{ const CodegenLoader(); @override - Future> load(String fullPath, Locale locale) { + Future?> load(String path, Locale locale) { return Future.value(mapLocales[locale.toString()]); } - static const Map ar_SA = { - "mohemm": "Mohemm", - "english": "English", - "arabic": "عربي", - "login": "تسجيل الدخول", - "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", - "username": "اسم المستخدم", - "password": "كلمة المرور", - "welcomeBack": "مرحبا بعودتك", - "wouldYouLikeToLoginWithCurrentUsername": "هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟", - "lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:", - "verificationType": "نوع التحقق:", - "pleaseVerify": "ارجوك تحقق", - "pleaseVerifyForBio": "الرجاء التحقق من تسجيل الدخول باستخدام أحد هذه الخيارات", - "verifyThroughFace": "تحقق من خلال الوجه", - "verifyThroughFingerprint": "تحقق من خلال بصمة الإصبع", - "verifyThroughSMS": "تحقق من خلال الرسائل القصيرة", - "verifyThroughWhatsapp": "تحقق من خلال Whatsapp", - "useAnotherAccount": "استخدم حسابا آخر", - "pleaseEnterTheVerificationCodeSentTo": "الرجاء إدخال رمز التحقق المرسل إلى ", - "theVerificationCodeWillExpireIn": "ستنتهي صلاحية رمز التحقق في ", - "goodMorning": "صباح الخير", - "markAttendance": "علامة الحضور", - "timeLeftToday": "الوقت المتبقي اليوم", - "checkIn": "تحقق في", - "workList": "قائمة العمل", - "leaveBalance": "رصيد الاجازات", - "missingSwipes": "تسجيل بصمة حضور", - "ticketBalance": "رصيد التذكرة", - "other": "آخر", - "services": "خدمات", - "viewAllServices": "عرض جميع الخدمات", - "monthlyAttendance": "الحضور الشهري", - "vacationRule": "قاعدة الاجازات", - "vacationType": "نوع الاجازة", - "startDateT": "تاريخ البدء", - "endDateT": "تاريخ الانتهاء", - "workFromHome": "العمل من المنزل", - "ticketRequest": "طلب تذكرة", - "viewAllOffers": "مشاهدة جميع العروض", - "offers": "عروض & ", - "discounts": "الخصومات", - "newString": "جديد", - "setTheNewPassword": "قم بتعيين كلمة المرور الجديدة", - "typeYourNewPasswordBelow": "اكتب كلمة المرور الجديدة أدناه", - "typeYourNewActiveDirectoryPasswordBelow": "اكتب كلمة مرور الدليل النشط الجديدة أدناه", - "confirmPassword": "تأكيد كلمة المرور", - "update": "تحديث", - "title": "عنوان", - "home": "الرئيسية", - "mySalary": "راتبي", - "createRequest": "إنشاء طلب", - "forgotPassword": "هل نسيت كلمة السر", - "employeeId": "هوية الموظف", - "loginCodeWillSentToMobileNumber": "الرجاء إدخال معرف الموظف الخاص بك ، وسيتم إرسال رمز تسجيل الدخول إلى رقم هاتفك المحمول", - "changePassword": "تغيير كلمة المرور", - "ok": "موافق", - "confirm": "تؤكد", - "passwordChangedSuccessfully": "تم تغيير الرقم السري بنجاح", - "itemsForSale": "سلع للبيع", - "attendanceDetails": "تفاصيل الحضور", - "order": "الطلبات", - "earlyOut": "الخروج مبكرا", - "shortage": "ساعات التقصير", - "excess": "فائض", - "lateIn": "القدوم المتاخر", - "approvedCheckOut": "اعتماد وقت الخروج", - "approvedCheckIn": "اعتماد وقت الدخول", - "actualCheckOut": "وقت الخروج", - "actualCheckIn": "وقت الدخول", - "present": "حضور", - "pres": "حضور", - "shiftTime": "وقت التناوب", - "absent": "غياب", - "attendance": "الحضور", - "scheduleDays": "ايام العمل", - "offDays": "ايام الراحه", - "nonAnalyzed": "لايوجد تحليل", - "shortageHour": "ساعات التقصير", - "stats": "الحاله", - "completed": "تم اكمال", - "msg": "Hello {} in the {} world ", - "msg_named": "{} are written in the {lang} language", - "clickMe": "Click me", - "doNotUseRecentPassword": "لا تستخدم كلمة مرور حديثة", - "atLeastOneLowercase": "حرف صغير واحد على الأقل", - "atLeastOneUppercase": "حرف كبير واحد على الأقل", - "atLeastOneNumeric": "رقم واحد على الأقل", - "minimum8Characters": "8 أحرف على الأقل", - "doNotAddRepeatingLetters": "لا تقم بإضافة أحرف متكررة", - "itShouldContainSpecialCharacter": "يجب لا يحتوي على أحرف خاصة", - "confirmPasswordMustMatch": "يجب أن يتطابق تأكيد كلمة المرور", - "sms": "رسالة قصيرة", - "fingerPrint": "بصمة", - "face": "التعرف على الوجه", - "whatsapp": "واتس اب", - "reject": "يرفض", - "approve": "يوافق", - "cancel": "إلغاء", - "requestedItems": "العناصر المطلوبة", - "request": "طلب", - "myRequest": "طلبي", - "actions": "أجراءات", - "delegate": "مندوب", - "request_info": "اطلب معلومات", - "attachments": "المرفقات", - "info": "معلومات", - "employeeNumber": "رقم الموظف", - "assignmentNumber": "رقم الواجب", - "employeeName": "اسم الموظف", - "scheduleDate": "تاريخ الجدول الزمني", - "shiftType": "نوع التحول", - "shift": "يحول", - "breakText": "استراحة", - "actualSwipeStart": "بدء التمرير الفعلي", - "actualSwipeEnd": "التمرير الفعلي للنهاية", - "approvedSwipeStart": "وافق انتقاد البدء", - "approvedSwipeStartReason": "تمت الموافقة على سبب بدء التمرير السريع", - "approvedSwipeEnd": "تمت الموافقة على تمرير النهاية", - "approvedSwipeEndReason": "الموافقة على سبب إنهاء التمرير", - "from": "من", - "to": "ل", - "sent": "أرسلت", - "closed": "مغلق", - "id": "هوية شخصية", - "responder": "المستجيب", - "jobTitle": "عنوان وظيفي", - "grade": "درجة", - "jobCategory": "تصنيف الوظيفة", - "category": "فئة", - "employeeEmailAddress": "عنوان البريد الإلكتروني للموظف", - "payrollBranch": "فرع الرواتب", - "yourChangeHasBeenSavedSuccessfully": "تم حفظ التغيير الخاص بك بنجاح", - "code": "شفرة", - "unit": "وحدة", - "quantity": "كمية", - "dateRequired": "التاريخ مطلوب", - "lineStatus": "حالة الخط", - "statusDate": "تاريخ الحالة", - "transactionType": "نوع المعاملة", - "operatingUnit": "وحدة التشغيل", - "organizationCode": "كود المنظمة", - "organization": "منظمة", - "fromSubInventory": "من الجرد الفرعي", - "fromLocator": "من محدد المواقع", - "toSubInventory": "إلى الجرد الفرعي", - "toLocator": "إلى محدد المواقع", - "shipToLocator": "شحن إلى محدد المواقع", - "itemHistory": "تاريخ العنصر", - "mfg": "مبدع", - "lineType": "نوع الخط", - "price": "السعر", - "lineAmount": "مبلغ الخط", - "lineDiscount": "خصم الخط٪", - "needByDate": "القادمة إلى الأمام", - "promisedDate": "التسجيل وعد", - "deliverToLocation": "تسليم إلى الموقع", - "requisitionNumber": "رقم الطلب", - "requester": "مقدم الطلب", - "quotationAnalysis": "تحليل الاقتباس", - "subject": "موضوعات", - "description": "وصف", - "supplier": "المورد", - "site": "موقع", - "buyer": "مشتر", - "preparer": "معد", - "creationDate": "تاريخ الإنشاء", - "shipToLocation": "الشحن الى الموقع", - "quotationNumber": "رقم الإقتباس", - "quotationDate": "تاريخ الاقتباس", - "paymentTerms": "شروط الدفع", - "currency": "عملة", - "grossAmount": "المبلغ الإجمالي", - "discountAmount": "مقدار الخصم", - "customDuty": "الرسوم الجمركية", - "shipHandle": "مقبض السفينة", - "otherCharges": "رسوم أخرى", - "totalPOAmountWithVAT": "إجمالي مبلغ الشراء مع ضريبة القيمة المضافة", - "totalPOAmountInWords": "إجمالي مبلغ أمر الشراء بالكلمات", - "requestNumber": "رقم الطلب", - "uom": "UOM", - "operatingCode": "كود التشغيل", - "poNumber": "PO عدد", - "revision": "مراجعة", - "quantityOrdered": "الكمية المطلوبة", - "quantityReceived": "الكمية المستلمة", - "bonusQuantity": "كمية المكافأة", - "purchasePrice": "سعر الشراء", - "discountPer": "خصم ٪", - "balanceQuantity": "كمية التوازن", - "netPrice": "السعر الصافي", - "closureStatus": "حالة الإغلاق", - "quotationNetPrice": "صافي سعر الاقتباس", - "quotationUOM": "اقتباس UOM", - "quotationQty": "اقتباس الكمية", - "itemCode": "رمز الصنف", - "vendorName": "اسم البائع", - "quotationMFGPartNumber": "رقم الجزء MFG الاقتباس", - "quotationDeliveryDate": "تاريخ تسليم عرض الأسعار", - "quotationBonusQuantity": "كمية مكافأة الاقتباس", - "quotationLineTotal": "مجموع خط الاقتباس", - "rfqUOM": "RFQ UOM", - "rfqQty": "RFQ الكمية", - "rfqNumber": "رقم RFQ", - "human": "بشري", - "resources": "موارد", - "details": "تفاصيل", - "noDataAvailable": "لا تتوافر بيانات", - "productName": "اسم المنتج", - "productDescription": "وصف المنتج", - "unitPrice": "سعر الوحده", - "manufacturerName": "اسم المصنع", - "manufacturerPartName": "اسم جزء الشركة المصنعة", - "supplierName": "اسم المورد", - "supplierContact": "الاتصال بالمورد", - "chargeToPatient": "المسؤول عن المريض", - "justification": "التبرير", - "itemDescription": "وصف السلعة", - "groupCode": "كود المجموعة", - "primaryUOM": "UOM الابتدائية", - "subgroupDescription": "وصف المجموعة الفرعية", - "subgroupCode": "رمز المجموعة الفرعية", - "groupDescription": "وصف المجموعة", - "templateName": "اسم القالب", - "itemCreationStatus": "حالة إنشاء العنصر", - "standardizationApprovalStatus": "حالة الموافقة على التقييس", - "standardizationApprovalRejectionReason": "سبب رفض الموافقة على التقييس", - "analyzedBy": "تحليل بواسطة", - "approvedDate": "تاريخ الموافقة", - "itemType": "نوع العنصر", - "relatedTo": "متعلق ب", - "requestDate": "تاريخ الطلب", - "analyzedDate": "تاريخ التحليل", - "urgent": "العاجلة", - "requestDetails": "طلب تفاصيل", - "approvalLevel": "مستوى الموافقة", - "requesterDetails": "تفاصيل مقدم الطلب", - "myAttendance": "حضوري", - "workOnBreak": "التعويض عن العمل اثناءالاستراحه", - "next": "التالي", - "apply": "يتقدم", - "mobile": "التليفون المحمول", - "completingYear": "نحن نقدر لك لاستكمال خدمة", - "year": "سنة", - "month": "شهر", - "day": "يوم", - "address": "العنوان", - "phoneNumber": "رقم الجوال", - "businessGroup": "مجموعة العمل", - "Payroll": "الراتب", - "civilIdentityNumber": "رقم الهويه", - "dateOfBirth": "تاريخ الميلاد", - "maritalStatus ": "الحالة الاجتماعية", - "fullName": "الأسم الكامل", - "remove": "حذف", - "submit": "ارسال", - "areYouSureYouWantToSubmit": "هل أنت متأكد أنك تريد أن تقدم؟", - "comments": "تعليقات", - "writeComment": "أكتب تعليقا", - "approversList": "قائمة الموافقين", - "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات", - "monthlyPaySlip": "قسيمة الراتب الشهرية", - "particular": "خاص", - "earnings": "أرباح", - "deductions": "الخصومات", - "paymentMethodName": "اسم طريقة الدفع", - "bankName": "اسم البنك", - "branchCode": "رمز الفرع", - "accountNo": "رقم الحساب", - "summaryOfInformation": "ملخص المعلومات", - "totalPayAmount": "المبلغ الإجمالي للدفع", - "paymentInformation": "معلومات الدفع", - "performance": "تقييم الاداء", - "performanceEvaluation": "تقييم الأداء في", - "performanceEvaluationIn": "تقييم أدائك في", - "valuationIn": "تقييم الأداء في", - "amount": "مقدار", - "correctCurrentDatails": "تعديل او اكمال التفاصيل الحالية", - "selectType": " حدد نوع التغيير الذي تريد القيام به", - "enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية", - "endDate": "تاريخ الانتهاء", - "removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟", - "wantUpdateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟", - "addNewFamilyMember": "اضافة عضو جديد", - "addRow": "اضافة صف جديد", - "pleaseSelect": "الرجاء اختيار", - "delete": "حذف", - "edit": "تعديل", - "add": "اضافه", - "myProfile": "معلوماتي", - "mowadhafhi": "موظفي", - "searchAnnouncements": "بحث الاعلانات", - "announcements": "اعلانات", - "swipeRequest": "طلب تسجيل حضور", - "serviceType": "نوع الخدمه", - "departmentName": "اسم القسم", - "selectDepartment": "اختر القسم", - "relatedSection": "قسم ذو صله", - "selectSection": "اختيار القسم", - "relatedTopic": "عنوان ذو صله", - "selectTopic": "اختر العنوان", - "supportingDocument": "ارفاق مستند", - "mowadhafhiRequest": "طلب موظفي", - "ticketReference": "مرجع التذكره", - "section": "القسم", - "topic": "العنوان", - "actionBy": "الرد بواسطة", - "pending": "معلق", - "pendingTransactions": "المعاملات المعلقه", - "selectRequestType": "الرجاء اختيار نوع الطلب", - "dateFrom": "من تاريخ", - "dateTo": "الى تاريخ", - "requestName": "اسم الطلب", - "createdFor": "انشاء لأجل", - "requestCreatedSuccessfully": "تم انشاء الطلب بنجاح", - "search": "بحث", - "wantToReject": "هل انت متأكد تريد الرفض", - "requestType": "نوع الطلب", - "employeeDigitalID": "هويةالموظف الرقمية", - "businessCard": "بطاقة العمل", - "viewBusinessCard": "عرض بطاقة العمل", - "logout": "تسجيل خروج", - "checkOut": "وقت الخروج", - "regular": "منتظم", - "mark": "علامة", - "selectMethodOfAttendance": "اختر طريقة تسجيل الحضور", - "comeNearHMGWifi": "HMG wifi من فضلك اقترب من", - "deliverNotificationToMeRegardless": "تسليم الإخطارات إلي بغض النظر عن أي قواعد عامة", - "close": "أغلق", - "respond": "يرد", - "vacationRuleAdded": "تمت إضافة قاعدة الإجازة", - "selectTypeT": "اختر صنف", - "notification": "تنبيه", - "selectNotification": "حدد إعلام", - "ifAllSelectedYouWillSkip": "* إذا تم تحديد الكل ، فستنتقل إلى الخطوة 3", - "applyForVacationRule": "التقدم بطلب للحصول على قانون الإجازة", - "step1": "الخطوة 1", - "step2": "الخطوة 2", - "step3": "الخطوه 3", - "message": "رسالة", - "writeAMessage": "اكتب رسالة", - "notificationReassign": "إعادة تعيين الإخطار", - "selectEmployee": "حدد الموظف", - "searchEmployeeForReplacement": "ابحث عن موظف بديل", - "searchForEmployee": "ابحث عن موظف", - "pleaseSpecifyEndTime": "الرجاء تحديد وقت الانتهاء", - "pleaseSelectNotificationReassign": "يرجى تحديد إعادة تعيين الإخطار", - "pleaseSelectEmployeeForReplacement": "الرجاء تحديد موظف للاستبدال", - "pleaseSelectAction": "الرجاء تحديد الإجراء", - "pleaseSelectDate": "الرجاء تحديد التاريخ", - "todayAttendance": "حضور اليوم", - "viewAttendance": "عرض الحضور", - "teamMembers": "اعضاءالفريق", - "profileDetails": "الملف الشخصي", - "noResultsFound": "لايوجد نتائج", - "searchBy": "بحث بواسطة", - "myTeamMembers": "اعضاء فريقي", - "save": "حفظ", - "TurnNotificationsFor": "تفعيل الاشعارات", - "worklistSettings": "اعدادات الاشعارات", - "absenceType": "نوع الغياب", - "absenceCategory": "فئة الغياب", - "days": "أيام", - "hours": "ساعات", - "approvalStatus": "حالة القبول", - "absenceStatus": "حالة الغياب", - "subordinateLeave": "إجازة التابعيين", - "numberDays": "عدد الأيام", - "poweredBy": "مشغل بواسطة", - "cloudSolutions": "حلول السحابة", - "selectTemplate": "حدد قالب", - "myPostedAds": "إعلاناتي المنشورة", - "browseCategories": "تصفح الفئات", - "searchItems": "عناصر البحث", - "offerAndDiscounts": "العروض والخصومات", - "offerValid": "العرض صالح", - "offerExpired": "انتهى العرض", - "whatAreYouOffering": "ما الذي تعرضه؟", - "selectCategory": "اختر الفئة", - "inProgress": "في تَقَدم", - "locked": "مقفل", - "addDetails": "أضف التفاصيل", - "reviewAndSell": "مراجعة وبيع", - "itemTitle": "عنوان البند", - "itemCondition": "حالة السلعة", - "used": "تستخدم", - "region": "منطقة", - "selectRegion": "اختر المنطقة", - "itemPrice": "سعر السلعة", - "itemPhotos": "صور البند", - "itemInfo": "معلومات العنصر", - "uploadAttachment": "تحميل المرفق", - "selectFromGalleryOrOpenCamera": "اختر من المعرض أو فتح الكاميرا", - "openCamera": "فتح\nالكاميرا", - "uploadFromGallery": "تحميل من\nملفات الجهاز", - "name": "الأسم", - "email": "ايميل", - "noHistoryAvailable": "لايوجد سجل بيانات سابقة ", - "purchaseRequisition": "طلب شراء", - "moveOrder": "طلب تغيير", - "humanResource": "الموارد البشريه", - "purchaseOrder": "امر شراء", - "ITGForms": "ITG نماذج", - "itemCreation": "أنشاء عنصر", - "stamp": "ختم", - "addFavoriteList": "هل تريد اضافة {name} لقائمة المفضله", - "feedbackUserExperience": "هذا للحصول على تعليقات حول تجربة المستخدم", - "rateUI": "كيف تريد أن تقيم", - "rateUI2": "ما مدى رضائك عن هذا التطبيق", - "submitSurvey": "ارسال الاستبيان", - "typeHere": "اكتب هنا", - "infoDetail": "تفاصيل المعلومات", - "amount_detail": "تفاصيل المبلغ", - "currentBalance": "الرصيد الحالي", - "currentLeaveBalance": "رصيد الاجازات الحالي", - "calculatedDays": "الايام المحسوبه", - "totalDays": "مجموع الأيام", - "usedBalance": "المستخدم", - "infants": "رضيع", - "child": "طفل", - "adult": "بالغ", - "updateMember": "هل انت متأكد تريد تحديث بيانات هذا العضو؟", - "fieldIsEmpty": "'{data}' الحقل فارغ. الرجاء التحديد", - "pleaseEnterComments": "الرجاء إدخال التعليقات", - "skip": "يتخطى", - "typeCurrentPasswordBelow": "اكتب كلمة المرور الحاليه", - "currentPassword": "كلمة المرور الحاليه", - "concurrentReports": "التقارير المتزامنه", - "EnterNewAddressMoved": "أدخل عنوان جديد إذا كنت قد انتقلت", - "CorrectAddress": "تصحيح أو تعديل هذا العنوان", - "SelectChangeWantToMake": " حدد نوع التغيير الذي تريد القيام به.", - "profile": { - "reset_password": {"label": "Reset Password", "username": "Username", "password": "password"}, - "profileCompletionPer": "استكمال الملف الشخصي", - "completeProfile": "الملف الشخصي الكامل", - "personalInformation": "معلومات شخصية", - "basicDetails": "تفاصيل أساسية", - "address": "العنوان", - "contactDetails": "بيانات التواصل", - "familyDetails": "تفاصيل عائلية", - "effectiveDate": "تاريخ النفاذ", - "country": "دولة" - }, - "clicked": { - "zero": "You clicked {} times!", - "one": "You clicked {} time!", - "two": "You clicked {} times!", - "few": "You clicked {} times!", - "many": "You clicked {} times!", - "other": "You clicked {} times!" + static const Map ar_SA = { + "mohemm": "Mohemm", + "english": "English", + "arabic": "عربي", + "login": "تسجيل الدخول", + "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", + "username": "اسم المستخدم", + "password": "كلمة المرور", + "welcomeBack": "مرحبا بعودتك", + "wouldYouLikeToLoginWithCurrentUsername": "هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟", + "lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:", + "verificationType": "نوع التحقق:", + "pleaseVerify": "ارجوك تحقق", + "pleaseVerifyForBio": "الرجاء التحقق من تسجيل الدخول باستخدام أحد هذه الخيارات", + "verifyThroughFace": "تحقق من خلال الوجه", + "verifyThroughFingerprint": "تحقق من خلال بصمة الإصبع", + "verifyThroughSMS": "تحقق من خلال الرسائل القصيرة", + "verifyThroughWhatsapp": "تحقق من خلال Whatsapp", + "useAnotherAccount": "استخدم حسابا آخر", + "pleaseEnterTheVerificationCodeSentTo": "الرجاء إدخال رمز التحقق المرسل إلى ", + "theVerificationCodeWillExpireIn": "ستنتهي صلاحية رمز التحقق في ", + "goodMorning": "صباح الخير", + "markAttendance": "علامة الحضور", + "timeLeftToday": "الوقت المتبقي اليوم", + "checkIn": "تحقق في", + "workList": "قائمة العمل", + "leaveBalance": "رصيد الاجازات", + "missingSwipes": "تسجيل بصمة حضور", + "ticketBalance": "رصيد التذكرة", + "other": "آخر", + "services": "خدمات", + "viewAllServices": "عرض جميع الخدمات", + "monthlyAttendance": "الحضور الشهري", + "vacationRule": "قاعدة الاجازات", + "vacationType": "نوع الاجازة", + "startDateT": "تاريخ البدء", + "endDateT": "تاريخ الانتهاء", + "workFromHome": "العمل من المنزل", + "ticketRequest": "طلب تذكرة", + "viewAllOffers": "مشاهدة جميع العروض", + "offers": "عروض & ", + "discounts": "الخصومات", + "newString": "جديد", + "setTheNewPassword": "قم بتعيين كلمة المرور الجديدة", + "typeYourNewPasswordBelow": "اكتب كلمة المرور الجديدة أدناه", + "typeYourNewActiveDirectoryPasswordBelow": "اكتب كلمة مرور الدليل النشط الجديدة أدناه", + "confirmPassword": "تأكيد كلمة المرور", + "update": "تحديث", + "title": "عنوان", + "home": "الرئيسية", + "mySalary": "راتبي", + "createRequest": "إنشاء طلب", + "forgotPassword": "هل نسيت كلمة السر", + "employeeId": "هوية الموظف", + "loginCodeWillSentToMobileNumber": "الرجاء إدخال معرف الموظف الخاص بك ، وسيتم إرسال رمز تسجيل الدخول إلى رقم هاتفك المحمول", + "changePassword": "تغيير كلمة المرور", + "ok": "موافق", + "confirm": "تؤكد", + "passwordChangedSuccessfully": "تم تغيير الرقم السري بنجاح", + "itemsForSale": "سلع للبيع", + "attendanceDetails": "تفاصيل الحضور", + "order": "الطلبات", + "earlyOut": "الخروج مبكرا", + "shortage": "ساعات التقصير", + "excess": "فائض", + "lateIn": "القدوم المتاخر", + "approvedCheckOut": "اعتماد وقت الخروج", + "approvedCheckIn": "اعتماد وقت الدخول", + "actualCheckOut": "وقت الخروج", + "actualCheckIn": "وقت الدخول", + "present": "حضور", + "pres": "حضور", + "shiftTime": "وقت التناوب", + "absent": "غياب", + "attendance": "الحضور", + "scheduleDays": "ايام العمل", + "offDays": "ايام الراحه", + "nonAnalyzed": "لايوجد تحليل", + "shortageHour": "ساعات التقصير", + "stats": "الحاله", + "completed": "تم اكمال", + "msg": "Hello {} in the {} world ", + "msg_named": "{} are written in the {lang} language", + "clickMe": "Click me", + "doNotUseRecentPassword": "لا تستخدم كلمة مرور حديثة", + "atLeastOneLowercase": "حرف صغير واحد على الأقل", + "atLeastOneUppercase": "حرف كبير واحد على الأقل", + "atLeastOneNumeric": "رقم واحد على الأقل", + "minimum8Characters": "8 أحرف على الأقل", + "doNotAddRepeatingLetters": "لا تقم بإضافة أحرف متكررة", + "itShouldContainSpecialCharacter": "يجب لا يحتوي على أحرف خاصة", + "confirmPasswordMustMatch": "يجب أن يتطابق تأكيد كلمة المرور", + "sms": "رسالة قصيرة", + "fingerPrint": "بصمة", + "face": "التعرف على الوجه", + "whatsapp": "واتس اب", + "reject": "يرفض", + "approve": "يوافق", + "cancel": "إلغاء", + "generate": "يولد", + "requestedItems": "العناصر المطلوبة", + "request": "طلب", + "myRequest": "طلبي", + "actions": "أجراءات", + "delegate": "مندوب", + "request_info": "اطلب معلومات", + "attachments": "المرفقات", + "info": "معلومات", + "employeeNumber": "رقم الموظف", + "assignmentNumber": "رقم الواجب", + "employeeName": "اسم الموظف", + "scheduleDate": "تاريخ الجدول الزمني", + "shiftType": "نوع التحول", + "shift": "يحول", + "breakText": "استراحة", + "actualSwipeStart": "بدء التمرير الفعلي", + "actualSwipeEnd": "التمرير الفعلي للنهاية", + "approvedSwipeStart": "وافق انتقاد البدء", + "approvedSwipeStartReason": "تمت الموافقة على سبب بدء التمرير السريع", + "approvedSwipeEnd": "تمت الموافقة على تمرير النهاية", + "approvedSwipeEndReason": "الموافقة على سبب إنهاء التمرير", + "from": "من", + "to": "ل", + "sent": "أرسلت", + "closed": "مغلق", + "id": "هوية شخصية", + "responder": "المستجيب", + "jobTitle": "عنوان وظيفي", + "grade": "درجة", + "jobCategory": "تصنيف الوظيفة", + "category": "فئة", + "employeeEmailAddress": "عنوان البريد الإلكتروني للموظف", + "payrollBranch": "فرع الرواتب", + "yourChangeHasBeenSavedSuccessfully": "تم حفظ التغيير الخاص بك بنجاح", + "code": "شفرة", + "unit": "وحدة", + "quantity": "كمية", + "dateRequired": "التاريخ مطلوب", + "lineStatus": "حالة الخط", + "statusDate": "تاريخ الحالة", + "transactionType": "نوع المعاملة", + "operatingUnit": "وحدة التشغيل", + "organizationCode": "كود المنظمة", + "organization": "منظمة", + "fromSubInventory": "من الجرد الفرعي", + "fromLocator": "من محدد المواقع", + "toSubInventory": "إلى الجرد الفرعي", + "toLocator": "إلى محدد المواقع", + "shipToLocator": "شحن إلى محدد المواقع", + "itemHistory": "تاريخ العنصر", + "mfg": "مبدع", + "lineType": "نوع الخط", + "price": "السعر", + "lineAmount": "مبلغ الخط", + "lineDiscount": "خصم الخط٪", + "needByDate": "القادمة إلى الأمام", + "promisedDate": "التسجيل وعد", + "deliverToLocation": "تسليم إلى الموقع", + "requisitionNumber": "رقم الطلب", + "requester": "مقدم الطلب", + "quotationAnalysis": "تحليل الاقتباس", + "subject": "موضوعات", + "description": "وصف", + "supplier": "المورد", + "site": "موقع", + "buyer": "مشتر", + "preparer": "معد", + "creationDate": "تاريخ الإنشاء", + "shipToLocation": "الشحن الى الموقع", + "quotationNumber": "رقم الإقتباس", + "quotationDate": "تاريخ الاقتباس", + "paymentTerms": "شروط الدفع", + "currency": "عملة", + "grossAmount": "المبلغ الإجمالي", + "discountAmount": "مقدار الخصم", + "customDuty": "الرسوم الجمركية", + "shipHandle": "مقبض السفينة", + "otherCharges": "رسوم أخرى", + "totalPOAmountWithVAT": "إجمالي مبلغ الشراء مع ضريبة القيمة المضافة", + "totalPOAmountInWords": "إجمالي مبلغ أمر الشراء بالكلمات", + "requestNumber": "رقم الطلب", + "uom": "UOM", + "operatingCode": "كود التشغيل", + "poNumber": "PO عدد", + "revision": "مراجعة", + "quantityOrdered": "الكمية المطلوبة", + "quantityReceived": "الكمية المستلمة", + "bonusQuantity": "كمية المكافأة", + "purchasePrice": "سعر الشراء", + "discountPer": "خصم ٪", + "balanceQuantity": "كمية التوازن", + "netPrice": "السعر الصافي", + "closureStatus": "حالة الإغلاق", + "quotationNetPrice": "صافي سعر الاقتباس", + "quotationUOM": "اقتباس UOM", + "quotationQty": "اقتباس الكمية", + "itemCode": "رمز الصنف", + "vendorName": "اسم البائع", + "quotationMFGPartNumber": "رقم الجزء MFG الاقتباس", + "quotationDeliveryDate": "تاريخ تسليم عرض الأسعار", + "quotationBonusQuantity": "كمية مكافأة الاقتباس", + "quotationLineTotal": "مجموع خط الاقتباس", + "rfqUOM": "RFQ UOM", + "rfqQty": "RFQ الكمية", + "rfqNumber": "رقم RFQ", + "human": "بشري", + "resources": "موارد", + "details": "تفاصيل", + "noDataAvailable": "لا تتوافر بيانات", + "productName": "اسم المنتج", + "productDescription": "وصف المنتج", + "unitPrice": "سعر الوحده", + "manufacturerName": "اسم المصنع", + "manufacturerPartName": "اسم جزء الشركة المصنعة", + "supplierName": "اسم المورد", + "supplierContact": "الاتصال بالمورد", + "chargeToPatient": "المسؤول عن المريض", + "justification": "التبرير", + "itemDescription": "وصف السلعة", + "groupCode": "كود المجموعة", + "primaryUOM": "UOM الابتدائية", + "subgroupDescription": "وصف المجموعة الفرعية", + "subgroupCode": "رمز المجموعة الفرعية", + "groupDescription": "وصف المجموعة", + "templateName": "اسم القالب", + "itemCreationStatus": "حالة إنشاء العنصر", + "standardizationApprovalStatus": "حالة الموافقة على التقييس", + "standardizationApprovalRejectionReason": "سبب رفض الموافقة على التقييس", + "analyzedBy": "تحليل بواسطة", + "approvedDate": "تاريخ الموافقة", + "itemType": "نوع العنصر", + "relatedTo": "متعلق ب", + "requestDate": "تاريخ الطلب", + "analyzedDate": "تاريخ التحليل", + "urgent": "العاجلة", + "requestDetails": "طلب تفاصيل", + "approvalLevel": "مستوى الموافقة", + "requesterDetails": "تفاصيل مقدم الطلب", + "myAttendance": "حضوري", + "workOnBreak": "التعويض عن العمل اثناءالاستراحه", + "next": "التالي", + "apply": "يتقدم", + "mobile": "التليفون المحمول", + "completingYear": "نحن نقدر لك لاستكمال خدمة", + "year": "سنة", + "month": "شهر", + "day": "يوم", + "address": "العنوان", + "phoneNumber": "رقم الجوال", + "businessGroup": "مجموعة العمل", + "Payroll": "الراتب", + "civilIdentityNumber": "رقم الهويه", + "dateOfBirth": "تاريخ الميلاد", + "maritalStatus ": "الحالة الاجتماعية", + "fullName": "الأسم الكامل", + "remove": "حذف", + "submit": "ارسال", + "areYouSureYouWantToSubmit": "هل أنت متأكد أنك تريد أن تقدم؟", + "comments": "تعليقات", + "writeComment": "أكتب تعليقا", + "approversList": "قائمة الموافقين", + "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات", + "monthlyPaySlip": "قسيمة الراتب الشهرية", + "particular": "خاص", + "earnings": "أرباح", + "deductions": "الخصومات", + "paymentMethodName": "اسم طريقة الدفع", + "bankName": "اسم البنك", + "branchCode": "رمز الفرع", + "accountNo": "رقم الحساب", + "summaryOfInformation": "ملخص المعلومات", + "totalPayAmount": "المبلغ الإجمالي للدفع", + "paymentInformation": "معلومات الدفع", + "performance": "تقييم الاداء", + "performanceEvaluation": "تقييم الأداء في", + "performanceEvaluationIn": "تقييم أدائك في", + "valuationIn": "تقييم الأداء في", + "amount": "مقدار", + "correctCurrentDatails": "تعديل او اكمال التفاصيل الحالية", + "selectType": " حدد نوع التغيير الذي تريد القيام به", + "enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية", + "endDate": "تاريخ الانتهاء", + "removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟", + "wantUpdateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟", + "addNewFamilyMember": "اضافة عضو جديد", + "addRow": "اضافة صف جديد", + "pleaseSelect": "الرجاء اختيار", + "delete": "حذف", + "edit": "تعديل", + "add": "اضافه", + "myProfile": "معلوماتي", + "mowadhafhi": "موظفي", + "searchAnnouncements": "بحث الاعلانات", + "announcements": "اعلانات", + "swipeRequest": "طلب تسجيل حضور", + "serviceType": "نوع الخدمه", + "departmentName": "اسم القسم", + "selectDepartment": "اختر القسم", + "relatedSection": "قسم ذو صله", + "selectSection": "اختيار القسم", + "relatedTopic": "عنوان ذو صله", + "selectTopic": "اختر العنوان", + "supportingDocument": "ارفاق مستند", + "mowadhafhiRequest": "طلب موظفي", + "ticketReference": "مرجع التذكره", + "section": "القسم", + "topic": "العنوان", + "actionBy": "الرد بواسطة", + "pending": "معلق", + "pendingTransactions": "المعاملات المعلقه", + "selectRequestType": "الرجاء اختيار نوع الطلب", + "dateFrom": "من تاريخ", + "dateTo": "الى تاريخ", + "requestName": "اسم الطلب", + "createdFor": "انشاء لأجل", + "requestCreatedSuccessfully": "تم انشاء الطلب بنجاح", + "search": "بحث", + "wantToReject": "هل انت متأكد تريد الرفض", + "requestType": "نوع الطلب", + "employeeDigitalID": "هويةالموظف الرقمية", + "businessCard": "بطاقة العمل", + "viewBusinessCard": "عرض بطاقة العمل", + "logout": "تسجيل خروج", + "checkOut": "وقت الخروج", + "regular": "منتظم", + "mark": "علامة", + "selectMethodOfAttendance": "اختر طريقة تسجيل الحضور", + "comeNearHMGWifi": "HMG wifi من فضلك اقترب من", + "deliverNotificationToMeRegardless": "تسليم الإخطارات إلي بغض النظر عن أي قواعد عامة", + "close": "أغلق", + "respond": "يرد", + "vacationRuleAdded": "تمت إضافة قاعدة الإجازة", + "selectTypeT": "اختر صنف", + "notification": "تنبيه", + "selectNotification": "حدد إعلام", + "ifAllSelectedYouWillSkip": "* إذا تم تحديد الكل ، فستنتقل إلى الخطوة 3", + "applyForVacationRule": "التقدم بطلب للحصول على قانون الإجازة", + "step1": "الخطوة 1", + "step2": "الخطوة 2", + "step3": "الخطوه 3", + "message": "رسالة", + "writeAMessage": "اكتب رسالة", + "notificationReassign": "إعادة تعيين الإخطار", + "selectEmployee": "حدد الموظف", + "searchEmployeeForReplacement": "ابحث عن موظف بديل", + "searchForEmployee": "ابحث عن موظف", + "pleaseSpecifyEndTime": "الرجاء تحديد وقت الانتهاء", + "pleaseSelectNotificationReassign": "يرجى تحديد إعادة تعيين الإخطار", + "pleaseSelectEmployeeForReplacement": "الرجاء تحديد موظف للاستبدال", + "pleaseSelectAction": "الرجاء تحديد الإجراء", + "pleaseSelectDate": "الرجاء تحديد التاريخ", + "todayAttendance": "حضور اليوم", + "viewAttendance": "عرض الحضور", + "teamMembers": "اعضاءالفريق", + "profileDetails": "الملف الشخصي", + "noResultsFound": "لايوجد نتائج", + "searchBy": "بحث بواسطة", + "myTeamMembers": "اعضاء فريقي", + "save": "حفظ", + "TurnNotificationsFor": "تفعيل الاشعارات", + "worklistSettings": "اعدادات الاشعارات", + "absenceType": "نوع الغياب", + "absenceCategory": "فئة الغياب", + "days": "أيام", + "hours": "ساعات", + "approvalStatus": "حالة القبول", + "absenceStatus": "حالة الغياب", + "subordinateLeave": "إجازة التابعيين", + "numberDays": "عدد الأيام", + "poweredBy": "مشغل بواسطة", + "cloudSolutions": "حلول السحابة", + "selectTemplate": "حدد قالب", + "myPostedAds": "إعلاناتي المنشورة", + "browseCategories": "تصفح الفئات", + "searchItems": "عناصر البحث", + "offerAndDiscounts": "العروض والخصومات", + "offerValid": "العرض صالح", + "offerExpired": "انتهى العرض", + "whatAreYouOffering": "ما الذي تعرضه؟", + "selectCategory": "اختر الفئة", + "inProgress": "في تَقَدم", + "locked": "مقفل", + "addDetails": "أضف التفاصيل", + "reviewAndSell": "مراجعة وبيع", + "itemTitle": "عنوان البند", + "itemCondition": "حالة السلعة", + "used": "تستخدم", + "region": "منطقة", + "selectRegion": "اختر المنطقة", + "itemPrice": "سعر السلعة", + "itemPhotos": "صور البند", + "itemInfo": "معلومات العنصر", + "uploadAttachment": "تحميل المرفق", + "selectFromGalleryOrOpenCamera": "اختر من المعرض أو فتح الكاميرا", + "openCamera": "فتح\nالكاميرا", + "uploadFromGallery": "تحميل من\nملفات الجهاز", + "name": "الأسم", + "email": "ايميل", + "noHistoryAvailable": "لايوجد سجل بيانات سابقة ", + "purchaseRequisition": "طلب شراء", + "moveOrder": "طلب تغيير", + "humanResource": "الموارد البشريه", + "purchaseOrder": "امر شراء", + "ITGForms": "ITG نماذج", + "itemCreation": "أنشاء عنصر", + "stamp": "ختم", + "addFavoriteList": "هل تريد اضافة {name} لقائمة المفضله", + "feedbackUserExperience": "هذا للحصول على تعليقات حول تجربة المستخدم", + "rateUI": "كيف تريد أن تقيم", + "rateUI2": "ما مدى رضائك عن هذا التطبيق", + "submitSurvey": "ارسال الاستبيان", + "typeHere": "اكتب هنا", + "infoDetail": "تفاصيل المعلومات", + "amount_detail": "تفاصيل المبلغ", + "currentBalance": "الرصيد الحالي", + "currentLeaveBalance": "رصيد الاجازات الحالي", + "calculatedDays": "الايام المحسوبه", + "totalDays": "مجموع الأيام", + "usedBalance": "المستخدم", + "infants": "رضيع", + "child": "طفل", + "adult": "بالغ", + "updateMember": "هل انت متأكد تريد تحديث بيانات هذا العضو؟", + "fieldIsEmpty": "'{data}' الحقل فارغ. الرجاء التحديد", + "pleaseEnterComments": "الرجاء إدخال التعليقات", + "skip": "يتخطى", + "typeCurrentPasswordBelow": "اكتب كلمة المرور الحاليه", + "currentPassword": "كلمة المرور الحاليه", + "concurrentReports": "التقارير المتزامنه", + "EnterNewAddressMoved": "أدخل عنوان جديد إذا كنت قد انتقلت", + "CorrectAddress": "تصحيح أو تعديل هذا العنوان", + "SelectChangeWantToMake": " حدد نوع التغيير الذي تريد القيام به.", + "profile": { + "reset_password": { + "label": "Reset Password", + "username": "Username", + "password": "password" }, - "gender": { - "male": "Hi man ;) ", - "female": "Hello girl :)", - "with_arg": {"male": "Hi man ;) {}", "female": "Hello girl :) {}"} + "profileCompletionPer": "استكمال الملف الشخصي", + "completeProfile": "الملف الشخصي الكامل", + "personalInformation": "معلومات شخصية", + "basicDetails": "تفاصيل أساسية", + "address": "العنوان", + "contactDetails": "بيانات التواصل", + "familyDetails": "تفاصيل عائلية", + "effectiveDate": "تاريخ النفاذ", + "country": "دولة" + }, + "clicked": { + "zero": "You clicked {} times!", + "one": "You clicked {} time!", + "two": "You clicked {} times!", + "few": "You clicked {} times!", + "many": "You clicked {} times!", + "other": "You clicked {} times!" + }, + "gender": { + "male": "Hi man ;) ", + "female": "Hello girl :)", + "with_arg": { + "male": "Hi man ;) {}", + "female": "Hello girl :) {}" + } + }, + "reset_locale": "إعادة ضبط اللغة", + "chat": "دردشة", + "mychats": "دردشاتي", + "advancedSearch": "بحث متقدم", + "openNot": "التبليغات المفتوحة", + "fyi": "تبليغات للعلم", + "toDo": "تبليغات الأعمال", + "all": "كل التبليغات", + "meNot": "تبليغات صادرة مني", + "view": "عرض", + "fromUserName": "من", + "sentDate": "تاريخ الإرسال", + "itemTypeDisplayName": "اسم العرض", + "none": "بدون", + "createNewChat": "إنشاء محادثة جديدة", + "brainMarathon": "ماراثون الدماغ", + "contestTopicAbout": "سيكون موضوع المسابقة حول:", + "gameDate": "تاريخ اللعبة:", + "gameTime": "وقت اللعب:", + "joinMarathon": "انضم إلى ماراثون", + "joinDemoMarathon": "انضم إلى الماراثون التجريبي", + "demo": "تجريبي", + "minutes": "الدقائق", + "seconds": "ثواني", + "note": "ملحوظة:", + "demoMarathonNoteP1": "يمكنك لعب ماراثون العرض لتتعلم كيف يعمل. يمكنك الانضمام إلى ماراثون", + "demoMarathonNoteP2": "خمس دقائق", + "demoMarathonNoteP3": "قبل الوقت الفعلي.", + "sponsoredBy": "برعاية:", + "question": "سؤال", + "marathoners": "الماراثون", + "marathoner": "ماراثونر", + "prize": "جائزة:", + "winnerSelection": "اختيار الفائز", + "qualifiers": "تصفيات", + "qualifier": "المؤهل", + "getReadyForContest": "استعد للمسابقة القادمة:", + "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.", + "fingersCrossed": "تشابك الاصابع!!!", + "congrats": "مبروك !!!", + "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح.", + "otp": "OTP", + "verification": "تَحَقّق", + "resend": "إعادة إرسال", + "codeExpire": "انتهت صلاحية رمز التحقق", + "typeheretoreply": "اكتب هنا للرد", + "favorite": "مفضلتي", + "searchfromchat": "البحث من الدردشة", + "yourAnswerCorrect": "إجابتك صحيحة", + "youMissedTheQuestion": "نفد منك الوقت. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.", + "wrongAnswer": "إجابتك غير صحيحة. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.", + "oops": "أوه!!!", + "winner": "الفائز", + "youWantToLeaveMarathon": "هل أنت متأكد أنك تريد العودة؟ سوف تخرج من المسابقة.", + "ourSponsor": "راعينا:", + "startingIn": "يبدأ في", + "youAreOutOfContest": "أنت خارج المسابقة.", + "winners": "الفائزين!!!", + "expireAfter": "تنتهي بعد", + "oneWeek": "أسبوع 1", + "twoWeek": "2 أسبوع", + "noUpcoming": "لا يوجد قادم", + "fakeLocation": ".لقد تتبعنا أنك تحاول استخدام موقع مزيف! يعتبر هذا مخالفة وقد تم إخطار الموارد البشرية", + "noWinner": "حزين! لم يفز أحد اليوم.", + "myTeam": "فريقي", + "youCanPlayDemo": "لكن يمكنك لعب العرض", + "group": "مجموعة", + "searchGroup": "مجموعة البحث", + "connectHmgWifi": "قم بتوصيل HMG WIFI", + "connectedHmgWifi": "اتصال HMG WIFI", + "itgForms": "نماذج (ITG)", + "resetAdPassword": "إعادة تعيين كلمة مرور AD", + "myDocuments": "مستنداتي", + "requiredDocuments": "المستندات المطلوبة", + "optionalDocuments": "المستندات الاختيارية", + "allDocuments": "كافة المستندات", + "expiredDocuments": "المستندات منتهية الصلاحية", + "missingDocuments": "مستندات مفقودة", + "uploadedDocuments": "المستندات التي تم تحميلها", + "addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.", + "pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون", + "youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني", + "open": "يفتح", + "disclosure": "الإفصاح", + "groupName": "اسم المجموعة", + "enterGroupNamePlease": "يرجى إدخال اسم المجموعة", + "audioCall": "مكالمة صوتية", + "userSearch": "البحث عن مستخدم", + "shareScreen": "مشاركة الشاشة", + "searchByUserName": "البحث حسب اسم المستخدم", + "manage": "إدارة", + "members": "الأعضاء", + "addUsers": "إضافة مستخدمين", + "areYouSureWantTodelete": "هل أنت متأكد أنك تريد الحذف؟", + "editGroups": "تحرير المجموعات", + "groupMembers": "أعضاء المجموعة", + "manageGroup": "إدارة المجموعة", + "admin": "مسؤول", + "paymentDetails": "تفاصيل الدفع", + "requesterEmpNum": "رقم الموظف الطالب", + "requesterEmpName": "اسم الموظف الطالب", + "prepareEmpName": "اسم الموظف المحضر", + "requesterPositionName": "اسم وظيفة الموظف الطالب", + "preparePositionName": "اسم وظيفة الموظف المحضر", + "requesterPayrollName": "اسم كشف رواتب الموظف الطالب", + "general": "عام", + "payingORGName": "اسم الجهة الدافعة", + "requestAmount": "مبلغ الطلب", + "typeofPayment": "نوع الدفع", + "beneficiaryDetails": "تفاصيل المستفيد", + "beneficiaryName": "اسم المستفيد", + "idIqama": "الهوية/الإقامة", + "beneficiaryBankName": "اسم بنك المستفيد", + "sadadNumber": "رقم سداد", + "beneficiaryIBAN": "رقم الآيبان للمستفيد", + "purchaseOrders": "أوامر الشراء", + "approvalDate": "تاريخ الموافقة", + "versionStatus": "حالة الإصدار", + "supplierNo": "رقم المورد", + "paymentRequest": "طلب الدفع" +}; +static const Map en_US = { + "mohemm": "Mohemm", + "english": "English", + "arabic": "عربي", + "login": "Login", + "pleaseEnterLoginDetails": "Please enter the detail below to login", + "username": "Username", + "password": "Password", + "welcomeBack": "Welcome back", + "wouldYouLikeToLoginWithCurrentUsername": "Would you like to login with current Username?", + "lastLoginDetails": "Last Login Details:", + "verificationType": "Verification Type:", + "pleaseVerify": "Please Verify", + "pleaseVerifyForBio": "Please verify login with one of the following options", + "verifyThroughFace": "Verify Through Face", + "verifyThroughFingerprint": "Verify Through Fingerprint", + "verifyThroughSMS": "Verify Through SMS", + "verifyThroughWhatsapp": "Verify Through Whatsapp", + "useAnotherAccount": "Use Another Account", + "pleaseEnterTheVerificationCodeSentTo": "Please enter the verification code sent to ", + "theVerificationCodeWillExpireIn": "The verification code will expire in ", + "goodMorning": "Good Morning", + "markAttendance": "Mark Attendance", + "timeLeftToday": "Time Left Today", + "checkIn": "Check In", + "workList": "Work List", + "leaveBalance": "Leave Balance", + "missingSwipes": "Missing Swipes", + "ticketBalance": "Ticket Balance", + "other": "Other", + "services": "Services", + "viewAllServices": "View All Services", + "monthlyAttendance": "Monthly Attendance", + "vacationRule": "Vacation Rule", + "vacationType": "Vacation Type", + "startDateT": "Start Date", + "endDateT": "End Date", + "workFromHome": "Work From Home", + "ticketRequest": "Ticket Request", + "viewAllOffers": "View All Offers", + "offers": "Offers & ", + "discounts": "Discounts", + "newString": "New", + "setTheNewPassword": "Set the new password", + "typeYourNewPasswordBelow": "Type your new password below", + "typeYourNewActiveDirectoryPasswordBelow": "Type new active directory password below", + "confirmPassword": "Confirm Password", + "update": "Update", + "title": "Title", + "home": "Home", + "mySalary": "My Salary", + "createRequest": "Create Request", + "forgotPassword": "Forgot Password", + "employeeId": "Employee ID", + "loginCodeWillSentToMobileNumber": "Please Enter your Employee ID, A login code will be sent to your mobile number", + "changePassword": "Change Password", + "ok": "OK", + "confirm": "Confirm", + "passwordChangedSuccessfully": "Password changed successfully", + "itemsForSale": "Items for Sale", + "attendanceDetails": "Attendance Details", + "order": "order", + "earlyOut": "Early Out", + "shortage": "Shortage", + "excess": "Excess", + "lateIn": "Late In", + "approvedCheckOut": "Approved Check Out", + "approvedCheckIn": "Approved Check In", + "actualCheckOut": "Actual Check Out", + "actualCheckIn": "Actual Check In", + "present": "PRESENT", + "pres": "present", + "shiftTime": "Shift Time", + "absent": "ABSENT", + "attendance": "Attendance", + "scheduleDays": "Schedule\nDays", + "offDays": "Off\nDays", + "nonAnalyzed": "Non\nAnalyzed", + "shortageHour": "Shortage\nHour", + "stats": "Stats", + "completed": "Completed", + "doNotUseRecentPassword": "Do not use recent password", + "atLeastOneLowercase": "At least one lowercase", + "atLeastOneUppercase": "At least one uppercase", + "atLeastOneNumeric": "At least one numeric", + "minimum8Characters": "Minimum 8 characters", + "doNotAddRepeatingLetters": "Do not add repeating letters", + "itShouldContainSpecialCharacter": "It should not contain special characters", + "confirmPasswordMustMatch": "Confirm password must match", + "sms": "SMS", + "fingerPrint": "Fingerprint", + "face": "Face", + "whatsapp": "Whatsapp", + "reject": "Reject", + "approve": "Approve", + "generate": "Generate", + "cancel": "Cancel", + "requestedItems": "Requested Items", + "request": "Request", + "myRequest": "My Request", + "actions": "Actions", + "delegate": "Delegate", + "request_info": "Request Info", + "attachments": "Attachments", + "info": "Info.", + "employeeNumber": "Employee Number", + "assignmentNumber": "Assignment Number", + "employeeName": "Employee Name", + "scheduleDate": "Schedule Date", + "shiftType": "Shift Type", + "shift": "Shift", + "breakText": "Break", + "actualSwipeStart": "Actual Swipe Start", + "actualSwipeEnd": "Actual Swipe End", + "approvedSwipeStart": "Approved Swipe Start", + "approvedSwipeStartReason": "Approved Swipe Start Reason", + "approvedSwipeEnd": "Approved Swipe End", + "approvedSwipeEndReason": "Approved Swipe End Reason", + "from": "From", + "to": "To", + "sent": "Sent", + "closed": "Closed", + "id": "ID", + "responder": "Responder", + "jobTitle": "Job Title", + "grade": "Grade", + "jobCategory": "Job Category", + "category": "Category", + "employeeEmailAddress": "Employee Email Address", + "payrollBranch": "Payroll Branch", + "yourChangeHasBeenSavedSuccessfully": "Your change has been saved successfully", + "code": "Code", + "unit": "Unit", + "quantity": "Quantity", + "dateRequired": "Date Required", + "lineStatus": "Line Status", + "statusDate": "Status Date", + "transactionType": "Transaction Type", + "operatingUnit": "Operating Unit", + "organizationCode": "Organization Code", + "organization": "Organization", + "fromSubInventory": "From Sub Inventory", + "fromLocator": "From Locator", + "toSubInventory": "To Sub Inventory", + "toLocator": "To Locator", + "shipToLocator": "Ship To Locator", + "itemHistory": "Item History", + "mfg": "MFG", + "lineType": "Line Type", + "price": "Price", + "lineAmount": "Line Amount", + "lineDiscount": "Line Discount %", + "needByDate": "Need By Date", + "promisedDate": "Promised Date", + "deliverToLocation": "Deliver To Location", + "requisitionNumber": "Requisition Number", + "requester": "Requester", + "subject": "Subject", + "quotationAnalysis": "Quotation Analysis", + "description": "Description", + "supplier": "Supplier", + "site": "Site", + "buyer": "Buyer", + "preparer": "Preparer", + "creationDate": "Creation Date", + "shipToLocation": "Ship To Location", + "quotationNumber": "Quotation Number", + "quotationDate": "Quotation Date", + "paymentTerms": "Payment Terms", + "currency": "Currency", + "grossAmount": "Gross Amount", + "discountAmount": "Discount Amount", + "customDuty": "Custom Duty", + "shipHandle": "Ship Handle", + "otherCharges": "Other Charges", + "totalPOAmountWithVAT": "Total PO Amount With VAT", + "totalPOAmountInWords": "Total PO Amount In Words", + "requestNumber": "Request Number", + "uom": "UOM", + "operatingCode": "Operating Code", + "poNumber": "PO Number", + "revision": "Revision", + "quantityOrdered": "Quantity Ordered", + "quantityReceived": "Quantity Received", + "bonusQuantity": "Bonus Quantity", + "purchasePrice": "Purchase Price", + "discountPer": "Discount %", + "balanceQuantity": "Balance Quantity", + "netPrice": "Net Price", + "closureStatus": "Closure Status", + "quotationNetPrice": "Quotation Net Price", + "quotationUOM": "Quotation UOM", + "quotationQty": "Quotation Qty", + "itemCode": "item Code", + "vendorName": "Vendor Name", + "quotationMFGPartNumber": "Quotation MFG Part Number", + "quotationDeliveryDate": "Quotation Delivery Date", + "quotationBonusQuantity": "Quotation Bonus Quantity", + "quotationLineTotal": "Quotation Line Total", + "rfqUOM": "RFQ UOM", + "rfqQty": "RFQ Qty", + "rfqNumber": "RFQ Number", + "msg": "Hello {} in the {} world ", + "msg_named": "{} are written in the {lang} language", + "clickMe": "Click me", + "human": "Human", + "resources": "Resources", + "details": "Details", + "noDataAvailable": "No Data Available", + "productName": "Product Name", + "productDescription": "Product Description", + "unitPrice": "Unit Price", + "manufacturerName": "Manufacturer Name", + "manufacturerPartName": "Manufacturer Part Name", + "supplierName": "Supplier Name", + "supplierContact": "Supplier Contact", + "chargeToPatient": "Charge To Patient", + "justification": "Justification", + "itemDescription": "Item Description", + "groupCode": "Group Code", + "primaryUOM": "Primary UOM", + "subgroupDescription": "Subgroup Description", + "subgroupCode": "Subgroup Code", + "groupDescription": "Group Description", + "templateName": "Template Name", + "itemCreationStatus": "Item Creation Status", + "standardizationApprovalStatus": "Standardization Approval Status", + "standardizationApprovalRejectionReason": "Standardization Approval Rejection Reason", + "analyzedBy": "Analyzed By", + "approvedDate": "Approved Date", + "itemType": "Item Type", + "relatedTo": "Related To", + "requestDate": "Request Date", + "analyzedDate": "Analyzed Date", + "urgent": "Urgent", + "requestDetails": "Request Details", + "approvalLevel": "Approval Level", + "requesterDetails": "Requester Details", + "myAttendance": "My Attendance", + "workOnBreak": "Work On Break", + "next": "Next", + "apply": "Apply", + "mobile": "Mobile", + "year": "Year", + "month": "Month", + "day": "Day", + "completingYear": "We appreciate you for completing the service of", + "address": "Address", + "phoneNumber": "Phone Number", + "businessGroup": "Business", + "Payroll": "Payroll", + "civilIdentityNumber": "Civil Identity Number", + "dateOfBirth": "Date of Birth", + "maritalStatus ": "Marital Status ", + "fullName": "Full Name", + "remove": "Remove", + "Attendance": "Attendance", + "submit": "Submit", + "areYouSureYouWantToSubmit": "Are you sure you want to submit?", + "comments": "Comments", + "writeComment": "Write a comment", + "approversList": "Approvers List", + "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", + "monthlyPaySlip": "Monthly Pay Slip", + "particular": "Particular", + "earnings": "Earnings", + "deductions": "Deductions", + "paymentMethodName": "Payment Method Name", + "bankName": "Bank Name", + "branchCode": "Branch Code", + "accountNo": "Account No", + "summaryOfInformation": "Summary of Information", + "totalPayAmount": "Total Pay Amount", + "paymentInformation": "Payment Information", + "amount": "Amount", + "correctCurrentDatails": "correct or complete the current details", + "selectType": "Select the type of change you want to make", + "enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)", + "endDate": "*End Date", + "removeThisMember": "Are You Sure You Want to Remove this Member?", + "wantUpdateThisMember": "Are You Sure You Want to Update this Member?", + "addNewFamilyMember": "Add New Family Member", + "addRow": "Add new row", + "pleaseSelect": "Please Select *", + "delete": "delete", + "add": "Add", + "edit": "Edit", + "myProfile": "My Profile", + "mowadhafhi": "Mowadhafi", + "searchAnnouncements": "Search Announcements", + "announcements": "Announcements", + "swipeRequest": "Swipe Request", + "serviceType": "Service Type", + "departmentName": "Department Name", + "selectDepartment": "Select Department", + "relatedSection": "Related Section", + "selectSection": "Select Section", + "relatedTopic": "Related Topic", + "selectTopic": "Select Topic", + "supportingDocument": "Supporting Document", + "mowadhafhiRequest": "Mowadhafi Request", + "ticketReference": "Ticket Reference", + "section": "Section", + "topic": "Topic", + "actionBy": "Action By", + "pendingTransactions": "Pending Transactions", + "selectRequestType": "Please select request type", + "dateFrom": "Date From", + "dateTo": "Date To", + "requestName": "Request Name", + "createdFor": "Created For", + "requestType": "Request Type", + "requestCreatedSuccessfully": "Request created successfully", + "search": "Search", + "wantToReject": "Are you sure want to reject?", + "employeeDigitalID": "Employee Digital ID", + "businessCard": "Business Card", + "checkOut": "Check Out", + "regular": "Regular", + "mark": "Mark", + "performance": "Performance Evaluation", + "performanceEvaluationIn": "Your performance Evaluation in", + "valuationIn": "Performance Evaluation in", + "viewBusinessCard": "View Business Card", + "performanceEvaluation": "Performance Evaluation", + "logout": "Logout", + "selectMethodOfAttendance": "Select the method to mark the attendance", + "comeNearHMGWifi": "Please come near to HMG wifi", + "deliverNotificationToMeRegardless": "Deliver notifications to me regardless of any general rules", + "close": "Close", + "respond": "Respond", + "vacationRuleAdded": "Vacation rule added", + "selectTypeT": "Select Type", + "notification": "Notification", + "selectNotification": "Select Notification", + "ifAllSelectedYouWillSkip": "*If All is selected, you will skip to step 3", + "applyForVacationRule": "Apply for Vacation Rule", + "step1": "Step 1", + "step2": "Step 2", + "step3": "Step 3", + "message": "Message", + "writeAMessage": "Write a message", + "notificationReassign": "Notification Reassign", + "selectEmployee": "Select Employee", + "searchEmployeeForReplacement": "Search employee for replacement", + "searchForEmployee": "Search for Employee", + "pleaseSpecifyEndTime": "Please specify End Time", + "pleaseSelectNotificationReassign": "Please select notification reassign", + "pleaseSelectEmployeeForReplacement": "Please select employee for replacement", + "pleaseSelectAction": "Please select action", + "pleaseSelectDate": "Please select date", + "todayAttendance": "Today's Attendance", + "viewAttendance": "View Attendance", + "teamMembers": "Team Members", + "profileDetails": "Profile Details", + "noResultsFound": "No Results Found", + "searchBy": "Search by", + "myTeamMembers": "My Team Members", + "save": "Save", + "TurnNotificationsFor": "Turn on notifications for", + "worklistSettings": "Worklist Settings", + "absenceType": "Absence Type", + "absenceCategory": "Absence Category", + "days": "Days", + "hours": "Hours", + "approvalStatus": "Approval Status", + "absenceStatus": "Absence Status", + "poweredBy": "Powered By", + "cloudSolutions": "Cloud Solutions", + "subordinateLeave": "Subordinate Leave", + "numberDays": "Number of days", + "selectTemplate": "Select Template", + "myPostedAds": "My posted ads", + "browseCategories": "Browse Categories", + "searchItems": "Search Items", + "offerAndDiscounts": "Offer & Discounts", + "offerValid": "Offer Valid", + "offerExpired": "Offer Expired", + "whatAreYouOffering": "What are you offering?", + "selectCategory": "Select Category", + "inProgress": "InProgress", + "locked": "Locked", + "addDetails": "Add Details", + "reviewAndSell": "Review & Sell", + "itemTitle": "Item Title", + "itemCondition": "Item Condition", + "used": "Used", + "region": "Region", + "selectRegion": "Select Region", + "itemPrice": "Item Price", + "itemPhotos": "Item Photos", + "itemInfo": "Item Info", + "uploadAttachment": "Upload Attachment", + "selectFromGalleryOrOpenCamera": "Select from gallery or open camera", + "openCamera": "Open\nCamera", + "uploadFromGallery": "Upload from\nGallery", + "name": "Name", + "email": "Email", + "noHistoryAvailable": "No History Available", + "purchaseRequisition": "Purchase Requisition", + "moveOrder": "Move Order", + "humanResource": "Human Resource", + "purchaseOrder": "Purchase Order", + "ITGForms": "ITG Forms", + "itemCreation": "Item Creation", + "stamp": "Stamp", + "addFavoriteList": "Do you want to add {name} in your favorite list", + "feedbackUserExperience": "This is to get the feedback about the user experience", + "rateUI": "How would you like to rate", + "rateUI2": "How do you satisfied with this application", + "submitSurvey": "Submit Survey", + "typeHere": "Type here", + "infoDetail": "Info Detail", + "amount_detail": "Amount Detail", + "currentBalance": "Current Balance", + "currentLeaveBalance": "Current Leave Balance", + "calculatedDays": "Calculated Days", + "totalDays": "Total Days", + "usedBalance": "Used", + "infants": "Infants", + "child": "Child", + "adult": "Adult", + "updateMember": "Are You Sure You Want to Update this Member?", + "fieldIsEmpty": "'{data}' Field is empty. Please select", + "pleaseEnterComments": "Please enter comments", + "skip": "Skip", + "typeCurrentPasswordBelow": "Type Your Current password below", + "currentPassword": "Current password", + "concurrentReports": "Concurrent Reports", + "EnterNewAddressMoved": "Enter a new address if you have moved", + "CorrectAddress": "Correct or amend this address", + "SelectChangeWantToMake": "Select the type of change you want to make", + "profile": { + "reset_password": { + "label": "Reset Password", + "username": "Username", + "password": "password" }, - "reset_locale": "إعادة ضبط اللغة", - "chat": "دردشة", - "mychats": "دردشاتي", - "advancedSearch": "بحث متقدم", - "openNot": "التبليغات المفتوحة", - "fyi": "تبليغات للعلم", - "toDo": "تبليغات الأعمال", - "all": "كل التبليغات", - "meNot": "تبليغات صادرة مني", - "view": "عرض", - "fromUserName": "من", - "sentDate": "تاريخ الإرسال", - "itemTypeDisplayName": "اسم العرض", - "none": "بدون", - "createNewChat": "إنشاء محادثة جديدة", - "brainMarathon": "ماراثون الدماغ", - "contestTopicAbout": "سيكون موضوع المسابقة حول:", - "gameDate": "تاريخ اللعبة:", - "gameTime": "وقت اللعب:", - "joinMarathon": "انضم إلى ماراثون", - "joinDemoMarathon": "انضم إلى الماراثون التجريبي", - "demo": "تجريبي", - "minutes": "الدقائق", - "seconds": "ثواني", - "note": "ملحوظة:", - "demoMarathonNoteP1": "يمكنك لعب ماراثون العرض لتتعلم كيف يعمل. يمكنك الانضمام إلى ماراثون", - "demoMarathonNoteP2": "خمس دقائق", - "demoMarathonNoteP3": "قبل الوقت الفعلي.", - "sponsoredBy": "برعاية:", - "question": "سؤال", - "marathoners": "الماراثون", - "marathoner": "ماراثونر", - "prize": "جائزة:", - "winnerSelection": "اختيار الفائز", - "qualifiers": "تصفيات", - "qualifier": "المؤهل", - "getReadyForContest": "استعد للمسابقة القادمة:", - "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.", - "fingersCrossed": "تشابك الاصابع!!!", - "congrats": "مبروك !!!", - "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح.", - "otp": "OTP", - "verification": "تَحَقّق", - "resend": "إعادة إرسال", - "codeExpire": "انتهت صلاحية رمز التحقق", - "typeheretoreply": "اكتب هنا للرد", - "favorite": "مفضلتي", - "searchfromchat": "البحث من الدردشة", - "yourAnswerCorrect": "إجابتك صحيحة", - "youMissedTheQuestion": "نفد منك الوقت. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.", - "wrongAnswer": "إجابتك غير صحيحة. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.", - "oops": "أوه!!!", - "winner": "الفائز", - "youWantToLeaveMarathon": "هل أنت متأكد أنك تريد العودة؟ سوف تخرج من المسابقة.", - "ourSponsor": "راعينا:", - "startingIn": "يبدأ في", - "youAreOutOfContest": "أنت خارج المسابقة.", - "winners": "الفائزين!!!", - "expireAfter": "تنتهي بعد", - "oneWeek": "أسبوع 1", - "twoWeek": "2 أسبوع", - "noUpcoming": "لا يوجد قادم", - "fakeLocation": ".لقد تتبعنا أنك تحاول استخدام موقع مزيف! يعتبر هذا مخالفة وقد تم إخطار الموارد البشرية", - "noWinner": "حزين! لم يفز أحد اليوم.", - "myTeam": "فريقي", - "youCanPlayDemo": "لكن يمكنك لعب العرض", - "group": "مجموعة", - "searchGroup": "مجموعة البحث", - "connectHmgWifi": "قم بتوصيل HMG WIFI", - "connectedHmgWifi": "اتصال HMG WIFI", - "itgForms": "نماذج (ITG)", - "resetAdPassword": "إعادة تعيين كلمة مرور AD", - "myDocuments": "مستنداتي", - "requiredDocuments": "المستندات المطلوبة", - "optionalDocuments": "المستندات الاختيارية", - "allDocuments": "كافة المستندات", - "expiredDocuments": "المستندات منتهية الصلاحية", - "missingDocuments": "مستندات مفقودة", - "uploadedDocuments": "المستندات التي تم تحميلها", - "youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني", - "pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون", - "generate": "يولد", - "paymentRequest":"طلب الدفع", - "paymentDetails":"تفاصيل الدفع", - "requestNo":"رقم الطلب", - "requesterEmpNum":"رقم الموظف الذي قدم الطلب", - "requesterEmpName":"اسم الموظف مقدم الطلب", - "prepareEmpName":"إعداد اسم الموظف", - "requesterPositionName":"اسم الوظيفة لمقدم الطلب", - "preparePositionName":"إعداد اسم الوظيفة", - "requesterPayrollName":"اسم مقدم الطلب", - "payingORGName":"اسم المنظمة الدافعة", - "requestAmount":"مبلغ الطلب", - "typeofPayment":"نوع الدفع", - "beneficiaryDetails":"تفاصيل المستفيد", - "beneficiaryName":"اسم المستفيد", - "idIqama":"الهوية السعودية / الإقامة", - "beneficiaryBankName":"اسم البنك المستفيد", - "sadadNumber":"رقم سداد", - "beneficiaryIBAN":"رقم IBAN للمستفيد", - "purchaseOrders":"طلبات الشراء", - "approvalDate":"تاريخ الموافقة", - "pOAmount":"مبلغ الطلب", - "versionStatus":"حالة الإصدار", - "supplierNo":"رقم المورد", - "general":"عام" - }; - static const Map en_US = { - "mohemm": "Mohemm", - "english": "English", - "arabic": "عربي", - "login": "Login", - "pleaseEnterLoginDetails": "Please enter the detail below to login", - "username": "Username", - "password": "Password", - "welcomeBack": "Welcome back", - "wouldYouLikeToLoginWithCurrentUsername": "Would you like to login with current Username?", - "lastLoginDetails": "Last Login Details:", - "verificationType": "Verification Type:", - "pleaseVerify": "Please Verify", - "pleaseVerifyForBio": "Please verify login with one of the following options", - "verifyThroughFace": "Verify Through Face", - "verifyThroughFingerprint": "Verify Through Fingerprint", - "verifyThroughSMS": "Verify Through SMS", - "verifyThroughWhatsapp": "Verify Through Whatsapp", - "useAnotherAccount": "Use Another Account", - "pleaseEnterTheVerificationCodeSentTo": "Please enter the verification code sent to ", - "theVerificationCodeWillExpireIn": "The verification code will expire in ", - "goodMorning": "Good Morning", - "markAttendance": "Mark Attendance", - "timeLeftToday": "Time Left Today", - "checkIn": "Check In", - "workList": "Work List", - "leaveBalance": "Leave Balance", - "missingSwipes": "Missing Swipes", - "ticketBalance": "Ticket Balance", - "other": "Other", - "services": "Services", - "viewAllServices": "View All Services", - "monthlyAttendance": "Monthly Attendance", - "vacationRule": "Vacation Rule", - "vacationType": "Vacation Type", - "startDateT": "Start Date", - "endDateT": "End Date", - "workFromHome": "Work From Home", - "ticketRequest": "Ticket Request", - "viewAllOffers": "View All Offers", - "offers": "Offers & ", - "discounts": "Discounts", - "newString": "New", - "setTheNewPassword": "Set the new password", - "typeYourNewPasswordBelow": "Type your new password below", - "typeYourNewActiveDirectoryPasswordBelow": "Type new active directory password below", - "confirmPassword": "Confirm Password", - "update": "Update", - "title": "Title", - "home": "Home", - "mySalary": "My Salary", - "createRequest": "Create Request", - "forgotPassword": "Forgot Password", - "employeeId": "Employee ID", - "loginCodeWillSentToMobileNumber": "Please Enter your Employee ID, A login code will be sent to your mobile number", - "changePassword": "Change Password", - "ok": "OK", - "confirm": "Confirm", - "passwordChangedSuccessfully": "Password changed successfully", - "itemsForSale": "Items for Sale", - "attendanceDetails": "Attendance Details", - "order": "order", - "earlyOut": "Early Out", - "shortage": "Shortage", - "excess": "Excess", - "lateIn": "Late In", - "approvedCheckOut": "Approved Check Out", - "approvedCheckIn": "Approved Check In", - "actualCheckOut": "Actual Check Out", - "actualCheckIn": "Actual Check In", - "present": "PRESENT", - "pres": "present", - "shiftTime": "Shift Time", - "absent": "ABSENT", - "attendance": "Attendance", - "scheduleDays": "Schedule\nDays", - "offDays": "Off\nDays", - "nonAnalyzed": "Non\nAnalyzed", - "shortageHour": "Shortage\nHour", - "stats": "Stats", - "completed": "Completed", - "doNotUseRecentPassword": "Do not use recent password", - "atLeastOneLowercase": "At least one lowercase", - "atLeastOneUppercase": "At least one uppercase", - "atLeastOneNumeric": "At least one numeric", - "minimum8Characters": "Minimum 8 characters", - "doNotAddRepeatingLetters": "Do not add repeating letters", - "itShouldContainSpecialCharacter": "It should not contain special character", - "confirmPasswordMustMatch": "Confirm password must match", - "sms": "SMS", - "fingerPrint": "Fingerprint", - "face": "Face", - "whatsapp": "Whatsapp", - "reject": "Reject", - "approve": "Approve", - "cancel": "Cancel", - "requestedItems": "Requested Items", - "request": "Request", - "myRequest": "My Request", - "actions": "Actions", - "delegate": "Delegate", - "request_info": "Request Info", - "attachments": "Attachments", - "info": "Info.", - "employeeNumber": "Employee Number", - "assignmentNumber": "Assignment Number", - "employeeName": "Employee Name", - "scheduleDate": "Schedule Date", - "shiftType": "Shift Type", - "shift": "Shift", - "breakText": "Break", - "actualSwipeStart": "Actual Swipe Start", - "actualSwipeEnd": "Actual Swipe End", - "approvedSwipeStart": "Approved Swipe Start", - "approvedSwipeStartReason": "Approved Swipe Start Reason", - "approvedSwipeEnd": "Approved Swipe End", - "approvedSwipeEndReason": "Approved Swipe End Reason", - "from": "From", - "to": "To", - "sent": "Sent", - "closed": "Closed", - "id": "ID", - "responder": "Responder", - "jobTitle": "Job Title", - "grade": "Grade", - "jobCategory": "Job Category", - "category": "Category", - "employeeEmailAddress": "Employee Email Address", - "payrollBranch": "Payroll Branch", - "yourChangeHasBeenSavedSuccessfully": "Your change has been saved successfully", - "code": "Code", - "unit": "Unit", - "quantity": "Quantity", - "dateRequired": "Date Required", - "lineStatus": "Line Status", - "statusDate": "Status Date", - "transactionType": "Transaction Type", - "operatingUnit": "Operating Unit", - "organizationCode": "Organization Code", - "organization": "Organization", - "fromSubInventory": "From Sub Inventory", - "fromLocator": "From Locator", - "toSubInventory": "To Sub Inventory", - "toLocator": "To Locator", - "shipToLocator": "Ship To Locator", - "itemHistory": "Item History", - "mfg": "MFG", - "lineType": "Line Type", - "price": "Price", - "lineAmount": "Line Amount", - "lineDiscount": "Line Discount %", - "needByDate": "Need By Date", - "promisedDate": "Promised Date", - "deliverToLocation": "Deliver To Location", - "requisitionNumber": "Requisition Number", - "requester": "Requester", - "subject": "Subject", - "quotationAnalysis": "Quotation Analysis", - "description": "Description", - "supplier": "Supplier", - "site": "Site", - "buyer": "Buyer", - "preparer": "Preparer", - "creationDate": "Creation Date", - "shipToLocation": "Ship To Location", - "quotationNumber": "Quotation Number", - "quotationDate": "Quotation Date", - "paymentTerms": "Payment Terms", - "currency": "Currency", - "grossAmount": "Gross Amount", - "discountAmount": "Discount Amount", - "customDuty": "Custom Duty", - "shipHandle": "Ship Handle", - "otherCharges": "Other Charges", - "totalPOAmountWithVAT": "Total PO Amount With VAT", - "totalPOAmountInWords": "Total PO Amount In Words", - "requestNumber": "Request Number", - "uom": "UOM", - "operatingCode": "Operating Code", - "poNumber": "PO Number", - "revision": "Revision", - "quantityOrdered": "Quantity Ordered", - "quantityReceived": "Quantity Received", - "bonusQuantity": "Bonus Quantity", - "purchasePrice": "Purchase Price", - "discountPer": "Discount %", - "balanceQuantity": "Balance Quantity", - "netPrice": "Net Price", - "closureStatus": "Closure Status", - "quotationNetPrice": "Quotation Net Price", - "quotationUOM": "Quotation UOM", - "quotationQty": "Quotation Qty", - "itemCode": "item Code", - "vendorName": "Vendor Name", - "quotationMFGPartNumber": "Quotation MFG Part Number", - "quotationDeliveryDate": "Quotation Delivery Date", - "quotationBonusQuantity": "Quotation Bonus Quantity", - "quotationLineTotal": "Quotation Line Total", - "rfqUOM": "RFQ UOM", - "rfqQty": "RFQ Qty", - "rfqNumber": "RFQ Number", - "msg": "Hello {} in the {} world ", - "msg_named": "{} are written in the {lang} language", - "clickMe": "Click me", - "human": "Human", - "resources": "Resources", - "details": "Details", - "noDataAvailable": "No Data Available", - "productName": "Product Name", - "productDescription": "Product Description", - "unitPrice": "Unit Price", - "manufacturerName": "Manufacturer Name", - "manufacturerPartName": "Manufacturer Part Name", - "supplierName": "Supplier Name", - "supplierContact": "Supplier Contact", - "chargeToPatient": "Charge To Patient", - "justification": "Justification", - "itemDescription": "Item Description", - "groupCode": "Group Code", - "primaryUOM": "Primary UOM", - "subgroupDescription": "Subgroup Description", - "subgroupCode": "Subgroup Code", - "groupDescription": "Group Description", - "templateName": "Template Name", - "itemCreationStatus": "Item Creation Status", - "standardizationApprovalStatus": "Standardization Approval Status", - "standardizationApprovalRejectionReason": "Standardization Approval Rejection Reason", - "analyzedBy": "Analyzed By", - "approvedDate": "Approved Date", - "itemType": "Item Type", - "relatedTo": "Related To", - "requestDate": "Request Date", - "analyzedDate": "Analyzed Date", - "urgent": "Urgent", - "requestDetails": "Request Details", - "approvalLevel": "Approval Level", - "requesterDetails": "Requester Details", - "myAttendance": "My Attendance", - "workOnBreak": "Work On Break", - "next": "Next", - "apply": "Apply", - "mobile": "Mobile", - "year": "Year", - "month": "Month", - "day": "Day", - "completingYear": "We appreciate you for completing the service of", + "profileCompletionPer": "Profile Completion", + "completeProfile": "Complete Profile", + "personalInformation": "Personal Information", + "basicDetails": "Basic Details", "address": "Address", - "phoneNumber": "Phone Number", - "businessGroup": "Business", - "Payroll": "Payroll", - "civilIdentityNumber": "Civil Identity Number", - "dateOfBirth": "Date of Birth", - "maritalStatus ": "Marital Status ", - "fullName": "Full Name", - "remove": "Remove", - "Attendance": "Attendance", - "submit": "Submit", - "areYouSureYouWantToSubmit": "Are you sure you want to submit?", - "comments": "Comments", - "writeComment": "Write a comment", - "approversList": "Approvers List", - "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", - "monthlyPaySlip": "Monthly Pay Slip", - "particular": "Particular", - "earnings": "Earnings", - "deductions": "Deductions", - "paymentMethodName": "Payment Method Name", - "bankName": "Bank Name", - "branchCode": "Branch Code", - "accountNo": "Account No", - "summaryOfInformation": "Summary of Information", - "totalPayAmount": "Total Pay Amount", - "paymentInformation": "Payment Information", - "amount": "Amount", - "correctCurrentDatails": "correct or complete the current details", - "selectType": "Select the type of change you want to make", - "enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)", - "endDate": "*End Date", - "removeThisMember": "Are You Sure You Want to Remove this Member?", - "wantUpdateThisMember": "Are You Sure You Want to Update this Member?", - "addNewFamilyMember": "Add New Family Member", - "addRow": "Add new row", - "pleaseSelect": "Please Select *", - "delete": "delete", - "add": "Add", - "edit": "Edit", - "myProfile": "My Profile", - "mowadhafhi": "Mowadhafi", - "searchAnnouncements": "Search Announcements", - "announcements": "Announcements", - "swipeRequest": "Swipe Request", - "serviceType": "Service Type", - "departmentName": "Department Name", - "selectDepartment": "Select Department", - "relatedSection": "Related Section", - "selectSection": "Select Section", - "relatedTopic": "Related Topic", - "selectTopic": "Select Topic", - "supportingDocument": "Supporting Document", - "mowadhafhiRequest": "Mowadhafi Request", - "ticketReference": "Ticket Reference", - "section": "Section", - "topic": "Topic", - "actionBy": "Action By", - "pendingTransactions": "Pending Transactions", - "selectRequestType": "Please select request type", - "dateFrom": "Date From", - "dateTo": "Date To", - "requestName": "Request Name", - "createdFor": "Created For", - "requestType": "Request Type", - "requestCreatedSuccessfully": "Request created successfully", - "search": "Search", - "wantToReject": "Are you sure want to reject?", - "employeeDigitalID": "Employee Digital ID", - "businessCard": "Business Card", - "checkOut": "Check Out", - "regular": "Regular", - "mark": "Mark", - "performance": "Performance Evaluation", - "performanceEvaluationIn": "Your performance Evaluation in", - "valuationIn": "Performance Evaluation in", - "viewBusinessCard": "View Business Card", - "performanceEvaluation": "Performance Evaluation", - "logout": "Logout", - "selectMethodOfAttendance": "Select the method to mark the attendance", - "comeNearHMGWifi": "Please come near to HMG wifi", - "deliverNotificationToMeRegardless": "Deliver notifications to me regardless of any general rules", - "close": "Close", - "respond": "Respond", - "vacationRuleAdded": "Vacation rule added", - "selectTypeT": "Select Type", - "notification": "Notification", - "selectNotification": "Select Notification", - "ifAllSelectedYouWillSkip": "*If All is selected, you will skip to step 3", - "applyForVacationRule": "Apply for Vacation Rule", - "step1": "Step 1", - "step2": "Step 2", - "step3": "Step 3", - "message": "Message", - "writeAMessage": "Write a message", - "notificationReassign": "Notification Reassign", - "selectEmployee": "Select Employee", - "searchEmployeeForReplacement": "Search employee for replacement", - "searchForEmployee": "Search for Employee", - "pleaseSpecifyEndTime": "Please specify End Time", - "pleaseSelectNotificationReassign": "Please select notification reassign", - "pleaseSelectEmployeeForReplacement": "Please select employee for replacement", - "pleaseSelectAction": "Please select action", - "pleaseSelectDate": "Please select date", - "todayAttendance": "Today's Attendance", - "viewAttendance": "View Attendance", - "teamMembers": "Team Members", - "profileDetails": "Profile Details", - "noResultsFound": "No Results Found", - "searchBy": "Search by", - "myTeamMembers": "My Team Members", - "save": "Save", - "TurnNotificationsFor": "Turn on notifications for", - "worklistSettings": "Worklist Settings", - "absenceType": "Absence Type", - "absenceCategory": "Absence Category", - "days": "Days", - "hours": "Hours", - "approvalStatus": "Approval Status", - "absenceStatus": "Absence Status", - "poweredBy": "Powered By", - "cloudSolutions": "Cloud Solutions", - "subordinateLeave": "Subordinate Leave", - "numberDays": "Number of days", - "selectTemplate": "Select Template", - "myPostedAds": "My posted ads", - "browseCategories": "Browse Categories", - "searchItems": "Search Items", - "offerAndDiscounts": "Offer & Discounts", - "offerValid": "Offer Valid", - "offerExpired": "Offer Expired", - "whatAreYouOffering": "What are you offering?", - "selectCategory": "Select Category", - "inProgress": "InProgress", - "locked": "Locked", - "addDetails": "Add Details", - "reviewAndSell": "Review & Sell", - "itemTitle": "Item Title", - "itemCondition": "Item Condition", - "used": "Used", - "region": "Region", - "selectRegion": "Select Region", - "itemPrice": "Item Price", - "itemPhotos": "Item Photos", - "itemInfo": "Item Info", - "uploadAttachment": "Upload Attachment", - "selectFromGalleryOrOpenCamera": "Select from gallery or open camera", - "openCamera": "Open\nCamera", - "uploadFromGallery": "Upload from\nGallery", - "name": "Name", - "email": "Email", - "noHistoryAvailable": "No History Available", - "purchaseRequisition": "Purchase Requisition", - "moveOrder": "Move Order", - "humanResource": "Human Resource", - "purchaseOrder": "Purchase Order", - "ITGForms": "ITG Forms", - "itemCreation": "Item Creation", - "stamp": "Stamp", - "addFavoriteList": "Do you want to add {name} in your favorite list", - "feedbackUserExperience": "This is to get the feedback about the user experience", - "rateUI": "How would you like to rate", - "rateUI2": "How do you satisfied with this application", - "submitSurvey": "Submit Survey", - "typeHere": "Type here", - "infoDetail": "Info Detail", - "amount_detail": "Amount Detail", - "currentBalance": "Current Balance", - "currentLeaveBalance": "Current Leave Balance", - "calculatedDays": "Calculated Days", - "totalDays": "Total Days", - "usedBalance": "Used", - "infants": "Infants", - "child": "Child", - "adult": "Adult", - "updateMember": "Are You Sure You Want to Update this Member?", - "fieldIsEmpty": "'{data}' Field is empty. Please select", - "pleaseEnterComments": "Please enter comments", - "skip": "Skip", - "typeCurrentPasswordBelow": "Type Your Current password below", - "currentPassword": "Current password", - "concurrentReports": "Concurrent Reports", - "EnterNewAddressMoved": "Enter a new address if you have moved", - "CorrectAddress": "Correct or amend this address", - "SelectChangeWantToMake": "Select the type of change you want to make", - "profile": { - "reset_password": {"label": "Reset Password", "username": "Username", "password": "password"}, - "profileCompletionPer": "Profile Completion", - "completeProfile": "Complete Profile", - "personalInformation": "Personal Information", - "basicDetails": "Basic Details", - "address": "Address", - "contactDetails": "Contact Details", - "familyDetails": "Family Members", - "effectiveDate": "Effective Date", - "country": "Country" - }, - "clicked": { - "zero": "You clicked {} times!", - "one": "You clicked {} time!", - "two": "You clicked {} times!", - "few": "You clicked {} times!", - "many": "You clicked {} times!", - "other": "You clicked {} times!" - }, - "gender": { - "male": "Hi man ;) ", - "female": "Hello girl :)", - "with_arg": {"male": "Hi man ;) {}", "female": "Hello girl :) {}"} - }, - "reset_locale": "Reset Language", - "chat": "Chat", - "mychats": "My Chats", - "createNewChat": "Create New Chat", - "brainMarathon": "Brain Marathon", - "contestTopicAbout": "Contest Topic will be about:", - "gameDate": "Game Date:", - "gameTime": "Game Time:", - "joinMarathon": "Join Marathon", - "joinDemoMarathon": "Join Demo Marathon", - "demo": "Demo", - "minutes": "Minutes", - "seconds": "Seconds", - "note": "Note:", - "demoMarathonNoteP1": "You can play the demo Marathon to learn how it works. You can join the Marathon", - "demoMarathonNoteP2": "5 Minutes", - "demoMarathonNoteP3": "before the actual time.", - "sponsoredBy": "Sponsored By:", - "question": "Question", - "marathoners": "Marathoners", - "marathoner": "Marathoner", - "prize": "Prize:", - "advancedSearch": "Advanced Search", - "openNot": "Open Notifications", - "fyi": "FYI Notifications", - "toDo": "To Do Notifications", - "all": "All Notifications", - "meNot": "Notifications from Me", - "view": "View", - "fromUserName": "From User Name", - "sentDate": "Sent Date", - "itemTypeDisplayName": "Item Type Display Name", - "none": "None", - "winnerSelection": "Winner Selection", - "qualifiers": "Qualifiers", - "qualifier": "Qualifier", - "getReadyForContest": "Get Ready for the coming contest:", - "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", - "fingersCrossed": "Fingers Crossed!!!", - "congrats": "Congratulations!!!", - "otp": "OTP", - "verification": "Verification", - "resend": "Resend", - "codeExpire": "The verification code has been expired", - "allQuestionsCorrect": "You have answered all questions correct", - "typeheretoreply": "Type here to reply", - "favorite": "My Favorites", - "searchfromchat": "Search from chat", - "yourAnswerCorrect": "Your answer is correct", - "youMissedTheQuestion": "You ran out of time. You are out of the game. But you can continue as a viewer.", - "wrongAnswer": "Your answer is Incorrect. You are out of the game. But you can continue as a viewer.", - "oops": "Ooopsss!!!!", - "winner": "WINNER", - "youWantToLeaveMarathon": "Are you sure you want to go back? You will be out of the contest.", - "ourSponsor": "Our Sponsor:", - "startingIn": "Starting in", - "youAreOutOfContest": "You are out of the contest.", - "winners": "WINNERS!!!", - "expireAfter": "Expires After", - "oneWeek": "1 Week", - "twoWeek": "2 Week", - "noUpcoming": "There is no upcoming", - "fakeLocation": "We traced out that you try to use a fake location! This is considered a violation, and HR has been notified.", - "noWinner": "Sad! No one won today.", - "myTeam": "My Team", - "youCanPlayDemo": "But you can play demo", - "group": "Groups", - "searchGroup": "Search Group", - "connectHmgWifi": "Connect HMG WIFI", - "connectedHmgWifi": "Connected HMG WIFI", - "itgForms": "ITG Forms", - "resetAdPassword": "Reset AD Password", - "myDocuments": "My Documents", - "requiredDocuments": "Required Documents", - "optionalDocuments": "Optional Documents", - "allDocuments": "All\nDocuments", - "expiredDocuments": "Expired\nDocuments", - "missingDocuments": "Missing\nDocuments", - "uploadedDocuments": "Uploaded\nDocuments", - "manage": "Manage", - "members": "Members", - "areYouSureWantTodelete": "Are you sure want to delete?", - "groupMembers": "Group Members", - "manageGroup": "Manage Group", - "admin": "Admin", - "addUsers": "Add users to the group", - "editGroups": "Edit Group", - "groupNameshouldbe": "Group name should be minimum 10 character long", - "enterGroupName": "Please enter valid group Name", - "groupName": "Group Name", - "enterGroupNamePlease": "Please enter group name", - "audioCall": "Audio Call", - "videoCall": "Video Call", - "shareScreen": "Share Screen", - "searchByUserName": "Search By Username", - "userSearch": "User Search", - "userName": "User Name", - "userId": "UserID", - "pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.", - "youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.", - "generate": "Generate", - "paymentRequest":"Pay Request", - "paymentDetails":"Payment Details", - "requestNo":"Request No", - "requesterEmpNum":"Requester Employee Num", - "requesterEmpName":"Requester Employee Name", - "prepareEmpName":"Prepare Employee Name", - "requesterPositionName":"Requester Position Name", - "preparePositionName":"Prepare Position Name", - "requesterPayrollName":"Requester Payroll Name", - "payingORGName":"Paying Organization Name", - "requestAmount":"Request Amount", - "typeofPayment":"Type of Payment", - "beneficiaryDetails":"Beneficiary Details", - "beneficiaryName":"Beneficiary Name", - "idIqama":"Saudi ID / Iqama", - "beneficiaryBankName":"Beneficiary Bank Name", - "sadadNumber":"Sadad Number", - "beneficiaryIBAN":"Beneficiary IBAN", - "purchaseOrders":"Purchase Orders", - "approvalDate":"Approval Date", - "pOAmount":"PO Amount", - "versionStatus":"Version Status", - "supplierNo":"Supplier No", - "general":"General" - }; - static const Map> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; + "contactDetails": "Contact Details", + "familyDetails": "Family Members", + "effectiveDate": "Effective Date", + "country": "Country" + }, + "clicked": { + "zero": "You clicked {} times!", + "one": "You clicked {} time!", + "two": "You clicked {} times!", + "few": "You clicked {} times!", + "many": "You clicked {} times!", + "other": "You clicked {} times!" + }, + "gender": { + "male": "Hi man ;) ", + "female": "Hello girl :)", + "with_arg": { + "male": "Hi man ;) {}", + "female": "Hello girl :) {}" + } + }, + "reset_locale": "Reset Language", + "chat": "Chat", + "mychats": "My Chats", + "createNewChat": "Create New Chat", + "brainMarathon": "Brain Marathon", + "contestTopicAbout": "Contest Topic will be about:", + "gameDate": "Game Date:", + "gameTime": "Game Time:", + "joinMarathon": "Join Marathon", + "joinDemoMarathon": "Join Demo Marathon", + "demo": "Demo", + "minutes": "Minutes", + "seconds": "Seconds", + "note": "Note:", + "demoMarathonNoteP1": "You can play the demo Marathon to learn how it works. You can join the Marathon", + "demoMarathonNoteP2": "5 Minutes", + "demoMarathonNoteP3": "before the actual time.", + "sponsoredBy": "Sponsored By:", + "question": "Question", + "marathoners": "Marathoners", + "marathoner": "Marathoner", + "prize": "Prize:", + "advancedSearch": "Advanced Search", + "openNot": "Open Notifications", + "fyi": "FYI Notifications", + "toDo": "To Do Notifications", + "all": "All Notifications", + "meNot": "Notifications from Me", + "view": "View", + "fromUserName": "From User Name", + "sentDate": "Sent Date", + "itemTypeDisplayName": "Item Type Display Name", + "none": "None", + "winnerSelection": "Winner Selection", + "qualifiers": "Qualifiers", + "qualifier": "Qualifier", + "getReadyForContest": "Get Ready for the coming contest:", + "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", + "fingersCrossed": "Fingers Crossed!!!", + "congrats": "Congratulations!!!", + "otp": "OTP", + "verification": "Verification", + "resend": "Resend", + "codeExpire": "The verification code has been expired", + "allQuestionsCorrect": "You have answered all questions correct", + "typeheretoreply": "Type here to reply", + "favorite": "My Favorites", + "searchfromchat": "Search from chat", + "yourAnswerCorrect": "Your answer is correct", + "youMissedTheQuestion": "You ran out of time. You are out of the game. But you can continue as a viewer.", + "wrongAnswer": "Your answer is Incorrect. You are out of the game. But you can continue as a viewer.", + "oops": "Ooopsss!!!!", + "winner": "WINNER", + "youWantToLeaveMarathon": "Are you sure you want to go back? You will be out of the contest.", + "ourSponsor": "Our Sponsor:", + "startingIn": "Starting in", + "youAreOutOfContest": "You are out of the contest.", + "winners": "WINNERS!!!", + "expireAfter": "Expires After", + "oneWeek": "1 Week", + "twoWeek": "2 Week", + "noUpcoming": "There is no upcoming", + "fakeLocation": "We traced out that you try to use a fake location! This is considered a violation, and HR has been notified.", + "noWinner": "Sad! No one won today.", + "myTeam": "My Team", + "youCanPlayDemo": "But you can play demo", + "group": "Groups", + "searchGroup": "Search Group", + "connectHmgWifi": "Connect HMG WIFI", + "connectedHmgWifi": "Connected HMG WIFI", + "itgForms": "ITG Forms", + "resetAdPassword": "Reset AD Password", + "myDocuments": "My Documents", + "requiredDocuments": "Required Documents", + "optionalDocuments": "Optional Documents", + "allDocuments": "All\nDocuments", + "expiredDocuments": "Expired\nDocuments", + "missingDocuments": "Missing\nDocuments", + "uploadedDocuments": "Uploaded\nDocuments", + "manage": "Manage", + "members": "Members", + "areYouSureWantTodelete": "Are you sure want to delete?", + "groupMembers": "Group Members", + "manageGroup": "Manage Group", + "admin": "Admin", + "addUsers": "Add users to the group", + "editGroups": "Edit Group", + "groupNameshouldbe": "Group name should be minimum 10 character long", + "enterGroupName": "Please enter valid group Name", + "groupName": "Group Name", + "enterGroupNamePlease": "Please enter group name", + "audioCall": "Audio Call", + "videoCall": "Video Call", + "shareScreen": "Share Screen", + "searchByUserName": "Search By Username", + "userSearch": "User Search", + "userName": "User Name", + "userId": "UserID", + "open": "open", + "addAtLeastOneAttachment": "Please add at least one attachment.", + "pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.", + "youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.", + "disclosure": "Disclosure", + "requesterEmpNum": "Requester Employee Number", + "requesterEmpName": "Requester Employee Name", + "prepareEmpName": "Prepare Employee Name", + "requesterPositionName": "Requester Position Name", + "preparePositionName": "Prepare Position Name", + "requesterPayrollName": "Requester Payroll Name", + "general": "General", + "payingORGName": "Paying Organization Name", + "requestAmount": "Request Amount", + "typeofPayment": "Type of Payment", + "paymentDetails": "Payment Details", + "beneficiaryDetails": "Beneficiary Details", + "beneficiaryName": "Beneficiary Name", + "idIqama": "ID/Iqama", + "beneficiaryBankName": "Beneficiary Bank Name", + "sadadNumber": "SADAD Number", + "beneficiaryIBAN": "Beneficiary IBAN", + "purchaseOrders": "Purchase Orders", + "approvalDate": "Approval Date", + "versionStatus": "Version Status", + "supplierNo": "Supplier Number", + "paymentRequest": "Payment Request", + "pOAmount": "PO Amount" +}; +static const Map> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 0ec89e4..a13b014 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -98,6 +98,7 @@ abstract class LocaleKeys { static const reject = 'reject'; static const approve = 'approve'; static const cancel = 'cancel'; + static const generate = 'generate'; static const requestedItems = 'requestedItems'; static const request = 'request'; static const myRequest = 'myRequest'; @@ -403,7 +404,6 @@ abstract class LocaleKeys { static const purchaseOrder = 'purchaseOrder'; static const ITGForms = 'ITGForms'; static const itemCreation = 'itemCreation'; - static const paymentRequest = 'paymentRequest'; static const stamp = 'stamp'; static const addFavoriteList = 'addFavoriteList'; static const feedbackUserExperience = 'feedbackUserExperience'; @@ -527,53 +527,46 @@ abstract class LocaleKeys { static const expiredDocuments = 'expiredDocuments'; static const missingDocuments = 'missingDocuments'; static const uploadedDocuments = 'uploadedDocuments'; - + static const addAtLeastOneAttachment = 'addAtLeastOneAttachment'; + static const pleaseClickButtonToJoinMarathon = 'pleaseClickButtonToJoinMarathon'; + static const youCannotJoinTheMarathon = 'youCannotJoinTheMarathon'; + static const open = 'open'; + static const disclosure = 'disclosure'; + static const groupName = 'groupName'; + static const enterGroupNamePlease = 'enterGroupNamePlease'; + static const audioCall = 'audioCall'; + static const userSearch = 'userSearch'; + static const shareScreen = 'shareScreen'; + static const searchByUserName = 'searchByUserName'; static const manage = 'manage'; static const members = 'members'; + static const addUsers = 'addUsers'; static const areYouSureWantTodelete = 'areYouSureWantTodelete'; - static const groupMembers = "groupMembers"; - static const manageGroup = "manageGroup"; - static const admin = "admin"; - static const addUsers ="addUsers"; - static const editGroups ="editGroups"; - static const groupNameshouldbe ="groupNameshouldbe"; - static const enterGroupName ="enterGroupName"; - static const groupName ="groupName"; - static const enterGroupNamePlease ="enterGroupNamePlease"; - static const audioCall = 'audioCall'; - static const videoCall ='videoCall'; - static const shareScreen ='shareScreen'; - static const searchByUserName ='searchByUserName'; - static const userSearch ='userSearch'; - static const userName ='userName'; - static const userId ='userId'; - static const addAtLeastOneAttachment ='addAtLeastOneAttachment'; - static const pleaseClickButtonToJoinMarathon ='pleaseClickButtonToJoinMarathon'; - static const youCannotJoinTheMarathon ='youCannotJoinTheMarathon'; - static const open ='open'; - static const generate = 'generate'; - static const paymentDetails ='paymentDetails'; - static const requestNo ='requestNo'; - static const requesterEmpNum ='requesterEmpNum'; - static const requesterEmpName ='requesterEmpName'; - static const prepareEmpName ='prepareEmpName'; - static const requesterPositionName ='requesterPositionName'; - static const preparePositionName ='preparePositionName'; - static const requesterPayrollName ='requesterPayrollName'; - static const payingORGName ='payingORGName'; - static const requestAmount ='requestAmount'; - static const typeofPayment ='typeofPayment'; - static const beneficiaryDetails ='beneficiaryDetails'; - static const beneficiaryName ='beneficiaryName'; - static const idIqama ='idIqama'; - static const beneficiaryBankName ='beneficiaryBankName'; - static const sadadNumber ='sadadNumber'; - static const beneficiaryIBAN ='beneficiaryIBAN'; - static const purchaseOrders ='purchaseOrders'; - static const pOAmount ='pOAmount'; - static const approvalDate ='approvalDate'; - static const versionStatus ='versionStatus'; - static const supplierNo ='supplierNo'; - static const general ="general"; + static const editGroups = 'editGroups'; + static const groupMembers = 'groupMembers'; + static const manageGroup = 'manageGroup'; + static const admin = 'admin'; + static const paymentDetails = 'paymentDetails'; + static const requesterEmpNum = 'requesterEmpNum'; + static const requesterEmpName = 'requesterEmpName'; + static const prepareEmpName = 'prepareEmpName'; + static const requesterPositionName = 'requesterPositionName'; + static const preparePositionName = 'preparePositionName'; + static const requesterPayrollName = 'requesterPayrollName'; + static const general = 'general'; + static const payingORGName = 'payingORGName'; + static const requestAmount = 'requestAmount'; + static const typeofPayment = 'typeofPayment'; + static const beneficiaryDetails = 'beneficiaryDetails'; + static const beneficiaryName = 'beneficiaryName'; + static const idIqama = 'idIqama'; + static const beneficiaryBankName = 'beneficiaryBankName'; + static const sadadNumber = 'sadadNumber'; + static const beneficiaryIBAN = 'beneficiaryIBAN'; + static const purchaseOrders = 'purchaseOrders'; + static const approvalDate = 'approvalDate'; + static const versionStatus = 'versionStatus'; + static const supplierNo = 'supplierNo'; + static const paymentRequest = 'paymentRequest'; } diff --git a/lib/main.dart b/lib/main.dart index 3eabd68..2c1e9f9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,12 +13,14 @@ import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; import 'package:mohem_flutter_app/theme/app_theme.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; import 'package:month_year_picker/month_year_picker.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; import 'package:sizer/sizer.dart'; +bool isDisclosureModuleEnabled = true; // test uat account // username 199067 @@ -74,6 +76,9 @@ Future main() async { ChangeNotifierProvider( create: (_) => MarathonProvider(), ), + ChangeNotifierProvider( + create: (_) => DisclosureProvider(), + ), // ChangeNotifierProvider( // create: (_) => ChatCallProvider(), // ), diff --git a/lib/models/disclosure/disclosure_details_model.dart b/lib/models/disclosure/disclosure_details_model.dart new file mode 100644 index 0000000..80fcb7e --- /dev/null +++ b/lib/models/disclosure/disclosure_details_model.dart @@ -0,0 +1,242 @@ +class DisclosureDetailsModel { + String? id; + String? titleEn; + String? titleAr; + String? descEn; + String? descAr; + int? winDeciderTime; + int? winnersCount; + int? questGapTime; + String? startTime; + String? endTime; + int? marathoneStatusId; + String? scheduleTime; + int? selectedLanguage; + Projects? projects; + List? sponsors; + List? questions; + int? totalQuestions; + int? marathonBufferTime; + bool? displayCorrectAnswer; + + DisclosureDetailsModel({ + id, + titleEn, + titleAr, + descEn, + descAr, + winDeciderTime, + winnersCount, + questGapTime, + startTime, + endTime, + marathoneStatusId, + scheduleTime, + selectedLanguage, + projects, + sponsors, + questions, + totalQuestions, + marathonBufferTime, + displayCorrectAnswer, + }); + + DisclosureDetailsModel.fromJson(Map json) { + id = json['id']; + titleEn = json['titleEn']; + titleAr = json['titleAr']; + descEn = json['descEn']; + descAr = json['descAr']; + winDeciderTime = json['winDeciderTime']; + winnersCount = json['winnersCount']; + questGapTime = json['questGapTime']; + startTime = json['startTime']; + endTime = json['endTime']; + marathoneStatusId = json['marathoneStatusId']; + scheduleTime = json['scheduleTime']; + selectedLanguage = json['selectedLanguage']; + projects = json['projects'] != null ? Projects.fromJson(json['projects']) : null; + if (json['sponsors'] != null) { + sponsors = []; + json['sponsors'].forEach((v) { + sponsors!.add(Sponsors.fromJson(v)); + }); + } + if (json['questions'] != null) { + questions = []; + json['questions'].forEach((v) { + questions!.add(Questions.fromJson(v)); + }); + } + totalQuestions = json["totalQuestions"]; + marathonBufferTime = json["marathonBufferTime"]; + displayCorrectAnswer = json["displayCorrectAnswer"]; + } + + Map toJson() { + Map data = {}; + data['id'] = id; + data['titleEn'] = titleEn; + data['titleAr'] = titleAr; + data['descEn'] = descEn; + data['descAr'] = descAr; + data['winDeciderTime'] = winDeciderTime; + data['winnersCount'] = winnersCount; + data['questGapTime'] = questGapTime; + data['startTime'] = startTime; + data['endTime'] = endTime; + data['marathoneStatusId'] = marathoneStatusId; + data['scheduleTime'] = scheduleTime; + data['selectedLanguage'] = selectedLanguage; + if (projects != null) { + data['projects'] = projects!.toJson(); + } + if (sponsors != null) { + data['sponsors'] = sponsors!.map((v) => v.toJson()).toList(); + } + if (questions != null) { + data['questions'] = questions!.map((v) => v.toJson()).toList(); + } + data['totalQuestions'] = totalQuestions; + data['marathonBufferTime'] = marathonBufferTime; + + return data; + } +} + +class Projects { + String? id; + String? nameEn; + String? nameAr; + String? projectCode; + + Projects({id, nameEn, nameAr, projectCode}); + + Projects.fromJson(Map json) { + id = json['id']; + nameEn = json['nameEn']; + nameAr = json['nameAr']; + projectCode = json['projectCode']; + } + + Map toJson() { + Map data = {}; + data['id'] = id; + data['nameEn'] = nameEn; + data['nameAr'] = nameAr; + data['projectCode'] = projectCode; + return data; + } +} + +class Sponsors { + String? id; + String? nameEn; + String? nameAr; + String? image; + String? video; + String? logo; + List? sponsorPrizes; + + Sponsors({id, nameEn, nameAr, image, video, logo, sponsorPrizes}); + + Sponsors.fromJson(Map json) { + id = json['id']; + nameEn = json['nameEn']; + nameAr = json['nameAr']; + image = json['image']; + video = json['video']; + logo = json['logo']; + if (json['sponsorPrizes'] != null) { + sponsorPrizes = []; + json['sponsorPrizes'].forEach((v) { + sponsorPrizes!.add(SponsorPrizes.fromJson(v)); + }); + } + } + + Map toJson() { + Map data = {}; + data['id'] = id; + data['nameEn'] = nameEn; + data['nameAr'] = nameAr; + data['image'] = image; + data['video'] = video; + data['logo'] = logo; + if (sponsorPrizes != null) { + data['sponsorPrizes'] = sponsorPrizes!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class SponsorPrizes { + String? id; + String? marathonPrizeEn; + String? marathonPrizeAr; + + SponsorPrizes({id, marathonPrizeEn, marathonPrizeAr}); + + SponsorPrizes.fromJson(Map json) { + id = json['id']; + marathonPrizeEn = json['marathonPrizeEn']; + marathonPrizeAr = json['marathonPrizeAr']; + } + + Map toJson() { + Map data = {}; + data['id'] = id; + data['marathonPrizeEn'] = marathonPrizeEn; + data['marathonPrizeAr'] = marathonPrizeAr; + return data; + } +} + +class Questions { + String? id; + String? titleEn; + String? titleAr; + String? marathonId; + int? questionTypeId; + int? questionTime; + int? nextQuestGap; + int? gapType; + String? gapValue; + String? gapImage; + int? questOptionsLimit; + List? questionOptions; + + Questions({id, titleEn, titleAr, marathonId, questionTypeId, questionTime, nextQuestGap, gapType, gapValue, gapImage, questOptionsLimit, questionOptions}); + + Questions.fromJson(Map json) { + id = json['id']; + titleEn = json['titleEn']; + titleAr = json['titleAr']; + marathonId = json['marathonId']; + questionTypeId = json['questionTypeId']; + questionTime = json['questionTime']; + nextQuestGap = json['nextQuestGap']; + gapType = json['gapType']; + gapValue = json['gapValue']; + gapImage = json['gapImage']; + questOptionsLimit = json['questOptionsLimit']; + questionOptions = json['questionOptions']; + } + + Map toJson() { + Map data = {}; + data['id'] = id; + data['titleEn'] = titleEn; + data['titleAr'] = titleAr; + data['marathonId'] = marathonId; + data['questionTypeId'] = questionTypeId; + data['questionTime'] = questionTime; + data['nextQuestGap'] = nextQuestGap; + data['gapType'] = gapType; + data['gapValue'] = gapValue; + data['gapImage'] = gapImage; + data['questOptionsLimit'] = questOptionsLimit; + data['questionOptions'] = questionOptions; + return data; + } +} diff --git a/lib/models/disclosure/disclosure_generic_model.dart b/lib/models/disclosure/disclosure_generic_model.dart new file mode 100644 index 0000000..0429e8c --- /dev/null +++ b/lib/models/disclosure/disclosure_generic_model.dart @@ -0,0 +1,31 @@ +class DisclosureGenericModel { + DisclosureGenericModel({ + this.data, + this.isSuccessful, + this.message, + this.statusCode, + this.errors, + }); + + dynamic data; + bool? isSuccessful; + String? message; + int? statusCode; + dynamic errors; + + factory DisclosureGenericModel.fromJson(Map json) => DisclosureGenericModel( + data: json["data"], + isSuccessful: json["isSuccessful"], + message: json["message"], + statusCode: json["statusCode"], + errors: json["errors"], + ); + + Map toJson() => { + "data": data, + "isSuccessful": isSuccessful, + "message": message, + "statusCode": statusCode, + "errors": errors, + }; +} diff --git a/lib/models/disclosure/disclosure_question_model.dart b/lib/models/disclosure/disclosure_question_model.dart new file mode 100644 index 0000000..7098e17 --- /dev/null +++ b/lib/models/disclosure/disclosure_question_model.dart @@ -0,0 +1,122 @@ +enum DisclosureQuestionsOptionStatus { correct, wrong, selected, unSelected } + +enum DisclosureQuestionCardStatus { question, wrongAnswer, correctAnswer, skippedAnswer, completed, findingWinner, winnerFound } + +class DisclosureQuestionModel { + String? id; + String? titleEn; + String? titleAr; + String? marathonId; + int? questionTypeId; + int? questionTime; + int? nextQuestGap; + int? gapType; + String? gapText; + String? gapImage; + int? questOptionsLimit; + int? remainingParticipantCount; + List? questionOptions; + + DisclosureQuestionModel({ + String? id, + String? titleEn, + String? titleAr, + String? marathonId, + int? questionTypeId, + int? questionTime, + int? nextQuestGap, + int? gapType, + String? gapText, + String? gapImage, + int? questOptionsLimit, + int? remainingParticipantCount, + List? questionOptions, + }); + + DisclosureQuestionModel.fromJson(Map json) { + id = json['id']; + titleEn = json['titleEn']; + titleAr = json['titleAr']; + marathonId = json['marathonId']; + questionTypeId = json['questionTypeId']; + questionTime = json['questionTime']; + nextQuestGap = json['nextQuestGap']; + gapType = json['gapType']; + gapText = json['gapText']; + gapImage = json['gapImage']; + questOptionsLimit = json['questOptionsLimit']; + remainingParticipantCount = json['remainingParticipantCount']; + if (json['questionOptions'] != null) { + questionOptions = []; + json['questionOptions'].forEach((v) { + questionOptions!.add(QuestionOptions.fromJson(v)); + }); + questionOptions!.sort((QuestionOptions a, QuestionOptions b) => a.sequence!.compareTo(b.sequence!)); + } + } + + Map toJson() { + Map data = {}; + data['id'] = id; + data['titleEn'] = titleEn; + data['titleAr'] = titleAr; + data['marathonId'] = marathonId; + data['questionTypeId'] = questionTypeId; + data['questionTime'] = questionTime; + data['nextQuestGap'] = nextQuestGap; + data['gapType'] = gapType; + data['gapText'] = gapText; + data['gapImage'] = gapImage; + data['questOptionsLimit'] = questOptionsLimit; + data['remainingParticipantCount'] = remainingParticipantCount; + if (questionOptions != null) { + data['questionOptions'] = questionOptions!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class QuestionOptions { + String? id; + String? titleEn; + String? titleAr; + String? questionId; + int? sequence; + String? image; + bool? isCorrectOption; + DisclosureQuestionsOptionStatus? optionStatus; + + QuestionOptions({ + String? id, + String? titleEn, + String? titleAr, + String? questionId, + int? sequence, + String? image, + bool? isCorrectOption, + DisclosureQuestionsOptionStatus? optionStatus, + }); + + QuestionOptions.fromJson(Map json) { + id = json['id']; + titleEn = json['titleEn']; + titleAr = json['titleAr']; + questionId = json['questionId']; + sequence = json['sequence']; + image = json['image']; + isCorrectOption = json['isCorrectOption']; + optionStatus = DisclosureQuestionsOptionStatus.unSelected; + } + + Map toJson() { + Map data = {}; + data['id'] = id; + data['titleEn'] = titleEn; + data['titleAr'] = titleAr; + data['questionId'] = questionId; + data['sequence'] = sequence; + data['image'] = image; + data['isCorrectOption'] = isCorrectOption; + return data; + } +} diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart index 0e18544..a576f1f 100644 --- a/lib/provider/dashboard_provider_model.dart +++ b/lib/provider/dashboard_provider_model.dart @@ -112,6 +112,9 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { // DrawerMenuItem("assets/images/drawer/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen), DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword), ]; + if (isDisclosureModuleEnabled) { + drawerMenuItemList.add(DrawerMenuItem("assets/images/drawer/my_team.svg", LocaleKeys.disclosure.tr(), AppRoutes.disclosureIntroScreen)); + } notifyListeners(); } @@ -158,11 +161,11 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { logger.wtf(ex); if (showLoading) Utils.hideLoading(context); notifyListeners(); - Utils.handleException(ex, context, (err) { + Utils.handleException(ex, context, (String err) { Utils.hideLoading(context); showDialog( context: context, - builder: (cxt) => ConfirmDialog( + builder: (BuildContext cxt) => ConfirmDialog( message: err, onTap: () { Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route route) => false); @@ -211,11 +214,11 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { void fetchListMenu() async { try { List menuList = await DashboardApiClient().getListMenu(); - List findMyRequest = menuList.where((element) => element.menuType == "E").toList(); + List findMyRequest = menuList.where((ListMenu element) => element.menuType == "E").toList(); if (findMyRequest.isNotEmpty) { drawerMenuItemList.insert(3, DrawerMenuItem("assets/images/drawer/my_requests.svg", LocaleKeys.myRequest.tr(), AppRoutes.myRequests)); } - List findMyTeam = menuList.where((element) => element.menuType == "M").toList(); + List findMyTeam = menuList.where((ListMenu element) => element.menuType == "M").toList(); if (findMyTeam.isNotEmpty) { AppState().setempStatusIsManager = true; drawerMenuItemList.insert(2, DrawerMenuItem("assets/images/drawer/my_team.svg", LocaleKeys.myTeamMembers.tr(), AppRoutes.myTeam)); @@ -263,7 +266,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { for (int i = 0; i < getMenuEntriesList.length; i++) { if (getMenuEntriesList[i].parentMenuName!.isEmpty) { GetMenuEntriesList abc = GetMenuEntriesList(requestType: "itg_forms", prompt: LocaleKeys.itgForms.tr()); - List list = getMenuEntriesList.where((element) => getMenuEntriesList[i].menuName == element.parentMenuName).toList(); + List list = getMenuEntriesList.where((GetMenuEntriesList element) => getMenuEntriesList[i].menuName == element.parentMenuName).toList(); if (getMenuEntriesList[i].menuName == "MBL_E_PROFESSIONALS_01") { // hard coding this check to add change password for Active Directory diff --git a/lib/ui/chat/create_group.dart b/lib/ui/chat/create_group.dart index 43b2635..0790a64 100644 --- a/lib/ui/chat/create_group.dart +++ b/lib/ui/chat/create_group.dart @@ -17,8 +17,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/models/chat/create_group_request.dart'; import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart'; -import 'package:mohem_flutter_app/models/chat/get_user_groups_by_id.dart' - as groups; +import 'package:mohem_flutter_app/models/chat/get_user_groups_by_id.dart' as groups; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; @@ -86,12 +85,8 @@ class _CreateGroupBottomSheetState extends State { userId: _selectedSearchIndex == 1 ? searchText : "", email: _selectedSearchIndex == 2 ? searchText : "", ); - favouriteUserList = replacementList - ?.where((ReplacementList element) => element.isFavorite ?? false) - .toList(); - nonFavouriteUserList = replacementList - ?.where((ReplacementList element) => !(element.isFavorite ?? false)) - .toList(); + favouriteUserList = replacementList?.where((ReplacementList element) => element.isFavorite ?? false).toList(); + nonFavouriteUserList = replacementList?.where((ReplacementList element) => !(element.isFavorite ?? false)).toList(); Utils.hideLoading(context); setState(() {}); } catch (e) { @@ -108,10 +103,7 @@ class _CreateGroupBottomSheetState extends State { if (provider.pageNo == 1) provider.chatUsersList!.clear(); try { Utils.showLoading(context); - await ChatApiClient() - .getChatMemberFromSearch(searchText, - AppState().chatDetails!.response!.id!, provider.pageNo) - .then((ChatUserModel value) { + await ChatApiClient().getChatMemberFromSearch(searchText, AppState().chatDetails!.response!.id!, provider.pageNo).then((ChatUserModel value) { if (value.response != null) { if (provider.pageNo == 1) { provider.chatUsersList = value.response; @@ -121,8 +113,7 @@ class _CreateGroupBottomSheetState extends State { } } }); - provider.chatUsersList!.removeWhere((ChatUser element) => - element.id == AppState().chatDetails!.response!.id); + provider.chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id); Utils.hideLoading(context); setState(() {}); } catch (e) { @@ -148,7 +139,7 @@ class _CreateGroupBottomSheetState extends State { super.initState(); sc.addListener(scrollListener); provider = Provider.of(context, listen: false); - if (widget.groupDetails.groupName !=null) { + if (widget.groupDetails.groupName != null) { setState(() { groupName = widget.groupDetails.groupName!; isAudioCall = widget.groupDetails.canAudioC!; @@ -186,7 +177,7 @@ class _CreateGroupBottomSheetState extends State { Row( children: [ DynamicTextFieldWidget( - LocaleKeys.groupName.tr(), + LocaleKeys.groupName.tr(), groupName.isEmpty ? LocaleKeys.enterGroupNamePlease.tr() : groupName, inputAction: TextInputAction.done, onChange: (String text) { @@ -206,11 +197,8 @@ class _CreateGroupBottomSheetState extends State { contentPadding: EdgeInsets.zero, title: LocaleKeys.audioCall.tr().toText10(), - checkboxShape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10)), - side: BorderSide( - width: 1.5, - color: Theme.of(context).unselectedWidgetColor), + checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + side: BorderSide(width: 1.5, color: Theme.of(context).unselectedWidgetColor), value: isAudioCall, onChanged: (bool? newValue) { @@ -218,24 +206,21 @@ class _CreateGroupBottomSheetState extends State { isAudioCall = newValue!; }); }, - controlAffinity: ListTileControlAffinity - .leading, // <-- leading Checkbox + controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox )).expanded, SizedBox( height: 35, child: CheckboxListTile( contentPadding: EdgeInsets.zero, - title: LocaleKeys.videoCall.tr().toText10(), - checkboxShape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10)), + title: "LocaleKeys.videoCall.tr()".toText10(), + checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), value: isVideoCall, onChanged: (bool? newValue) { setState(() { isVideoCall = newValue!; }); }, - controlAffinity: ListTileControlAffinity - .leading, // <-- leading Checkbox + controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox )).expanded ], ), @@ -245,33 +230,29 @@ class _CreateGroupBottomSheetState extends State { height: 35, child: CheckboxListTile( contentPadding: EdgeInsets.zero, - title:LocaleKeys.attachments.tr().toText10(), - checkboxShape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10)), + title: LocaleKeys.attachments.tr().toText10(), + checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), value: isAttachments, onChanged: (bool? newValue) { setState(() { isAttachments = newValue!; }); }, - controlAffinity: ListTileControlAffinity - .leading, // <-- leading Checkbox + controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox )).expanded, SizedBox( height: 35, child: CheckboxListTile( contentPadding: EdgeInsets.zero, - checkboxShape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10)), - title:LocaleKeys.shareScreen.tr().toText10(), + checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + title: LocaleKeys.shareScreen.tr().toText10(), value: isShareScreen, onChanged: (bool? newValue) { setState(() { isShareScreen = newValue!; }); }, - controlAffinity: ListTileControlAffinity - .leading, // <-- leading Checkbox + controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox )).expanded ], ), @@ -280,9 +261,8 @@ class _CreateGroupBottomSheetState extends State { 11.height, Row( children: [ - radioOption(widget.fromChat ? LocaleKeys.userId.tr() : LocaleKeys.name.tr(), 0, - _selectedSearchIndex), - radioOption(LocaleKeys.userName.tr(), 1, _selectedSearchIndex), + radioOption(widget.fromChat ? "LocaleKeys.userId.tr()" : LocaleKeys.name.tr(), 0, _selectedSearchIndex), + radioOption("LocaleKeys.userName.tr()", 1, _selectedSearchIndex), radioOption(LocaleKeys.email.tr(), 2, _selectedSearchIndex), ], ), @@ -303,9 +283,8 @@ class _CreateGroupBottomSheetState extends State { constraints: const BoxConstraints(), onPressed: () async { provider.chatUsersList!.clear(); - provider.pageNo =1; - await SystemChannels.textInput - .invokeMethod('TextInput.hide'); + provider.pageNo = 1; + await SystemChannels.textInput.invokeMethod('TextInput.hide'); widget.fromChat ? fetchChatUser() : fetchUserByInput(); }, icon: const Icon(Icons.search), @@ -325,13 +304,11 @@ class _CreateGroupBottomSheetState extends State { ListView.separated( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, - itemBuilder: (BuildContext cxt, int index) => - employeeItemView(favouriteUserList![index]), - separatorBuilder: - (BuildContext cxt, int index) => Container( - height: 1, - color: MyColors.borderE3Color, - ), + itemBuilder: (BuildContext cxt, int index) => employeeItemView(favouriteUserList![index]), + separatorBuilder: (BuildContext cxt, int index) => Container( + height: 1, + color: MyColors.borderE3Color, + ), itemCount: favouriteUserList?.length ?? 0), 12.height, ], @@ -341,14 +318,11 @@ class _CreateGroupBottomSheetState extends State { ListView.separated( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, - itemBuilder: (BuildContext cxt, int index) => - employeeItemView( - nonFavouriteUserList![index]), - separatorBuilder: - (BuildContext cxt, int index) => Container( - height: 1, - color: MyColors.borderE3Color, - ), + itemBuilder: (BuildContext cxt, int index) => employeeItemView(nonFavouriteUserList![index]), + separatorBuilder: (BuildContext cxt, int index) => Container( + height: 1, + color: MyColors.borderE3Color, + ), itemCount: nonFavouriteUserList?.length ?? 0), ], ], @@ -365,51 +339,36 @@ class _CreateGroupBottomSheetState extends State { Column( children: [ 12.height, - Stack(children: [ - Container( - padding:const EdgeInsets.all(5), - child: SvgPicture.asset( - "assets/images/user.svg", - height: 48, - width: 48, - )), - Positioned( - right: 0, - top: 0, - child: InkWell( - child: SvgPicture.asset( - 'assets/icons/close.svg', - height:15, - width:15 - ), - onTap: () { - setState(() { - // provider.chatUsersList![index] - // .isChecked = false; + Stack( + children: [ + Container( + padding: const EdgeInsets.all(5), + child: SvgPicture.asset( + "assets/images/user.svg", + height: 48, + width: 48, + )), + Positioned( + right: 0, + top: 0, + child: InkWell( + child: SvgPicture.asset('assets/icons/close.svg', height: 15, width: 15), + onTap: () { + setState(() { + // provider.chatUsersList![index] + // .isChecked = false; - List user = provider - .chatUsersList! - .where((ChatUser value) => - value.userName == - selectedUsers[index2] - .userName) - .toList(); - if (user.isNotEmpty) { - user.first.isChecked = false; - } - selectedUsers.remove( - selectedUsers[index2]); - }); - }, - )) - ],), - (selectedUsers![index2] - .userName! - .replaceFirst(".", " ") - .capitalizeFirstofEach ?? - "") - .toText12(color: MyColors.darkTextColor) - .paddingOnly(left: 5, top: 5), + List user = provider.chatUsersList!.where((ChatUser value) => value.userName == selectedUsers[index2].userName).toList(); + if (user.isNotEmpty) { + user.first.isChecked = false; + } + selectedUsers.remove(selectedUsers[index2]); + }); + }, + )) + ], + ), + (selectedUsers![index2].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText12(color: MyColors.darkTextColor).paddingOnly(left: 5, top: 5), selectedUsers![index2].isTyping! ? 'Typing...' .toText10( @@ -420,10 +379,7 @@ class _CreateGroupBottomSheetState extends State { ], ), - - - // IconButton(onPressed: (){}, icon: const Icon(Icons.close_outlined, color: Colors.red, size: 20)), - + // IconButton(onPressed: (){}, icon: const Icon(Icons.close_outlined, color: Colors.red, size: 20)), ]); })) : 0.height, @@ -462,12 +418,7 @@ class _CreateGroupBottomSheetState extends State { width: 10, height: 10, decoration: BoxDecoration( - color: provider - .chatUsersList![index] - .userStatus == - 1 - ? MyColors.green2DColor - : Colors.red, + color: provider.chatUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red, ), ).circle(10), ) @@ -475,16 +426,9 @@ class _CreateGroupBottomSheetState extends State { ), Column( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - (provider.chatUsersList![index].userName! - .replaceFirst(".", " ") - .capitalizeFirstofEach ?? - "") - .toText14( - color: MyColors.darkTextColor) - .paddingOnly(left: 11, top: 13), + (provider.chatUsersList![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText14(color: MyColors.darkTextColor).paddingOnly(left: 11, top: 13), provider.chatUsersList![index].isTyping! ? 'Typing...' .toText10( @@ -497,14 +441,11 @@ class _CreateGroupBottomSheetState extends State { SizedBox( width: 60, child: Row( - crossAxisAlignment: - CrossAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.end, mainAxisSize: MainAxisSize.max, children: [ - if (provider.chatUsersList![index] - .unreadMessageCount! > - 0) + if (provider.chatUsersList![index].unreadMessageCount! > 0) Container( alignment: Alignment.center, width: 18, @@ -515,31 +456,22 @@ class _CreateGroupBottomSheetState extends State { Radius.circular(20), ), ), - child: (provider - .chatUsersList![index] - .unreadMessageCount! - .toString()) + child: (provider.chatUsersList![index].unreadMessageCount!.toString()) .toText10( color: MyColors.white, ) .center, ).paddingOnly(right: 10).center, Checkbox( - value: provider - .chatUsersList![index].isChecked, + value: provider.chatUsersList![index].isChecked, shape: CircleBorder(), onChanged: (bool? value) { setState(() { - provider.chatUsersList![index] - .isChecked = value; - if (provider.chatUsersList![index] - .isChecked == - true) { - selectedUsers.add(provider - .chatUsersList![index]); + provider.chatUsersList![index].isChecked = value; + if (provider.chatUsersList![index].isChecked == true) { + selectedUsers.add(provider.chatUsersList![index]); } else { - selectedUsers.remove(provider - .chatUsersList![index]); + selectedUsers.remove(provider.chatUsersList![index]); } }); }, @@ -551,9 +483,7 @@ class _CreateGroupBottomSheetState extends State { ), ); }, - separatorBuilder: (BuildContext context, int index) => - const Divider(color: MyColors.lightGreyE5Color) - .paddingOnly(left: 59), + separatorBuilder: (BuildContext context, int index) => const Divider(color: MyColors.lightGreyE5Color).paddingOnly(left: 59), ).expanded, ], ).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded, @@ -614,11 +544,7 @@ class _CreateGroupBottomSheetState extends State { Expanded( child: (replacement.employeeDisplayName ?? "").toText12(), ), - Icon(Icons.star, - size: 16, - color: replacement.isFavorite! - ? MyColors.yellowFavColor - : MyColors.borderCEColor), + Icon(Icons.star, size: 16, color: replacement.isFavorite! ? MyColors.yellowFavColor : MyColors.borderCEColor), ], ), ), @@ -643,9 +569,7 @@ class _CreateGroupBottomSheetState extends State { width: double.infinity, height: double.infinity, decoration: BoxDecoration( - color: value == groupValue - ? MyColors.grey3AColor - : Colors.transparent, + color: value == groupValue ? MyColors.grey3AColor : Colors.transparent, borderRadius: const BorderRadius.all( Radius.circular(100), ), @@ -664,13 +588,13 @@ class _CreateGroupBottomSheetState extends State { void createGroup() async { RegExp validCharacters = RegExp(r'^[a-zA-Z0-9_\-=@,\.;]+$'); if (!validCharacters.hasMatch(groupName)) { - Utils.showToast(LocaleKeys.enterGroupName.tr()); + // Utils.showToast(LocaleKeys.enterGroupName.tr()); + Utils.showToast("LocaleKeys.enterGroupName.tr()"); } else if (groupName.length < 10) { - Utils.showToast(LocaleKeys.groupNameshouldbe.tr()); + Utils.showToast("LocaleKeys.groupNameshouldbe.tr()"); } else { List? mainUsers = []; - ChatUser admin = - ChatUser.fromJson(AppState().chatDetails!.response!.toJson()); + ChatUser admin = ChatUser.fromJson(AppState().chatDetails!.response!.toJson()); admin.isAdmin = true; admin.userStatus = 2; admin.unreadMessageCount = 0; @@ -687,10 +611,10 @@ class _CreateGroupBottomSheetState extends State { groupName: groupName, adminUserId: AppState().chatDetails!.response!.id); - if(widget.groupDetails!.groupId !=null){ - request.groupId =widget.groupDetails!.groupId; + if (widget.groupDetails!.groupId != null) { + request.groupId = widget.groupDetails!.groupId; await provider.updateGroupAndUsers(request); - }else { + } else { await provider.addGroupAndUsers(request); } Navigator.pop(context); diff --git a/lib/ui/disclosure/disclosure_intro_screen.dart b/lib/ui/disclosure/disclosure_intro_screen.dart new file mode 100644 index 0000000..84b6e6c --- /dev/null +++ b/lib/ui/disclosure/disclosure_intro_screen.dart @@ -0,0 +1,52 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; +import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_details_card.dart'; +import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_footer.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:provider/provider.dart'; + +class DisclosureIntroScreen extends StatelessWidget { + const DisclosureIntroScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + DisclosureProvider provider = context.watch(); + return Scaffold( + appBar: AppBarWidget( + context, + title: LocaleKeys.disclosure.tr(), + onHomeTapped: () { + Navigator.pop(context); + context.setLocale(provider.savedLocale); + }, + onBackTapped: () { + Navigator.pop(context); + context.setLocale(provider.savedLocale); + }, + ), + body: Column( + children: [ + ListView( + padding: const EdgeInsets.all(21), + children: [ + DisclosureDetailsCard(disclosureDetailsCard: provider.disclosureDetailsModel), + 20.height, + // provider.isUpComingMarathon + // ? DisclosureTimerCard( + // provider: provider, + // timeToMarathon: DateTime.parse(provider.marathonDetailModel.startTime!).millisecondsSinceEpoch, + // ) + // : const SizedBox(), + ], + ).expanded, + 1.divider, + DisclosureFooter(provider: provider), + ], + ), + ); + } +} diff --git a/lib/ui/disclosure/disclosure_provider.dart b/lib/ui/disclosure/disclosure_provider.dart new file mode 100644 index 0000000..d06ca3b --- /dev/null +++ b/lib/ui/disclosure/disclosure_provider.dart @@ -0,0 +1,343 @@ +import 'dart:async'; +import 'dart:developer'; + +import 'package:appinio_swiper/appinio_swiper.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/marathon/demo_marathon_repo.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart'; +import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart'; +import 'package:mohem_flutter_app/models/privilege_list_model.dart'; +import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card.dart'; + +class DisclosureProvider extends ChangeNotifier { + //************************************************ VARIABLES ********************************************************** + + final AppinioSwiperController swiperController = AppinioSwiperController(); + DisclosureQuestionsOptionStatus currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected; + DisclosureDetailsModel disclosureDetailsModel = DisclosureDetailsModel(); + List cardContentList = []; + DisclosureQuestionModel currentQuestion = DisclosureQuestionModel(); + List answerStatusesList = []; + DisclosureQuestionCardStatus questionCardStatus = DisclosureQuestionCardStatus.question; + int? selectedOptionIndex; + String? selectedOptionId; + int? totalQualifiers; + Locale savedLocale = const Locale("en", "US"); + String? gapTimeImage; + String? gapTimeText; + int? gapTimeType; + + bool iAmWinner = false; + bool isGettingQualifiers = false; + bool isPrivilegedWithMarathon = false; + + bool _isLoading = false; + + bool get isLoading => _isLoading; + + set isLoading(bool value) { + _isLoading = value; + notifyListeners(); + } + + bool _isButtonEnabled = false; + + bool get isButtonEnabled => _isButtonEnabled; + + set isButtonEnabled(bool value) { + _isButtonEnabled = value; + notifyListeners(); + } + + bool _isUserWaiting = false; + + bool get isUserWaiting => _isUserWaiting; + + set isUserWaiting(bool value) { + _isUserWaiting = value; + notifyListeners(); + } + + bool _isMarathonCompleted = false; + + bool get isMarathonCompleted => _isMarathonCompleted; + + set isMarathonCompleted(bool value) { + _isMarathonCompleted = value; + notifyListeners(); + } + + bool isUserOutOfGame = false; + + set updateIsUserOutOfGame(bool value) { + isUserOutOfGame = value; + notifyListeners(); + } + + int _currentQuestionNumber = 0; + + int get currentQuestionNumber => _currentQuestionNumber; + + set currentQuestionNumber(int value) { + _currentQuestionNumber = value; + notifyListeners(); + } + + void updateCurrentQuestionSelectionStatus(DisclosureQuestionsOptionStatus value) { + currentQuestionSelectionStatus = value; + notifyListeners(); + } + + int _totalMarathoners = 0; + + int get totalMarathoners => _totalMarathoners; + + set totalMarathoners(int value) { + _totalMarathoners = value; + notifyListeners(); + } + + //****************SPONSOR VIDEO PLAYER********** + + // 9c47d281-c5b5-4b5d-a90a-08dacb8cbdb6 + // MarathonI + //************************************************ TIMERS ********************************************************** + + int sponsorsSecondsCounter = 0; + int totalSponsorVideoSeconds = 0; + Timer timerForSponsorVideo = Timer.periodic(const Duration(seconds: 1), (Timer timer) {}); + + void startTimerForSponsorVideo() { + const Duration oneSec = Duration(seconds: 1); + timerForSponsorVideo = Timer.periodic( + oneSec, + (Timer timer) async { + sponsorsSecondsCounter++; + if (totalSponsorVideoSeconds == 0) { + timer.cancel(); + notifyListeners(); + return; + } else { + totalSponsorVideoSeconds--; + } + + notifyListeners(); + }, + ); + } + + int totalSecondsToWaitForMarathon = 30; + + set updateTotalSecondsToWaitForMarathon(int value) { + totalSecondsToWaitForMarathon = value; + notifyListeners(); + } + + //************************************************ FUNCTIONS ********************************************************** + + void updateLanguageAsPerMarathon(BuildContext context, DisclosureDetailsModel detailModel) { + savedLocale = context.locale; + if (detailModel.selectedLanguage == 1) { + context.setLocale(const Locale("en", "US")); + } else if (detailModel.selectedLanguage == 2) { + context.setLocale(const Locale("ar", "SA")); + } else if (detailModel.selectedLanguage == 3) { + } else { + context.setLocale(const Locale("en", "US")); + } + } + + Future callGetQualifiersApi() async { + if (AppState().getIsDemoMarathon) { + totalQualifiers = isUserOutOfGame ? 0 : 1; + } + isGettingQualifiers = false; + notifyListeners(); + } + + Future callGetSelectedWinnersApi() async { + if (AppState().getIsDemoMarathon) { + return; + } + } + + Future callNextQuestionApi() async { + if (currentQuestionNumber < (disclosureDetailsModel.totalQuestions!)) { + if (currentQuestionNumber == 0) { + currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber); + gapTimeImage = currentQuestion.gapImage; + gapTimeText = currentQuestion.gapText; + gapTimeType = currentQuestion.gapType; + updateCardData(); + if (Utils.isLoading) { + Utils.hideLoading(AppRoutes.navigatorKey.currentContext!); + } + Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.disclosureScreen); + } else { + currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber); + } + notifyListeners(); + } + } + + void updateCardData() { + if (currentQuestionNumber > 0) { + // swiperController.swipeLeft(); + } + selectedOptionIndex = null; + currentQuestionNumber++; + + cardContentList.add(const DisclosureCardContent()); + totalMarathoners = currentQuestion.remainingParticipantCount!; + questionCardStatus = DisclosureQuestionCardStatus.question; + notifyListeners(); + } + + void populateQuestionStatusesList() { + answerStatusesList.clear(); + if (disclosureDetailsModel.totalQuestions != null) { + for (int i = 0; i < disclosureDetailsModel.totalQuestions!; i++) { + answerStatusesList.add(DisclosureQuestionCardStatus.question); + } + notifyListeners(); + } + } + + void updateAnswerStatusesList(DisclosureQuestionCardStatus status) { + answerStatusesList[currentQuestionNumber - 1] = status; + notifyListeners(); + } + + void updateCurrentQuestionOptionStatus({required DisclosureQuestionsOptionStatus status, required int selectedOptIndex, required int correctOptionIndex}) { + if (selectedOptionIndex == 0) {} + for (int i = 0; i < currentQuestion.questionOptions!.length; i++) { + currentQuestion.questionOptions![i].optionStatus = DisclosureQuestionsOptionStatus.unSelected; + } + if (status == DisclosureQuestionsOptionStatus.wrong) { + currentQuestion.questionOptions![correctOptionIndex].optionStatus = DisclosureQuestionsOptionStatus.correct; // if person's answer is wrong we have to show him the actual right answer + } + currentQuestion.questionOptions![selectedOptIndex].optionStatus = status; + selectedOptionId = currentQuestion.questionOptions![selectedOptIndex].id; + selectedOptionIndex = selectedOptIndex; + notifyListeners(); + } + + void updateQuestionCardStatus(DisclosureQuestionCardStatus status) { + if (status == DisclosureQuestionCardStatus.wrongAnswer || status == DisclosureQuestionCardStatus.skippedAnswer) { + if (AppState().getIsDemoMarathon) { + updateIsUserOutOfGame = true; + } + } + questionCardStatus = status; + notifyListeners(); + } + + void getCorrectAnswerAndUpdateAnswerColor() { + log("correctOptionIndex"); + int correctOptionIndex = -1; + if (disclosureDetailsModel.displayCorrectAnswer ?? false) { + correctOptionIndex = currentQuestion.questionOptions!.indexWhere((QuestionOptions element) => element.isCorrectOption ?? false); + log("correctOptionIndex: $correctOptionIndex"); + } + + if (selectedOptionIndex != null) { + scheduleMicrotask(() async { + if (AppState().getIsDemoMarathon) { + if (currentQuestion.questionOptions![selectedOptionIndex!].isCorrectOption!) { + updateCurrentQuestionOptionStatus(status: DisclosureQuestionsOptionStatus.correct, selectedOptIndex: selectedOptionIndex!, correctOptionIndex: correctOptionIndex); + } else { + updateCurrentQuestionOptionStatus(status: DisclosureQuestionsOptionStatus.wrong, selectedOptIndex: selectedOptionIndex!, correctOptionIndex: correctOptionIndex); + } + } + }); + } else { + if (!AppState().getIsDemoMarathon) {} + } + } + + void updateCardStatusToAnswer() { + if (currentQuestionNumber == 0) { + return; + } + scheduleMicrotask(() async { + await callNextQuestionApi(); + }); + + if (selectedOptionIndex == null) { + updateQuestionCardStatus(DisclosureQuestionCardStatus.skippedAnswer); + updateAnswerStatusesList(DisclosureQuestionCardStatus.skippedAnswer); + return; + } + if (AppState().getIsDemoMarathon) { + if (currentQuestion.questionOptions![selectedOptionIndex!].isCorrectOption!) { + updateQuestionCardStatus(DisclosureQuestionCardStatus.correctAnswer); + updateAnswerStatusesList(DisclosureQuestionCardStatus.correctAnswer); + } else { + updateQuestionCardStatus(DisclosureQuestionCardStatus.wrongAnswer); + updateAnswerStatusesList(DisclosureQuestionCardStatus.wrongAnswer); + } + return; + } + if (!isUserOutOfGame) { + updateQuestionCardStatus(DisclosureQuestionCardStatus.correctAnswer); + updateAnswerStatusesList(DisclosureQuestionCardStatus.correctAnswer); + return; + } + updateQuestionCardStatus(DisclosureQuestionCardStatus.wrongAnswer); + updateAnswerStatusesList(DisclosureQuestionCardStatus.wrongAnswer); + } + + void resetValues() async { + _currentQuestionNumber = 0; + iAmWinner = false; + cardContentList.clear(); + timerForSponsorVideo.cancel(); + _isMarathonCompleted = false; + isUserOutOfGame = false; + isButtonEnabled = false; + isUserWaiting = false; + sponsorsSecondsCounter = 0; + totalSponsorVideoSeconds = 0; + totalSecondsToWaitForMarathon = 30; + AppState().setIsDemoMarathon = false; + currentQuestion = DisclosureQuestionModel(); + if (answerStatusesList.isNotEmpty) { + for (int i = 0; i < answerStatusesList.length; i++) { + answerStatusesList[i] = DisclosureQuestionCardStatus.question; + } + } + AppRoutes.navigatorKey.currentContext!.setLocale(savedLocale); + notifyListeners(); + } + + bool checkIfPrivilegedForMarathon() { + for (PrivilegeListModel element in AppState().privilegeListModel!) { + if (element.serviceName == "Marathon") { + if (element.previlege != null) { + return element.previlege!; + } + } + } + return false; + } + + Future getDisclosureDetails() async { + isLoading = true; + notifyListeners(); + disclosureDetailsModel = await DisclosureRepo().getDisclosureDetails(); + log("here: ${disclosureDetailsModel.descEn}"); + populateQuestionStatusesList(); + isLoading = false; + notifyListeners(); + } + + Future onJoinDemoMarathonPressed(BuildContext context) async { + AppState().setIsDemoMarathon = true; + await callNextQuestionApi(); + } +} diff --git a/lib/ui/disclosure/disclosure_screen.dart b/lib/ui/disclosure/disclosure_screen.dart new file mode 100644 index 0000000..82095fc --- /dev/null +++ b/lib/ui/disclosure/disclosure_screen.dart @@ -0,0 +1,243 @@ +import 'dart:async'; +import 'dart:developer'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:lottie/lottie.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/consts.dart'; +import 'package:mohem_flutter_app/classes/lottie_consts.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/marathon/question_model.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; +import 'package:mohem_flutter_app/ui/disclosure/widgets/custom_status_widget.dart'; +import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_progress_container.dart'; +import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card.dart'; +import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card_builder.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; +import 'package:provider/provider.dart'; + +class DisclosureScreen extends StatelessWidget { + const DisclosureScreen({Key? key}) : super(key: key); + + Widget getSuccessWidget({required int? gapType, required String? gapImage, required String? gapText}) { + if (gapType == 1) { + if (gapText == null) { + return Image.asset(MyLottieConsts.congratsGif, height: 200); + } + return gapText.toText18(color: MyColors.darkTextColor, isCentered: true); + } + if (gapType == 0) { + if (gapImage == null) { + return Image.asset(MyLottieConsts.congratsGif, height: 200); + } + return Image.network(ApiConsts.marathonBaseUrlServices + gapImage, height: 200); + } + return Image.asset(MyLottieConsts.congratsGif, height: 200); + } + + Widget getDemoWinnerWidget(BuildContext context, {required DisclosureProvider provider}) { + return provider.isUserOutOfGame + ? Column( + children: [ + Lottie.asset(MyLottieConsts.noWinnerLottie), + Center( + child: LocaleKeys.noWinner.tr().toText18(color: MyColors.grey3AColor, isCentered: true), + ), + ], + ) + : Stack( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 50, + child: Stack( + children: [ + Align( + alignment: Alignment.center, + child: SvgPicture.asset("assets/images/winner_ribbon.svg", height: 50), + ), + Align( + alignment: Alignment.center, + child: LocaleKeys.winner.tr().toText32(color: MyColors.white, isBold: true, isCentered: true).paddingOnly(top: 07), + ) + ], + ), + ), + 16.height, + Column( + children: [ + displayLocalizedContent( + isPhoneLangArabic: AppState().isArabic(context), + selectedLanguage: provider.disclosureDetailsModel.selectedLanguage!, + arabicContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr ?? "", + englishContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn ?? "", + ).toText22( + color: MyColors.grey3AColor, + isCentered: true, + ), + 8.height, + AppState().memberInformationList!.eMPLOYEENUMBER!.toText22(color: MyColors.grey57Color), + ], + ), + 60.height, + if (provider.disclosureDetailsModel.sponsors != null && provider.disclosureDetailsModel.sponsors!.isNotEmpty) ...[ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "${LocaleKeys.sponsoredBy.tr()} ".toText14(color: MyColors.grey77Color), + displayLocalizedContent( + isPhoneLangArabic: AppState().isArabic(context), + selectedLanguage: provider.disclosureDetailsModel.selectedLanguage!, + englishContent: provider.disclosureDetailsModel.sponsors!.first.nameEn!, + arabicContent: provider.disclosureDetailsModel.sponsors!.first.nameAr!, + ).toText14( + color: MyColors.darkTextColor, + isBold: true, + ), + ], + ), + 5.height, + Image.network( + ApiConsts.marathonBaseUrlServices + provider.disclosureDetailsModel.sponsors!.first.logo!, + height: 50, + width: 150, + fit: BoxFit.contain, + errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { + return Image.asset("assets/images/logos/main_mohemm_logo.png", height: 50, width: 150); + }, + ) + ], + ], + ), + Lottie.asset(MyLottieConsts.celebrate1Lottie), + ], + ); + } + + + @override + Widget build(BuildContext context) { + DisclosureProvider provider = context.watch(); + return WillPopScope( + child: Scaffold( + appBar: AppBarWidget( + context, + title: LocaleKeys.disclosure.tr(), + onHomeTapped: () { + if (provider.questionCardStatus == QuestionCardStatus.winnerFound) { + provider.resetValues(); + provider.getDisclosureDetails(); + Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + } else { + showDialog( + context: context, + builder: (BuildContext context) => ConfirmDialog( + message: LocaleKeys.youWantToLeaveMarathon.tr(), + onTap: () { + provider.resetValues(); + provider.getDisclosureDetails(); + Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + }, + ), + ); + } + }, + onBackTapped: () { + if (provider.questionCardStatus == QuestionCardStatus.winnerFound) { + provider.resetValues(); + provider.getDisclosureDetails(); + Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + } else { + showDialog( + context: context, + builder: (BuildContext context) => ConfirmDialog( + message: LocaleKeys.youWantToLeaveMarathon.tr(), + onTap: () { + provider.resetValues(); + Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + }, + ), + ); + } + }, + ), + body: Column( + children: [ + ListView( + shrinkWrap: true, + children: [ + 10.height, + if (provider.questionCardStatus == QuestionCardStatus.findingWinner) + ...[] + else if (provider.questionCardStatus == QuestionCardStatus.winnerFound) + ...[] + else ...[ + DisclosureProgressContainer(provider: provider).paddingOnly(left: 21, right: 21), + ], + DisclosureQuestionCardBuilder( + onQuestion: (BuildContext context) => const DisclosureQuestionCard(), + onCompleted: (BuildContext context) => DisclosureCustomStatusWidget( + asset: Lottie.asset(MyLottieConsts.allQuestions, height: 200), + title: LocaleKeys.congrats.tr().toText22(color: MyColors.greenColor), + subTitle: LocaleKeys.allQuestionsCorrect.toText18(color: MyColors.darkTextColor, isCentered: true), + ), + onCorrectAnswer: (BuildContext context) => DisclosureCustomStatusWidget( + asset: getSuccessWidget(gapType: provider.gapTimeType, gapImage: provider.gapTimeImage, gapText: provider.gapTimeText), + title: LocaleKeys.congrats.tr().toText22(color: MyColors.greenColor), + subTitle: LocaleKeys.yourAnswerCorrect.tr().toText18(color: MyColors.darkTextColor, isCentered: true), + ), + onWinner: (BuildContext context) => const SizedBox(), + onWrongAnswer: (BuildContext context) => DisclosureCustomStatusWidget( + asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200), + title: LocaleKeys.oops.tr().toText22(color: MyColors.redColor), + subTitle: LocaleKeys.wrongAnswer.tr().toText18(color: MyColors.darkTextColor, isCentered: true), + ), + onSkippedAnswer: (BuildContext context) => DisclosureCustomStatusWidget( + asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200), + title: LocaleKeys.oops.tr().toText22(color: MyColors.redColor), + subTitle: LocaleKeys.youMissedTheQuestion.tr().toText18(color: MyColors.darkTextColor, isCentered: true), + ), + onFindingWinner: (BuildContext context) => DisclosureCustomStatusWidget( + asset: Lottie.asset(MyLottieConsts.winnerLottie, height: 168, reverse: false, repeat: true), + title: LocaleKeys.fingersCrossed.tr().toText22(color: MyColors.greenColor), + subTitle: LocaleKeys.winnerSelectedRandomly.tr().toText18(color: MyColors.darkTextColor, isCentered: true), + ), + questionCardStatus: provider.questionCardStatus, + ).paddingOnly(top: 12, left: 21, right: 21), + // 50.height, + ], + ).expanded, + DefaultButton( + LocaleKeys.next.tr(), + () {}, + ).insideContainer, + ], + ), + ), + onWillPop: () { + showDialog( + context: context, + builder: (BuildContext context) => ConfirmDialog( + message: LocaleKeys.youWantToLeaveMarathon.tr(), + onTap: () { + provider.resetValues(); + Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + }, + ), + ); + return Future.value(false); + }, + ); + } +} diff --git a/lib/ui/disclosure/disclosure_waiting_screen.dart b/lib/ui/disclosure/disclosure_waiting_screen.dart new file mode 100644 index 0000000..859b5b0 --- /dev/null +++ b/lib/ui/disclosure/disclosure_waiting_screen.dart @@ -0,0 +1,109 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/classes/lottie_consts.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; +import 'package:provider/provider.dart'; + +class DisclosureWaitingScreen extends StatelessWidget { + const DisclosureWaitingScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + DisclosureProvider provider = context.watch(); + return WillPopScope( + onWillPop: () { + showDialog( + context: context, + builder: (BuildContext context) => ConfirmDialog( + message: LocaleKeys.youWantToLeaveMarathon.tr(), + onTap: () { + provider.resetValues(); + Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + }, + ), + ); + return Future.value(false); + }, + child: Scaffold( + appBar: AppBarWidget( + context, + title: LocaleKeys.brainMarathon.tr(), + onHomeTapped: () { + showDialog( + context: context, + builder: (BuildContext context) => ConfirmDialog( + message: LocaleKeys.youWantToLeaveMarathon.tr(), + onTap: () { + provider.resetValues(); + Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + }, + ), + ); + }, + onBackTapped: () { + showDialog( + context: context, + builder: (BuildContext context) => ConfirmDialog( + message: LocaleKeys.youWantToLeaveMarathon.tr(), + onTap: () { + provider.resetValues(); + Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + }, + ), + ); + }, + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: double.infinity, + margin: const EdgeInsets.all(21), + decoration: MyDecorations.shadowDecoration, + child: Stack( + children: [ + Align( + child: Lottie.asset(MyLottieConsts.marathonWaiting, height: 200), + ), + Align( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + LocaleKeys.startingIn.tr().toText16(), + (provider.totalSecondsToWaitForMarathon < 10 ? "0${provider.totalSecondsToWaitForMarathon.toString()}" : provider.totalSecondsToWaitForMarathon.toString()).toText18(color: provider.totalSecondsToWaitForMarathon < 5 ? MyColors.redColor : MyColors.black), + ], + ), + ), + // Align( + // child: Column( + // mainAxisAlignment: MainAxisAlignment.end, + // children: [ + // InkWell( + // onTap: () { + // provider.callNextQuestionApi(); + // provider.timerToWaitForMarathon.cancel(); + // }, + // child: "Join Now".toText16(), + // ).paddingOnly(bottom: 20), + // ], + // ), + // ), + ], + ), + ).expanded, + ], + ), + ), + ); + } +} diff --git a/lib/ui/disclosure/widgets/countdown_timer_main_screen.dart b/lib/ui/disclosure/widgets/countdown_timer_main_screen.dart new file mode 100644 index 0000000..44e7b66 --- /dev/null +++ b/lib/ui/disclosure/widgets/countdown_timer_main_screen.dart @@ -0,0 +1,176 @@ +import 'dart:ui' as ui; + +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_countdown_timer/current_remaining_time.dart'; +import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/main.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; + +class DisclosureCountdownTimerForMainScreen extends StatelessWidget { + final int timeToMarathon; + final DisclosureProvider provider; + + DisclosureCountdownTimerForMainScreen({ + Key? key, + required this.provider, + required this.timeToMarathon, + }) : super(key: key); + + final TextStyle styleTextHome = TextStyle( + color: MyColors.white.withOpacity(0.45), + fontStyle: FontStyle.italic, + fontWeight: FontWeight.w800, + letterSpacing: -0.4, + ); + + final TextStyle styleDigitHome = TextStyle( + height: 22 / 27, + color: MyColors.white, + fontSize: isTablet ? 30 : 15, + fontStyle: FontStyle.italic, + letterSpacing: -1.44, + fontWeight: FontWeight.bold, + ); + + final TextStyle styleTextMarathon = const TextStyle( + fontSize: 10, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w600, + color: MyColors.grey57Color, + letterSpacing: -0.4, + ); + + final TextStyle styleDigitMarathon = const TextStyle( + height: 23 / 24, + color: MyColors.darkTextColor, + fontSize: 34, + letterSpacing: -1.44, + fontWeight: FontWeight.bold, + ); + + Widget buildSeparator() { + return AutoSizeText( + " : ", + maxFontSize: 24, + minFontSize: 20, + style: styleDigitHome, + ); + } + + Widget getTimeDigit(String text) { + return AutoSizeText( + text, + maxFontSize: 24, + minFontSize: 20, + style: styleDigitHome, + ); + } + + Widget getTimeText(String text) { + return AutoSizeText( + text, + minFontSize: 7, + maxFontSize: 8, + style: styleTextHome, + ); + } + + Widget buildEmptyWidget() { + return Directionality( + textDirection: ui.TextDirection.ltr, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + children: [ + getTimeDigit("00"), + getTimeText(LocaleKeys.days.tr()), + ], + ), + buildSeparator(), + Column( + children: [ + getTimeDigit("00"), + getTimeText(LocaleKeys.hours.tr()), + ], + ), + buildSeparator(), + Column( + children: [ + getTimeDigit("00"), + getTimeText(LocaleKeys.minutes.tr()), + ], + ), + buildSeparator(), + Column( + children: [ + getTimeDigit("00"), + getTimeText(LocaleKeys.seconds.tr()), + ], + ), + ], + ), + ); + } + + Widget buildCountdownTimer(CurrentRemainingTime? time) { + if (time == null) { + return buildEmptyWidget(); + } + + return Directionality( + textDirection: ui.TextDirection.ltr, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + children: [ + time.days == null ? getTimeDigit("00") : getTimeDigit(time.days! < 10 ? "0${time.days.toString()}" : time.days.toString()), + getTimeText(LocaleKeys.days.tr()), + ], + ), + buildSeparator(), + Column( + children: [ + time.hours == null ? getTimeDigit("00") : getTimeDigit(time.hours! < 10 ? "0${time.hours.toString()}" : time.hours.toString()), + getTimeText(LocaleKeys.hours.tr()), + ], + ), + buildSeparator(), + Column( + children: [ + time.min == null ? getTimeDigit("00") : getTimeDigit(time.min! < 10 ? "0${time.min.toString()}" : time.min.toString()), + getTimeText(LocaleKeys.minutes.tr()), + ], + ), + buildSeparator(), + Column( + children: [ + time.sec == null ? getTimeDigit("00") : getTimeDigit(time.sec! < 10 ? "0${time.sec.toString()}" : time.sec.toString()), + getTimeText(LocaleKeys.seconds.tr()), + ], + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return CountdownTimer( + endTime: timeToMarathon, + onEnd: null, + widgetBuilder: (BuildContext context, CurrentRemainingTime? time) { + return buildCountdownTimer(time); + }, + ); + } +} diff --git a/lib/ui/disclosure/widgets/custom_status_widget.dart b/lib/ui/disclosure/widgets/custom_status_widget.dart new file mode 100644 index 0000000..1e55712 --- /dev/null +++ b/lib/ui/disclosure/widgets/custom_status_widget.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; + +class DisclosureCustomStatusWidget extends StatelessWidget { + final Widget asset; + final Widget title; + final Widget subTitle; + + const DisclosureCustomStatusWidget({ + Key? key, + required this.asset, + required this.title, + required this.subTitle, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + height: 440, + decoration: MyDecorations.shadowDecoration, + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + asset, + 50.height, + title, + 10.height, + subTitle, + ], + ), + ); + } +} diff --git a/lib/ui/disclosure/widgets/disclosure_banner.dart b/lib/ui/disclosure/widgets/disclosure_banner.dart new file mode 100644 index 0000000..d8a6a14 --- /dev/null +++ b/lib/ui/disclosure/widgets/disclosure_banner.dart @@ -0,0 +1,556 @@ +// import 'dart:developer'; +// import 'dart:math' as math; +// +// import 'package:easy_localization/easy_localization.dart'; +// import 'package:flutter/foundation.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_svg/flutter_svg.dart'; +// import 'package:mohem_flutter_app/app_state/app_state.dart'; +// import 'package:mohem_flutter_app/classes/colors.dart'; +// import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +// import 'package:mohem_flutter_app/classes/utils.dart'; +// import 'package:mohem_flutter_app/config/routes.dart'; +// import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +// import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +// import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +// import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +// import 'package:mohem_flutter_app/main.dart'; +// import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; +// import 'package:mohem_flutter_app/ui/disclosure/widgets/countdown_timer_main_screen.dart'; +// import 'package:provider/provider.dart'; +// +// // It is used to pass a dummy time to test Marathon +// int dummyTime = DateTime.now().millisecondsSinceEpoch + 8690; +// +// class DisclosureBanner extends StatelessWidget { +// const DisclosureBanner({Key? key}) : super(key: key); +// +// Widget getUnPrivilegedMarathon(BuildContext context) { +// return Container( +// decoration: MyDecorations.shadowDecoration, +// height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11, +// clipBehavior: Clip.antiAlias, +// child: Stack( +// children: [ +// Transform( +// alignment: Alignment.center, +// transform: Matrix4.rotationY( +// AppState().isArabic(context) ? math.pi : 0, +// ), +// child: SvgPicture.asset( +// "assets/images/marathon_banner_bg.svg", +// fit: BoxFit.fill, +// width: double.infinity, +// ), +// ), +// AppState().isArabic(context) +// ? Positioned( +// right: -15, +// top: -10, +// child: Transform.rotate( +// angle: 10, +// child: Container( +// width: isTablet ? 70 : 65, +// height: isTablet ? 40 : 32, +// color: MyColors.darkDigitColor, +// ), +// ), +// ) +// : Positioned( +// left: -20, +// top: -10, +// child: Transform.rotate( +// angle: 15, +// child: Container( +// width: isTablet ? 70 : 65, +// height: isTablet ? 40 : 32, +// color: MyColors.darkDigitColor, +// ), +// ), +// ), +// SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Row( +// children: [ +// const Expanded( +// flex: 3, +// child: SizedBox( +// width: double.infinity, +// height: double.infinity, +// ), +// ), +// Expanded( +// flex: AppState().isArabic(context) ? 4 : 5, +// child: SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Row( +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisSize: MainAxisSize.min, +// children: [ +// AppState().isArabic(context) ? 0.height : 5.height, +// Text( +// LocaleKeys.getReadyForContest.tr(), +// style: TextStyle( +// fontSize: isTablet ? 20 : 11, +// fontStyle: FontStyle.italic, +// fontWeight: FontWeight.w600, +// color: MyColors.white.withOpacity(0.83), +// letterSpacing: -0.4, +// ), +// ), +// Text( +// LocaleKeys.brainMarathon.tr(), +// style: TextStyle( +// fontStyle: FontStyle.italic, +// fontSize: isTablet ? 30 : 19, +// fontWeight: FontWeight.bold, +// color: MyColors.white.withOpacity(0.83), +// height: 32 / 22, +// ), +// ), +// ], +// ).paddingOnly( +// left: AppState().isArabic(context) ? 12 : 3, +// right: AppState().isArabic(context) ? 3 : 12, +// ) +// ], +// ), +// ), +// ), +// ], +// ), +// ), +// AppState().isArabic(context) +// ? Align( +// alignment: Alignment.topRight, +// child: SizedBox( +// height: isTablet ? 30 : 20, +// width: isTablet ? 45 : 35, +// child: Transform.rotate( +// angle: math.pi / 4.5, +// child: Text( +// LocaleKeys.brainMarathon.tr(), +// textAlign: TextAlign.center, +// maxLines: 2, +// style: TextStyle( +// color: MyColors.white, +// fontWeight: FontWeight.bold, +// fontSize: isTablet ? 8 : 6, +// height: 1.2, +// ), +// ), +// ), +// ), +// ).paddingOnly(top: 5) +// : Align( +// alignment: Alignment.topLeft, +// child: SizedBox( +// height: isTablet ? 30 : 20, +// width: isTablet ? 45 : 35, +// child: Transform.rotate( +// angle: -math.pi / 4.5, +// child: Text( +// LocaleKeys.brainMarathon.tr(), +// textAlign: TextAlign.center, +// maxLines: 2, +// style: TextStyle( +// color: MyColors.kWhiteColor, +// fontWeight: FontWeight.bold, +// fontSize: isTablet ? 8 : 6, +// height: 1.2, +// ), +// ), +// ), +// ), +// ).paddingOnly(top: 5), +// Container( +// height: double.infinity, +// width: double.infinity, +// color: Colors.black.withOpacity(0.6), +// child: const Icon( +// Icons.lock_rounded, +// color: MyColors.lightGreyIconColor, +// ), +// ), +// ], +// ), +// ); +// } +// +// Widget getNoUpcomingMarathonWidget(BuildContext context) { +// return Container( +// decoration: MyDecorations.shadowDecoration, +// height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11, +// clipBehavior: Clip.antiAlias, +// child: Stack( +// children: [ +// Transform( +// alignment: Alignment.center, +// transform: Matrix4.rotationY( +// AppState().isArabic(context) ? math.pi : 0, +// ), +// child: SvgPicture.asset( +// "assets/images/marathon_banner_bg.svg", +// fit: BoxFit.fill, +// width: double.infinity, +// ), +// ), +// AppState().isArabic(context) +// ? Positioned( +// right: -15, +// top: -10, +// child: Transform.rotate( +// angle: 10, +// child: Container( +// width: isTablet ? 70 : 65, +// height: isTablet ? 40 : 32, +// color: MyColors.darkDigitColor, +// ), +// ), +// ) +// : Positioned( +// left: -20, +// top: -10, +// child: Transform.rotate( +// angle: 15, +// child: Container( +// width: isTablet ? 70 : 65, +// height: isTablet ? 40 : 32, +// color: MyColors.darkDigitColor, +// ), +// ), +// ), +// SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Row( +// children: [ +// const Expanded( +// flex: 3, +// child: SizedBox( +// width: double.infinity, +// height: double.infinity, +// ), +// ), +// Expanded( +// flex: AppState().isArabic(context) ? 4 : 5, +// child: SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Row( +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisSize: MainAxisSize.min, +// children: [ +// AppState().isArabic(context) ? 0.height : 5.height, +// Text( +// LocaleKeys.noUpcoming.tr(), +// style: TextStyle( +// fontSize: isTablet ? 20 : 11, +// fontStyle: FontStyle.italic, +// fontWeight: FontWeight.w600, +// color: MyColors.white.withOpacity(0.83), +// letterSpacing: -0.4, +// ), +// ), +// Text( +// LocaleKeys.brainMarathon.tr(), +// style: TextStyle( +// fontStyle: FontStyle.italic, +// fontSize: isTablet ? 30 : 19, +// fontWeight: FontWeight.bold, +// color: MyColors.white.withOpacity(0.83), +// height: 32 / 22, +// ), +// ), +// Text( +// LocaleKeys.youCanPlayDemo.tr(), +// style: TextStyle( +// fontSize: isTablet ? 20 : 11, +// fontStyle: FontStyle.italic, +// fontWeight: FontWeight.w600, +// color: MyColors.white.withOpacity(0.83), +// letterSpacing: -0.4, +// ), +// ), +// ], +// ).paddingOnly( +// left: AppState().isArabic(context) ? 12 : 3, +// right: AppState().isArabic(context) ? 3 : 12, +// ) +// ], +// ), +// ), +// ), +// ], +// ), +// ), +// AppState().isArabic(context) +// ? Align( +// alignment: Alignment.topRight, +// child: SizedBox( +// height: isTablet ? 30 : 20, +// width: isTablet ? 45 : 35, +// child: Transform.rotate( +// angle: math.pi / 4.5, +// child: Text( +// LocaleKeys.brainMarathon.tr(), +// textAlign: TextAlign.center, +// maxLines: 2, +// style: TextStyle( +// color: MyColors.white, +// fontWeight: FontWeight.bold, +// fontSize: isTablet ? 8 : 6, +// height: 1.2, +// ), +// ), +// ), +// ), +// ).paddingOnly(top: 5) +// : Align( +// alignment: Alignment.topLeft, +// child: SizedBox( +// height: isTablet ? 30 : 20, +// width: isTablet ? 45 : 35, +// child: Transform.rotate( +// angle: -math.pi / 4.5, +// child: Text( +// LocaleKeys.brainMarathon.tr(), +// textAlign: TextAlign.center, +// maxLines: 2, +// style: TextStyle( +// color: MyColors.kWhiteColor, +// fontWeight: FontWeight.bold, +// fontSize: isTablet ? 8 : 6, +// height: 1.2, +// ), +// ), +// ), +// ), +// ).paddingOnly(top: 5), +// ], +// ), +// ).onPress(() { +// Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); +// }); +// } +// +// @override +// Widget build(BuildContext context) { +// DisclosureProvider provider = context.read(); +// // if(provider.isUserWaiting) { +// // provider.isUserWaiting = false; +// // provider.getMarathonDetailsFromApi(); +// // } +// return !provider.isPrivilegedWithMarathon +// ? getUnPrivilegedMarathon(context) +// : provider.isUpComingMarathon +// ? Container( +// decoration: MyDecorations.shadowDecoration, +// height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11, +// clipBehavior: Clip.antiAlias, +// child: Stack( +// children: [ +// Transform( +// alignment: Alignment.center, +// transform: Matrix4.rotationY( +// AppState().isArabic(context) ? math.pi : 0, +// ), +// child: SvgPicture.asset( +// "assets/images/marathon_banner_bg.svg", +// fit: BoxFit.fill, +// width: double.infinity, +// ), +// ), +// AppState().isArabic(context) +// ? Positioned( +// right: -15, +// top: -10, +// child: Transform.rotate( +// angle: 10, +// child: Container( +// width: isTablet ? 70 : 65, +// height: isTablet ? 40 : 32, +// color: MyColors.darkDigitColor, +// ), +// ), +// ) +// : Positioned( +// left: -20, +// top: -10, +// child: Transform.rotate( +// angle: 15, +// child: Container( +// width: isTablet ? 70 : 65, +// height: isTablet ? 40 : 32, +// color: MyColors.darkDigitColor, +// ), +// ), +// ), +// SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Row( +// children: [ +// const Expanded( +// flex: 3, +// child: SizedBox( +// width: double.infinity, +// height: double.infinity, +// ), +// ), +// Expanded( +// flex: AppState().isArabic(context) ? 4 : 5, +// child: SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Row( +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisSize: MainAxisSize.min, +// children: [ +// AppState().isArabic(context) ? 0.height : 5.height, +// Text( +// LocaleKeys.getReadyForContest.tr(), +// style: TextStyle( +// fontSize: isTablet ? 20 : 11, +// fontStyle: FontStyle.italic, +// fontWeight: FontWeight.w600, +// color: MyColors.white.withOpacity(0.83), +// letterSpacing: -0.4, +// ), +// ), +// Flexible( +// child: Text( +// displayLocalizedContent( +// isPhoneLangArabic: AppState().isArabic(context), +// selectedLanguage: provider.marathonDetailModel.selectedLanguage ?? 0, +// englishContent: provider.marathonDetailModel.titleEn ?? "", +// arabicContent: provider.marathonDetailModel.titleAr ?? "", +// ), +// overflow: TextOverflow.ellipsis, +// style: TextStyle( +// fontStyle: FontStyle.italic, +// fontSize: isTablet ? 30 : 19, +// fontWeight: FontWeight.bold, +// color: MyColors.white.withOpacity(0.83), +// height: 32 / 22, +// ), +// ), +// ), +// isTablet ? 10.height : 3.height, +// DisclosureCountdownTimerForMainScreen( +// timeToMarathon: DateTime.parse(provider.marathonDetailModel.startTime!).millisecondsSinceEpoch, +// provider: provider, +// ), +// ], +// ).paddingOnly( +// left: AppState().isArabic(context) ? 12 : 3, +// right: AppState().isArabic(context) ? 3 : 12, +// ) +// ], +// ), +// ), +// ), +// ], +// ), +// ), +// AppState().isArabic(context) +// ? Align( +// alignment: Alignment.topRight, +// child: SizedBox( +// height: isTablet ? 30 : 20, +// width: isTablet ? 45 : 35, +// child: Transform.rotate( +// angle: math.pi / 4.5, +// child: Text( +// LocaleKeys.brainMarathon.tr(), +// textAlign: TextAlign.center, +// maxLines: 2, +// style: TextStyle( +// color: MyColors.white, +// fontWeight: FontWeight.bold, +// fontSize: isTablet ? 8 : 6, +// height: 1.2, +// ), +// ), +// ), +// ), +// ).paddingOnly(top: 5) +// : Align( +// alignment: Alignment.topLeft, +// child: SizedBox( +// height: isTablet ? 30 : 20, +// width: isTablet ? 45 : 35, +// child: Transform.rotate( +// angle: -math.pi / 4.5, +// child: Text( +// LocaleKeys.brainMarathon.tr(), +// textAlign: TextAlign.center, +// maxLines: 2, +// style: TextStyle( +// color: MyColors.kWhiteColor, +// fontWeight: FontWeight.bold, +// fontSize: isTablet ? 8 : 6, +// height: 1.2, +// ), +// ), +// ), +// ), +// ).paddingOnly(top: 5), +// !AppState().isArabic(context) +// ? Positioned( +// right: 0, +// bottom: 0, +// child: RotatedBox( +// quarterTurns: 4, +// child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), +// ).paddingAll(isTablet ? 20 : 15), +// ) +// : Positioned( +// bottom: 0, +// left: 0, +// child: RotatedBox( +// quarterTurns: 2, +// child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), +// ).paddingAll(isTablet ? 20 : 15), +// ), +// ], +// ).onPress(() async { +// int remainingTimeInMinutes = DateTime.parse(provider.marathonDetailModel.startTime!).difference(DateTime.now()).inMinutes; +// if (remainingTimeInMinutes > 5 && provider.marathonDetailModel.sponsors != null && provider.marathonDetailModel.sponsors!.isNotEmpty) { +// Utils.showLoading(context); +// // try { +// // await provider.initializeVideoPlayer().then((_) { +// // Utils.hideLoading(context); +// // provider.startTimerForSponsorVideo(); +// // Navigator.pushNamed(context, AppRoutes.marathonSponsorVideoScreen); +// // }); +// // } catch (e) { +// // if (kDebugMode) { +// // log("Error in VideoPlayer: ${e.toString()}"); +// // } +// // Utils.hideLoading(context); +// // Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); +// // } +// } else { +// Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); +// } +// provider.updateLanguageAsPerMarathon(context, provider.isUpComingMarathon ? provider.marathonDetailModel : provider.demoMarathonDetailModel); +// }), +// ) +// : getNoUpcomingMarathonWidget(context); +// } +// } diff --git a/lib/ui/disclosure/widgets/disclosure_details_card.dart b/lib/ui/disclosure/widgets/disclosure_details_card.dart new file mode 100644 index 0000000..769ec0d --- /dev/null +++ b/lib/ui/disclosure/widgets/disclosure_details_card.dart @@ -0,0 +1,122 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/consts.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; +import 'package:provider/provider.dart'; + +class DisclosureDetailsCard extends StatelessWidget { + final DisclosureDetailsModel disclosureDetailsCard; + + const DisclosureDetailsCard({Key? key, required this.disclosureDetailsCard}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: MyDecorations.shadowDecoration, + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 14), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + decoration: BoxDecoration(color: MyColors.yellowColorII, borderRadius: BorderRadius.circular(100)), + child: LocaleKeys.demo.tr().toText10(color: MyColors.white).paddingAll(4), + ), + ], + ), + 7.height, + LocaleKeys.contestTopicAbout.tr().toText16(color: MyColors.grey77Color), + displayLocalizedContent( + isPhoneLangArabic: AppState().isArabic(context), + selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0, + englishContent: disclosureDetailsCard.titleEn ?? "", + arabicContent: disclosureDetailsCard.titleAr ?? "", + ).toText20(color: MyColors.textMixColor, isBold: true), + Row( + children: [ + Flexible( + child: displayLocalizedContent( + isPhoneLangArabic: AppState().isArabic(context), + selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0, + englishContent: disclosureDetailsCard.descEn ?? "", + arabicContent: disclosureDetailsCard.descAr ?? "", + ).toText14( + color: MyColors.grey77Color, + ), + ) + ], + ), + if (disclosureDetailsCard.sponsors != null && disclosureDetailsCard.sponsors!.isNotEmpty) ...[ + 5.height, + disclosureDetailsCard.sponsors!.first.sponsorPrizes != null + ? Row( + children: [ + "${LocaleKeys.prize.tr()} ".toText16(color: MyColors.grey77Color), + Expanded( + child: SizedBox( + height: 30, + child: ListView.builder( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemCount: disclosureDetailsCard.sponsors!.first.sponsorPrizes!.length, + itemBuilder: (BuildContext context, int index) { + SponsorPrizes prizes = disclosureDetailsCard.sponsors!.first.sponsorPrizes![index]; + return Container( + decoration: BoxDecoration(color: MyColors.backgroundColor, borderRadius: BorderRadius.circular(100), border: Border.all(color: MyColors.grey57Color.withOpacity(0.1))), + child: displayLocalizedContent( + isPhoneLangArabic: AppState().isArabic(context), + selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0, + englishContent: prizes.marathonPrizeEn ?? "", + arabicContent: prizes.marathonPrizeAr ?? "", + ).toText16(color: MyColors.greenColor, isBold: true).paddingOnly(left: 5, right: 5), + ).paddingOnly(left: 5); + }, + ), + ), + ) + ], + ) + : const SizedBox(), + Row( + children: [ + "${LocaleKeys.sponsoredBy.tr()} ".toText16(color: MyColors.grey77Color), + displayLocalizedContent( + isPhoneLangArabic: AppState().isArabic(context), + selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0, + englishContent: disclosureDetailsCard.sponsors?.first.nameEn ?? "", + arabicContent: disclosureDetailsCard.sponsors?.first.nameAr ?? "", + ).toText16(color: MyColors.darkTextColor, isBold: true), + ], + ), + 10.height, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.network( + ApiConsts.marathonBaseUrlServices + disclosureDetailsCard.sponsors!.first.logo!, + height: 50, + width: 150, + fit: BoxFit.contain, + errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { + return Image.asset("assets/images/logos/main_mohemm_logo.png", height: 50, width: 150); + }, + ) + ], + ), + ] + ], + ), + ); + } +} diff --git a/lib/ui/disclosure/widgets/disclosure_footer.dart b/lib/ui/disclosure/widgets/disclosure_footer.dart new file mode 100644 index 0000000..b573bba --- /dev/null +++ b/lib/ui/disclosure/widgets/disclosure_footer.dart @@ -0,0 +1,51 @@ +// ignore_for_file: always_specify_types + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; + +class DisclosureFooter extends StatelessWidget { + final DisclosureProvider provider; + + const DisclosureFooter({Key? key, required this.provider}) : super(key: key); + + Widget buildNoteForDemo() { + return RichText( + text: TextSpan( + children: [ + TextSpan( + text: LocaleKeys.note.tr(), + style: const TextStyle(color: MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.64, fontWeight: FontWeight.bold), + ), + TextSpan( + text: " " + LocaleKeys.demoMarathonNoteP1.tr(), + style: const TextStyle(color: MyColors.grey77Color, fontSize: 17, letterSpacing: -0.64, fontWeight: FontWeight.w500), + ), + TextSpan( + text: " " + LocaleKeys.demoMarathonNoteP2.tr(), + style: const TextStyle(color: MyColors.darkTextColor, fontSize: 17, fontWeight: FontWeight.bold), + ), + TextSpan( + text: " " + LocaleKeys.demoMarathonNoteP3.tr(), + style: const TextStyle(color: MyColors.grey77Color, fontSize: 17, letterSpacing: -0.64, fontWeight: FontWeight.w500), + ) + ], + ), + ).paddingOnly(right: 21, left: 21, top: 11, bottom: 0); + } + + @override + Widget build(BuildContext context) { + { + return DefaultButton( + LocaleKeys.joinDemoMarathon.tr(), + () => provider.onJoinDemoMarathonPressed(context), + color: MyColors.yellowColorII, + ).insideContainer; + } + } +} diff --git a/lib/ui/disclosure/widgets/disclosure_header.dart b/lib/ui/disclosure/widgets/disclosure_header.dart new file mode 100644 index 0000000..21a7310 --- /dev/null +++ b/lib/ui/disclosure/widgets/disclosure_header.dart @@ -0,0 +1,37 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; + +class DisclosureHeader extends StatelessWidget { + const DisclosureHeader({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Container( + color: MyColors.kWhiteColor, + width: double.infinity, + height: 65, + padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 15), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.brainMarathon.tr().toText24(isBold: true), + IconButton( + padding: EdgeInsets.zero, + icon: const Icon(Icons.close, size: 28), + color: MyColors.black, + constraints: const BoxConstraints(), + onPressed: () { + Navigator.pop(context); + }, + ) + ], + ), + ), + ); + } +} diff --git a/lib/ui/disclosure/widgets/disclosure_progress_container.dart b/lib/ui/disclosure/widgets/disclosure_progress_container.dart new file mode 100644 index 0000000..7bbaddf --- /dev/null +++ b/lib/ui/disclosure/widgets/disclosure_progress_container.dart @@ -0,0 +1,122 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; + +class DisclosureProgressContainer extends StatelessWidget { + final DisclosureProvider provider; + + const DisclosureProgressContainer({Key? key, required this.provider}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: MyDecorations.shadowDecoration, + padding: const EdgeInsets.fromLTRB(13, 5, 13, 18), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + 5.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + decoration: BoxDecoration(color: MyColors.greenColor, borderRadius: BorderRadius.circular(5)), + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8), + child: "${provider.currentQuestionNumber.toString()} / ${provider.disclosureDetailsModel.totalQuestions.toString()} ${LocaleKeys.disclosure.tr()}".toText12(color: MyColors.white), + ), + ], + ), + 12.height, + stepper( + provider.currentQuestionNumber, + provider.answerStatusesList, + provider.disclosureDetailsModel.totalQuestions!, + provider.isUserOutOfGame, + ), + 8.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "${provider.currentQuestionNumber == 1 ? 0 : (((provider.currentQuestionNumber - 1) / (provider.disclosureDetailsModel.totalQuestions!)) * 100).toInt()}% ${LocaleKeys.completed.tr()}".toText14(), + provider.isUserOutOfGame ? LocaleKeys.youAreOutOfContest.tr().toText13(color: MyColors.redColor) : const SizedBox(), + ], + ), + ], + ), + ); + } + + Color getStepColor(DisclosureQuestionCardStatus status, bool isOutOfGame) { + switch (status) { + case DisclosureQuestionCardStatus.question: + return MyColors.yellowColorII; + case DisclosureQuestionCardStatus.wrongAnswer: + return MyColors.lightGreyDeColor; + case DisclosureQuestionCardStatus.correctAnswer: + return MyColors.lightGreyDeColor; + case DisclosureQuestionCardStatus.skippedAnswer: + return MyColors.lightGreyDeColor; + case DisclosureQuestionCardStatus.completed: + return MyColors.lightGreyDeColor; + case DisclosureQuestionCardStatus.findingWinner: + return MyColors.lightGreyDeColor; + case DisclosureQuestionCardStatus.winnerFound: + return MyColors.lightGreyDeColor; + } + } + + Widget stepper(int value, List statusesList, int totalQuestions, bool isOutOfGame) { + return SizedBox( + width: double.infinity, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + for (int i = 0; i < totalQuestions; i++) + if (value <= i) + roundContainer(MyColors.lightGreyDeColor, i != 0) + else + roundContainer( + getStepColor(statusesList[i], isOutOfGame), + i != 0, + ) + ], + ), + ); + } + + Widget roundContainer(Color color, bool isNeedLeftBorder) { + if (isNeedLeftBorder) { + return Row( + children: [ + Divider( + thickness: 6, + color: color, + ).expanded, + Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.zero, + width: 10, + height: 10, + decoration: BoxDecoration(shape: BoxShape.circle, color: color, border: Border.all(color: color, width: 2)), + ), + ], + ).expanded; + } + + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.zero, + width: 10, + height: 10, + decoration: BoxDecoration(shape: BoxShape.circle, color: color, border: Border.all(color: color, width: 2)), + ); + } +} diff --git a/lib/ui/disclosure/widgets/disclosure_question_card.dart b/lib/ui/disclosure/widgets/disclosure_question_card.dart new file mode 100644 index 0000000..e899173 --- /dev/null +++ b/lib/ui/disclosure/widgets/disclosure_question_card.dart @@ -0,0 +1,173 @@ +import 'package:appinio_swiper/appinio_swiper.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/classes/lottie_consts.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; +import 'package:provider/provider.dart'; + +class DisclosureQuestionCard extends StatelessWidget { + const DisclosureQuestionCard({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + DisclosureProvider provider = context.read(); + return CupertinoPageScaffold( + child: provider.cardContentList.isEmpty + ? Lottie.asset(MyLottieConsts.hourGlassLottie, height: 250).paddingOnly(top: 50) + : SizedBox( + height: MediaQuery.of(context).size.height * .45, + width: double.infinity, + child: AppinioSwiper( + duration: const Duration(milliseconds: 400), + padding: EdgeInsets.zero, + isDisabled: true, + controller: provider.swiperController, + unswipe: (int index, AppinioSwiperDirection direction) {}, + onSwipe: (int index, AppinioSwiperDirection direction) {}, + cards: provider.cardContentList, + ), + ), + ); + } +} + +class DisclosureCardContent extends StatelessWidget { + const DisclosureCardContent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + DisclosureProvider provider = context.watch(); + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: CupertinoColors.white, + boxShadow: [ + BoxShadow( + color: CupertinoColors.systemGrey.withOpacity(0.2), + spreadRadius: 3, + blurRadius: 7, + offset: const Offset(0, 3), + ) + ], + ), + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: double.infinity, + decoration: const BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10), + topRight: Radius.circular(10), + ), + ), + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 15), + child: Text( + displayLocalizedContent( + isPhoneLangArabic: AppState().isArabic(context), + selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0, + englishContent: provider.currentQuestion.titleEn ?? "", + arabicContent: provider.currentQuestion.titleAr ?? "", + ), + style: const TextStyle( + color: MyColors.darkTextColor, + fontSize: 15, + height: 21 / 14, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ), + const DisclosureAnswerContent(), + ], + ), + ); + } +} + +class DisclosureAnswerContent extends StatelessWidget { + const DisclosureAnswerContent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + DisclosureProvider provider = context.watch(); + return Container( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 13), + decoration: const BoxDecoration( + color: MyColors.kWhiteColor, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(10), + bottomRight: Radius.circular(10), + ), + ), + child: provider.currentQuestion.questionOptions != null + ? Row( + children: List.generate( + provider.currentQuestion.questionOptions!.length, + (int index) => Expanded( + child: DisclosureAnswerTileForText( + index: index, + onAnswerTapped: () => provider.updateCurrentQuestionOptionStatus(status: DisclosureQuestionsOptionStatus.selected, selectedOptIndex: index, correctOptionIndex: -1), // + ).paddingAll(8), + ), + ), + ) + : const SizedBox()); + } +} + +class DisclosureAnswerTileForText extends StatelessWidget { + final int index; + final Function() onAnswerTapped; + + const DisclosureAnswerTileForText({Key? key, required this.index, required this.onAnswerTapped}) : super(key: key); + + Color getAnswerTextColor(DisclosureQuestionsOptionStatus status) { + switch (status) { + case DisclosureQuestionsOptionStatus.correct: + return MyColors.white; + case DisclosureQuestionsOptionStatus.wrong: + return MyColors.white; + case DisclosureQuestionsOptionStatus.selected: + return MyColors.white; + case DisclosureQuestionsOptionStatus.unSelected: + return MyColors.darkTextColor; + } + } + + @override + Widget build(BuildContext context) { + DisclosureProvider provider = context.watch(); + return InkWell( + onTap: () { + provider.isUserOutOfGame ? Utils.showToast(LocaleKeys.youAreOutOfContest.tr()) : onAnswerTapped(); + }, + child: Container( + alignment: Alignment.centerLeft, + decoration: MyDecorations.getAnswersContainerColorForDisclosure(provider.currentQuestion.questionOptions![index].optionStatus!), + child: Center( + child: displayLocalizedContent( + isPhoneLangArabic: AppState().isArabic(context), + selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0, + englishContent: provider.currentQuestion.questionOptions![index].titleEn ?? "", + arabicContent: provider.currentQuestion.questionOptions![index].titleAr ?? "", + ).toText16(color: provider.isUserOutOfGame ? MyColors.darkTextColor : getAnswerTextColor(provider.currentQuestion.questionOptions![index].optionStatus!)).paddingOnly(top: 13, bottom: 13), + ), + ), + ); + } +} diff --git a/lib/ui/disclosure/widgets/disclosure_question_card_builder.dart b/lib/ui/disclosure/widgets/disclosure_question_card_builder.dart new file mode 100644 index 0000000..5abc43a --- /dev/null +++ b/lib/ui/disclosure/widgets/disclosure_question_card_builder.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart'; + +class DisclosureQuestionCardBuilder extends StatelessWidget { + final WidgetBuilder onQuestion; + final WidgetBuilder onCompleted; + final WidgetBuilder onWrongAnswer; + final WidgetBuilder onCorrectAnswer; + final WidgetBuilder onWinner; + final WidgetBuilder onSkippedAnswer; + final WidgetBuilder onFindingWinner; + final DisclosureQuestionCardStatus questionCardStatus; + + const DisclosureQuestionCardBuilder({ + Key? key, + required this.onQuestion, + required this.onCompleted, + required this.onCorrectAnswer, + required this.onWinner, + required this.onSkippedAnswer, + required this.onWrongAnswer, + required this.onFindingWinner, + required this.questionCardStatus, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + switch (questionCardStatus) { + case DisclosureQuestionCardStatus.question: + return onQuestion(context); + + case DisclosureQuestionCardStatus.wrongAnswer: + return onWrongAnswer(context); + + case DisclosureQuestionCardStatus.correctAnswer: + return onCorrectAnswer(context); + + case DisclosureQuestionCardStatus.completed: + return onCompleted(context); + + case DisclosureQuestionCardStatus.winnerFound: + return onWinner(context); + + case DisclosureQuestionCardStatus.findingWinner: + return onFindingWinner(context); + + case DisclosureQuestionCardStatus.skippedAnswer: + return onSkippedAnswer(context); + } + } +} diff --git a/lib/ui/disclosure/widgets/disclosure_timer_card.dart b/lib/ui/disclosure/widgets/disclosure_timer_card.dart new file mode 100644 index 0000000..73317a5 --- /dev/null +++ b/lib/ui/disclosure/widgets/disclosure_timer_card.dart @@ -0,0 +1,55 @@ +// import 'package:easy_localization/easy_localization.dart'; +// import 'package:flutter/material.dart'; +// import 'package:lottie/lottie.dart'; +// import 'package:mohem_flutter_app/app_state/app_state.dart'; +// import 'package:mohem_flutter_app/classes/colors.dart'; +// import 'package:mohem_flutter_app/classes/date_uitl.dart'; +// import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +// import 'package:mohem_flutter_app/classes/lottie_consts.dart'; +// import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +// import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +// import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; +// import 'package:mohem_flutter_app/ui/disclosure/widgets/countdown_timer_detail_screen.dart'; +// +// +// class DisclosureTimerCard extends StatelessWidget { +// final int timeToMarathon; +// final DisclosureProvider provider; +// +// const DisclosureTimerCard({ +// Key? key, +// required this.provider, +// required this.timeToMarathon, +// }) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// return Container( +// width: double.infinity, +// decoration: MyDecorations.shadowDecoration, +// padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 14), +// child: Column( +// children: [ +// Row( +// children: [ +// "${LocaleKeys.gameDate.tr()} ".toText16(color: MyColors.grey77Color), +// DateUtil.getMonthDayYearDateFormatted(DateTime.parse(provider.marathonDetailModel.startTime!)).toText16(color: MyColors.darkTextColor, isBold: true), +// ], +// ), +// Row( +// children: [ +// "${LocaleKeys.gameTime.tr()} ".toText16(color: MyColors.grey77Color), +// DateUtil.formatDateToTimeLang(DateTime.parse(provider.marathonDetailModel.startTime!), AppState().isArabic(context)).toText16(color: MyColors.darkTextColor, isBold: true), +// ], +// ), +// Lottie.asset(MyLottieConsts.hourGlassLottie, height: 200), +// DisclosureCountdownTimerForDetailScreen( +// // timeToMarathon: dummyTime, +// timeToMarathon: timeToMarathon, +// provider: provider, +// ), +// ], +// ), +// ); +// } +// } diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 333d271..f9c756d 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -22,6 +22,7 @@ import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.da import 'package:mohem_flutter_app/models/privilege_list_model.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; +import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart'; import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart'; @@ -49,6 +50,7 @@ class DashboardScreen extends StatefulWidget { class _DashboardScreenState extends State with WidgetsBindingObserver { late DashboardProviderModel data; late MarathonProvider marathonProvider; + late DisclosureProvider disclosureProvider; late ChatProviderModel cProvider; final GlobalKey _scaffoldState = GlobalKey(); @@ -63,6 +65,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb scheduleMicrotask(() { data = Provider.of(context, listen: false); marathonProvider = Provider.of(context, listen: false); + disclosureProvider = Provider.of(context, listen: false); cProvider = Provider.of(context, listen: false); if (checkIfPrivilegedForChat()) { _bHubCon(); @@ -152,6 +155,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb data.fetchMenuEntries(); data.getCategoryOffersListAPI(context); marathonProvider.getMarathonDetailsFromApi(); + disclosureProvider.getDisclosureDetails(); marathonProvider.getMarathonTutorial(); if (isFromInit) { checkERMChannel(); @@ -370,9 +374,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.checkIn.tr().toText12(color: Colors.white), - (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn) - .toString() - .toText14(color: Colors.white, isBold: true), + (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn).toString().toText14(color: Colors.white, isBold: true), 4.height, ], ).paddingOnly(left: 12, right: 12), @@ -502,9 +504,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb ), 4.height, Expanded( - child: AppState().isArabic(context) - ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1) - : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1), + child: AppState().isArabic(context) ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1) : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1), ), ], ), diff --git a/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart b/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart index b4cb242..30a9fa2 100644 --- a/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart +++ b/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart @@ -76,7 +76,7 @@ class _OffersAndDiscountsDetailsState extends State { : getOffersList[0].titleEn!.toText22(isBold: true, color: const Color(0xff2B353E)).center, Html( data: AppState().isArabic(context) ? getOffersList[0].descriptionAr! : getOffersList[0].descriptionEn ?? "", - onLinkTap: (String? url, RenderContext context, Map attributes, _) { + onLinkTap: (String? url, Map attributes, _) { launchUrl(Uri.parse(url!)); }, ), diff --git a/lib/ui/work_list/worklist_fragments/info_fragments.dart b/lib/ui/work_list/worklist_fragments/info_fragments.dart index 1351126..0540f4d 100644 --- a/lib/ui/work_list/worklist_fragments/info_fragments.dart +++ b/lib/ui/work_list/worklist_fragments/info_fragments.dart @@ -820,7 +820,7 @@ class InfoFragment extends StatelessWidget { ItemDetailGrid( ItemDetailViewCol( LocaleKeys.poNumber.tr(), data.purchaseOrdersList![0].poNumber ?? ""), - ItemDetailViewCol(LocaleKeys.pOAmount.tr(), + ItemDetailViewCol("LocaleKeys.pOAmount.tr()", data.purchaseOrdersList![0].poAmount.toString() ?? ""), ), ItemDetailGrid(