From b9b65bbaa624ef54c6f358df0799247085bd4a48 Mon Sep 17 00:00:00 2001 From: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:58:09 +0530 Subject: [PATCH 01/33] Removed privacy policy from main app to digit component (#569) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updated the integer form picker and added a new text block component (#441) * updated the integer picker and added a new text block component * added a field to change the width of button * modified text block component to conditionally render children --------- Co-authored-by: rachana-egov * updated description for household location and details page (#443) Co-authored-by: rachana-egov * replaced product variant dropdown to selection card (#445) Co-authored-by: rachana-egov * HLM-6283:: IRS- Household Details Fields added (#444) * Updated checklist for a new type boolean (#446) * updated checklist for a new type boolean * added To Do to fix hard code options --------- Co-authored-by: rachana-egov * HLM-6282 and HLM-6283:: House Structure Details Page added (#447) * HLM-6283:: IRS- Household Details Fields added * HLM-6283:: House Structure Details Page * integrated checklist inside the beneficiary flow and updated gender field to selection card (#450) Co-authored-by: rachana-egov * HLM-6371:: Beneficiary Registration Summary Page (#452) * HLM-6283:: IRS- Household Details Fields added * HLM-6283:: House Structure Details Page * HLM-6371:: Beneficiary Registration Summary Page * Updated registration_delivery script * Added refused delivery page (#451) * integrated checklist inside the beneficiary flow and updated gender field to selection card * fetching refusal reasons * added refused delivery page * added refused delivery page --------- Co-authored-by: rachana-egov Co-authored-by: Naveen J <83631045+naveen-egov@users.noreply.github.com> * No delivery flow page (#453) Co-authored-by: rachana-egov * HLM-6367:: Auto Create project beneficiary (#454) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved --------- Co-authored-by: Naveen Renati * Hlm 6414 - MDMS StatusFilter, Filter search (#448) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * HCMPRE-98 Filter search pagination, Removed private PageState (#457) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * Created a new package for marking closed household (#459) * Created a new package for marking closed household * fixed build issues * updated the name to userAction --------- Co-authored-by: rachana-egov * HCMPRE-98 - Inventory TeamCode fixes, Filter search fixes (#460) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * Hcmpre 118 - Closed Household, Filter improvements, Bug fixes (#467) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart * Exposed Registration delivery pages * updated remote repository and some miner fixes (#461) Co-authored-by: rachana-egov * HCMPRE-82:: Validations and Bug Fixes * small css fixes (#462) Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * merge fix * added closed household search * status model fix * Closed-household-registration (#464) * closed-household-registration * closed-household-registration * updated pub file --------- Co-authored-by: rachana-egov * added closed household init file modified user_action.dart model and db corrected modified closed household status * updated registration for closed household * added closed_household search and updating closed household status * clearing search before navigating to registration flow * getting last tasks in household_overview.dart * HCMPRE-107:: Summary page added for Delivery Flow, HCMPRE-111:: Disable Delete household if beneficiary not present (#463) * Validation and gps fixes * fixed closed household count clearing closedhould results for clear * pagination fix for closed household * sync down for closed household, updated scan voucher button, and remove the tag when we navigate to a different page (#465) Co-authored-by: rachana-egov * DeliverySummary Route added to main app * seperated closedhousehold search Bug fixes - HCMPRE-112, 110, 113 * updated all the points of this ticket HCMPRE-120 (#466) Co-authored-by: rachana-egov * Bug Fixes, dev version release of packages * HCMPRE-119:: IRS Demo fixes (#468) * HCMPRE-119:: IRS Demo fixes * Removed unused code * updated closed button action to push closedhousehold tasks filter with last fix * updated validation for closed household name and fix error message size (#470) Co-authored-by: rachana-egov * Irs demo fix patch (#469) * HCMPRE-119:: IRS Demo fixes * Removed unused code * Edit Household if no project beneficiary fix * reverted hiding of digit search bar when closed filter is applied * status update based on last task status in household_overview.dart mapped administered success in beneficiary_card.dart moved getstatus to utils.dart * fixed offset increasing twice * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes (#471) * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes * Added date formats to constants * fixed offset increasing twice closed household distance fix emitting scanner state loading * dev version bump-up for registration and scanner * version updates for packages --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov * Hcmpre 155 - ClosedHousehold flow change (#478) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart * Exposed Registration delivery pages * updated remote repository and some miner fixes (#461) Co-authored-by: rachana-egov * HCMPRE-82:: Validations and Bug Fixes * small css fixes (#462) Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * merge fix * added closed household search * status model fix * Closed-household-registration (#464) * closed-household-registration * closed-household-registration * updated pub file --------- Co-authored-by: rachana-egov * added closed household init file modified user_action.dart model and db corrected modified closed household status * updated registration for closed household * added closed_household search and updating closed household status * clearing search before navigating to registration flow * getting last tasks in household_overview.dart * HCMPRE-107:: Summary page added for Delivery Flow, HCMPRE-111:: Disable Delete household if beneficiary not present (#463) * Validation and gps fixes * fixed closed household count clearing closedhould results for clear * pagination fix for closed household * sync down for closed household, updated scan voucher button, and remove the tag when we navigate to a different page (#465) Co-authored-by: rachana-egov * DeliverySummary Route added to main app * seperated closedhousehold search Bug fixes - HCMPRE-112, 110, 113 * updated all the points of this ticket HCMPRE-120 (#466) Co-authored-by: rachana-egov * Bug Fixes, dev version release of packages * HCMPRE-119:: IRS Demo fixes (#468) * HCMPRE-119:: IRS Demo fixes * Removed unused code * updated closed button action to push closedhousehold tasks filter with last fix * updated validation for closed household name and fix error message size (#470) Co-authored-by: rachana-egov * Irs demo fix patch (#469) * HCMPRE-119:: IRS Demo fixes * Removed unused code * Edit Household if no project beneficiary fix * reverted hiding of digit search bar when closed filter is applied * status update based on last task status in household_overview.dart mapped administered success in beneficiary_card.dart moved getstatus to utils.dart * fixed offset increasing twice * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes (#471) * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes * Added date formats to constants * fixed offset increasing twice closed household distance fix emitting scanner state loading * dev version bump-up for registration and scanner * version updates for packages * View Household button added in delete individual success page, Search project beneficiary fix * added close button to close the filter and disabled the clear button … (#475) * added close button to close the filter and disabled the clear button unless something is selected * added validation for closed household head name same as individual * updated the condition for validation of closehousehold head --------- Co-authored-by: rachana-egov * View Household button added in delete individual success page, Search project beneficiary fix (#474) * Search beneficiary fix * Search beneficiary fix * Bloc dispose fix * Bloc dispose fix * Updated task based search for household * Modified closed household package to use registration flow for creating a household and related data along with task as closed deleted user_action from data_model package Updating closed_household to not_delivered status after closed household registration * version updates of closed_household, digit_components, digit_data_model, registration_delivery * version upgrade for registration_delivery --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * Hcmpre 164, 165 - Count implementation for filter search (#485) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * Resolved code comments --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * fixed reports are not getting refreshed after updating facility (#486) Co-authored-by: rachana-egov * Delivery summary page Resources and quantity added (#473) * Delivery summary page Resources and quantity added * fix for offset increment twice * Delivery summary page Resources and quantity added --------- Co-authored-by: Naveen Renati Co-authored-by: Naveen J <83631045+naveen-egov@users.noreply.github.com> * updated script for closed household (#489) Co-authored-by: rachana-egov * Hcmpre 166 - Moved Localization from ISAR To SQL (#488) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * created new table for localization TODO: separate packages localization delegates to individual package and move the localization model to data_model package for common usage Delete localization related isar files once tested * init Boundary code wise localization.dart * create localization local repo modified module separation from query to exclude and include specified module * modified module exclude in boundary page * modified localization call for boundary selection bug where first value is localized in dropdown * removed un-required localization bloc calls * updated index value to selected language on home * removed login cred --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Removed null condition, fixed double is not a subtype of string issue and added null check for table (#490) * HCMPRE-156 : type 'double' is not a subtype of type 'String' * added check if the first table row is null --------- Co-authored-by: rachana-egov Co-authored-by: Naveen J <83631045+naveen-egov@users.noreply.github.com> * HCMPRE-177:: Metric and Table Charts Integration in Mobile dashboard and digit_dss package initial release (#480) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * HCMPRE-55 Dashboard Static Screen added * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart * Exposed Registration delivery pages * updated remote repository and some miner fixes (#461) Co-authored-by: rachana-egov * HCMPRE-82:: Validations and Bug Fixes * small css fixes (#462) Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * merge fix * added closed household search * status model fix * Closed-household-registration (#464) * closed-household-registration * closed-household-registration * updated pub file --------- Co-authored-by: rachana-egov * added closed household init file modified user_action.dart model and db corrected modified closed household status * updated registration for closed household * added closed_household search and updating closed household status * clearing search before navigating to registration flow * getting last tasks in household_overview.dart * HCMPRE-107:: Summary page added for Delivery Flow, HCMPRE-111:: Disable Delete household if beneficiary not present (#463) * Validation and gps fixes * fixed closed household count clearing closedhould results for clear * pagination fix for closed household * sync down for closed household, updated scan voucher button, and remove the tag when we navigate to a different page (#465) Co-authored-by: rachana-egov * DeliverySummary Route added to main app * seperated closedhousehold search Bug fixes - HCMPRE-112, 110, 113 * updated all the points of this ticket HCMPRE-120 (#466) Co-authored-by: rachana-egov * Bug Fixes, dev version release of packages * HCMPRE-119:: IRS Demo fixes (#468) * HCMPRE-119:: IRS Demo fixes * Removed unused code * updated closed button action to push closedhousehold tasks filter with last fix * updated validation for closed household name and fix error message size (#470) Co-authored-by: rachana-egov * Irs demo fix patch (#469) * HCMPRE-119:: IRS Demo fixes * Removed unused code * Edit Household if no project beneficiary fix * reverted hiding of digit search bar when closed filter is applied * status update based on last task status in household_overview.dart mapped administered success in beneficiary_card.dart moved getstatus to utils.dart * fixed offset increasing twice * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes (#471) * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes * Added date formats to constants * fixed offset increasing twice closed household distance fix emitting scanner state loading * dev version bump-up for registration and scanner * version updates for packages * View Household button added in delete individual success page, Search project beneficiary fix * added close button to close the filter and disabled the clear button … (#475) * added close button to close the filter and disabled the clear button unless something is selected * added validation for closed household head name same as individual * updated the condition for validation of closehousehold head --------- Co-authored-by: rachana-egov * View Household button added in delete individual success page, Search project beneficiary fix (#474) * Search beneficiary fix * Search beneficiary fix * Bloc dispose fix * Bloc dispose fix * Updated task based search for household * HCMPRE-177:: Metric Chart Integration and digit_dss package setup * HCMPRE-177:: Added Refresh Indicator for refreshing the dashboard * HCMPRE-177:: Table chart integration and Refresh logic update * Added code comments for digit_dss package * Added enums and constants * Resolved code comments and updated versions for packages * HCMPRE177:: Moved dashboard UI Config to MDMS * HCMPRE177:: Added dss_import script for digit_dss package * Resolved code comments * Updated dashboard Config * Added dashboard config search to try catch block * Resolved conflicts * published data_model and registration_delivery * Added Read me file and updated pubspec.yaml --------- Co-authored-by: Naveen Renati Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * HCMPRE-177:: Fetch and send attendees uuids of registers to dss filters (#491) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * HCMPRE-55 Dashboard Static Screen added * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart * Exposed Registration delivery pages * updated remote repository and some miner fixes (#461) Co-authored-by: rachana-egov * HCMPRE-82:: Validations and Bug Fixes * small css fixes (#462) Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * merge fix * added closed household search * status model fix * Closed-household-registration (#464) * closed-household-registration * closed-household-registration * updated pub file --------- Co-authored-by: rachana-egov * added closed household init file modified user_action.dart model and db corrected modified closed household status * updated registration for closed household * added closed_household search and updating closed household status * clearing search before navigating to registration flow * getting last tasks in household_overview.dart * HCMPRE-107:: Summary page added for Delivery Flow, HCMPRE-111:: Disable Delete household if beneficiary not present (#463) * Validation and gps fixes * fixed closed household count clearing closedhould results for clear * pagination fix for closed household * sync down for closed household, updated scan voucher button, and remove the tag when we navigate to a different page (#465) Co-authored-by: rachana-egov * DeliverySummary Route added to main app * seperated closedhousehold search Bug fixes - HCMPRE-112, 110, 113 * updated all the points of this ticket HCMPRE-120 (#466) Co-authored-by: rachana-egov * Bug Fixes, dev version release of packages * HCMPRE-119:: IRS Demo fixes (#468) * HCMPRE-119:: IRS Demo fixes * Removed unused code * updated closed button action to push closedhousehold tasks filter with last fix * updated validation for closed household name and fix error message size (#470) Co-authored-by: rachana-egov * Irs demo fix patch (#469) * HCMPRE-119:: IRS Demo fixes * Removed unused code * Edit Household if no project beneficiary fix * reverted hiding of digit search bar when closed filter is applied * status update based on last task status in household_overview.dart mapped administered success in beneficiary_card.dart moved getstatus to utils.dart * fixed offset increasing twice * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes (#471) * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes * Added date formats to constants * fixed offset increasing twice closed household distance fix emitting scanner state loading * dev version bump-up for registration and scanner * version updates for packages * View Household button added in delete individual success page, Search project beneficiary fix * added close button to close the filter and disabled the clear button … (#475) * added close button to close the filter and disabled the clear button unless something is selected * added validation for closed household head name same as individual * updated the condition for validation of closehousehold head --------- Co-authored-by: rachana-egov * View Household button added in delete individual success page, Search project beneficiary fix (#474) * Search beneficiary fix * Search beneficiary fix * Bloc dispose fix * Bloc dispose fix * Updated task based search for household * HCMPRE-177:: Metric Chart Integration and digit_dss package setup * HCMPRE-177:: Added Refresh Indicator for refreshing the dashboard * HCMPRE-177:: Table chart integration and Refresh logic update * Added code comments for digit_dss package * Added enums and constants * Resolved code comments and updated versions for packages * HCMPRE177:: Moved dashboard UI Config to MDMS * HCMPRE177:: Added dss_import script for digit_dss package * Resolved code comments * Updated dashboard Config * Added dashboard config search to try catch block * Resolved conflicts * published data_model and registration_delivery * Added Read me file and updated pubspec.yaml * Fetch and send attendees uuids of registers to dss filters * Added dss filters --------- Co-authored-by: Naveen Renati Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Task update rather than creating new, updated filter popup loading (#493) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * Resolved code comments * HCMPRE220:: Household overview state update on pushing to Registration Wrapper * update task state if task is already present * updated selection box to update on initial selection change and updated delivery comment code * remove changes from beneficiary * task update * HCMPRE-220:: SMC Not registered flow reload fix,and closed household Not delivered status fix * added loader for filter search * Added name of user to additional details in stock and delivery record * updated delivery intervention * check summary page condition for edit flow * fixed task update for delivery intervention * fixed household detail page --------- Co-authored-by: rachana-egov Co-authored-by: Naveen Renati Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * updated status and registration_delivery_enums.dart (#494) * updated status and registration_delivery_enums.dart updated check for check-list check in household_overview.dart * Todo for individual check in beneficiary_registration.dart * Uploaded pre release for inventory-management and digit-dss (#495) * removed the page count from filter, updated status filter pop up (#496) Co-authored-by: rachana-egov * updated demo changes (#498) Co-authored-by: rachana-egov * added lat and long inside additional field when user submit the checklist (#526) Co-authored-by: rachana-egov * HCMPRE-221 data segration (#501) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * created new table for localization TODO: separate packages localization delegates to individual package and move the localization model to data_model package for common usage Delete localization related isar files once tested * init Boundary code wise localization.dart * create localization local repo modified module separation from query to exclude and include specified module * modified module exclude in boundary page * modified localization call for boundary selection bug where first value is localized in dropdown * removed un-required localization bloc calls * updated index value to selected language on home * Uploaded pre release for inventory-management and digit-dss * Updated delivery enums for Not delivered status * Updated status model in task to taskStatus * Updated registration delivery package * Reverted Task Model status key change * Update pubspec with latest version of packages * Summary page Type of resource locale key updated * Resolved comments * Resolved comments and unused variables * Resolved comments and unused variables * Updated version * Updated individual_global_search.dart for search * added data segration * check to enable edit delivery * added project filter * Registration delivery- Attendance management fixes (#497) * Removed captured location dialog on attendance submit * Removed stpper if deliveries length is greater than 1 * Updated digit_components and digit_data_model packages in attendance management * Updated digit_components and digit_data_model packages in attendance management * Localization loader and dialog localization fix (#505) * added dialog till localization is not loaded * fixed localization not coming issue * added a util funtion to show language loading --------- Co-authored-by: rachana-egov * updated search added project id in beneficiary search removed commented code * User uuids filter fixes for attendees local search in an attendance register (#512) * User uuids filters fixes for attendees search in a register * Removed default dashboard card from home * Sync fix --------- Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Added Task address mapping on refused delivery (#514) * replace and push homepage from boundary page sync dialog * updated register search query to exclude attendee and staff in limit query updated attendance and registration_delivery package * registration_delivery package update * * Added error toast for network failure (#525) * No result card added if no charts available * Updated end date for dss charts to 23:59 instead of 11:59 (#527) * task create fix - removed condition check of resources during create updated changelog of registration, closed, digit_data_model, inventory, registration_delivery --dry-run fixes * Updated stable packages for scanner, attendance and dss (#528) * updated packages to latest version digit_components version update --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Naveen Renati Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Added Privacy Policy (#499) * added data privacy component * added privacy component * updated localization * updated the dialog to use localized value * updated privacy config inside mdms * updated privacy model * removed local privacy config now coming from mdms * Delete packages/digit_components/lib/widgets/atoms/privacy_component.dart as component is part of main application * fixed github build issue * added a configuration to enable or disable this privacy policy component * fix the issue when privacy policy component is not there * fix the issue when privacy policy component is not there * fixed github comments --------- Co-authored-by: rachana-egov * HCMPRE-332:: Mobile dashboard added check for lastSyncTime to convert to date format (#540) * HCMPRE-332:: Mobile dashboard added check for lastSyncTime to convert to date format * added a enum for lastSyncedTime --------- Co-authored-by: rachana-egov * Hcmpre 263 - Sync write transaction for ISAR - fix, Localization fall back (#538) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * created new table for localization TODO: separate packages localization delegates to individual package and move the localization model to data_model package for common usage Delete localization related isar files once tested * init Boundary code wise localization.dart * create localization local repo modified module separation from query to exclude and include specified module * modified module exclude in boundary page * modified localization call for boundary selection bug where first value is localized in dropdown * removed un-required localization bloc calls * updated index value to selected language on home * Uploaded pre release for inventory-management and digit-dss * Updated delivery enums for Not delivered status * Updated status model in task to taskStatus * Updated registration delivery package * Reverted Task Model status key change * Update pubspec with latest version of packages * Summary page Type of resource locale key updated * Resolved comments * Resolved comments and unused variables * Resolved comments and unused variables * Updated version * Updated individual_global_search.dart for search * added data segration * check to enable edit delivery * added project filter * Registration delivery- Attendance management fixes (#497) * Removed captured location dialog on attendance submit * Removed stpper if deliveries length is greater than 1 * Updated digit_components and digit_data_model packages in attendance management * Updated digit_components and digit_data_model packages in attendance management * Localization loader and dialog localization fix (#505) * added dialog till localization is not loaded * fixed localization not coming issue * added a util funtion to show language loading --------- Co-authored-by: rachana-egov * updated search added project id in beneficiary search removed commented code * User uuids filter fixes for attendees local search in an attendance register (#512) * User uuids filters fixes for attendees search in a register * Removed default dashboard card from home * Sync fix --------- Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Added Task address mapping on refused delivery (#514) * replace and push homepage from boundary page sync dialog * updated register search query to exclude attendee and staff in limit query updated attendance and registration_delivery package * registration_delivery package update * * Added error toast for network failure (#525) * No result card added if no charts available * Updated end date for dss charts to 23:59 instead of 11:59 (#527) * task create fix - removed condition check of resources during create updated changelog of registration, closed, digit_data_model, inventory, registration_delivery --dry-run fixes * Updated stable packages for scanner, attendance and dss (#528) * updated packages to latest version digit_components version update * added fallback ui dialog when localization call fails. * added localization code * merge from dev * fix for isar transaction lock issue * moved boundary localization path to constants. Updated dialog in language_selection.dart page * isar lock fix * updated data_model version for isar fix. updated a check in language_selection.dart for dialog --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov Co-authored-by: naveen-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * Impel changes - background-services, beneficiary_checklist (#548) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * created new table for localization TODO: separate packages localization delegates to individual package and move the localization model to data_model package for common usage Delete localization related isar files once tested * init Boundary code wise localization.dart * create localization local repo modified module separation from query to exclude and include specified module * modified module exclude in boundary page * modified localization call for boundary selection bug where first value is localized in dropdown * removed un-required localization bloc calls * updated index value to selected language on home * Uploaded pre release for inventory-management and digit-dss * Updated delivery enums for Not delivered status * Updated status model in task to taskStatus * Updated registration delivery package * Reverted Task Model status key change * Update pubspec with latest version of packages * Summary page Type of resource locale key updated * Resolved comments * Resolved comments and unused variables * Resolved comments and unused variables * Updated version * Updated individual_global_search.dart for search * added data segration * check to enable edit delivery * added project filter * Registration delivery- Attendance management fixes (#497) * Removed captured location dialog on attendance submit * Removed stpper if deliveries length is greater than 1 * Updated digit_components and digit_data_model packages in attendance management * Updated digit_components and digit_data_model packages in attendance management * Localization loader and dialog localization fix (#505) * added dialog till localization is not loaded * fixed localization not coming issue * added a util funtion to show language loading --------- Co-authored-by: rachana-egov * updated search added project id in beneficiary search removed commented code * User uuids filter fixes for attendees local search in an attendance register (#512) * User uuids filters fixes for attendees search in a register * Removed default dashboard card from home * Sync fix --------- Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Added Task address mapping on refused delivery (#514) * replace and push homepage from boundary page sync dialog * updated register search query to exclude attendee and staff in limit query updated attendance and registration_delivery package * registration_delivery package update * * Added error toast for network failure (#525) * No result card added if no charts available * Updated end date for dss charts to 23:59 instead of 11:59 (#527) * task create fix - removed condition check of resources during create updated changelog of registration, closed, digit_data_model, inventory, registration_delivery --dry-run fixes * Updated stable packages for scanner, attendance and dss (#528) * updated packages to latest version digit_components version update * added fallback ui dialog when localization call fails. * added localization code * merge from dev * fix for isar transaction lock issue * moved boundary localization path to constants. Updated dialog in language_selection.dart page * isar lock fix * pulled changes from impel related to background service added missing audit details and client audit details for beneficiary_checklist.dart --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov Co-authored-by: naveen-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * resolved code rabbit comments (#549) * privacy policy config issue fix (#550) Co-authored-by: rachana-egov * fixed text ellipse issue (#553) Co-authored-by: rachana-egov * Resource validation added (#555) * added project valid check, fixed house type selection issue, added resource duplicate check * removed split code for boundary * fixed pop up not closing issue * removed credentials --------- Co-authored-by: rachana-egov * UAT fixes, HCMPRE-412 (#556) * added project valid check, fixed house type selection issue, added resource duplicate check * removed split code for boundary * fixed pop up not closing issue * removed credentials * HCMPRE-412 - creating beneficiary for all individuals if not registered, reload event fix, removed dialog for loader of localization.dart * added check condition to show status and updated selection card * beneficiary_checklist.dart code compare with enum * fix state not getting updated issue (#557) Co-authored-by: rachana-egov * Fixed dashboard chart delete fixes in isar (#558) * Resource validation added (#555) * added project valid check, fixed house type selection issue, added resource duplicate check * removed split code for boundary * fixed pop up not closing issue * removed credentials --------- Co-authored-by: rachana-egov * Fixed dashboard chart delete fixes in isar * Update language_selection.dart --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * updated packages version and published --------- Co-authored-by: rachana-egov Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * removed dialog closing function from language page (#560) Co-authored-by: rachana-egov * remved privacy policy from main app to digit component --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> Co-authored-by: Naveen J <83631045+naveen-egov@users.noreply.github.com> Co-authored-by: Naveen Renati Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> Co-authored-by: Ramkrishna-egov Co-authored-by: naveen-egov --- .../lib/pages/login.dart | 30 +- .../lib/utils/localization_delegates.dart | 7 +- .../pubspec.lock | 7 +- .../lib/blocs/localization.dart | 52 ++ .../lib/blocs/localization_delegates.dart | 33 + .../privacy_notice/privacy_notice_model.dart | 50 ++ .../privacy_notice_model.freezed.dart | 808 ++++++++++++++++++ .../privacy_notice_model.g.dart | 83 ++ .../lib/models/privacy_policy_model.dart | 95 ++ .../lib/utils/i18_key_constants.dart | 20 + .../lib/widgets/localized.dart | 33 + .../privacy_notice/privacy_component.dart | 9 +- .../privacy_notice/privacy_notice_dialog.dart | 11 +- .../privacy_notice_expand_component.dart | 13 +- 14 files changed, 1229 insertions(+), 22 deletions(-) create mode 100644 packages/digit_components/lib/blocs/localization.dart create mode 100644 packages/digit_components/lib/blocs/localization_delegates.dart create mode 100644 packages/digit_components/lib/models/privacy_notice/privacy_notice_model.dart create mode 100644 packages/digit_components/lib/models/privacy_notice/privacy_notice_model.freezed.dart create mode 100644 packages/digit_components/lib/models/privacy_notice/privacy_notice_model.g.dart create mode 100644 packages/digit_components/lib/models/privacy_policy_model.dart create mode 100644 packages/digit_components/lib/utils/i18_key_constants.dart create mode 100644 packages/digit_components/lib/widgets/localized.dart rename {apps/health_campaign_field_worker_app => packages/digit_components}/lib/widgets/privacy_notice/privacy_component.dart (96%) rename {apps/health_campaign_field_worker_app => packages/digit_components}/lib/widgets/privacy_notice/privacy_notice_dialog.dart (95%) rename {apps/health_campaign_field_worker_app => packages/digit_components}/lib/widgets/privacy_notice/privacy_notice_expand_component.dart (96%) diff --git a/apps/health_campaign_field_worker_app/lib/pages/login.dart b/apps/health_campaign_field_worker_app/lib/pages/login.dart index f0912efb5..1a3fdd019 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/login.dart +++ b/apps/health_campaign_field_worker_app/lib/pages/login.dart @@ -1,5 +1,7 @@ import 'package:digit_components/digit_components.dart'; +import 'package:digit_components/models/privacy_notice/privacy_notice_model.dart'; import 'package:digit_components/widgets/atoms/digit_toaster.dart'; +import 'package:digit_components/widgets/privacy_notice/privacy_component.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:reactive_forms/reactive_forms.dart'; @@ -11,7 +13,7 @@ import '../router/app_router.dart'; import '../utils/environment_config.dart'; import '../utils/i18_key_constants.dart' as i18; import '../widgets/localized.dart'; -import '../widgets/privacy_notice/privacy_component.dart'; + @RoutePage() class LoginPage extends LocalizedStatefulWidget { @@ -140,7 +142,7 @@ class _LoginPageState extends LocalizedState { form.control(_privacyCheck).setValidators([Validators.requiredTrue]); form.control(_privacyCheck).updateValueAndValidity(); return PrivacyComponent( - privacyPolicy: privacyPolicyJson, + privacyPolicy: convertToPrivacyPolicyModel(privacyPolicyJson), formControlName: _privacyCheck, text: localizations .translate(i18.privacyPolicy.privacyNoticeText), @@ -237,3 +239,27 @@ class _LoginPageState extends LocalizedState { ) }); } + + +// convert to privacy notice model +PrivacyNoticeModel? convertToPrivacyPolicyModel(PrivacyPolicy? privacyPolicy) { + return PrivacyNoticeModel( + header: privacyPolicy?.header ?? '', + module: privacyPolicy?.module ?? '', + active: privacyPolicy?.active, + contents: privacyPolicy?.contents?.map((content) => ContentNoticeModel( + header: content.header, + descriptions: content.descriptions?.map((description) => DescriptionNoticeModel( + text: description.text, + type: description.type, + isBold: description.isBold, + subDescriptions: description.subDescriptions?.map((subDescription) => SubDescriptionNoticeModel( + text: subDescription.text, + type: subDescription.type, + isBold: subDescription.isBold, + isSpaceRequired: subDescription.isSpaceRequired, + )).toList(), + )).toList(), + )).toList(), + ); +} \ No newline at end of file diff --git a/apps/health_campaign_field_worker_app/lib/utils/localization_delegates.dart b/apps/health_campaign_field_worker_app/lib/utils/localization_delegates.dart index 6e62855fe..700760a8e 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/localization_delegates.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/localization_delegates.dart @@ -16,6 +16,7 @@ import 'package:referral_reconciliation/blocs/app_localization.dart' as referral_reconciliation_localization; import 'package:registration_delivery/blocs/app_localization.dart' as registration_delivery_localization; +import 'package:digit_components/blocs/localization.dart' as component_localization; import '../blocs/localization/app_localization.dart'; import '../data/local_store/no_sql/schema/app_configuration.dart'; @@ -59,6 +60,10 @@ getAppLocalizationDelegates({ digit_dss_localization.DashboardLocalization.getDelegate( LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, appConfig.languages!, - ) + ), + component_localization.ComponentLocalization.getDelegate( + LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, + appConfig.languages!, + ), ]; } diff --git a/apps/health_campaign_field_worker_app/pubspec.lock b/apps/health_campaign_field_worker_app/pubspec.lock index c96f0b5fd..371a1a8d1 100644 --- a/apps/health_campaign_field_worker_app/pubspec.lock +++ b/apps/health_campaign_field_worker_app/pubspec.lock @@ -493,10 +493,9 @@ packages: digit_components: dependency: "direct main" description: - name: digit_components - sha256: "9cca4d9a546037080afe02b6ade82fdf01574e11f5656ad12120fd6966578616" - url: "https://pub.dev" - source: hosted + path: "../../packages/digit_components" + relative: true + source: path version: "1.0.1+1" digit_data_model: dependency: "direct main" diff --git a/packages/digit_components/lib/blocs/localization.dart b/packages/digit_components/lib/blocs/localization.dart new file mode 100644 index 000000000..d393cfefa --- /dev/null +++ b/packages/digit_components/lib/blocs/localization.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +import 'localization_delegates.dart'; + + +// Class responsible for handling component localization +class ComponentLocalization { + final Locale locale; + final Future localizedStrings; + final List languages; + + ComponentLocalization(this.locale, this.localizedStrings, this.languages); + + // Method to get the current localization instance from context + static ComponentLocalization of(BuildContext context) { + return Localizations.of(context, ComponentLocalization)!; + } + + static final List _localizedStrings = []; + + // Method to get the delegate for localization + static LocalizationsDelegate getDelegate( + Future localizedStrings, List languages) => + ComponentLocalizationDelegate(localizedStrings, languages); + + // Method to load localized strings + Future load() async { + _localizedStrings.clear(); + // Iterate over localized strings and filter based on locale + for (var element in await localizedStrings) { + if (element.locale == '${locale.languageCode}_${locale.countryCode}') { + _localizedStrings.add(element); + } + } + + return true; + } + + // Method to translate a given localized value + String translate(String localizedValues) { + + if (_localizedStrings.isEmpty) { + return localizedValues; + } else { + final index = _localizedStrings.indexWhere( + (medium) => medium.code == localizedValues, + ); + + return index != -1 ? _localizedStrings[index].message : localizedValues; + } + } +} \ No newline at end of file diff --git a/packages/digit_components/lib/blocs/localization_delegates.dart b/packages/digit_components/lib/blocs/localization_delegates.dart new file mode 100644 index 000000000..3d2e2dd16 --- /dev/null +++ b/packages/digit_components/lib/blocs/localization_delegates.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +import 'localization.dart'; + + +class ComponentLocalizationDelegate + extends LocalizationsDelegate { + final Future localizedStrings; + final List languages; + + const ComponentLocalizationDelegate(this.localizedStrings, this.languages); + + @override + bool isSupported(Locale locale) { + return languages.map((e) { + final results = e.value.split('_'); + if (results.isNotEmpty) return results.first; + }).contains(locale.languageCode); + } + + @override + Future load(Locale locale) async { + ComponentLocalization localization = + ComponentLocalization(locale, localizedStrings, languages); + await localization.load(); + return localization; + } + + @override + bool shouldReload(covariant LocalizationsDelegate old) { + return true; + } +} \ No newline at end of file diff --git a/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.dart b/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.dart new file mode 100644 index 000000000..f2d1f896c --- /dev/null +++ b/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.dart @@ -0,0 +1,50 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'privacy_notice_model.freezed.dart'; +part 'privacy_notice_model.g.dart'; + +@freezed +class PrivacyNoticeModel with _$PrivacyNoticeModel { + const factory PrivacyNoticeModel({ + required String header, + required String module, + bool? active, + List? contents, + }) = _PrivacyNoticeModel; + + factory PrivacyNoticeModel.fromJson(Map json) => _$PrivacyNoticeModelFromJson(json); +} + +@freezed +class ContentNoticeModel with _$ContentNoticeModel { + const factory ContentNoticeModel({ + String? header, + List? descriptions, + }) = _ContentNoticeModel; + + factory ContentNoticeModel.fromJson(Map json) => _$ContentNoticeModelFromJson(json); +} + +@freezed +class DescriptionNoticeModel with _$DescriptionNoticeModel { + const factory DescriptionNoticeModel({ + String? text, + String? type, + bool? isBold, + List? subDescriptions, + }) = _DescriptionNoticeModel; + + factory DescriptionNoticeModel.fromJson(Map json) => _$DescriptionNoticeModelFromJson(json); +} + +@freezed +class SubDescriptionNoticeModel with _$SubDescriptionNoticeModel { + const factory SubDescriptionNoticeModel({ + String? text, + String? type, + bool? isBold, + bool? isSpaceRequired, + }) = _SubDescriptionNoticeModel; + + factory SubDescriptionNoticeModel.fromJson(Map json) => _$SubDescriptionNoticeModelFromJson(json); +} diff --git a/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.freezed.dart b/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.freezed.dart new file mode 100644 index 000000000..2090ee866 --- /dev/null +++ b/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.freezed.dart @@ -0,0 +1,808 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'privacy_notice_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +PrivacyNoticeModel _$PrivacyNoticeModelFromJson(Map json) { + return _PrivacyNoticeModel.fromJson(json); +} + +/// @nodoc +mixin _$PrivacyNoticeModel { + String get header => throw _privateConstructorUsedError; + String get module => throw _privateConstructorUsedError; + bool? get active => throw _privateConstructorUsedError; + List? get contents => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $PrivacyNoticeModelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PrivacyNoticeModelCopyWith<$Res> { + factory $PrivacyNoticeModelCopyWith( + PrivacyNoticeModel value, $Res Function(PrivacyNoticeModel) then) = + _$PrivacyNoticeModelCopyWithImpl<$Res, PrivacyNoticeModel>; + @useResult + $Res call( + {String header, + String module, + bool? active, + List? contents}); +} + +/// @nodoc +class _$PrivacyNoticeModelCopyWithImpl<$Res, $Val extends PrivacyNoticeModel> + implements $PrivacyNoticeModelCopyWith<$Res> { + _$PrivacyNoticeModelCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? header = null, + Object? module = null, + Object? active = freezed, + Object? contents = freezed, + }) { + return _then(_value.copyWith( + header: null == header + ? _value.header + : header // ignore: cast_nullable_to_non_nullable + as String, + module: null == module + ? _value.module + : module // ignore: cast_nullable_to_non_nullable + as String, + active: freezed == active + ? _value.active + : active // ignore: cast_nullable_to_non_nullable + as bool?, + contents: freezed == contents + ? _value.contents + : contents // ignore: cast_nullable_to_non_nullable + as List?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$PrivacyNoticeModelImplCopyWith<$Res> + implements $PrivacyNoticeModelCopyWith<$Res> { + factory _$$PrivacyNoticeModelImplCopyWith(_$PrivacyNoticeModelImpl value, + $Res Function(_$PrivacyNoticeModelImpl) then) = + __$$PrivacyNoticeModelImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String header, + String module, + bool? active, + List? contents}); +} + +/// @nodoc +class __$$PrivacyNoticeModelImplCopyWithImpl<$Res> + extends _$PrivacyNoticeModelCopyWithImpl<$Res, _$PrivacyNoticeModelImpl> + implements _$$PrivacyNoticeModelImplCopyWith<$Res> { + __$$PrivacyNoticeModelImplCopyWithImpl(_$PrivacyNoticeModelImpl _value, + $Res Function(_$PrivacyNoticeModelImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? header = null, + Object? module = null, + Object? active = freezed, + Object? contents = freezed, + }) { + return _then(_$PrivacyNoticeModelImpl( + header: null == header + ? _value.header + : header // ignore: cast_nullable_to_non_nullable + as String, + module: null == module + ? _value.module + : module // ignore: cast_nullable_to_non_nullable + as String, + active: freezed == active + ? _value.active + : active // ignore: cast_nullable_to_non_nullable + as bool?, + contents: freezed == contents + ? _value._contents + : contents // ignore: cast_nullable_to_non_nullable + as List?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$PrivacyNoticeModelImpl implements _PrivacyNoticeModel { + const _$PrivacyNoticeModelImpl( + {required this.header, + required this.module, + this.active, + final List? contents}) + : _contents = contents; + + factory _$PrivacyNoticeModelImpl.fromJson(Map json) => + _$$PrivacyNoticeModelImplFromJson(json); + + @override + final String header; + @override + final String module; + @override + final bool? active; + final List? _contents; + @override + List? get contents { + final value = _contents; + if (value == null) return null; + if (_contents is EqualUnmodifiableListView) return _contents; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'PrivacyNoticeModel(header: $header, module: $module, active: $active, contents: $contents)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PrivacyNoticeModelImpl && + (identical(other.header, header) || other.header == header) && + (identical(other.module, module) || other.module == module) && + (identical(other.active, active) || other.active == active) && + const DeepCollectionEquality().equals(other._contents, _contents)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, header, module, active, + const DeepCollectionEquality().hash(_contents)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$PrivacyNoticeModelImplCopyWith<_$PrivacyNoticeModelImpl> get copyWith => + __$$PrivacyNoticeModelImplCopyWithImpl<_$PrivacyNoticeModelImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$PrivacyNoticeModelImplToJson( + this, + ); + } +} + +abstract class _PrivacyNoticeModel implements PrivacyNoticeModel { + const factory _PrivacyNoticeModel( + {required final String header, + required final String module, + final bool? active, + final List? contents}) = _$PrivacyNoticeModelImpl; + + factory _PrivacyNoticeModel.fromJson(Map json) = + _$PrivacyNoticeModelImpl.fromJson; + + @override + String get header; + @override + String get module; + @override + bool? get active; + @override + List? get contents; + @override + @JsonKey(ignore: true) + _$$PrivacyNoticeModelImplCopyWith<_$PrivacyNoticeModelImpl> get copyWith => + throw _privateConstructorUsedError; +} + +ContentNoticeModel _$ContentNoticeModelFromJson(Map json) { + return _ContentNoticeModel.fromJson(json); +} + +/// @nodoc +mixin _$ContentNoticeModel { + String? get header => throw _privateConstructorUsedError; + List? get descriptions => + throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $ContentNoticeModelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ContentNoticeModelCopyWith<$Res> { + factory $ContentNoticeModelCopyWith( + ContentNoticeModel value, $Res Function(ContentNoticeModel) then) = + _$ContentNoticeModelCopyWithImpl<$Res, ContentNoticeModel>; + @useResult + $Res call({String? header, List? descriptions}); +} + +/// @nodoc +class _$ContentNoticeModelCopyWithImpl<$Res, $Val extends ContentNoticeModel> + implements $ContentNoticeModelCopyWith<$Res> { + _$ContentNoticeModelCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? header = freezed, + Object? descriptions = freezed, + }) { + return _then(_value.copyWith( + header: freezed == header + ? _value.header + : header // ignore: cast_nullable_to_non_nullable + as String?, + descriptions: freezed == descriptions + ? _value.descriptions + : descriptions // ignore: cast_nullable_to_non_nullable + as List?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ContentNoticeModelImplCopyWith<$Res> + implements $ContentNoticeModelCopyWith<$Res> { + factory _$$ContentNoticeModelImplCopyWith(_$ContentNoticeModelImpl value, + $Res Function(_$ContentNoticeModelImpl) then) = + __$$ContentNoticeModelImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? header, List? descriptions}); +} + +/// @nodoc +class __$$ContentNoticeModelImplCopyWithImpl<$Res> + extends _$ContentNoticeModelCopyWithImpl<$Res, _$ContentNoticeModelImpl> + implements _$$ContentNoticeModelImplCopyWith<$Res> { + __$$ContentNoticeModelImplCopyWithImpl(_$ContentNoticeModelImpl _value, + $Res Function(_$ContentNoticeModelImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? header = freezed, + Object? descriptions = freezed, + }) { + return _then(_$ContentNoticeModelImpl( + header: freezed == header + ? _value.header + : header // ignore: cast_nullable_to_non_nullable + as String?, + descriptions: freezed == descriptions + ? _value._descriptions + : descriptions // ignore: cast_nullable_to_non_nullable + as List?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ContentNoticeModelImpl implements _ContentNoticeModel { + const _$ContentNoticeModelImpl( + {this.header, final List? descriptions}) + : _descriptions = descriptions; + + factory _$ContentNoticeModelImpl.fromJson(Map json) => + _$$ContentNoticeModelImplFromJson(json); + + @override + final String? header; + final List? _descriptions; + @override + List? get descriptions { + final value = _descriptions; + if (value == null) return null; + if (_descriptions is EqualUnmodifiableListView) return _descriptions; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'ContentNoticeModel(header: $header, descriptions: $descriptions)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ContentNoticeModelImpl && + (identical(other.header, header) || other.header == header) && + const DeepCollectionEquality() + .equals(other._descriptions, _descriptions)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash( + runtimeType, header, const DeepCollectionEquality().hash(_descriptions)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ContentNoticeModelImplCopyWith<_$ContentNoticeModelImpl> get copyWith => + __$$ContentNoticeModelImplCopyWithImpl<_$ContentNoticeModelImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$ContentNoticeModelImplToJson( + this, + ); + } +} + +abstract class _ContentNoticeModel implements ContentNoticeModel { + const factory _ContentNoticeModel( + {final String? header, + final List? descriptions}) = + _$ContentNoticeModelImpl; + + factory _ContentNoticeModel.fromJson(Map json) = + _$ContentNoticeModelImpl.fromJson; + + @override + String? get header; + @override + List? get descriptions; + @override + @JsonKey(ignore: true) + _$$ContentNoticeModelImplCopyWith<_$ContentNoticeModelImpl> get copyWith => + throw _privateConstructorUsedError; +} + +DescriptionNoticeModel _$DescriptionNoticeModelFromJson( + Map json) { + return _DescriptionNoticeModel.fromJson(json); +} + +/// @nodoc +mixin _$DescriptionNoticeModel { + String? get text => throw _privateConstructorUsedError; + String? get type => throw _privateConstructorUsedError; + bool? get isBold => throw _privateConstructorUsedError; + List? get subDescriptions => + throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $DescriptionNoticeModelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DescriptionNoticeModelCopyWith<$Res> { + factory $DescriptionNoticeModelCopyWith(DescriptionNoticeModel value, + $Res Function(DescriptionNoticeModel) then) = + _$DescriptionNoticeModelCopyWithImpl<$Res, DescriptionNoticeModel>; + @useResult + $Res call( + {String? text, + String? type, + bool? isBold, + List? subDescriptions}); +} + +/// @nodoc +class _$DescriptionNoticeModelCopyWithImpl<$Res, + $Val extends DescriptionNoticeModel> + implements $DescriptionNoticeModelCopyWith<$Res> { + _$DescriptionNoticeModelCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? text = freezed, + Object? type = freezed, + Object? isBold = freezed, + Object? subDescriptions = freezed, + }) { + return _then(_value.copyWith( + text: freezed == text + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String?, + type: freezed == type + ? _value.type + : type // ignore: cast_nullable_to_non_nullable + as String?, + isBold: freezed == isBold + ? _value.isBold + : isBold // ignore: cast_nullable_to_non_nullable + as bool?, + subDescriptions: freezed == subDescriptions + ? _value.subDescriptions + : subDescriptions // ignore: cast_nullable_to_non_nullable + as List?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$DescriptionNoticeModelImplCopyWith<$Res> + implements $DescriptionNoticeModelCopyWith<$Res> { + factory _$$DescriptionNoticeModelImplCopyWith( + _$DescriptionNoticeModelImpl value, + $Res Function(_$DescriptionNoticeModelImpl) then) = + __$$DescriptionNoticeModelImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String? text, + String? type, + bool? isBold, + List? subDescriptions}); +} + +/// @nodoc +class __$$DescriptionNoticeModelImplCopyWithImpl<$Res> + extends _$DescriptionNoticeModelCopyWithImpl<$Res, + _$DescriptionNoticeModelImpl> + implements _$$DescriptionNoticeModelImplCopyWith<$Res> { + __$$DescriptionNoticeModelImplCopyWithImpl( + _$DescriptionNoticeModelImpl _value, + $Res Function(_$DescriptionNoticeModelImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? text = freezed, + Object? type = freezed, + Object? isBold = freezed, + Object? subDescriptions = freezed, + }) { + return _then(_$DescriptionNoticeModelImpl( + text: freezed == text + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String?, + type: freezed == type + ? _value.type + : type // ignore: cast_nullable_to_non_nullable + as String?, + isBold: freezed == isBold + ? _value.isBold + : isBold // ignore: cast_nullable_to_non_nullable + as bool?, + subDescriptions: freezed == subDescriptions + ? _value._subDescriptions + : subDescriptions // ignore: cast_nullable_to_non_nullable + as List?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$DescriptionNoticeModelImpl implements _DescriptionNoticeModel { + const _$DescriptionNoticeModelImpl( + {this.text, + this.type, + this.isBold, + final List? subDescriptions}) + : _subDescriptions = subDescriptions; + + factory _$DescriptionNoticeModelImpl.fromJson(Map json) => + _$$DescriptionNoticeModelImplFromJson(json); + + @override + final String? text; + @override + final String? type; + @override + final bool? isBold; + final List? _subDescriptions; + @override + List? get subDescriptions { + final value = _subDescriptions; + if (value == null) return null; + if (_subDescriptions is EqualUnmodifiableListView) return _subDescriptions; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'DescriptionNoticeModel(text: $text, type: $type, isBold: $isBold, subDescriptions: $subDescriptions)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DescriptionNoticeModelImpl && + (identical(other.text, text) || other.text == text) && + (identical(other.type, type) || other.type == type) && + (identical(other.isBold, isBold) || other.isBold == isBold) && + const DeepCollectionEquality() + .equals(other._subDescriptions, _subDescriptions)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, text, type, isBold, + const DeepCollectionEquality().hash(_subDescriptions)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$DescriptionNoticeModelImplCopyWith<_$DescriptionNoticeModelImpl> + get copyWith => __$$DescriptionNoticeModelImplCopyWithImpl< + _$DescriptionNoticeModelImpl>(this, _$identity); + + @override + Map toJson() { + return _$$DescriptionNoticeModelImplToJson( + this, + ); + } +} + +abstract class _DescriptionNoticeModel implements DescriptionNoticeModel { + const factory _DescriptionNoticeModel( + {final String? text, + final String? type, + final bool? isBold, + final List? subDescriptions}) = + _$DescriptionNoticeModelImpl; + + factory _DescriptionNoticeModel.fromJson(Map json) = + _$DescriptionNoticeModelImpl.fromJson; + + @override + String? get text; + @override + String? get type; + @override + bool? get isBold; + @override + List? get subDescriptions; + @override + @JsonKey(ignore: true) + _$$DescriptionNoticeModelImplCopyWith<_$DescriptionNoticeModelImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SubDescriptionNoticeModel _$SubDescriptionNoticeModelFromJson( + Map json) { + return _SubDescriptionNoticeModel.fromJson(json); +} + +/// @nodoc +mixin _$SubDescriptionNoticeModel { + String? get text => throw _privateConstructorUsedError; + String? get type => throw _privateConstructorUsedError; + bool? get isBold => throw _privateConstructorUsedError; + bool? get isSpaceRequired => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $SubDescriptionNoticeModelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SubDescriptionNoticeModelCopyWith<$Res> { + factory $SubDescriptionNoticeModelCopyWith(SubDescriptionNoticeModel value, + $Res Function(SubDescriptionNoticeModel) then) = + _$SubDescriptionNoticeModelCopyWithImpl<$Res, SubDescriptionNoticeModel>; + @useResult + $Res call({String? text, String? type, bool? isBold, bool? isSpaceRequired}); +} + +/// @nodoc +class _$SubDescriptionNoticeModelCopyWithImpl<$Res, + $Val extends SubDescriptionNoticeModel> + implements $SubDescriptionNoticeModelCopyWith<$Res> { + _$SubDescriptionNoticeModelCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? text = freezed, + Object? type = freezed, + Object? isBold = freezed, + Object? isSpaceRequired = freezed, + }) { + return _then(_value.copyWith( + text: freezed == text + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String?, + type: freezed == type + ? _value.type + : type // ignore: cast_nullable_to_non_nullable + as String?, + isBold: freezed == isBold + ? _value.isBold + : isBold // ignore: cast_nullable_to_non_nullable + as bool?, + isSpaceRequired: freezed == isSpaceRequired + ? _value.isSpaceRequired + : isSpaceRequired // ignore: cast_nullable_to_non_nullable + as bool?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SubDescriptionNoticeModelImplCopyWith<$Res> + implements $SubDescriptionNoticeModelCopyWith<$Res> { + factory _$$SubDescriptionNoticeModelImplCopyWith( + _$SubDescriptionNoticeModelImpl value, + $Res Function(_$SubDescriptionNoticeModelImpl) then) = + __$$SubDescriptionNoticeModelImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? text, String? type, bool? isBold, bool? isSpaceRequired}); +} + +/// @nodoc +class __$$SubDescriptionNoticeModelImplCopyWithImpl<$Res> + extends _$SubDescriptionNoticeModelCopyWithImpl<$Res, + _$SubDescriptionNoticeModelImpl> + implements _$$SubDescriptionNoticeModelImplCopyWith<$Res> { + __$$SubDescriptionNoticeModelImplCopyWithImpl( + _$SubDescriptionNoticeModelImpl _value, + $Res Function(_$SubDescriptionNoticeModelImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? text = freezed, + Object? type = freezed, + Object? isBold = freezed, + Object? isSpaceRequired = freezed, + }) { + return _then(_$SubDescriptionNoticeModelImpl( + text: freezed == text + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String?, + type: freezed == type + ? _value.type + : type // ignore: cast_nullable_to_non_nullable + as String?, + isBold: freezed == isBold + ? _value.isBold + : isBold // ignore: cast_nullable_to_non_nullable + as bool?, + isSpaceRequired: freezed == isSpaceRequired + ? _value.isSpaceRequired + : isSpaceRequired // ignore: cast_nullable_to_non_nullable + as bool?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SubDescriptionNoticeModelImpl implements _SubDescriptionNoticeModel { + const _$SubDescriptionNoticeModelImpl( + {this.text, this.type, this.isBold, this.isSpaceRequired}); + + factory _$SubDescriptionNoticeModelImpl.fromJson(Map json) => + _$$SubDescriptionNoticeModelImplFromJson(json); + + @override + final String? text; + @override + final String? type; + @override + final bool? isBold; + @override + final bool? isSpaceRequired; + + @override + String toString() { + return 'SubDescriptionNoticeModel(text: $text, type: $type, isBold: $isBold, isSpaceRequired: $isSpaceRequired)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SubDescriptionNoticeModelImpl && + (identical(other.text, text) || other.text == text) && + (identical(other.type, type) || other.type == type) && + (identical(other.isBold, isBold) || other.isBold == isBold) && + (identical(other.isSpaceRequired, isSpaceRequired) || + other.isSpaceRequired == isSpaceRequired)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => + Object.hash(runtimeType, text, type, isBold, isSpaceRequired); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SubDescriptionNoticeModelImplCopyWith<_$SubDescriptionNoticeModelImpl> + get copyWith => __$$SubDescriptionNoticeModelImplCopyWithImpl< + _$SubDescriptionNoticeModelImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SubDescriptionNoticeModelImplToJson( + this, + ); + } +} + +abstract class _SubDescriptionNoticeModel implements SubDescriptionNoticeModel { + const factory _SubDescriptionNoticeModel( + {final String? text, + final String? type, + final bool? isBold, + final bool? isSpaceRequired}) = _$SubDescriptionNoticeModelImpl; + + factory _SubDescriptionNoticeModel.fromJson(Map json) = + _$SubDescriptionNoticeModelImpl.fromJson; + + @override + String? get text; + @override + String? get type; + @override + bool? get isBold; + @override + bool? get isSpaceRequired; + @override + @JsonKey(ignore: true) + _$$SubDescriptionNoticeModelImplCopyWith<_$SubDescriptionNoticeModelImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.g.dart b/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.g.dart new file mode 100644 index 000000000..2e10758a5 --- /dev/null +++ b/packages/digit_components/lib/models/privacy_notice/privacy_notice_model.g.dart @@ -0,0 +1,83 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'privacy_notice_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$PrivacyNoticeModelImpl _$$PrivacyNoticeModelImplFromJson( + Map json) => + _$PrivacyNoticeModelImpl( + header: json['header'] as String, + module: json['module'] as String, + active: json['active'] as bool?, + contents: (json['contents'] as List?) + ?.map((e) => ContentNoticeModel.fromJson(e as Map)) + .toList(), + ); + +Map _$$PrivacyNoticeModelImplToJson( + _$PrivacyNoticeModelImpl instance) => + { + 'header': instance.header, + 'module': instance.module, + 'active': instance.active, + 'contents': instance.contents, + }; + +_$ContentNoticeModelImpl _$$ContentNoticeModelImplFromJson( + Map json) => + _$ContentNoticeModelImpl( + header: json['header'] as String?, + descriptions: (json['descriptions'] as List?) + ?.map( + (e) => DescriptionNoticeModel.fromJson(e as Map)) + .toList(), + ); + +Map _$$ContentNoticeModelImplToJson( + _$ContentNoticeModelImpl instance) => + { + 'header': instance.header, + 'descriptions': instance.descriptions, + }; + +_$DescriptionNoticeModelImpl _$$DescriptionNoticeModelImplFromJson( + Map json) => + _$DescriptionNoticeModelImpl( + text: json['text'] as String?, + type: json['type'] as String?, + isBold: json['isBold'] as bool?, + subDescriptions: (json['subDescriptions'] as List?) + ?.map((e) => + SubDescriptionNoticeModel.fromJson(e as Map)) + .toList(), + ); + +Map _$$DescriptionNoticeModelImplToJson( + _$DescriptionNoticeModelImpl instance) => + { + 'text': instance.text, + 'type': instance.type, + 'isBold': instance.isBold, + 'subDescriptions': instance.subDescriptions, + }; + +_$SubDescriptionNoticeModelImpl _$$SubDescriptionNoticeModelImplFromJson( + Map json) => + _$SubDescriptionNoticeModelImpl( + text: json['text'] as String?, + type: json['type'] as String?, + isBold: json['isBold'] as bool?, + isSpaceRequired: json['isSpaceRequired'] as bool?, + ); + +Map _$$SubDescriptionNoticeModelImplToJson( + _$SubDescriptionNoticeModelImpl instance) => + { + 'text': instance.text, + 'type': instance.type, + 'isBold': instance.isBold, + 'isSpaceRequired': instance.isSpaceRequired, + }; diff --git a/packages/digit_components/lib/models/privacy_policy_model.dart b/packages/digit_components/lib/models/privacy_policy_model.dart new file mode 100644 index 000000000..834e44c60 --- /dev/null +++ b/packages/digit_components/lib/models/privacy_policy_model.dart @@ -0,0 +1,95 @@ +class PrivacyPolicy { + final String? header; // Changed to nullable + final String? module; // Changed to nullable + final bool? active; + final List? contents; + + PrivacyPolicy({ + this.header, + this.module, + this.active, + this.contents, + }); + + // Factory constructor to create PrivacyPolicy from JSON + factory PrivacyPolicy.fromJson(Map json) { + return PrivacyPolicy( + header: json['header'] as String?, + module: json['module'] as String?, + active: json['active'] as bool?, + contents: (json['contents'] as List?) + ?.map((item) => Content.fromJson(item as Map)) + .toList(), + ); + } +} + +class Content { + final String? header; // Changed to nullable + final List? descriptions; + + Content({ + this.header, + this.descriptions, + }); + + // Factory constructor to create Content from JSON + factory Content.fromJson(Map json) { + return Content( + header: json['header'] as String?, + descriptions: (json['descriptions'] as List?) + ?.map((item) => Description.fromJson(item as Map)) + .toList(), + ); + } +} + +class Description { + final String? text; // Changed to nullable + final String? type; // Changed to nullable + final bool? isBold; + final List? subDescriptions; + + Description({ + this.text, + this.type, + this.isBold, + this.subDescriptions, + }); + + // Factory constructor to create Description from JSON + factory Description.fromJson(Map json) { + return Description( + text: json['text'] as String?, + type: json['type'] as String?, + isBold: json['isBold'] as bool?, + subDescriptions: (json['subDescriptions'] as List?) + ?.map((item) => SubDescription.fromJson(item as Map)) + .toList(), + ); + } +} + +class SubDescription { + final String? text; // Changed to nullable + final String? type; // Changed to nullable + final bool? isBold; + final bool? isSpaceRequired; + + SubDescription({ + this.text, + this.type, + this.isBold, + this.isSpaceRequired, + }); + + // Factory constructor to create SubDescription from JSON + factory SubDescription.fromJson(Map json) { + return SubDescription( + text: json['text'] as String?, + type: json['type'] as String?, + isBold: json['isBold'] as bool?, + isSpaceRequired: json['isSpaceRequired'] as bool?, + ); + } +} diff --git a/packages/digit_components/lib/utils/i18_key_constants.dart b/packages/digit_components/lib/utils/i18_key_constants.dart new file mode 100644 index 000000000..1d7e1fcca --- /dev/null +++ b/packages/digit_components/lib/utils/i18_key_constants.dart @@ -0,0 +1,20 @@ +library i18; + +const privacyPolicy = PrivacyPolicy(); + +class PrivacyPolicy { + const PrivacyPolicy(); + + String get acceptText { + return 'PRIVACY_POLICY_ACCEPT_TEXT'; + } + + String get declineText { + return 'PRIVACY_POLICY_DECLINE_TEXT'; + } + + String get privacyNoticeText => 'PRIVACY_POLICY_TEXT'; + String get privacyPolicyLinkText => 'PRIVACY_POLICY_LINK_TEXT'; + String get privacyPolicyValidationText => 'PRIVACY_POLICY_VALIDATION_TEXT'; + +} \ No newline at end of file diff --git a/packages/digit_components/lib/widgets/localized.dart b/packages/digit_components/lib/widgets/localized.dart new file mode 100644 index 000000000..2d3d6a479 --- /dev/null +++ b/packages/digit_components/lib/widgets/localized.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import '../blocs/localization.dart'; + +abstract class LocalizedStatefulWidget extends StatefulWidget { + final ComponentLocalization? appLocalizations; + + const LocalizedStatefulWidget({ + super.key, + this.appLocalizations, + }); +} + +abstract class LocalizedState + extends State { + late ComponentLocalization _localizations; + + ComponentLocalization get localizations => _localizations; + + set localizations(ComponentLocalization localizations) { + if (mounted) { + setState(() { + _localizations = localizations; + }); + } + } + + @override + @mustCallSuper + void didChangeDependencies() { + _localizations = widget.appLocalizations ?? ComponentLocalization.of(context); + super.didChangeDependencies(); + } +} \ No newline at end of file diff --git a/apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_component.dart b/packages/digit_components/lib/widgets/privacy_notice/privacy_component.dart similarity index 96% rename from apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_component.dart rename to packages/digit_components/lib/widgets/privacy_notice/privacy_component.dart index e246dc30a..f2d9aa0f0 100644 --- a/apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_component.dart +++ b/packages/digit_components/lib/widgets/privacy_notice/privacy_component.dart @@ -1,7 +1,7 @@ import 'package:digit_components/digit_components.dart'; +import 'package:digit_components/models/privacy_notice/privacy_notice_model.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import '../../data/local_store/no_sql/schema/app_configuration.dart'; import '../localized.dart'; import 'privacy_notice_dialog.dart'; import 'package:reactive_forms/reactive_forms.dart'; @@ -10,7 +10,7 @@ class PrivacyComponent extends LocalizedStatefulWidget { final String formControlName; final String text; final String linkText; - final PrivacyPolicy? privacyPolicy; + final PrivacyNoticeModel? privacyPolicy; final String? trailingText; final String validationMessage; @@ -21,7 +21,7 @@ class PrivacyComponent extends LocalizedStatefulWidget { required this.text, required this.linkText, this.trailingText, - this.privacyPolicy, + this.privacyPolicy, required this.validationMessage, }); @@ -54,6 +54,7 @@ class _PrivacyComponentState extends LocalizedState { return ValueListenableBuilder( valueListenable: checkboxStateNotifier, builder: (context, value, child) { + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -120,7 +121,7 @@ class _PrivacyComponentState extends LocalizedState { builder: (context) { return FullPageDialog( - privacyPolicy: widget.privacyPolicy ?? PrivacyPolicy(), + privacyPolicy: widget.privacyPolicy ?? const PrivacyNoticeModel(header: '', module: ''), onAccept: () { checkboxStateNotifier.value = true; field.didChange(true); diff --git a/apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_notice_dialog.dart b/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_dialog.dart similarity index 95% rename from apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_notice_dialog.dart rename to packages/digit_components/lib/widgets/privacy_notice/privacy_notice_dialog.dart index 55421cfc2..d6d85db70 100644 --- a/apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_notice_dialog.dart +++ b/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_dialog.dart @@ -1,17 +1,18 @@ +import 'package:digit_components/models/privacy_notice/privacy_notice_model.dart'; import 'package:digit_components/theme/colors.dart'; import 'package:digit_components/widgets/digit_card.dart'; import 'package:digit_components/widgets/digit_elevated_button.dart'; import 'package:digit_components/widgets/digit_outline_button.dart'; import 'package:flutter/material.dart'; -import '../../data/local_store/no_sql/schema/app_configuration.dart'; +import '../../models/privacy_policy_model.dart'; +import '../../theme/digit_theme.dart'; import '../localized.dart'; import 'privacy_notice_expand_component.dart'; import '../../utils/i18_key_constants.dart' as i18; -import '../../models/privacy_notice/privacy_notice_model.dart'; -import '../showcase/showcase_wrappers.dart'; + class FullPageDialog extends LocalizedStatefulWidget { - final PrivacyPolicy privacyPolicy; + final PrivacyNoticeModel privacyPolicy; final VoidCallback onAccept; final VoidCallback onDecline; @@ -49,7 +50,7 @@ class _FullPageDialogState extends LocalizedState { Padding( padding: const EdgeInsets.only(top: kPadding*3, left: 0), child: Text( - localizations.translate(widget.privacyPolicy.header), + localizations.translate(widget.privacyPolicy.header ?? ''), maxLines: 3, style: Theme.of(context).textTheme.displayMedium?.copyWith( color: const DigitColors().woodsmokeBlack, diff --git a/apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_notice_expand_component.dart b/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_expand_component.dart similarity index 96% rename from apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_notice_expand_component.dart rename to packages/digit_components/lib/widgets/privacy_notice/privacy_notice_expand_component.dart index 6f3f6006a..8f95d491a 100644 --- a/apps/health_campaign_field_worker_app/lib/widgets/privacy_notice/privacy_notice_expand_component.dart +++ b/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_expand_component.dart @@ -1,11 +1,12 @@ -import 'package:closed_household/widgets/showcase/showcase_wrappers.dart'; import 'package:digit_components/theme/colors.dart'; import 'package:flutter/material.dart'; -import '../../data/local_store/no_sql/schema/app_configuration.dart'; +import '../../models/privacy_notice/privacy_notice_model.dart'; +import '../../models/privacy_policy_model.dart'; +import '../../theme/digit_theme.dart'; import '../localized.dart'; class ExpandableSection extends LocalizedStatefulWidget { - final Content content; + final ContentNoticeModel content; const ExpandableSection({ super.key, @@ -75,7 +76,7 @@ class _ExpandableSectionState extends LocalizedState { children: widget.content.descriptions!.asMap().entries.map((entry) { int index = entry.key; - Description desc = entry.value; + DescriptionNoticeModel desc = entry.value; int? stepNumber = desc.type == 'step' ? index + 1 : null; return DescriptionWidget( description: desc, @@ -91,7 +92,7 @@ class _ExpandableSectionState extends LocalizedState { } class DescriptionWidget extends LocalizedStatefulWidget { - final Description description; + final DescriptionNoticeModel description; final int? stepNumber; const DescriptionWidget({ @@ -201,7 +202,7 @@ class _DescriptionWidgetState extends LocalizedState { } class SubDescriptionWidget extends LocalizedStatefulWidget { - final SubDescription subDescription; + final SubDescriptionNoticeModel subDescription; final int? stepNumber; const SubDescriptionWidget({ From 6317df44a90d8462ecad65e2b49c534ae1620712 Mon Sep 17 00:00:00 2001 From: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:30:12 +0530 Subject: [PATCH 02/33] wayBillNumber key change from waybillNumber (#571) * wayBillNumber key change from waybillNumber return transaction type logic change in stock_details and report_details bloc * validation for wayBillNumber * Delivery action label and administered_success status update based on the project * Revert "Delivery action label and administered_success status update based on the project" This reverts commit 8673a4828e3bc6820fdbadcba32bc53ef5d06fa2. * published digit_components - privacy notice component --- .../pubspec.lock | 15 ++++---- .../pubspec.yaml | 4 +- packages/digit_components/CHANGELOG.md | 3 ++ .../digit_components/example/pubspec.lock | 2 +- .../privacy_notice/privacy_notice_dialog.dart | 5 +-- .../privacy_notice_expand_component.dart | 13 +++---- packages/digit_components/pubspec.yaml | 2 +- packages/inventory_management/CHANGELOG.md | 11 +++++- .../lib/blocs/inventory_report.dart | 4 +- .../lib/data/repositories/local/stock.dart | 2 +- .../lib/models/entities/stock.dart | 6 +-- .../lib/models/entities/stock.mapper.dart | 18 ++++----- .../lib/pages/record_stock/stock_details.dart | 37 ++++++++++++------- .../lib/pages/reports/report_details.dart | 4 +- packages/inventory_management/pubspec.yaml | 2 +- 15 files changed, 75 insertions(+), 53 deletions(-) diff --git a/apps/health_campaign_field_worker_app/pubspec.lock b/apps/health_campaign_field_worker_app/pubspec.lock index 371a1a8d1..96553095f 100644 --- a/apps/health_campaign_field_worker_app/pubspec.lock +++ b/apps/health_campaign_field_worker_app/pubspec.lock @@ -430,7 +430,7 @@ packages: description: path: "packages/dart_mappable_builder" ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" + resolved-ref: e3d8ac43f70568b4a17c200cae5cde285050ef23 url: "https://github.com/egovernments/health-campaign-field-worker-app/" source: git version: "4.2.0" @@ -493,10 +493,11 @@ packages: digit_components: dependency: "direct main" description: - path: "../../packages/digit_components" - relative: true - source: path - version: "1.0.1+1" + name: digit_components + sha256: dcdab9542149022cb66241c3c379ca96916f8b6116e585f4799748d859a2ca49 + url: "https://pub.dev" + source: hosted + version: "1.0.2" digit_data_model: dependency: "direct main" description: @@ -1119,10 +1120,10 @@ packages: dependency: "direct main" description: name: inventory_management - sha256: "1a5976ab807666629704f559730d5418e1c723fed898df2cc6e7d9807f813b6f" + sha256: "1d0dd4f7811941092653426a86548a31d475237d318eee71505b21a57ebc310b" url: "https://pub.dev" source: hosted - version: "1.0.3+2" + version: "1.0.3+4" io: dependency: transitive description: diff --git a/apps/health_campaign_field_worker_app/pubspec.yaml b/apps/health_campaign_field_worker_app/pubspec.yaml index c2d6d352d..6a6166173 100644 --- a/apps/health_campaign_field_worker_app/pubspec.yaml +++ b/apps/health_campaign_field_worker_app/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: sqlite3_flutter_libs: ^0.5.10 path_provider: ^2.0.11 path: ^1.8.2 - digit_components: ^1.0.1+1 + digit_components: ^1.0.2 auto_route: ^7.8.4 flutter_bloc: ^8.1.1 collection: ^1.16.0 @@ -67,7 +67,7 @@ dependencies: camera: ^0.10.5+7 attendance_management: ^1.0.2+1 digit_scanner: ^1.0.3+1 - inventory_management: ^1.0.3+2 + inventory_management: ^1.0.3+4 referral_reconciliation: ^1.0.2+1 digit_data_model: ^1.0.3+1 registration_delivery: ^1.0.3+1 diff --git a/packages/digit_components/CHANGELOG.md b/packages/digit_components/CHANGELOG.md index 7270235e4..a62b6ecf2 100644 --- a/packages/digit_components/CHANGELOG.md +++ b/packages/digit_components/CHANGELOG.md @@ -1,3 +1,6 @@ +## 1.0.2 +* Added privacy notice component + ## 1.0.1+1 * Changed similar dialogs to a common hideDialog diff --git a/packages/digit_components/example/pubspec.lock b/packages/digit_components/example/pubspec.lock index 5f036b9d0..87767b83c 100644 --- a/packages/digit_components/example/pubspec.lock +++ b/packages/digit_components/example/pubspec.lock @@ -231,7 +231,7 @@ packages: path: ".." relative: true source: path - version: "1.0.1+1" + version: "1.0.2" easy_stepper: dependency: transitive description: diff --git a/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_dialog.dart b/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_dialog.dart index d6d85db70..696b2c681 100644 --- a/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_dialog.dart +++ b/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_dialog.dart @@ -4,7 +4,6 @@ import 'package:digit_components/widgets/digit_card.dart'; import 'package:digit_components/widgets/digit_elevated_button.dart'; import 'package:digit_components/widgets/digit_outline_button.dart'; import 'package:flutter/material.dart'; -import '../../models/privacy_policy_model.dart'; import '../../theme/digit_theme.dart'; import '../localized.dart'; import 'privacy_notice_expand_component.dart'; @@ -25,10 +24,10 @@ class FullPageDialog extends LocalizedStatefulWidget { }); @override - _FullPageDialogState createState() => _FullPageDialogState(); + FullPageDialogState createState() => FullPageDialogState(); } -class _FullPageDialogState extends LocalizedState { +class FullPageDialogState extends LocalizedState { @override Widget build(BuildContext context) { return Dialog.fullscreen( diff --git a/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_expand_component.dart b/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_expand_component.dart index 8f95d491a..50bf2eb05 100644 --- a/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_expand_component.dart +++ b/packages/digit_components/lib/widgets/privacy_notice/privacy_notice_expand_component.dart @@ -1,7 +1,6 @@ import 'package:digit_components/theme/colors.dart'; import 'package:flutter/material.dart'; import '../../models/privacy_notice/privacy_notice_model.dart'; -import '../../models/privacy_policy_model.dart'; import '../../theme/digit_theme.dart'; import '../localized.dart'; @@ -15,10 +14,10 @@ class ExpandableSection extends LocalizedStatefulWidget { }); @override - _ExpandableSectionState createState() => _ExpandableSectionState(); + ExpandableSectionState createState() => ExpandableSectionState(); } -class _ExpandableSectionState extends LocalizedState { +class ExpandableSectionState extends LocalizedState { bool _isExpanded = false; @override @@ -103,10 +102,10 @@ class DescriptionWidget extends LocalizedStatefulWidget { }); @override - _DescriptionWidgetState createState() => _DescriptionWidgetState(); + DescriptionWidgetState createState() => DescriptionWidgetState(); } -class _DescriptionWidgetState extends LocalizedState { +class DescriptionWidgetState extends LocalizedState { @override Widget build(BuildContext context) { final descriptionText = widget.description.text ?? ''; @@ -213,10 +212,10 @@ class SubDescriptionWidget extends LocalizedStatefulWidget { }); @override - _SubDescriptionWidgetState createState() => _SubDescriptionWidgetState(); + SubDescriptionWidgetState createState() => SubDescriptionWidgetState(); } -class _SubDescriptionWidgetState extends LocalizedState { +class SubDescriptionWidgetState extends LocalizedState { @override Widget build(BuildContext context) { final subDescriptionText = widget.subDescription.text ?? ''; diff --git a/packages/digit_components/pubspec.yaml b/packages/digit_components/pubspec.yaml index 901f6c61c..f693b4a82 100644 --- a/packages/digit_components/pubspec.yaml +++ b/packages/digit_components/pubspec.yaml @@ -1,6 +1,6 @@ name: digit_components description: Digit UI Design specification Flutter widgets. Import this package by adding digit_components in respective pubspec.yaml dependencies. -version: 1.0.1+1 +version: 1.0.2 homepage: https://github.com/egovernments/health-campaign-field-worker-app/tree/master/packages/digit_components repository: https://github.com/egovernments/health-campaign-field-worker-app diff --git a/packages/inventory_management/CHANGELOG.md b/packages/inventory_management/CHANGELOG.md index 930c5526b..392d9a00c 100644 --- a/packages/inventory_management/CHANGELOG.md +++ b/packages/inventory_management/CHANGELOG.md @@ -1,4 +1,13 @@ -## 1.0.3+1 +## 1.0.3+4 + +* Updated wayBillNumber validation + +## 1.0.3+3 + +* Updated key name of waybillNumber to wayBillNumber +* Return transaction type logic change in stock_details and report_details bloc + +## 1.0.3+2 * Updated digit_scanner package, digit_components, digit_data_model diff --git a/packages/inventory_management/lib/blocs/inventory_report.dart b/packages/inventory_management/lib/blocs/inventory_report.dart index 29c2bdf7f..9221d2c02 100644 --- a/packages/inventory_management/lib/blocs/inventory_report.dart +++ b/packages/inventory_management/lib/blocs/inventory_report.dart @@ -67,8 +67,8 @@ class InventoryReportBloc } else if (reportType == InventoryReportType.returned) { transactionType = [TransactionType.received.toValue()]; transactionReason = [TransactionReason.returned.toValue()]; - receiverId = null; - senderId = facilityId; + receiverId = facilityId; + senderId = null; } else if (reportType == InventoryReportType.damage) { transactionType = [TransactionType.dispatched.toValue()]; transactionReason = [ diff --git a/packages/inventory_management/lib/data/repositories/local/stock.dart b/packages/inventory_management/lib/data/repositories/local/stock.dart index b50043d79..7a04099fe 100644 --- a/packages/inventory_management/lib/data/repositories/local/stock.dart +++ b/packages/inventory_management/lib/data/repositories/local/stock.dart @@ -89,7 +89,7 @@ class StockLocalRepository transactingPartyId: data.transactingPartyId, transactingPartyType: data.transactingPartyType, quantity: data.quantity, - waybillNumber: data.waybillNumber, + wayBillNumber: data.waybillNumber, clientReferenceId: data.clientReferenceId, isDeleted: data.isDeleted, rowVersion: data.rowVersion, diff --git a/packages/inventory_management/lib/models/entities/stock.dart b/packages/inventory_management/lib/models/entities/stock.dart index ea66c3e19..66f9882b2 100644 --- a/packages/inventory_management/lib/models/entities/stock.dart +++ b/packages/inventory_management/lib/models/entities/stock.dart @@ -77,7 +77,7 @@ class StockModel extends EntityModel with StockModelMappable { final String? transactingPartyId; final String? transactingPartyType; final String? quantity; - final String? waybillNumber; + final String? wayBillNumber; final String? receiverId; final String? receiverType; final String? senderId; @@ -100,7 +100,7 @@ class StockModel extends EntityModel with StockModelMappable { this.transactingPartyId, this.transactingPartyType, this.quantity, - this.waybillNumber, + this.wayBillNumber, this.receiverId, this.receiverType, this.senderId, @@ -136,7 +136,7 @@ class StockModel extends EntityModel with StockModelMappable { transactingPartyId: Value(transactingPartyId), transactingPartyType: Value(transactingPartyType), quantity: Value(quantity), - waybillNumber: Value(waybillNumber), + waybillNumber: Value(wayBillNumber), receiverId: Value(receiverId), receiverType: Value(receiverType), senderId: Value(senderId), diff --git a/packages/inventory_management/lib/models/entities/stock.mapper.dart b/packages/inventory_management/lib/models/entities/stock.mapper.dart index c34205004..8c4738857 100644 --- a/packages/inventory_management/lib/models/entities/stock.mapper.dart +++ b/packages/inventory_management/lib/models/entities/stock.mapper.dart @@ -361,9 +361,9 @@ class StockModelMapper extends SubClassMapperBase { static String? _$quantity(StockModel v) => v.quantity; static const Field _f$quantity = Field('quantity', _$quantity, opt: true); - static String? _$waybillNumber(StockModel v) => v.waybillNumber; - static const Field _f$waybillNumber = - Field('waybillNumber', _$waybillNumber, opt: true); + static String? _$wayBillNumber(StockModel v) => v.wayBillNumber; + static const Field _f$wayBillNumber = + Field('wayBillNumber', _$wayBillNumber, opt: true); static String? _$receiverId(StockModel v) => v.receiverId; static const Field _f$receiverId = Field('receiverId', _$receiverId, opt: true); @@ -415,7 +415,7 @@ class StockModelMapper extends SubClassMapperBase { #transactingPartyId: _f$transactingPartyId, #transactingPartyType: _f$transactingPartyType, #quantity: _f$quantity, - #waybillNumber: _f$waybillNumber, + #wayBillNumber: _f$wayBillNumber, #receiverId: _f$receiverId, #receiverType: _f$receiverType, #senderId: _f$senderId, @@ -452,7 +452,7 @@ class StockModelMapper extends SubClassMapperBase { transactingPartyId: data.dec(_f$transactingPartyId), transactingPartyType: data.dec(_f$transactingPartyType), quantity: data.dec(_f$quantity), - waybillNumber: data.dec(_f$waybillNumber), + wayBillNumber: data.dec(_f$wayBillNumber), receiverId: data.dec(_f$receiverId), receiverType: data.dec(_f$receiverType), senderId: data.dec(_f$senderId), @@ -539,7 +539,7 @@ abstract class StockModelCopyWith<$R, $In extends StockModel, $Out> String? transactingPartyId, String? transactingPartyType, String? quantity, - String? waybillNumber, + String? wayBillNumber, String? receiverId, String? receiverType, String? senderId, @@ -587,7 +587,7 @@ class _StockModelCopyWithImpl<$R, $Out> Object? transactingPartyId = $none, Object? transactingPartyType = $none, Object? quantity = $none, - Object? waybillNumber = $none, + Object? wayBillNumber = $none, Object? receiverId = $none, Object? receiverType = $none, Object? senderId = $none, @@ -613,7 +613,7 @@ class _StockModelCopyWithImpl<$R, $Out> if (transactingPartyType != $none) #transactingPartyType: transactingPartyType, if (quantity != $none) #quantity: quantity, - if (waybillNumber != $none) #waybillNumber: waybillNumber, + if (wayBillNumber != $none) #wayBillNumber: wayBillNumber, if (receiverId != $none) #receiverId: receiverId, if (receiverType != $none) #receiverType: receiverType, if (senderId != $none) #senderId: senderId, @@ -645,7 +645,7 @@ class _StockModelCopyWithImpl<$R, $Out> transactingPartyType: data.get(#transactingPartyType, or: $value.transactingPartyType), quantity: data.get(#quantity, or: $value.quantity), - waybillNumber: data.get(#waybillNumber, or: $value.waybillNumber), + wayBillNumber: data.get(#wayBillNumber, or: $value.wayBillNumber), receiverId: data.get(#receiverId, or: $value.receiverId), receiverType: data.get(#receiverType, or: $value.receiverType), senderId: data.get(#senderId, or: $value.senderId), diff --git a/packages/inventory_management/lib/pages/record_stock/stock_details.dart b/packages/inventory_management/lib/pages/record_stock/stock_details.dart index ac1373925..be040e8e4 100644 --- a/packages/inventory_management/lib/pages/record_stock/stock_details.dart +++ b/packages/inventory_management/lib/pages/record_stock/stock_details.dart @@ -60,7 +60,9 @@ class StockDetailsPageState extends LocalizedState { Validators.max(10000), ]), _transactionReasonKey: FormControl(), - _waybillNumberKey: FormControl(), + _waybillNumberKey: FormControl( + validators: [Validators.minLength(2), Validators.maxLength(200)], + ), _waybillQuantityKey: FormControl(), _vehicleNumberKey: FormControl(), _typeOfTransportKey: FormControl(), @@ -385,6 +387,7 @@ class StockDetailsPageState extends LocalizedState { case StockRecordEntryType.receipt: case StockRecordEntryType.loss: case StockRecordEntryType.damaged: + case StockRecordEntryType.returned: if (deliveryTeamSelected) { senderId = deliveryTeamName; senderType = "STAFF"; @@ -397,7 +400,6 @@ class StockDetailsPageState extends LocalizedState { break; case StockRecordEntryType.dispatch: - case StockRecordEntryType.returned: if (deliveryTeamSelected) { receiverId = deliveryTeamName; receiverType = "STAFF"; @@ -420,7 +422,7 @@ class StockDetailsPageState extends LocalizedState { referenceId: stockState.projectId, referenceIdType: 'PROJECT', quantity: quantity.toString(), - waybillNumber: waybillNumber, + wayBillNumber: waybillNumber, receiverId: receiverId, receiverType: receiverType, senderId: senderId, @@ -834,16 +836,25 @@ class StockDetailsPageState extends LocalizedState { ), if (isWareHouseMgr) DigitTextFormField( - key: const Key(_waybillNumberKey), - label: localizations.translate( - i18.stockDetails.waybillNumberLabel, - ), - formControlName: _waybillNumberKey, - keyboardType: - const TextInputType.numberWithOptions( - decimal: true, - ), - ), + key: const Key(_waybillNumberKey), + label: localizations.translate( + i18.stockDetails.waybillNumberLabel, + ), + formControlName: _waybillNumberKey, + keyboardType: + const TextInputType.numberWithOptions( + decimal: true, + ), + validationMessages: { + 'maxLength': (object) => localizations + .translate( + i18.common.maxCharsRequired) + .replaceAll('{}', '200'), + 'minLength': (object) => localizations + .translate( + i18.common.min2CharsRequired) + .replaceAll('{}', ''), + }), if (isWareHouseMgr) DigitTextFormField( label: localizations.translate( diff --git a/packages/inventory_management/lib/pages/reports/report_details.dart b/packages/inventory_management/lib/pages/reports/report_details.dart index 19b1aef9d..1cefbb72c 100644 --- a/packages/inventory_management/lib/pages/reports/report_details.dart +++ b/packages/inventory_management/lib/pages/reports/report_details.dart @@ -458,9 +458,9 @@ class InventoryReportDetailsPageState DigitGridCell( key: waybillKey, value: model - .waybillNumber ?? + .wayBillNumber ?? model - .waybillNumber ?? + .wayBillNumber ?? '', ), DigitGridCell( diff --git a/packages/inventory_management/pubspec.yaml b/packages/inventory_management/pubspec.yaml index 29c0c7f95..acb691200 100644 --- a/packages/inventory_management/pubspec.yaml +++ b/packages/inventory_management/pubspec.yaml @@ -1,6 +1,6 @@ name: inventory_management description: This package offers inventory management features, allowing users to view stock reports and perform inventory resource reconciliation. -version: 1.0.3+2 +version: 1.0.3+4 homepage: https://github.com/egovernments/health-campaign-field-worker-app/tree/master/packages/inventory_management repository: https://github.com/egovernments/health-campaign-field-worker-app From cb53365ad535b43845e6da49111680725da81dcc Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 30 Sep 2024 16:23:54 +0530 Subject: [PATCH 03/33] Added github actions as push and pull --- .../.github/workflows/flutter-build-apk.yml | 39 +++++ .../pubspec.lock | 76 +++++---- packages/attendance_management/pubspec.lock | 8 +- packages/digit_components/pubspec.lock | 31 ++++ packages/digit_data_model/pubspec.lock | 8 +- packages/digit_dss/pubspec.yaml | 2 +- packages/digit_firebase_services/pubspec.lock | 159 ++++++++++++++++++ packages/digit_scanner/example/pubspec.lock | 2 +- packages/digit_scanner/example/pubspec.yaml | 2 +- packages/digit_scanner/pubspec.lock | 108 +----------- packages/inventory_management/pubspec.lock | 8 +- packages/referral_reconciliation/pubspec.lock | 8 +- packages/registration_delivery/pubspec.lock | 8 +- 13 files changed, 289 insertions(+), 170 deletions(-) create mode 100644 apps/health_campaign_field_worker_app/.github/workflows/flutter-build-apk.yml diff --git a/apps/health_campaign_field_worker_app/.github/workflows/flutter-build-apk.yml b/apps/health_campaign_field_worker_app/.github/workflows/flutter-build-apk.yml new file mode 100644 index 000000000..d25decd0c --- /dev/null +++ b/apps/health_campaign_field_worker_app/.github/workflows/flutter-build-apk.yml @@ -0,0 +1,39 @@ +name: Build Flutter APK + +on: + push: + branches: + - hcmpre-717-github-actions-build-apk # This specifies that the workflow will run on any push to the 'main' branch + pull_request: + branches: + - hcmpre-717-github-actions-build-apk # Optionally, run on pull requests targeting the 'main' branch + +jobs: + build: + runs-on: ubuntu-latest + + steps: + # Checkout the latest code from the repository + - name: Checkout repository + uses: actions/checkout@v3 + + # Install Flutter dependencies using the official Flutter GitHub action + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: 'stable' + + # Run flutter pub get to fetch dependencies + - name: Install dependencies + run: flutter pub get + + # Run flutter build apk to build the APK + - name: Build APK + run: flutter build apk --release + + # Archive the APK as a build artifact so it can be downloaded + - name: Upload APK + uses: actions/upload-artifact@v3 + with: + name: app-release-apk + path: build/app/outputs/flutter-apk/app-release.apk diff --git a/apps/health_campaign_field_worker_app/pubspec.lock b/apps/health_campaign_field_worker_app/pubspec.lock index c96f0b5fd..c3682f6bd 100644 --- a/apps/health_campaign_field_worker_app/pubspec.lock +++ b/apps/health_campaign_field_worker_app/pubspec.lock @@ -68,10 +68,9 @@ packages: attendance_management: dependency: "direct main" description: - name: attendance_management - sha256: f1b4373e8d0d9f8227ede0d25d4141f0d16d18ac2525c0347b844098cdab080f - url: "https://pub.dev" - source: hosted + path: "../../packages/attendance_management" + relative: true + source: path version: "1.0.2+1" audioplayers: dependency: "direct main" @@ -428,11 +427,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../../packages/dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive @@ -493,41 +490,39 @@ packages: digit_components: dependency: "direct main" description: - name: digit_components - sha256: "9cca4d9a546037080afe02b6ade82fdf01574e11f5656ad12120fd6966578616" - url: "https://pub.dev" - source: hosted + path: "../../packages/digit_components" + relative: true + source: path version: "1.0.1+1" digit_data_model: dependency: "direct main" description: - name: digit_data_model - sha256: "0b81e96636496b56b4f9c5d918690a17d8985d6b131e0ab54968eb5471ee4f54" - url: "https://pub.dev" - source: hosted + path: "../../packages/digit_data_model" + relative: true + source: path version: "1.0.3+1" digit_dss: dependency: "direct main" description: - name: digit_dss - sha256: "32e2173ae52e7fd9fb53fa435fb21466248029366584f44a0c0f2c6836267a98" - url: "https://pub.dev" - source: hosted + path: "../../packages/digit_dss" + relative: true + source: path version: "1.0.1" digit_firebase_services: dependency: "direct main" description: - path: "../../packages/digit_firebase_services" - relative: true - source: path + path: "packages/digit_firebase_services" + ref: checklist-tanishi + resolved-ref: a4fd63e10e76cec82675332689e344e309246e65 + url: "https://github.com/egovernments/health-campaign-field-worker-app" + source: git version: "0.0.1" digit_scanner: dependency: "direct main" description: - name: digit_scanner - sha256: "9862c4885465bb1942e36dc9b42596c201648db9b0f5ffb8ad768e2409fc2742" - url: "https://pub.dev" - source: hosted + path: "../../packages/digit_scanner" + relative: true + source: path version: "1.0.3+1" digit_showcase: dependency: "direct main" @@ -1535,18 +1530,16 @@ packages: referral_reconciliation: dependency: "direct main" description: - name: referral_reconciliation - sha256: "80d5b93164e4f8337fa757fcb75a1e85b88ffbb760e731ca24496a0cae2aef38" - url: "https://pub.dev" - source: hosted + path: "../../packages/referral_reconciliation" + relative: true + source: path version: "1.0.2+1" registration_delivery: dependency: "direct main" description: - name: registration_delivery - sha256: a6a88665bbf1fa5dce5b864d66992ff9c885b2a3cd898d37f349f1be03cf4086 - url: "https://pub.dev" - source: hosted + path: "../../packages/registration_delivery" + relative: true + source: path version: "1.0.3+1" remove_emoji_input_formatter: dependency: transitive @@ -1777,6 +1770,15 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + survey_form: + dependency: "direct overridden" + description: + path: "packages/survey_form" + ref: checklist-package + resolved-ref: "990025a060809c5e07ee61df8d7042f29f786122" + url: "https://github.com/egovernments/health-campaign-field-worker-app" + source: git + version: "0.0.1-dev.1" sync_http: dependency: transitive description: @@ -2082,5 +2084,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.3 <3.9.0" + dart: ">=3.2.0 <4.0.0" flutter: ">=3.16.0" diff --git a/packages/attendance_management/pubspec.lock b/packages/attendance_management/pubspec.lock index 92c10cb88..d4f36ed10 100644 --- a/packages/attendance_management/pubspec.lock +++ b/packages/attendance_management/pubspec.lock @@ -276,11 +276,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive diff --git a/packages/digit_components/pubspec.lock b/packages/digit_components/pubspec.lock index 7c84c45c4..e9d52e3a2 100644 --- a/packages/digit_components/pubspec.lock +++ b/packages/digit_components/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.2.0" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" + source: hosted + version: "2.0.3" archive: dependency: transitive description: @@ -201,6 +209,21 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_mappable: + dependency: transitive + description: + name: dart_mappable + sha256: "47269caf2060533c29b823ff7fa9706502355ffcb61e7f2a374e3a0fb2f2c3f0" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + dart_mappable_builder: + dependency: "direct overridden" + description: + path: "../dart_mappable_builder" + relative: true + source: path + version: "4.2.0" dart_style: dependency: transitive description: @@ -909,6 +932,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + type_plus: + dependency: transitive + description: + name: type_plus + sha256: d5d1019471f0d38b91603adb9b5fd4ce7ab903c879d2fbf1a3f80a630a03fcc9 + url: "https://pub.dev" + source: hosted + version: "2.1.1" typed_data: dependency: transitive description: diff --git a/packages/digit_data_model/pubspec.lock b/packages/digit_data_model/pubspec.lock index a2f7c5b49..3f0249b33 100644 --- a/packages/digit_data_model/pubspec.lock +++ b/packages/digit_data_model/pubspec.lock @@ -252,11 +252,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "145091c3b5f05ccea22ec7520f5b9f4e50ff6106" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive diff --git a/packages/digit_dss/pubspec.yaml b/packages/digit_dss/pubspec.yaml index a5496ae33..05d3d0979 100644 --- a/packages/digit_dss/pubspec.yaml +++ b/packages/digit_dss/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://github.com/egovernments/health-campaign-field-worker-app/tree/ repository: https://github.com/egovernments/health-campaign-field-worker-app environment: - sdk: '>=3.2.3 <4.0.0' + sdk: '>=3.2.0 <4.0.0' flutter: ">=1.17.0" dependencies: diff --git a/packages/digit_firebase_services/pubspec.lock b/packages/digit_firebase_services/pubspec.lock index 20c7bd06b..671cb44d2 100644 --- a/packages/digit_firebase_services/pubspec.lock +++ b/packages/digit_firebase_services/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" + source: hosted + version: "64.0.0" _flutterfire_internals: dependency: transitive description: @@ -9,6 +17,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.25" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + args: + dependency: transitive + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" async: dependency: transitive description: @@ -25,6 +57,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" characters: dependency: transitive description: @@ -49,6 +89,45 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + dart_mappable: + dependency: transitive + description: + name: dart_mappable + sha256: "47269caf2060533c29b823ff7fa9706502355ffcb61e7f2a374e3a0fb2f2c3f0" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + dart_mappable_builder: + dependency: "direct overridden" + description: + path: "../dart_mappable_builder" + relative: true + source: path + version: "4.2.0" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + url: "https://pub.dev" + source: hosted + version: "2.3.6" fake_async: dependency: transitive description: @@ -57,6 +136,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" firebase_core: dependency: "direct main" description: @@ -120,6 +207,14 @@ packages: description: flutter source: sdk version: "0.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" js: dependency: transitive description: @@ -136,6 +231,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: @@ -160,6 +263,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" path: dependency: transitive description: @@ -176,11 +287,27 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" source_span: dependency: transitive description: @@ -229,6 +356,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.1" + type_plus: + dependency: transitive + description: + name: type_plus + sha256: d5d1019471f0d38b91603adb9b5fd4ce7ab903c879d2fbf1a3f80a630a03fcc9 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" vector_math: dependency: transitive description: @@ -237,6 +380,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" web: dependency: transitive description: @@ -245,6 +396,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" sdks: dart: ">=3.2.0 <4.0.0" flutter: ">=3.3.0" diff --git a/packages/digit_scanner/example/pubspec.lock b/packages/digit_scanner/example/pubspec.lock index 600e45214..75da90ebe 100644 --- a/packages/digit_scanner/example/pubspec.lock +++ b/packages/digit_scanner/example/pubspec.lock @@ -1093,5 +1093,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.3 <3.9.0" + dart: ">=3.2.0 <3.9.0" flutter: ">=3.16.0" diff --git a/packages/digit_scanner/example/pubspec.yaml b/packages/digit_scanner/example/pubspec.yaml index 4cecc309b..a61d03b65 100644 --- a/packages/digit_scanner/example/pubspec.yaml +++ b/packages/digit_scanner/example/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=3.2.3 <4.0.0' + sdk: '>=3.2.0 <4.0.0' # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/packages/digit_scanner/pubspec.lock b/packages/digit_scanner/pubspec.lock index 465d76a5f..fb7bda2d2 100644 --- a/packages/digit_scanner/pubspec.lock +++ b/packages/digit_scanner/pubspec.lock @@ -321,14 +321,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" - dart_mappable: - dependency: transitive - description: - name: dart_mappable - sha256: "47269caf2060533c29b823ff7fa9706502355ffcb61e7f2a374e3a0fb2f2c3f0" - url: "https://pub.dev" - source: hosted - version: "4.2.2" dart_style: dependency: transitive description: @@ -337,14 +329,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.6" - db_viewer: - dependency: transitive - description: - name: db_viewer - sha256: "5f7e3cfcde9663321797d8f6f0c876f7c13f0825a2e77ec1ef065656797144d9" - url: "https://pub.dev" - source: hosted - version: "1.1.0" diff_match_patch: dependency: transitive description: @@ -356,49 +340,11 @@ packages: digit_components: dependency: "direct main" description: - path: "../digit_components" - relative: true - source: path - version: "1.0.1+1" - digit_data_model: - dependency: "direct overridden" - description: - path: "../digit_data_model" - relative: true - source: path - version: "1.0.3+1" - dio: - dependency: transitive - description: - name: dio - sha256: "0dfb6b6a1979dac1c1245e17cef824d7b452ea29bd33d3467269f9bef3715fb0" - url: "https://pub.dev" - source: hosted - version: "5.6.0" - dio_web_adapter: - dependency: transitive - description: - name: dio_web_adapter - sha256: "36c5b2d79eb17cdae41e974b7a8284fec631651d2a6f39a8a2ff22327e90aeac" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - drift: - dependency: transitive - description: - name: drift - sha256: b50a8342c6ddf05be53bda1d246404cbad101b64dc73e8d6d1ac1090d119b4e2 + name: digit_components + sha256: dcdab9542149022cb66241c3c379ca96916f8b6116e585f4799748d859a2ca49 url: "https://pub.dev" source: hosted - version: "2.15.0" - drift_db_viewer: - dependency: transitive - description: - name: drift_db_viewer - sha256: "5ea77858c52b55460a1e8f34ab5f88324621d486717d876fd745765fbc227f3f" - url: "https://pub.dev" - source: hosted - version: "2.1.0" + version: "1.0.2" easy_stepper: dependency: transitive description: @@ -686,22 +632,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" - isar: - dependency: transitive - description: - name: isar - sha256: "99165dadb2cf2329d3140198363a7e7bff9bbd441871898a87e26914d25cf1ea" - url: "https://pub.dev" - source: hosted - version: "3.1.0+1" - isar_flutter_libs: - dependency: transitive - description: - name: isar_flutter_libs - sha256: bc6768cc4b9c61aabff77152e7f33b4b17d2fc93134f7af1c3dd51500fe8d5e8 - url: "https://pub.dev" - source: hosted - version: "3.1.0+1" js: dependency: transitive description: @@ -1006,14 +936,6 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.0" - recase: - dependency: transitive - description: - name: recase - sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 - url: "https://pub.dev" - source: hosted - version: "4.1.0" remove_emoji_input_formatter: dependency: transitive description: @@ -1099,22 +1021,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" - sqlite3: - dependency: transitive - description: - name: sqlite3 - sha256: "072128763f1547e3e9b4735ce846bfd226d68019ccda54db4cd427b12dfdedc9" - url: "https://pub.dev" - source: hosted - version: "2.4.0" - sqlite3_flutter_libs: - dependency: transitive - description: - name: sqlite3_flutter_libs - sha256: "62bbb4073edbcdf53f40c80775f33eea01d301b7b81417e5b3fb7395416258c1" - url: "https://pub.dev" - source: hosted - version: "0.5.24" stack_trace: dependency: transitive description: @@ -1195,14 +1101,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - type_plus: - dependency: transitive - description: - name: type_plus - sha256: d5d1019471f0d38b91603adb9b5fd4ce7ab903c879d2fbf1a3f80a630a03fcc9 - url: "https://pub.dev" - source: hosted - version: "2.1.1" typed_data: dependency: transitive description: diff --git a/packages/inventory_management/pubspec.lock b/packages/inventory_management/pubspec.lock index 8135fff11..a7dc9d34b 100644 --- a/packages/inventory_management/pubspec.lock +++ b/packages/inventory_management/pubspec.lock @@ -388,11 +388,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive diff --git a/packages/referral_reconciliation/pubspec.lock b/packages/referral_reconciliation/pubspec.lock index 60830a342..28ade4d10 100644 --- a/packages/referral_reconciliation/pubspec.lock +++ b/packages/referral_reconciliation/pubspec.lock @@ -388,11 +388,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive diff --git a/packages/registration_delivery/pubspec.lock b/packages/registration_delivery/pubspec.lock index 95488a9b0..b1cdbce95 100644 --- a/packages/registration_delivery/pubspec.lock +++ b/packages/registration_delivery/pubspec.lock @@ -388,11 +388,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive From bb6cde14c1071a6cb2d47f26e3efca6c81ffee87 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 30 Sep 2024 16:32:21 +0530 Subject: [PATCH 04/33] Added github actions as push and pull --- .../.github => .github}/workflows/flutter-build-apk.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {apps/health_campaign_field_worker_app/.github => .github}/workflows/flutter-build-apk.yml (100%) diff --git a/apps/health_campaign_field_worker_app/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml similarity index 100% rename from apps/health_campaign_field_worker_app/.github/workflows/flutter-build-apk.yml rename to .github/workflows/flutter-build-apk.yml From d33e35f6036a4eb69636cd567869af336f209583 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 30 Sep 2024 16:34:02 +0530 Subject: [PATCH 05/33] Added github actions as push and pull --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index d25decd0c..41984e5a7 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -21,7 +21,7 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - flutter-version: 'stable' + flutter-version: '3.16.0' # Run flutter pub get to fetch dependencies - name: Install dependencies From cf771d8f2365c7a45b5851f96b7a58f6fc1e0a74 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 30 Sep 2024 17:04:30 +0530 Subject: [PATCH 06/33] Added github actions as push and pull --- .github/workflows/flutter-build-apk.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 41984e5a7..a8d85207f 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -29,8 +29,7 @@ jobs: # Run flutter build apk to build the APK - name: Build APK - run: flutter build apk --release - + run: flutter build apk --release --target=apps/health_campaign_field_worker_app # Archive the APK as a build artifact so it can be downloaded - name: Upload APK uses: actions/upload-artifact@v3 From 39c5bd74aa0ede4e952b18c46eeffbdcc7cc2dc6 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 30 Sep 2024 17:09:21 +0530 Subject: [PATCH 07/33] Added github actions as push and pull --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index a8d85207f..d12c46110 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -29,7 +29,7 @@ jobs: # Run flutter build apk to build the APK - name: Build APK - run: flutter build apk --release --target=apps/health_campaign_field_worker_app + run: flutter build apk --release --target=./apps/health_campaign_field_worker_app # Archive the APK as a build artifact so it can be downloaded - name: Upload APK uses: actions/upload-artifact@v3 From b3dcf76d6787af9c9b6058896fee0f4d3ba57d11 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 30 Sep 2024 17:16:22 +0530 Subject: [PATCH 08/33] Added github actions as push and pull --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index d12c46110..475886cf9 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -29,7 +29,7 @@ jobs: # Run flutter build apk to build the APK - name: Build APK - run: flutter build apk --release --target=./apps/health_campaign_field_worker_app + run: flutter build apk --release --target=./apps/health_campaign_field_worker_app/lib/main.dart # Archive the APK as a build artifact so it can be downloaded - name: Upload APK uses: actions/upload-artifact@v3 From 3d33f3918559191e16b434af322129675a73becf Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 30 Sep 2024 17:40:23 +0530 Subject: [PATCH 09/33] Added github actions as push and pull --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 475886cf9..dbc284269 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -21,7 +21,7 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - flutter-version: '3.16.0' + flutter-version: '3.16.5' # Run flutter pub get to fetch dependencies - name: Install dependencies From 428f43b2555b2841c58bc72e5d696b14b4d8eed1 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Tue, 1 Oct 2024 10:34:02 +0530 Subject: [PATCH 10/33] Added github actions as push and pull --- .github/workflows/dart.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 35a11152d..57dd2def1 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -7,7 +7,7 @@ name: Run analysis and tests on: push: - branches: ['develop', 'master', 'qa', 'demo', 'uat'] + branches: ['develop', 'master', 'qa', 'demo', 'uat','hcmpre-717-github-actions-build-apk'] pull_request: branches: ['develop', 'master', 'qa', 'demo', 'uat'] From c46b34bf890b467017de1d745778bf0f4085594f Mon Sep 17 00:00:00 2001 From: yashita-egov Date: Thu, 10 Oct 2024 10:57:21 +0530 Subject: [PATCH 11/33] Hcmpre 716 :- Added Count-based Search for facility and stock (#581) * added count-based search for facility * added count-based search for stock * added bandwidth based batch size * fix some issues --- .../lib/app.dart | 7 + .../lib/blocs/project/project.dart | 33 ++++- .../lib/data/repositories/sync/sync_down.dart | 1 + .../pubspec.lock | 14 +- .../data/repositories/remote/facility.dart | 78 +++++------ .../lib/data/repositories/remote/stock.dart | 125 +++++++++++++++++- 6 files changed, 200 insertions(+), 58 deletions(-) diff --git a/apps/health_campaign_field_worker_app/lib/app.dart b/apps/health_campaign_field_worker_app/lib/app.dart index 7d90ae5da..f65c5feb8 100644 --- a/apps/health_campaign_field_worker_app/lib/app.dart +++ b/apps/health_campaign_field_worker_app/lib/app.dart @@ -25,6 +25,8 @@ import 'blocs/localization/localization.dart'; import 'blocs/project/project.dart'; import 'data/local_store/app_shared_preferences.dart'; import 'data/network_manager.dart'; +import 'data/remote_client.dart'; +import 'data/repositories/remote/bandwidth_check.dart'; import 'data/repositories/remote/localization.dart'; import 'data/repositories/remote/mdms.dart'; import 'router/app_navigator_observer.dart'; @@ -201,6 +203,11 @@ class MainApplicationState extends State ), BlocProvider( create: (ctx) => ProjectBloc( + bandwidthCheckRepository: BandwidthCheckRepository( + DioClient().dio, + bandwidthPath: + envConfig.variables.checkBandwidthApiPath, + ), mdmsRepository: MdmsRepository(widget.client), dashboardRemoteRepository: DashboardRemoteRepository(widget.client), diff --git a/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart b/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart index 18e420dea..e99faea17 100644 --- a/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart +++ b/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart @@ -19,10 +19,12 @@ import '../../data/local_store/no_sql/schema/app_configuration.dart'; import '../../data/local_store/no_sql/schema/row_versions.dart'; import '../../data/local_store/no_sql/schema/service_registry.dart'; import '../../data/local_store/secure_store/secure_store.dart'; +import '../../data/repositories/remote/bandwidth_check.dart'; import '../../data/repositories/remote/mdms.dart'; import '../../models/app_config/app_config_model.dart'; import '../../models/auth/auth_model.dart'; import '../../models/entities/roles_type.dart'; +import '../../utils/background_service.dart'; import '../../utils/environment_config.dart'; import '../../utils/utils.dart'; @@ -35,6 +37,8 @@ class ProjectBloc extends Bloc { final Isar isar; final MdmsRepository mdmsRepository; + final BandwidthCheckRepository bandwidthCheckRepository; + /// Project Staff Repositories final RemoteRepository projectStaffRemoteRepository; @@ -103,6 +107,7 @@ class ProjectBloc extends Bloc { ProjectBloc({ LocalSecureStore? localSecureStore, + required this.bandwidthCheckRepository, required this.projectStaffRemoteRepository, required this.projectRemoteRepository, required this.projectStaffLocalRepository, @@ -169,6 +174,7 @@ class ProjectBloc extends Bloc { } FutureOr _loadOnline(ProjectEmitter emit) async { + final batchSize = await _getBatchSize(); final userObject = await localSecureStore.userRequestModel; final uuid = userObject?.uuid; @@ -289,7 +295,7 @@ class ProjectBloc extends Bloc { if (projects.isNotEmpty) { try { - await _loadProjectFacilities(projects); + await _loadProjectFacilities(projects, batchSize); } catch (_) { emit( state.copyWith( @@ -360,7 +366,8 @@ class ProjectBloc extends Bloc { ); } - FutureOr _loadProjectFacilities(List projects) async { + FutureOr _loadProjectFacilities( + List projects, int batchSize) async { final projectFacilities = await projectFacilityRemoteRepository.search( ProjectFacilitySearchModel( projectId: projects.map((e) => e.id).toList(), @@ -371,6 +378,7 @@ class ProjectBloc extends Bloc { final facilities = await facilityRemoteRepository.search( FacilitySearchModel(tenantId: envConfig.variables.tenantId), + limit: batchSize, ); await facilityLocalRepository.bulkCreate(facilities); @@ -584,8 +592,6 @@ class ProjectBloc extends Bloc { loading: false, syncError: ProjectSyncErrorType.boundary, )); - - return; } emit(state.copyWith( @@ -594,6 +600,25 @@ class ProjectBloc extends Bloc { syncError: null, )); } + + FutureOr _getBatchSize() async { + try { + final configs = await isar.appConfigurations.where().findAll(); + + final double speed = await bandwidthCheckRepository.pingBandwidthCheck( + bandWidthCheckModel: null, + ); + + int configuredBatchSize = getBatchSizeToBandwidth( + speed, + configs, + isDownSync: true, + ); + return configuredBatchSize; + } catch (e) { + rethrow; + } + } } @freezed diff --git a/apps/health_campaign_field_worker_app/lib/data/repositories/sync/sync_down.dart b/apps/health_campaign_field_worker_app/lib/data/repositories/sync/sync_down.dart index e8f07d0e4..09d4069a8 100644 --- a/apps/health_campaign_field_worker_app/lib/data/repositories/sync/sync_down.dart +++ b/apps/health_campaign_field_worker_app/lib/data/repositories/sync/sync_down.dart @@ -570,6 +570,7 @@ class PerformSyncDown { .whereNotNull() .toList(), ), + limit: bandwidthModel.batchSize, ); for (var element in operationGroupedEntity.value) { diff --git a/apps/health_campaign_field_worker_app/pubspec.lock b/apps/health_campaign_field_worker_app/pubspec.lock index 96553095f..6e613b370 100644 --- a/apps/health_campaign_field_worker_app/pubspec.lock +++ b/apps/health_campaign_field_worker_app/pubspec.lock @@ -501,10 +501,9 @@ packages: digit_data_model: dependency: "direct main" description: - name: digit_data_model - sha256: "0b81e96636496b56b4f9c5d918690a17d8985d6b131e0ab54968eb5471ee4f54" - url: "https://pub.dev" - source: hosted + path: "../../packages/digit_data_model" + relative: true + source: path version: "1.0.3+1" digit_dss: dependency: "direct main" @@ -1119,10 +1118,9 @@ packages: inventory_management: dependency: "direct main" description: - name: inventory_management - sha256: "1d0dd4f7811941092653426a86548a31d475237d318eee71505b21a57ebc310b" - url: "https://pub.dev" - source: hosted + path: "../../packages/inventory_management" + relative: true + source: path version: "1.0.3+4" io: dependency: transitive diff --git a/packages/digit_data_model/lib/data/repositories/remote/facility.dart b/packages/digit_data_model/lib/data/repositories/remote/facility.dart index 3703e1198..1c4635243 100644 --- a/packages/digit_data_model/lib/data/repositories/remote/facility.dart +++ b/packages/digit_data_model/lib/data/repositories/remote/facility.dart @@ -6,8 +6,8 @@ import 'package:dart_mappable/dart_mappable.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:dio/dio.dart'; - -class FacilityRemoteRepository extends RemoteRepository { +class FacilityRemoteRepository + extends RemoteRepository { FacilityRemoteRepository( super.dio, { required super.actionMap, @@ -17,20 +17,25 @@ class FacilityRemoteRepository extends RemoteRepository> search( - FacilitySearchModel query, { - int? offSet, - int? limit, - }) async { + FacilitySearchModel query, { + int? offSet, + int? limit, + }) async { int defaultBatchSize = limit ?? 100; // Default batch size for fetching data int currentOffset = offSet ?? 0; List allResults = []; - bool hasMoreData = true; - List>? lastResponse; - while (hasMoreData) { + //To fetch the totalCount from the first Response + bool flag = true; + + //Total number of records + var totalCount = 0; + + do { Response response; + //Execute the request try { response = await executeFuture( future: () async { @@ -42,17 +47,9 @@ class FacilityRemoteRepository extends RemoteRepository>().toList(); - - if (lastResponse != null && lastResponse.toString() == entityList.toString()) { - // If the last response is equal to the current response, stop fetching more data - break; - } + final entityList = + entityResponse.whereType>().toList(); List currentBatch; try { - currentBatch = entityList.map((e) => MapperContainer.globals.fromMap(e)).toList(); + currentBatch = entityList + .map((e) => MapperContainer.globals.fromMap(e)) + .toList(); } catch (e) { rethrow; } - if (currentBatch.isEmpty) { - hasMoreData = false; // if no more data stop fetching - } else { - allResults.addAll(currentBatch); - currentOffset += defaultBatchSize; - lastResponse = entityList; // Update lastResponse to the current response - } - } + allResults.addAll(currentBatch); + currentOffset += defaultBatchSize; + totalCount -= defaultBatchSize; + + //If remaining record is less than defaultBatchSize, adjust the Batch size + if (totalCount < defaultBatchSize) defaultBatchSize = totalCount; + } while (totalCount > 0); return allResults; } diff --git a/packages/inventory_management/lib/data/repositories/remote/stock.dart b/packages/inventory_management/lib/data/repositories/remote/stock.dart index e592cf4f1..c1589f904 100644 --- a/packages/inventory_management/lib/data/repositories/remote/stock.dart +++ b/packages/inventory_management/lib/data/repositories/remote/stock.dart @@ -1,15 +1,126 @@ // Generated using mason. Do not modify by hand +import 'dart:async'; + +import 'package:dart_mappable/dart_mappable.dart'; import 'package:digit_data_model/data_model.dart'; -import 'package:inventory_management/models/entities/stock.dart'; +import 'package:dio/dio.dart'; + +import '../../../models/entities/stock.dart'; -class StockRemoteRepository extends RemoteRepository { +class StockRemoteRepository + extends RemoteRepository { StockRemoteRepository( - super.dio, { - required super.actionMap, - super.entityName = 'Stock', - }); + super.dio, { + required super.actionMap, + super.entityName = 'Stock', + }); @override DataModelType get type => DataModelType.stock; -} \ No newline at end of file + + @override + FutureOr> search( + StockSearchModel query, { + int? offSet, + int? limit, + }) async { + int defaultBatchSize = limit ?? 100; // Default batch size for fetching data + int currentOffset = offSet ?? 0; + + List allResults = []; + + //To fetch the totalCount from the first Response + bool flag = true; + + //Total count of stock + var totalCount = 0; + + do { + Response response; + + //Execute the request + try { + response = await executeFuture( + future: () async { + return await dio.post( + searchPath, + queryParameters: { + 'offset': currentOffset, + 'limit': defaultBatchSize, + 'tenantId': DigitDataModelSingleton().tenantId, + if (query.isDeleted ?? false) 'includeDeleted': query.isDeleted, + }, + data: { + isPlural ? entityNamePlural : entityName: + isPlural ? [query.toMap()] : query.toMap(), + }, + ); + }, + ); + } catch (error) { + break; // Break out of the loop if an error occurs + } + + final responseMap = response.data; + + if (responseMap is! Map) { + throw InvalidApiResponseException( + data: query.toMap(), + path: searchPath, + response: responseMap, + ); + } + + String key = (isSearchResponsePlural) ? entityNamePlural : entityName; + + //Check whether the response contains valid key and totalCount + if (!responseMap.containsKey(key) || + (flag && !responseMap.containsKey('TotalCount'))) { + throw InvalidApiResponseException( + data: query.toMap(), + path: searchPath, + response: responseMap, + ); + } + + //Fetch the totalCount of records only from the first response + if (flag && responseMap.containsKey('TotalCount')) { + totalCount = responseMap['TotalCount']; + flag = false; + } + + final entityResponse = await responseMap[key]; + + if (entityResponse is! List) { + throw InvalidApiResponseException( + data: query.toMap(), + path: searchPath, + response: responseMap, + ); + } + + final entityList = + entityResponse.whereType>().toList(); + + List currentBatch; + + try { + currentBatch = entityList + .map((e) => MapperContainer.globals.fromMap(e)) + .toList(); + } catch (e) { + rethrow; + } + + allResults.addAll(currentBatch); + currentOffset += defaultBatchSize; + totalCount -= defaultBatchSize; + + //If remaining record is less than defaultBatchSize, adjust the Batch size + if (totalCount < defaultBatchSize) defaultBatchSize = totalCount; + } while (totalCount > 0); + + return allResults; + } +} From 30409b86b493d341a672fbfe768abb920f8ea48c Mon Sep 17 00:00:00 2001 From: Naveen J <83631045+naveen-egov@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:26:53 +0530 Subject: [PATCH 12/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index dbc284269..52b5b840c 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -27,6 +27,9 @@ jobs: - name: Install dependencies run: flutter pub get + - name: Build debug APK + run: bash ./gradlew assembleDebug --stacktrace + # Run flutter build apk to build the APK - name: Build APK run: flutter build apk --release --target=./apps/health_campaign_field_worker_app/lib/main.dart From 7d4d0643237ea127e6e21303d17955130f95d588 Mon Sep 17 00:00:00 2001 From: Naveen J <83631045+naveen-egov@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:33:57 +0530 Subject: [PATCH 13/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 52b5b840c..edc9bb8a9 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -28,14 +28,12 @@ jobs: run: flutter pub get - name: Build debug APK - run: bash ./gradlew assembleDebug --stacktrace + run: bash ./apps/health_campaign_field_worker_app/android/gradlew assembleDebug --stacktrace # Run flutter build apk to build the APK - - name: Build APK - run: flutter build apk --release --target=./apps/health_campaign_field_worker_app/lib/main.dart # Archive the APK as a build artifact so it can be downloaded - name: Upload APK uses: actions/upload-artifact@v3 with: name: app-release-apk - path: build/app/outputs/flutter-apk/app-release.apk + path: ./apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk From 3930c9e498bd86a6d56be2f80ff53fd458eb5e9d Mon Sep 17 00:00:00 2001 From: Naveen J <83631045+naveen-egov@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:38:02 +0530 Subject: [PATCH 14/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index edc9bb8a9..a8d95dad3 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -28,8 +28,7 @@ jobs: run: flutter pub get - name: Build debug APK - run: bash ./apps/health_campaign_field_worker_app/android/gradlew assembleDebug --stacktrace - + run: ./tools/generate-apk.sh # Run flutter build apk to build the APK # Archive the APK as a build artifact so it can be downloaded - name: Upload APK From 21bd69ffd64b41a3e0ec1ad6041e8b4293739e31 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 14 Oct 2024 11:08:07 +0530 Subject: [PATCH 15/33] Checking Github actions --- .github/workflows/flutter-build-apk.yml | 104 ++++++++++++++---- .../android/app/build.gradle | 13 ++- tools/generate-apk.sh | 25 +++-- 3 files changed, 111 insertions(+), 31 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index a8d95dad3..7e50b8e45 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -1,4 +1,4 @@ -name: Build Flutter APK +name: Build APK Workflow on: push: @@ -9,30 +9,96 @@ on: - hcmpre-717-github-actions-build-apk # Optionally, run on pull requests targeting the 'main' branch jobs: - build: + build-apk: runs-on: ubuntu-latest steps: - # Checkout the latest code from the repository - - name: Checkout repository + - name: Checkout code uses: actions/checkout@v3 - # Install Flutter dependencies using the official Flutter GitHub action - - name: Setup Flutter - uses: subosito/flutter-action@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v3 with: - flutter-version: '3.16.5' + java-version: '11' + distribution: 'temurin' # Specify the Java distribution - # Run flutter pub get to fetch dependencies - - name: Install dependencies - run: flutter pub get + - name: Flutter action + uses: subosito/flutter-action@v2.8.0 + with: + flutter-version: "3.16.5" - - name: Build debug APK - run: ./tools/generate-apk.sh - # Run flutter build apk to build the APK - # Archive the APK as a build artifact so it can be downloaded - - name: Upload APK - uses: actions/upload-artifact@v3 + - name: Set up Android SDK + uses: android-actions/setup-android@v2 with: - name: app-release-apk - path: ./apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk + api-level: 30 + build-tools: 30.0.3 + + - name: Install Dependencies + run: flutter pub get + + - name: Run APK build script + env: + ENVIRONMENT: QA # or UAT/DEV/ALL depending on your choice + BUILD_CONFIG: release # or profile depending on your choice + run: yes 1 | bash ./tools/generate-apk.sh + + +#name: Build Flutter APK +# +#on: +# push: +# branches: +# - hcmpre-717-github-actions-build-apk # This specifies that the workflow will run on any push to the 'main' branch +# pull_request: +# branches: +# - hcmpre-717-github-actions-build-apk # Optionally, run on pull requests targeting the 'main' branch +# +#jobs: +# build: +# runs-on: ubuntu-latest +# +# steps: +# # Checkout the latest code from the repository +# - name: Checkout repository +# uses: actions/checkout@v3 +# +# - name: Set up JDK 11 +# uses: actions/setup-java@v1 +# with: +# java-version: '11' +# +# - name: Display working directory +# run: pwd +# +# - name: List files +# run: ls -R +# +# - name: Build release APK +# working-directory: ./apps/health_campaign_field_worker_app/android +# run: bash ./gradlew assembleRelease --stacktrace +# +# - name: Build release APK +# run: bash ./health_campaign_field_worker_app/android/gradlew assembleRelease --stacktrace +# +# - name: Rename APK +# run: +# mv "./app/build/outputs/apk/release/app-release.apk" "./app/build/outputs/apk/release/${{ env.OUTPUT_NAME }}.apk" +# +# - name: Upload release APK +# uses: actions/upload-artifact@v1 +# with: +# name: ${{ env.OUTPUT_NAME }} +# path: app/build/outputs/apk/release/${{ env.OUTPUT_NAME }}.apk +# +# - name: Build release AAB +# run: bash ./gradlew bundleRelease --stacktrace +# +# - name: Rename AAB +# run: +# mv "./app/build/outputs/bundle/release/app-release.aab" "./app/build/outputs/bundle/release/${{ env.OUTPUT_NAME }}.aab" +# +# - name: Upload debug AAB +# uses: actions/upload-artifact@v1 +# with: +# name: ${{ env.OUTPUT_NAME }} +# path: app/build/outputs/bundle/release/${{ env.OUTPUT_NAME }}.aab diff --git a/apps/health_campaign_field_worker_app/android/app/build.gradle b/apps/health_campaign_field_worker_app/android/app/build.gradle index 7ed3cf689..106bec514 100644 --- a/apps/health_campaign_field_worker_app/android/app/build.gradle +++ b/apps/health_campaign_field_worker_app/android/app/build.gradle @@ -23,12 +23,23 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' // START: FlutterFire Configuration -apply plugin: 'com.google.gms.google-services' + +if (project.hasProperty('USE_GOOGLE_SERVICES')) { + apply plugin: 'com.google.gms.google-services' +} + // END: FlutterFire Configuration apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { + if (!project.hasProperty('USE_GOOGLE_SERVICES')) { + tasks.whenTaskAdded { task -> + if (task.name.contains("GoogleServices")) { + task.enabled = false + } + } + } compileSdkVersion 34 ndkVersion flutter.ndkVersion diff --git a/tools/generate-apk.sh b/tools/generate-apk.sh index 8b3225c82..72120d0a0 100755 --- a/tools/generate-apk.sh +++ b/tools/generate-apk.sh @@ -14,15 +14,18 @@ build_apk() { fi } -# Ask user for environment to build for -echo "Please select an environment to build for (UAT, DEV, QA or ALL):" -read env -env="${env:-ALL}" - -# Ask user for build config -echo "Please select a build config (release or profile):" -read build_config -build_config="${build_config:-release}" +# Get environment and build config from GitHub Actions environment variables +env="${ENVIRONMENT:-ALL}" +build_config="${BUILD_CONFIG:-release}" +## Ask user for environment to build for +#echo "Please select an environment to build for (UAT, DEV, QA or ALL):" +#read env +#env="${env:-ALL}" +# +## Ask user for build config +#echo "Please select a build config (release or profile):" +#read build_config +#build_config="${build_config:-release}" # Build APK for specified environment(s) and build config if [ "$env" == "ALL" ]; then @@ -31,7 +34,7 @@ else env_list=("$env") fi -./tools/install_bricks.sh +#./tools/install_bricks.sh for env_option in "${env_list[@]}"; do cd "$APP_DIR" || exit @@ -52,7 +55,7 @@ for env_option in "${env_list[@]}"; do cd ../../ || exit mkdir -p outputs - mv "$APP_DIR/build/app/outputs/flutter-apk/app-$build_config.apk" "outputs/app-$env_option-$build_config.apk" +# mv "$APP_DIR/build/app/outputs/flutter-apk/app-$build_config.apk" "outputs/app-$env_option-$build_config.apk" done open outputs From 3bbbac0134ab7efe11fc126dc9643e628145d7ea Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 14 Oct 2024 15:07:02 +0530 Subject: [PATCH 16/33] Uploading on the artifact --- .github/workflows/flutter-build-apk.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 7e50b8e45..e19533c77 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -42,6 +42,14 @@ jobs: BUILD_CONFIG: release # or profile depending on your choice run: yes 1 | bash ./tools/generate-apk.sh + # Archive the APK as a build artifact so it can be downloaded + - name: Upload APK + uses: actions/upload-artifact@v3 + with: + name: app-release-apk + path: build/app/outputs/flutter-apk/app-release.apk + + #name: Build Flutter APK # From 257ef01bbd943b8540fc21837c1758ad7831f8a6 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 14 Oct 2024 17:25:17 +0530 Subject: [PATCH 17/33] Using the env variables from github variables --- .github/workflows/dart.yml | 2 +- .github/workflows/flutter-build-apk.yml | 79 +++++-------------------- tools/generate-apk.sh | 41 ++++++------- 3 files changed, 38 insertions(+), 84 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 57dd2def1..35a11152d 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -7,7 +7,7 @@ name: Run analysis and tests on: push: - branches: ['develop', 'master', 'qa', 'demo', 'uat','hcmpre-717-github-actions-build-apk'] + branches: ['develop', 'master', 'qa', 'demo', 'uat'] pull_request: branches: ['develop', 'master', 'qa', 'demo', 'uat'] diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index e19533c77..fdad108eb 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -36,6 +36,21 @@ jobs: - name: Install Dependencies run: flutter pub get + - name: Create .env file + run: | + echo "BASE_URL=${{ vars.BASE_URL }}" >> apps/health_campaign_field_worker_app/.env + echo "MDMS_API_PATH=${{ vars.MDMS_API_PATH }}" >> apps/health_campaign_field_worker_app/.env + echo "TENANT_ID=${{ vars.TENANT_ID }}" >> apps/health_campaign_field_worker_app/.env + echo "ACTIONS_API_PATH=${{ vars.ACTIONS_API_PATH }}" >> apps/health_campaign_field_worker_app/.env + echo "SYNC_DOWN_RETRY_COUNT=${{ vars.SYNC_DOWN_RETRY_COUNT }}" >> apps/health_campaign_field_worker_app/.env + echo "RETRY_TIME_INTERVAL=${{ vars.RETRY_TIME_INTERVAL }}" >> apps/health_campaign_field_worker_app/.env + echo "CONNECT_TIMEOUT=${{ vars.CONNECT_TIMEOUT }}" >> apps/health_campaign_field_worker_app/.env + echo "RECEIVE_TIMEOUT=${{ vars.RECEIVE_TIMEOUT }}" >> apps/health_campaign_field_worker_app/.env + echo "SEND_TIMEOUT=${{ vars.SEND_TIMEOUT }}" >> apps/health_campaign_field_worker_app/.env + echo "CHECK_BANDWIDTH_API=${{ vars.CHECK_BANDWIDTH_API }}" >> apps/health_campaign_field_worker_app/.env + echo "HIERARCHY_TYPE=${{ vars.HIERARCHY_TYPE }}" >> apps/health_campaign_field_worker_app/.env + echo "ENV_NAME=${{ vars.ENV_NAME }}" >> apps/health_campaign_field_worker_app/.env + - name: Run APK build script env: ENVIRONMENT: QA # or UAT/DEV/ALL depending on your choice @@ -47,66 +62,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: app-release-apk - path: build/app/outputs/flutter-apk/app-release.apk - - - -#name: Build Flutter APK -# -#on: -# push: -# branches: -# - hcmpre-717-github-actions-build-apk # This specifies that the workflow will run on any push to the 'main' branch -# pull_request: -# branches: -# - hcmpre-717-github-actions-build-apk # Optionally, run on pull requests targeting the 'main' branch -# -#jobs: -# build: -# runs-on: ubuntu-latest -# -# steps: -# # Checkout the latest code from the repository -# - name: Checkout repository -# uses: actions/checkout@v3 -# -# - name: Set up JDK 11 -# uses: actions/setup-java@v1 -# with: -# java-version: '11' -# -# - name: Display working directory -# run: pwd -# -# - name: List files -# run: ls -R -# -# - name: Build release APK -# working-directory: ./apps/health_campaign_field_worker_app/android -# run: bash ./gradlew assembleRelease --stacktrace -# -# - name: Build release APK -# run: bash ./health_campaign_field_worker_app/android/gradlew assembleRelease --stacktrace -# -# - name: Rename APK -# run: -# mv "./app/build/outputs/apk/release/app-release.apk" "./app/build/outputs/apk/release/${{ env.OUTPUT_NAME }}.apk" -# -# - name: Upload release APK -# uses: actions/upload-artifact@v1 -# with: -# name: ${{ env.OUTPUT_NAME }} -# path: app/build/outputs/apk/release/${{ env.OUTPUT_NAME }}.apk -# -# - name: Build release AAB -# run: bash ./gradlew bundleRelease --stacktrace -# -# - name: Rename AAB -# run: -# mv "./app/build/outputs/bundle/release/app-release.aab" "./app/build/outputs/bundle/release/${{ env.OUTPUT_NAME }}.aab" -# -# - name: Upload debug AAB -# uses: actions/upload-artifact@v1 -# with: -# name: ${{ env.OUTPUT_NAME }} -# path: app/build/outputs/bundle/release/${{ env.OUTPUT_NAME }}.aab + path: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/tools/generate-apk.sh b/tools/generate-apk.sh index 72120d0a0..12b067281 100755 --- a/tools/generate-apk.sh +++ b/tools/generate-apk.sh @@ -17,6 +17,7 @@ build_apk() { # Get environment and build config from GitHub Actions environment variables env="${ENVIRONMENT:-ALL}" build_config="${BUILD_CONFIG:-release}" + ## Ask user for environment to build for #echo "Please select an environment to build for (UAT, DEV, QA or ALL):" #read env @@ -28,35 +29,35 @@ build_config="${BUILD_CONFIG:-release}" #build_config="${build_config:-release}" # Build APK for specified environment(s) and build config -if [ "$env" == "ALL" ]; then - env_list=("UAT" "DEV" "QA") -else - env_list=("$env") -fi +#if [ "$env" == "ALL" ]; then +# env_list=("UAT" "DEV" "QA") +#else +# env_list=("$env") +#fi #./tools/install_bricks.sh -for env_option in "${env_list[@]}"; do +#for env_option in "${env_list[@]}"; do cd "$APP_DIR" || exit - case $env_option in - "UAT") - cp ".env.uat" ".env" - ;; - "QA") - cp ".env.qa" ".env" - ;; - "DEV") - cp ".env.dev" ".env" - ;; - esac +# case $env_option in +# "UAT") +# cp ".env.uat" ".env" +# ;; +# "QA") +# cp ".env.qa" ".env" +# ;; +# "DEV") +# cp ".env.dev" ".env" +# ;; +# esac build_apk cd ../../ || exit - mkdir -p outputs +# mkdir -p outputs # mv "$APP_DIR/build/app/outputs/flutter-apk/app-$build_config.apk" "outputs/app-$env_option-$build_config.apk" -done +#done -open outputs +#open outputs echo "APK generation complete." From e6d686c226a5dc796b87d8f670d89cd0fb766571 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 14 Oct 2024 17:25:31 +0530 Subject: [PATCH 18/33] Using the env variables from github variables --- .../pubspec.lock | 197 +++++++++--------- .../pubspec.yaml | 2 +- 2 files changed, 97 insertions(+), 102 deletions(-) diff --git a/apps/health_campaign_field_worker_app/pubspec.lock b/apps/health_campaign_field_worker_app/pubspec.lock index c3682f6bd..4bbffed39 100644 --- a/apps/health_campaign_field_worker_app/pubspec.lock +++ b/apps/health_campaign_field_worker_app/pubspec.lock @@ -37,18 +37,18 @@ packages: dependency: transitive description: name: ansicolor - sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" archive: dependency: transitive description: name: archive - sha256: "6bd38d335f0954f5fad9c79e614604fbf03a0e5b975923dd001b6ea965ef5b4b" + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.6.0" + version: "3.6.1" args: dependency: transitive description: @@ -156,10 +156,10 @@ packages: dependency: transitive description: name: battery_plus_platform_interface - sha256: "942707f90e2f7481dcb178df02e22a9c6971b3562b848d6a1b8c7cff9f1a1fec" + sha256: e8342c0f32de4b1dfd0223114b6785e48e579bfc398da9471c9179b907fa4910 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" bloc: dependency: transitive description: @@ -284,18 +284,18 @@ packages: dependency: transitive description: name: camera_platform_interface - sha256: a250314a48ea337b35909a4c9d5416a208d736dcb01d0b02c6af122be66660b0 + sha256: b3ede1f171532e0d83111fe0980b46d17f1aa9788a07a2fbed07366bbdbb9061 url: "https://pub.dev" source: hosted - version: "2.7.4" + version: "2.8.0" camera_web: dependency: transitive description: name: camera_web - sha256: "9e9aba2fbab77ce2472924196ff8ac4dd8f9126c4f9a3096171cd1d870d6b26c" + sha256: b9235ec0a2ce949daec546f1f3d86f05c3921ed31c7d9ab6b7c03214d152fc2d url: "https://pub.dev" source: hosted - version: "0.3.3" + version: "0.3.4" characters: dependency: transitive description: @@ -339,10 +339,9 @@ packages: closed_household: dependency: "direct main" description: - name: closed_household - sha256: d216dbc8e263c9be576e3747ceee9715a6a96e6056a7a812847fb44589f515e8 - url: "https://pub.dev" - source: hosted + path: "../../packages/closed_household" + relative: true + source: path version: "1.0.1+1" code_builder: dependency: transitive @@ -475,10 +474,10 @@ packages: dependency: transitive description: name: device_info_plus_platform_interface - sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" diff_match_patch: dependency: transitive description: @@ -497,9 +496,10 @@ packages: digit_data_model: dependency: "direct main" description: - path: "../../packages/digit_data_model" - relative: true - source: path + name: digit_data_model + sha256: "0b81e96636496b56b4f9c5d918690a17d8985d6b131e0ab54968eb5471ee4f54" + url: "https://pub.dev" + source: hosted version: "1.0.3+1" digit_dss: dependency: "direct main" @@ -511,11 +511,9 @@ packages: digit_firebase_services: dependency: "direct main" description: - path: "packages/digit_firebase_services" - ref: checklist-tanishi - resolved-ref: a4fd63e10e76cec82675332689e344e309246e65 - url: "https://github.com/egovernments/health-campaign-field-worker-app" - source: git + path: "../../packages/digit_firebase_services" + relative: true + source: path version: "0.0.1" digit_scanner: dependency: "direct main" @@ -527,19 +525,26 @@ packages: digit_showcase: dependency: "direct main" description: - name: digit_showcase - sha256: "75b67298f1860ad757827b15af752b677f934b5275b887e36b15e25a5285e498" - url: "https://pub.dev" - source: hosted + path: "../../packages/digit_showcase" + relative: true + source: path version: "1.0.0" dio: dependency: "direct main" description: name: dio - sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" + sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" url: "https://pub.dev" source: hosted - version: "5.4.3+1" + version: "5.7.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "36c5b2d79eb17cdae41e974b7a8284fec631651d2a6f39a8a2ff22327e90aeac" + url: "https://pub.dev" + source: hosted + version: "1.0.1" disable_battery_optimization: dependency: "direct main" description: @@ -640,10 +645,10 @@ packages: dependency: transitive description: name: firebase_core_platform_interface - sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 + sha256: e30da58198a6d4b49d5bce4e852f985c32cb10db329ebef9473db2b9f09ce810 url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.3.0" firebase_core_web: dependency: transitive description: @@ -685,50 +690,50 @@ packages: dependency: "direct main" description: name: flutter_background_service - sha256: "94d9a143852729140e17254a53769383b03738cd92b6e588a8762003e6cd9dd9" + sha256: d32f078ec57647c9cfd6e1a8da9297f7d8f021d4dcc204a35aaad2cdbfe255f0 url: "https://pub.dev" source: hosted - version: "5.0.5" + version: "5.0.10" flutter_background_service_android: dependency: transitive description: name: flutter_background_service_android - sha256: "30863ebafd8214b8e76d5e5c9f27887dc5cc303fcf3e89f71534f621fc486782" + sha256: "39da42dddf877beeef82bc2583130d8bedb4d0765e99ca9e7b4a32e8c6abd239" url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.2.7" flutter_background_service_ios: dependency: transitive description: name: flutter_background_service_ios - sha256: ab73657535876e16abc89e40f924df3e92ad3dee83f64d187081417e824709ed + sha256: "6037ffd45c4d019dab0975c7feb1d31012dd697e25edc05505a4a9b0c7dc9fba" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.0.3" flutter_background_service_platform_interface: dependency: transitive description: name: flutter_background_service_platform_interface - sha256: cd5720ff5b051d551a4734fae16683aace779bd0425e8d3f15d84a0cdcc2d8d9 + sha256: ca74aa95789a8304f4d3f57f07ba404faa86bed6e415f83e8edea6ad8b904a41 url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.2" flutter_bloc: dependency: "direct main" description: name: flutter_bloc - sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2 + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a url: "https://pub.dev" source: hosted - version: "8.1.5" + version: "8.1.6" flutter_dotenv: dependency: "direct main" description: name: flutter_dotenv - sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77" + sha256: b7c7be5cd9f6ef7a78429cabd2774d3c4af50e79cb2b7593e3d5d763ef95c61b url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.2.1" flutter_driver: dependency: transitive description: flutter @@ -818,18 +823,18 @@ packages: dependency: transitive description: name: flutter_local_notifications_linux - sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af url: "https://pub.dev" source: hosted - version: "4.0.0+1" + version: "4.0.1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" + sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" url: "https://pub.dev" source: hosted - version: "7.1.0" + version: "7.2.0" flutter_localizations: dependency: "direct main" description: flutter @@ -961,10 +966,10 @@ packages: dependency: "direct main" description: name: freezed_annotation - sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.4" frontend_server_client: dependency: transitive description: @@ -1030,10 +1035,10 @@ packages: dependency: "direct main" description: name: gs1_barcode_parser - sha256: "9aaff47bdab7177deaf9248cc861ef41cf611d3f828498cb40b64bedcbf53391" + sha256: ff171bc40038de3f7178fbc32eaf9eebc3d35a3c4c00bb0281fe4a976d853a42 url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.1.0" horizontal_data_table: dependency: transitive description: @@ -1046,10 +1051,10 @@ packages: dependency: transitive description: name: hrk_batteries - sha256: "8ecfdee8268d480a700153a006f7c622c922fbfba4d8f576438c8c41ea9efdf2" + sha256: "35bc2be10bb64284b04d3cd944c24eecf304747fc64b34e2d27ef1a3ac75ab49" url: "https://pub.dev" source: hosted - version: "0.9.2" + version: "2.2.0" hrk_flutter_test_batteries: dependency: "direct dev" description: @@ -1062,10 +1067,10 @@ packages: dependency: transitive description: name: hrk_logging - sha256: "7ea3d02ed46f19533a8cae075cafe636757548a300a0e404193f6dd142c024b5" + sha256: "2e6501f4b78439bec4c367a94b14f792fd17fe1c94f18d903086c7b8a48402f5" url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "0.3.1" http: dependency: transitive description: @@ -1094,10 +1099,10 @@ packages: dependency: transitive description: name: image - sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" url: "https://pub.dev" source: hosted - version: "4.1.7" + version: "4.2.0" integration_test: dependency: "direct dev" description: flutter @@ -1114,10 +1119,9 @@ packages: inventory_management: dependency: "direct main" description: - name: inventory_management - sha256: "1a5976ab807666629704f559730d5418e1c723fed898df2cc6e7d9807f813b6f" - url: "https://pub.dev" - source: hosted + path: "../../packages/inventory_management" + relative: true + source: path version: "1.0.3+2" io: dependency: transitive @@ -1259,18 +1263,18 @@ packages: dependency: transitive description: name: mime - sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.6" mocktail: dependency: "direct dev" description: name: mocktail - sha256: c4b5007d91ca4f67256e720cb1b6d704e79a510183a12fa551021f652577dce6 + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" nested: dependency: "direct main" description: @@ -1347,10 +1351,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: @@ -1387,10 +1391,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" pedantic: dependency: transitive description: @@ -1451,10 +1455,10 @@ packages: dependency: "direct main" description: name: pretty_dio_logger - sha256: "00b80053063935cf9a6190da344c5373b9d0e92da4c944c878ff2fbef0ef6dc2" + sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.4.0" process: dependency: transitive description: @@ -1483,10 +1487,10 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.3.0" qr: dependency: transitive description: @@ -1585,18 +1589,18 @@ packages: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "2ba0510d3017f91655b7543e9ee46d48619de2a2af38e5c790423f7007c7ccc1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_web: dependency: transitive description: @@ -1609,10 +1613,10 @@ packages: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "398084b47b7f92110683cac45c6dc4aae853db47e470e5ddcd52cab7f7196ab2" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" shelf: dependency: transitive description: @@ -1710,10 +1714,10 @@ packages: dependency: transitive description: name: speech_to_text_platform_interface - sha256: a0df1a907091ea09880077dc25aae02af9f79811264e6e97ddb08639b7f771c2 + sha256: a1935847704e41ee468aad83181ddd2423d0833abe55d769c59afca07adb5114 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" sqlite3: dependency: transitive description: @@ -1726,10 +1730,10 @@ packages: dependency: "direct main" description: name: sqlite3_flutter_libs - sha256: fb2a106a2ea6042fe57de2c47074cc31539a941819c91e105b864744605da3f5 + sha256: "62bbb4073edbcdf53f40c80775f33eea01d301b7b81417e5b3fb7395416258c1" url: "https://pub.dev" source: hosted - version: "0.5.21" + version: "0.5.24" sqlparser: dependency: transitive description: @@ -1770,15 +1774,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - survey_form: - dependency: "direct overridden" - description: - path: "packages/survey_form" - ref: checklist-package - resolved-ref: "990025a060809c5e07ee61df8d7042f29f786122" - url: "https://github.com/egovernments/health-campaign-field-worker-app" - source: git - version: "0.0.1-dev.1" sync_http: dependency: transitive description: @@ -1839,10 +1834,10 @@ packages: dependency: transitive description: name: timezone - sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5 + sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d" url: "https://pub.dev" source: hosted - version: "0.9.3" + version: "0.9.4" timing: dependency: transitive description: @@ -1879,10 +1874,10 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.6" + version: "6.3.0" url_launcher_android: dependency: transitive description: @@ -1935,10 +1930,10 @@ packages: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: "direct main" description: @@ -2071,10 +2066,10 @@ packages: dependency: transitive description: name: xxh3 - sha256: a92b30944a9aeb4e3d4f3c3d4ddb3c7816ca73475cd603682c4f8149690f56d7 + sha256: cbeb0e1d10f4c6bf67b650f395eac0cc689425b5efc2ba0cc3d3e069a0beaeec url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.0" yaml: dependency: transitive description: diff --git a/apps/health_campaign_field_worker_app/pubspec.yaml b/apps/health_campaign_field_worker_app/pubspec.yaml index c2d6d352d..d25e3f63d 100644 --- a/apps/health_campaign_field_worker_app/pubspec.yaml +++ b/apps/health_campaign_field_worker_app/pubspec.yaml @@ -69,7 +69,7 @@ dependencies: digit_scanner: ^1.0.3+1 inventory_management: ^1.0.3+2 referral_reconciliation: ^1.0.2+1 - digit_data_model: ^1.0.3+1 + digit_data_model: 1.0.3+1 registration_delivery: ^1.0.3+1 disable_battery_optimization: ^1.1.1 digit_dss: ^1.0.1 From 735224b22f6214cd365371466caff2d06c81cb53 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 14 Oct 2024 17:48:53 +0530 Subject: [PATCH 19/33] Using the env variables from github variables --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index fdad108eb..3f1603cac 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -55,7 +55,7 @@ jobs: env: ENVIRONMENT: QA # or UAT/DEV/ALL depending on your choice BUILD_CONFIG: release # or profile depending on your choice - run: yes 1 | bash ./tools/generate-apk.sh + run: bash ./tools/generate-apk.sh # Archive the APK as a build artifact so it can be downloaded - name: Upload APK From 011cbd55288f77fbfd0aa9e63f74e6ec079f01dd Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 14 Oct 2024 17:59:26 +0530 Subject: [PATCH 20/33] Changed the uploaded path for apk --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 3f1603cac..7694f15f4 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -62,4 +62,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: app-release-apk - path: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file + path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file From 900ba38b4c9cecfec23b0f477e9520bfc36243af Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Mon, 14 Oct 2024 18:09:48 +0530 Subject: [PATCH 21/33] Changed the uploaded path for apk --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 7694f15f4..daa69768c 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -58,7 +58,7 @@ jobs: run: bash ./tools/generate-apk.sh # Archive the APK as a build artifact so it can be downloaded - - name: Upload APK + - name: Upload APKs uses: actions/upload-artifact@v3 with: name: app-release-apk From df02414c58386ceeb3861be57886cf81f448ed58 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Tue, 15 Oct 2024 11:25:01 +0530 Subject: [PATCH 22/33] Using only github workflow to build apk --- .github/workflows/flutter-build-apk.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index daa69768c..00bb3968b 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -55,7 +55,8 @@ jobs: env: ENVIRONMENT: QA # or UAT/DEV/ALL depending on your choice BUILD_CONFIG: release # or profile depending on your choice - run: bash ./tools/generate-apk.sh +# run: bash ./tools/generate-apk.sh + run: cd apps/health_campaign_field_worker_app && flutter build apk --release && cd ../../ # Archive the APK as a build artifact so it can be downloaded - name: Upload APKs From f166b87d6ee2ecd4de2c747603927e9badbc46ba Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Tue, 15 Oct 2024 11:45:56 +0530 Subject: [PATCH 23/33] Running the install_bricks.sh file --- .github/workflows/flutter-build-apk.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 00bb3968b..57bcdf8db 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -2,11 +2,9 @@ name: Build APK Workflow on: push: - branches: - - hcmpre-717-github-actions-build-apk # This specifies that the workflow will run on any push to the 'main' branch + branches: ['develop', 'hcmpre-717-github-actions-build-apk'] # This specifies that the workflow will run on any push to the 'main' branch pull_request: - branches: - - hcmpre-717-github-actions-build-apk # Optionally, run on pull requests targeting the 'main' branch + branches: ['develop', 'hcmpre-717-github-actions-build-apk'] # Optionally, run on pull requests targeting the 'main' branch jobs: build-apk: @@ -53,10 +51,8 @@ jobs: - name: Run APK build script env: - ENVIRONMENT: QA # or UAT/DEV/ALL depending on your choice BUILD_CONFIG: release # or profile depending on your choice -# run: bash ./tools/generate-apk.sh - run: cd apps/health_campaign_field_worker_app && flutter build apk --release && cd ../../ + run: bash ./tools/generate-apk.sh # Archive the APK as a build artifact so it can be downloaded - name: Upload APKs From 0047a98a15e55c7bcbbca037f72cf0d34553b657 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Tue, 15 Oct 2024 12:01:07 +0530 Subject: [PATCH 24/33] Running the install_bricks.sh file --- tools/generate-apk.sh | 38 +------------------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/tools/generate-apk.sh b/tools/generate-apk.sh index 12b067281..b99915beb 100755 --- a/tools/generate-apk.sh +++ b/tools/generate-apk.sh @@ -15,49 +15,13 @@ build_apk() { } # Get environment and build config from GitHub Actions environment variables -env="${ENVIRONMENT:-ALL}" build_config="${BUILD_CONFIG:-release}" -## Ask user for environment to build for -#echo "Please select an environment to build for (UAT, DEV, QA or ALL):" -#read env -#env="${env:-ALL}" -# -## Ask user for build config -#echo "Please select a build config (release or profile):" -#read build_config -#build_config="${build_config:-release}" +./tools/install_bricks.sh -# Build APK for specified environment(s) and build config -#if [ "$env" == "ALL" ]; then -# env_list=("UAT" "DEV" "QA") -#else -# env_list=("$env") -#fi - -#./tools/install_bricks.sh - -#for env_option in "${env_list[@]}"; do cd "$APP_DIR" || exit -# case $env_option in -# "UAT") -# cp ".env.uat" ".env" -# ;; -# "QA") -# cp ".env.qa" ".env" -# ;; -# "DEV") -# cp ".env.dev" ".env" -# ;; -# esac - build_apk cd ../../ || exit -# mkdir -p outputs -# mv "$APP_DIR/build/app/outputs/flutter-apk/app-$build_config.apk" "outputs/app-$env_option-$build_config.apk" -#done - -#open outputs echo "APK generation complete." From d9a807bd90ee4e1f4ced1c55d693cdb0ac55f776 Mon Sep 17 00:00:00 2001 From: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:19:08 +0530 Subject: [PATCH 25/33] Pgr and survey_form package merge (#573) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updated the integer form picker and added a new text block component (#441) * updated the integer picker and added a new text block component * added a field to change the width of button * modified text block component to conditionally render children --------- Co-authored-by: rachana-egov * updated description for household location and details page (#443) Co-authored-by: rachana-egov * replaced product variant dropdown to selection card (#445) Co-authored-by: rachana-egov * HLM-6283:: IRS- Household Details Fields added (#444) * Updated checklist for a new type boolean (#446) * updated checklist for a new type boolean * added To Do to fix hard code options --------- Co-authored-by: rachana-egov * HLM-6282 and HLM-6283:: House Structure Details Page added (#447) * HLM-6283:: IRS- Household Details Fields added * HLM-6283:: House Structure Details Page * integrated checklist inside the beneficiary flow and updated gender field to selection card (#450) Co-authored-by: rachana-egov * HLM-6371:: Beneficiary Registration Summary Page (#452) * HLM-6283:: IRS- Household Details Fields added * HLM-6283:: House Structure Details Page * HLM-6371:: Beneficiary Registration Summary Page * Updated registration_delivery script * Added refused delivery page (#451) * integrated checklist inside the beneficiary flow and updated gender field to selection card * fetching refusal reasons * added refused delivery page * added refused delivery page --------- Co-authored-by: rachana-egov Co-authored-by: Naveen J <83631045+naveen-egov@users.noreply.github.com> * No delivery flow page (#453) Co-authored-by: rachana-egov * HLM-6367:: Auto Create project beneficiary (#454) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved --------- Co-authored-by: Naveen Renati * Hlm 6414 - MDMS StatusFilter, Filter search (#448) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * HCMPRE-98 Filter search pagination, Removed private PageState (#457) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * Created a new package for marking closed household (#459) * Created a new package for marking closed household * fixed build issues * updated the name to userAction --------- Co-authored-by: rachana-egov * HCMPRE-98 - Inventory TeamCode fixes, Filter search fixes (#460) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * Hcmpre 118 - Closed Household, Filter improvements, Bug fixes (#467) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart * Exposed Registration delivery pages * updated remote repository and some miner fixes (#461) Co-authored-by: rachana-egov * HCMPRE-82:: Validations and Bug Fixes * small css fixes (#462) Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * merge fix * added closed household search * status model fix * Closed-household-registration (#464) * closed-household-registration * closed-household-registration * updated pub file --------- Co-authored-by: rachana-egov * added closed household init file modified user_action.dart model and db corrected modified closed household status * updated registration for closed household * added closed_household search and updating closed household status * clearing search before navigating to registration flow * getting last tasks in household_overview.dart * HCMPRE-107:: Summary page added for Delivery Flow, HCMPRE-111:: Disable Delete household if beneficiary not present (#463) * Validation and gps fixes * fixed closed household count clearing closedhould results for clear * pagination fix for closed household * sync down for closed household, updated scan voucher button, and remove the tag when we navigate to a different page (#465) Co-authored-by: rachana-egov * DeliverySummary Route added to main app * seperated closedhousehold search Bug fixes - HCMPRE-112, 110, 113 * updated all the points of this ticket HCMPRE-120 (#466) Co-authored-by: rachana-egov * Bug Fixes, dev version release of packages * HCMPRE-119:: IRS Demo fixes (#468) * HCMPRE-119:: IRS Demo fixes * Removed unused code * updated closed button action to push closedhousehold tasks filter with last fix * updated validation for closed household name and fix error message size (#470) Co-authored-by: rachana-egov * Irs demo fix patch (#469) * HCMPRE-119:: IRS Demo fixes * Removed unused code * Edit Household if no project beneficiary fix * reverted hiding of digit search bar when closed filter is applied * status update based on last task status in household_overview.dart mapped administered success in beneficiary_card.dart moved getstatus to utils.dart * fixed offset increasing twice * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes (#471) * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes * Added date formats to constants * fixed offset increasing twice closed household distance fix emitting scanner state loading * dev version bump-up for registration and scanner * version updates for packages --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov * Hcmpre 155 - ClosedHousehold flow change (#478) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart * Exposed Registration delivery pages * updated remote repository and some miner fixes (#461) Co-authored-by: rachana-egov * HCMPRE-82:: Validations and Bug Fixes * small css fixes (#462) Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * merge fix * added closed household search * status model fix * Closed-household-registration (#464) * closed-household-registration * closed-household-registration * updated pub file --------- Co-authored-by: rachana-egov * added closed household init file modified user_action.dart model and db corrected modified closed household status * updated registration for closed household * added closed_household search and updating closed household status * clearing search before navigating to registration flow * getting last tasks in household_overview.dart * HCMPRE-107:: Summary page added for Delivery Flow, HCMPRE-111:: Disable Delete household if beneficiary not present (#463) * Validation and gps fixes * fixed closed household count clearing closedhould results for clear * pagination fix for closed household * sync down for closed household, updated scan voucher button, and remove the tag when we navigate to a different page (#465) Co-authored-by: rachana-egov * DeliverySummary Route added to main app * seperated closedhousehold search Bug fixes - HCMPRE-112, 110, 113 * updated all the points of this ticket HCMPRE-120 (#466) Co-authored-by: rachana-egov * Bug Fixes, dev version release of packages * HCMPRE-119:: IRS Demo fixes (#468) * HCMPRE-119:: IRS Demo fixes * Removed unused code * updated closed button action to push closedhousehold tasks filter with last fix * updated validation for closed household name and fix error message size (#470) Co-authored-by: rachana-egov * Irs demo fix patch (#469) * HCMPRE-119:: IRS Demo fixes * Removed unused code * Edit Household if no project beneficiary fix * reverted hiding of digit search bar when closed filter is applied * status update based on last task status in household_overview.dart mapped administered success in beneficiary_card.dart moved getstatus to utils.dart * fixed offset increasing twice * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes (#471) * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes * Added date formats to constants * fixed offset increasing twice closed household distance fix emitting scanner state loading * dev version bump-up for registration and scanner * version updates for packages * View Household button added in delete individual success page, Search project beneficiary fix * added close button to close the filter and disabled the clear button … (#475) * added close button to close the filter and disabled the clear button unless something is selected * added validation for closed household head name same as individual * updated the condition for validation of closehousehold head --------- Co-authored-by: rachana-egov * View Household button added in delete individual success page, Search project beneficiary fix (#474) * Search beneficiary fix * Search beneficiary fix * Bloc dispose fix * Bloc dispose fix * Updated task based search for household * Modified closed household package to use registration flow for creating a household and related data along with task as closed deleted user_action from data_model package Updating closed_household to not_delivered status after closed household registration * version updates of closed_household, digit_components, digit_data_model, registration_delivery * version upgrade for registration_delivery --------- Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * Hcmpre 164, 165 - Count implementation for filter search (#485) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * Resolved code comments --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * fixed reports are not getting refreshed after updating facility (#486) Co-authored-by: rachana-egov * Delivery summary page Resources and quantity added (#473) * Delivery summary page Resources and quantity added * fix for offset increment twice * Delivery summary page Resources and quantity added --------- Co-authored-by: Naveen Renati Co-authored-by: Naveen J <83631045+naveen-egov@users.noreply.github.com> * updated script for closed household (#489) Co-authored-by: rachana-egov * Hcmpre 166 - Moved Localization from ISAR To SQL (#488) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * created new table for localization TODO: separate packages localization delegates to individual package and move the localization model to data_model package for common usage Delete localization related isar files once tested * init Boundary code wise localization.dart * create localization local repo modified module separation from query to exclude and include specified module * modified module exclude in boundary page * modified localization call for boundary selection bug where first value is localized in dropdown * removed un-required localization bloc calls * updated index value to selected language on home * removed login cred --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Removed null condition, fixed double is not a subtype of string issue and added null check for table (#490) * HCMPRE-156 : type 'double' is not a subtype of type 'String' * added check if the first table row is null --------- Co-authored-by: rachana-egov Co-authored-by: Naveen J <83631045+naveen-egov@users.noreply.github.com> * HCMPRE-177:: Metric and Table Charts Integration in Mobile dashboard and digit_dss package initial release (#480) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * HCMPRE-55 Dashboard Static Screen added * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart * Exposed Registration delivery pages * updated remote repository and some miner fixes (#461) Co-authored-by: rachana-egov * HCMPRE-82:: Validations and Bug Fixes * small css fixes (#462) Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * merge fix * added closed household search * status model fix * Closed-household-registration (#464) * closed-household-registration * closed-household-registration * updated pub file --------- Co-authored-by: rachana-egov * added closed household init file modified user_action.dart model and db corrected modified closed household status * updated registration for closed household * added closed_household search and updating closed household status * clearing search before navigating to registration flow * getting last tasks in household_overview.dart * HCMPRE-107:: Summary page added for Delivery Flow, HCMPRE-111:: Disable Delete household if beneficiary not present (#463) * Validation and gps fixes * fixed closed household count clearing closedhould results for clear * pagination fix for closed household * sync down for closed household, updated scan voucher button, and remove the tag when we navigate to a different page (#465) Co-authored-by: rachana-egov * DeliverySummary Route added to main app * seperated closedhousehold search Bug fixes - HCMPRE-112, 110, 113 * updated all the points of this ticket HCMPRE-120 (#466) Co-authored-by: rachana-egov * Bug Fixes, dev version release of packages * HCMPRE-119:: IRS Demo fixes (#468) * HCMPRE-119:: IRS Demo fixes * Removed unused code * updated closed button action to push closedhousehold tasks filter with last fix * updated validation for closed household name and fix error message size (#470) Co-authored-by: rachana-egov * Irs demo fix patch (#469) * HCMPRE-119:: IRS Demo fixes * Removed unused code * Edit Household if no project beneficiary fix * reverted hiding of digit search bar when closed filter is applied * status update based on last task status in household_overview.dart mapped administered success in beneficiary_card.dart moved getstatus to utils.dart * fixed offset increasing twice * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes (#471) * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes * Added date formats to constants * fixed offset increasing twice closed household distance fix emitting scanner state loading * dev version bump-up for registration and scanner * version updates for packages * View Household button added in delete individual success page, Search project beneficiary fix * added close button to close the filter and disabled the clear button … (#475) * added close button to close the filter and disabled the clear button unless something is selected * added validation for closed household head name same as individual * updated the condition for validation of closehousehold head --------- Co-authored-by: rachana-egov * View Household button added in delete individual success page, Search project beneficiary fix (#474) * Search beneficiary fix * Search beneficiary fix * Bloc dispose fix * Bloc dispose fix * Updated task based search for household * HCMPRE-177:: Metric Chart Integration and digit_dss package setup * HCMPRE-177:: Added Refresh Indicator for refreshing the dashboard * HCMPRE-177:: Table chart integration and Refresh logic update * Added code comments for digit_dss package * Added enums and constants * Resolved code comments and updated versions for packages * HCMPRE177:: Moved dashboard UI Config to MDMS * HCMPRE177:: Added dss_import script for digit_dss package * Resolved code comments * Updated dashboard Config * Added dashboard config search to try catch block * Resolved conflicts * published data_model and registration_delivery * Added Read me file and updated pubspec.yaml --------- Co-authored-by: Naveen Renati Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * HCMPRE-177:: Fetch and send attendees uuids of registers to dss filters (#491) * added translator for administration area * Fixed Facility search based on tenant ID * Added disable battery optimization permission for background service * Added disable battery optimization ask permission on App start and background service start * HLM-5984:: Get Precise location on Submitting latitude longitude details * Reverted install_bricks.sh * added new status REGISTERED, NOT_REGISTERED updated conditional check for status by project beneficiaries * added static status_filter.dart integration in search_beneficiary.dart * TODO for selected_filters display condition * integrated household search filters with mdms implemented search based on filters with pagination for Registered and NotRegistered * updated status filter component merge with develop * create individual_global_search and implemented search * Auto Create Project Beneficiary on Edit Household, and disable record delivery if no project beneficiary present * Conflicts resolved * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty * implemented household_global_search.dart fixed individual_global_search.dart * updated proximity search for household_global_search.dart * Pop State recapture during registration flow, Disable delivery flow for individual based campaign if project beneficiaries is empty (#456) * updated class state from private for customization override in registration_delivery and inventory added pagination for filter search TODO: combination search for registered and not registered needs fix which return only last selected results * adding missed changes for last commit * HCMPRE-55 Dashboard Static Screen added * displaying selected filter value for applied filters in search_beneficiary.dart * updated changelog for inventory and registration_delivery for new dev versions * updated pubspec lock of registration_delivery * removed multiple filter selection modified filter search * fixed delivery team scanner issues in stock_details.dart * Fixed - missing addition of scanned resources to additional fields filter search bug fixes * HCMPRE-74, HCMPRE-82, HCMPRE-83:: Household Reload Fix, Validations for Household details added (#458) * updated individual global search added beneficiary type check in view_beneficiary_card.dart removed commented code in household_overview.dart * Added null check for beneficiaryTag in closed_household_summary.dart * Exposed Registration delivery pages * updated remote repository and some miner fixes (#461) Co-authored-by: rachana-egov * HCMPRE-82:: Validations and Bug Fixes * small css fixes (#462) Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * merge fix * added closed household search * status model fix * Closed-household-registration (#464) * closed-household-registration * closed-household-registration * updated pub file --------- Co-authored-by: rachana-egov * added closed household init file modified user_action.dart model and db corrected modified closed household status * updated registration for closed household * added closed_household search and updating closed household status * clearing search before navigating to registration flow * getting last tasks in household_overview.dart * HCMPRE-107:: Summary page added for Delivery Flow, HCMPRE-111:: Disable Delete household if beneficiary not present (#463) * Validation and gps fixes * fixed closed household count clearing closedhould results for clear * pagination fix for closed household * sync down for closed household, updated scan voucher button, and remove the tag when we navigate to a different page (#465) Co-authored-by: rachana-egov * DeliverySummary Route added to main app * seperated closedhousehold search Bug fixes - HCMPRE-112, 110, 113 * updated all the points of this ticket HCMPRE-120 (#466) Co-authored-by: rachana-egov * Bug Fixes, dev version release of packages * HCMPRE-119:: IRS Demo fixes (#468) * HCMPRE-119:: IRS Demo fixes * Removed unused code * updated closed button action to push closedhousehold tasks filter with last fix * updated validation for closed household name and fix error message size (#470) Co-authored-by: rachana-egov * Irs demo fix patch (#469) * HCMPRE-119:: IRS Demo fixes * Removed unused code * Edit Household if no project beneficiary fix * reverted hiding of digit search bar when closed filter is applied * status update based on last task status in household_overview.dart mapped administered success in beneficiary_card.dart moved getstatus to utils.dart * fixed offset increasing twice * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes (#471) * HCMPRE-121:: Enter manual code fix and Search Beneficiary fixes * Added date formats to constants * fixed offset increasing twice closed household distance fix emitting scanner state loading * dev version bump-up for registration and scanner * version updates for packages * View Household button added in delete individual success page, Search project beneficiary fix * added close button to close the filter and disabled the clear button … (#475) * added close button to close the filter and disabled the clear button unless something is selected * added validation for closed household head name same as individual * updated the condition for validation of closehousehold head --------- Co-authored-by: rachana-egov * View Household button added in delete individual success page, Search project beneficiary fix (#474) * Search beneficiary fix * Search beneficiary fix * Bloc dispose fix * Bloc dispose fix * Updated task based search for household * HCMPRE-177:: Metric Chart Integration and digit_dss package setup * HCMPRE-177:: Added Refresh Indicator for refreshing the dashboard * HCMPRE-177:: Table chart integration and Refresh logic update * Added code comments for digit_dss package * Added enums and constants * Resolved code comments and updated versions for packages * HCMPRE177:: Moved dashboard UI Config to MDMS * HCMPRE177:: Added dss_import script for digit_dss package * Resolved code comments * Updated dashboard Config * Added dashboard config search to try catch block * Resolved conflicts * published data_model and registration_delivery * Added Read me file and updated pubspec.yaml * Fetch and send attendees uuids of registers to dss filters * Added dss filters --------- Co-authored-by: Naveen Renati Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Task update rather than creating new, updated filter popup loading (#493) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * Resolved code comments * HCMPRE220:: Household overview state update on pushing to Registration Wrapper * update task state if task is already present * updated selection box to update on initial selection change and updated delivery comment code * remove changes from beneficiary * task update * HCMPRE-220:: SMC Not registered flow reload fix,and closed household Not delivered status fix * added loader for filter search * Added name of user to additional details in stock and delivery record * updated delivery intervention * check summary page condition for edit flow * fixed task update for delivery intervention * fixed household detail page --------- Co-authored-by: rachana-egov Co-authored-by: Naveen Renati Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * updated status and registration_delivery_enums.dart (#494) * updated status and registration_delivery_enums.dart updated check for check-list check in household_overview.dart * Todo for individual check in beneficiary_registration.dart * Uploaded pre release for inventory-management and digit-dss (#495) * removed the page count from filter, updated status filter pop up (#496) Co-authored-by: rachana-egov * updated demo changes (#498) Co-authored-by: rachana-egov * added models and repositories in checklist * complaints package added * linked package repositories to main app * inbox and search pages added * filter page added * inbox view and sort completed * data folder added , inbox load , searc ,sort , filter done * complaint oplog added * Added checklist.dart page * Created Checklist_preview.dart file * all pages done * Handled auth state in checklist.dart * added checklist imports * complaints registration completed * Added all the pages * Fixed dartmapper package * Implemented sync up * Separated checklist package * Removed print statements and unused imports * acknowledgment added * models separated * complaint package completed * added comments * README Added * added README.md * Images added to assets * README Updated * comments added * made requested changes * comments * added lat and long inside additional field when user submit the checklist (#526) Co-authored-by: rachana-egov * added tools file * added tools file 1 * Updated complaint_tools.dart * done * Update home.dart * Update tools complaints_package.dart * added tools and test files * test added * tools added for complaint package * HCMPRE-221 data segration (#501) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * created new table for localization TODO: separate packages localization delegates to individual package and move the localization model to data_model package for common usage Delete localization related isar files once tested * init Boundary code wise localization.dart * create localization local repo modified module separation from query to exclude and include specified module * modified module exclude in boundary page * modified localization call for boundary selection bug where first value is localized in dropdown * removed un-required localization bloc calls * updated index value to selected language on home * Uploaded pre release for inventory-management and digit-dss * Updated delivery enums for Not delivered status * Updated status model in task to taskStatus * Updated registration delivery package * Reverted Task Model status key change * Update pubspec with latest version of packages * Summary page Type of resource locale key updated * Resolved comments * Resolved comments and unused variables * Resolved comments and unused variables * Updated version * Updated individual_global_search.dart for search * added data segration * check to enable edit delivery * added project filter * Registration delivery- Attendance management fixes (#497) * Removed captured location dialog on attendance submit * Removed stpper if deliveries length is greater than 1 * Updated digit_components and digit_data_model packages in attendance management * Updated digit_components and digit_data_model packages in attendance management * Localization loader and dialog localization fix (#505) * added dialog till localization is not loaded * fixed localization not coming issue * added a util funtion to show language loading --------- Co-authored-by: rachana-egov * updated search added project id in beneficiary search removed commented code * User uuids filter fixes for attendees local search in an attendance register (#512) * User uuids filters fixes for attendees search in a register * Removed default dashboard card from home * Sync fix --------- Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Added Task address mapping on refused delivery (#514) * replace and push homepage from boundary page sync dialog * updated register search query to exclude attendee and staff in limit query updated attendance and registration_delivery package * registration_delivery package update * * Added error toast for network failure (#525) * No result card added if no charts available * Updated end date for dss charts to 23:59 instead of 11:59 (#527) * task create fix - removed condition check of resources during create updated changelog of registration, closed, digit_data_model, inventory, registration_delivery --dry-run fixes * Updated stable packages for scanner, attendance and dss (#528) * updated packages to latest version digit_components version update --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Naveen Renati Co-authored-by: Ramkrishna-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * made the requested changes * code refactored * added license * made page states public * comments removed * changed homepage path * updated * updated tools * merged from develop branch * tests updated * complaint_type inbox updated * test file updated * sdk updated * added complaints package ref * resolved * issues resolved * made all the requested changes in checklist package * complaints example added * error resolevd test * error resolevd test * example/test updated * unnecessary folders removed * updated to DigitOutlinedButton in Complaints/Exaple * commit * Did project * Did example project * Cleaned the example project * Removed folders * Removed example unused folders * updated icos flutter to digit * Replaced android and ios icons * Replaced icons * removed print statements * verions of digit data model updated * changelog updated * Updated changelog and pubspec.yaml of digit data model * Updated changelog and pubspec.yaml of digit data model * Removed macos from example project * tool script update and digit_data_model versions updated * tool script update and digit_data_model versions updated * changed digit_data_model version * added digit_mappable_builder in override file of digit_dss * dart_mappable_builder override added * made version changes in pubspec * Added Privacy Policy (#499) * added data privacy component * added privacy component * updated localization * updated the dialog to use localized value * updated privacy config inside mdms * updated privacy model * removed local privacy config now coming from mdms * Delete packages/digit_components/lib/widgets/atoms/privacy_component.dart as component is part of main application * fixed github build issue * added a configuration to enable or disable this privacy policy component * fix the issue when privacy policy component is not there * fix the issue when privacy policy component is not there * fixed github comments --------- Co-authored-by: rachana-egov * changed publock * resolving version mismatch issue * added overrides from github * HCMPRE-332:: Mobile dashboard added check for lastSyncTime to convert to date format (#540) * HCMPRE-332:: Mobile dashboard added check for lastSyncTime to convert to date format * added a enum for lastSyncedTime --------- Co-authored-by: rachana-egov * changed package name from checklist to survey_form * modified tool script * modified tool script and added marker * added pubspec.lock files * moved survey_form dependency to local overrides * Hcmpre 263 - Sync write transaction for ISAR - fix, Localization fall back (#538) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * created new table for localization TODO: separate packages localization delegates to individual package and move the localization model to data_model package for common usage Delete localization related isar files once tested * init Boundary code wise localization.dart * create localization local repo modified module separation from query to exclude and include specified module * modified module exclude in boundary page * modified localization call for boundary selection bug where first value is localized in dropdown * removed un-required localization bloc calls * updated index value to selected language on home * Uploaded pre release for inventory-management and digit-dss * Updated delivery enums for Not delivered status * Updated status model in task to taskStatus * Updated registration delivery package * Reverted Task Model status key change * Update pubspec with latest version of packages * Summary page Type of resource locale key updated * Resolved comments * Resolved comments and unused variables * Resolved comments and unused variables * Updated version * Updated individual_global_search.dart for search * added data segration * check to enable edit delivery * added project filter * Registration delivery- Attendance management fixes (#497) * Removed captured location dialog on attendance submit * Removed stpper if deliveries length is greater than 1 * Updated digit_components and digit_data_model packages in attendance management * Updated digit_components and digit_data_model packages in attendance management * Localization loader and dialog localization fix (#505) * added dialog till localization is not loaded * fixed localization not coming issue * added a util funtion to show language loading --------- Co-authored-by: rachana-egov * updated search added project id in beneficiary search removed commented code * User uuids filter fixes for attendees local search in an attendance register (#512) * User uuids filters fixes for attendees search in a register * Removed default dashboard card from home * Sync fix --------- Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Added Task address mapping on refused delivery (#514) * replace and push homepage from boundary page sync dialog * updated register search query to exclude attendee and staff in limit query updated attendance and registration_delivery package * registration_delivery package update * * Added error toast for network failure (#525) * No result card added if no charts available * Updated end date for dss charts to 23:59 instead of 11:59 (#527) * task create fix - removed condition check of resources during create updated changelog of registration, closed, digit_data_model, inventory, registration_delivery --dry-run fixes * Updated stable packages for scanner, attendance and dss (#528) * updated packages to latest version digit_components version update * added fallback ui dialog when localization call fails. * added localization code * merge from dev * fix for isar transaction lock issue * moved boundary localization path to constants. Updated dialog in language_selection.dart page * isar lock fix * updated data_model version for isar fix. updated a check in language_selection.dart for dialog --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov Co-authored-by: naveen-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * Impel changes - background-services, beneficiary_checklist (#548) * Update closed_household_details.dart (#482) * Fixed pagination refresh issue (#481) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments --------- Co-authored-by: rachana-egov * implemented count for filter search, added todo for combination search count * Fixed count TODO: search with task status filter * Fixed search with task status filter Removed delay in delivery_summary_page.dart * added code comments * HCMPRE-165 issues (#484) * Implement search pagination (#476) * implemented pagination for search * added one more check to check if last response is equal to current response then also break the loop * removed changes from data repository and added pagination only project facility and facility --------- Co-authored-by: rachana-egov * localization update, input validation for numeric, disabled delivery intervention for closed household task (#479) Co-authored-by: rachana-egov * fixed pagination refresh issue * resolved the comments * HCMPRE-162:: Reload issue fix for closed household and not registered * HCMPRE-165: issues fixes * updated reasons for refusals --------- Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov * Updated publock * Added a check to avoid multiple leftJoin for projectBeneficiary - fix for multiple left join error * created new table for localization TODO: separate packages localization delegates to individual package and move the localization model to data_model package for common usage Delete localization related isar files once tested * init Boundary code wise localization.dart * create localization local repo modified module separation from query to exclude and include specified module * modified module exclude in boundary page * modified localization call for boundary selection bug where first value is localized in dropdown * removed un-required localization bloc calls * updated index value to selected language on home * Uploaded pre release for inventory-management and digit-dss * Updated delivery enums for Not delivered status * Updated status model in task to taskStatus * Updated registration delivery package * Reverted Task Model status key change * Update pubspec with latest version of packages * Summary page Type of resource locale key updated * Resolved comments * Resolved comments and unused variables * Resolved comments and unused variables * Updated version * Updated individual_global_search.dart for search * added data segration * check to enable edit delivery * added project filter * Registration delivery- Attendance management fixes (#497) * Removed captured location dialog on attendance submit * Removed stpper if deliveries length is greater than 1 * Updated digit_components and digit_data_model packages in attendance management * Updated digit_components and digit_data_model packages in attendance management * Localization loader and dialog localization fix (#505) * added dialog till localization is not loaded * fixed localization not coming issue * added a util funtion to show language loading --------- Co-authored-by: rachana-egov * updated search added project id in beneficiary search removed commented code * User uuids filter fixes for attendees local search in an attendance register (#512) * User uuids filters fixes for attendees search in a register * Removed default dashboard card from home * Sync fix --------- Co-authored-by: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> * Added Task address mapping on refused delivery (#514) * replace and push homepage from boundary page sync dialog * updated register search query to exclude attendee and staff in limit query updated attendance and registration_delivery package * registration_delivery package update * * Added error toast for network failure (#525) * No result card added if no charts available * Updated end date for dss charts to 23:59 instead of 11:59 (#527) * task create fix - removed condition check of resources during create updated changelog of registration, closed, digit_data_model, inventory, registration_delivery --dry-run fixes * Updated stable packages for scanner, attendance and dss (#528) * updated packages to latest version digit_components version update * added fallback ui dialog when localization call fails. * added localization code * merge from dev * fix for isar transaction lock issue * moved boundary localization path to constants. Updated dialog in language_selection.dart page * isar lock fix * pulled changes from impel related to background service added missing audit details and client audit details for beneficiary_checklist.dart --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov Co-authored-by: naveen-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> * moved survey_form override to pubspec * resolved code rabbit comments (#549) * Updated change log and published digit_data_model * changed digit_data_model version * fixed mdms error * resolved comments * survey_form and checklist merged and conflicts resolved * deleted unwanted assets * deleted privacy module from main app --------- Co-authored-by: rachana-egov <137176770+rachana-egov@users.noreply.github.com> Co-authored-by: rachana-egov Co-authored-by: Ramkrishna-egov <85437265+Ramkrishna-egov@users.noreply.github.com> Co-authored-by: Naveen J <83631045+naveen-egov@users.noreply.github.com> Co-authored-by: Ramkrishna-egov Co-authored-by: Tanishi Goyal Co-authored-by: yashita-egov Co-authored-by: yash-egov Co-authored-by: Shashwat12-egov Co-authored-by: naveen-egov --- .fvmrc | 3 + .gitignore | 5 +- README.md | 2 +- .../.gitignore | 4 + .../lib/app.dart | 1 + .../app_initialization.dart | 1 + .../app_localizations_delegate.dart | 1 - .../lib/blocs/project/project.dart | 5 + .../no_sql/schema/entity_mapper.dart | 3 + .../lib/data/network_manager.dart | 2 +- .../repositories/remote/bandwidth_check.dart | 2 +- .../lib/data/repositories/remote/mdms.dart | 4 +- .../data/repositories/sync/remote_type.dart | 1 - .../lib/data/repositories/sync/sync_up.dart | 4 + .../lib/main.dart | 1 - .../lib/pages/authenticated.dart | 1 + .../lib/pages/checklist/checklist.dart | 178 --- .../lib/pages/home.dart | 68 +- .../lib/pages/project_facility_selection.dart | 6 +- .../lib/router/app_router.dart | 69 +- .../lib/router/app_router.gr.dart | 772 +----------- .../lib/utils/constants.dart | 24 +- .../lib/utils/extensions/context_utility.dart | 2 + .../lib/utils/extensions/extensions.dart | 3 + .../lib/utils/i18_key_constants.dart | 66 +- .../lib/utils/localization_delegates.dart | 14 + .../lib/utils/typedefs.dart | 7 - .../lib/utils/utils.dart | 7 + .../network_manager_provider_wrapper.dart | 37 +- .../showcase/config/checklist_data.dart | 23 - .../showcase/config/checklist_list.dart | 16 - .../showcase/config/home_showcase.dart | 6 +- .../showcase/config/select_checklist.dart | 18 - .../showcase/config/select_survey_form.dart | 18 + .../showcase/config/showcase_constants.dart | 12 +- .../showcase/config/survey_form_data.dart | 24 + .../showcase/config/survey_form_list.dart | 16 + .../lib/widgets/showcase/showcase_button.dart | 13 +- .../pubspec.lock | 35 +- .../pubspec.yaml | 6 +- packages/attendance_management/pubspec.lock | 26 +- packages/complaints/.gitignore | 29 + packages/complaints/.metadata | 10 + packages/complaints/CHANGELOG.md | 6 + packages/complaints/LICENSE | 21 + packages/complaints/README.md | 50 + packages/complaints/analysis_options.yaml | 4 + .../complaints/assets/icons/svg/no_result.svg | 112 ++ packages/complaints/example/.gitignore | 43 + packages/complaints/example/.metadata | 45 + packages/complaints/example/README.md | 16 + .../complaints/example/analysis_options.yaml | 28 + .../complaints/example/android/.gitignore | 13 + .../example/android/app/build.gradle | 67 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 33 + .../com/example/example/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2434 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1387 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3670 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6517 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9725 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../complaints/example/android/build.gradle | 30 + .../example/android/settings.gradle | 29 + packages/complaints/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 614 ++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 125073 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 488 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1132 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1898 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 736 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1699 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 3084 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1132 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 2851 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 5044 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 1448 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 3816 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1787 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 4513 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 5044 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 8815 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 2434 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 6517 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 2668 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 7053 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 7985 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../complaints/example/ios/Runner/Info.plist | 49 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/ios/RunnerTests/RunnerTests.swift | 12 + .../example/lib/localization_strings.json | 68 ++ packages/complaints/example/lib/main.dart | 123 ++ packages/complaints/example/pubspec.lock | 1073 +++++++++++++++++ packages/complaints/example/pubspec.yaml | 100 ++ .../complaints_inbox/complaints_inbox.dart | 58 +- .../complaints_inbox.freezed.dart | 0 .../complaints_registration.dart | 26 +- .../complaints_registration.freezed.dart | 0 .../blocs/localization/app_localization.dart | 51 + .../complaints_localization_delegate.dart | 34 + packages/complaints/lib/complaints.dart | 29 + packages/complaints/lib/complaints.init.dart | 28 + .../data/repositories/local/pgr_service.dart | 5 +- .../lib/data/repositories/oplog/oplog.dart | 96 ++ .../data/repositories/remote/pgr_service.dart | 4 + .../complaints/lib/models}/complaints.dart | 0 .../lib/models}/complaints.freezed.dart | 0 .../complaints/lib/models}/complaints.g.dart | 0 .../entities/additional_fields_type.dart | 10 + .../additional_fields_type.mapper.dart | 53 + .../lib/models/entities/complaint_types.dart | 5 + .../lib/models}/pgr_address.dart | 2 - .../lib/models}/pgr_address.mapper.dart | 0 .../lib/models}/pgr_complaints.dart | 16 +- .../lib/models}/pgr_complaints.mapper.dart | 61 - .../lib/models}/pgr_complaints_response.dart | 2 + .../pgr_complaints_response.mapper.dart | 0 .../lib/pages/complaints_acknowledgement.dart | 9 +- .../pages}/inbox/complaints_details_view.dart | 15 +- .../lib/pages}/inbox/complaints_inbox.dart | 101 +- .../pages}/inbox/complaints_inbox_filter.dart | 38 +- .../pages}/inbox/complaints_inbox_search.dart | 18 +- .../pages}/inbox/complaints_inbox_sort.dart | 14 +- .../inbox/complaints_inbox_wrapper.dart | 16 +- .../pages}/registration/complaint_type.dart | 116 +- .../registration/complaints_details.dart | 136 ++- .../registration/complaints_location.dart | 34 +- .../complaints_registration_wrapper.dart | 24 +- .../lib/router/complaints_router.dart | 71 ++ .../lib/router/complaints_router.gm.dart | 551 +++++++++ packages/complaints/lib/utils/constants.dart | 3 + .../lib/utils/extensions/context_utility.dart | 22 + .../lib/utils/extensions/extensions.dart | 24 + .../lib/utils/i18_key_constants.dart | 450 +++++++ packages/complaints/lib/utils/typedefs.dart | 6 + packages/complaints/lib/utils/utils.dart | 105 ++ .../widgets/boundary_selection_wrapper.dart | 37 + .../header/back_navigation_help_header.dart | 80 ++ .../complaints/lib/widgets/localized.dart | 34 + .../no_result_card/no_result_card.dart | 40 + packages/complaints/pubspec.yaml | 85 ++ .../test/complaints_inbox_bloc_test.dart | 55 + .../complaints_registration_bloc_test.dart | 122 ++ .../test/constants/test_constants.dart | 41 + .../lib/widgets/atoms/selection_card.dart | 4 + packages/digit_components/pubspec.lock | 60 +- packages/digit_data_model/CHANGELOG.md | 18 + .../data/local_store/sql_store/sql_store.dart | 2 +- .../sql_store/tables/pgr_service.dart | 2 +- .../lib/data/oplog/oplog.dart | 142 --- .../local/base/service_attributes_base.dart | 12 - .../repositories/local/base/service_base.dart | 12 - .../local/base/service_definition_base.dart | 13 - packages/digit_data_model/lib/data_model.dart | 18 - .../digit_data_model/lib/data_model.init.dart | 131 +- .../entities/pgr_application_status.dart | 17 + .../pgr_application_status.mapper.dart | 68 ++ .../digit_data_model/lib/utils/typedefs.dart | 6 - packages/digit_data_model/pubspec.lock | 8 +- packages/digit_data_model/pubspec.yaml | 2 +- packages/digit_firebase_services/pubspec.lock | 56 +- packages/forms_engine/pubspec.lock | 60 +- packages/referral_reconciliation/CHANGELOG.md | 4 + .../referral_recon_service_definition.dart | 1 + .../create_hf_referral_wrapper.dart | 1 + .../reason_checklist_preview.dart | 1 + .../record_reason_checklist.dart | 11 +- .../record_referral_details.dart | 1 + .../search_referral_reconciliations.dart | 1 + .../lib/utils/typedefs.dart | 1 + packages/referral_reconciliation/pubspec.lock | 38 +- packages/referral_reconciliation/pubspec.yaml | 3 +- ...eferral_recon_service_definition_test.dart | 3 +- .../test/constants/test_constants.dart | 1 + packages/registration_delivery/CHANGELOG.md | 4 + .../beneficiary/beneficiary_checklist.dart | 9 +- .../beneficiary/beneficiary_wrapper.dart | 1 + .../pages/beneficiary/household_overview.dart | 1 + .../individual_details.dart | 1 - packages/registration_delivery/pubspec.lock | 27 +- packages/registration_delivery/pubspec.yaml | 3 +- packages/survey_form/.gitignore | 29 + packages/survey_form/.metadata | 10 + packages/survey_form/CHANGELOG.md | 4 + packages/survey_form/LICENSE | 21 + packages/survey_form/README.md | 52 + packages/survey_form/analysis_options.yaml | 4 + packages/survey_form/example/.gitignore | 43 + packages/survey_form/example/.metadata | 45 + packages/survey_form/example/README.md | 16 + .../survey_form/example/analysis_options.yaml | 28 + .../survey_form/example/android/.gitignore | 13 + .../example/android/app/build.gradle | 67 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 33 + .../com/example/example/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2434 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1387 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3670 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6517 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9725 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../survey_form/example/android/build.gradle | 30 + .../example/android/settings.gradle | 29 + packages/survey_form/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 614 ++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 125073 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 488 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1132 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1898 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 736 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1699 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 3084 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1132 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 2851 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 5044 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 1448 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 3816 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1787 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 4513 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 5044 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 8815 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 2434 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 6517 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 2668 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 7053 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 7985 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../survey_form/example/ios/Runner/Info.plist | 49 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/ios/RunnerTests/RunnerTests.swift | 12 + packages/survey_form/example/lib/data.json | 20 + .../example/lib/localizedString.dart | 34 + packages/survey_form/example/lib/main.dart | 106 ++ packages/survey_form/example/pubspec.lock | 1067 ++++++++++++++++ packages/survey_form/example/pubspec.yaml | 96 ++ .../lib/blocs/app_localization.dart | 51 + .../lib/blocs}/service.dart | 58 +- .../lib/blocs}/service.freezed.dart | 333 ++--- .../lib/blocs}/service_definition.dart | 31 +- .../blocs}/service_definition.freezed.dart | 0 .../survey_form_localization_delegate.dart | 34 + .../lib/data/repositories/local/service.dart | 73 +- .../local/service_definition.dart | 56 +- .../lib/data/repositories/oplog/oplog.dart | 58 + .../lib/data/repositories/remote/service.dart | 8 +- .../remote/service_attributes.dart | 8 +- .../remote/service_definition.dart | 8 +- .../lib/models/entities/service.dart | 12 +- .../lib/models/entities/service.mapper.dart | 0 .../models/entities/service_attributes.dart | 12 +- .../entities/service_attributes.mapper.dart | 0 .../models/entities/service_definition.dart | 4 +- .../entities/service_definition.mapper.dart | 0 .../lib/pages/acknowledgement.dart | 76 ++ .../survey_form/lib/pages/survey_form.dart | 143 +++ .../lib/pages/survey_form_boundary_view.dart | 37 +- .../lib/pages/survey_form_preview.dart | 38 +- .../lib/pages/survey_form_view.dart | 156 +-- .../lib/pages/survey_form_wrapper.dart | 24 +- .../lib/router/survey_form_router.dart | 29 + .../lib/router/survey_form_router.gm.dart | 354 ++++++ packages/survey_form/lib/survey_form.dart | 24 + .../survey_form/lib/survey_form.init.dart | 20 + packages/survey_form/lib/utils/constants.dart | 10 + .../lib/utils/extensions/context_utility.dart | 25 + .../lib/utils/i18_key_constants.dart | 245 ++++ packages/survey_form/lib/utils/typedefs.dart | 7 + packages/survey_form/lib/utils/utils.dart | 65 + .../survey_form/lib/widgets/action_card.dart | 57 + .../widgets/back_navigation_help_header.dart | 79 ++ .../survey_form/lib/widgets/localized.dart | 35 + .../lib/widgets/no_result_card.dart | 40 + packages/survey_form/pubspec.yaml | 79 ++ .../test/constants/test_constants.dart | 86 ++ .../test/unit/localization_methods_test.dart | 57 + .../test/unit/service_bloc_test.dart | 82 ++ .../unit/service_definition_bloc_test.dart | 54 + pubspec.lock | 16 +- pubspec.yaml | 2 + tools/complaints_package.dart | 889 ++++++++++++++ tools/survey_form_package_imports.dart | 1054 ++++++++++++++++ 328 files changed, 13184 insertions(+), 2344 deletions(-) create mode 100644 .fvmrc delete mode 100644 apps/health_campaign_field_worker_app/lib/pages/checklist/checklist.dart delete mode 100644 apps/health_campaign_field_worker_app/lib/widgets/showcase/config/checklist_data.dart delete mode 100644 apps/health_campaign_field_worker_app/lib/widgets/showcase/config/checklist_list.dart delete mode 100644 apps/health_campaign_field_worker_app/lib/widgets/showcase/config/select_checklist.dart create mode 100644 apps/health_campaign_field_worker_app/lib/widgets/showcase/config/select_survey_form.dart create mode 100644 apps/health_campaign_field_worker_app/lib/widgets/showcase/config/survey_form_data.dart create mode 100644 apps/health_campaign_field_worker_app/lib/widgets/showcase/config/survey_form_list.dart create mode 100644 packages/complaints/.gitignore create mode 100644 packages/complaints/.metadata create mode 100644 packages/complaints/CHANGELOG.md create mode 100644 packages/complaints/LICENSE create mode 100644 packages/complaints/README.md create mode 100644 packages/complaints/analysis_options.yaml create mode 100644 packages/complaints/assets/icons/svg/no_result.svg create mode 100644 packages/complaints/example/.gitignore create mode 100644 packages/complaints/example/.metadata create mode 100644 packages/complaints/example/README.md create mode 100644 packages/complaints/example/analysis_options.yaml create mode 100644 packages/complaints/example/android/.gitignore create mode 100644 packages/complaints/example/android/app/build.gradle create mode 100644 packages/complaints/example/android/app/src/debug/AndroidManifest.xml create mode 100644 packages/complaints/example/android/app/src/main/AndroidManifest.xml create mode 100644 packages/complaints/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 packages/complaints/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 packages/complaints/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 packages/complaints/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 packages/complaints/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 packages/complaints/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/complaints/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/complaints/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/complaints/example/android/app/src/main/res/values-night/styles.xml create mode 100644 packages/complaints/example/android/app/src/main/res/values/styles.xml create mode 100644 packages/complaints/example/android/app/src/profile/AndroidManifest.xml create mode 100644 packages/complaints/example/android/build.gradle create mode 100644 packages/complaints/example/android/settings.gradle create mode 100644 packages/complaints/example/ios/.gitignore create mode 100644 packages/complaints/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/complaints/example/ios/Flutter/Debug.xcconfig create mode 100644 packages/complaints/example/ios/Flutter/Release.xcconfig create mode 100644 packages/complaints/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/complaints/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/complaints/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/complaints/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/complaints/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/complaints/example/ios/Runner/AppDelegate.swift create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/complaints/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/complaints/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/complaints/example/ios/Runner/Info.plist create mode 100644 packages/complaints/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 packages/complaints/example/ios/RunnerTests/RunnerTests.swift create mode 100644 packages/complaints/example/lib/localization_strings.json create mode 100644 packages/complaints/example/lib/main.dart create mode 100644 packages/complaints/example/pubspec.lock create mode 100644 packages/complaints/example/pubspec.yaml rename {apps/health_campaign_field_worker_app => packages/complaints}/lib/blocs/complaints_inbox/complaints_inbox.dart (83%) rename {apps/health_campaign_field_worker_app => packages/complaints}/lib/blocs/complaints_inbox/complaints_inbox.freezed.dart (100%) rename {apps/health_campaign_field_worker_app => packages/complaints}/lib/blocs/complaints_registration/complaints_registration.dart (91%) rename {apps/health_campaign_field_worker_app => packages/complaints}/lib/blocs/complaints_registration/complaints_registration.freezed.dart (100%) create mode 100644 packages/complaints/lib/blocs/localization/app_localization.dart create mode 100644 packages/complaints/lib/blocs/localization/complaints_localization_delegate.dart create mode 100644 packages/complaints/lib/complaints.dart create mode 100644 packages/complaints/lib/complaints.init.dart rename packages/{digit_data_model => complaints}/lib/data/repositories/local/pgr_service.dart (98%) create mode 100644 packages/complaints/lib/data/repositories/oplog/oplog.dart rename packages/{digit_data_model => complaints}/lib/data/repositories/remote/pgr_service.dart (94%) rename {apps/health_campaign_field_worker_app/lib/models/complaints => packages/complaints/lib/models}/complaints.dart (100%) rename {apps/health_campaign_field_worker_app/lib/models/complaints => packages/complaints/lib/models}/complaints.freezed.dart (100%) rename {apps/health_campaign_field_worker_app/lib/models/complaints => packages/complaints/lib/models}/complaints.g.dart (100%) create mode 100644 packages/complaints/lib/models/entities/additional_fields_type.dart create mode 100644 packages/complaints/lib/models/entities/additional_fields_type.mapper.dart create mode 100644 packages/complaints/lib/models/entities/complaint_types.dart rename packages/{digit_data_model/lib/models/pgr_complaints => complaints/lib/models}/pgr_address.dart (99%) rename packages/{digit_data_model/lib/models/pgr_complaints => complaints/lib/models}/pgr_address.mapper.dart (100%) rename packages/{digit_data_model/lib/models/pgr_complaints => complaints/lib/models}/pgr_complaints.dart (96%) rename packages/{digit_data_model/lib/models/pgr_complaints => complaints/lib/models}/pgr_complaints.mapper.dart (97%) rename packages/{digit_data_model/lib/models/pgr_complaints => complaints/lib/models}/pgr_complaints_response.dart (94%) rename packages/{digit_data_model/lib/models/pgr_complaints => complaints/lib/models}/pgr_complaints_response.mapper.dart (100%) rename {apps/health_campaign_field_worker_app => packages/complaints}/lib/pages/complaints_acknowledgement.dart (89%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/inbox/complaints_details_view.dart (96%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/inbox/complaints_inbox.dart (80%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/inbox/complaints_inbox_filter.dart (93%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/inbox/complaints_inbox_search.dart (94%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/inbox/complaints_inbox_sort.dart (95%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/inbox/complaints_inbox_wrapper.dart (58%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/registration/complaint_type.dart (67%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/registration/complaints_details.dart (86%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/registration/complaints_location.dart (95%) rename {apps/health_campaign_field_worker_app/lib/pages/complaints => packages/complaints/lib/pages}/registration/complaints_registration_wrapper.dart (85%) create mode 100644 packages/complaints/lib/router/complaints_router.dart create mode 100644 packages/complaints/lib/router/complaints_router.gm.dart create mode 100644 packages/complaints/lib/utils/constants.dart create mode 100644 packages/complaints/lib/utils/extensions/context_utility.dart create mode 100644 packages/complaints/lib/utils/extensions/extensions.dart create mode 100644 packages/complaints/lib/utils/i18_key_constants.dart create mode 100644 packages/complaints/lib/utils/typedefs.dart create mode 100644 packages/complaints/lib/utils/utils.dart create mode 100644 packages/complaints/lib/widgets/boundary_selection_wrapper.dart create mode 100644 packages/complaints/lib/widgets/header/back_navigation_help_header.dart create mode 100644 packages/complaints/lib/widgets/localized.dart create mode 100644 packages/complaints/lib/widgets/no_result_card/no_result_card.dart create mode 100644 packages/complaints/pubspec.yaml create mode 100644 packages/complaints/test/complaints_inbox_bloc_test.dart create mode 100644 packages/complaints/test/complaints_registration_bloc_test.dart create mode 100644 packages/complaints/test/constants/test_constants.dart delete mode 100644 packages/digit_data_model/lib/data/repositories/local/base/service_attributes_base.dart delete mode 100644 packages/digit_data_model/lib/data/repositories/local/base/service_base.dart delete mode 100644 packages/digit_data_model/lib/data/repositories/local/base/service_definition_base.dart create mode 100644 packages/digit_data_model/lib/models/entities/pgr_application_status.dart create mode 100644 packages/digit_data_model/lib/models/entities/pgr_application_status.mapper.dart create mode 100644 packages/survey_form/.gitignore create mode 100644 packages/survey_form/.metadata create mode 100644 packages/survey_form/CHANGELOG.md create mode 100644 packages/survey_form/LICENSE create mode 100644 packages/survey_form/README.md create mode 100644 packages/survey_form/analysis_options.yaml create mode 100644 packages/survey_form/example/.gitignore create mode 100644 packages/survey_form/example/.metadata create mode 100644 packages/survey_form/example/README.md create mode 100644 packages/survey_form/example/analysis_options.yaml create mode 100644 packages/survey_form/example/android/.gitignore create mode 100644 packages/survey_form/example/android/app/build.gradle create mode 100644 packages/survey_form/example/android/app/src/debug/AndroidManifest.xml create mode 100644 packages/survey_form/example/android/app/src/main/AndroidManifest.xml create mode 100644 packages/survey_form/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 packages/survey_form/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 packages/survey_form/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 packages/survey_form/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 packages/survey_form/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 packages/survey_form/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/survey_form/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/survey_form/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/survey_form/example/android/app/src/main/res/values-night/styles.xml create mode 100644 packages/survey_form/example/android/app/src/main/res/values/styles.xml create mode 100644 packages/survey_form/example/android/app/src/profile/AndroidManifest.xml create mode 100644 packages/survey_form/example/android/build.gradle create mode 100644 packages/survey_form/example/android/settings.gradle create mode 100644 packages/survey_form/example/ios/.gitignore create mode 100644 packages/survey_form/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/survey_form/example/ios/Flutter/Debug.xcconfig create mode 100644 packages/survey_form/example/ios/Flutter/Release.xcconfig create mode 100644 packages/survey_form/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/survey_form/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/survey_form/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/survey_form/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/survey_form/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/survey_form/example/ios/Runner/AppDelegate.swift create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/survey_form/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/survey_form/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/survey_form/example/ios/Runner/Info.plist create mode 100644 packages/survey_form/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 packages/survey_form/example/ios/RunnerTests/RunnerTests.swift create mode 100644 packages/survey_form/example/lib/data.json create mode 100644 packages/survey_form/example/lib/localizedString.dart create mode 100644 packages/survey_form/example/lib/main.dart create mode 100644 packages/survey_form/example/pubspec.lock create mode 100644 packages/survey_form/example/pubspec.yaml create mode 100644 packages/survey_form/lib/blocs/app_localization.dart rename packages/{digit_data_model/lib/blocs/service => survey_form/lib/blocs}/service.dart (70%) rename packages/{digit_data_model/lib/blocs/service => survey_form/lib/blocs}/service.freezed.dart (86%) rename packages/{digit_data_model/lib/blocs/service_definition => survey_form/lib/blocs}/service_definition.dart (73%) rename packages/{digit_data_model/lib/blocs/service_definition => survey_form/lib/blocs}/service_definition.freezed.dart (100%) create mode 100644 packages/survey_form/lib/blocs/survey_form_localization_delegate.dart rename packages/{digit_data_model => survey_form}/lib/data/repositories/local/service.dart (75%) rename packages/{digit_data_model => survey_form}/lib/data/repositories/local/service_definition.dart (75%) create mode 100644 packages/survey_form/lib/data/repositories/oplog/oplog.dart rename packages/{digit_data_model => survey_form}/lib/data/repositories/remote/service.dart (76%) rename packages/{digit_data_model => survey_form}/lib/data/repositories/remote/service_attributes.dart (78%) rename packages/{digit_data_model => survey_form}/lib/data/repositories/remote/service_definition.dart (78%) rename packages/{digit_data_model => survey_form}/lib/models/entities/service.dart (94%) rename packages/{digit_data_model => survey_form}/lib/models/entities/service.mapper.dart (100%) rename packages/{digit_data_model => survey_form}/lib/models/entities/service_attributes.dart (95%) rename packages/{digit_data_model => survey_form}/lib/models/entities/service_attributes.mapper.dart (100%) rename packages/{digit_data_model => survey_form}/lib/models/entities/service_definition.dart (97%) rename packages/{digit_data_model => survey_form}/lib/models/entities/service_definition.mapper.dart (100%) create mode 100644 packages/survey_form/lib/pages/acknowledgement.dart create mode 100644 packages/survey_form/lib/pages/survey_form.dart rename apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_boundary_view.dart => packages/survey_form/lib/pages/survey_form_boundary_view.dart (62%) rename apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_preview.dart => packages/survey_form/lib/pages/survey_form_preview.dart (93%) rename apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_view.dart => packages/survey_form/lib/pages/survey_form_view.dart (89%) rename apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_wrapper.dart => packages/survey_form/lib/pages/survey_form_wrapper.dart (67%) create mode 100644 packages/survey_form/lib/router/survey_form_router.dart create mode 100644 packages/survey_form/lib/router/survey_form_router.gm.dart create mode 100644 packages/survey_form/lib/survey_form.dart create mode 100644 packages/survey_form/lib/survey_form.init.dart create mode 100644 packages/survey_form/lib/utils/constants.dart create mode 100644 packages/survey_form/lib/utils/extensions/context_utility.dart create mode 100644 packages/survey_form/lib/utils/i18_key_constants.dart create mode 100644 packages/survey_form/lib/utils/typedefs.dart create mode 100644 packages/survey_form/lib/utils/utils.dart create mode 100644 packages/survey_form/lib/widgets/action_card.dart create mode 100644 packages/survey_form/lib/widgets/back_navigation_help_header.dart create mode 100644 packages/survey_form/lib/widgets/localized.dart create mode 100644 packages/survey_form/lib/widgets/no_result_card.dart create mode 100644 packages/survey_form/pubspec.yaml create mode 100644 packages/survey_form/test/constants/test_constants.dart create mode 100644 packages/survey_form/test/unit/localization_methods_test.dart create mode 100644 packages/survey_form/test/unit/service_bloc_test.dart create mode 100644 packages/survey_form/test/unit/service_definition_bloc_test.dart create mode 100644 tools/complaints_package.dart create mode 100644 tools/survey_form_package_imports.dart diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 000000000..22e8233d7 --- /dev/null +++ b/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.16.5" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9793aec7d..21577b489 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,6 @@ migrate_working_dir/ *.iws .idea/ - # The .vscode folder contains launch configuration and tasks you configure in # VS Code which you may wish to be included in version control, so this line # is commented out by default. @@ -57,3 +56,7 @@ pubspec_overrides.yaml apps/health_campaign_field_worker_app/.env apps/health_campaign_field_worker_app/libisar.dylib *.properties + +# FVM Version Cache +.fvm/ +.fvmrc \ No newline at end of file diff --git a/README.md b/README.md index b1562afae..99b8c1f4c 100644 --- a/README.md +++ b/README.md @@ -566,7 +566,7 @@ class _ChecklistDataShowcaseData { import '../../../utils/i18_key_constants.dart' as i18; import '../showcase_wrappers.dart'; -part 'checklist_data.dart'; +part 'survey_form_data.dart'; final checklistDataShowcaseData = _ChecklistDataShowcaseData(); ``` diff --git a/apps/health_campaign_field_worker_app/.gitignore b/apps/health_campaign_field_worker_app/.gitignore index ac43765ff..ce6d32b71 100644 --- a/apps/health_campaign_field_worker_app/.gitignore +++ b/apps/health_campaign_field_worker_app/.gitignore @@ -44,3 +44,7 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release + +# FVM Version Cache +.fvm/ +.fvmrc \ No newline at end of file diff --git a/apps/health_campaign_field_worker_app/lib/app.dart b/apps/health_campaign_field_worker_app/lib/app.dart index f65c5feb8..531d0295c 100644 --- a/apps/health_campaign_field_worker_app/lib/app.dart +++ b/apps/health_campaign_field_worker_app/lib/app.dart @@ -1,4 +1,5 @@ import 'package:attendance_management/attendance_management.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:closed_household/blocs/closed_household.dart'; import 'package:closed_household/closed_household.dart'; import 'package:digit_components/digit_components.dart'; diff --git a/apps/health_campaign_field_worker_app/lib/blocs/app_initialization/app_initialization.dart b/apps/health_campaign_field_worker_app/lib/blocs/app_initialization/app_initialization.dart index 4530ae776..938819889 100644 --- a/apps/health_campaign_field_worker_app/lib/blocs/app_initialization/app_initialization.dart +++ b/apps/health_campaign_field_worker_app/lib/blocs/app_initialization/app_initialization.dart @@ -313,6 +313,7 @@ class MdmsConfig { final List serviceRegistryList; final DashboardConfigSchema? dashboardConfigSchema; + const MdmsConfig( {required this.appConfigs, required this.serviceRegistryList, diff --git a/apps/health_campaign_field_worker_app/lib/blocs/localization/app_localizations_delegate.dart b/apps/health_campaign_field_worker_app/lib/blocs/localization/app_localizations_delegate.dart index 7eaf5b020..9d8b05f12 100644 --- a/apps/health_campaign_field_worker_app/lib/blocs/localization/app_localizations_delegate.dart +++ b/apps/health_campaign_field_worker_app/lib/blocs/localization/app_localizations_delegate.dart @@ -1,7 +1,6 @@ import 'package:collection/collection.dart'; import 'package:digit_data_model/data/local_store/sql_store/sql_store.dart'; import 'package:flutter/material.dart'; -import 'package:isar/isar.dart'; import '../../data/local_store/no_sql/schema/app_configuration.dart'; import 'app_localization.dart'; diff --git a/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart b/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart index e99faea17..3be8eec58 100644 --- a/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart +++ b/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'dart:core'; import 'package:attendance_management/attendance_management.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_data_model/data_model.dart'; @@ -80,6 +81,7 @@ class ProjectBloc extends Bloc { final RemoteRepository stockRemoteRepository; final LocalRepository stockLocalRepository; + /// Service Definition Repositories final RemoteRepository serviceDefinitionRemoteRepository; final LocalRepository @@ -294,6 +296,9 @@ class ProjectBloc extends Bloc { } if (projects.isNotEmpty) { + + // INFO : Need to add project load functions + try { await _loadProjectFacilities(projects, batchSize); } catch (_) { diff --git a/apps/health_campaign_field_worker_app/lib/data/local_store/no_sql/schema/entity_mapper.dart b/apps/health_campaign_field_worker_app/lib/data/local_store/no_sql/schema/entity_mapper.dart index d44596109..60d256cc6 100644 --- a/apps/health_campaign_field_worker_app/lib/data/local_store/no_sql/schema/entity_mapper.dart +++ b/apps/health_campaign_field_worker_app/lib/data/local_store/no_sql/schema/entity_mapper.dart @@ -1,4 +1,7 @@ +import 'package:complaints/complaints.dart'; + import 'package:attendance_management/models/entities/attendance_log.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:digit_data_model/data/local_store/no_sql/schema/entity_mapper_listener.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:inventory_management/models/entities/stock.dart'; diff --git a/apps/health_campaign_field_worker_app/lib/data/network_manager.dart b/apps/health_campaign_field_worker_app/lib/data/network_manager.dart index 54188873b..616e5a8c9 100644 --- a/apps/health_campaign_field_worker_app/lib/data/network_manager.dart +++ b/apps/health_campaign_field_worker_app/lib/data/network_manager.dart @@ -105,7 +105,7 @@ class NetworkManager { return isSyncCompleted; } - // + FutureOr writeToEntityDB( Map response, List localRepositories, diff --git a/apps/health_campaign_field_worker_app/lib/data/repositories/remote/bandwidth_check.dart b/apps/health_campaign_field_worker_app/lib/data/repositories/remote/bandwidth_check.dart index e4cc73938..ece1e04f5 100644 --- a/apps/health_campaign_field_worker_app/lib/data/repositories/remote/bandwidth_check.dart +++ b/apps/health_campaign_field_worker_app/lib/data/repositories/remote/bandwidth_check.dart @@ -27,7 +27,7 @@ class BandwidthCheckRepository { final speed = (((800 / timeconsumed) / 1000)); return speed; - } on DioError catch (e) { + } on DioException catch (e) { rethrow; } } diff --git a/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart b/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart index 748d821d1..35136b342 100644 --- a/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart +++ b/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart @@ -257,11 +257,11 @@ class MdmsRepository { final List? checklistTypes = element?.checklistTypes.map((e) { - final checklist = ChecklistTypes() + final surveyForm = ChecklistTypes() ..name = e.name ..code = e.code; - return checklist; + return surveyForm; }).toList(); final List? transportTypes = diff --git a/apps/health_campaign_field_worker_app/lib/data/repositories/sync/remote_type.dart b/apps/health_campaign_field_worker_app/lib/data/repositories/sync/remote_type.dart index c1217f919..e597bb00a 100644 --- a/apps/health_campaign_field_worker_app/lib/data/repositories/sync/remote_type.dart +++ b/apps/health_campaign_field_worker_app/lib/data/repositories/sync/remote_type.dart @@ -1,7 +1,6 @@ import 'package:collection/collection.dart'; import 'package:digit_data_model/data_model.dart'; - class RepositoryType { static RemoteRepository getRemoteForType( DataModelType type, diff --git a/apps/health_campaign_field_worker_app/lib/data/repositories/sync/sync_up.dart b/apps/health_campaign_field_worker_app/lib/data/repositories/sync/sync_up.dart index fdf1ab1dd..2a730ad7c 100644 --- a/apps/health_campaign_field_worker_app/lib/data/repositories/sync/sync_up.dart +++ b/apps/health_campaign_field_worker_app/lib/data/repositories/sync/sync_up.dart @@ -1,3 +1,5 @@ +import 'package:complaints/complaints.dart'; + import 'dart:async'; import 'package:collection/collection.dart'; @@ -213,6 +215,7 @@ class PerformSyncUp { final entities = getEntityModel(sublist, local); if (operationGroupedEntity.key == DataOperation.create) { switch (typeGroupedEntity.key) { + case DataModelType.complaints: for (final entity in entities) { if (remote is PgrServiceRemoteRepository && @@ -284,6 +287,7 @@ class PerformSyncUp { } } break; + default: await remote.bulkCreate(entities); } diff --git a/apps/health_campaign_field_worker_app/lib/main.dart b/apps/health_campaign_field_worker_app/lib/main.dart index f46e21059..5fe3d6b17 100644 --- a/apps/health_campaign_field_worker_app/lib/main.dart +++ b/apps/health_campaign_field_worker_app/lib/main.dart @@ -1,4 +1,3 @@ -import 'package:collection/collection.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_data_model/data/local_store/sql_store/sql_store.dart'; import 'package:dio/dio.dart'; diff --git a/apps/health_campaign_field_worker_app/lib/pages/authenticated.dart b/apps/health_campaign_field_worker_app/lib/pages/authenticated.dart index 1f7baf504..e31240d2e 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/authenticated.dart +++ b/apps/health_campaign_field_worker_app/lib/pages/authenticated.dart @@ -9,6 +9,7 @@ import 'package:flutter_portal/flutter_portal.dart'; import 'package:isar/isar.dart'; import 'package:location/location.dart'; import 'package:registration_delivery/registration_delivery.dart'; +import 'package:survey_form/survey_form.dart'; import '../blocs/localization/app_localization.dart'; import '../blocs/projects_beneficiary_downsync/project_beneficiaries_downsync.dart'; diff --git a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist.dart b/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist.dart deleted file mode 100644 index b4f053759..000000000 --- a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist.dart +++ /dev/null @@ -1,178 +0,0 @@ -import 'package:digit_components/digit_components.dart'; -import 'package:digit_components/widgets/digit_project_cell.dart'; -import 'package:digit_data_model/data_model.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../utils/constants.dart'; -import 'package:recase/recase.dart'; - -import '../../blocs/auth/auth.dart'; -import '../../router/app_router.dart'; -import '../../utils/extensions/extensions.dart'; -import '../../utils/i18_key_constants.dart' as i18; -import '../../widgets/action_card/action_card.dart'; -import '../../widgets/header/back_navigation_help_header.dart'; -import '../../widgets/localized.dart'; -import '../../widgets/no_result_card/no_result_card.dart'; - -@RoutePage() -class ChecklistPage extends LocalizedStatefulWidget { - const ChecklistPage({ - Key? key, - super.appLocalizations, - }) : super(key: key); - - @override - State createState() => _ChecklistPageState(); -} - -class _ChecklistPageState extends LocalizedState { - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - - return Scaffold( - body: ScrollableContent( - header: const Column(children: [ - BackNavigationHelpHeaderWidget(), - ]), - children: [ - BlocBuilder( - builder: (context, state) { - return state.map( - empty: (value) => const Text('No Checklist'), - isloading: (value) => const Center( - child: CircularProgressIndicator(), - ), - serviceDefinitionFetch: - (ServiceDefinitionServiceFetchedState value) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8), - child: Align( - alignment: Alignment.centerLeft, - child: Padding( - padding: const EdgeInsets.all( - kPadding, - ), - child: Text( - localizations - .translate(i18.checklist.checklistlabel), - style: theme.textTheme.displayMedium, - ), - ), - ), - ), - BlocBuilder( - builder: (context, authstate) { - return authstate.maybeMap( - orElse: () => const Offstage(), - authenticated: (res) { - List roles = res.userModel.roles - .map((e) => e.code.snakeCase.toUpperCase()) - .toList(); - final values = value.serviceDefinitionList.where( - (item) => - !roles - .indexOf( - item.code!.split('.').lastOrNull!, - ) - .isNegative && - !item.code!.contains(Constants - .healthFacilityChecklistPrefix) && - (item.code ?? '').contains( - context.selectedProject.name)); - - if (values.isEmpty) { - return Column( - children: [ - NoResultCard( - align: Alignment.center, - label: localizations.translate( - i18.common.noResultsFound, - ), - ), - ], - ); - } - - return Column( - children: values - .map((e) => DigitProjectCell( - projectText: localizations - .translate('${e.code}'), - onTap: () { - context - .read() - .add( - ServiceDefinitionSelectionEvent( - serviceDefinition: e, - ), - ); - DigitActionDialog.show( - context, - widget: ActionCard(items: [ - ActionCardModel( - icon: Icons.edit_calendar, - label: localizations.translate(i18 - .checklist - .checklistCreateActionLabel), - action: () { - context.router.push( - ChecklistBoundaryViewRoute(), - ); - Navigator.of( - context, - rootNavigator: true, - ).pop(); - }, - ), - ActionCardModel( - icon: Icons.visibility, - label: localizations.translate(i18 - .checklist - .checklistViewActionLabel), - action: () { - context - .read() - .add( - ServiceSearchEvent( - serviceSearchModel: - ServiceSearchModel( - id: e.id, - ), - ), - ); - context.router.push( - ChecklistPreviewRoute(), - ); - Navigator.of( - context, - rootNavigator: true, - ).pop(); - }, - ), - ]), - ); - }, - )) - .toList(), - ); - }, - ); - }, - ), - ], - ); - }, - ); - }, - ), - ], - ), - ); - } -} diff --git a/apps/health_campaign_field_worker_app/lib/pages/home.dart b/apps/health_campaign_field_worker_app/lib/pages/home.dart index 2e6ff96b8..a03062cae 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/home.dart +++ b/apps/health_campaign_field_worker_app/lib/pages/home.dart @@ -2,6 +2,9 @@ import 'dart:async'; import 'package:attendance_management/attendance_management.dart'; import 'package:attendance_management/router/attendance_router.gm.dart'; +import 'package:survey_form/survey_form.dart'; +import 'package:complaints/complaints.dart'; +import 'package:complaints/router/complaints_router.gm.dart'; import 'package:closed_household/closed_household.dart'; import 'package:closed_household/router/closed_household_router.gm.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; @@ -21,10 +24,12 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:health_campaign_field_worker_app/data/local_store/no_sql/schema/service_registry.dart'; import 'package:inventory_management/inventory_management.dart'; import 'package:inventory_management/router/inventory_router.gm.dart'; +import 'package:recase/recase.dart'; import 'package:referral_reconciliation/referral_reconciliation.dart'; import 'package:referral_reconciliation/router/referral_reconciliation_router.gm.dart'; import 'package:registration_delivery/registration_delivery.dart'; import 'package:registration_delivery/router/registration_delivery_router.gm.dart'; +import 'package:survey_form/router/survey_form_router.gm.dart'; import '../blocs/app_initialization/app_initialization.dart'; import '../blocs/auth/auth.dart'; @@ -189,7 +194,7 @@ class _HomePageState extends LocalizedState { state.maybeWhen( orElse: () => null, syncInProgress: () async { - await localSecureStore.setManualSyncTrigger(true); + await localSecureStore.setManualSyncTrigger(false); if (context.mounted) { DigitSyncDialog.show( context, @@ -323,6 +328,16 @@ class _HomePageState extends LocalizedState { final Map homeItemsMap = { // INFO : Need to add home items of package Here + i18.home.fileComplaint: + homeShowcaseData.distributorFileComplaint.buildWith( + child: HomeItemCard( + icon: Icons.announcement, + label: i18.home.fileComplaint, + onPressed: () => + context.router.push(const ComplaintsInboxWrapperRoute()), + ), + ), + i18.home.dashboard: homeShowcaseData.dashBoard.buildWith( child: HomeItemCard( icon: Icons.bar_chart_sharp, @@ -384,24 +399,16 @@ class _HomePageState extends LocalizedState { }, ), ), - i18.home.myCheckList: homeShowcaseData.supervisorMyChecklist.buildWith( + i18.home.mySurveyForm: homeShowcaseData.supervisorMySurveyForm.buildWith( child: HomeItemCard( enableCustomIcon: true, - customIcon: myChecklistSvg, + customIcon: mySurveyFormSvg, icon: Icons.checklist, - label: i18.home.myCheckList, - onPressed: () => context.router.push(ChecklistWrapperRoute()), - ), - ), - i18.home.fileComplaint: - homeShowcaseData.distributorFileComplaint.buildWith( - child: HomeItemCard( - icon: Icons.announcement, - label: i18.home.fileComplaint, - onPressed: () => - context.router.push(const ComplaintsInboxWrapperRoute()), + label: i18.home.mySurveyForm, + onPressed: () => context.router.push(SurveyFormWrapperRoute()), ), ), + i18.home.syncDataLabel: homeShowcaseData.distributorSyncData.buildWith( child: StreamBuilder?>( stream: FlutterBackgroundService().on('serviceRunning'), @@ -502,7 +509,7 @@ class _HomePageState extends LocalizedState { homeShowcaseData.warehouseManagerManageStock.showcaseKey, i18.home.stockReconciliationLabel: homeShowcaseData.wareHouseManagerStockReconciliation.showcaseKey, - i18.home.myCheckList: homeShowcaseData.supervisorMyChecklist.showcaseKey, + i18.home.mySurveyForm: homeShowcaseData.supervisorMySurveyForm.showcaseKey, i18.home.fileComplaint: homeShowcaseData.distributorFileComplaint.showcaseKey, i18.home.syncDataLabel: homeShowcaseData.distributorSyncData.showcaseKey, @@ -523,7 +530,7 @@ class _HomePageState extends LocalizedState { i18.home.closedHouseHoldLabel, i18.home.manageStockLabel, i18.home.stockReconciliationLabel, - i18.home.myCheckList, + i18.home.mySurveyForm, i18.home.fileComplaint, i18.home.syncDataLabel, i18.home.viewReportsLabel, @@ -565,6 +572,9 @@ class _HomePageState extends LocalizedState { userId: context.loggedInUserUuid, localRepositories: [ // INFO : Need to add local repo of package Here + context.read< + LocalRepository>(), + context.read< LocalRepository>(), context.read< @@ -642,6 +652,16 @@ void setPackagesSingleton(BuildContext context) { ) { loadLocalization(context, appConfiguration); // INFO : Need to add singleton of package Here + ComplaintsSingleton().setInitialData( + tenantId: envConfig.variables.tenantId, + loggedInUserUuid: context.loggedInUserUuid, + userMobileNumber: context.loggedInUser.mobileNumber, + loggedInUserName: context.loggedInUser.name, + complaintTypes: + appConfiguration.complaintTypes!.map((e) => e.code).toList(), + userName: context.loggedInUser.name ?? '', + ); + RegistrationDeliverySingleton().setInitialData( loggedInUser: context.loggedInUserModel, loggedInUserUuid: context.loggedInUserUuid, @@ -693,6 +713,22 @@ void setPackagesSingleton(BuildContext context) { appVersion: Constants().version, ); + SurveyFormSingleton().setInitialData( + projectId: context.projectId, + projectName: context.selectedProject.name, + loggedInIndividualId: context.loggedInIndividualId ?? '', + loggedInUserUuid: context.loggedInUserUuid, + appVersion: Constants().version, + isHealthFacilityWorker: context.loggedInUserRoles.where((role) => role.code == RolesType.healthFacilityWorker.toValue()).toList().isNotEmpty, + roles: context.read().state.maybeMap( + orElse: () => const Offstage(), + authenticated: (res) { + return res.userModel.roles + .map((e) => e.code.snakeCase.toUpperCase()) + .toList(); + }), + ); + ReferralReconSingleton().setInitialData( userName: context.loggedInUser.name ?? '', userUUid: context.loggedInUserUuid, diff --git a/apps/health_campaign_field_worker_app/lib/pages/project_facility_selection.dart b/apps/health_campaign_field_worker_app/lib/pages/project_facility_selection.dart index cab08f048..f10c3625b 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/project_facility_selection.dart +++ b/apps/health_campaign_field_worker_app/lib/pages/project_facility_selection.dart @@ -1,6 +1,6 @@ import 'package:collection/collection.dart'; import 'package:digit_components/digit_components.dart'; -import 'package:digit_data_model/models/entities/project_facility.dart'; +import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; import 'package:reactive_forms/reactive_forms.dart'; @@ -14,9 +14,9 @@ class ProjectFacilitySelectionPage extends StatelessWidget { final List projectFacilities; const ProjectFacilitySelectionPage({ - Key? key, + super.key, required this.projectFacilities, - }) : super(key: key); + }); static const _facilityName = 'facilityKey'; static const _selectedFacility = 'selectedFacilityKey'; diff --git a/apps/health_campaign_field_worker_app/lib/router/app_router.dart b/apps/health_campaign_field_worker_app/lib/router/app_router.dart index 50382946e..c882ac15f 100644 --- a/apps/health_campaign_field_worker_app/lib/router/app_router.dart +++ b/apps/health_campaign_field_worker_app/lib/router/app_router.dart @@ -3,14 +3,18 @@ import 'package:attendance_management/router/attendance_router.gm.dart'; import 'package:auto_route/auto_route.dart'; import 'package:closed_household/router/closed_household_router.dart'; import 'package:closed_household/router/closed_household_router.gm.dart'; -import 'package:digit_data_model/data_model.dart'; +import 'package:complaints/router/complaints_router.dart'; +import 'package:complaints/router/complaints_router.gm.dart'; import 'package:digit_dss/router/dashboard_router.dart'; import 'package:digit_dss/router/dashboard_router.gm.dart'; import 'package:digit_scanner/router/digit_scanner_router.dart'; import 'package:digit_scanner/router/digit_scanner_router.gm.dart'; +import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; import 'package:inventory_management/router/inventory_router.dart'; import 'package:inventory_management/router/inventory_router.gm.dart'; +import 'package:survey_form/router/survey_form_router.dart'; +import 'package:survey_form/router/survey_form_router.gm.dart'; import 'package:referral_reconciliation/router/referral_reconciliation_router.dart'; import 'package:referral_reconciliation/router/referral_reconciliation_router.gm.dart'; import 'package:registration_delivery/router/registration_delivery_router.dart'; @@ -20,22 +24,6 @@ import '../blocs/localization/app_localization.dart'; import '../pages/acknowledgement.dart'; import '../pages/authenticated.dart'; import '../pages/boundary_selection.dart'; -import '../pages/checklist/checklist.dart'; -import '../pages/checklist/checklist_boundary_view.dart'; -import '../pages/checklist/checklist_preview.dart'; -import '../pages/checklist/checklist_view.dart'; -import '../pages/checklist/checklist_wrapper.dart'; -import '../pages/complaints/inbox/complaints_details_view.dart'; -import '../pages/complaints/inbox/complaints_inbox.dart'; -import '../pages/complaints/inbox/complaints_inbox_filter.dart'; -import '../pages/complaints/inbox/complaints_inbox_search.dart'; -import '../pages/complaints/inbox/complaints_inbox_sort.dart'; -import '../pages/complaints/inbox/complaints_inbox_wrapper.dart'; -import '../pages/complaints/registration/complaint_type.dart'; -import '../pages/complaints/registration/complaints_details.dart'; -import '../pages/complaints/registration/complaints_location.dart'; -import '../pages/complaints/registration/complaints_registration_wrapper.dart'; -import '../pages/complaints_acknowledgement.dart'; import '../pages/home.dart'; import '../pages/language_selection.dart'; import '../pages/login.dart'; @@ -59,6 +47,8 @@ part 'app_router.gr.dart'; RegistrationDeliveryRoute, ClosedHouseholdPackageRoute, DashboardRoute, + SurveyFormRoute, + ComplaintsRoute ], ) class AppRouter extends _$AppRouter { @@ -186,7 +176,6 @@ class AppRouter extends _$AppRouter { page: HouseholdAcknowledgementRoute.page, path: 'household-acknowledgement', ), - AutoRoute(page: ChecklistViewRoute.page, path: 'view'), AutoRoute( page: DeliverySummaryRoute.page, path: 'delivery-summary', @@ -213,28 +202,44 @@ class AppRouter extends _$AppRouter { path: 'closed-household-acknowledgement'), ]), + /// close household + AutoRoute( + page: ClosedHouseholdWrapperRoute.page, + path: 'closed-household-wrapper', + children: [ + AutoRoute( + page: ClosedHouseholdDetailsRoute.page, + path: 'closed-household-details', + initial: true, + ), + AutoRoute( + page: ClosedHouseholdSummaryRoute.page, + path: 'closed-household-summary'), + AutoRoute( + page: ClosedHouseholdAcknowledgementRoute.page, + path: 'closed-household-acknowledgement'), + ]), + AutoRoute( - page: ChecklistWrapperRoute.page, - path: 'checklist', + page: SurveyFormWrapperRoute.page, + path: 'surveyForm', children: [ AutoRoute( - page: ChecklistRoute.page, + page: SurveyformRoute.page, path: '', ), AutoRoute( - page: ChecklistBoundaryViewRoute.page, path: 'view-boundary'), - AutoRoute(page: ChecklistViewRoute.page, path: 'view'), - AutoRoute(page: ChecklistPreviewRoute.page, path: 'preview'), + page: SurveyFormBoundaryViewRoute.page, path: 'view-boundary'), + AutoRoute(page: SurveyFormViewRoute.page, path: 'view'), + AutoRoute(page: SurveyFormPreviewRoute.page, path: 'preview'), + AutoRoute(page: SurveyFormAcknowledgementRoute.page, path: 'surveyForm-acknowledgement'), ]), AutoRoute( page: BeneficiaryAcknowledgementRoute.page, path: 'beneficiary-acknowledgement', ), AutoRoute(page: AcknowledgementRoute.page, path: 'acknowledgement'), - AutoRoute( - page: ComplaintsAcknowledgementRoute.page, - path: 'complaints-acknowledgement', - ), + AutoRoute( page: ProjectFacilitySelectionRoute.page, path: 'select-project-facilities', @@ -257,7 +262,7 @@ class AppRouter extends _$AppRouter { path: 'select-boundary', ), - /// Complaints Inbox + // INFO : Need to add Router of package Here AutoRoute( page: ComplaintsInboxWrapperRoute.page, path: 'complaints-inbox', @@ -307,6 +312,12 @@ class AppRouter extends _$AppRouter { ], ), + /// Complaints Acknowledgemnet + AutoRoute( + page: ComplaintsAcknowledgementRoute.page, + path: 'complaints-acknowledgement', + ), + // Attendance Route AutoRoute( page: ManageAttendanceRoute.page, diff --git a/apps/health_campaign_field_worker_app/lib/router/app_router.gr.dart b/apps/health_campaign_field_worker_app/lib/router/app_router.gr.dart index 68d85a6af..2fcad75ee 100644 --- a/apps/health_campaign_field_worker_app/lib/router/app_router.gr.dart +++ b/apps/health_campaign_field_worker_app/lib/router/app_router.gr.dart @@ -55,179 +55,6 @@ abstract class _$AppRouter extends RootStackRouter { ), ); }, - ChecklistBoundaryViewRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ChecklistBoundaryViewRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ChecklistBoundaryViewPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ChecklistRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ChecklistRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ChecklistPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ChecklistPreviewRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ChecklistPreviewRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ChecklistPreviewPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ChecklistViewRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ChecklistViewRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ChecklistViewPage( - key: args.key, - referralClientRefId: args.referralClientRefId, - appLocalizations: args.appLocalizations, - ), - ); - }, - ChecklistWrapperRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ChecklistWrapperRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: WrappedRoute( - child: ChecklistWrapperPage( - key: args.key, - isEditing: args.isEditing, - )), - ); - }, - ComplaintTypeRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintTypeRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ComplaintTypePage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ComplaintsAcknowledgementRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintsAcknowledgementRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ComplaintsAcknowledgementPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ComplaintsDetailsRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintsDetailsRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ComplaintsDetailsPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ComplaintsDetailsViewRoute.name: (routeData) { - final args = routeData.argsAs(); - return AutoRoutePage( - routeData: routeData, - child: ComplaintsDetailsViewPage( - key: args.key, - complaint: args.complaint, - ), - ); - }, - ComplaintsInboxFilterRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintsInboxFilterRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ComplaintsInboxFilterPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ComplaintsInboxRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintsInboxRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ComplaintsInboxPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ComplaintsInboxSearchRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintsInboxSearchRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ComplaintsInboxSearchPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ComplaintsInboxSortRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintsInboxSortRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ComplaintsInboxSortPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ComplaintsInboxWrapperRoute.name: (routeData) { - return AutoRoutePage( - routeData: routeData, - child: const ComplaintsInboxWrapperPage(), - ); - }, - ComplaintsLocationRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintsLocationRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: ComplaintsLocationPage( - key: args.key, - appLocalizations: args.appLocalizations, - ), - ); - }, - ComplaintsRegistrationWrapperRoute.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const ComplaintsRegistrationWrapperRouteArgs()); - return AutoRoutePage( - routeData: routeData, - child: WrappedRoute( - child: ComplaintsRegistrationWrapperPage( - key: args.key, - pgrServiceModel: args.pgrServiceModel, - )), - ); - }, HomeRoute.name: (routeData) { final args = routeData.argsAs(orElse: () => const HomeRouteArgs()); @@ -312,6 +139,8 @@ abstract class _$AppRouter extends RootStackRouter { ...RegistrationDeliveryRoute().pagesMap, ...ClosedHouseholdPackageRoute().pagesMap, ...DashboardRoute().pagesMap, + ...SurveyFormRoute().pagesMap, + ...ComplaintsRoute().pagesMap, }; } @@ -455,603 +284,6 @@ class BoundarySelectionRouteArgs { } } -/// generated route for -/// [ChecklistBoundaryViewPage] -class ChecklistBoundaryViewRoute - extends PageRouteInfo { - ChecklistBoundaryViewRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ChecklistBoundaryViewRoute.name, - args: ChecklistBoundaryViewRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ChecklistBoundaryViewRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ChecklistBoundaryViewRouteArgs { - const ChecklistBoundaryViewRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ChecklistBoundaryViewRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ChecklistPage] -class ChecklistRoute extends PageRouteInfo { - ChecklistRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ChecklistRoute.name, - args: ChecklistRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ChecklistRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ChecklistRouteArgs { - const ChecklistRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ChecklistRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ChecklistPreviewPage] -class ChecklistPreviewRoute extends PageRouteInfo { - ChecklistPreviewRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ChecklistPreviewRoute.name, - args: ChecklistPreviewRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ChecklistPreviewRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ChecklistPreviewRouteArgs { - const ChecklistPreviewRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ChecklistPreviewRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ChecklistViewPage] -class ChecklistViewRoute extends PageRouteInfo { - ChecklistViewRoute({ - Key? key, - String? referralClientRefId, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ChecklistViewRoute.name, - args: ChecklistViewRouteArgs( - key: key, - referralClientRefId: referralClientRefId, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ChecklistViewRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ChecklistViewRouteArgs { - const ChecklistViewRouteArgs({ - this.key, - this.referralClientRefId, - this.appLocalizations, - }); - - final Key? key; - - final String? referralClientRefId; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ChecklistViewRouteArgs{key: $key, referralClientRefId: $referralClientRefId, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ChecklistWrapperPage] -class ChecklistWrapperRoute extends PageRouteInfo { - ChecklistWrapperRoute({ - Key? key, - bool isEditing = false, - List? children, - }) : super( - ChecklistWrapperRoute.name, - args: ChecklistWrapperRouteArgs( - key: key, - isEditing: isEditing, - ), - initialChildren: children, - ); - - static const String name = 'ChecklistWrapperRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ChecklistWrapperRouteArgs { - const ChecklistWrapperRouteArgs({ - this.key, - this.isEditing = false, - }); - - final Key? key; - - final bool isEditing; - - @override - String toString() { - return 'ChecklistWrapperRouteArgs{key: $key, isEditing: $isEditing}'; - } -} - -/// generated route for -/// [ComplaintTypePage] -class ComplaintTypeRoute extends PageRouteInfo { - ComplaintTypeRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ComplaintTypeRoute.name, - args: ComplaintTypeRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintTypeRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintTypeRouteArgs { - const ComplaintTypeRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ComplaintTypeRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ComplaintsAcknowledgementPage] -class ComplaintsAcknowledgementRoute - extends PageRouteInfo { - ComplaintsAcknowledgementRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ComplaintsAcknowledgementRoute.name, - args: ComplaintsAcknowledgementRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsAcknowledgementRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsAcknowledgementRouteArgs { - const ComplaintsAcknowledgementRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ComplaintsAcknowledgementRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ComplaintsDetailsPage] -class ComplaintsDetailsRoute extends PageRouteInfo { - ComplaintsDetailsRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ComplaintsDetailsRoute.name, - args: ComplaintsDetailsRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsDetailsRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsDetailsRouteArgs { - const ComplaintsDetailsRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ComplaintsDetailsRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ComplaintsDetailsViewPage] -class ComplaintsDetailsViewRoute - extends PageRouteInfo { - ComplaintsDetailsViewRoute({ - Key? key, - required PgrServiceModel complaint, - List? children, - }) : super( - ComplaintsDetailsViewRoute.name, - args: ComplaintsDetailsViewRouteArgs( - key: key, - complaint: complaint, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsDetailsViewRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsDetailsViewRouteArgs { - const ComplaintsDetailsViewRouteArgs({ - this.key, - required this.complaint, - }); - - final Key? key; - - final PgrServiceModel complaint; - - @override - String toString() { - return 'ComplaintsDetailsViewRouteArgs{key: $key, complaint: $complaint}'; - } -} - -/// generated route for -/// [ComplaintsInboxFilterPage] -class ComplaintsInboxFilterRoute - extends PageRouteInfo { - ComplaintsInboxFilterRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ComplaintsInboxFilterRoute.name, - args: ComplaintsInboxFilterRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsInboxFilterRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsInboxFilterRouteArgs { - const ComplaintsInboxFilterRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ComplaintsInboxFilterRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ComplaintsInboxPage] -class ComplaintsInboxRoute extends PageRouteInfo { - ComplaintsInboxRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ComplaintsInboxRoute.name, - args: ComplaintsInboxRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsInboxRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsInboxRouteArgs { - const ComplaintsInboxRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ComplaintsInboxRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ComplaintsInboxSearchPage] -class ComplaintsInboxSearchRoute - extends PageRouteInfo { - ComplaintsInboxSearchRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ComplaintsInboxSearchRoute.name, - args: ComplaintsInboxSearchRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsInboxSearchRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsInboxSearchRouteArgs { - const ComplaintsInboxSearchRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ComplaintsInboxSearchRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ComplaintsInboxSortPage] -class ComplaintsInboxSortRoute - extends PageRouteInfo { - ComplaintsInboxSortRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ComplaintsInboxSortRoute.name, - args: ComplaintsInboxSortRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsInboxSortRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsInboxSortRouteArgs { - const ComplaintsInboxSortRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ComplaintsInboxSortRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ComplaintsInboxWrapperPage] -class ComplaintsInboxWrapperRoute extends PageRouteInfo { - const ComplaintsInboxWrapperRoute({List? children}) - : super( - ComplaintsInboxWrapperRoute.name, - initialChildren: children, - ); - - static const String name = 'ComplaintsInboxWrapperRoute'; - - static const PageInfo page = PageInfo(name); -} - -/// generated route for -/// [ComplaintsLocationPage] -class ComplaintsLocationRoute - extends PageRouteInfo { - ComplaintsLocationRoute({ - Key? key, - AppLocalizations? appLocalizations, - List? children, - }) : super( - ComplaintsLocationRoute.name, - args: ComplaintsLocationRouteArgs( - key: key, - appLocalizations: appLocalizations, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsLocationRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsLocationRouteArgs { - const ComplaintsLocationRouteArgs({ - this.key, - this.appLocalizations, - }); - - final Key? key; - - final AppLocalizations? appLocalizations; - - @override - String toString() { - return 'ComplaintsLocationRouteArgs{key: $key, appLocalizations: $appLocalizations}'; - } -} - -/// generated route for -/// [ComplaintsRegistrationWrapperPage] -class ComplaintsRegistrationWrapperRoute - extends PageRouteInfo { - ComplaintsRegistrationWrapperRoute({ - Key? key, - PgrServiceModel? pgrServiceModel, - List? children, - }) : super( - ComplaintsRegistrationWrapperRoute.name, - args: ComplaintsRegistrationWrapperRouteArgs( - key: key, - pgrServiceModel: pgrServiceModel, - ), - initialChildren: children, - ); - - static const String name = 'ComplaintsRegistrationWrapperRoute'; - - static const PageInfo page = - PageInfo(name); -} - -class ComplaintsRegistrationWrapperRouteArgs { - const ComplaintsRegistrationWrapperRouteArgs({ - this.key, - this.pgrServiceModel, - }); - - final Key? key; - - final PgrServiceModel? pgrServiceModel; - - @override - String toString() { - return 'ComplaintsRegistrationWrapperRouteArgs{key: $key, pgrServiceModel: $pgrServiceModel}'; - } -} - /// generated route for /// [HomePage] class HomeRoute extends PageRouteInfo { diff --git a/apps/health_campaign_field_worker_app/lib/utils/constants.dart b/apps/health_campaign_field_worker_app/lib/utils/constants.dart index 3d05740b3..e3fb2a5a6 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/constants.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/constants.dart @@ -1,4 +1,6 @@ +import 'package:complaints/complaints.dart'; import 'package:attendance_management/attendance_management.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:closed_household/utils/utils.dart'; import 'package:collection/collection.dart'; import 'package:digit_components/utils/app_logger.dart'; @@ -74,11 +76,11 @@ class Constants { } static const String localizationApiPath = 'localization/messages/v1/_search'; - static const String checklistPreviewDateFormat = 'dd MMMM yyyy'; + static const String surveyFormPreviewDateFormat = 'dd MMMM yyyy'; static const String defaultDateFormat = 'dd/MM/yyyy'; static const String defaultDateTimeFormat = 'dd/MM/yyyy hh:mm a'; - static const String checklistViewDateFormat = 'dd/MM/yyyy hh:mm a'; - static const String healthFacilityChecklistPrefix = 'HF_RF'; + static const String surveyFormViewDateFormat = 'dd/MM/yyyy hh:mm a'; + static const String healthFacilitySurveyFormPrefix = 'HF_RF'; static const String boundaryLocalizationPath = 'rainmaker-boundary-admin'; @@ -112,10 +114,6 @@ class Constants { sql, BoundaryOpLogManager(isar), ), - PgrServiceLocalRepository( - sql, - PgrServiceOpLogManager(isar), - ), HouseholdMemberLocalRepository(sql, HouseholdMemberOpLogManager(isar)), HouseholdLocalRepository(sql, HouseholdOpLogManager(isar)), ProjectBeneficiaryLocalRepository( @@ -144,6 +142,11 @@ class Constants { sql, HFReferralOpLogManager(isar), ), + + PgrServiceLocalRepository( + sql, + PgrServiceOpLogManager(isar), + ), ]; } @@ -186,8 +189,6 @@ class Constants { remoteRepositories.addAll([ if (value == DataModelType.facility) FacilityRemoteRepository(dio, actionMap: actions), - if (value == DataModelType.complaints) - PgrServiceRemoteRepository(dio, actionMap: actions), if (value == DataModelType.productVariant) ProductVariantRemoteRepository(dio, actionMap: actions), if (value == DataModelType.boundary) @@ -230,6 +231,9 @@ class Constants { AttendanceLogRemoteRepository(dio, actionMap: actions), if (value == DataModelType.hFReferral) HFReferralRemoteRepository(dio, actionMap: actions), + + if (value == DataModelType.complaints) + PgrServiceRemoteRepository(dio, actionMap: actions), ]); } @@ -304,7 +308,7 @@ class Modules { } const String noResultSvg = 'assets/icons/svg/no_result.svg'; -const String myChecklistSvg = 'assets/icons/svg/mychecklist.svg'; +const String mySurveyFormSvg = 'assets/icons/svg/mychecklist.svg'; enum DigitProgressDialogType { inProgress, diff --git a/apps/health_campaign_field_worker_app/lib/utils/extensions/context_utility.dart b/apps/health_campaign_field_worker_app/lib/utils/extensions/context_utility.dart index 74935a44d..e3fb9323c 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/extensions/context_utility.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/extensions/context_utility.dart @@ -104,6 +104,8 @@ extension ContextUtilityExtensions on BuildContext { ClosedHouseholdSingleton().setBoundary(boundary: selectedBoundary); InventorySingleton().setBoundaryName(boundaryName: selectedBoundary.name!); ReferralReconSingleton().setBoundary(boundary: selectedBoundary); + SurveyFormSingleton().setBoundary(boundary: selectedBoundary); + ComplaintsSingleton().setBoundary(boundary: selectedBoundary); return selectedBoundary; } diff --git a/apps/health_campaign_field_worker_app/lib/utils/extensions/extensions.dart b/apps/health_campaign_field_worker_app/lib/utils/extensions/extensions.dart index daa11a867..b21b100c9 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/extensions/extensions.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/extensions/extensions.dart @@ -1,4 +1,7 @@ +import 'package:complaints/utils/utils.dart'; + // Importing necessary packages and files +import 'package:survey_form/utils/utils.dart'; import 'package:closed_household/utils/utils.dart'; import 'package:collection/collection.dart'; import 'package:digit_data_model/data_model.dart'; diff --git a/apps/health_campaign_field_worker_app/lib/utils/i18_key_constants.dart b/apps/health_campaign_field_worker_app/lib/utils/i18_key_constants.dart index 18305c911..e930a7a65 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/i18_key_constants.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/i18_key_constants.dart @@ -7,7 +7,6 @@ const home = Home(); const acknowledgementSuccess = AcknowledgementSuccess(); const adverseEvents = AdverseEvents(); const projectSelection = ProjectSelection(); -const checklist = Checklist(); const complaints = Complaints(); const syncDialog = SyncDialog(); const homeShowcase = HomeShowcase(); @@ -24,12 +23,12 @@ const selectStockShowcase = SelectStockShowcase(); const warehouseDetailsShowcase = WarehouseDetailsShowcase(); const stockDetailsReceiptShowcase = StockDetailsReceiptShowcase(); const stockDetailsIssuedShowcase = StockDetailsIssuedShowcase(); -const selectChecklistShowcase = SelectChecklistShowcase(); +const selectSurveyFormShowcase = SelectSurveyFormShowcase(); const stockDetailsReturnedShowcase = StockDetailsReturnedShowcase(); const stockReconciliationShowcase = StockReconciliationShowcase(); -const checklistDataShowcase = ChecklistDataShowcase(); -const checklistListShowcase = ChecklistListShowcase(); +const surveyFormDataShowcase = SurveyFormDataShowcase(); +const surveyFormListShowcase = SurveyFormListShowcase(); const complaintTypeShowcase = ComplaintTypeShowcase(); const complaintsDetailsShowcase = ComplaintsDetailsShowcase(); const complaintsDetailsViewShowcase = ComplaintsDetailsViewShowcase(); @@ -181,7 +180,7 @@ class HomeShowcase { return 'SUPERVISOR_HOME_SHOWCASE_PROGRESS_BAR'; } - String get supervisorMyChecklist { + String get supervisorMySurveyForm { return 'SUPERVISOR_HOME_SHOWCASE_MY_CHECKLIST'; } @@ -347,16 +346,16 @@ class Login { String get actionLabel => 'LOGIN_ACTION_LABEL'; } -class SelectChecklistShowcase { - const SelectChecklistShowcase(); +class SelectSurveyFormShowcase { + const SelectSurveyFormShowcase(); - String get selectChecklist { + String get selectSurveyForm { return 'SELECT_CHECKLIST_SHOWCASE_SELECT_CHECKLIST'; } } -class ChecklistDataShowcase { - const ChecklistDataShowcase(); +class SurveyFormDataShowcase { + const SurveyFormDataShowcase(); String get date { return 'CHECKLIST_DATA_SHOWCASE_DATE'; @@ -367,8 +366,8 @@ class ChecklistDataShowcase { } } -class ChecklistListShowcase { - const ChecklistListShowcase(); +class SurveyFormListShowcase { + const SurveyFormListShowcase(); String get open { return 'CHECKLIST_LIST_SHOWCASE_OPEN'; @@ -511,47 +510,6 @@ class ComplaintsInboxShowcase { } } -class Checklist { - const Checklist(); - - String get checklist => 'CHECKLIST'; - - String get checklistlabel => 'CHECKLIST_LABEL'; - - String get checklistCreateActionLabel => 'CHECKLIST_CREATE_ACTION_LABEL'; - - String get checklistViewActionLabel => 'CHECKLIST_VIEW_ACTION_LABEL'; - - String get checklistDetailLabel => 'CHECKLIST_DETAILS_LABEL'; - - String get checklistDialogLabel => 'CHECKLIST_DIALOG_LABEL'; - - String get checklistDialogDescription => 'CHECKLIST_DIALOG_DESCRITPTION'; - - String get checklistDialogPrimaryAction => 'CHECKLIST_DIALOG_PRIMARY_ACTION'; - - String get checklistDialogSecondaryAction => - 'CHECKLIST_DIALOG_SECONDARY_ACTION'; - - String get checklistdate => 'CHECKLIST_DATE'; - - String get checklistReasonRequiredError => 'CHECKLIST_REASON_REQUIRED_ERROR'; - - String get notSelectedKey => 'NOT_SELECTED'; - - String get checklistBackDialogLabel => 'CHECKLIST_BACK_DIALOG_LABEL'; - - String get checklistBackDialogDescription => - 'CHECKLIST_BACK_DIALOG_DESCRITPTION'; - - String get checklistBackDialogPrimaryAction => - 'CHECKLIST_BACK_DIALOG_PRIMARY_ACTION'; - - String get checklistBackDialogSecondaryAction => - 'CHECKLIST_BACK_DIALOG_SECONDARY_ACTION'; - - String get noChecklistFound => 'NO_CHECKLISTS_FOUND'; -} class ForgotPassword { const ForgotPassword(); @@ -592,7 +550,7 @@ class Home { String get dataSyncInfoContent => 'DATA_SYNC_INFO_CONTENT'; - String get myCheckList => 'MY_CHECK_LIST_LABEL'; + String get mySurveyForm => 'MY_CHECK_LIST_LABEL'; String get warehouseManagerCheckList => 'WAREHOUSE_MANAGER_CHECK_LIST_LABEL'; diff --git a/apps/health_campaign_field_worker_app/lib/utils/localization_delegates.dart b/apps/health_campaign_field_worker_app/lib/utils/localization_delegates.dart index 700760a8e..2b0d88745 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/localization_delegates.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/localization_delegates.dart @@ -2,6 +2,9 @@ import 'dart:ui'; import 'package:attendance_management/blocs/app_localization.dart' as attendance_localization; +import 'package:survey_form/blocs/app_localization.dart' as survey_form_localization; +import 'package:complaints/blocs/localization/app_localization.dart' + as complaints_localization; import 'package:closed_household/blocs/app_localization.dart' as closed_household_localization; import 'package:digit_data_model/data/local_store/sql_store/sql_store.dart'; @@ -32,6 +35,9 @@ getAppLocalizationDelegates({ GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalMaterialLocalizations.delegate, + + // INFO : Need to add package delegates here + referral_reconciliation_localization.ReferralReconLocalization.getDelegate( LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, appConfig.languages!, @@ -44,6 +50,10 @@ getAppLocalizationDelegates({ LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, appConfig.languages!, ), + survey_form_localization.SurveyFormLocalization.getDelegate( + LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, + appConfig.languages!, + ), scanner_localization.ScannerLocalization.getDelegate( LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, appConfig.languages!, @@ -65,5 +75,9 @@ getAppLocalizationDelegates({ LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, appConfig.languages!, ), + complaints_localization.ComplaintsLocalization.getDelegate( + LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, + appConfig.languages!, + ), ]; } diff --git a/apps/health_campaign_field_worker_app/lib/utils/typedefs.dart b/apps/health_campaign_field_worker_app/lib/utils/typedefs.dart index 1ad7ed7d9..9196fc719 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/typedefs.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/typedefs.dart @@ -21,13 +21,6 @@ typedef ProjectResourceDataRepository = DataRepository; typedef ProjectStaffDataRepository = DataRepository; -typedef ServiceDefinitionDataRepository - = DataRepository; -typedef ServiceDataRepository - = DataRepository; -typedef PgrServiceDataRepository - = DataRepository; - typedef UserDataRepository = DataRepository; typedef StockDataRepository = DataRepository; diff --git a/apps/health_campaign_field_worker_app/lib/utils/utils.dart b/apps/health_campaign_field_worker_app/lib/utils/utils.dart index dfda5e62f..83133506c 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/utils.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/utils.dart @@ -5,6 +5,8 @@ import 'dart:io'; import 'package:attendance_management/attendance_management.dart' as attendance_mappers; + +import 'package:complaints/complaints.init.dart' as complaints_mappers; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:digit_components/theme/digit_theme.dart'; import 'package:digit_components/widgets/atoms/digit_toaster.dart'; @@ -25,6 +27,8 @@ import 'package:referral_reconciliation/referral_reconciliation.dart' as referral_reconciliation_mappers; import 'package:registration_delivery/registration_delivery.init.dart' as registration_delivery_mappers; +import 'package:survey_form/survey_form.init.dart' + as survey_form_mappers; import '../blocs/app_initialization/app_initialization.dart'; import '../blocs/projects_beneficiary_downsync/project_beneficiaries_downsync.dart'; @@ -399,6 +403,8 @@ initializeAllMappers() async { Future(() => data_model_mappers.initializeMappers()), Future(() => registration_delivery_mappers.initializeMappers()), Future(() => dss_mappers.initializeMappers()), + Future(() => survey_form_mappers.initializeMappers()), + Future(() => complaints_mappers.initializeMappers()) ]; await Future.wait(initializations); } @@ -424,6 +430,7 @@ int getSyncCount(List oplogs) { } } else { switch (element.entityType) { + // add syncCount case for package case DataModelType.household: case DataModelType.individual: case DataModelType.householdMember: diff --git a/apps/health_campaign_field_worker_app/lib/widgets/network_manager_provider_wrapper.dart b/apps/health_campaign_field_worker_app/lib/widgets/network_manager_provider_wrapper.dart index 6bd4bf8df..ade5b85af 100644 --- a/apps/health_campaign_field_worker_app/lib/widgets/network_manager_provider_wrapper.dart +++ b/apps/health_campaign_field_worker_app/lib/widgets/network_manager_provider_wrapper.dart @@ -1,10 +1,12 @@ import 'dart:io'; import 'package:attendance_management/attendance_management.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:inventory_management/inventory_management.dart'; import 'package:registration_delivery/registration_delivery.dart'; import 'package:referral_reconciliation/referral_reconciliation.dart'; + import 'package:digit_components/theme/digit_theme.dart'; import 'package:digit_components/widgets/digit_card.dart'; import 'package:digit_components/widgets/digit_elevated_button.dart'; @@ -23,6 +25,7 @@ import '../data/repositories/oplog.dart'; import '../data/repositories/remote/auth.dart'; import '../data/repositories/remote/downsync.dart'; import '../models/downsync/downsync.dart'; +import 'package:complaints/complaints.dart'; class NetworkManagerProviderWrapper extends StatelessWidget { final LocalSqlDataStore sql; @@ -179,13 +182,7 @@ class NetworkManagerProviderWrapper extends StatelessWidget { BoundaryOpLogManager(isar), ), ), - RepositoryProvider< - LocalRepository>( - create: (_) => PgrServiceLocalRepository( - sql, - PgrServiceOpLogManager(isar), - ), - ), + RepositoryProvider< LocalRepository>( create: (_) => HouseholdMemberLocalRepository( @@ -265,6 +262,14 @@ class NetworkManagerProviderWrapper extends StatelessWidget { ), ), // INFO Need to add packages here + + RepositoryProvider< + LocalRepository>( + create: (_) => PgrServiceLocalRepository( + sql, + PgrServiceOpLogManager(isar), + ), + ), ]; } @@ -386,14 +391,7 @@ class NetworkManagerProviderWrapper extends StatelessWidget { actionMap: actions, ), ), - if (value == DataModelType.complaints) - RepositoryProvider< - RemoteRepository>( - create: (_) => PgrServiceRemoteRepository( - dio, - actionMap: actions, - ), - ), + if (value == DataModelType.user) RepositoryProvider>( create: (_) => UserRemoteRepository( @@ -486,6 +484,15 @@ class NetworkManagerProviderWrapper extends StatelessWidget { StockReconciliationRemoteRepository(dio, actionMap: actions), ), // INFO Need to add packages here + + if (value == DataModelType.complaints) + RepositoryProvider< + RemoteRepository>( + create: (_) => PgrServiceRemoteRepository( + dio, + actionMap: actions, + ), + ), ]); } diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/checklist_data.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/checklist_data.dart deleted file mode 100644 index a81c6c73e..000000000 --- a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/checklist_data.dart +++ /dev/null @@ -1,23 +0,0 @@ -part of 'showcase_constants.dart'; - -class _ChecklistDataShowcaseData { - static final _ChecklistDataShowcaseData _instance = - _ChecklistDataShowcaseData._(); - - _ChecklistDataShowcaseData._(); - - factory _ChecklistDataShowcaseData() => _instance; - - List get showcaseData => [ - date, - administrativeUnit, - ]; - - final date = ShowcaseItemBuilder( - messageLocalizationKey: i18.checklistDataShowcase.date, - ); - - final administrativeUnit = ShowcaseItemBuilder( - messageLocalizationKey: i18.checklistDataShowcase.administrativeUnit, - ); -} diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/checklist_list.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/checklist_list.dart deleted file mode 100644 index da2297571..000000000 --- a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/checklist_list.dart +++ /dev/null @@ -1,16 +0,0 @@ -part of 'showcase_constants.dart'; - -class _ChecklistListShowcaseData { - static final _ChecklistListShowcaseData _instance = - _ChecklistListShowcaseData._(); - - _ChecklistListShowcaseData._(); - - factory _ChecklistListShowcaseData() => _instance; - - List get showcaseData => [open]; - - final open = ShowcaseItemBuilder( - messageLocalizationKey: i18.checklistListShowcase.open, - ); -} diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/home_showcase.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/home_showcase.dart index 0d712dc39..c5bc7380e 100644 --- a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/home_showcase.dart +++ b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/home_showcase.dart @@ -19,7 +19,7 @@ class _HomePageShowcaseData { warehouseManagerSyncData, inventoryReport, supervisorProgressBar, - supervisorMyChecklist, + supervisorMySurveyForm, supervisorComplaints, supervisorSyncData, deleteAll, @@ -68,8 +68,8 @@ class _HomePageShowcaseData { messageLocalizationKey: i18.homeShowcase.supervisorProgressBar, ); - final supervisorMyChecklist = ShowcaseItemBuilder( - messageLocalizationKey: i18.homeShowcase.supervisorMyChecklist, + final supervisorMySurveyForm = ShowcaseItemBuilder( + messageLocalizationKey: i18.homeShowcase.supervisorMySurveyForm, ); final supervisorComplaints = ShowcaseItemBuilder( diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/select_checklist.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/select_checklist.dart deleted file mode 100644 index 87b725c9f..000000000 --- a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/select_checklist.dart +++ /dev/null @@ -1,18 +0,0 @@ -part of 'showcase_constants.dart'; - -class _SelectChecklistShowcaseData { - static final _SelectChecklistShowcaseData _instance = - _SelectChecklistShowcaseData._(); - - _SelectChecklistShowcaseData._(); - - factory _SelectChecklistShowcaseData() => _instance; - - List get showcaseData => [ - selectChecklist, - ]; - - final selectChecklist = ShowcaseItemBuilder( - messageLocalizationKey: i18.selectChecklistShowcase.selectChecklist, - ); -} diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/select_survey_form.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/select_survey_form.dart new file mode 100644 index 000000000..52c59b8d6 --- /dev/null +++ b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/select_survey_form.dart @@ -0,0 +1,18 @@ +part of 'showcase_constants.dart'; + +class _SelectSurveyFormShowcaseData { + static final _SelectSurveyFormShowcaseData _instance = + _SelectSurveyFormShowcaseData._(); + + _SelectSurveyFormShowcaseData._(); + + factory _SelectSurveyFormShowcaseData() => _instance; + + List get showcaseData => [ + selectSurveyForm, + ]; + + final selectSurveyForm = ShowcaseItemBuilder( + messageLocalizationKey: i18.selectSurveyFormShowcase.selectSurveyForm, + ); +} diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/showcase_constants.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/showcase_constants.dart index 89a6fe8f0..54e64a0d3 100644 --- a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/showcase_constants.dart +++ b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/showcase_constants.dart @@ -1,10 +1,10 @@ import '../../../utils/i18_key_constants.dart' as i18; import '../showcase_wrappers.dart'; -part 'checklist_data.dart'; -part 'checklist_list.dart'; +part 'survey_form_data.dart'; +part 'survey_form_list.dart'; part 'home_showcase.dart'; -part 'select_checklist.dart'; +part 'select_survey_form.dart'; part 'select_stock_showcase.dart'; part 'stock_details.dart'; part 'stock_reconciliation.dart'; @@ -19,9 +19,9 @@ final selectStockShowcaseData = _SelectStockShowcaseData(); final warehouseDetailsShowcaseData = _WarehouseDetailsShowcaseData(); final stockDetailsShowcaseData = _StockDetailsShowcaseData(); final stockReconciliationShowcaseData = _StockReconciliationShowcaseData(); -final selectChecklistShowcaseData = _SelectChecklistShowcaseData(); -final checklistDataShowcaseData = _ChecklistDataShowcaseData(); -final checklistListShowcaseData = _ChecklistListShowcaseData(); +final selectSurveyFormShowcaseData = _SelectSurveyFormShowcaseData(); +final surveyFormDataShowcaseData = _SurveyFormDataShowcaseData(); +final surveyFormListShowcaseData = _SurveyFormListShowcaseData(); final complaintsInboxShowcaseData = _ComplaintsInboxShowcaseData(); final complaintsDetailsViewShowcaseData = _ComplaintsDetailsViewShowcaseData(); final complaintTypeShowcaseData = _ComplaintTypeShowcaseData(); diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/survey_form_data.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/survey_form_data.dart new file mode 100644 index 000000000..0f2bdb86b --- /dev/null +++ b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/survey_form_data.dart @@ -0,0 +1,24 @@ + +part of 'showcase_constants.dart'; + +class _SurveyFormDataShowcaseData { + static final _SurveyFormDataShowcaseData _instance = + _SurveyFormDataShowcaseData._(); + + _SurveyFormDataShowcaseData._(); + + factory _SurveyFormDataShowcaseData() => _instance; + + List get showcaseData => [ + date, + administrativeUnit, + ]; + + final date = ShowcaseItemBuilder( + messageLocalizationKey: i18.surveyFormDataShowcase.date, + ); + + final administrativeUnit = ShowcaseItemBuilder( + messageLocalizationKey: i18.surveyFormDataShowcase.administrativeUnit, + ); +} diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/survey_form_list.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/survey_form_list.dart new file mode 100644 index 000000000..61de98372 --- /dev/null +++ b/apps/health_campaign_field_worker_app/lib/widgets/showcase/config/survey_form_list.dart @@ -0,0 +1,16 @@ +part of 'showcase_constants.dart'; + +class _SurveyFormListShowcaseData { + static final _SurveyFormListShowcaseData _instance = + _SurveyFormListShowcaseData._(); + + _SurveyFormListShowcaseData._(); + + factory _SurveyFormListShowcaseData() => _instance; + + List get showcaseData => [open]; + + final open = ShowcaseItemBuilder( + messageLocalizationKey: i18.surveyFormListShowcase.open, + ); +} diff --git a/apps/health_campaign_field_worker_app/lib/widgets/showcase/showcase_button.dart b/apps/health_campaign_field_worker_app/lib/widgets/showcase/showcase_button.dart index 347693423..79b803f8e 100644 --- a/apps/health_campaign_field_worker_app/lib/widgets/showcase/showcase_button.dart +++ b/apps/health_campaign_field_worker_app/lib/widgets/showcase/showcase_button.dart @@ -1,3 +1,4 @@ +import 'package:complaints/router/complaints_router.gm.dart'; import 'package:digit_components/theme/digit_theme.dart'; import 'package:digit_showcase/showcase_widget.dart'; import 'package:flutter/material.dart'; @@ -73,18 +74,6 @@ class _ShowcaseButtonState extends LocalizedState { return stockReconciliationShowcaseData.showcaseData.map( (e) => e.showcaseKey, ); - case ChecklistRoute.name: - return selectChecklistShowcaseData.showcaseData.map( - (e) => e.showcaseKey, - ); - case ChecklistBoundaryViewRoute.name: - return checklistDataShowcaseData.showcaseData.map( - (e) => e.showcaseKey, - ); - case ChecklistPreviewRoute.name: - return checklistListShowcaseData.showcaseData.map( - (e) => e.showcaseKey, - ); case ComplaintTypeRoute.name: return complaintTypeShowcaseData.showcaseData.map( (e) => e.showcaseKey, diff --git a/apps/health_campaign_field_worker_app/pubspec.lock b/apps/health_campaign_field_worker_app/pubspec.lock index 6e613b370..9f33c41fd 100644 --- a/apps/health_campaign_field_worker_app/pubspec.lock +++ b/apps/health_campaign_field_worker_app/pubspec.lock @@ -361,6 +361,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + complaints: + dependency: "direct main" + description: + path: "../../packages/complaints" + relative: true + source: path + version: "0.0.1-dev.1" connectivity_plus: dependency: "direct main" description: @@ -493,10 +500,9 @@ packages: digit_components: dependency: "direct main" description: - name: digit_components - sha256: dcdab9542149022cb66241c3c379ca96916f8b6116e585f4799748d859a2ca49 - url: "https://pub.dev" - source: hosted + path: "../../packages/digit_components" + relative: true + source: path version: "1.0.2" digit_data_model: dependency: "direct main" @@ -1533,18 +1539,16 @@ packages: referral_reconciliation: dependency: "direct main" description: - name: referral_reconciliation - sha256: "80d5b93164e4f8337fa757fcb75a1e85b88ffbb760e731ca24496a0cae2aef38" - url: "https://pub.dev" - source: hosted + path: "../../packages/referral_reconciliation" + relative: true + source: path version: "1.0.2+1" registration_delivery: dependency: "direct main" description: - name: registration_delivery - sha256: a6a88665bbf1fa5dce5b864d66992ff9c885b2a3cd898d37f349f1be03cf4086 - url: "https://pub.dev" - source: hosted + path: "../../packages/registration_delivery" + relative: true + source: path version: "1.0.3+1" remove_emoji_input_formatter: dependency: transitive @@ -1775,6 +1779,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + survey_form: + dependency: "direct main" + description: + path: "../../packages/survey_form" + relative: true + source: path + version: "0.0.1-dev.1" sync_http: dependency: transitive description: diff --git a/apps/health_campaign_field_worker_app/pubspec.yaml b/apps/health_campaign_field_worker_app/pubspec.yaml index 6a6166173..067b41643 100644 --- a/apps/health_campaign_field_worker_app/pubspec.yaml +++ b/apps/health_campaign_field_worker_app/pubspec.yaml @@ -74,6 +74,8 @@ dependencies: disable_battery_optimization: ^1.1.1 digit_dss: ^1.0.1 closed_household: ^1.0.1+1 + survey_form: ^0.0.1-dev.1 + complaints: ^0.0.1-dev.1 dev_dependencies: flutter_test: @@ -110,7 +112,7 @@ flutter: assets: - ./ - assets/icons/svg/ - + fonts: - family: Roboto fonts: @@ -118,4 +120,4 @@ flutter: - family: RobotoCondensed fonts: - asset: assets/fonts/Roboto/RobotoCondensed-Regular.ttf - uses-material-design: true + uses-material-design: true \ No newline at end of file diff --git a/packages/attendance_management/pubspec.lock b/packages/attendance_management/pubspec.lock index 92c10cb88..4c22c3a97 100644 --- a/packages/attendance_management/pubspec.lock +++ b/packages/attendance_management/pubspec.lock @@ -276,11 +276,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive @@ -317,18 +315,16 @@ packages: digit_components: dependency: "direct main" description: - name: digit_components - sha256: "9cca4d9a546037080afe02b6ade82fdf01574e11f5656ad12120fd6966578616" - url: "https://pub.dev" - source: hosted - version: "1.0.1+1" + path: "../digit_components" + relative: true + source: path + version: "1.0.2" digit_data_model: dependency: "direct main" description: - name: digit_data_model - sha256: "0b81e96636496b56b4f9c5d918690a17d8985d6b131e0ab54968eb5471ee4f54" - url: "https://pub.dev" - source: hosted + path: "../digit_data_model" + relative: true + source: path version: "1.0.3+1" dio: dependency: "direct main" @@ -1263,5 +1259,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0 <3.9.0" + dart: ">=3.2.0 <4.0.0" flutter: ">=3.16.0" diff --git a/packages/complaints/.gitignore b/packages/complaints/.gitignore new file mode 100644 index 000000000..ac5aa9893 --- /dev/null +++ b/packages/complaints/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/packages/complaints/.metadata b/packages/complaints/.metadata new file mode 100644 index 000000000..b2c661a57 --- /dev/null +++ b/packages/complaints/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "67457e669f79e9f8d13d7a68fe09775fefbb79f4" + channel: "stable" + +project_type: package diff --git a/packages/complaints/CHANGELOG.md b/packages/complaints/CHANGELOG.md new file mode 100644 index 000000000..8cfb47136 --- /dev/null +++ b/packages/complaints/CHANGELOG.md @@ -0,0 +1,6 @@ + +## 0.0.1-dev.1 + +* Moved pgr models, blocs, local remote repository from digit_data_model +* Updated digit_data_model +* PGR Complaints Initial Release \ No newline at end of file diff --git a/packages/complaints/LICENSE b/packages/complaints/LICENSE new file mode 100644 index 000000000..f7d7ac958 --- /dev/null +++ b/packages/complaints/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 eGovernments Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/complaints/README.md b/packages/complaints/README.md new file mode 100644 index 000000000..5593a8162 --- /dev/null +++ b/packages/complaints/README.md @@ -0,0 +1,50 @@ +Complaints package helps people to file complaints , they can provide Complaint type , location and details about the Complaint. + +## Features + +- **Complaints Pages**: The package includes several pages like `complaints_type.dart`, `complaints_location.dart`, `complaints_details.dart` that provide the user interface for Filing Complaint. + + + + + + + +- **Complaints Blocs**: It provides various BLoCs Like `ComplaintsInboxBloc`,`ComplaintsRegistrationBloc` for state management using the BLoC pattern. These BLoCs handle the business logic for Filing Complaints. +- **Complaints Models**: It defines various data models like `PgrAddressModel`, `PgrComplaintModel`, `PgrServiceModel` etc. used in the attendance management process. +- **Complaints Repositories**: The package provides abstract classes for data repositories, `PgrServiceLocalRepository`, `PgrServiceRemoteRepository`, which can be extended to create repositories for different complaint models. + + +## Getting started + +To use this package, add the following dependency to your `pubspec.yaml` file: + +```yaml +dependencies: + complaints: ^any +``` + +## Usage + + +To Navigate to any screens of the package: + +First add complaint_router to your main app router + +Navigate to the required screen using the below code: + +```dart +context.router.push(ComplaintsInboxWrapperRoute()), +``` + +Complaints package requires below data to be passed from main app: + +```dart + String? tenantId; + String? loggedInUserUuid; + String? userMobileNumber; + String? loggedInUserName; + List? complaintTypes; + String? userName; +``` + diff --git a/packages/complaints/analysis_options.yaml b/packages/complaints/analysis_options.yaml new file mode 100644 index 000000000..a5744c1cf --- /dev/null +++ b/packages/complaints/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/complaints/assets/icons/svg/no_result.svg b/packages/complaints/assets/icons/svg/no_result.svg new file mode 100644 index 000000000..df2b14869 --- /dev/null +++ b/packages/complaints/assets/icons/svg/no_result.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/complaints/example/.gitignore b/packages/complaints/example/.gitignore new file mode 100644 index 000000000..29a3a5017 --- /dev/null +++ b/packages/complaints/example/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/packages/complaints/example/.metadata b/packages/complaints/example/.metadata new file mode 100644 index 000000000..eea2802f1 --- /dev/null +++ b/packages/complaints/example/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "67457e669f79e9f8d13d7a68fe09775fefbb79f4" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: android + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: ios + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: linux + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: macos + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: web + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: windows + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/packages/complaints/example/README.md b/packages/complaints/example/README.md new file mode 100644 index 000000000..2b3fce4c8 --- /dev/null +++ b/packages/complaints/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/complaints/example/analysis_options.yaml b/packages/complaints/example/analysis_options.yaml new file mode 100644 index 000000000..0d2902135 --- /dev/null +++ b/packages/complaints/example/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/complaints/example/android/.gitignore b/packages/complaints/example/android/.gitignore new file mode 100644 index 000000000..6f568019d --- /dev/null +++ b/packages/complaints/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/packages/complaints/example/android/app/build.gradle b/packages/complaints/example/android/app/build.gradle new file mode 100644 index 000000000..118ee1d92 --- /dev/null +++ b/packages/complaints/example/android/app/build.gradle @@ -0,0 +1,67 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "com.example.example" + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies {} diff --git a/packages/complaints/example/android/app/src/debug/AndroidManifest.xml b/packages/complaints/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..399f6981d --- /dev/null +++ b/packages/complaints/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/complaints/example/android/app/src/main/AndroidManifest.xml b/packages/complaints/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..19b862ec8 --- /dev/null +++ b/packages/complaints/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/packages/complaints/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/packages/complaints/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 000000000..e793a000d --- /dev/null +++ b/packages/complaints/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/packages/complaints/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/complaints/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/packages/complaints/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/complaints/example/android/app/src/main/res/drawable/launch_background.xml b/packages/complaints/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..304732f88 --- /dev/null +++ b/packages/complaints/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/complaints/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/complaints/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb65cb8dbad5f1a6fbf91c7c920af6cc33e2c66 GIT binary patch literal 2434 zcmb`Ji9ZvJ1BZ!Bd&yj{sSTqnIo?8woU<2|kX(_pDCb@klXM5{SWWw^L(H0zwqEJ%!~zrXMkK>T!J@Dke2_x$^XaC_phy2DaKq} zr*7Op8dyE&Ud;@#uo{ChS}>80ff;2H1>Z%2eigp?`ZZc+r}f?7CaTW4TH`ijGsR=b zMXNmb903I(xevKZ^%ctpyc#KGf~yM)O!ScjcH;92LXP?%B17e^(uxXoWj2rcmOo}o z=1O^Z4!bv3=lAT>upbAyKQN!z(*b~Co`s`hsn+i*eDSjX2^R}uIhUNKgdAP<1lmJ4 zA-ykgmyIu+RUS}xE6AEQQX=l$D#=5A3Xys{g^ioy0|2OwTi+KJ#4oF>k36oo7gVY6 zl`ExLOA$=Y`E$0nZ6pP-_Savo^>%a^st}lIHGB1TO3Lzt8_P?FJlv}ev1KXE5o#{y z_Tb_89q>spCurySBMwSJlp5LbLoCq1WZbo+^f_=DglWKLwHfnP;tX2ya)8#(ljF_60Zd4}4@I5WDG z=r{U)K3#!v;>3yHBV(h@mJSXa+Cw-DwqBH~`4nRg=?TrcU7EeJ!oj=i34+3#!1?k< zvIegDw`?TIQ7e(h6C+dzuef3E#8M$X0viydpFyckRDa-OdA@MdB=Y(?x-6m5S>ZT8=kGl)=#X)b| z#~APi3Z>G`Qq+6nqoQK-y5-})cPn`-*dNnI6fMh5Z^-++UAx&vZflD)vTW!T10^h5 z5TEliKkZZPf4+Laz}^9F1M0;`W@gfz)g_YlgEcGCgd;IXn-PG}>x0x%QGDqEygz$?vw)@GZ_|&#SNtvau@^h|S7` z5ZYO8{s{5p%j=s{W?bp0>}Yx6L3UM-pKN($FoO4`^+mBDG6e3TClWbSw{_Ngdux-J zmL_)ms4=u3Im}}fx~~4}_b5V^W85~Vr^!+cVte{>zF1_0Z=m=t$c03J#5;FUuxe_B zs|HD{`-u>#?-O%@{PUN0+Vy?dnl@eP8-Kag(#H7O8+9Fh`DS711DQN7zi7IfzxKXY z2n4C2HYuQ$(Z%dC35!XDU+Ypt7`{8%mv@*5lC($vc7Ii~?^wUeX1Aar5T%Ug!Mc)C z!ds-|z@qv&Y1qASpXQ3!TSw z`E~mAX){oH3Gz?kyNf;By(6UFKm3YnNN zi%`?{vOcE1_odQR)dL^Nw<;xTOn3IWsh^p`lF5BM$#eXssX57Q6 zVN5&@Q%W5Pw~55CrZ%Ik+!kiBzqNU-hBP5Z4ZOz=BM_QnTJM>8Rq%6}SJDetmzOKg zEz&$*%!!LH0DdSS@;#|zdrT`HA2fP5O4N_0qtl4bWYIJ!DWgWta@#gl;AYZ*ux9mS zMdig|=`IK^t;Tcg=5}MSIXUy6B13|CP0!t}MKSKw^Y?33rm17WX78n*cpdkQ9bky| z(q+06b5JpzVEv~OF)%lpi1-i3YR=0PI-T@RpT#!TJ&v<@agcT^qPZSbo*s*_tElpX= zI_7nC1rV>nMh1M|2a^+osbSCq7WVZTB_);2*0fWSbt!F8$T4cs({I05TyC0_&5_KM zkcdmFg&-V4bH7_p;(ZELITu)TBw}fq2ZMtXS0@wlY@qf%iXgH+?qikL%C!v*+U_zn z>atz0{E0?k_kQWtl9m?{ow<6kKJj`k2D@uOez=+l))PK!*q#y=yEiR@!hV5Xljxc? z>vf_*Mm2*j=r|;d{-rHcG>ct^&(VjVddLtokG8gJhm$Zb`st6~fH$>8g34RA!eHUZ zy`Fm(rNxCTL}|x_XzefKXZ}F%y#AB&&oGx5-q5e|=ZU7KXr_oMk|}W`Ao2)tz$2g@|tFU#fD}(Grt2pqh53{eJHx$N0D1>tZWFH z=U%6n6V$dJOsS8y@b)>EaOYOG1j2t(dmm{(Q&zsKo8Nd~mrxRv0G9c0IQqkm-X~Of T1VlQH<9 z#s?q}B@inZn>wmP$&^1Tz0*_MG|7 zH|Ko6bNOagi>F*#r2}|UsQ^k#1yEWlfYMR{l$Hvhv{V44r2;6eXA_`&0jwbb;kXE~ zwiK0G3XGqJhmRp9`xuSJMKnzpO7%=86O6@T>;oNZwFMfDMlXtD=y3wk>-84WPdt@M z#VDHAGe%=gZhIC;2+`=se*!EnMOE*Y=skBGj_=!W?C1S(XaMS#7nfEXz>D{Sx3q5G z;g-go?wm*v1gFd8{Kz*keqOS*w5&f-U@B}pclPuO>7Jq}{qp52KdGp!e4Bt<$>y6q~G5zwQt?ldUbNr-`;t-V^3p4kr=xNh1wGCIf$-JKGQr^L?`dgkuQ1 zJm|UULHB3?UT+Y0EDVaehS4qi=ydu5QW!Xn>$r2f_aIYHuxu$Au%%_4qwV5_)f^YP zZ7>>aG)gpeQTd|*{scJhqZ zJ9dH8FG$O~mH<>&SMPSYLWgr58HQO%g5Truj2^w#b@fBZHaO@$F>`EL$z+oAO-!7( z*-BnETdgm7JR?8yJU@`n_tA%V>;BJCw_z9A;2d^*{0pK}ZXDTJKf^04SEAAAEorj# zdP5oR&iZ{Bjf|ZX6wh&2Wm{EM_3KuvwWX)0`_Lm}cnm!np#6t0FzLPtr^5lA@qGwW zV|lzNxni@~Hf6IJ0ut#*4wxiChz^rNv{g=*9nM{P!=~U3jFiTdhYWgOfPIKgt zoxJXH9VEd9B%eq);w~!IFmg~%vQ?syNMA)oit& zF_~n^s!FLfGIxNG7{OlWQpD2<*+hcme|MZJmr|p2PXGidmF7Oy+1as=q&_OglpPr8 zKQ3MQh9N1kIg^u>B#~_Nt=m0tjP#$#_srt~NMe)hOcNPQl&)Exl9mCrs~ z@RH{CDN$T*1+8Te^gMj9mu-FpG^N4Kzb-ytFR80T-SgGxa{LW3o=l1DwW1NS~I|KXjm52mFWW)0$=n|}bV;9)r2}A<}5EB|`4LTT1MsVXS zTz{OI9{_<1foJ^)jtr4^#YV(K5x6g3A^<)VmR6y1RTEhqFVbX-h5f{Dd>p0)76gU| zQL}mtG&BvZ-hiYS!;SN2VK5Y;aG?c4WEgQ_5}el$icTRZP|)gV0_#UcqsbS_+yEjh zkM5Jdk(n`J?8e>K`|Y;&d#(NXpYcy;Ck%9S=53#&p6qiv5sl7M9COyQ`G4SPk_w=- tQ~;%=0w^sNKxwG}N=pS$S}K6j`UhpPMv$8u2HOAt002ovPDHLkV1lOzkevVk literal 0 HcmV?d00001 diff --git a/packages/complaints/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/complaints/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f55918dc1b54d1e9673487ee07ef1e64c9865aba GIT binary patch literal 3670 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 TV`li57XeT$Bh4y^ee{0-G(7^) literal 0 HcmV?d00001 diff --git a/packages/complaints/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/complaints/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..910eafa1d3a05a41259b546cf7ea0939b52ac353 GIT binary patch literal 6517 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 + + + + + + diff --git a/packages/complaints/example/android/app/src/main/res/values/styles.xml b/packages/complaints/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..cb1ef8805 --- /dev/null +++ b/packages/complaints/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/complaints/example/android/app/src/profile/AndroidManifest.xml b/packages/complaints/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..399f6981d --- /dev/null +++ b/packages/complaints/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/complaints/example/android/build.gradle b/packages/complaints/example/android/build.gradle new file mode 100644 index 000000000..2a2de2524 --- /dev/null +++ b/packages/complaints/example/android/build.gradle @@ -0,0 +1,30 @@ +buildscript { + ext.kotlin_version = '1.9.0' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/packages/complaints/example/android/settings.gradle b/packages/complaints/example/android/settings.gradle new file mode 100644 index 000000000..7cd712855 --- /dev/null +++ b/packages/complaints/example/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false +} + +include ":app" diff --git a/packages/complaints/example/ios/.gitignore b/packages/complaints/example/ios/.gitignore new file mode 100644 index 000000000..7a7f9873a --- /dev/null +++ b/packages/complaints/example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/packages/complaints/example/ios/Flutter/AppFrameworkInfo.plist b/packages/complaints/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..7c5696400 --- /dev/null +++ b/packages/complaints/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/packages/complaints/example/ios/Flutter/Debug.xcconfig b/packages/complaints/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/packages/complaints/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/complaints/example/ios/Flutter/Release.xcconfig b/packages/complaints/example/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/packages/complaints/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/complaints/example/ios/Runner.xcodeproj/project.pbxproj b/packages/complaints/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..69cdaed8d --- /dev/null +++ b/packages/complaints/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,614 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807E294A63A400263BE5 /* Frameworks */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/packages/complaints/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/complaints/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/complaints/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..87131a09b --- /dev/null +++ b/packages/complaints/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/complaints/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/complaints/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..1d526a16e --- /dev/null +++ b/packages/complaints/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/complaints/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/complaints/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/complaints/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/complaints/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/complaints/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/packages/complaints/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/complaints/example/ios/Runner/AppDelegate.swift b/packages/complaints/example/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..70693e4a8 --- /dev/null +++ b/packages/complaints/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d36b1fab2 --- /dev/null +++ b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4def642611f0102a748627bcbb13b46474e3bb28 GIT binary patch literal 125073 zcmeFY`#;nF|3Ch4ED1fS6rpFKlVeUHMmk9jksN209A{f$l zl*;*>4a1xd&CGGkZ2Nk>KbP-+@%(AGA9i_ME|2@;db{2Z*X#YcgWVOWJqmjO0Fbi2 zdeIR8M0Y|_V7K_r4@&7w93V93YJJi2=0l-{kzG-=tAx*t3%(BJw8h0tvyeqn7f&Ey zyf=#~RJ!+E_3GGHXCYC`)Ym~`j_V{ne}}Wb(5_JDR;it50l>qJ6(axtB4BL#)&C2Q z3akFV;29wC|AJ!{!v7bbcc=dM7XbM0T>giG|G@Bnx$qwt{sY5*jQM}5@L!qu-!c3L zhX26uUv2z94E$Fc|91@kf#LrL1A61kVGfx47c()P6w~Fjq)c2lHtwICaJhf|*W{@t z?IyANx#zl6SZ1SrUDgXt^ja(7v6zPo@yi3Nozqk18QBd>A-QdAvlFwy8s{@0ocbfE zB8E%KB%fY^dDO?Qn2p*y8xgdz79wj?a995-@Sa#Ex8kSQ+S1IjYgvlQX-hg5)a694 zpPh0^;ciTvYLacD&qs7lR-tn4sE8DuGG5v|<-W@A3|X9?oqRtbe#BCEELutOnM%!l z>A2o;mL2n+IeWy8qy7*4&v=<`QFTmLi&Ycnl!{E3&%$<0`)VWo{x*pOsg9K)HKBor zU9Z1ym2J&#MH$bkgfJ7w>tm&Vw^shH!+7hSRs}lg`H8b-GbY|0eR3gLmVd42tec3v zjgr&FaC*qf8y@OQ)34Hp*Tzs9HeJi%Cb_{p^BFU7@rJ0gb$)6y0kfO|j*acl@xW|338H6b zT;(dqS);YHd|X1H>)oM3#I%ct-?tRIzOK-|h>|XypStV8xq1@!7nN&@WKb!@U-b`9 z?0km|EBT+ZRSvnm)-ge%yb!51>HeE3JjG;F!>3}u%_?JlXF02IqY*vO-AI-16DLUz?+BiH)q)i$7*wz5>q4q$vGi<&%vQ(pHM;>o>XaW@BiG@=n6Z*+`cts|)*-zqpCfy+ za#zAx&i{kV%Ad1LCxLkBOVI`{GWo=4m*-g5a#V7D>U!NkI%u{V$RB_3P@1;kQx?~bB@AJ)8B?TsS{*CVz-MVQjC%UD2hbsHV;U^x@mKG1w_4{HKlx_Sdh%a^Wq4KH#UloGt3hR9^1Dv zq=uU>S3(8nG*(nTDpvJ3tsoGj;;!dMsKL88FUkDl=ErwsX+DQwc!g&AV`-pKSwRR* z3AOkza73HNXVDfjc=$p3)r73ixxC-!|B2koFjhNcajsiIxtQ4TW~ zUvI_?2HgucB>8v`KoH{tXx|jOx5(5UmKj_$Yrp5aaYQDOF0*)q z=pqshBhJ?J9D8EgrO1_`F=}-E2r^N$;|y5FH>ItV0HLKCcXA8flaYK1wQx9mc<|7% zIWsmY(dmlt*h~MsG(UAsWQ(o3jeGNJHT5pX+Wo~Ivn@w;*hOW02tpy7qP>#ndn4OD z9gkzVzU0;fx34^JF;nA`7TrGmf(j#?Qq)$26q{vw&lbQB*CLHZF6o|6 zAB(LReHVGWtwt9bqtRBAuBl}+nQ==_TYF7{{!!Jo?}w&aF+-#6nzy90d+N0xL-Gop z;e7;}GfJY#Eqeetfs%d%5tK=a?s{~m4{pG#MY3Q`fm@y7R=I~1nTcNcE-0;OP{Fpt z6a0DIw27N8OE4n0z<7-l>71qFiJ?oxfT$D{@lN?Bz*5+snmeGLpz z)z?#zD)trES+nfi+^V0=_pMXv4(388Bt(%sM>?tc`M&s0 z^6iS!r7GN)dU~RurKr4p+g*6vF%~lKo_mf9SJ5k;gjL*o(C-C7ObHjS^Q*~4)?gH;Rne7@6>*)`*{!Z7rMsbSJ@7Q)n5t{DP z)M1~6ptL_EyANX8q|UE$8xJeIs2fO9z5VMgujKV8GDd=rX>w}noj1xv%~hAe7Anpc z1_<)WQGe+dk4xB|1($29^7Omka?{^4Xg=!pUG5%F1GwLDZw6#ZziS!w=hL0sAM-DF zvO0La-qhzZHEZBQqFK9I2ex*Oo8DhLhULzd}No` z?3s0>ycBGRMTVMWzl-+DjJ}oW7@IqPRqW`mS8pM9G=XS5lSgn$zRhz0`3qkkqf+-S%NO8sqrD$ciAe0#(l z(LV0i(alI?5PB|nv&_x*dOjtqMEci0*iPR49et#+8nX5<*IH=v0!7|&cl{r{dbzv& zT2UwXuhAG&YY~o{t=3>iBVfNSK}CiQMM(rPi}EmQpn9Hdj&Ni<~}x`Z;WkVpxk zaj7{x>hWlN`N-4j!E%OYKH3DP0VO`L#l`d)?#PdO<%Z?@M9Ge+TE1ZYH$n91Gm{_$ zi}T|R0eH9n5>70h@#PC{n(D;Ku+CDKiwKhU7Afo&Za~`8>WA!_+Nqmb_SB(&k9oq# zl)v02$CH1&vFS4Pds3zgYkSr7C6OT7%vg=TRE4_GYlo})_0E>sSBE2J{k9M4s*s~D zgxrR#BH~aIz%@7Dh#USE_m8*X&)4_dOQ-A}ItbK+;o}tcYxtCCG2IW67X3RuC{Mbt zTNcml77OXGN?kyK7a<=;EX_IAfUgisD0ah=0Zm|aCf!Z-VT%D_hOFE z;>4@sOPc+W;GrxR+odhl(y#bmGj~b2#PvwcQWvB0-YhEjzUe9$up@ESm+E@eZxDQ* zz%$Cf;J&m>xx?Lu&fYzCC1td&C>Fd)zIGWR1@f!Ix=x<1c->v@e5R^0Xc;VB&MMcs zm-Bc0pg6v#(f*8Lr>cdef)k#ISsw35tBubVTGi|Hkay;#^1*;e=smTNpxLXYXx z0(dNh$%+J2Dw~F!VGaQnx>c5B<7tfN@3G3FOUHhqG!)4yS{+>JQ7tb^phL6N5 zbE*ZkBYD+{qsgPixsmxM6cimaswf&d5MHOW4S%=@A|QW8f$G_WIK&o)Lov&ms(@n0 zDQNP^))XJN=rx86R;REF#<)Vq-|t!@kJ+fD;D1f$oEIbvM>=A88IxV=QiMrIVOvW<0vp||lUe>^Es_fALwZ0*gz_qrlncrPz z8!eB%Wl9n2OzWxoB+}?W~GFgaYcrZ^aWS9I8f>!f9uTDv5R1g&HVkS^-ywR1=R@Oz6R+h=|tsPB1bIh+?7H)AZi(~OGj7nAaIb~~FrPN$ai%bYVMBs) z{aES}-X0t{u=44xrx0$+q4%~R0XIFX68wvMx|W@|Kramz+y0V3K9XSr;yW0L|Kk(i zx5JAU4`jl&yukJy3y~B}g?$hki|Ck1ipy5T`S90mj#K6L;MTmO=-){~-;_kZ8Q__1 zlj1^u*1u@9hfDCuEew<()Tcg%cc&gjN?TvNTPabS>_uKVKFAoXi+Flt0jVy+!A(#9 zd?PRCG+!ldq!$tq5&)m##%zvJj8?cM*W`}G{n``)Xgd4yJZcmh`EeM1%GCD*Qp_>b zbEvwHN*lZ9Ned}VY&WAep7Sqlvy|*RlPJoE+@r@<*BHbrJ-LyND1R4ax_ffwz^*&z zt=(NIg*{qV%RAJxrIMw@?_3`rUaq`0#m3*m++6ADZ0SSkN_gdiM-C85kwwI0B#H_SWecU21HYXJmt6j3^xTI9(@mVMin#Gsr`XG zXG*cO;Arhv>B(zPGv6N@R02UYmQ>6a!x_!nv6P0<&RZYi$A3y)|BIq{TMDDh)ThdD zNvxSW!zY*SRIc*x7Hu(O(#vAEy}$DZ%9k~*7L0=yB7&NB54uG=ep}QWr+cyyrbFAs zM#iWI^}osV2~a=9Y{<-3#KWaRlkuUhMgMz-k4vVOi8T5vcnopDNQFD#AC6HC_<BqKt(X1GJKkYFQO{55N0&NciN-ox~g7B1-XN073AsjuoX<3ta2@7jg%EffW9Cue-zaEnv^g0Z=(cdZ+!053y@I$ zDjm`x*k)v(QfsDw2ywf#pi$($yo(;fdv}$YPWeM7d(})|C^Cn}YK+>=y|QG=qhF5+ zDzvsXg9FX?7w0f<_d>EA{Db4C9MD6kuGt0QZ_ub$YtTW%;AOqGNbmF-%B7tO5XMuH z;0urjx=wB@Hk>s>w#)cyNE#0q(;l8Xyp3U4YOccK! zk-x(-=57NQ(YWb(ld%FjK}K7N?{j+qX7s1bHtfr#XI_0=SVvCDfxosw@1D4uROm4w zpu-L{QOim3-G4;UGIItJ--3p_B$dGKv0nP{(E0chV=sp7Fh#j-@;XHl7Jk}j9oL14 z*!ry``MI;dEUqbeOR4b7pG&)Vy+2?E#jzN>LR71+X4_hqzD>8ic6YXG1fTEs>ul`p5$HPM??>V|#;j_`(PbyA74LRVUMKw5f^16O(YNjZk?!_H_II6Z2>JD+LCPhI87NWeiYw3ed~!)tj^5G^sbeP$qB zN1F`UHf%Kzx<9`-??fs^oxVoXoQNZZy@lueJ&K0Woc~tR4$F$a5)_Y;yGGgWuh(#= z+}&=s_u@P>iwI|`1=|RvxKq{(Ym-~&nO^VyAeDS41EUMRcSluey*KzD*dKF3y@o^^ zwo{-Xt0^fnL=d9AsH9p$er9!j*qr|rRAfHagID2!Y{C$AJUJ|6-CL#f)(rQHAziJC zx{fvHV-Pcr!heD%9;0$P?NF$UnjQ<75qfR>j<5<6DXj^>eSKHBZ>v*T5zF(f(Qonu zDJd>9h_GsX6#0E-$`IaCzPkL)c-bKAn6dIUXshqYgH74#8P_?mzK2oR1x;Ep+|a}! z8#aTAGQ-oH;{+4e9t+x9zqWZTp=$Np);9OOWRdI(3Vg(Dfz1nlia61Hqf;8&uej#D z<@}QcFs2dj0g)3#JMf17{j!4Lyt6IK&(tN9wq60XGO%Z4uh0&j3WISU(JY0nVEiAY z8IGUAQ!&4Qc`kJ@tyk;?Jo)})^7NjEqeGy z?RRIGMiO!MqcLIlE$_?CG&_u~Mk2UGWNh9q2Q2O4fFN z7<13E>YyH*%CwPjKW*Y$`1aCB;XuIv^$=Nam0@L8SMP1~W^*>pfsx33Pv#LXizu1zWdqv1DBpRP9;R zb{LGmyxh9&q%0_HE9Ttul(HsND6djBo>2&|@8j|OkeGaTZ=Hq2*7)8pfXn88fNlSX?RWj=)GduuC?!wbQCe= zni2Xov65hb?wqXc#vfG2r`zv&NjFqjKp2K;#y2Bm7f^36JrA=YAvI8oDu>Wnf$Yk>O8UKDx6!qK>r~l?6)gU z5B{y9jyT}%Kt275+YX1Z4$yQjL_!sppi3+YVGI`^f^Er&O3rTdKv8CD7|0lH2KO7G z#X@Df)(aFCsU5{n*c8Y|-pJ{z7QEBWTuT-TKjJTm{!)|MOtR@*71UH!Z3CR!oH$kPhGeT~D`JNF;5n zQmtrW79POWB>}Odq(q=bu6;Ef_g-FQ*o1r3o)Xfq$-2L3dsV#dnTSVSNvIC|R!$MJ7*mI@<~co#&9xwRs!EMtaned)e|F=NnU0ALrrgf7cT_e0k0jyRgerPM2Cu z+^YFwTviX4W42goWouvi<1<-#I^UWYX8l*{FEQg^(Arg%4`*K$?xO?hn<0j4i|Ndj{2z#)l49u>h*+IyEYkzjlK z^p(T%D-r3z?L%4?g!F1W!_;N6t|wi%Wb{~(AhLh)rDg9^A+jL}YB5<<#31^c7$tNj zP*S)$%hu*@tpU!rF!++J?MD1)#Z;GHxzdmKZ20i5KIF%th!nzzIG^T`4brE<+>S*b zWNKrk2MfGhLa+a`L*(2CCt{mHjCz}BDAuZ_UVa=JQ_J01F?n%@lOpamS*F6$MpT0_ zuTFGLH#$dx0;97HH+WG>oM9wl*6c2cO8&6;8yii0V?Oe4lOgq;9yvJ2 zH2d;_TSBFr{N;11fERVn_M%9v=>#g^MP~A*c8Z|Nkcue{(yU_cLTL&uPq%ODp6WnO z%L08DuOx%Rg$n0M?4GYfUcwDLlCtDmFNncrdq_oUSH1+AnGJ(y*yH>nGWZ>5C(mY#r1+)nn4u{_<8XBEQ8$p)tE`AG zeUm{okEDqB7vtg)ryrrZWqu6L_Wz7m2SU@IG6sK&3CeS96t}gnpKjY32n8;Bt5$+9 zUNlR2qag!}`lt$HfoQ{=*B<-{I9fx~AL^E0)m*XNE0y)eX5W`YO%4D1CI(tUsaw9q zzVAezB`KZkG~2!Pos4=ta`_UA-U#?8jQcM^27QYIBLDr~@^*VgtE65FY}Ed(7Yhw~Uo5SryKMUdWlAt=zbD{AjqD_~v@2phVVGxRr2gKQ(j z3%QXVsR8-)+!m->KJBST?P2!NgYtp8KF$yirf&J(u&{T^%6*FCb7RKEIR}DJ|JC7J z!T&6Q?zmheTfzMcC)q`ZFPibVO;KO+BW}WQyc8O0=skH4wECiRV?D2Cv%%M|Ck8Ws zvOhi2MTkn^(j04_wN*PeyQA0@)Jm`|YL2x4-R4dLs=h>|D@dptPK6yhu39Pj&0DB4 ze-Nj%O=MDJ^RZK_U$ZnkT9(}r3Oh@SUi|*xxR`h?t06NBoJe9vpAR z_9xn@D;cr-xA3flQKaJLI(T!2-I?&S!yB|dyH)UhviuFE?ZftGz2N59`Xy^9^(U8Wv|RS$!*9Iv>lU^}!6|hoUre|YHW0xbZ*R9Lo5mCP)O5vQYuA@+ zXQGpR2X;ZjxYm`b4>Y%?%+0A?Up9~^d%;nG;RfwWZR5bL6OCOxi0La>0VAMMPz#x} z%&0WCIS}^KPS|46Y=cpk+GdSi-(vz^&O!7a>{b}NxFfhLUD2+LZ6!|x2C9c;zI#pp zHhHZ?U}1!Q^ zbOtSz#i zveL!K)b$ESC)o&h~vdyo11W57i04h?y7$H=G8g!G6BHhd#u z{9-+MIuNz5U~QMMYZlC1U!AlJXX8@_(Ct2wDH^7i^Y&u)a@%@~!EAV& zCzM-pK6{!lh{EB^oIp#Ee``Ocntc$P>g@t<%e^P8qX`=KKl-vdfiXW(9XL5mPv{-5 z7{;AVf((rw`nP3tFEC`#Y=1^UTx|I2DN^T;IYA8}E@3F(QUs@9P3(NLl8gFqILiV_?R zuX?WG1bz*ZMCZ8JJw@hD(s-BRnI`HBd+1+EcV4a2H+#D9t9ytpv?HN(Lu->%jh%shv~>A}-c>ApsV z40)O_VIOkIZhg$pI6NV+FM-TJtnR!1@AdL#yX@t{c*1J{wjAWzTTD;{Pq?>?0zqy>(=J^h`57*3KGy! zT8A`!ZHCFCHA02HZH#q8sGvnPTN&l@kv`ZB+Q7`50v~$Y!QfKuNka}2-$KUQE?Z92 zdkpqF9<6x$-9-0iV1;#)Y!w^U0k!-5*f<30)hG>{wR}SNaAuW4SQH6dK+tS^U9^*NlWRX0CusE9nu3j6S7e zkfKZad$$WpInS0a*!8$V6G^LC2mgr#b@6&homL69bB6JL)Y{xoBRHL-F;BeMyG{^8U*tzN zw3_3l6(Wkhld+Y9Fd?+ujyY`oNPAek7T~@kR|?LA462BX&HUIQ?bW;RSnAWs;6#db zo+Fs{Yc1=A8cuU5zc))$qO!2|=MdQzk4bMk%_!=-F_$=8*|)QdNHXL09m5}A^dm}E z@NFKWICb=?5SbK=cf4kJ!F^4jH?eh!D!T_&rBe`ng(^1I8r?f1AcM0}cKGzVSBjp; zS!J&-Dch8(twZh-8}yVn$$^j7Eo2)G?0ACCl}(;+pTdEii>p(YoN4+4zJhXFl&8%S z%FIYmpOsZCx-A)FHpo}lE@Iuj-Ee%+3wC+{4|L}R%xvumlms+`{0Nd3fA>i80YV#G zs&)Ctk75J{^WgJ==5Njpf`~iG^I8$U)PNzeJ@wuFDmUA^RNx|L?d(F%F`qW=jzZ2C z#;?1lxIvkWlfu^JZ*Kov9lj%G3sig5KbvAg7FKhj@`|@CEoY!&+B^CQ-9RXH5O=_F z)3#RBf}nIJpLy9;&-|NA0+D`#H#q`sMFR3Ual;giT23?adcp@-diF7LVAjOt#{!jd zNt9~vsRts@{YutNlnmP{OF<8#JGpn~bn&($AzPZjcBRh{dC2aDuiw!!hK`ThSt8c2 zH*|-&%Z+9(L)qXz43>$?a;&lWiUf*d}m1(@XIgst|d z5xs$_p)Q_deH~M{dvQ+>iOfcxQjU7b78$1~om`~9);fGodm>^!0y*D#2QG{nR+*h@7+)R5 z-6;AwE8fUPM*WcLsjQ&yY>q}s3DJdp`5Hd-*fcut3cv8|Q_+S~$Ap$ll1I18|J-wi zx4QZGy2yn@=ozWptFC_kjuGLbrFJMcBQtZRxVUoMl@@yZ;$TJa(nMsWa{bAtjADCX zRV;Zm=tOx%irSclnk(kk%BZamWh+|ZB6X()X5PKa@9jGMD7wIDfb%ZM^bRL~Xz8aN z!k^5j)R*JLI^}HHlUFbKX!#cKaPlizA#T1yB+E8pQi+6p%x5~=3&)HpS{i{s2A=+2 z%U*ybBJW&K*+@(Nc)Qk36|Ni?=9pC-)Ws=Slh9=-PCOnS?FNmM}hnENXqpS#0sIvE;)^iE*^bANnDNlXQrW(;^1e4ked%ibX zlyQltz6)!kYGj-vhghQIj3c`e9a|c?mK`J_^aGXYg|JKoQn=r~o zyv9rwqdebC{|Y_Z^D{}KFZ&wB*==NQzt1IHU;1Ei+k$&Gxs`LfNxi4(x#GnTVi)xF z!tjxsro9-B!Nk;}IDWN$(TEgv>*^M)c26a?g&|Qk0p} z!V4HR5K_T>;ZIAq9EpGvzGrB`0S9CLkUpuKr%H4hoGE5wsbeLenT85fj9zTaZj6B~ zLB#hU?GnvWJ!~vMWiDJ|F4pSvee;*^&#>0(V~-7a8OLg)25cs1&ViotmA(CJ+9|D~ z{Px0)%qiHlnTLP`S}rvJ!)?DQ>i|9a5NTkbqJ3u7Qe>i4j6XCCVs-$d(pvE_(2wiM z;3IO1CiB>z2br`_;U|_eZl8KhH0h01H^QFPODp^)vdbV5@7AGu^{tP2X?v)-?pr%L z5gw$ne#=8L=*P45THAlD-X#O%X z0$8^SJ74E0ZdU)vGe75-^I@xk_roVnR0;t`md>58$}PzW=w zX~+7z84G??qTiGJo*VKwy2taD{tI1Yd8tX+A$ogst(*HMEcl#4lgqs!P;$G+rH5PpO1Z(A%mxR$ZQi-*qUWAjYYx2sF>qQQ)7ZJt`RLVttqoVJ;| zbOsv{Jcq*DF+l%|29Qt*XU2Di80o5E8hGt?PgEfce1RcSSkY!A#CK{Sdb?Lrd?; z2OreYwy(^;IW=zfzs;$Ol4cO!1vAKMa>RtWbV6RrA-3W{8AunC5mt+_MMNvgvBE$B zs(_uvU-6Ob9l=-lFQe@_=X1;$O!%l##rZPJGP{22;#3l|obZKl-uBRPSD-Liq@OuZ%nSmkaTUC+yjW=x{c%V57MSG zTh3sBRP@G5U?9#XrT}~7OZ)XHGjPYdGj)s6KXb2mZxgdZ?4R@3Fv}%PUBJUY0#>^RSg+zBZiG(8K=@U!wooMcT2|yA1&r5HF9i zN^7-z_>FfL9t+maBKv?C?Z8t@@|=tst@=MD7pSQI^}n>REsGGp|4B3ngc0K-efdDn z=Dn*#N}LddEHCWuMS&~M(nWR&GH>x>{K1_f zc&NnVKL#A40oYvxKD-7uEDQb&31&T^35X+f(%&*N{mGZKDj+Yr&=EydU7RT)e!7tS z&D!@Y?8XPZ1pg%zad3ZlgqMG}0CPS4eA=(hR&IR2 zuExCA-gLiBGfbP^5i zG6;RjZs!(&+)>NYizYa+2G7UiZN)agRflM|8Jw8Kga;5xOm#?nANqE4{LlGATk4H_ zQN5C7+yZox*$7M$Fitu#B&ch)^-2)6n05ySL@fed6iEBsgz8zEQXMKrrCmVnZx9~9 zez5SEy6VoJ1<_eC9$%>YuF zIv$R0Mf%wzz~7?gYTHI(Y8Ff)AYn(ieuH zxL^rFji`2?zLcefXL}SOhQCq?OQ_E}kw3iTZJ5?@5x*0Yns=;?|x2O zt^)f=Wj~sW=f#-P?mBQm%0W*L0)=>kxRvWMtm19FJ)qi{H)eJ&(tOT$oqM_HaQ{5_ zG+5r}!AB>;Tc2eQx1CK&mr7z?_igqu?Vt-5yHxupqtu&7%;b9)GCqBh{Px4b_YS${ z%pZbjQb?=FI72rrR8eIAu4pDMIYj5dndkV)$Z6+QoY3)@9)OS)Ni}r8l>sPEfZhx|<01Th6JnEWNOV34A$-6lz`=W~J%;Mb#>;Zw(m7 zEQIe$1LB@MKKLVacrQ$0K^DM?p}oB6P)WexE0(ETd+#HbM@_%n_u*s_A(JdUY*@^H zce5W;)46(~2+`-xtX{B#4dFz#=h+no?_jkqjRy*mG!p-1_@|h5Ka{mM=2wpQqI%Tl zTPA-N0zh!HosMq7Rp_}iHT%gUtF*$Cf5|};s(o1~+sc7eORjKH{SH?NK$p!M`F@d6 zjTdR(?tY|;<*k9O)xob%s&Wa=!tAb~;^L8Nh!hp)IhzI~xPK?&Zh^aId;7l+yo;o4 zX#rZsI+38r`Fl3!v^|%|Ig7oRGgtUJ)>{}>wH&v|**7`@RDp@ESaF4{+x@>PWw$D6Q`DO<-QN0RoJDc++tmnxkHITewH4`ciaHJJMmL1;%mP6Hr zvPGMx5FvVfmI8I!kf3}6oDg4SsBgZ48BG}r{UE-S=pcRhDG0mHrdBvueB%Kxbb^y-M+S`-#B+I%}m*}su} zd6CH~YYguO)hQl`o~q7APw%0_j{w**<|w_6T$t(o{lbKi-GrQeyvir$2MuKLOu6TE z_5Py3vpr)1L|V%fqW{xYc9=*ixyP3ub{|C6iaP!_+-9k&tuZc{)a=Bj%9*$KP!Hsie(&4|V8%Yvsk!&((d<**2HseG z*jRVBFGs^}>Cmg4ReAy($MaLIuYRdyTN{8cZ1#m)i95%e*n4}ao7SgAuv5Tt7Do0K zfmhZlh0vk}<#XqR%Hd9?I;lM3`m3&kS`%4fozcEE{uk2nz4G;qAA(J+;;`dJ3k1ef zTB%7iG5zgX@L6I^g+pOvoIUTwk2|kaNA7y_m-^F23r(`KTe`%*mf}kjXu-2FjY<65 zG_qyV&C(e?&yq?uR6TzQnN5Tm&G>r+W!d&uW?#!K?QlYleQTB3TlHq__F?7hMjCT} z%A?r4Om_NxofG4yN_CoPd!Xp2;9%UMW74DC4{5<{8nOu;U1h6+8)%hVQ_!w(Z52C{q_H9~c@Hf1D$>~j>STNrsKh{0ab)HmlchVaT@aN8?tbHEHH%m1!T<~>3_Rjk*t7Qy=7mnk4UyW%%tdhyZc zkLA_>@Qa3~cAP!s8l`Gu0#ep>bNf)Rt$EudefrS*B6w#QjSi7>@in!(FeCCVflbS6 z3EFtLu;Fdch$w?dtA0v0M2-4_JZ1Anl--{z&e!8Rw)CjNN2|NXpY&bcB^4w$C_}&3 zvn-^q>rnkbNcHhj^xft6DSc&oa>srN3%+aDHggVq>6VF6p&h*#Rsa*ajp`w6tYG3P z`xT}3dT^t_mG9H4$D?1vHInZ4Mf|MZID+Af->NB^RXcs)DT*w=oq#01`>7uJ5;lIv z1BixY-SPm2VIIJ{vYk3&5{sMVx*Zo( zY=$l-Fc0Ot9h9EZ??{@NjSA8nbnWO{jYh+!Knk1wX;7(8pB73V zy-^nql)&MpT6S(3PF-;H2`JPv^Vho*lPtxjGS){#Fd>I-k~j}Q{?dnQgjCG~6e*4T zuVK7)Y!3H%R(`C*`V4L1@LtIjo_GE_7}$dWs@6JqAiK&^!M&{__Ik!T{j}Q&c;IDY zaprp_{Ea~8cBZ7cqh9b=DFPCd3fkw&;&FBUS<2#0cl$-3+hm;(x=^w^!#g-hczA&5 z{!gAB#Q$POc6;ak*VtP-mgo$G(Cu0vRD1D5eZ_gh#(-fcpAI2EY4U7?d_2%lhLX_) zUNYo&2BS(2s`kygBlWi$5bPrKEkui^R(U=u-|OGTD5|lVkaC4(?&QwZMP8mH+T1FR zJ49H#F9GZ*mK1^{nnw)N7eX6d79K+?nFR2D;h;heo2qE+0mQEUEBsl$E1-SnYx*w& zaCK*~J=_q3FU5AgP5{~W!qb4Tz34lVfS?ZdBl=rU=d>_$Z3y}jmaVmDfU8DP1$3my zeVV?iI~|Kl37zl|etPJ%b-UNa5Lrvi#+xy&+9)fZx%5uBAwTZ{3xDM?zs&c|_^(Re z(luLAnA3McN5;y-W4j^>3kz@YM4i=(S+z>@ZIgFHm?k6^ng`H|B(+b#QK-8`WJW*Jtrm0l*YwFV| zN2weq^i2ro?4kU}N0PfcCbRQ@54Ynpvcv-O->)@D6g41r+Na8a+FJQ1lJ3i}5RVHc z$h&``6Ru}W_a}ZJceS(0-QvY}a+$buiWE(sftdjeuV8sVKu=Y{ArD z_mt~jOCX&|bvvD)V0Y~JCaj(=SF~S5NMj@}VbSoz;;(hITo&E^5fFc)<;m*)_HF6eyNolW-|J4Ct!6# z35RNmgq(!sE`LN4$?{_&s+wy*^39=!?HzF>jRvuI}EA{u4DV3}F z!F9j7N3%t(I4=}#?M&bk0aR<4z^UZRQ-mHC)04TC>7zJq~S}f{4M>WZymwyEIXT2nmqR@L zas>{Ors(OAaF{BKy>Pylb`F}jQ)GBdClM-iMueW%KGB1msbCc2#UsaVN zil6+PX#f(KEB?hRC%a#KkYkLTUOQ5qCO&$5uTq7f0a;utirNs(uucOJ^4bsQKa^n&4d`bMbDQhqjnsMZ za3Z?m?Ms&T%{i>KOjqzHf+TvDGBoLNWv7^`Ro-7NmV-36SI~h*3*Cq0aq6Bvht)ah z({c&J`YVl#`n4*tu1)LEj*6rEN(w3}gPztjyREE*8m99AUDbN{rf*XaNmbax5#g1* zcN%ym-x>qY^yjY>yK6;s6trm+M7dyeT`@wyaCI7n`2?CR+SLxpFLN@JSi4)ZVjtk} zmV$JT#UAc6#2JZx=iZvdOO~~lPl)@?GWB&?u=T{%&HhJ|HIST@8FwpslD3(DjD$0PS2_Rp+h>eFFKwjyYrCjEF8|<5b97pyTP0E>4{A07Gf+x+ zYk+O8luiE(T zcjRW0OPGDlSiQ|nN*#Vi5=YspjpNI@E=|Mqzyp`cUY?>7 z6q&|0{^lvLGN`G%Kk z;I9I2-z)(lnLYg5ma+Te-R}n5>xDYyEHR~dOobn?L5nN|m5LDWxTf=?Z;$-(se9Vb zDmmxzz_d=~7G}=xSrEjv!7&+M% z|0@O^bg-A-pmbgZEY@%kn>=VLnd4;Ds}Js|7qHx{rK&DHcJ`G(dlu>I?ms22Pma&$z_$`?BplTa zS!C~d1UV2Ia9ak+B2cEgS@%$DtE|*PcX>?! zZmO}Y)|j1-Iz7TkwC~J`h+JM3eFVjZ#^r$4ZWtr;EVmZ1P)+83;=Q5a>9-3Fhc=@K z=cl9uXh?)o?<3p2UUS&6o({T9@o`8*Xu=x@Dipg&fRn*73iQWeGPH6r`D3#BS*=Kz zhIU!>f7;fn=wIgpbJP_-oO%<-qgtd$ZiqLNdGGT6EnnqtAsH*LFP=&WC`vQ!XJ&Bb zTdB=FY}71d{QmUfLGNO1jNg$1WJ-Mh5P50G*Lyu@d7r}HozqfRsUhBh2j=3$7;++P zPaY(5QR#c2Y=_k0|v5NE>v0<{EY{_S~C_#W73R~QAa=!>;#3H59*L^DJvT~b&Skf zPu^G^$@WeX49OCCC;X0>y1VptCOjBaef+yNEX*X{$1N=o`MP%X%&24g=<~YRL6)y+ zs`Yr`E!{4tW8GsFIVpcdHs#vgnSp5G$lY%FH}oKV#su^NXTq)XhNV?=)-)e1q}c$X zi}#m<_6+-sJRahtW$1z|fE6|HM`6>^r7GPDwX~$a8nR&|-5F$Xq<9K>yTEJjM|RIm zJswF9tVvN}|8j17JoEUk3HctO3SSG_yn+2JBUCu;M2Tv!(tq8{ZT!m+{Xy@Zts+XO z3L3zF^^4~shHaYh56I@Cc$n^4**hu!>yM8z$6AHBLaRwKBl~!y7gKQQc~xy>vc#Ws z=Iwg$8mSeVEunw6ryRz{is?}hWP`0VHb)vC*tx^Gn}Y0e-k{*7FKJLH0d~ZA{S}oQ zm1oG81m;qSdVJtw5l*|rg4oGDsa24;J!{;xmgTFM@D#cFZ9bMK-)Po}nq>iI$@aj0 z#L)7cP~&i*iZ}U&gvFXpj;LnkrGSrpU&n2C-q}1M8^ddCFP0ijKY!&F`^wYecSzeQ zs8~jf(QojE(uFomsat#ODYc0nil1#-Tn4g^LXq2mC`b zuI7!jR_jZzOAGf3OKJ21b|eb;W?wB1Id{W94pUZDnd)U!n$GR{`F9`XU_m24S=r9} zJM^C}oIzY?r`z2e3`K>1lewB3TF%YAtyW)Tv0WS<3HpX<&2MC{NwA0cjD$|wVHCO z2u7yM(g(b;^3GI@1IG5*jY3^9mhZ=t{YIDU#@m*jH0qXXNu*p)@U?AQqH{kdM?IZy zF1{MVa#`lYnU}4QPvGHu0CY2fpa|_$`vXH25a8m=#jw@Blp%Q&_&DI#?$pY|R-q`(q zo6}96(=~AcN~iHWlPOf1jQD{3)TKNrc2Az7S#0aJAv+D-%PnN6$PKM-j$Zc)OwKmX zEUn|;BP^@DB(C;tr&|$bVHe>d>LJ?q6jv`LfEZpkwV(UTd_hncUdXT$1C76N;QHqv zsCf_d(<-!>RsR=lw&}3i{u8q3>pi%56{9h*!1+iIBbq4^y*uqf?e|h#Z%t=Uu8l5$qP`MCzv(fo?T5_8Z*r##I z%ju-=2dcHd=`eBJWJC+kc|w9a`ZmSZ?)>D%Q0Y;J(4!`?CqoB`=s>VCAzxgh?qbep z9viV#m$&<2?biF`{&s1IuUYIlGg9lyH*D{dWXzrQIVOmpR{q%CzLN>9Hr594#{jpa z;o0;KfV%h&GVwOyulBO^mG!d?Qhgi2ktVVEW{g{7WIh479Zt%rJ|}b8(Ed8dupIm) zF6m;JPGn#;KUwG-(|I4Gw~cG5+G_+WXC~u&sZNZ3{ik6ApIK+;A6Gt)O0NO@pfnAB zWUj`^M3$cd#8Nlc34osJ5c-Tin7C!yw#{_)x3aJ2dVz zT_f%;RH}{;kAoe4&i}c$Viev_lAUFd&i*&dyf5o?iSJMJf6tg>rnsNEt6)wse^9+c zC291ha#8YXantTdr!apIKc`8SDD=?j^wWM8J;Ivk4fRKob0VnjTyE@Ar$Bz^NNprY ztKn)R;!xi4?ctc30$yG+Mq;|PhDBjHjJNB0cO)W8N%h0_|Y7Hl+q zJ)gR-9c6fqgf*s%@SHFwiXUoQZf=efCQ9}&xpcrhhCdA?v(yK zXs>c;?-$%ON5E*rn+5qz%LG^>MtiUwNib0S{ufntr;Pt(Mq19xJcxIE?@^cCz*_`d{Nk zFVN0BRUBE4z4)}JoO7Xd$+%*UTt(&S))y z%lMaKmL|`xT;HlYC5B0Ni{zPReO~6@x?wy*@o=n3H z`Gj`*Ey10!;MlhUvL6AlirpIvO%*f!i?1lqctb(a=^*Kv&1(?O|9;xsKoxsv6W`!v z)_w*DiYRB1;YZFWiA_<&sAcsS8A!UQtm2%1$h7b%1lcaj4jGbb9Cszyg@evK`IXUrmF_{c+V9&b zl%}1GG+R|d6wsz?*)~U~nWk8njG3&<_@g7UL6hVr{&fkYu=Wb)k6m3qD`}hDYnekh zk_;r@5#<-SR0LhPcP9SEwTXr#GSP~HGkQ*`0oEU!i9Fszk5vLe&j-^7CiLZ(Z@hCQ z_-|tz*_59TNNvkqYe+O7@8L<5vIfM8&sn>JkPnjh+W8LFG{DAstaYA`hw-b)2s})} z7vgKT>3?-*mFp}iIpyLoDH)io-;8uJtp(<)3>}kT^u%g(H!ky`UWK9Cyxc<~h4Lnm zqXVedH5hZx<5NTdiBm|I5tAJ6NnkgVc*@;-7Nz<(Jm1O&W@}@I^R80u7ZWBk|E-kP zDzieP|CWe(-RWw6Ou8v)6U01VSyPiiNhO&$b*EBv<_Mw_TIq4V%Z!gyuauT{5+XJ^ zi3eFkf!pK>@i0ipYrY^lf=Z|XQZ~Xv`Q&g&OyRAcX&(S!DI8G%h7rf$c)a1ebHe$d z=hF-Nv!8V=jDzKB?*4Xf5BE&awBCJa!FG2fn{xl*J!}4JN@90j|IN7Rg#b2KVl0VW z7M3+k)AwI%j;~|nS^hT(-4#qw5gYZ;74v@q=d+%jidrKN=jlOFEXyC52bu;JmnjKd zgIymt+eZATC-1@vU8Qm%elsn>dio(J^3J%-UC9{v(DKo#*)7I`Di&Zh>~(*{-gU^g z<3^n?8{EKsuvO#@&t}~J_E{HPVEeED7^x8}{vy7n*VJtSx*%cQ`BgT-b2{2e~l z;R7i+W=vH6z9HOWw)(g3!M>p*5x}{Y|AQ2)e~ZlI-l`n}y4zsW0c# z{Mr`IIJK`v4#h)BLo3H(%Maz=+rJC=oyvX1J4C< zkb$he$BM^u34CM!4m-2($g-t5pWIP>EgTEWTg(_!lJT;qXGq4EZG(dvtt740MhnQ2 zpU_JUU-bAe6Eoq_SDl!5u+a%gJ!<2RDFo@#Vq&N-=JB+y?wtZ?r#Q3lfQi3x|MCJr znf9j5BbUJ}_}~nEV8Z?qHAwOs_1e-?POsC0RsSNK}>sPW|-G&7sMr$CR7uK z$P#4bPg?g~{Op|kzN1%IZ)tTVoTACdUej^wp}DcVe)O6>qlSoSCWKm_Lh*!tid2pN ze70^R$FtUCL~O8&sOm?%sV4KI-0T0}heeyCS zlD2gZhhSj$>*-{M=r&w=uaxAy_uq+pQNx2}q)lB2-WknTP5^Z%n;1_7kCJ$);i5;h5=WE`FSv*7638J9!RD3Q8`!Oz2g-JXg@La>k4r*o-Qd zu@X-Kk|xl`5zaT1a%;k0kM1p>)~Xe@8V|Q-x6mjCkE%s*HdnE?KMHnr*jT(5pyG@S zHf(ttMU&6QHZAlV^}eg$d$nuh&+<(wV6RP&TajR3ZP_F8EvcpDy+QYj*eeu{7dfA} z&!Dm|p5uLKv6FeS@rsKVnH)W)Ezr~b4$&eN?SD~N(Y-WHl)TQd&{6R*XdJVC;Cr;< z@UF^uK&FW)WR*+FuIg_ujTFTnx1UR}8)Q&Ni_++0NpH`8buAMQ7G5fREnhVvq6R?Y zymHUw->ua;4h|P8SJDa%U}E*`c&^sXkdJ$<9n-hgGfJJ`UtW-$BqH{CKbY%CW?wiD z5|Ib+TY*@Rx_Hxcz;sx`0Six>&Qr1rE?6H>)~^M?YPD$RYSrGhfJrglZtN&c(t)SB z_o~P0g`cL|k4a7&u|fLmQg zWx@F%bo5rfM8!y)BR&-E5t?dz9d2{&=AxiR)FyVI3q-R>6vjDcO^N-T11*@ssvCd z2?E)Il`Ee;Eqp8|Y@@U|Sd;`wxv!FZ;$lC%zHZZ;=&F!cEqa6}6>7GVw0`C=lo*lw zfbw+b^Kh?v(Mb|5OjvG<(KDw=G}RK1(JyiO=Hkz8gs7yPOE<}tG;FiL^@_!PC}A_O zf?}qTOt;xJZmd-BE>PH_Dp7b#s8v_DNc~~zll!N&(?|%3;S@ya0Yqq+CoPJOJap-k zUsEDIia)11yB`;QX9P;KJ2y5;1-&y0;or@R2JuG#wm`xFa;)ue?E)!BjR9ss)g)2_ zv=GG-_*SwZ=p!aZ&-nX))yHTC7ISZv4Dtp_T{N<%jZ$ag`HC83ijqxLMMBB^v|}4g zvSH2fJgcS|D{UHaI_QRex`?m-Wb`a5*7H7-J9oX|DBk4D+DiV%$K!}@q^}M%J%3x| zEk-#>?dN;o?6{DZ&M9L_wVC#r(DM43RPFEQSJyteWn7YbgR!ZO$^@(X6@@DF86idw z$peq#RtfjK^HjF!^;cIK#vZW&sAmTH9*`e)ZfU&tmrg1msLO!?A&X#*;Q6rR7kohC zlb_)0$mp4!U$8&P7e1OF+*Jad*{fL_!eS|{Kj`IDZ#V{PlPog`bMVebDKf{Qo8Oa@2T+3qb1$)P0k49 zoVb`4ymas2bjobq+j@TW*;W)I7dzKbkMkluKQC<8-V~{oJJmXc+`N3yqGy?fWF~S{ z!mrk3Z-Sxv@1wVfGVojWmb^~Tusk8Tq~3ZR_4RY@4(8&@8ZF-b2Z}eC{cQ4qDvIH) z2c!QER@h-FkL=6FmglnP?kucP50Ni^zNl?wd6y1v`trU=)$Cl2@e&+Q6ivnK{kzE! z`#{N~-WN$u8YCmimWB3_h^?bixF2S_EatknFF_~mHwA9m#DsN14+O0PpT`}JM7=DO z=;qpF^tA2U&ZHYarv2Dm=<&T_>K-C>^ByE0rqrW<_CVs;y$dK%Cu*zV+{rVD084i< z2<%^72|~bT>!F*(JG4{kCoK_i=1y$rMdv@*QCJvAljz@QLmKrVvmXF1KSLe ze=pK?FT%~Wzge(;Q*(RG-7#9Co3 zx|As4j`ovD?RaM@+a9K~v5-sjuxlMa{yOWJY52z|A|m=RDgHF>I4w=<{xXms8_XmK zR1vJW@$&qLnkMarj-7h{TO{<`jx69RA{Sh4YvS3m=WIKU;Ua`4PQPv?wq=K>|3P?HT}Y+tZ`GwLRc4n&`Fj$H9l9#g$@yO_Nh*b!FhD zhIOYct4+c>A%s(xO2l0ZG1RoVwzsz zF-;}E(wN?{>V@NGX$=JXz0{Cmi;mwgBycpGVt8miTyg7PJZOKR^6a{-O)s_8-pce; zo`U47G5Xn(5YeqhfiJ4+Uv|AAw&!GbN*Z5KIjJ~P@={&jU3I?$9pw_E#CQ* z>yy-7+k6!^iiD4IJU%$-SQh{$8E2NpG>pddi^VCSNTuEpVe1svEw)C z;XXgB6NqT`P^{$76C_B!X6%j&*B4C*)iE`R%&FM-UE#^r!jivp=wQ7CL^^hq2!CmP zsynI%8O*Mn6uWY1(0!aJ1UA2QtC|4&9Kbjmz1ONck^q5{;C zfy+T3GdzceFJ#6qMELAYd4IA9l;Nh@5jw&D^Nm(cV<0PN-cC%(Jxzp;)!*uwQi9Uv z^8vwJR80ij=xC!O=ztn0*hPDiA(CppfNgg+u>Z7*`uu{RJXA8q40Z>zx9i=tB7_Cv z4))uHQ#WFIi)O>4Ggbz}g~Mk9&~m+-+ic$sWTO{|s7nyq>F7TPrK+5B;Xh{VWG@k5Sz%t!8(e74gUm~iGnT;BKgXKT8O*^50It^U#aR$N|7Xys= zK6)11I{*(Km2csWkIHL!`;C{qAl&{R0VPu>+WK8-aoj*Q9>EW8`0%1Q*@fkoe5A=A zV@@RK@d)Sf0cv~&pN|+D7p1J687PI;=XJO{k)!9+v7ltKiiq_`%bZvEyxJpRPkVRX z;9DnZHmPnrwN7X-;q7nVp;zVCH)DtNbH7tSPWPy_7Ir%hK<>`C=$VF@%1=6-)xL1! zVB0=a-Vx=a@96NYlM1xP6}P87|AV3ae8#j_TN4FHcn5BRen(-B70AnkGp;elKim z;6q!B&2zM#@Dok!`^FqfHT8;5i%R>Zt%SfTHT|$=9JJ$#9D-KvNX!JYX#_;fzOe0$ zQNF0$HM^$2dKf-@CQ(dkP?T&z0dzXUaCc%ms5i!oYsLz-4a21oze*<1zxbmhd~}Z! z%w))m>d=|<9>pPkPFaS)zn{j$P#GpoBuU7y9n8HN&Bm2CJh(DzpRV3}Q72@6j)?Qn zSad{KZ$CqD2c%KGH%-$gK+}N;eZ_cesay0AxyHvDr1WiMLttc1S+A;7{!5EU-lW{* z1)^{?i-7Tzt2^G(#}tkyDd9iQ!9Ex4vi|uof$;D>U{mTj`f!E;S8G$Fory0lU&F5i zxYJ0@=o~#^!WlS-YzZ-Y-xqCGXoA8r>j94&(9xX+Bm7ZY0y|CHnD-L_^T5%(c`AnnQ2FQ*o5w6qofnQYiNX2RXX$H?y%5-){Y9;=$jqg(Cfd(e z1wN^>|Do~?@Ztuyx|NaK*~6KK_{~J;bk4#p8;_hF@4 z%SoKWH{oLT@uj~yQvcc}vQ*^G+I$L>C2|MrIK>}D3n(SqqnXs*_Zb7-m=1RJDw<;T z)S%g{eg1q!BSftJ3u*pP(eb54D#<^z2;fdXt38~0Dk~QEl3oVf{r$xMo+=5$#(Z4> z^13JNmvi4nj;#q6nEiNVgq@QQf!=q|v?K#>l7>Qw3X<$cv?~+0{3|m$^&Nd!(}Qdv*cl1W=M- znF@Vn6<>pq8GD*1S>6f)>!tgD^4&_dc;v|~krm#!5X0RNx02(h^`EpWqr;BVBma~j z2fDOR&xb8MKqGi%=E3@l;q@8_h$Ge%^P~@FwgsDOp>K^`ZQd zoSUW`&aYo%X=fSD!#>HO)|%I;Hcsr3q>n?1AUlKdvc@dIMsdv;^nB+!rcRLPb^@w@ zfC)bO^WM^Cd~h{2uz*?(Cu#b6WL~5oQ=aPopXHLT@9}TE zs6Nq0H&Q~NHhz=<>%xDer&hcXnW<3^p(cDRWe%}?6Vg?3;iTpKF)k7(;nW7NSaT+8 z^y%C1>Z&UzPNoR3eCIRUvT~(<3$JC`zC$5>d1(Ifa-v2|pz}jvwbgtfP6+tL^Mxg2 z&d$y_VJ(NEVq$8`cMOv)L>!0=E6TSydD9%HCX6a6*E$+*;UjCkTiXe8Nq@CI0X53! z4DpC#Hn@BKkf;*v$;N_1xAdPNHVe~lR7`eciCr`Slne512haqBH;M`lZG|9?GEzq0f*VCB>qGM-ZSbVX)hXv6UEk%oYlDxdQocp=uj*VZ zZ7Qur94`_8>+|jsnPua%R~K@WrNmx{XfEkI|BJA_m86R9D(XKzgJ7lTjFW>pee%lb z{i(Rv4DEN`=2JV^$($!QFB>y zV_Nu+v4Gc1bbe3hI1y(J{?QZXok@9;4^w3$+nVmnmd z_}aM59rsQx#7*62tEBQ7+}ix&^n-KL2GgnGhj^O=e-o7?>p5R6jaQ5X>{u&DKQ({) zWO0rPYs_k8QBTU4&7aASA!w!`$Grc70wy0in~RI(eDeHD9|`^CCB#6%8E7LSO1M`s zQ(KikW4y_Q*+#vnnu{GoXwz;8(fu-Ex)$hR2zMwhvwpqVK6TQ!a<^i3w+1IqltTTq zoFA@cc+4=QX(l)?U0!_XXYsjL51r~$`NsG?aGIS;L4}eW;Y+ViXwYisHL?r2d;13M z0_CVBj*wLMj3B&QGg!4B(^(6wdPprH;;O0VSF&-Asp(=Z zk9^;FblGAIR(G2Is2N)SXL<);sxV)m#!+?gS^K288WiX{v}&|=>GjP{PL5KXGl6V8 zemVwy51D=iQnC8Vd!=<^?1ObNHEd1@j6{2U`zp3(!4zLNALxHiY|!#Nqt!fvV(!c; zgqJs^?uEcnsTD16kT~&|fE4j_Gzovpn1#i3JANnXj{ z5@YSB-Kg_?cVvj5Qnu~Uwv)v$+{JxmbX-4&414 z_=3YoFZ+iu-d$`NQ{7|2jaJ9A(@>+3S_|vwSGl!a*w`v52&L|X7<1SNM61e|$>3Z) zDsf_9S6s#N8@t&_h>l^J2ATU^tH2I>xAq76QwO)|!?0%nzG}x*KXP#iv?jh)-Ko_l z&ukGdPgS}P5qQk@`TJjlKtI_`z`*osr<5rLPr_3autp5tlcLjp>OILQoSn=-zNR4P zz!uHaY@JEZdaRjE7RP(MICgDExS3DY!q6Yl$$H(b5hDFJdS_z@*$aUc;dD^$c925Y{ z7F4TGxzC^2xg$1QQJANElahPfU4_TDN+9vj`mc{)J56n5sb0nd*>5#HWYcIiAqLZ1 z{6g$sF#rq7H|K1(+d??;zPH$E&^2o>V0~2CQU&o5eC78%aSnL5z&2C6y4n)?9o}p^ zGu~aD351afN4e}drsnMhcn^`c5TsasydZmTT>Ym=>X#g7trz!9Oz>LTfjo$gEn~0m zU4w+uvbMm0%tfGkIi@1+QoB6~v;dIiI-<$tKG3JL!gidq zw5=5MfvUTEO5N~>m`Tw-m~W(D&%%Rw8seg07pf+|=xv;8+47cUyY5G`3-=gG602v$ z7>F|alK`>@{7>xHwP@YZbDuqlB&ujwU@gqZz%y-9aqhI?UC@pUii%F^(dTuUsSBP^ z%i7JevA{34&eDndb~}xwuStl`-wei6@(Z+ig1jBm68G|22x>vSAL%!o{mblfXI|fI z;5`c^TaG6{^Vqe1Iv$B=1SJ~36Ek`-7^ABT^O2f5@Janc(=r?2be|kMgC)M$!o$)o z8N+`bA14I7NAFix!v=Tt2DONb?|5#2jL`-;VCKd$?-=Fpn~v|&w{ENN(yLq536aPe$Cw_(qL-eP6D40GwYg`KAe!)e>QuLJe^`hRZ)?XOJZ(99r+g;s! zYyH3B2}2;(cAI|aMHr5QuG@N~h7Id9jZWQ1)ZU|$i-ZC%O+t}B&9DJJU)~fg(jB>Sc;mc}&o)M(_)Wo-qYUhE*E)iP$ynuFwRNB>4A_&#Ol$S=r zv9L46QTEOCtnz$@81_sqcAv}bQ$Vk-T78WL45@sF%0ozltZ9lqc%8S)uC;;mLAJ92hW z3G-OT>SQOjga@f|)1d>l^JDwnia)>^Zzr~#pXcdt1H?3l)BozQefw~k(Pvkzw9NI1 zL?;bmfj7?-(WYs!z&D%KmmIMG+A0127ErAOd9Q&CYT;W>Ns8bh&Rw2$Ra?&VzYmI+ z^vV);AO4AkV?8NSQPnH}HlS_Myyotby!TXP(YJgUc^#krId zNd$4N=DC-XE~7GqIg!iDu@5wpdS2}&yFQ`94YH6SdwWScN;nbxRgsJqH}-kF?Z@wh zxFL;sg420CKXVxLyI%&k2Cdl6z|$M56Os#x|3(D4%@YaKYMHt7wkz6h$3Iz#tKEKC zhpuWa4{qe!nD>m^TogEzu;!xYtCCf^tJFP?k>82xB^bX86n_V3>)_{RBB0CT_LRU9 z3CK&I+wk3+pV;~K7f*@(YA@rsbrst;!A6|JRNJ-B$d?0#5;ba%W#P7+dOI44ZRF{V zj0+OvqDsWzn-qZ*5#+|#t>D*4MXMptO{7?9Gu2tM4fR<*kY2_E-MBr%Tv!AyM6shfC7U{{`2z^pAeImXb;@}{= zaTiToFgK7nL<5u({$oFhYJ@tEGev-9PwDkr4%LDuSNgra3q1K4N_M#%~dLOG@Pjkn6Ir}+s@&g zE~uTIZ6e-HwALd}y1b6h+b>Ewng8%hk6^@2_}UhuEWb{z`Khf2HwL4guh~EOp8g~g zcly|#a1m&~t*Lw=`*ls~dvZ3Hykl91*wGB(t#!)J52;GW zL9Quom%y%s{u_cp280Sn&n0Ez?JO)vfli>zn}b{}0oQed}k;BLAR`)&SJ>#88%!JldbixXA$c}@kCK7?a51XRJ}XKPCco*smUtCSd6;H(O?9uUQDF>;FZLs&h!g^qB6UrR(ai{7xTp9 zsr59_i~;I{iY{@8@2`?AQ?UQlr_);1v_cDM!Pob^Gh$&a&oO|HsFG%)abvobKJvH( z49=AiiNMv#qx8t*0#FB=WuF4woTN+nPRKJ`pI1-Qo zt$C|*aY5SxU6VM!cpqEFZU5~3R*+Ewzt_jO^BY&UX{}H}LR+5zRDP5$_gzcfV{=t; z((C>ZjQOy%V-(8(_oicAB~c=dJJiW_+c(Fhr71arCw_3-r>Mhxn{JOcbTkG>Z?njpLw&(Yxj%+`7{|}uVknuPZkRqt zJ@!*lsBTj6ciV7LWoI@+Id!RA*TE$+lu$Q>J;Qh)(w@zGz`eU&E zknp{%XU_lBc?1{NpZFHG@5;U|3m+s^V2@6>jM8%+1=(8f1cmBW568MYb;=1Ux!{cg z8f?8fDl@ix?XthVpC6r75lBQmy|$qAOl4^SYC?c^BcP<`@s-def_jdJ{n+Ez)ZSb64*V~}qAaOpgUF%hu*`%u}PBb4` zrs0@jbIl#0)$aN_B)};`bzrO);eC!dU_KZwkv{gmw>n62lEM#Og6)hxmHLnY$qLXjgHIgp* zbRfm1_XK&7Z-DHjUn%~|$VX=n_nel^&9<#EB#S9EnO8vyQ!=7f#}f3Uu<<6No?WaEgx&X(UjJ-y(gjX#~13WLdSR&O@Lz-*|O;Uyf#^QO7i zE6+|AEQj@I7YgS>+4RdZ@n_A{K_xns)i%wuevsTgUn;@qr&rdol!Z&p$%hY|BgC1r z-e7R!5tXN3J@3pu^D4x4EVjmf^RA!^Q`ID*5RB&>#>jC;%nf|k`N_C#DlNs+fDbH5 zC59#1ugIB(;I-EH5N?(Cl9e&8n?%Q*O9KTI^Q}ogL1_!HIL;xfZFYNLcK_R!UX38akb4Mn$urxDfaM>D`daQp^4Ny=0Cm zINum1Z*3v=7Wk|6vPh4Wa&lWj>W`EptoE%osj(+Ll-V;`=dIYrhT$V8njQ(N<*=lx z8y#Q)bkV@|76$Qh27;;_VP21>ZvojmF8HmAjN7b*Rx_#|k*tA2r5FW_j?2ehK?dxd z&9gch+9XJL0L0Ng%g|5TsoGU!DB@13ALr!0Wh;=t-%)!VKAiV3{u1;xgUvaE_ZtlQ z0v%Bd`CW0tH{GTGnxgGD9?KT4Fz-SkF?Bp@N#vyk2rcLdtnD-`x< z-Ym}HrTs&u9>DET*$-B2*FU3)n2Z5!;&<`g4kt6JU;mQbE_XM08))PnSi##cu5>BC z4v&qZGsbV=+OQ-2Z=uqdfIlyGj!=PwkL!O0Z++K&A`pvO-T4YtwEoBjKH1UB`~Tbt zAs0cM`bp72*%yfTMHD8PO#@vjOvB(cH^3T0g*cOf)irC7K?gj294{#HT{fR8H#B#W z4%mwe-GL7P=~GHeiFLiq16Bz$8|9=Yu>=<2fkW9NL@#1Rla?oh*%-{=l7p7d9fMkS zYe8kDr8x*@XLPI9B&;wks-t;0bi}tA%j~<8$U;wd-e1K@>_AASn!$^GDTSX-+Z(35 zsL=CABG3~=F-i4jL8@ZKH|MZxmYuwyDI+>ZzPs8HYV>?fL7wumMM*I}Y)oy|C-PSA zvm5d2m#gnTTItYh~m846ts z{=MfO*nscmS^QR2zj2d_NVtC3(+gj(F7c}tS&t>gfddG`iYOBISGISJ6jrLO#trpU z61!^O@a!v%H}|I&iDP%GG$5P;#`6>kzZ6U_dR5^Fwp+u~Z#Yb_bfNnUFAE(@>v^N= zBED~sZyz4qIT7Z(570~(l+Iz|S5E?%jY7}(&XRAL+N2Ch<6$Zg^>kM1GOBpmEsHG1 z!3%Br_>v^kUw+LSo%0zXz(mzD*~}DZD6zZM5#O@O0s=W)TuoEoKWK7dguZ0%>XPSS z4g|qQT**ela^;hs(VYLD)Uh;95JPcA=!wM$6iOfmKGJ2N8Gc-(_+W?6-2urpgIR7` z?-;5IyKpQB%8>Tr3feX=wFjQbHqfj$ z!)IRXh<+g-Nv1N#ph<@Ma%;QcRlc@k>A5P&OoM8xb(xQksr_2nULkPQu9%G?BD0t3 zgEm(akgNzfX}erj)15L^rqBd2W1w&Fx(Fg)UX4q-RV{Z+5#`?;N28&Us69y~PghG1 zUi-|I&bk6;>51gT(&PBz)#|DZZ`)bl>yVQS9M$*+>0(|CG^Y;2!1Pe=klL($RWrQV z{4l)X*Hl69{lYFml&w2}ICChxO2g-8s~+2V->PKvf+qRLnR}j^q7c6-9&zp&4?A_6 z8qzEp722IBRxPrk^kGUa{ka&wrQrh;%+6;f7*8o089a|vWu}=g$=p2G=zs($S}saC zS@mnyDj_f|Cr!~l%Zug`MG}R=_C%R|Kpl;jx`oc^gzOPMWdua6F<}Gjhz3uT;VM%e z$o)`;9?HZh+^jS-)Y6#u^sIy58e9eN=j|V6(cG|ECipk4p0*$OSEUW_z<~$9kXz`! zV(>^9lEvyaa$}P?F@I4QT_PNBX0>;2H+akzo*UYrM1EO>sgcC=ImZZ?yR7Hi%rKG~ zKl3v!o{RpTtcsibbOLsu)QfXBiRT^1kjNA!yf1_==6T-o#1=`mJaK^oj`V68i_!S` z4dD}Z&w}+Jt7^R_cEUW%k*;_U>m+u`7SmL_%U2o&KspVELN?n;USmo_T+_@!ky143 zgxam%JEvnBO>!!6cb5GTvlnvsWV_f!Nm~=hvt#xc0%v|^<|k9N*p4j` zS_{v2bo31ot4IrTEbv-hsTye%s3+`6xM#wN-0d9h7QgQ4Ccz7J!s?-JIi3yaqbII* z{_Ed4uxl4QOH5w6_*LFCFX?Z$@8O9MJsUC^pP~`~qXDCnGxf0+tgl9pTNz#IjWw1} z9hZ2}QI|kzP1kvolNX6ZR#;-(lx;YM0@~9o%Ku-@Ycx|dg#-@BOGLu=9B6Mlio9Ht zx?D;~&oCS)=EUqNm;Qu{HvRDjGpqO?y=UmZyqRtYaYlfb*iV|3&gIjTyhZgjP)xX~ zV?=`i*20xC$c%+w^9LeHwuEehNgk+3Jp?+(29JK!7BVRIoV-@(QF{82PnrB!nhmLw zQJ#onbN_@6Pn|)G*+e)3A{(xB6g>J!e4gY^5VRr5lKHnEDTi!oYB<$Jn{FmU2R^*L zl;=-Ik(WAAIj*?fIyaqHoi5j%cr(!kIlFg!vVDurtc9$bxbl3-0=xl~3(>*ilJyUN zf6AxjmyTo#$)mZQW2JI7rc&xR*`eZyddIP+^`_tFpre#!U2LwYn$OSVB%&{{ zrkwFO!1#OY^=9Y^isAo=y6UJXzi9i-(2ayrQj#JiDjky2EgcflEdmlVAl)rJG!lZe zNOvh9DBYdXJnZ2$=x^yrkKEI=?)FV&W-0hw($92M+8P+`=HDu2 zRg4!d*4bg(o!ys*qU>eaY*y0%RVUx*TQ$r1?{0UBoYKLVuNJ)dv1M(^l$~R!@{Og= zgC2RVe!RC#xsnJNVgM9C6y^z92$VR^D6IP*IXK55bS-5ru0(MJ#jAM?aL^w;N^IlL z+wGj=aSF_x5}+3)PwjD2Eus}bZMrZQ>@8y**a>Kk?< zl995(6G+-=DA>6gy0tLN$2(ytsdmC+rM`*2ZE@i@gp%lp+4~W3YNyKOZ55mU-UcV3 zde^GH@fNx4MecUh8{UAxljJJA;i6!d+yN9^N$E~`S}C7wC}vbnuo($Dtqs6BW2!J7 zIxLuxkNULGU0*IHxCi5^x+<=_pE086EhUk+q3t=xdwfM74Cjxjy1!v|6aA(=y6Fbu zpB#zy@d2MX+@2;R+_TZ@gT+-h@sT;v&TLZfSDvK zDV!p4Ffm)6h59aR2jqXmV_a4QBfuf8#12FImZklw=k})Cwm&QV35znP(GT1AAEbpF zXLf=HPqOAz3=`9>Rc2oqVZcvQ3wZSO+$`NIxSEYM>kYJ94HR8cBX-O3i|rXji$lYL z6M?V(eF~-l$|6C90QoSvv~{EYpBx+*E!KeTnZ^eREoO=jdxF9 z!L*%9Hzsvx4JwDZQ@ADokRUl3ID(o|T_#q-0J@Vjd<=^dk|1s2=K!yb-O##ZxuDa8 zvj$td5mw-(LKf-x=zrznxLMo^YvvOcy(<380dwg{QE89<`ghg`3j#H2_kdbz< z6>yS=2ZOuo+woa{i-}U)-wq8H6ZZfRmP*ZV# z8VpEbk&+&re2dbdnV&I!*LNSjk&HJ+L$+P)BebUB&= zNYDg2sKy>Qz2KzTfKc_j#YUKS5Cp-fQKdR${TAQSJ8wxS;T*yiw9t;x9E?R6`dntD z{MdzOtA+rwd>UXP`08eg3s^^nfo0}hHN@PH_#t669xg8KH}YsCT9frX6k7Z*y*%)0 zHJbMyk5a4?0Dg>)Y_FeUW#8R|j9&}4d-1f^%}^)V$FJ+_0JAhu+-l@OpM%kkpq{|& zCSHy{$p;-g5U(S|E83ONw~|{S*%(l%u`M8LcGxt3H~>GytTQ>k$~aeZC<- zA$*i=l!S^92xRo5s~(=WG$w{r$Fuk&9yP7wXaz;)VMbJm%9T3ox~m8MU`M?v%!aOz zfxB8QS2Ccj{?#d~w&m@( zwwIIMF{h#XM=uH|hqYn|(`tipu1Wo!!eOsVCeh6Jp6^G{obV$1>b-CcuZ4F+h-}7F zI2p9Vviu-T8n+`ebf9&4V>I3dI>^@a^SWXvIlW+Bw5q44>AebTSTvf?xW1AJg&6f@ zfyjclcbOFYdF5xY(h?*hf4EsFT=&J*84DA9T7R;7W=bXtXW&`8NpNn?Vn5 z@zz}-)72zqa?JWw9FyL4wlXz&J4pkM?_HlV0ikv5^H1NBd*DIfjSN;oky|QAbsrsJ77xqE~dui}NaoH{s8BG4%EcJ#;o zj=drCXPwpA+Vz~DXHy#*SMD(hn|DO5ydWui#LuYYRMH$utz{hz{KUR-+MKSoa@6CC z{P%b6>ap2kkv zq>s+3xvp?wHw)Of$UOL2!-S-o%0DciSVRXKpGY=V@L^k_^%}OOOhg`>FbMo|vB9cW zeYxXjJphx4M_$fgK-CR0hcM7b$VY zH@pafN~P~3W;aoOJUqY4N%9BS5|t|;xqX7(4#&+5$d{{6c)0-0)K7%Hhr^a^i^>1 z5sU)Y&h^OBfih_-8E-ejyJr-A^^pg4m8}N5))hOu-U-=p`q;RXY_AlvWybnU<@+7> zU;x+gT?WmBhw{rr^@iV*M!WVCTU$%A61?kXo-gdo<#eCSKzbieztDbi?W)K&_$HnT z1JEI=ttBsg>w2?S)#8F)Mltv!eyV@r?@mT1S@TvieR!~H&N5m_k!#QwOlFFz{G$2? z!};f+AsNeCMl^v8Dk>^#9K2dWw56@G;5$dD#xGljE-TLE`sL;$a7c(z;=BD9v5bfp zR_G>qTtY&9X;g|WEMCa`$Azun&Z0@9WGN%*zxf7!Gih5+vsHt67CVYRc*%Ioq_|}8 zslMtZqrW9!{uFR#L~B5;X#TLC6%YcxTci4N7OmGH?X-`Q>)(3sKmo{25aWaLW+z=j zGsuy^d|cc^G-%RB_n3%U+6@Xmrlg$!DPJhl9@#0VDdSZ^p>uiBmy$b3FSfo~0;R2a z$GEA!pAXXAVK3I&?-MUqO>`z$FYr1Tk;RY61P%HJ`0y0!55SBxjJR2A+uUF5{H2ZQ7AaHtpz_CGB?)vhOa`?HG6Ytl-;Riq5HHxoX%;kb*o~aQTT))p< z_eenmpad4O0C&VTpQ5~l*sIH5HU!=Sqv?#W`=gQr=w3+_Z-hG|-5QK4=%>mkTW)w`5v}z>FrTnPw%RiG*YAhqTXRF(oXr8J`1V08 zqrvckNXT!ZS61F9!-wxqLguz4zukRQlem*Pq25+gWUM`_@w?5NpHZ+rHJY(r7mbg^ zD9v}guh|w}DiY&^ex^$skLI>MEsCyoqS^CcEohlUVRy-LF0=lkZLGkl`(>hctQDaI z%-@e!J5|J|_GBM{70Gh~2&>zm1e_^sh-~#B2II`ScEG_v`*Q#jg${i~q3ds(;%@!g zzxR)&>k+cn9nd?LrT~OWih5X;?m7W;GIZXPWfKY;NEp9vqyQuMEK`Eu1j55_+Sel? zATF4EDSB#1^$`^4%hNdP+Piz(mQUF4gnZ6fO8S$I2x0vj(6&EqFU(t+i;%Vn76bfThEU=w*X=(uU4{V&U4kuf97@pyyF6>YQI zFW+4>JLgmb&OBdT#G^RJq?3Z}`bEuM%obwj>xC3@H+_s)ry&|wmUV((ESGHy55>^( z_m~36I?5)#f6W6Z(GYsqgP!kwRxjqGTqKE6KBUnz|K$a+`*9`gD&`Xx6$NIIMK>#y z;(sj_Kzu!>b%VQH8C+=JT{i zevBnT;v2^ufCesgDEq4cNsm}}?bC1mC+%F%dqtL=;>fHY_-|#V|yAXj(5v5g-Nl?r*^kHq{(85u@;XwJZSsqpqW_w%N+Q8 zaLd+WgLd>=Jk^fc_$mlYzb%i~FRM)&e(Rva6D3OoY%3VshKiG`+9D9kizBNLL ziMsVtrAeJ9VsNxh*h`fdUilG{yUhJ3kxt{1$pQ7g|7t+?LL#(z?&J?00m1d>e%^mO z@F%FUm5_+-@5Ruh(H0p^hx4Sta};SQ00a(})O&epWD%FfGrRjD7@$wWl^WW4Ta9WoTWEfxp zWT@;rlscYuIBQ|&V_-IIC-^yVc3T)WwN41p?$B}teMWYo{^8{eUJ`oZ zIRlIhy){**pB+^QWg^Hg+T3V(J&@|^4U;^>e70=u8m8Fhjt!6ou%XJ0w^Y>pva>cRW zgNib3&}9v>=D66oi(`q=B2LSpQCC6?F!V1Hf+BfKOBGZJLjx{k;BAvtkL0xXT|hwRtv6c=MljNg5zWRP)R>RazBT%k zn#fyx83}q6ZG-?EHh|D;ngd}be1NP=@-+Z59N4a7+m@%o@?d(525sblEU46Z`%3WT z63n0XN)eFTJ#+_h@!@tnnC6Zf^ezG{)pNc6ul$8f|2u+k@CaUgTfk*x0$xL0Pp*ST zV7JVJ$M@C1AJj3=0YtAa)m1)Mo!qs!QPnC6c)y{&!jxcARo-~W#ndZ*q^K`dGf6&`mWsvVX-?l zD|^%6+0$uOm6K+v=GV{d<3e;zs^W=7Su&q_gn4!i?i_6p|9#TQM(5gl^sR9aUAxef zMeV+_hA+Rw^H!oeb^X8uNMAXC!1e{E6cH1^i>K`czThtqxHJ~L@#9BqizxjeVfn-k z{sflTgxw@S&F79J#Y?P^lnS=cmU>b*8w}`UN$Jg6C(T)yO+95pL$H|yrKO~#{+s*p z^P`Ju5`fpyTZs&Asw8U`6SJb?SJ1&rh~upY?=6!Ca9VY|yuW_J*XZlvt(7-b>@Mqf z`<^1EKy{A9!jBJ=uCZ9Jv%mq2-slr;XB*+21_AyPQ}tEt$PiZ<@%WLaLnq`j{X*HA z6gI0df_UBgEZVoF!wPG91yiC5o^(-VURx58Vz+_1q(Y*&S;|5v&NubP zL7&vd(zB0h_>*8eke?Q*gcG<>Dw-otZ)0yy-oP2U?ids9+^!T}+J-9m2v>8bgcVfx zOgj<}%KhJqyjqZ2J!tv)goF&Bkyr@3)<2+u&M(=*%8CkEm;@|+ zuyDMyo}_i~_5krew~`ScXY_(R!q2F2y!+nZ1TNDL&8&fdqG?{XDe6O`AsB*1z*6Tc zHgHTI={NldfA;i>>oQI_)bggixxL#<1=;=r>lfw0!+?T9jkgti9p=$dSQ|EcfMcn} ziP@$R>WMH|a^rd{ZfowbE&2{Q#h5W@cMX_Gr*CCELWfZRk`7NUjXFl$8a(L|Fvt1; z+0b|L(jww(N44=V0c>9$E+#ZjvYhAc->vg75!jEzz~E@NA?}xJQ`GIx<5q1)h6S8G zTCi6Hn`m@gdimeKbE*%TO@NUiyHX9Gq@8_Ixrr*ad#r6=&FNz>qgBALsgM1y`ji7_ zdiz5eK6!fwt#Sd;kmVq}29SIb;0Ip$eNjNE#@Vz9a_XhhsSiCpxHxwX@A$jryx^Q& z9g!Xv(<7*+>`<6?N|pWu0mf}@6WK&=2FpOlHU~$Y(&qq63yDEnuH$=V>|mkvOMGBF zqJJbC`i9O%a-H&9wh$pUW`Vax>pgRv7tf^j3DrvDxBTWG{4>pH&a==x@}2@atnL8# z6|q|C@TKBX`?W0NVMgkvV(7{P(gC<$CwGnq?Ol-y89Tj0dQvCTZ$j%t1AOIEm<2JvT^sivZg z2vo+P5V+L{UQTDQ8D{3VL3OJ$<=6P3l#FMV;68S;0UlUlj5vVE3w{~=z$jGwd z!DQ?W_{s58-D(LO>S6+#@F3=ixeLguC0;MTtSXoY=JL@V>WHc!*d)c}G`_L!R;`W} zI+mr`w4m|6_I`mBE(F(G)SL4V?Z5n2_!aVA%sRT?9oVP6hUUl*L~x0ie9X@+gbV8XE|Ss)9?LPHim$U zo?&jW1Sqa~qIryOX( ze?MQ7DOZO+3H>>;g2)0F0*6RZ08QFJ$LCI%f(FpDSRAJqdniiuJO?Io#LmV|sxYe& z{t{v?4b({#_|+D_s|JfXJP24mz#E|mWLzt{$__LB3Rc4eC}|Erj^4Yjw`>o#pXdVl zBEIQM&V06|Z9l9PTv+>iPnW@)3EOcB(Iddufm7rY)mmP=RMg1bVWnUMZPB{|?lme_ zW@n6zL&DR3>8X0~LmQnsxz|GXbf__28clh&i03lW#oZO$(f>LI9>IhG+h;0!gb}?gq<)+1lVRCM%QNt6p9;QeIDFJ=xezcrSiR0 z`^8IXB{!q&H=qEclrqXqpKDs=Ae|B4!bnS|E{pN~e zxgG9XAme4jCzfSNi5K~MF?r+h)@r`L97z1SNA&_5V@IuuOf79 zBnn77?XUU_pN0kKbnU@L*3rzPHuLWB=%uUHrNn1RIdfGbdrNxGpaTWt7S5i6RC_hF z&dHeCC=l2SgP8X*ymgwAcba>rs;vhKs^(H}Frl)QzKH(k|DYi^*pv@Y+fOpatB=lN zk}7*jTUC2K#c2Vpep+yjo&?rsOeK^_3VdV0df#O68S)(2oA+2>wyN6dKs%> z;&_7n)A1$LIEqFddS=INh;uEB0SM2v)vi zkB-JX^vrZmr*fJMNgMP@EH1H2^&dGwHu|NaML^T2zW6)#hy-;1G5g!ol6z$sLiIW8 z3u6f{iUkJ|xpj$0_yH6$Zc~X$x#t5{zr+=YA#7-axrQ<)??D!*@uLUkTY*!5LR;Yf z-m-ca_?CrTeX%VwLn87QaY>1+=FFlbR(}QXg$_>U$ak=#hZstn+#I7J3FoM|Hr~Ey zOgv1>2{MP}@XI~rRvxjMs+Q>u!RLK&po3k}a_zTrR@Iu5KHjLBmNY-M1|#Ya|6{?W z?)2hspSuJis0Ak9j(ffY4#o$zOP>rDu(9kvQj5G4L)_^}WZsPg--#t+!jGHmex>Vg z6yd`MoASc!MH=du4TDK&{K5nicQ`Wo4H0$={tb&Tq+Y$#&-M1EmGk=hL{%j#0e;-& zzXJXdk(l!sAXOptK4*;!$O;py8NAx>zFv zCpQUvb$F7txb3mO{#AGlMr{Xq|6b>yjTqNkJ57WaaVplTYIvYu5Vi8&ZT==@z^Y?` zKbCvq7ST#2A+p0Dqt0R;&9Wy+0odKJ4%bM&^+An_jiNglxW8p{ObnlF3tQ)N8VhBM zS;xF1O`)udoCrV5dgoWB_-GFH=f#i1%;NP1yUd&K&KbgsTTFkRN+rol#VBFK#>B4B zko;rvae^R>9X)fG^d8C?AuL>5te0$ZJlZG$m9n@mzx4juFh!($Rim5x@ZXVjj&T8` zAdv6fj8aGQO*nEP_SO<90 zIYa%vq&$r(Gz=&wSC<4Sn2`PUw#|z#m3zY4sIE$ab;<7^^?9iv|0SM4kdpiQwU#%@ zrzGiZ&9p<3HF_Dbt(bnZe)_@vxtHqUGnI9x_l!y3syv39R|>lK=30~+T|9GlwU^qh zSKV-AA{NSX1_q7~D}t}lw`)O}NHc^->H{`LGiI}&lT4ln2S&NS{{uK4y}@)|pi zhGASP`4Sv*^(+7N<{o8u@ay?;xOZ8aYb}#q!o}#$&SOl5zsPhjFuT!NBS*y)69t?R ziO=p>Rcn{((gk8OeH@u|$9i1yKV-JdRJ~Ju6a-X}@1zPv;Y*?p)%KYNvR6r9G;Gm4)!BSjJ_kUFpW9!}Vfn z&7ah91I3^DtD`gqRpdk*8|tie-U2rZP31AG0|7Lm5sl0bz@FEi3&CZ7+sE`CgSTB@ zO05x|Q)*OX#bVWOm?@6tT_f7Yj*tUaKUDTlxJqBs!31*TyeWITIes2D!}WSJn;M!- zGCv%icAHWMHBO;li6gHTHTpuhQKizd$bOLbsNv-N-%)Mx z{Ri9nt8q#m%`hUqkgCOxet*KTa^Has{rl*2Nu{tT|KWMoAJi93;A{fosn;O(+{pE? zG{Cq_5a6p0gTN!2<8Sgo=Ge0nvpv5!7?QhkxBbByAOvD=c|Z>xCk{!@_2w%TvHi4( zcg-^Nb)Sc{g~TTDbG_b=#-rb8VJEr}(zWnmq z=31|OZq4zkq*`e)bnKbOQisE5S-f14azdeZ?RcTJpZd4cj2hdMBa>QO=9#G=BE9bf zwC+_@SBfnO%;TpBmpn&Ih_SDxo)8Jw4abr>(+! z%|LH&X$Hp;-~zd%nobiL_<{s0(x~LeWiPJzAUYYs_W8dPL=S2xufS`uY}Lf_L@j~s z3TQ45{&8|r8Aqgj&ZH<7kiI@E{&Mo}u_y18-)H=eThWc-JD-nK3b zOsDkx2mv)M?-VEjFmDi{=f$=;gJlhA)l0pV>yOh!5|19|h|ro5y0|Hf-11iU`GR6Q z-YBD_dV`sE?%T=tJa?k7;N`=`t5R&<6PajWvEj01P+IECJ+45_VX8*id!%?ff2ur8 zCGR=YHrE7;)dY(&t=*~j+%B2T4JDvot)l8A&wfW%$T5&l?R&(;?8 z#j)MW37Gh9n6)+MiBv8>#4+YxE^RbLi~wj{Vjn3V-o^oZ2ggOelft1(${d4@7KHJK zUBH;9KXgrEDsS#tj3t_Zh9o!4f9E-R&FSQL>Ps;2E=Chr_JZ>R?NPzc>7skz`=H`%R-ax*Pf}PgsT&?t24pl$xk|!0em~{pkg2@L3#kTK)t%O z`$o;q0|+6 zo0M|SKR6rXp-gnBUT-@7-bZGS3yD32G^)4~oQZrRUk0U{zd%`WF)kmc34OYW5MkRE zu)>dP@}d`gda}&KIXyx80+v|CmKb4xT{@?>7aC#p)3|1`=7%8G-8&3C@B7P*fkPE5 zW~Hl$a^~ORQ#z;V>yJg~ZtnhCL}xQb%t}6DLD3azcivVM2#*}R8WiSs_g024eD9k> zhkqUY%y|}eI_(K z@=t;Qnkg337uI!t@bXf70m}cAv8$LSWbLyOiR9^jflq)_h$>u644==Fu}o)`lDC{ z&g-zoLq@~qek&2ncfO>Ne=BCAL)W=7ruhS|9UEVweLc6*ZXP zQ=j%(KU5hbmKktUp^#&n*PsBtQ(#D$P}Q`V1Qfa7eJrcD0X`cYBQu`{PJXex!~FsI zEJyU_xUP|cl^T7JF;$)HsWZprEa~k_z;@^13>v(T0Ap3k6C$*M^d@6Ynjgl&PG>SiO2Cibi5tr2Xo=fzzB zW}mkVw;O8Q3%NjU-WpRikqIl~cnaQ{?U9;~Y!ls%V+Y zI~mNSC;Q50VGff9hJJq~TLaj)j|oL*Yl;7X5==2lknrB>ZtI`c1A4e}R{J0J+R4u# zv)yY`sdKh+_>0z>o(-^Yr(+s=&%F8is^Xu4=eI&32adtI{Wv8pe$0UY z&(Hz~L9;*269w5Fk=0%AT#>_qG2opWM|cA!UmBIk$;g~p3-b)CycuGk=Dz;i*F=xk zEkA=AskJ4K7El^UrJ{D_l>hZN2axZl0SIBh^$&GmKW#6=igUNfV^n?Ce?A6+w*?vR zLXlBSAVXo8{9fUiqf{U?DT|(r*PrdC1dyfyWTJIE6 zi~SqP(h}mtqRx{<43sET)sN}D`0l;O3ISs%l z9)beZir6%f5dtL+&;))NaH8eAgfaG%0+6{Q{ zWn-AP`~u~i9eJmURw63VWZK2b(!i!l{1byjQuu(YM|FRU;*`G_y5QhqZFlMyE#w_S z4(ym`Vn{^;APJ@s(MW`RVM+`@uf3Q6b*iqF+L4E*kuZxS&m8xnf|1{Oaiq|AZzf>< z?w5iD!cV)+1(%B2@W&h1BIE@s;3_fcHnT|P8u@_$?y!7Vjlb$>4Q- zkB**AhzJmA&pY@@`Ew*-Z2ye5ksy)`MR$CXoXCRIYB*ebq$<a>XNbO1DnB%{^9_-OE0-nERh21_-)a)pUeRUWH&Dh3 z{64LO+p)QscruJt6qR+76lo;mGr_+in2O6L$i|=hLUky!)YePe*{wora+69))&1#x zOeag@=J&%+G8vgWjec3^R3!GsZe)K$zI|=VcnGcwoUDs3^Z1a8O#w2B*Dl}qgl|T@ zDe!8G4P};C#BB~}46#A#2FKsa)c%xn6H2(u9^DXMwQfZ_*@&S(Gw3xsX}g;pI}t^~ z=O};`kq@TxOeFBnf`+sWfk>hdC*81l0TK;Y?=8djR=c>G7V;U#OO3CEpT!2YE`Dr& zTTWe9OkBh>{CRtN^$rP zLW?@?YXyRrldpL?k|gX6z5SHjsdJ-P$_TMwU~Rz9rN$0ieJ zbLop)zeG(GJaxz4*XOVA;*^Tz#rE?{F1eT6YED}CNm)qjf1(ntNRT0X7_NGh$WZ$0 zy_fiXZgfmaRpfkoLVRekv3oQ1js4*51@EkJC$6j9Id&dVy#mU~qT5UC6QTFsbaO!R zOU!Q)suKo@YyxaD9<;Y4*OHY<=~f!-*2BdQxrr*}?__dY!RtWg0+Ca?CR4hg7Z1{q z5aR&ilHbf58ns9HhFpl*?oj|Ql}p1szC{0H7EcPw{?iX1wtUjj$>=mW9<0j9^ty=zo_5?>cGLMpe`%L_tH<-`fUG5 zhl8lS-uJd63ch*0taO|@B$Jvi^M+V;mIkSf@IpY9>p zeQW-v8nHX6W;%c-tX;qny7rRZFm`RAfnz(RQYBMZ;Ii@@h3@~G{+B07EtI$?>LKtd zTv2IAiOYK5nSw(}kszqLJK)x6LGvRt*RWEz$+$ElX{~-&?Rk?SNHa})i9t0tKe zs6--kp=0VEQ+zl*M#6j~^HYzOBVb#vTKOx_5Pxl@ZH?m5`1k;GLY=8YCc{zZ3u1&I zCNJTO;x&oq@7i0S<}y#3cZE1}eX3>Q#0jUs5$kT=@ndW(DW!Eu(J2whS|v7TzvWr( z{n-W)lpAH+aQ}f%!(T%NZgx^!%%BG$902CfpZqDhKs)kHyOcsMX7tqKL9$O2B*$0E zy2hx=`wv_#U9MEKzq;o#(nOC3CY)o2H!iIj{q5-M@0gobYxui8o_b?BeDyG4U6i@U z^*Riv!|XNWNKgz2a9?dNF4HA=aJ`7J%m>H*iqm0V`p!{Dbsc8HqkHfKO{b&6BB^Sb znJw9_QMzONwEg#EVJhuNfYMu(N`kldZ#k=fvAloDn{x%?kFejH7nu&|G2#5P)tJYJ zF5i?OzQAvhSB|!9etK9zC5#li41|>(7;qsC{3-O4^L2zcFy4vLF{YhQm_t+vU0(HK z`0F~yeamT%c9_i>J|b~=BHlrBA3bS=cJK>@!na|Kk8t2(`Ywd?GM}0Q{~G8ud|52C z(;F}U?A}DTnF!G13-*-=uFOySGfR!&EO!~>N1s0%9y!SxL{rCld&z!ggOrwoX+4^ivt9i_k^8>77ow11YL~M&vIg zu(#(RAy2kz(mwjQE}H?M2Q(PpC9t9ueX3S(vr-sbZ^Hr^*4sI@TM}?OZM|}E9XN~= zr5JPADH3Wm-h=Ibky(Vn#OS?KSo!QtSQ%*1h5R&f0NbHMD{p--_An|vasEjUNMM?C znFI|a2HA8^i?aJk-!6TLqo z&|87VcmRb)OaL_(uz&pYwtw0o$6FjnD4W|j+KH(})aEEC2v+4E-3Gz?5|}~lv%oN zM}}WrHQwN{0*QcWZHS+T7X#fH@3$kGOk9mm@1Wnc%7Uw46jx*h{DKy!p&h^DDZ==vRn=T?H?Z)BVFgp{~t=AKt zpLYbGC&4a0EcjFgO?8%%cbm|IvNT}})IBu9`dT-&=+oJCmIu&-XMrZzs0~h+SV3r6 zZp;y@xQZ5pvIMW4FW$8m9oBQ*P3fQ5F4TTGXHW!guh2~_?j->(OBlo&b!Uoz1K3#u z9RcAy{?Boq2Lobqv^23lkFU-m9_IlX#*mK3z(~!rX0SUH8M}c$#IrqYhis&>DLBnk z_V&hq1Mp(CT_g;bl3$OW^pXExRG3(90c2$}Yc$;qPq?TJjy;V&H$>~!PnNZCMGPz& zVMzs4jw656d#GXC$_L$3zA*u(DY^&I70~5Sqk|96^l$aR1vYk@MyY>d=W#};_3 z6z+=ytnwvi#ae$Bl)g+jAv{&!9Gnf z26;&jvJy5uSJoRjiXA`;PF4QdeA~O;Zup{Xu`bd(>fC7|8X~yVNJI zQ)LZTNf?|E)pyjf%13@wdhXlOdy@C|D*hZ~6#KQ6^ld;i=6nEC>6bL;maNiLfFAUl zO6|UKWt61tvtQFs1>a?9&e=bdb9>&HU3y9Zp8LS%RuEzb*}XG`d@VJ|sm6zN7eV(@ zUW59(Q`URy2-)aS$49G(rj5^|X)c*>8ka{BQN)$UFZk&truKYwHP>>6mlw)UP&wSF zjk_UEpzkkA8}m)HTNCF5?XEBuq#s*BsftUtM7bV2uf!u*+T0^Rp%9%oa+r9F+)o@K zz#DZnHOR#Tje-@X&Bwf)N@w4y76!=uyil!YsUa!qi{ZX*G#+=Co6;};?x<_Tbc)t# zf!SJ<N?g!x$Y*l7^*tg7vVgYLWD7vvT_-M z-wHHz^|DWjVXvzscuMmwH4#P~zsM|^|lD@1m-pzD1P>A2#5K_#>ky^J1vNRfp z(XOl#q_q!+na$;V63p6RSbA>V)Qz#6(3Nt|*f5-J;=BUMO_fE7Hv6@+biqcx2sQc# z5R-(3Se&T;{7TlrqmZzPO&?vjFY;{+%Ru$A{JahiLaURs6x;PlS*gFY&C^5^n ziT(I-Qu;2Wbk%%TD5yaPEe@~nQ)%bG z5BigR8?Rkk2aFC0OWb9M*;FSn7&*tEozny0ZGgwThA3`p5+E4pG5Ged_K!HhhgDow zc|R5YWvRMJ0Yu({5n6qNo?f(%iGJv@=QKuckfk`8XoFMpt|PM) z57uYDKWTZ;C@t+2{eT1geJPLA%4$V`Ob`DkXwomDBB=4viP`v-*{@nRaw6R~#jcOn zC4bFQT96j&L&oefV*<9KBx=^tVzy_(O5a$fU)Kr)N+p;a7+6xu>r_hE z3zx;dOe^`Hj6x3_nAZ&dlo1D{ZgOTTwEao^F(pc3)Tu~TUyObplmnG{&PaT)KL{pBEdrem7C z!*xf)DzqvB`H2Sw%K|$p(W3{aI=D0ZZ)|Ykr?VP{9w!s8_oB%m{o8`><2p&CLI&jb6 zR!``9T(~T=!X2-_SL%`*?Wtt3RBFK+$Aw4$?aNB^kS-KXAU3}=bJJQ?v&03#$6bH8 z%oqM`L;KY%Um)-#n(=HP0h~c){v+Z7WU2q$KrV|z4zcj00}hW;<@@&nOR2`B;DN5?_%AwD591~FXPhC&xYH`cF-}eMjw2rcp2`8gpK!4 zHNT}dlt2U=X)art5BKVxz4~Ifu(;FEYG<@tZz}5G=1^SK{0-esbkU|gPZdPgF*MKwjo!`*I{DMSzk}GZ?^CJUER_vly$0<#zC-)u$er#=4&fu z`-ie01%oKtQp^+&K8;fAJ`itkC--L~%M&Yo>Q4{6qWq!?wH5G|$!)AY)Bx(T>ydL} zR=WqmEDtzyHD74VdE{IEQv3`6*GpkrY4|bV#CBy6{nFKWAa0| z&n5bU`TK=|%ng71&N#irdr~OPzoXW73JBi&1T1&A+@q&U6?3qQlt~yC_38@_KV_hvR?O_F9dQ=KpdDJu{Y6t9ivH;bpTB{K#+=xy^-s)A^|hM0#Vr<}@_ zd2pr;u>jSA%R0*SH=OfJy#lZA+)g@8BCerTg5{WBS>3MvQ@%g_^f1QfThI10)%JCt zi+bBg(bkS{dw+NIxkM&sFPt{WbpFyBRed3(Vn@<3bhovG$OGDm_YzE*oY7zIH-}K} zL6%=t^E)0l^l&15)hmn!yeePnPrblytEUGZZgmiZobC8aFcf3afwRyST?T@p9M4-q z9&6?>x-(p#z~qUnf%>0jQd4q!rSYMhfhtGuw<&?hZaAgUo$fMTZbSb`Ue~F^!kqB9 z_*TXtZ0Zy8Q6fy<3QhNg<9>U=h7T%5qTr071t29bxhl@W>3BU7>9lw{zux%`6aMOc zqkTU<@P*5W=BQJcAi~G@$09i)lLE@u1^AAT{p>koe;^K|+J^VqV43u+!;}K>WE6>O zQ7(6$?f9ds%lwbG2(XrG4b-(i8Mq6aJ|IxUYiTvsC@U+P-|ulf`VHbWxS3?$Jbud$ZL;UgQ1 z=T%#fuiYVY)4_g15;`xpX9s+sm`p@%Hi6GxMN`at#eE%Zi}V+?khknq;?#t;-~=nd zh43?K{-SRwATFLHUcEAhG-it!jG-G0;Khzn>c1=RN3AxtTml0LS8+0c&f$3%_e>2c z6V>GZV%pC!;dJP&Cx$ejl<{_w5#=;tyf=mcr;JXzujVtd$mv&)4Ncbkd_oFdS7fsL z+NGi~j0lpOXTPl&ZAoeKP9Z8+Y<-gLkBoZUjEyC;RWR(3f-sL=D!F*((-WNQ!@n<4 zc7GycIX#r1uZ@?} z^Y|2pba^{QppdsSW`HtNl~_6`{_z^-ltMmHLWcV)f%>k;NG|3U_V|g9(o5#`bth6X zSo`CzNCmfN!8pM~2;oi?_u(2{6BT(BBMzMCA9u+04efy|MIQp_GLn0!ZQn&A;nug-FNc)R=W>7zTiE5 zzZA^9N{6#}bJ%E|c~|9ue*f2_?wo+>kxNYV*g<%k(kjP@MQoJ%eY=e85<6eDpa8-! z;xw*DI=*T09AoVbTISA(#WHG=LDasxCWRU4p&3P#B)A>Cn9;CxIh3R<3KrH&UNojb zzF>WKIXRiVC6L5;Ts_5jRQ5*P@{8!th?Vdw-puc96Ym3z07Y*Ab$*OERtu{b0H zjYN2SUnWgTpD*n-7nfE=_#s%?0+$r=_awy;5Atx}+R!ru!@jMES;stbj@|aXc)I0I(q#G2v4pXI{)gNs`8QCs)y=gJoY}f{UG76)f4D*B& z!k9ZzNz!j!Et#3w9}c3ltJ}2ad@C&W^!mHz1+4r}oxZ}}Cf&J>OR6DlBG9YqyXZRq zWA^Mr1Ss1}C>&&GHnbVaxpbhYJt~YEOgb5*2#cWA4;ECNs|=@DB)@Lw8a}}u{!K~- zCxd&?1H6h~G2^=DYscbD^ndU8$Y_br@6CO$9DS)&%M+(t>7HM{#l|1gh&+6R#-X41 zxW#^^^wmUX%+0v#5w@aPfsmTr56Yfn54~)7($YA8l`%cWl+HmipzXbOOqB@xfwu!y zQhzd0OL7?Y?1SH`wx;91g%b@06I$46HSejvbXVS-uOgF0Y#KG0mjxR-ibXq0NEhqe z$I%k;NKCNr;@+o%lXn5zFHuG&Eni)dP8pX4uMQ>K9=ikGjyj%xE#d*t_4{_p)X!SwkX&u~D`@ljfYw zYnbt2gEYW}5zV%0RvL;q`8`I*NkmuSi#;JXSMN(;v9gpz=zgb%<)`P^dg<2a8%5LTcvb|?H|-TYLITYpM(sds!UE2MzQ(^xG&9qWlEp1r3jeGUGC zNP9$#MhvAFuZJsTlC?vvu3!)4n^4Ph|0UifB#Cp*qmFjQkQP2C zU|=v!&LdGfv9$ZiyzG}9djci1Nr^#CohT;lXTAO>(<Rtf`o1W`aDC=50f&>d2 z20X%EX`-AUw)1C23lkC205W{}CI#4fuRovyU_gF?2wZ>a!L&aU2{wqIhy3^FDxmvI zsQNyiH^R0Kobo{R>>>FJ+^LdN?{pJR@p!efN`MGf1!)EQF(M|Wi7-pI8`%mZldw2d zgXPpq`5NgY6H8)lO+KIr@1Yn)DKqXLm0`+xP*7(C{fO*965w4gCaU(iJx+;yz!;hsE=dl(1_{~88YI%gnm4AiYuAX;Pq4I9#jv7A=H zk4Y4JQ1`4%#sJbF#q41^Kt|E#MV^FYJ;(D0>npD{$K_$1SiFou$m*lw!_?%*jb5z` zvf)2bq?o>`{;&EaUJhbhG*>;Mdbe-HPtSP%J|HNgpmzxV-Vn|1Z1hv{=Sr(j>gMz( zIc_}JrUz`Ye^|Q9;tzVX{KZ+S?Z1S!R6l*F6v0b?FdZ&tm)@1{kRm5~yqCz9n~ic+ zdrflok<2Z4jXq~SM^S(+7F!)(dultF&1A(8f4TcNmlkGEbTa9v_Sx-J6#_|_aX~aw z16*4V1j;^ZG&Ro6B(dG-R4SBe=r7+1-B8e>6cv2;vb~jw#4>ov;r=>tI+xSJU608D z_OXyvZ6R)i)nNu2ESQ@sd1`t9uRH1g(ruOgNm1mnyiZ8DGbY?v} zh*(FSf?S@nFc5BS{{)?*HDjEEe;L|SVkDj@5=xuC1N_dkJk}7^AFi#0PtUn2CPJrC z?uoV~=qTAOx^zCaa5j^j9(~ya6a>~A(iYRm03FhLuzwRt=jy_{jvOEFGI5_0VxHLK z5~oUZButSEC+q#yTzm_?kqF$^w#w~TAl=jt+5J5c@k{g$*m^jqdEy^y@7s{`xD>CJ zeGWo7+xUlUbuOyP3bpuU1tzi+#s9A|^u7P?aoVnbWI*EMFZk^m?-85+mUJ|!O`*Ew zOxLq?G8|^ekkX+yV4jKMM+8i-F#L|@cOeI`wGLlh9Mzd;eb<@aq)}*4=H*j;+UC`m zD^@I4*mX*QON1m6xfC5e15mmBc^~$N%g0$_dQ4L9NElcQhZZVD>5bnr)m7As+SN6c zMhNV^HIrzvbN8Q9ibKplHD75v{K_f6A4Ks!s1nsOsJX#)fHiR@Fmy8X!sX*h4X^U= zb#@+7GLubHj`35RDp5N$mqv6wPKdBMDsb+NmQnEjb(l0a{>$v#Hz zs$;5<(l(oc`@zRG!cT>Dy2Z)O47F17qI4=RLxivjRg#GOChTDh}OL+&1jiBJUposz|e49^2)F6rbx)bz3!YIQ|3AfY(&X>qY zJ|u+KC&SCHqDCN-X?vR?T^FD_q6H79DSMkl-#etQBbxk`n3LO*#Tr^&(kx!pH1le) zCQ|o!b?lV9o8z8FVSAq0eICvyOLu_9+FB#0t|y}E z=+REg`yd?}BMK<0N?`%63%Y7=z1ai$d9AqH0d$lyn1-)h7x`~+I8F8RjH71V7mruX z63;jTY%?$~5oDs2GBxKb;eFNqeKH_|Z#!|>0X&JUbB z*&pFNpp)~qRl-FiHDEiFAyxEi93*{YaKa@q>e1sH)l43b zpiG7g&_U4_cuzV2b8}5O-aV7g;HK}QOo&pnJvMvZ4qEs=_)m)A0jXhFkaylLH^T!Y zME*=eeull!Q<>y!p0K;-2;!b+YY})kDwO-uC|cawW&!b3WD8kvxpGsVN0^mYUjg=o zw?6s(va;dT~RbqkN0?flsjNst=F8Y26WgWOj7CqNyw(2Q09o8aCw`Rk0Rxe*BPg6V4>y7>MrSd7|3DTZ_?c;>uLmw>?7g&IH! zvR5(%2IZ`s7E}e^jTdVEM1w5aNli=@uds()20WLMW50)!2mu^(RPdv-KWN<;uNhiF zn>jDFrnRcN7S-EI64@AsX#NO&nVF3vpa0%UEXud1se%9^ zm_GhNw{$-E5HSL;eoTPN=rcmfKEhrn!Wr5a!Z8Q9nQNID1G*HMZbt?2{e*X(_9*_; zl+j-ygia8N!t%bFnwEhq=4j>Wglj4gsqU69oF}19AeF%Q(QyAs_?xfu<3g zpA_c7`zJ9jU7SVz6-S8ly>M62K+@kc+gX^!;UhCaQAQb?T`7TonFdSw3uWwWPz`g; z$38P9q7kgHx0&T-Wk2vAC6Bf`MqKhDM_#q!tb`}lzt<=+Ay~F2@hvl<`MZVBhE8py z92|+CXbQD#5Kqq|(;C<~bFkUhp1U5|5+tvVO_UcdzA2$=D3RRtOCDEgY-|=j%V?#C2Ff1|gQZ?@KUG zRsDB2VnKq}_ZT(OD1-kAkwqVVi4})EAbuw!s+YShA0TsPkK9aq+Aq<1h@U9}R3v6} z#;%`v!yjmEDBu}C!wmM2H%8jWH?Qvj&#z(dGQSF7_JEw#i z$0RXpSpDcTrPjHtPtGp1^{F1@cbkzo9rMk=9xUb*onkuhJUjx#H(cJmCmh4RwNg2r zkDKxHth7NqUzUXAjl)B~{3yfSQJ9$ zP2o6U$lXTti>cu}5LoyMkH4jddxXF_q;kG@7i!;%P)*r6|EvJys!Ali7S?kq0g3n7 z|M#lG{sS~+fHo!J>=$l@V#VF%;7jm)&YV~wMCC~p`Kn6l?*)_kkz7?4`JayY&{C{Q znJ4Kiu?@c~)L*AgzfIJXb`Tu?{w!~J&lNZml*f1;G^OFXjdBZCNvmv1XtGZ>D*Aq% zm_?saA_}iOcy*b6yZ3&GnKITcuHLM}Zhlg(feC7REebs7JCmeK2$zn~eU<(eieZ2CnLrtte$j;Xut$&Vjm+u&yh;}oJNp-*4IYJf13 z{en~}3hxf^keSV!C_~nR9A@__xVvFI3eQtc8s z6M2J+ge0D^Vrb%30cz&}m1J1+`3qi_Wz5UiRZ?x&d6$1qlv1sOj5^O``$tQ$lFog5 zK1x6bp3LDmNRi5Cez$GWJoFFha*{iSn-3kwZ99C(*m(0c3QT~aIa{}atvu2LB1{Qb zGxb$0s877!VpJqxooAHxiRNDgntn0g;v1VSwrC;kec}n?5lqKV851a%XT*SN#mn6X zV&n`*8i1VPXwZ*=_{e=57ETQ4Hb;CxOd_g%sX{=lkC*F)QWso{670Y;t*!2PDNcVqew*fwKHt?pD=0e>F zkOII}AT^*3M1f0=&^VYPIsP1PdAiZxo%n$T>37Mm+*#W!{h;-g{WBe^-$*y;q542o z5wfDyjF?P7wBL%b11L;$6cZkQ#t7fgGS3gdgYHF1C9O9W){v;2p6Be(aj}^bMyCAm z>mx71nKS-)$hEZ60xgT}teT=!XQXb*iuupA*ql5s1Trxl*k7#NAyj{rA!Nm@ASF~qVoiNAHALgcmuxP{vE=>aM z?YwtxT_rCq8n}BMOqDQugaD!scbmLn56bn&Z@D9;_8W^gML~ z&DqQcOh-@E#DGUYKhuWrXV{rSKH=$`ICn46_hKxlI&Kv_Ikv5AbboR2kKvpA#Zgxs}XdHp4_*;h`$xb_{l~0&qxbO>OzZ_PWgb zXzJerND!dUAntwkrsEYe`NynTjGr=@34KAQQzFArcaz`^;b@#vB7e4c^th<9DOt(jQsfhKI*-5aJojPu7=U}=7_QzV?f z`SMBKMO}RtZ3t@>X_r}gAoRywK*m&X(vxOuqq{A$LUxlSLc^cEchK_X zv8Hy9!0GH2YTgY*9*9pF9EpfE0du>51n9r`O{a}&N599rQ&o&-=w4xB56u+zm5Pxn zhw-1M`cMOlE)_Z!oEu#Zlu!DwPy@{Wt4YOvp>`TafHZq~0x!8|4@adFNzNAiGWxEq z3YeVp5U0tOvf4`LdlA0Ql-9fZW=aLHx%W}sN8Yan(SMm(G^&e?4pDf(OD0A_!Yo7Shc=1nh2;d{Suq>Ax#7XQjCktN%CC!j(;jEmX zx3bfFs-oxP$}F7cAkX;*TkL#9*2oH2T_5rB+0abemwOy%0owm}Wf_JU`(*>8$-#!h zdJNm>@}7WC*>r~*%TKY@-^=SK=?R70iAoF}g-}uvMrCh{d5Zfs$2#rk^H6aj3N;e^ z9Ut7HM=ct4*+{zD(8?@+$&4Yf3urufM9`wrPAd-kAnlNEx1~TKFd70)xuwsbM+y(| z)yCAeZc#||cxVDCt$Xtj-VQ zICwArC=}luLJW|8MC9Erey@M1u7?wqmgfRWGJ~D1x}V-UU{oLmc}=)p8IAkUkY8&9 zRn);Yk5MJIF72cB9sC|u>bO#Z69|XnZ1UayZ=hgpghFgTfV$x2(mN7G@x$gY*IdB9 z>8U=U1eni4P00RgnDT+t6CEa3YmR^4hWaRiOMwmLlVT0&TQuZ9xc|Sw zr`99}Ai^36m){N=g%AW9ksbr>1#SVk-+z+6)Sm%2PxMAm*q%5%vE&<7)BO&FBoViI zY7E4u6Nmz^8pEdM(5O_Cd^MsUK3{j6jYH&iz_W$rbTwz5BP)m`9>R17ySL^w^e+;2 zzI*#~c;ylKe+QeO+B%`<<)b zU5G(Q>@XP7Tno1^w>+Tv`KUXaq)k3~4~3s&`Q3QlEP8gr4IjP7gMHg7vh0Wj5K)Z#|g0J2=;Ta&7C)iiy#0{}jr^>py z0!jUrA2(U!pPRjhVs;;p>?S)@Bq$q0U}_Ev9iVlk22=oOFCoeJy-HK)jN+m}0NQ?t z%uY%Dm$74@k>1>;d#q~CzlG~o6i=cG2Ze~kyL(Y#PJe2>XbU8gnKkVAH4jno z7<6qA;r?FC5}Etb|06_E`XqZ~B?|{w(xr{o^H{y>_|UC5%OUYdaCiJD7QZrp1RNpm znOKouz50Ne=z!?jGPH+9ig1Q@EJ$GL9lzpad&iT))bC*VvBS69GDEB@-pgH_Ur*L< znQy^+X*@%70&dR&$J*o@cQlm4fmhJ_5ADb5OGOCW1%$;9cJ2+I?%l>-?4hVTzITgM z?CVBiZ+ipMV3NooLiE3`=Bkir7$z!!O3PT6L)2>U{t_~|aGR+^!mTE$=+OriQO=Mn z^+x+g4b{?qLIR{nXI3nyuV_zv!G9{Q2Oi7iB|b^J?Ed_xA%~ z-)}C#Z6EtPQ(4@R*DpPxu0OshQ=X!f(=jh(yt@3(*e!R}{YISVX~hQ~fA)QnouZxf ziXz6*#zU;br}a|Y8eNjL5DqO)$o}g=Ma|P33pCpoJ?=6omcV6;BO(sC4eR?(E%?~Gc`mVS8^)Ud<9Y3 zqrl%=Z>;o(BSqW(`oCj~7Vn^Wh@8;(anFiNmhC#v6uG=A{1-i#cW;y8H<}g847auR zZnqObOnQv8Uxcto*ai}Yn?kOzX`t-^cky8_l0En_u27;bQI99+yZYa`pLxEELinuH zii8hQEBp||`ibGQ#Z|!nPWMR9;r6nKZ*A!Nqg_`s=N)*uTH~l&Fym6>E!=u7*{PNA zmTFj}KO^=p`acspG!5P7KPXeuGP!x7Z~ZeZhzbSE%eo@BciI)xE$M?28RQ;WY|+^Xh_?9B6Moxab0Q8C==V#c!#JPsI}BA}=b>(H;RkMB@X zAq(zZ%J;rO_FZRNqBmZ#!%^k5i#c`hml|tru#eWk ztdq?wGNOin3MRWD=p`Z+E0-_^|~ft4cEo|fABt!A&tf8vVb@Lm*Jb#sRz zu5C1SK<-N|dv(8{H_dx`ZTXc#2+Q-+zj=g4OXXjXTpMJ`y7-0OBd7dK1e((_yQB^` z#NcbXJaZ|4wD{{A#>(}%>)$`%_`~;JDTGH{|zA~BEV)ZR%pmAu&d$0KCJrYSd2Edm*ARwC+e&2@=gp{=MWAx zz?U4BGc+4Av_(ZdS~VNJz!_b=B`~!Dj?CA3&4h@L*=BGw2L5HNLQ?Tp&zRi>Xq=XP zZ-gjaNf_q6u|7HdQ5CpNwGTl*0*yluLUk+B32OWd4%b+IuCbtvPPQKC+@ly4`uimF z=gN!2l#5>Z`(KRWy}JJqFieL!Oa%S~SRxs$P1FD%4Dp|rZWsRCdwXf_1?VBYbbJ7v zElI#vT%Zvi!0Jy0$cW>Z=1RnO+>?SSj%Kqn+mxjS;aG7vkP{Np&I4){utBzlNTR z_>X&hsuK2t`r=RWRrCAqIDlUeIrVRzO5!!5J7EoEh1Qs_iJ|RkVECOiO9EbzcHYnd zkS%EOg9^svgx8s|!Fj~dqW75OR6(s^!p0&m)uq7QpgjF$^R0fA!~c_1O#6S%J8^_9 zy@a0wkgZpq1{8-X1jt9mQ8*>f8)Bl=Y(;Z>@ONUSpa4eU^eyncrd|}ke!y0W>^N+l zhipB+60v@0PhAmK^r79nA`q{_z1xq|N0N3V<0LlmJ_)-y78aW0CDGii`bXmm3(x|G z9yC2KH{s|ZjBn5%5RmcROGKr{I3jBaPB(ma$}{g|;)KcW#x`i#v+b zBOE~Aw0$fySCED<4DweUBBqWsd6`V{kim82c_Nb==l&N;mNNZQ+#1-l?*lkI>JFN+ zDPlx~ehfLJI&4O4Jhx_1&W8f*Th;J=SwI;`rosB_Oid}Ux53Sg%S+OIGF}I4!?Uj| zZ-sl|O16(A9gP3AFM;EFZ@j+GG6Atnc{Pl5`MjKh9M*&^ZJc>qj7e=zoTOrCqNqzT z8BL1IQ^&05j|T&Wcw#{*{qFA?7j7}D|2mzjZf{nuO7=ffZ^a-|PbPf?{LS7DRO>KH z)$!bT2TkF`Dp365jGle5Afgl8#kl3NA~4~`@M!(_pGb0f8N6%R2LB1Ng3KqcS{8}9 zvKVT25-}Ha7Pix)S!;5})LGko&)+m^#%iH<4E#XPKaq|RoMoFc%kP&?oY{ zpSMoT-04(PXSZEZE2{4WWi+k^5yplkHoaGPKE!NFO1s(+^{58HFB`Aub7H7w>#{OLF zF+F>x8=l8z^67MDZx*JTO+KV|a0|Tj%{p^wrkjC`?{t4^LOjao3o@)Of^F-%4~r~y zU|k+NyxsEd`Qg^6Td}2RAJ~B~i|@_O_~c#RYbicwKaaVufAkz4do2%7GI7Ljonqd= zs=3n^>>mhtZM5%8ORy0!g5dNS+@X=?8?Rg87`LkzeM)a!wpGg6W@wGtc9%%G{Cy|O zvQLQmn2@t=1q|IXQuZ_NTZP{~Pt1u5v^4#0r#0?m&T)-FMnSKJMoWHG2_DE@6;M}y z4&KRC*Vk8t7^-)IdRVdVKh&K4?bvCzn|l9xDBTqC0ud0$F5;&2niXW$lkKCB@adS_ zePOLJ#yN-t2g~0g73JULk%d|4UO=}@ewNA7<--K zznctMvEL_0CzJ;Of6)RqX5Tjq(y-!P;A511Y zDlNSGgGN*=#3l{fg-=U=_Fgv-wmmdWw)55B18E>0v1PsfuUUAid!_+}8^A?M#?1Tq zg~3;;gdV4N?x-7iOLA}-)rCB)X6>q{7M2?SV({uKQDueRpA;at}u@dOdED1Z&AW4SwbN48kh12l({Iwoh-t-It16AH`gWSQ-G0_s=4NAl#NbeMj?>2k9qiQT+%*owre+A;(I}qY6w{v!s%ZT z3C4eA>I)f(&{9&@?muFHt#TcD3u&qHBH}B0!=CPTjC}o5che~X-2+J3_yVe}GV~d6 z!U0~ZkcPo8{@NW#RjJC7xnZ&BrnU7S!^bQL&0D{b`czq_a)lom)DPyoj(;wLV@6Wn z2&$|19>y}*+%e2)R?Rzy9u;SuwoB0T6KZALYyfgaXh24s3Y}(g2-hDOhor+(1KV4p z{&*-nR!ljA;k`A?O^Szm^I`1x<3(};EFx(P7x^qCDtdW7h3(Gr;K#o%LXx1aBBo0E zDiZv_;{um#SU(D_0!d5bb}s#hX;HN~E_x~%*qG}gFmy4HCL|nIw2(n(F1fdLpT|+L zAF}ZXHR;M-v6oUFeK$b_$>S)=dUNO%1jwZbdjl79{#QACgj;xukHm!>NdsX{zwm~j z=i3h_3MLh(WQh={$Q`1@=@jvo74)xaZPXpV3zfQTlv<2k8DIVrTQ2ABf(p0QkqW)t zQ>^#F%RfMj?Egm67~*zL(0U=<9~}S!y`K~dD~DhPo*39fqS}1&-T>me13UiZbqWNW zkBXuDy+hy$0hqXZGO>5PE?>Cg9Mi|EzSp~ieqPvZvP3Rs@es4%M@G!65oA03?zVn- zR#vfbig!6x$swWjM4NJMkhlE|vRGOj-<08(TwQtC-hJ0r*x5E_#IbGq6ferZfoTPQ@N5e}qtA$L@Gh2tcdtKx7} zKsO2XU1m;W;D2EXVL3pr&S_M9snf4oayDKk?T+slQXvk@DW@uYK8Cmo__HEo<(%`d-uzEJ8f%GR!e9HZjsZa z<@gj4SVoVkpDJZluy^)9aEsSe$@GvAFavSXBuabn5UZZ2c}TBaK4W9y^KqvwA3Bc} z@0rQIqGfDb=C1sHnOgGh_kFd(P6u}ZXD!br_vWeLEW39>*$=s4&vJpaPF0W^WfRYb z<*6LRQ%|z>ipBGJuZ|+E^`cz9pvzj3!)jGR!`ip>AlV5JgF#Ov1?E)mrA#jaCK=-n zR<}qGVN23n?3zs0w5hd2L8zY`=)+jqfl_tL-a=(Y+oRCH)79HPpg3G}GRci&I_K?b z;uJ_nQSuk@h>M%lGo$`v1oi0B7ON`eurZgECvXqE)vy=rlr~7cI901BIE~SeAYNBagpNv?ai16^H!l$3iEVj^npHDB#oFn=oQW`%Y6E|lC1UVl=h=SKqKlkBGuttA9 z`?Ty6m(j6VLlYQ*rs6o`!N2H0I7_A?NBL3cIg)qgfu{_qk`20NN36if-J}UVyp3XU z*QD(T$hK>XS+sahQjWjjA+BuWWMz1!p6t#W)gkDfbtP$&+mm0b+x}3u1!dnZ6eJRB zMrX4}nTp?NeaZBrTgWV@cIfnVgqtn#*{!?IT@)5-_kZNc7=ou@>V6Z<3Iq}*|60he z`EM;C>?U3IHl*_CuXbM)QU-}_Zrn%OT^;JB`OF=X^6#fq$_J7=dAFt8lW3E#O|0c* zMreQvgtbrc!WtFTUc?6wKb5K5T;lWO)2?GlFG{Wzh2mXabfR>1{io^`y%dHyHKm?8 zE0rw37yQ7d_@96tF7^`!k4&v$_Du0I6n2?$$KjPsfwUv%5xUGpbCQXo;x z%Q@LN=B?PNntKszgIz06@Fev9*>th>{wUlb(pom4rR%`iZF02r*k{CoDDwPMG@2~m zw`-`&%WUymvE}$^;=%d=uU3a-NJ}GB1%ij>SGW1v6s?DKwP2Vq6~hti_;s4>dmeQk zcnpm}?(0`wCOL1ZXFPg%igvPo5N9#Tpo9NsAPdz9F^b9R;``#2I9)uvaxxVGefBz45(zo_3_E?C*Pc-x zr!8o6zIrhMZOZ|N!MIn7^#6ACB8~TUX-3KO02u!w@X!2zp1MOE*6}j=CO460Hx%4L z@rVF}Z+k4UpCPLf%X=9A=J>kh)1Ji%2-tx8ISWfF6)vIQDs&LPToun$Spes-ZDd|0 zO`lI!s5OjaAL=hbuep2J)bvAChnr*&>7o;U4x|57;D+L^x1^kNRM3sysmgK$(yH(e zh`yaNjbuM=af`@lkJV;+)q#Q(UfLh0W;=+GKH04yjPZ}u7KkeVelp@GYey1QmTzff zePBIRVqA;$g^7^!jFW=P9mp|wWBz3)2x*DntXEizG)4f4ll!@F{(L1PvV3;))vuju z6;U9oc`ksCrc)&XxD&5S;ZAwuBk=x|6HPwS`C6Iuw$%E^&K~X z_Mg5HFn#ZElYrmc4^6NDho08y5B8)Q|v0F9MUen&mrDqa*IHc`8n007h^#1 z@6~M)J8@6pICl{z>aVGDbp(%MPCykd-x2v}Wz{P6KbhHjX$`O7=&vfSG%!vOz1A}~ zzp3_dN|IQAT3YeU(XK|{qbmFYEaXi1<^OeG^q`I1U4``sI1SxHNm|&(2e#v@eRmkI zu#xsfW6=6#{g_BGA-I6jL!fnW>wy8`Yf%*?UXqReQ6m1Q2DT{*pnv@j;m}f#v74loBWNlek`td7f|$fNkACP3B!+E z6hN(XJN&A=eHf)D1h7PC5 zIUaKfzDeT0!w9H#+*y_GwA#Zk$@Y>ZW|>X9se3&F`w=pBgXj$NhoY7`&gjTind43zV3-$EXs6kR<&7H4}0?y_}>RH4$9kei*D-?=s?>Xwu;8 zTfmY9!?JFhYw?m~0oKa>M7ox;pO{E4<}LBphu$|mLWIuv*4D znkgOb`LEDY;+w+ThzM61jGkHy`TD!DHmHBp#^4KyOk#jFA)Y1!9eoVUKqSTKQE1iD z$*j^s8y~bWI=dw7g_SyvFd_x@4!)!y;ErusS~u1XHchL{R=^Mx>!nGSbMLUu_?KP< z-f|HtdWAIhc@DekzAb#7J_2T)&36?W-L+Ej!5-}Ocu?(elX9)Kir>ZRHoY9aXq8Kl zHxG}U$n~TAS3`Z(#%K4%`C@r!xu!=}l&(EgJ>hR<(`oNf52t&M`uW`H1Oo_dewA_% zM;);Lm*C*c9$NKNeM_&=woO5msr5*$_=xL7fOk!o9=@jn+Axr*)h~j+;Q$x_`AMc_ zJg)J5p}h{Mt=s)Kc)*vRP2 zz6f=N-*At+Q97DHvHEV!Wam?DyR3w!(xaT{ta=A!0WS2OKZbjxeaYx4DU3_Be`+;9 zFK=~OB}<&{52dHl{2`N*;>|h2BpOcI0OE@O~ZP~8L^k;S3@`X_y&TUnv*ki3PRuw>kk~)SwFqtQT&DAY$(vj)(+f$mNKY;((YSl$c3Jc-a8-`jO3pp-5A)I@sILf>0@=(CBUCt0bc|KFH$b~sK zD%7sYgqgseB@#|9sZQB4ALH{h>)x;Xul-2R5D`pFnur-_)5 zZbqxKwME6sqHf?x>pZGT+UnlNCYQFys};}TLhM=M(=FHWW`5bv#+g2y z$lbOoIM?`Px4OD-0X+Thhj$Fdfh&#OcA>vni$nC+WuNAnv#>2oo_ApWI)DC;U2C;<6pl$KJiHV&ih;M)Ue_ced>7 zNH7q?Rhl6Uz<>05Byp1oeP88y|#Y= z)x+nW!15z*WTb*7h*i(|Jdrlq&G~+9ug3xiPkvqO1R2F8k$ zG+PO63p)hR?yeqHzRuN%`OU6Gxl@0ih!1TY&=>H~%vpxs*GZ1?S4l&M?*86d+a`YY z@Xz+L4zIy%FHz5yy`}Jbz8E{Z5ECWIi+d;3l>4ps#vdP7Szm_GA}fU6FZfeiET%$m z7(ug!F?|GE04d=ZDz2Pd<e?L)LiC-+SXZlgUE^V;F6-?>>g<;6#m+lBzyTn|)(PXr6MN&p83ylivW1Oj;_+>m1Shf{*LG#GV^?F@mbRzvp&@UI83m+S@=34N{Q7(EDA!+~t?; z>HwSEft$OZSKm`l@T&rUs)Hmj{&&G`Vyi8b;x9-TAtJc>F|Sh{t_LO9L`?308R-t# zSd*0EvqXv(1yIlB38y-Vf7s9S{rGxT{^m(&^Kt|=ubc^N?AUehzKRIGPbkT+vrKqm2>11a1+LQ9s^vvO z6^%c)<+Bj`VPjikG4FoqcR{9~5Y4$^!tBB?B0X(x4nT~4q^PzwosKvGREZvw3${nZ zZ%PKP-|ffOjAI=LNVy$&VNhxP$RJ7HY*d^M?(!G(Bi(1u2u@vFX19KxUA124>JW%( z-uLMBjd(?KL$>BWdgb^l*D76jXr6A%P^cWotBi$%5#n!o%W%#SUXhzHm zsjjY$Hy#Ry?+pX%gm}dllBp6P9)gIb;KF?xLNY|z5`CCTbOKWUDUBkwWD~E>EL=<( z#+$Zsw=&6yc|GPg#EKHfgP#mr)xNGwg8swbsPkhXlD!jo^CO2SW#phsmBu`iQ>=(L zZoslH!Y^nTl}e%SSI%%mt;Q#g6EnI{LnzN6%ym`Y}wDcN=(4P2A`-FoyCH zH>KhqO^cauBR>NoK5Hb8qb>h-)HB+im6j=X1*^NaULK86C+l({iMViYm5KCY>wI@+ zA0Cz;jWh{lx+AbAYK&PE8S)kjs{p?s%g0dDu16Qw+gdj|Uig^zWh-G6{GsAwdJ(A} zXpZq#O#>@x-qn+Sy$IR_DPBPW>aoanj!V2bP2N^KFW6QLEw9^pYDM1Dez+ZVG#?^` z+CHZ0v`hb^`eDj9y(tg6P>kp3n)gFg3fwW z=GYrnzt8IUXZU*4>n@ZU(rnvD*Z_y^WW8hx&dY1gXj>6=G7RD$89pW$RZb?klwNa# zn<}lIdG?&W@%?f9b%a*}Rp{6z z`hhK`b&kA3RPS{*hUsU~Sh(`$N1ZR*QLq@;o^e9Ubm0in2qpL~a*GWG3)NPR^0dhI zH6bkHKj{XGwtEAK1pNz2khrw*Nkz5K@1frwKF$g{g=@iA(j?O4JKzhPJ7VdWl-igx z8fJnW6+F+uU(VxBZJW}t+00XqPi|o5Nn|j(8DPO&2^iP6t##qf8-CHL&g3-}hje1U zw?&GgKKi89jHF=KJB286EVP}|_=XrC{z6dP7dKR@f}Gnfw5PK`xwRfTQSx)c+dO)% za$t2D$8UROV%-6_AA$mew#hKY@0Xggy^3Yavu3J8B*UuIMdKhrF6W%q2O)^>bqXtf zc(`}kCB~D=S*5hN3&HDR8bCi7hwNpj4Pp*?8R#A-{MPO;^60Wjmj0A@Wo~Y z_#5>Z>5gyyY_Z|6;gsvAYJPbspb@jCVbxS08_H69Pdwtir!4H*k+P!SaXis!f)3Ew zN|%68+eV)?cnDtO;1>E6)Tg zOjFh$B{e=o0Gk6eM1gVCJ%VKW-3vz9_gwccyD^*0&8f<*Uw#0D*_8ZELbO?C z-0G?>LTW!w55>@1ZZ}Q=H}rq@Z>#lx_K;0{cyDugpLU`Hh_2!2*ENJE%C;JzWaCuqCpN9~7+5q(WILEG zSWPR5kUdi}Pr&^-=j1isrSjC3V4Eg%-vg0>Q4mdDZG#J7DGsp3!j&pH?r#Y-*Bj2Z z6Ck*t80%QlflpnD$_&OrGg(L2ZR#!5d>1EHI`-Lo-7l3nLxf7d-$9gemkkzOuCh*9 zPxst%Pyko}9XAn&|D*0L|Due#w&9cR5LCKULb?%&K@gA8=?-K#`E{P*OUi z8>CaZ2c&c80cK#H@xHI?eV%{e{W5X>cC5Ykxnu2htYeMzUnB8X{|7qGddTJ*{ybs3 z@m8dbIblF??JmFLh9b^*myiwG0v{ohp-THM#VJrx$)?(T99S%l#P_#BhB=B zU)ySycNN9=7P(`E>X@0^FKp5)_3G)b|9F)1vPdiagnhi%Xem>kb^W(~Rr=&Gxl>)) zQnhOe7oEhY>omQJT8e{($p;$g$FL(D7Jr#3Y^ygX+q9oTS3`=b9fb@((3Lvec|53f zz`1qW#4tyPYCnVe10JGXIcPGfGmS$6nGpHCzc+z5?E)+TQQuDgER*kyod!RmNq(0i z<3vy@*$Py>R7+qbNNkv{_<6^id`)w@@hj}1uFaN}D$hc(YHF5=r>7j|Q?v`H7OE;R z^qIN$00^iIWl-w$Vn8X%Q8%AuZis0^Zrr@%w3tu4MG2T%{)#F6_#?AA$urz>a5JAO za!n3tzfk&cNA@L;k;g$1SqDEkbwcHlLqw|t+c&Ajy>Ql5@xQsU$czq!M=%p`AcqWw z-&qE(Y&Q6spni>u8%3YCwqz&$Ez5N!$)>iM5(U{|fsD|KDdS_XB#c+ImB#lfvl)4! zJz`1(+Y9x_ljl8K)z%55>mT$UU>^7$S<~<=jd^|N$>CA!MDeN0X>e1TKu&L|T)+%C$MDH(AsYtr5K~UL@m@DyLCU**v4?8A; zb-(Qc*m$O#L)VG(jvoC<#_YsR(;x15M2%|`e_S8tiRR|xy@Fofc9uskz+G>7sUYVM z*Ivu@u^q_9`gChx0;w2JSuGRV{_;{%3*!R(F)VX;#n*wdZ%QFo;%~Y4h}O?WLa=b4gk<`4fn76!lG%+{K-hBm=kVzgjQR$XIos>ZzN8K+rM$xjJ9 zojpHBKBK+7yiy*Z!QY1&f9XY4kwQg)%t0n*uI89lUah-G_PGSKC4k9$`nZ~J1a5!w zIpgK5RdXNT7b*C74cKS-`I|5=WX~-)B9qZa(ouHCZ!k$Z9Brt7)O5m=SN~faCG9Q6 z1$?MzcUZ)=@pkr2Ga`ZUjBIdh;p23graTQ^tNyobJQVOkd6DWHQ)rZO+FuI|fXeO^ z#Lv`+AH|{S+I4mY*>!%W*gr6HiG8005U}H`?k;o*`o+w6mv1m85?9}6?4T!^0a`(( z7uzW={_v&lh+$HCl3}#17@M4Fe3+ocILc|s=wNXcxA~e7=u1XyEKUcyRd^-l59?sA zy)*MPzoGL7R4r1No78`v|EXg2p)(=?W;+TjWji+m)jpxPl@iW{l^TB)@Ho>LiMfn% zqZx$4O(w(%@;+){y2SH6i*>7;6)(fGU|KEB+jmrIaHXh<4RS8zr%D#;vr7E(T}*BB zjYtL}kd)-gDbmAI1$ZKv&u2qB{S~YsmOc7ex#=YkN@2bn@I=#8RIW)Q2kXcANfQgw zZNkeW)MU=ysp7?>(u)ds3LJn?L{JWNg+#$0x78k_fm3Pk7vz%*Q<5(f2W%-h0T+wMVDUO_74|#tjlxh?HL#F&USiiW4yko{xhGBGT(0EC)W!aKHC!c zVCO}~+d`PwuTj=Zm1Bq6cLnV`+^7cn9gy(1ApQHM2-&}PRBwXpUgRZ^#wWWz;WYg7 z?AhxXB{v7NdNj#Lxs{<2{p_%K|w?kW$mjC(d) z3u4UaA~-s?rD2PVP+VJsPlC*{I`|nU0)JP#9t6_azYnjfwE)Y7PyM7PWm`0Dm>GGa z$&aCai+GghAV}2%Qrs_+{ruKXve}kl*2k(;UYO3W;=#VV-rQb@-|x6QMG6^3WZtqL zCiC>ST4FJdsr^S78c*iG@s54bA{lW? zHrTnGDXAHKR!!%dmbrl2a^I();3I!D&C=xTcz>1}B|^8}wO&|4iIcp3!Ph9sfUesA z_5WtV>_i87Ui}h3D7Jhrrg~50sZK%&8NMiORxS24+e1h2FhDA8xmLLOY1&RB-P97? zH)#2uj>uGgo`6nzIh%lsW^ZFCkt@yHDH3DB&f(-CQ;%avKe;Y?D2tn5#)uv&;8iu*nRo*LbsoR|EecX(8qqO1iI(j%QXOWYVML%Cz zoAkK;)6F;XVi}iZMTm94J?*cCfvJz~`LSBcwyyMAa)OPiDdm{VZzH5-DH;a|?=7a1 zXrFsbe{)@dnjIP)FH8v(kS|4)+uAqsNJWqhcx)zwNhu6g!F-n$Tl)h9kgd*)sYI3O zPwtuQS6vtZ#~U~ygOATMFi17j;;bFDB78q9j$j81e`P!j!nMh7V zdc-qG$%l-ZyQPFXTBV}#q6UwL{q3>7kNokQ`!!I*(gwKSS6u)3a>(Hl1z55ugBhtn zvicIUt5y~b64vTZrgM^s2!GL}+|xvnV?>eV;I-iVIbhO3cjmbp?yt-w6t}6+Uc^>T z5>Ty!EgXyqY(hCPXH{=Yb3Zm0G&_q;&)V-9-=mdYhH4f*&UJ47KXnKt*AE1zx%810Nw$JV-L#W*$kBtd{%f|M4WDz$6t| zTc()C_qO@nXi@xane4CG((P(7PI=%6EP2Vhs$(xdA;hffs%7(p+DE8*Ou{eiq!ccq zcGUZ`@vH;eZ!1G%|2)A%e$vwkJ<65!VeK}_&ur2g4)nAaqHd*Y#L z-2EyGI>*>$`59l*XlynmU!wf7F2+IUH`f#7UMN4{g(~WRlHzdK`E#L3=nx|QG`Y9H z8_+}ImD(ho+s`NP=?MG}Ms#f`UeX}M@tZONdviR2X5KQrFhW56SpS1dcTVh-l=hoc z2~Oj zM0#d@UGN7jpcvk-9tEI67rS(Y_^k<``#sN0?BR{#o2@yPZ3zMhG~)7y^!D`Z7tt&d z6oj2f7NQaU*M7%t6GhAXX9N2#m9Y%LB5WU)t&9! zrt#OH{?<$C@lXAnLVe%KBM#;GB@d7lZeN(O8eD>$!zwmbPTE)_R?nDxfPi^PqRP*5 zo3XPiQ)7M(hk^I?t9!wE5z8uFrDzgZ%vZK*4w)GuKTP%DG+lJ-Ek4oq^xX zJiNCJaKaGtr9q-C_u?gGep7KZ=nTNn4Cp$AM!_evkIEI9+0R#i2}Q zgJ}FKzv9iZ@F6XB!`E4c3c`A#rp9@Bf9b0!M!|+i`F#9GMpa@>P}Hhi?K^GQq%?ej zg^YM9_+#f zA53V6b(8~JI=6q(iR@+E7UlP5={O2QXeW-;gDgP9a zitTVFyFgN{$`sS|TO%Syv8lcC>&{REKUE43{QS=1IE}c2=rr+DXzZ5*DoK#(-=^i1 z&{rp|K14Ti$EE*^@>A^3yp(6Cx))diEBAQ@_p;0#PA~6fb6zk#;TX~n2#neZGl8!O z4AHUR_J^8SgQ2i&|BjH9P|1U$;FM(0rZl1HBeYET+tqwAeoULJcYZHK{=!bDPoHia z2W|*ho3{q-J8uOsiEZ9z@opM`OfpN5EH5n33mbE4pZ1Te{yuYsJR4sN5Xkgp@T}1* zK}@hCy6v!A3xLsY2$Qt(=iZ-L zvF2i=O7A$WWSL($9S-3MTuO8yx)tL<*zEuAz_FLEXH@rF>KhJf*L+=ynLQo9ou0X} zbQj2+2r!S|x^DbL7jN5DiarfscF9Sy*^OH@Johme@O+#}YpqIz&4hJU_D_C-7~KD9 z>FGPqR5Ww%KcD@7d>1olgHQ093;s_uliYuvDiZyx_Ww&FbAo|J&;2*UzkJfbznAO( zCh5Za$Ex*zGcaER=*93qHT=&P(?8~*|C=Fr4eMWT{6A#|po0+pzZpW%j8Omo5n}b} zk1w9vGqJKR`<*WmTv^HSS0xHpzd%OJ&^`R;fBM2lJ(bd}8}@qbf#jnfcfNIiQps_(e{_ls_5IztkIK%;s>?{V8;Pca>@&ZZ%9HXNh{$;*dwO(%c zmsV`>Kgr^wa2Gi$lh$AQ4mY3V+)Z~d{VVOJbaOe#^BAhANdvz`*BSQTItQ;O8Mmz5 zN{GSA$a^Dcguwfu#`lWo0{NbAFrL?BF6H&N@}h-{`ri!y1W9O3>_Vw*Mo=fXM5F)b z1u(gd?J~i4G!?|-9stz;Bm9`UwhokBCdp#^?|c(A z#|HjaWHY@Geiw^}%2U!ZM40Gc4iQ+$%8y2K)6w-M$1#dG5-R?aO9FH1opoWJpG>I| zpNAc3SU4hP_n}thb;zWvk5kQ>ambk8>Ygt?=wp7&?QlAJnq#4y(YHr?>R@BcmWNc@ zTm9ntTRL(pi#oiSX&o!bIi3{OIom;ns)zk%!Iz}HM>mj=2IGIm=78{F=8I_KXKIM~ zuYx|FSYa~>oe$1wif6DaGn`0)m${j!!4q{EuWVcH+i?U>IJHtu@>Kq zcToKs_O}Xv`M=?9#*`!J0}HAdbMmA;+rPn|{y>C}`C8lY%;Z?sj+_?t<2vfhJ5EeH zA{Wk-T{|GJH0?WSj#FQSz0?^)0^}-~c=vzQYH7C5>{f{`&G=J?Fd@JIZq%OyJ_+RP zpg=r#w62U(inigjIxw;d&CFQ+e#(S>v@oulM0>Zpbam~Xw=OVL^oAN2yL-xRf6{lm z#$fvgH%s?xtQ@u2uYv1Ba_h^|YvZ1K?V&bs;}0`AO()gO!yI|7ul_6lUmAe_zSeiY zCX7RZKp%KO0=}9|FA;eysTllhOmtgE6t9PXH@{DExQm?7{a4uc26M}7K?%T+B}&UX<%7vHg2fz;FK({s z$A{r=F!al!V}lL+>;6hE4X?E$$PQB<%38!#Df#odGc$nDj}koZkNk_Z0TsefxRDqd zRyLgw0Axvc(th(QQwU4|!0W{Z0Gk+iVIN%DBh%wZH!5*jA`9dNNT9nx!}Z-BdkrIn z6)^oCITtK^=i{IXVFA`iz#=DzaXT>5fS&6P9QBHEYkc?{2ET#o%Ax)7YOT+y`&h+>EH{2{A@kJV7Nl z;-dp(crG+HNB+KcHfiVC@{XWtx8leXJiQwd(3xiMw`4N>jBkmIW~ESAq|`V&t))Eb z!iKCvCl8qRs}sh(i6Mj!R@{u63d@A&J~{icI#j+ZX!%L=1Ts4<(&iHV$1Uw!Db3uH z8K?AmUem#!2(1O7$JJjS*F@-lWq&|&pV$Y6I!M=@TL6*;Q&GWf29`N>ImEvYdq-1yG$Eb5w~<9q z5x-68%GSP?3!A<)G^O)RfxO)${JE@x;E@)TJ^eLTGy(4KpW8{fI~@e0p{2|+_zf4bOo1{aHG2w-p4V+r|yZGBhsEsj_2rQ&mX(LL=t@29L zE0L5ipG^4NU;{3GM`1okz7Dxi+JJ=XaZPVQhUs$So;?e0$01)$|HKL3qr|cyjaj<0 z4dCJUI6sh$xLJOIOtSJaY`^50G_%bt{2``lBAR0l%BX5pGdCk8KEj@m z_U;YZP`2w0`WTq6)Oc0E)g2NJdN{0}Q_?^kmg7$nv?l_$i6W|bMZO>06k~O@V7dN2 z#qvd4i(735*B;-BwYcpp3Oz?g64!!zH(vQcZO8_V;SN zOG0m0hH0z&`Eb&aQh^A6lCsEsLsBax*%`f~IyJB}yXbzf%L6~%iMl%9xtSLq7or1z zwT0}#>yb)bG{#XoA}eatG#y6PtS+P~OM`h?Yxl`iLX>G~s$KZ}uN5%Vzq%rKGYgN? zl&<~H&R?*l%_6RF|NRhhjE^hBhP!OtOyj3Uh`7~#&{%jI#uHSij zg9Se$g1JAV^NSfhY5M!v?7aJ)%WS&x)UYjozRlA(8$?CSOYJ@Q%%&Khqx!=FMc)d} zqpdIWwr=#cXs;19B9UGmiShSr$q=@fm)OSpBU~hf&se6g z))^Cemw9+AR?fB+8<02bq7%h(X%`yXgAK(W$B7Yxb=2~mba&i*G=}j?dt%;XPVWA& z$rk^VH%!B~QB!qG{cWda4BfWJJ3PwQ?p7xS+q)`b2#3m><(3Vt4tEYSOQf_H!%h_H z9FY|cSPucIX3Y!xSs5lKO|(%Ihe~0-4Fw={U#XJuDvJfM2ff5vO)|Rk=y}}Ox3yHqmA|z#z11@CD5I0%MD>Z1KyRH8OlW{q?-y;h^&?Q+2Z=(7A7a2n%32($k2yLYX+fu=Q>+y3X6l zuOKi}t(hL<`xXItZL|V-N)KT*iQ>nt1={L4a3yj@OUfr5|Ewu3LQ%(FaLNY%&nAA* z&u0ew7F1(l#LHU?&y1Zf&D-CXfr>EBm*IgGH~yn{9Uf$SC@IQ93lo5T=-qpjoXA)F z9j$IuupqA#&|Oi>?Ima#X-E5%e*wu$M2LlcEtwf-6Y0L>ZJ$Lp#!GR{7vawvN2Aocl@qb zU&5Q*b3kx7Q$otvjjpd>xoaUYq<6HS1-Yf@eU}50*z^#WTy42~nIs)Q+bs1ruv^-~ z(&svnQ`Q;7uH*NjUwP;n{k(8u2PQzbMVIow=iv5y$sGYEWH_Vbgtr#0w>jpsgfxze zT(@yM))>1N5rQ$2QSP;_ z<%OB?=U3i)+j=SXNV7|3!0!{_vC{+HC@~bdrc0c#zun*DVdu`B*XLcrlnZc3K zIA}aOcs9ht2X>*FL%DqQhS5_<2?|gnBBeUIh*7y%z@jvZd8tE00jrcgHgjjpu%vhI z`dZ}O*jCF=m4>ss$#4Fcov+Pp7ERlWgy14Wikq1j{eh1d3Km_ z>RS@awlk4qYAn@ew-m~@Cu?VG@qbdLVvDQsF~znA;eKj=G>x3S+UXcZSS3>ZXG^c- z_UK+v0e{P)3fI$c2=MA@bTmWE*T5NB4J86C>X`OGm$DuCJG(rLot3OR#B=U*=d%uy z?atw0`AT!<6SlQKsgZh?hi0`oc^&PRg@+!3d1qgL2i#n(Hkp`j)d*{W)vQbpY{inw z3zRV+FXZW;58;F#o(jq0Q4_7na&EZn&Fa|A01!r>ULmXPk8Ds`))1LA+;Qke|Lka! z$d!Pv(-Anb)r%y^>86%A9OC}NhOurs&*3{Xmo-KN*s@i_t@qYxa`$9WyB*tgDN^`s zvamL3ej#N1+ph{^mdR;B6b7n-u7aBH{5H;3Orv5#R{J)-eN#`{aL>6bMF&bgWytXx z<%?c$SB1m|&ZR6Xs#l7+jK{u`xHef5F^RnMucWEZE4!Lp+$L#oKhC;dyu9AC!VNWY zuYD#w|KKVjM{1bRS1*+-?<`68qWu;j(ebvrBgOYQBIwwQ%)jBLiUn}-Ssrrtaf$Fe zCZ)T9n`}jfvI1qMCBVsKt;@@ZN{bJHW1d&lwwKF`xAX4sf~zFWcGv$ZT*}TU2Vcg@ z%@1z%$$g-hwo_PF$c7NHncI$Od(Hu?_buixVgy}v9o=u2<^322@OthCghA~t-1P&5w3b@|5?W#>0NHYWE-a{xp}kd!dKgR z8_*Q**9QQQG6b`#5s8$F50?5Y;KFy;MyrSYsN7h81;!`$7;p;yh1zXYB!wJRJpkq- zU%7pQ4S24IjM_HC_%4y49TFt{PT-O0X>td6@4V>jvBsMFkVC~C4dfP|Tr96+9|JN= zJ6DccPJsVafx;(YWr8%EP#v`3+tS zy%30>cjgswfcCo2eADPdK;|h3mKsIb+4*Xfpg2AkkdY&Aup3)BHv+C3XlHX&#)8Sl zY3_^q#{=)JI+(Vg8vjwlh9*f9Qxnjdm0V>+V7rtK{#Z8hDJW;iC@F`}LO4)`Z+%CS z0X(a9QS<5zz&tG6a^5?s#-}$KdWH(6zHe{a7(dw+oiR;(xwqB03`@JDVbrg0yW$v~ zO|-w5E5HCI*%RJ8oE#|F#lWmmq#o+-T?nyYucps4W>s#UVF!TXhBxhD;JG!}+&j4X z+>v|u+0MyOn~e$B*@3nX%)h&Sr?=5ja0+_`Np+8?bDfur3_gjFC!tM z7wWoHWmln_^DSFi6{POIj9aftG3VB#pxEPrK&q|Wl}+M?Dx=pK16>4p zh4EN~GJTk2gz&xhzy_wde$HhI4S?pm2Pc0Qk?dE=xk)_FM!+j^w4=_VhyQb-1Nqg~ zJtaIEw+{7{d3g&K;=j*AxbZd2ag>2mQg(J)$K9)w``ri0AxeFY$F-#@4FTR;+hQDH zmwD9ppr(be%QN@(HXDbAFs|Y5M@x7OP|0uMBzeSlPHly+Z~;gk=vEd3;=$I35>9?> zm(k13{`nBiB{)>@m1~b-*iGR4>N%E7qTw?rVcBG7j+GYp%jLx^(e2o*a04baK1+rz z@B*!thZ956w>sSnm|75^<>TXyUyRq92hpMRh}aGO8bXM|Cy#!_Xm%f7Yji~Pg%LFa z4y7!nM@h*(j@8C6=2Pgb@%@6sjW%v)(U8i9H*XMfyfxzOePAcRyelPqe=xfmhPFh( z?!afJ0R-eX4;A`~hyY;Xekv{bHp`^#Y3M=KLZhU~Fk||V?UU{IrxsErl+$MjdzY|& z_zd}U>F!=^LR$bD0~oS}N({qdu2{wbPKbf1g9I)~@gS#w_G!ku0vfEmD7R-%0seni zS|*xFHfy~faI?wsPw=c)W+fsBU+1_hwmU#WrfQlbXr zX_nC)eh&)05s0=R)B0CN6hun98Zepw#=TgDC4}<`jR}kZ< zy8yGAM~6ho+`Ubb#V5kpYn8Mpa6{95>6X<7+}41EFQB`F?7)j01@&S97?^|7g<y{{+Ijy>o>(^8Xr9c5-OA&3nq{G^1Edvi>;*A_JoHUw!xMH_pXr06t&^qt+3J~7>KxKasS%4CbN0Z?fJRCUG+U^@HF-Z_n0_ouM^h}B5V47 z<){PwLYp~pee_0T(06#ZMELvN1#*j8zW#pwyw}L!*-J(09tfcYYq+7y!~vmCRor;t z4@ul826<5@>m;WoV}FU&03URCZIYjb8p2EL?kI}8mZN_0Y^~noJN*_@ zC8vYMM4OI6BQX!ceb!3{ssr7N1N){gC_F?YE+VF(v zWYtWj7=X!PB!mXhcZuqM!mQfSx_TXA(y^r;Wr$X@h{wIwIs5vCt;0CgzB zUifb}`+hoTDPK@ePD6XJZ9i3#D^mG!H0v3Wb@epJ>2WqP;39jymS%o_Z}Hqez}wk` zIO_Old6=i#{s4aI1h#82Ep_{pDVEjqEgbdteZh=TMWuc+rN2a9_#?6(14C%?tz|3d zX#RKg-=AaC*6PY7@&5+L&GvGyEDng<>k<-n%U0xCFb#}b=-0}dQw~W_cv$(|2j;uy zu}Js3(|VlKT<^?qKFDGV(m5#vzpef*eB`py@i*-Z%5Z(RePKZIQmX%e=UyM=aKKAj z(Qz+*2fmXORcwx%OSuR=RLuPgRr}9Q`*>5BV0|=*3eem$O!OcGz<=zi;NpP9`E@&@hKXhzv%#Ga-7);%xJEQ(#M?YfI&)$IVm6Ahk= ztOmndsNE-zgK9U(j;n$a!O$iwOBpEu=yB3l>ZY5F#uU@BI0zfM?wYw&2%;MDp2<%M zIfmBfVkKJBUvEflbTnWC{Gj8qcW@+(A63i*Gm5ul=zrP%$`PU~2^dWm>r@r2`#F_) z_M2o@9r)c{!Oo*!_M8X+uoo{g7{vI6#KM4N8FfIfImf4w7srcV2~wi<9^&*MrYCW zrX_G3V8>(?W>BW7uAzFeAD@v zlrndlnv$hH?6>}*kra^5X;QA31k!1pJOxE<5~Xe$9g1-0qDB>vOADjv7SdcBzT*}TaK%3`YKyz{XS!O z0JpdR<~U)!4I3{Ww=v6>8vGE!Cmi|ZXjfpYsH7qD3Ltq-EaBq9(eJNJ?o;)w%610J z@Hvgyy>D;z!FKm}l#uyPu!2B`r^#ZoUe$wlOl_1AQ=a>dRkk8E@O(kN?;IH8USsOjf!2~T}u)x$uC{H#~Dcps^pf}R?agO ze-wt($3nZ@uc5Jr6Vzj(W$;!;Ku?|~aNhUpZFq`6REi+?wf8k|)zgkoYY2<$B1)eh zg_CS<9cipBLh=&Ro8BdxA51)tW`=2x9uP51GQZcg)gx>FE>@LGDVO%g5h>8`Rg>9- zzHvSG-+NC5i#h}65#+h7-qlO2u5=Xr>1bdCg|c)uj!VwH~fBX)d`*wU0)s zGo1O&hvg5I3g7(_?9X}aO39kD4?;Nx@is?G(sm&5-o)6He#|({AGUXoIn88fxxFj z(`#R}eCy-)a&tHt7TYy;#{bNRQT^g2oBh=%9^Bum?d(R>Gb=@uJE0$qg~K?p`9jI6 zB}PA%vOF0bNYG-i{}aM$tAE3)CBv_?32d%5ZbN3EI$b;5iqDE6evysw&YhW|Eq~>u z+Jl&cW{;SiCr|kobqzTy3c4x~YI@~8Vv-Wy@y32Vd)BYzl+S6sOz5i{iM6**tw<)L z^I6FGBMGr)4%No)=u%|-H_^h~r!h8c<7p#Bzg}-Y3{N%vn)LG-KyH_Hd)xWCkOWa| z3#eLFP{rH6#O?g!hTJtKW{0NesTDrYQTer6+&k|Ja8?B>K)=SU8Eh#()50l^Y@^E4 zK%6{Yl89ELdfnV708Rx91I^|Dw-fKmUwZ%`=lG4Nir@XMc zJaSbRXIPkTEqa1ztmJOO!0_Kia&q<=D@ZT9HZBJkFH zwAUC+Ss`Z(2ImCo;5?J(N#nz?QQ6XqXf92aYa@`G!H~>D(*4KiY^E18x||)k4DK|Y zwJ1e1Due?7z@cY(!S3$cWJffGgCGSUXGiwu*(`4Zp7K!O;D$$V5WiaI^aEvyzqDtg zzaj<#_xiSR^suBDsP{i;)@b!%JoM0fmcxewAGzDuib-k86f*k!S4@2`Zpvpn_u$4d zc3KF(;43$T?-_=QC`MxHfXFEI*Vy=g3tfeuoQrXsF{=r<>W^a!6t8TkG3+IWQa5kX zoKG2DL?X=-Egk<9s#pPKez=|1o;>h7Qy~dhgOfiz`y&{Br*7@TW9t_9D#Sr8?v*Vv-7NRzQ5ChEz2Ne4-1FsYF3I;x^)}-5bJ)i` zXs_)afy>!Dd>KSO&V8d5U=B!PG3()W_KcN-9PvEnlFgI&l>D|Ukf>PRL0d~$ahpj2 z#hgDXT6c5KZ$z2Wr`?isr&u`7`Yg&|h5!IXzM=*ua4$M_Z{A*|G9V%a#`r1R>gM?M zWCF7nf?g83($7oNels20rvh@T*fjjK{5JXV^FmbU&4Ku$(}>s_zKh|c845~ZExkR} zjpyN#akiOVTo{E2qj5>%`|kw9R(=5jf&1s?Ec#x{eiNK*>!Un3$6m|LmX1Y#lpxhQ12qMQl zTF`uVN(^L8&9ABmU}ynsLV>!PEPZ}E%L&!}5>=dA20Y%x7RAE@N%9lrA|a+*M1HdU zKoxmpKAw|S84s4rA3YnZ!>0$s;V_$uw!IJ=s;2vz5nqK(a$un0%{Q(CM|NmaSi80h zqr-@egWvQ*CR%;n`H!wOm%OG*honTzO7>zn)IG%p#DNk?%3ciIsY&?-Y|;67?=TZp=nfSL2IMsP0g!6Sy<%Pc?cg2G1MaT_v{LjZ zs=A9V#3v9d!pb;m<1V5(FH>@TUkLJ zfWLI1cCTW|7SFHa!e#Y1C)uZHCx77G5|fN4b8d9@5K+F=TP((OMT1W0nI4IFe$}8Bmb|78) zbtN!idL@f@4_Z9|SppBOLz($L*#h*{TT2!JheSI}pHYZx5q^Lim;Fou2Ls?Z5t4)n zl37N*QW`Hr+Z5-qTte2NSO81g%9aHWPtxPKBaCpu%82k^9QOdTS!0koS7FLaEb<36 z*ldto0)S;C=>kyPyWykTezBWl2EKBKQV_Qnp*J6EP=*;_<2Gq-cK?;C#m8hqeUC@x z_Rccsbrk?=hiPIDWUr_ab)PX9_vLp64oJvkr*LElDZWYM*<=*L(KJWWeZ}omZ5p2SS0NL5`-@mbYa7m;nUFScYKGE zfoyYL+=5R7^HkW3EX^IH+aN)-tYh|15OCw!&a)SI5CNc73~lC&LU~Z^-X=E{uix+) zVb*M!awpHvlLNElvTpdocz`TGjWRPdZVv~33E%&r-3E$B5loV&_c>#GCkAz#0zS|L z5_W}4)ou5B%gQ|evJQ^g*V!{qSlltrX&G>%YAJHBhheZ740DSJ>jAY(2JtitXyY99qivfW3YOisqEgF|CRmoCQ{nuof_b zh;dMEJ{YhLXrM(o2%AFPvmf9MjjI(G=jsaY)&87ZcV(o0WG($LwWyr>7VhMaSY=pC zT6A3KBxPRd@Ovs@Y2L|@0da=oGnQ`35%C}Py{rk}SeOYpC;eAzzh*dpa@1%wULZB> zVB-YqBKKoa8uiD7FI=x*@z`Wj#{+VDh8&{;V)A*_9Y14-=U}ny*_%B; zVfS{eMNw+@RSD_cmL6ZX)6c*X)`nL=DW%up#wv=as$sq{i8wT`krD`k$2F4umVQBoj{f6Rtkm zNLKF%CbBIL5Y*>4>qY3Et4zCrt$Q8tWn^@TJ3ohIZgh`2^M0u6-o7DQSU= zdzsLkVq+zZwnbj*4>eY6$Ena2Z4D`TJBxpS@sPjVRaRlPPzPZGysI~N&PEC)>ZQN9 zeDwcPlRHiDoxrC_ow6~_AjH@g#P>^Y!_3fP@XdFo-)WeSv>a-2pyhJ7N>sWucDz_) zp`%o12Z`C`lmnSVncAZ#H=qS`#T&-|LczE{rHkk$k6IF5+GI`)6Z3&~6BZxeiU`25|K0oRBOnYZoVR(Th;%f_@ILri8P0d`TyPaS zAnv@pUqtuhzD(TAu$yzbAyy>KByGF3@Z^i$RZ~vvhK^iL^-GNsw%uF;Njm=KKbzE6 z*o!FZ?>t6hqoKKVv;OZx^44c-a9fhix?lL`QAGBmF(DDdJQxtm2D%FgJpjm!Pp3_q zYxUU+vB2g3girjZYN)O(f#aPy(0Kv{mGMw@2KNCZS-f5dBMsGC@nFFSf!7@JY&=;G zAOl~1JBzzaLW3npFNLe4t13>yulKNC`w!Dyp~j>n9F3o~ zC4|3LKYg7bZm)w!BGh$`3C9SwAEoD6lS0FJ&6&?&h8`c>`|JfF#)D0)XgFC226%e z`*#E9V=cqmQ@An#>dYbfGHYI8UwUHwk<0Zzw{;j6BY`aAQN~n$pTwS*DpjiN{r)mG zWzUMcgYyb>k-IN8Q;y{MfGC%+cB^;+i*LIupK&1-3cowGPX8P%=>C;R;NCgNqm&7} z=@pu0pxFIy8{XUPVR_`g! ztZ+MSi5Tr$G`z}+b|}zWGlog@WyefNR$TyNij+1ojT7<14>Z?XpBGF1ncxD*RVBZ3 zGcL1*lbg$6Pw?{+b4+@lX|E1Wl{(nzVJi;b<^2-zfA)y`Z@Jt|a{B4@wK5JMsWr&n zigTjA-RIWjy_R?vf~en4Ke?f}NJZ4((Hu2>)(FwwuKl?4xrTiptc?^_wx(j=tDYIu70&| zlz5s&B-&%$l;p6mR~M(*;H6oW+;$)5D~1#T9V*^9{daNTd0e^VD>QvjlD+CBgLXpc>$(r~CR@3&m`IY}&5`_)Is!FXhJXer|5W;b|+vS$47uE@> z=TIA)&C~4_*t3ihFr9I%=mSMPq28VBIf1UM4C_OiOsM}1<1%-S3-u7b^NC2-rcE1( zQzbQ*O`7C%moj7784@F0*4_?&BKN}{S9y?z4@s4>^D3icBpk4PPIQSX{;89#E`$HWM`{+PBwzE*(hJfep4_#Cu)+`aFDtkS8ROmAzwJkdSjW;UAI!u)&l) zJr=r;yE=4R7UTti3#`oCBpNA%Wc9O+9zKK@Ytd;%#QTdDC+(4w9Z-Z(v{j9Hi zyc68|!{ulJ>FvvlV#Xqn;gf{=(z~JhvN8W4S<=gNOeFS&N{vF^Y)fuR5HhDq!oMfiU}=PXEAn_BZNWkV53MTW{*&e2Q^M@@tz^X? zSq-)oTIsJY!dk}2lT9eKhkCI-i&N3{D_kH{KvUH0eOP2@|($cVq zA|a(nN`sVi_ezSAN;lHo-Q6LLv~-u0#6J5wj_?0@v2SN~=9qitzRv4&o|m2wWff0b zM}8=>;8#`w?>*I=aZSZcKt-v+ocjBW6{y$%CK$WIlIBY7uciRNuJU9*`AaJkidh6b zG#tU&?IW_iY)Zpd%3s5)9}zA0SIn$5<7bL4FAPXLvHnr^9W9ltYzp4{dK;ev)1m0k zmlbNUJL0w1`&fxFJ0L-VpU5^EoCh8^TC*GRx-?=OR7e>KGZEJc(k`y`mPp`!PdyAtJ?BJ66CGz)i0juAOIVplM@2#d;Ftg) zko}$862m=ZrPQ2nhesh*1SRvf!(@>2b^D4>$$ zc2N;$On4F|&lj$H5QG0bdxb4qoZ>Ie=a>OLSW&R*HFv_cd%;(JA6yC$^6^Y*6CE(3 z0dZ)0xdT?ZV~6zTR&ms{a(-pqY;WC0L!8>BxEle|m^I-Y094z^c}EJrwIW(k9L#j*3Za{Yi`6I4C4X# z@!vke=~|=Pg`77mZ=Yw25*Pj0@+ctVe`4T1G?|BB@$@-6%$wQD+?DtGW2X4n{Y9mj zkrJMQd{ukoa!7@QyO-UZe^sw1kHKa|S_m3l;Y?Bpk*jBr1A6RCz_s{Wj3?0$gxfxy zsqX!{x)GdtLecE@=%W=u@K-78i+<*te`{}^nFaZNHy_L?PvSH~Z-{k>D5Udoo;!W< zX>U>tSzH7iySy|S`$u`G-4T{U1_KFZplPk8?z^`f`}4XHw`uR%ZG5`e+%wF`OH0?( zgV~P$qIIL9Pq4?1{(>`s4JCV)wyPwuc4YKs`Es~ZnxS%MY4k)xj6Zl9%dRI+bYx4N z?k>JePE(ri<}cxzOg@i`*U1e#5)26X&{tiYr7!2(ZWe$eyw(Jj$2OsZXx6BQLefKC zi8snR7SLB2u#IL*PV?Gbs|wfM-_84PTdM4)W*FlCbL0*FoObFC*V27#Zu)1T3+V3e z?7a1uo5>U=@Cx9s&O@|ucCiTrsE?4txi84MljEz?gus@#JiCRaAQk~0lr`-fw7s34 zlV9pTuA`$h8=t(2`1v&*TvYv`H*R5XByRZPm}ohhL=;t5^*C@m(jQa2LzO?_(_&z$ zJuTMR{!G?r^-5tHaO%EWPx7qk+-wie9jf%V0>^0dNjNZZD6d*`w+6k6xYW|bOsfjA z?rLME#7TcfBk+A6tcb6L9BRsS^|(d-j=_{USiA5lJuc0a4~En-yNye#X3s1>lcT-U zrlJ7L|7Y&1&K{NB`*ES_d;|lOXmHEAPg6sCtzc-LI}nvQrq_nNYL(T`CW+9L=D8nS z#2R;GP{Az7900kP4Vhc{M3Ads2pFN6rbA)X+zKKU)J!$BJOSyByd0}@Zaa=Ww#wI+ zsIR8S`e zKnYw?cAqK+CZWF}0M!Z=GP`iS+-DwA3Pmcuu{93e#X5Ux(RH@rw`4aYDi%FR_wqCH zf&A^L`qWR~lD4lFoF7~DD>(@u!~4Y(R(D>9bQK5ktB8O znc*Xxco|T$-9QR*N*T$3ykPC|U3HMk~Eik6^r5^tm7#Az_p zKXp^Et*NMGG`6!?@E906@PDqGx3wJV8~um<+v`I?YG;MnN1KVhU3?&t)xIH-yYcRH zG5bSO=wgJ33wyl=Onvs!D)XZT<~}}Eyoj@=rN9?Cqh?w@6Z+||&s(s*Wy^P6gQ6A026R!N$@}u#=A5IiQEG*z8#1?MGCNVwQS*& z(8mYVd%)F{?)|NApRnnH12xo7LCVe`q}yS+@0LNPCEb3w{HuT%7DrLZ+jfF@Zs6$i zeJ#xme@#bW77jKr+V&Y(66Y_@NMWFnp!57o)G3Glcyf_99U8o!7v+EapxB$Gr#HF{ z*I20ZRud^rW)0hrxkO)i`R=Xp>P<*qgWj#9di;_lvw?NNP3X72(E+wkM6}aS8q92I#-?qoZ2G7i0kvCV&;b z7I*fskV<%I;Aq+bHKM91qW>kQs=hghJbM#3c_CBO&yJQA|5^YO3l2|T)iBX&A7dJB z`IzH29P>b=_^t$#?0brZ&3A>(Mphy!JUPhP?%V0Dlvt_&h+5k=*LlKawkk{FBAwp( zbv0}Tf1_^tIHZtHb`&%Hl>rO9;x}}()2t_$Q%(CjiJp!dGV0U2&S@iK)~og0gr20= z4`+DsIe9+%b3K^P9ToSc_3C(C5x5dnn^p6hLlFM`sls5q!)IpLWOLJM*FT38OV;^D z$ATlJXrY%R@F%9al6Cv{v1zKE0;)Z5DxRUtrwJ{=YXjWagDihK8O&d5Sd(8&I&l!0 z88QyQSL-A3f039Ny$SN1`Fr~MT4}uyp8B9^l+GmlVD8P?v)YKm(eP_->;TS3_=7KK zX*ZMWJYJ7V&XUaHt+KXJKV>z^VE9{gdASxLu->UfVysva?ES#_+X?zvUmR~vcv-25 z@8V#?LL?8O=^;qspNV+#fSEYLjI5!9`X6S=33)7KQNlY@mQlooX_nl}YIIuzQ>^mb z$tFyFoD5?!cbNxsub!TNH)?jlik?jw)e=Bk;d7uUFRGZ}rr%2RX{YJOCiKGkuXCXB z=(i1R;9>DITg_|Ad5+505v)x==&}|EPKsHzF`8pG^gQ`l$7!H#_(hLXB7+Jr3H~e) zjmNz_&5&)&3)VpAa%0U)mk@QwQQru{fv!ryDMVN&v3eGl8W%e`33Oh~ykq;trwWh! zRbO)0y@Kq%O`cUKI(^ zs-od5p-j)XbUE#AlL$&b1c@HU$xCUbDO7FveC2`uGYeMp@IdCUXC}|gEJUJ6(b&LNDnUXU{5Iq2IL|N7`Ce`f`SMTQhd7EMLgl&JiR{5XNe*9n5C?t zZQLQlYl|*&@<~!HIFyFa#5*gCmKOXEar9#j82mKnixIYITFW0_K~^$KtwxNK$`8uTu06Ok3GG(=eNQDa27!_(R2@*x_ednB{Ch`#J7X zkY{b%Emf_;t-hxz7OoY^J<5#AM3cBuWM@QZJjJqb`TPFK;* zB4NwC+Ftk2Y60zG48EzXfq47BpciwfFn3wQ79upR$*2!}04C^LX%=flOM14Bs^8?- zC9d@#P(v(YnG5orLL(;Qsu-RZ8?Xb&B(=%t>~iLMA+;@0)>-CXn#&dW8Qz{R@YGQa z|E)!&PG&tdcJq&NQdKT``Yz$SU&FROv6rhD33!02OtAXg6OHTIW!NP6T4wF?*G(BI z9crj~_+^4bCSHZZRrqM+!o&Tq-&cwHLJ&Oh9PEN9bF7O)lVPkcz%QC6vC<PvExPC&q6ATl+oOLIb{C*qx!STXAY(> zIFE1&Vn`c9@EicH1C223J10r1SS1y{)|X7L%>UjRwT!93IlU<)T2^6J^rI@~T4#4B z%~i`;cePD_E(eu^OMIqUed ztCfKl(MO6Usc+pxYD9-o1LI77CNJJ`h8duNC@he^5J-qKVtD)dseD0kObGF7|5=Z0 zl|R{q!q~i&@3duPN#%I{To|F-yy|yzt8?6I)EVACgdldkls=#R%+7$%WSM=R3)`{@ zx*D@`6DrXaX;lOCdUpGUS!MXdjwt-l(75Vvr>gW0&jKDP_0mHzUsj~d(Z?a!7A;$~+G zn!FAXh&JOG(Fm}cl}r&-_mqVbKzU#V+La%VzCG*8rQp}Kfll|&~WC+e1bk@oW zwhxrd{A^G9qFdm}=R~|ml6)mX^88O|3v-KJo zeBhWg{=`8UApbcvyuxFa{Z21Nyo2?Jne+E!%ChJ2RaLv}F;`hX6c;`9@76BMdk?C_ zG<&~Vi21*|JSN27F2JeMO^s>y-KUnCDciJD1}WgTU0U!1_8#numBqUosT+73J2$s5 zHyaVY8mv2v0{M46&M~{m*cM$hU~Y^{x1m&yJVG^O7o`LOxUE%rf8 zK%Gky%dte8woJvu!9nx6D>}q0zt50pK=KDJVInVW7wZQIcwKap9D~(|^5?939N)Tm z^B#pRu(wHblM7+-x{!6Q4_&b^SruoWSUz@RKc9_%Veq-_Y9`i>b9!oWR#QnjA~c~_ zrD4b+p-%!BJcuOB+rF|X>UOF$Baxs)?nKjLU63LO0nmJ9;5{l{AjXPqH%UlUOkMfw zD{p;M+_w)9M1=~x59%fj(o3-DHHyE535&c?{E`rvU$GuP3cv@XKMoRY^T@u*g?q-p zd`)XN>B-*-=fiLZi7t~6O$?f<>*O}Isw$GW{26u8!6ZH*7CidNAlWBMHU(`yjyBd}k?o z6#K>33JjDwjIS;AiLl34v!#6UkaaonKM*!d)(m+$@P^L-z*YTUKwr6^-8bv_Ugg4w zkva-%G;BNUdkP9@rh3|$K4>xepK8>6^02i@_?kYP6ss5*-1>i|>v{JPFDQ-yn>PPL zn`ff!WMM4?T0ebh55=zbt#iDYUtUn6#INlTo2(BN^nexj%5hffe_(>lrS_;O z{&p-fWrv!AmH53+NaINFLMsW z^r;8jB8cZDCPL5$HP|xX?k%MUGUAwJ<^r^pJb{9cfftj`!5K=xU=9NCc-Z3Yn}ejX zK2b*Fy~Jr+Jn)Bwm`6-YnhU{Q?{Ezas9E@Lw=mJo^Of8(DT1n+9C*GH$`cV~j%-1j z*MRBDt8NcWRNfjRUpP@1GTiTAC{y@&Q&O;|Ghrvx7sHkcYMYc}1}0NZmd!|Ju*>-P zU68soP{5B23VPEb&e|yDp>ALAee}GxRRNh)wTz>O>EHH|8Ui}Sv6il0bDmpv<1&4Q zfB{g)2&G?sRN;FtWnQsB$^Zd?3ll8d2A6w{qm~~Z?w;q_s=p5MKG^eiji@#jvqxbs ztoAcQ+#6F{iZ0~Z)=qa1ClQQEY>@8>`pdikv%)%?Cd>?FC@~59O#`OPbh7m!fyUL|I+70IJ&Aor-)PUFM4{>ddXJ_)*bPi~O7n7YTN zG{bSd6Nc=!R4#+;i>%Wd$lQ8Dr)r5#Ypu{A=uo$&$~u?E2x{?AUsIrFillb*65B%` zz8?;zcnYOA`5;OGCNMg&+Lm-aAP2k`d#~0!r#f4hMT6-JAo)VHv0YA^RmX;mmbat( z;$>Cnp&E~TOBn=zjGXz7e)peXb|AUVZPygQ1ZAZ9x~^>$C_#p>h}CY-#kG}(hxK%A z-#cV2m|%I4!LjSHZV4J@YK8VmCuBqo?{& zo@UX?(f@hSYtVa##RO6MTqTPYW4(B@NyO1|wJ}_-{iTaPJ#flrdx^hGuVpP4xS5c}p zZjxSt0KhE1(eXc>RK6*3c4=oc-xEy4QRukk=vi7XKf?~rr=BY z&1%V@x~>lL14T>RmY|S&eDH+GmFTc;hMw)_l~6QIjMwa%<5Ho>{``p1dG4nOX%GsD zluAe?fPtA-;;VjFZW|klAk|MtS7#TU{;+S;08^GIeO;|gBfou_k8_O6mo@7F%AO&{5k5&IyM{vyBMx9+%KOyM@Q;q8ed-(0yg z8|^!hqoKM^9p>6`hmnsRxQ_f3vEF<~MgCF%$-$=k+zAq|-%fY?7W+`(c6%r2iX8Rr zZ`{@Ah?&tyHg8;WBPlNk^8*ij^%nNAdXUV`U8=lP+?is~bh9C6NmO9NiZrBSyUkUj znr`f%_FWAtPIb1?-+6oNPC87+P+vgg#`Rg?ZJY_i7{NjyfI(5&NdsVP{fBmq0G0tK z!O?5(y~yK7p?qpXtEnoqp^#%)Vkb{Lq6?b*{W>LrYtJl(Lk0Nr_eWD)jtj=Nw~lm9 z-lt2yUx2#WNs&$O@p0K7dk~P)5h*A@H=lwRr|6yMO24Q7OhpZ~_D>QA1RvW&<^NIcFR8J%v~Z zk@3yAYemUs=I5KGaeCv0Iy`=;YhnR8tz7W4XD~D{8nOvww-1c4K?U02oy~gpAq6-b zvm9*ySD!iBo5jb6UXCJ_m);?h5N*OCy!&JspFxGM{HXl%48eO}J4bh$#QYe? z$^tTZ)1%JKAZ7f7XWU=0_OMriJ?{B5Z1^-jWpVQ2iOM!E2}f@$#DCyH(cPYo>F;F{ z!yzk0sa_x7d*sAMJIJI5(w@<DSetwW(sW{MQI1(VlzoZM>y!~ z^H@(lzKqCm-2Fipq`T&smnZsM!IKhA<-FLv1B{Kqc}cto5qtVL1_<5pNjjJd!ph_J zPJck9u2C?jLp;hL*7JpoM;ZOp@ zWj8g5@jz0IqW#)J_tfeIZKCU)w&-0h2BaaYt<5@Tu*uVjj(nzhOHrX* zk+S6#3r~MNV~o722&HcmeDEX=S)`nv9(W_$v5s;p5ib1zF9xjHPYK{;z@br<*zS)D~mqeVKECgdNXz~m+Ex)V!S&~&Uv$qIh7?YFFQ}z5{M-}?<`N5b)i((f^5XD~iLFR2Q^%eC)uhq=^3Fav4&gnX zd1+LrvpH?PTR&pD&f(b9)AjMp^UPea?`!-JwA-@s@HbPet-A6trz6@EcaO`4bNGPu>Sz4gF^n@;ED z-eIv&08A%+AL(qIL6sNJu;pWE{iR-Wb3Bh|>?Y!_-(q0du4tYgy9)kJsE+9%+ZO2_ z3;8ATZKDMHd7w-?1}hH0ak5%}q{39p7@2d!wn^nES$>i?mwcZ1VBy-%!Bk&(QBTF9 zG*-Rb_F9AX;c>?YG}&?ObGU*Qo56d}N1w~fl!ha=eqj`P5SyQoI>+u7;wiqt^|H2*8cL8%1_dSgc>%0egSJUc8hMb^vKO1!o;?ax#)X=cuQI4qj$#nXHp;< zdaVsKi8_bFl{P&GZQBGi^DZf8f*+^Uafu}f%*?zQ$*gkcjM;N4#TkOp27s%8(w1>3 zi6q*7>Z}Ah$e;i5cF>;Je0On*H>1d2&RF!viR^V{?6lJ(iChNsHfZ@${XLcyU8>7s zgJ16D;fLO_J)Kz^Nde8petV?x7&8g&?H;kNrL);eBcYsb)N728i^zFq!UOG;5`owN z4s%VWWzZ&%5Wyc7!C??6v0mYsOaL4B z630Z~-pXVY9>@7ZGNim@1FBQ#Nlk^F&b71$rscCTdkN zQ{Jc9P0AK8nJW48cGX(C(lJ5$My8FqP z@m3M@heiow5G67A@{XO;6!-C;EV&Ttgj>Q?1Gk~X-4}n8^H(h6o7s?gLG3O zf#QdnxB`Q(XxO#ilC#^l+0kn9yW}3p0*0%^KZfZ5trKtu$zWiN z`5W3`gMB%xoEe%7W^7cd25@ZOGf-=Jow-=pshbOhZ&T_jA z=+5VDr+aV&pZ;XE2Pv3?fIZVIgsANxwQj9O|Nim(dz zhbW@Ihv?Y|4j9$>mf;GCFK67r;LchCvV}5=KI094TgiU-xctnlyHa&&P;0g%?cc zGaT{-LCT`l=QaJR^RPhCChybA>?b@ZRMj+?Yjyh96;?CN*9R2fX%n(Cl}$o%XDW4Q zSOsN9OzfNy#K(c}i#6G+SS~hqEs_*8=h^#N8ff$MeRxYDTJvu zwI#j$^e9nC&@Fs`yXW0rm=%TmC^$|PBzMCEq?I&|Pxl|VF7p7kv-?`@vj!Xviuo}# z8jnY0Q20}#$DwnSNxYqG zb9u)p6&#?B4oED@lb%IGxOHKmtZDkxlK+L3hvlkaAfxx}LS-`fj}>u4ko@j&nXNtK zomLpqpbdZt2x!~vJUU#h^`)(R9jf?q_cT(DyA3FDe-V0BbJfEKRiL( zva4{qOqzI1pzma&kV|Pl`rgk`|MdEg$t}_iXZZNT+}sz@u|1tF5zQTZVC8&yY0(uQ zz(So3?ayAj?&t5vqDG2w(j18ikCoLhKn<9dc^Hl}0HOq?b!pz z*0PF11=F1(b$qCFsj&Lwm~q&py26fg)%CbTxe#I!h#75|+38swUK*m-Km`O42lLlO zY~5R&Ef9|ayZh9IvW|9l;+5?;sTgAsC1suMs7le`?I_cA-mcAX83`2gGia~ zJ&b2qh)?ALI4tzz%Jn^ugi##eRHlcPf{EgxGO+k=5}HEPHZP+-Wea5;e#*% z)SZK;*zCTRX;jnQ!HDS9l6K6aug-ZaGqi^iSpEnlxLJ2={^~zXEKlBcz4WY)t@b)p zrvQ)s=f9lepXjnadpaoHafmUSbv{qTPl~ESAZ^45R98j$?)6dgxyVii6-l``6b?aj zZ8VNqe&Z^VXnOZsQj@L+7+}MD!Px&asxF%}zl-JZt5M1{Aw|#W&_fg(fMziCs0lhiy0q)O(U)XDN({V4-NDMjZIe>C^{J1N#XVN}L!Tg@;7P69hRGp0Dc zO1cu4*?A68!&M8cYjvu^eln5j-%+P(^<_P$?k9J3rRur0BJ>;3IW})O;vki|KJ7u z(h}1gv*H7QHAZ-X2RKO*Vj|Eex7QQ*Rh9(eWM6o6^G5ec`aRdtb?HrSm=WT-c)ZN_ z28}-bFMcCD72WM#0KJV5^o=n>+h}-z*Oh_^187b-RPs=sKN7#Efu`eGxgFXnKN@U1 zB?`h}7uV?xK9AfW<`u-jx4FP~dQhPvH#U+AR?P-%Z`yowGG8jCP6LZ$IDAh^4pM>sbtMU_6-n9MwEyAKAiApmO7 zfY^FNx<$sua@*#<+@$~Qf!p4n{!qkM4Wm`V7elRjd(rgpat-+>j)2;dXNgU*h2?CY z0tmxE;AOc7lZnvs@XD4;{iy)?WY1le^Bz z9>?LL4GpfTR|N(lGoR+p0(lvfq`{^?F=8WTqQdt}v7QbgLbTS`Ym`1M2XL^ z+EUArvR9YrUfZaYwWhDMkEw*-3!tMul`F|Jo7DoC@c5@-jBQ2?5jQ%mEMx$jTqfz! z;bF*FLr_da2GdiYpFp;2w+jncWQ*cJup7?OmYahk7u&_LW9ctiB_W_Z4+1-YQjz`eG`8n-Njo-DDR z&WbdHv-lnSDYj#y9sxwi6mX-b4??){A;%0(uOIFyh5c)DUy~I3C@^c5ibed-Ir}U# z&H65pVtmuPFMPuc=g0IbhihCkds4v%a=uuJgQjp;Q(C z6d+g%8*XgyAr{)wwV>PcAF8?WjL&>pId)GhP9>eg`r$Ik6#LwFH53!=%SwMrp$zz?ra{&f3Mz$ zh78x6>mDXjYg>8x%3a`bbfJ{9+0#skkjeY|aA90KJr$|>3gM4FHzywcwQA>&6qL}J z8ppH;_)nQs-x@2XzasKTU-I%uW;=WNUbK*o`g|YTLf3k)W+yzxa>p1h?eW>%oYA;u zN<-$(a4a?IRr5mJCk)o(ah69`{qgb9hFLz@jQJ&mddT~`R%F@2lnu;mDVC5#p%5o+4#h3xt*=pmTc5K8R{wV_* zNwP;V)|NTPD0aIA(c6K_A@|{U9J-qiR`s}Lv}`;=Nxb`QO(ma_&qk|Mm!%J`TROe| zy)0fZ&YBWvK4tS3uJc)(FSy(|Q2Ba_20s&Zzq~bPc%yJA7|$1);&CIu5gvA9UE*~4 zb7d*e7{$#$HPEw?V5wQYF5hdueEnmF#sk_Madjp~Ce7YYbb!n3+J$K~qNe3mQE?IXqs0p*8cm!T;WG;ff+ z&j;Ko!jQg9|37!wO5SzvX{4g@r)Ev#)>Tzy^1r;?5UM|sQi3hS8=DS1d8Uh(@>b44 z+lAkOrA?39CzI9I=+@@%LH9vhY9hH4=>FLr#jE+&O@hNJ-ouAh_k8s#+2;qcoX=eP zI(%Ml5UX{VJZCtsu=XK)wVTM?V9p%^!HD2#BS=Oy=R9Lyys&6ryh|BuM-jWzuMFp6 zk+<+49h!+|P_^yz%w*A@!Q5X3>|qvnVWVoTGrVt-h#c-BY+yG;{-3{wygN$H)me)l zNDehi&XdAZ7J1k~!~f8sMWWC9aE=%&!r>G5{e#g633)>8M8dUl%#@2qf^FOctle|B ze%Vt7Dvu|yc=!)rX*HUudw;+{U=UE`H@0|B&kA8+(tCGwwXwVjU|gc$JzfZm<>s)H z{w*|WbY6=$veRRIM5jw^6~c)iJ*Mu6A9m+gKT3zB0WeIL`lu*0yASI&GY%Eg!}$eP@pQ5H#9-?1Yz&9)n8 zOECNU^g1KsN4s6~$9fKxRfTDxxEOw}?RT@h5ea&FqySwde?x?U9npi|)SW(@-IYWO&(iFO`pVDDE;6Z+R>ubyi_<&k(Ji6q5LsxxT$XYH?f4e{C(s4Dv{`$ zC`a`LI!%tMLYLKc_Nwdiugt?03F+vbyiyN;R&Ax5d+zwOE%m|iwNaX3!aNk^E9sSv^EHa6pUBInLYxm&acVR1%YYJ07 zrmkoxHdw>p2>fVAQ(SpBefsic;upeRYnyXx4Z z%6zH(FUfj352mlX{6x=J6>&|%u_i)J2S5gU)@=3?ku!wo=<&R#GL7$@mrl5yXvi`~ zy@;<~Mh<~{xG!>%wt+E8n10OE(TN7BsxjDG@t&~rMWm=cMn?tb_?PSUTrI_%)RU~5 zj_%g`L0q@PcP;^8RXWozeS!!oUA!m_eIt|(nr@=M)vCLxN-+}XZ6B>$IO)-u7-LA) zs*_fg3alKlm@&~RUmol0I4|S9f7T@Au~W=5lqb7vb?v(D`E1!YEn;SMOA4TNSPD^F zIdpR;)GhXG_c^M=j#kvep9tKG(>x6ch9+Firrn2wG(Z|-yJcF}}X%B5mAgEKmD??&OP@A}S^FQ=Dczc$utoqL8oO37oO zx;zM>IarcO^b-FUhT2fE@BOt3fzKa#mHNq1k@ddIRNILYjC1+$?+yQNiEmqDB1pWj zkKV_oyE6HVu3iz8i{pLov*mv?I1#Kb-8s6pMp-@u63exC;7ubwwr-L)<^HdgBnt;% zP%RhJUV5ON%3!Tr4wFr5zYKo6u3gyBM^%ir@ zlXfW3&RDrkQIs3gp8obte_!u})RYKZvEdA=$$6#8lsXvJUuot3w8M=ZQuo;987xXwLot0X9oK9CTIz{4w*=^sZ5%oe8eYx<#yMf*-%VLcU`zL)E2KZaAR)AMlU4Kst zgk~LIY77ZsfDs?}hsaue|6RkP(ikHza>>zb-AqbrZ%ynmQN`HLh63D5P0wB}ME@z? z%J75l{=IHEmq?M*b#jK?0J!`SK}&SdN#!}xk+sT#9|xl zk(J_!XnZjH!}0FI%y7f0yM-Hvpx1icFAKx6Om}Pq25;OH@7+G5`2I`ObS%C^rgTk<_TdlTD#%<`AQ3CZ|^D%PMpzf zbBAzQFBi_Dv)0*`lOlRNJ$&fT{4;9^!bc!5b5vMakOGsJB{RBvU8;UZ&g;3&pBh?M zcARw**7~)hd3pr*00mfOg^M?-zrY1<&iB93M%BIESz{H}tGH$!zSpMIJn);CRj<36 zv3=Av;l#=HQTy6;$HmdB*o6X?sRk~(G~NjdmnTXl{>z16i$h7lF=L_sKl*%l9@jyF zABnrgz^+fPubu6BQH<(T=`MExX1QN4@7Kdcvumw{!^+J380D^=<9AG`0X#7qN@_`k z_FMRf@-S-m_jh%$?#X>Bi!R41{P7R zcdq|lNGL0aynlXrMCOEg4w6pGtiv16S*P+(>(kT`3J^r~w0BDlKA<{(iwVCyo#_jr z-2QXKY-3-_Z*2;yo zK#@duPx>C>7c37kk$~7dU1Q+n)CS)e%Cz@HXZ;8B!*s0g*6`zpW+P zt9l}KiYzoBg-J7;gTP_<8C`&U-4EMSz zysK0d&Qa<2?JT8Ct2BJhHl3NTDrt%8v}!_!*-QQ8Ram`UT(>f>MdB0_3DY;L(TED5 zKLKKwJ#?*d&&J-A242Wh5k>Ww;SVo`6Y#5=0~PbTsn!%*c)ISibw z0c5qRv5PHpi#C@gP@uAb=Vm;qU*gS~&QC58@2;&RVqi1M`INJ>HjKU9OdSi>NZ9%X z9;*Q}D(<)vrbaJ!dp5eam>Krk_`pwxD?d*FxJc194q5dR>I_C_(|^8-VH_(SfxJAg zX}k(5)#ljIi*%*lC@{NnhiVl{=J)_%3`OBRe zYWuFR+H#(My*0{i-VYcNNk>Pl+PO#fFKGhTkyova`haSsQ#+Ltk)m-HAlNx!6X89~ z?Gu-5*3QJbQ{k7&Dr%Pl6GqsGU4xt5-Zlr)o)%;7273EVkU1xSXaz^odFjoKol^?H zV8j<4JaFx8*0yFv*^kT%Wm9;!6Em`0`L(si!>iK{w^VEmHU3&r_{isi0;0f4@_CfF z$w%e83C6-6A^s--|G?teJPV=QN#y>&F@tQ-xJ={CW)en@O)NUq78q?PVshZiJ2H>7 z=oaw9dAWXA1dwz))Ck_uYs9$KnLXI3@Na+hix8o0-PD9u0-6_mcBf@@5ch3>u8;4u zK)O(cQ9tqdO3e~Qc=b@YfPi#`*M9iaqV=gtZ`Tp^C3EE0a^oPvz)m-A%E(@WL!& z&!z^>Av)x@+j8Fmr&lVBglj*$#-Td zEoYn2RA$t#e=F1T$b^h~w~+Q9o}zJLLWT>Q#RLSSJNyJdOY+gU_gGg)y!75Xc9b{G zsH|s(&0%@sc8^wN>eet33iw{|ifYae+Q6;!7JqiTI9l6Iv)Ci|ZQpW?AgEdi-KPp( zLVV1jf9?J%CbgPmm~qjmj@~B#7h3&`qd>LC&1P1#hymjq-jWem-zyB5t6Ui$iLC-d zB}6nYyle2}72TnIwpuX)+rWm3fIs`=v_xjN7L~QucfdMNNu&5jK+FNV<3%YAN(bNH za;dOJ`~ud#$e<&{r8-1Ipu5Z_?s~$sg;4cebcG$3B-m1O{m~4Ek+IiE@e8jOlb}2b z3cFIgC{JT3FKv#X{g($m-f_0qu#4c|T%OJo$`6By$c#owfv2BH04D_z{CA{VwR)>y zHRVTiHxp0!l=*)BWd3*dabDHhtQl2OGieFK(&rbPEQZ}VSWjPdkb7CBqVDXt$t){7dhS;M zF{1ZZp`;%ySUgSua~em$Lk>^Yy@V$$bGpoU8Pr|mtF*kjkFjd3qC36)N-VFDXt-?i z1r+vq_e95jz(VML8(J33o0zOz4!Rso5Ief!d_pPPBSKWs^Li!6MnSjh}vB5p3h|k$8O6 zagm+^wq0o~at0Smd?RLhp-ynEj?e#e67+Dk?d6HUl7>J=tpDk&Q$7$UWts5KVt8&$k?Jfd@{O=qI z0!Qi=QWFRicNDjV+5p!T`wS;bO;L!4P;ED^eLyp<0TFAoe^1znBVbt*$)*Lc?N>g3 z{vZIXO%CgtJB)O>NVgAi_|w%_BYBOei+> zIbGz17vAJ&exVZX3Cn8!rM_2Gy#Xey!qu6*~?U0vn;;|5(7 zDf>p>!QG!-OR-GKsuX9%QbGqBdR-k}FAqYX&IK+6sUV2{i?KW+H2(uatx+cr9P~8s z9J2LYcSyj545z;W%A-wJM5JrsV^>}dg~`)Vq}bP3gBy^@>dL3P-KAGQcOlK}wC!$y z8DouEk-({xbdoHYIy>=j!cd%I<0QxlP8vWl!_PHjEbAp%V{dmS{B{Dp4#bv~1`{ba zW5|q^Z)P9Idrk(=MP*N-jb`W-ra|WYYAp{cyBc+s$5ekTtR^8Yif6r9b?ur9ol6givh_359_QuA3;E^G^vFWq*;JpVmQ{L+W>D#ab#wVB>QUSq%9U}(D7^AR5B-TvufMPF%Ba$r?AR3PnjKCDS&h<$43JA^2l%D(0s0r{uKdQxte} zo@rYfCybN}ufX6RHuS=|c~m#|Vha#UiEGHNRA{UA);#{G!Yr!Z7@FO*Us=(}p*kWI zmMOkf=p(e*_lBc0Bb=Sx;K^BqOm#DI0&;OlMx_6ukK7~DFVAN_ZEKW5AT}-W0zv1ea$zD%(aW= z@l6Dp{FchgYEMRrEDF5*k1m-zgxYH>KJ|8gGCy8p-+d#ukh=vBtgiI(^*tijmOWlG zIbLg-{SAE1vfzsN9=|`G)>_`)8!PU7gCLyKS!aQi?*S~0Grq4{k8i+XPA7mmsDJU* zt*sdKMar0JL!U6Mr7Vu@^UWaF`9@1km{ro(To>WHqg!%?FLg?4c{8`f(#-t9W7+k_ z)r$vE$v6>l(UM#wYeOccVgDCd1KApj%p(FK{$ZH5j`rWL1I1=PsIxzUi~KJ5MjGbeg3iw{tSY z=il<+pmHy?h2rZZbZ55DZf05a>jU=k-f~-l@sVGmb__?yho6>>ebgh@&xHNxLx`5Sq6%lP4LhP~`sVV!Mcb!}tcS^U>=)e6E_%gq_L;J~ozGHFjF zeUcm?{+L}n^Ig})?TP={r~W_6?rtnMyH|WDX?x|`Ywk*LA(gfJ7d+LJ+Oyp=buEYg z7pIneGs!&ZRI=*e7qf-wAxvYdctcZVRn^?ps^R+A-4nylVcKtviVI~A9t-=F+xcq8 zX%Y`fEuVp55})6)-!u#&ky1PnGK^dwL-m@gq@ZDqbmy6B7gy?Uza8_+`EGs?^;A)- zjL_(ke{^ypODTTdgAX}c_2KD)`D~IXf6+5xK?K)o0R=?=Igr(jt6AtswdNwPJP>NV zu@Z;U#@LlTO5Jn)T|@H|tR3pdyQif(FZ9o|l=hWMc9!e`7&{j7M@6(p+Q~ndm2J~h z=jAE>KfS#vo}qBL@Q9kwhL~OEOlLp<%I8wWz9}C^a_pKaDl(DUqCV4-)V+l$-#4`q zBfq%LGl*(V#=o?SK?Ia_gzRkfiP!p9fdce@?fw~&$X`}y*!;D5(n@<@ljWl&eYNg? zWFR|aZe1 zSLDmmMK-E1H8SkFD4y>zVC~fWIXYaHlub^(bFgZH8QG%A9kAG)UjEjVurWPtoKvYF zDwNtPzNA*+Hn6z*Q3SPNQvIdaH_J>5b1LDvGS<24j4{bl)xfg1xL&*m)yg{=d^SL4 zn|(jql<0t{NF2VJG@L3V_3+RB#4%(jExWq$fzA(H$EKo0*%*V2FV!PBqKs^Vt<7Aj z+vt7Cv@a=2lxNSj5qH;#G5n7a!G<0vVz9Iy684PPs!`5+-Cdo8WAa~(jw+@vV9@0% z(#u9)!G1ENlYbHSMZL8q6VNoIbwUP$r7@}i@; z$PLE}ZD$eY@h!5h}9XTIZpZ64e;~KjM?n*~j;BqJrl}|ls zx@)ec&~o;(Xp1Gv2hJ zGx@b~j1i0eFw>cxroFcTOrRM9?@Px~L?$!RC_n`0=YTRNC`Beef4JCt>< z1cSaVpD$ae6O48gOonZi36m-hwhZ*|UQwM1PH()@ke_AjG98+v_6D=%VIKp^ZceEo zl<4t$2g@5iyAr{FK-(ud>gDx(z1Rh*=YW4-k)>DAh<%Chvdg@Stf`!x-oAt1*LxO1 zP2Yx9THlQV4ckvBi)D}ILXTctXWFBRX4Eo?i65NPX98lAd7yL#0?LZf8Kdu8vmtJ6VKyrsyO zu&M#|8K*1^wMun$Y>e%Y{@h~d4Gd~cp-8Aar*Mw+n$<)NtY>;a=Sov=rV)=f4E-_m znm}EOC`i{+Y15}BtcI2~^&9YIA5;#LVRw>4()6#6u@y&^Ol%K4$44=fQz8;~w^fT# zmYdWu|NriRy6_sth>;ri99#|XIkwemv$Wi?U=I*IK#kSoE;ulDBTNCZO6ZNw)6MWH z%lU|rO#5Oz5PFsx`Neyhtz(%Bf$r&^Y2Wnj&vllXbuxMrR^FR}aD3mEP8m6@ll3b! zB&*h}3v>Nv4e;ms zUnZ?k{&cobpH+RCJK-9evNJ>V>?<0>g0~{Vt;SqN-M4Y;#@vqQFBO3CiH*HwOfL~` zOXOGelI(b3IkU*)eJgRJoWLE#xN7t2FtBS#kRf;8(p@O7(u_THKhMRL}+hYtNO zwF#jhz9~_2uzk({Kgj2pP4=FAv#-No8U)h29{E5YL1+5R%doCVb8El5f7IFoqb4N^ zl$iVMAr1#-RRUBYm93YCsegwx0b8K|)g6WGBPV0nc@=_!->q%^uOHq&rS9SyMrJ)u z0PpgBa-7R#vF5$Er^8MF9C}kPaQ|-g==EYawzwexL_ER1ck0yWo$8^^c3P&zgKKwk z`A#bb?-7bQ?fR=9mtiUzi#OlK41C?+m`@*)a2L*e|!j zyMjA*tHfxtUeKRgMyG5ii4`E`weUNJ+H(VeRRe>kE0U&HSktuWzZd#H3Z$^~Q^NVq zuqz%E`BMzR$Vz5a-~*g>N1x7M_}7=O4x(2rM=X`oARw(R`1<&TvRAfD{!zFeTWc*G)q&v zePwA^%4QfOm%EgrqP|=-dNo9-b~@a5^t(3P=TYy)F&(O}{If{4q`9KN!*<}{RVYup zHb^D&WUiRiPozu!>Z5A$wh~vB^#5AiT_~p7#`XWb_74}J?N}^3M$|+c2(%GxQw?{k zI8xjs_c3DZbSVq>>Z6_IgDou|AL4i|B-{u;d~yq%Wvtl;tXbX+5Q>}f1UE@eJUD=h zc~#c#dre{QlhP)M)jvbKc+0a(1KtW;NYg1neIwCK@5+@P;P~ES<+lqofIwS#puC<% zjo!pA)!b;Z{>_`|glL=6v_tqW)9M#xf>$Q&P?k82oDiTbgD)qwH6O%oeEGj3_+X@{ ziR}7jfSxa~9aaBea@P`q&N!MXa9xcyqjH{TZOug!mPnnchIcT|s=C;pb z^1Aq*dicRvP2qjh%v!1@kgU&_ss+}hO#b(Vkn5XX!A@Csa4!kBr7x~40jF~csf3I6 z=eify6heF`^?OXHyHYIKH#XYr2a~Bn`LDo&p3S(^&IT;-8ec(f@Gfkta4=7>GaF#! zisYC{04c5C$bo`*T2rHkfeZlqyxl{m77t490Z4YvF5?o11y~v0?m+zA38dnO7=7V< zi_N_lCBGVpg7NnaqHoPsFE7@Z>bzsz=q^12GuE}c$=Yy!DS=Kz$_wH@hV0xOsj-Pp zhS0sWm%2Willu$6)O!L|?$q$ysHR`DtaW#2R4V~jqxVyMZ(?v!`kvAuS-ITTNywk~ zn7-&g=`zB$XTt@3X`=+&A43E}1UQfP*+sPXIgs_PN_4%4V5xS{L%QBq=Q%Oh_`vBG zF6NvD%PRfuUKewp(c4jw%`*bnOAM%Q*prf7BX7RC3%hlP$-iY^;X=9D%`lC7sjd#D zM3Qm?T;mn)XMR23aRD>s2pZBxnjl?DX?MZ=2qbU6E`n#EqXqggKRr3Jr+*!!;A4!f zY*GT8C%p9Du&!6X!su%%e=o7jsemiUEhkv`6hM*$K(6JVX|e1*?==Bxng%d@G_KON z?a3FedF67(@ghFU2{4XsVSV^3s5qZ}t_KK0fTEa?fElRU{;8z8-e$(T5_ z$LiVq+^={^ zD%;3ZxyiMO$y3UY@<_wn%i*37vd|c$yF0bWyf_i{&=n=DinT7|%T$w?+ zoZPC=FN9)5XjP8s>MpY7O)kIr&dR~Wil@5B)`mkg_5{pj%fkHle;ImX-z`m!V4Y&-|M zh^G-NIgz3x*9z~Zw65h?f0MJ~2o@q3SIOfC>NPB&Tza?f10E4_2CFHSLdAhUuloRj zt1ZRTi(4c5cJF?=R0-uToX3-$*Sh0VJI=&o-D03s@w44J<}a_=x!xF>nD!7i$sJC< zK|T#z`$W?OLJq_!i##bU*dJ#)xTu-(i+btX;8)8qSs!^y2@oajOo)iwAT-MYjm)aK z0z&K`1h(3%s)^E^?T_m3vZ=PSb6*jTS6R08Z z-%-GL59^Z5AHh6J`cQqnmA$JwgL2Q@iaO!q8hIdY{AVs5Uw&i-ZK#7Ga_7$u*zNH8 zgf`!ZMOQ3+#+Hd`17-=Ai#2!eF~bF)dGjbycikZL_sy$>u)V!8kt}suIdT14R>w=9 zfsq8k1I`ZLyFM=LpU@AD;U$X-#U-2oT&shp)D_2(WyZp7d1<;c>|m;j)ErIW+qERV zPOMa3KSTjB&_mm@SfXxdf&clJPJdV!Sn+d26CH-ERGv1-&=K(n<=kok@#Psd6}zGH zHc;yW0P^k^1dV8R*)2=>MB|LTRtG zEbmQaZRmep*!-JC--=F6m%1CEPeWr{$_c0so`wFXfmu3|UlTUb3)M`GH9kGuWrZ@3i}!fCbRi3E|Z?4^D+?5ir`4R<3OvQj*y4KB*2jf5TGs5WnwGl&Mqlk0bSO4IK+cZq(K zP1G=OA=N^eb=liHHdDqwyfa?}$(N4F-Nee8f_8$F7)^o;R)c4i|Mk^XfGMx#U-`tF z-r1qHKR#P=x6HlLu%Zqg^V6(V7dpUwNOnByj4^jt9!xh(1O+n}3w+K*%D=YFbTJQfnjx%WGz@R==ZAyjS+|4pq^5BNL6QM$#K6*~&*Dxf%OmX9P3N>5~pg z2|uU1h!YAWzxh|)-a1nQbCiiy^Bn&4Dv~6HBZae0&)ib1nrFC9!q6*%L35#h|Jxnu zuH??+f^AeK-G)eYTFNfppF}}VEF$t8t9`U8AWh#F_#EVu&0B^8Rt}y~t&+6D8Sf)0 zHFtW0(7$Iywr_S1bBVU#hwUvx`qF=`O~B#ONQcm}JRIp{pd_3aU?6+hh-Wm7kWV~J z`L!s%rmD_=E&m1t(OO^C$m5hXMaGRE)K0Fke%WM(Jz7NBMX&Nx)|*<`n&l4b&MEls z)5dOR*Bc}6dsJ>p*5nP9+SI&7{_bb+|G6k2+T|J^ncKQCLE8kQ1=6I~%GQ>1qtnX$Z z?N&UhMt@@8kagF6E9V*={Y$2|4JVaURE<6cp0G9Q)xloBRXw!TyqyQ?U|v;bzHr9DgkIhZCBbz98o$pACs2E6(Zd5Q^jiD?!d5NDC+fl_D@9A{^=; zV2geDd-c6PU>j~lh25Z-2nCCbZ5VNu5p$Y!@_ObL#i!-i(H>F)y$J($$~ra?hTlnG zVYi_n0Z#jLaVkgdKu=4q>-{}#>|p$Z>+`KSsk`L-v$W-6*wT}4ta~`}01aUr>-fKL zrGkg@#Fo31U)Nh4h|jK(9wK$Ce|oxdJjpxWqh&CI(+F?W&E9^A*{nblE7X&|4pG)s zTk{Gnvr(s$U-jKeVYb(pYh&VkaxIE1@Xg#x0YClR&@u((V1~r!*kd=(~%q)2ySC9qm!(a)d<#v zwAS}#psaeuLXUUQ!vwz%vVH!JewU+j&5F@2sn#DEUKf3$mcc(|lQ2Gqq%3fA?ME0j zG!t?~Q&&MUJftZxw`Dv^ueH8@Y#FSam=5~*OBe2?&7sU@z3UaLkyD z;5Ky!6P*03E;A?>bT5dBe4bn1dA)+k&imXNn=alCzP!EYyj*0!*k#xN`B9Yxv|N8z zeyM5o9g(wXJ~npFXJa0i_Xjd21BXr|G%_sl8FE%!uo!7*dMMf76`C34& z4?=7s&Q4G3lo+0hfPziUlfLR68}I2gvUgKFwXF#@a_vl6*2f0(AKFdzi=R^7gw3Gh z0&K~7*%k^{w=7I0a*07z;5%8TN2PxgVjl^u+-RXls*wHZ#ONURiMrc2*F%5_3Bpc9 zX(h_={Lgfbi#kL$-kPdiH6ttq6;EC~m5gw=>uAkOs3DLo=WBjcjBXTsb2#ONkU{Y2 z5LUF&KHyKuedjG3p>xe+qWEBy@Y3_{g7)20rV>11sU^6=FUSQp);4|1C}1P-UGAdG z0oju)#tQfGOB6)6U%F8yWxn zm(jQRB_?{26R{Dve$~R&_DZZE%rjwAf?yIa28=}*2q>6gO*P^Ly;%EAyp0qvGL?grn8RYpUuEJk3 zWq9enTX?^F*=;uv0v=#v-{gO4W>Jt36O?FL%G1(@F)alV)s3SnoH|_vqG!uD z%ySp-QDCserNYQK^VJ)()802AU(Od=f57QzV>w;UO=cmdYd=JkLt3e}C6=7A=ejVt zmk)q547-Q@i&mun;%TWuYa_)^KE4$#ng^W>wA{Q-`LjDB9$SHr3AT|OPEEgH@$|vd z#>%&BkGjwRnqzQtXvGJRYp*_0+4*tVzCc3lfAMkOXO~vx189^8S19^ydHTzwUCIE? zjEydzO@aiF$ddsEy3Va0be6Tj!?RT!_-HE#L|Nuf-}0Gnm2Fuse^sY{grK6xcA(&b zf+{qlQ4eZC=zsJ6U+gar)lQW@8Fg)w_b#P7MM*@bSxHT)V>bT-e}tWqJHejl4tg;~ znc^7xYD9_$XHC!S`2MFEtophnzz^!%u1zLS%s8~IEt}h0eT|B4N~mYLXr&Fw%h&X9rT&E zdw@DH`9Yx3{le~PQ$oAH`zw2=gZhdU!!36ILRUq$%`~e%40qw{hEnT;s?IBV`#Oep zYrhP{S+$>*+V8*Nh}b%R$FBJ_l$Rkcn=_G)s@jh_<9INCLM&VTaVPYs;~UULgfw%R#zBs*ZhCXno?ZzUuk$taXAs`_=9PflFQ#@zf{xp69PnD zOt#7=xCJz}jV_>r1&*E5ulh?R=f|H_ULd+s+&4wCwkMP|AJw(ex5O_^P_;3Cg2~Sy zs-zMOSeQ3u^S=Hq5*9$%v9Ga#!@^I1ItbVq3#>b;Zk6W$>3*8=7qMsh3jU+F<^%A`)qOQjOI_+6?0=wrqNd@4hpQZp9e=Pj6XZ%_E>;IC zM2%4>4r#0W3N#`;<4Cr%gPk1C!47oB*day{5wsg1`(2&y1=R1%Z`f{t=kf)gNJjj z_3J_c)KweYVRlgUM`-$D?M_ZO!c~!ac@u}+vo;PZ8TNasaC6{n6!++h%fk5r;}?5u z>d16qp})$@r_IjJ{zYblJh@Env60&k3i|Z<>pAy=)3Nt*2YdtD1|Ya<$+!a+NnSVX zIsR0FdZ2MI{bt5<#%ReJv!yOMUtRv2g}MCVAzG4l^{#?^~3)ZU3Xo`{(?IO`sgX{;pU$YhO*Z0eqLo5>$Q(c2+CZRiA=&%lQ;p{3=jo*oPtwm8^=lz|$}V9z8-yVI~ppTZ?hI0 zyJ%`+A>~KF_h=@fiJP=&_Q67&%c_ePF)NY}d z)?@&+>v1Dy&l_Wr{H^`_X*CpvNR>?f#zwpdbO&#T{4Czx4^bM)l-~x?q6YESSFW2^DmPz0jfuRM5UC2C zR6P1=P+aj>*c<#lI$Ay*W}eNmq#Ii>{F^B5-tC=9J~sV$_#b!ks!8kmW5DS8HnU&R zKJRxy-_hR7-vm;00d70`$cOmZ2w8Chej;o8B)N-O3bCnzR1E~kr=Z8y<#(OyXy5fG z6H?DVAVu^U^Ni&A(U@AWfz;|~7}6gR)5wl^C-QK_$&ytzjdHFyJL>Egh+`(2^lBN7 z*V&y&=uiT5(k{zq_>iDy`6^|fs~gz|ksT@$*5&oMEhPY>+*@tmu4w~M4Mk>$4fvbC zFVwF$xiNNmQ$H9|^agzd>1f=@NZQ4srlEB{__;^o*(HFOH877Y*5D*mircc{!JyVn8TSTHgkP>2c20H07H1(zSmv;im3 zIwEdnmRn64GjqqbZtgD|64bmZg|Fo7$yc`&kbUN-3irp+A=Gm;2~75$wc5rm_jrA< zY=!N`VY%;TRSXx*1=0?tR-cSbHoo-jf@kd-e5&+~tcgL|VF|Y>6>L!Jdcj*J^-^#K z&pD~IXxV0s!{pXBd_n<{zy20w3(MPr;fu?~m=sc&tlV_n__Iv4?}1cKiS@rO!7G!- zJ{m7p2L zM!7!*5L3u)+J}%lwEqu3&(JQ2;)P?0JueTy!&W?UV_p8U5Q?*N))=(DlO42LA?C1( zr1=h0wKwzE2fQn-jq?J_FBO>aC`3ZFe)eQd+5N@vs5LItqbmDG?!YY)9Vab^e#eTi zgHgx^4lp@3XrzXT%YLyL;*~_9Lkw9@39+z(dCRjwTk%*+3L^4eV^+kd$UnMc?Y~%= zW;+!H6@}c5lXcuT#OmAf{Hd!1trLY-9E}((5!nnYsbC0heGfUF1wFa<{%I?hpO11^ zONK60w8whUs`0~aLUA6M7MN>|jQPhWuBJb&U2%f}`EMD8Z#f@Y?OUES1jmpzIrg2G zv`gJk-coMmwx$n~c1c;wy(NY1!Sn1DOgzJ7^x1^2>qTaXR1IANppGYO4It_iSd_0+ ze6j{Ey!l4fE%=iCvvtmQq%2xQGCpb7MSIuu*r!D<-sV1j3l*9z>ai@!!q6|r=5gu^ ziAnaS@Ap~p|9v@Ilvk)_{DX64X6qw-svEl%Sq1d9>$IxVdZ^6G?91=H@V7^cGJgo> z$02Fcs)0vSuQ4lX^H;b1ssNK_g5Knd3v}(9-ij%{y6++!4D;YqjK_izb|gtG(bfoN zAGBjxA&;MRmRMH!Bycw1s?yb3vHs2Y8yhDsb$rJ*pmF9RCo0xf+wF%RTRY8DCc`{rW=Qp$rCbBigZ{<4A02 z(9X?oYw?lbJ&e`KHyHlP?&#rJ~{>c-{(Si zljCGWi&)mW0 z_0MS^mCF`zS;$UEw3id02Mme`U6%#_%H_|}-h%c4ms%Z5a%$Ei$F+2zzpKG?Jc6~| zdVObnF=w)ICP_`W&44F>9pgWjO9*m(qZ_A1_H5};83hm>X^&Qz=lqH$cm?wfzGP-Q z3N)0c{(4<3-E(~6?<*?cblQlni$#PyS<3bkJK!pn2i}<0f9#xYQ__z1{d38$&ZTJJ zjdahBz1ZXyxc!#*uoOecrSObVv#N9~j(I(6dI@JGT1@LI%Jl2Cu?#PZO-oGR98?fJ z%-}PWxGu!`*{u4K+d3BwNAFHR41sHZy~^|s=7V5YyhbbDVe6tO%3&z{={)B6o!nJ{ zL&$cYTYT@`X3JiTs06U&Y_7Ks$;xPD?n%-Smt}yGUNhvNE3zbp_LnML)#&-Hcm)5? zt^X)?0*%h1-w)rm-|KUwXnFVSqB!ktq4LWQN-Pj9thIV(#&hV_{!u@M>OEa4VL(5F z#O=}v_|TuXZ8T=`gxa(T%X15I*X_hN)?R#bCS!z$;Qh?mE~WW^N6Ll z$>Yq&S^7NeUjNvNdIV#eQ$)0o1nx-#OYy+5)N4PyOH^P+Z>mPyjrS)jAy81_WSmGh zxquvf~!L43@3*^@7HInKR~ z3$7{&^8uYG(0;~90$xPk#_eVoR>E5T^TvhY+(r6c!Lb6zwXcpA5)+m$=NE8~O!}|g zlZc(}3V=H-v-NAi7Zd1fY?5P}vTt;2s*KzQSQvY6-M-;fZi8#~s%}~D)o(;eWFv7+ z^OQih2wf-)tG_#Px_^{7`?%tJ0Cn3X+-v8IEy4yKen1DsSSnI^@`t&)DSS&O0V4&B zKMbqs~#E0#O_Fx%O0&K^n7l$_j#;_)A`Bd$LO8wcQS0e*1#3qsSQd5W1hyc zzlJX*Rxtu!TrWu`k(#wq40X0v!?#3Yd)%isnL|5_&br%1NfT!8Q(FiBFc0(n0<09v z;}?Vg#oR$M^XN^h0$UVWE{^=yBVN}muzHlDPs)M!%Oxc}IzW9o5mxh8}fjkW8?KL7wOoMo;#*Mq6RD2-lJn zRSMEnD3Kd97wy^u{@2B(M^2*G6L*<=0EiFay>dd0qBz^OK9_jJ< zm^VSv@#Em0PQI#0^p%}pVj$fH*kIXucNkcwv?g#yzww`Aknu6c*?*sHsa8MWKM>!u zJyVn&7$fqr((Ud%`hx9!?BsS$;#L}Tx1!kRqi@~Ufftt;PrCT z(uHT_n(#yayj9MByO^VU{gfH|sRp0nyC>O36JMXBezO&KMi@1dhwmn_$ez7H&M1&w zA^KEX4~3_QDfu+ljuS2ovlOU4y#wY_RH`z(G%F3yTbicZjuYO&j5C4X@>7%XbTKvh zv0d6wMr0XRb5yHxXuML*ici#vi}wL*Wqp67eegLML^WR74Gn_ajQ^E<3t57dY?8jE zP`(nve~4maPPgYpVavTrG49Z`D~9p@&8)=48|0tzZYrE#xPbcl^5=&BH?-O%)+f-l z<}Q|!yI=5H&v(25e;A&B|4e5V;Jsf?DlbfNx0eJ;sTozd?X8Z(3>Tz zyu-Vb`8FCU8wqaRvG{0nnud$ut#zFK-|=P3yl;?qrWJE0*LFe+;^Hv2ouIGJ7H75J z4CAWcvd=2+(3#I}*-^)#hc*nwhA8J;d`qH=K0J(~xPws`t<>~)St%WXd5gS$867J( zPN#rvSVs7AZcgH@)XUFsABB6l^P2l}QRo>r*yc9L?ym2Y%Z)qo3;NP4Q9(`Z4cgaa z;(<7Bjl}^eIYZU}q8g2a4iFypS4z9Xgz9sHJGv$t^v3)LkKZ|~2W|uwY z4MB^N^&Mj2FKji>pi|ZMc@)%@bU@6*N-G;E1-GI-%<2^ zWv%yXVAQnlC{oZE?Zl+@24fvDengSb|-)5%tI>?A%)$d3`HAV=h$ix zEh5S8eV~?j<7|nAPqCRRSE8cwzxcy5LR+zwqYDk#U>ba^$X%mfa{0af(T+pAI?(W~ zM(bv=Cm|G^K(TsIfNVhT=EbHo0!ZjJ8V{ecjw9faykVe744r+M_A_Ix{D#9*t^ET? zaeiU{;tX-w>Cv;XvG};33kiVoTF=agn?}*-l zaG|)xZReV}_|?r>`Ekr$`SA;`7muNWa4o{ws}?Tc&wu9wCF2z$M!C2RE=AkZFnh7Y zeXH?$aXf#_KK@K4uQWa*547v||0IPV{_GT6(vu{# zqpd4+B=&?sI8*p~>|=jmBv0u5yJtyuemx1+t$@d5h$#-+MkbIwbhb-3Kck!nl*4&8 zHv^=>%rB0<>zgGGJ=jRaV-(qSzIM*T?O4Oy2qqZ%(0x=re_wQOl{oiOlZ<`9O6z9tL3jnVZFHSh zNuCLx0CaZzPVm;ZZzbGM*_tWwFKcJ_bHb}%rb7N(v{j^M*IPeBU1ot--DUS)Gv?_e zm9jToUamWyGj!ODi5ZvZ2v_lgw>^KUvIM4x*nKoE2ZE}MxO}7 zhIW5{JX;UntvKNp;FdOxJrekDEt%8vC~}Q~oI3&V7^(l{(;IOVj=Dhvn+&@}ACxXy zd9H8g9%u#Yz3dNHGImc^7d!-X@b*-1Q>FNJ2LG4uy%G4u?PVYb#QLjgq=h~6GNS1g zcQZZXMh$x@uXKp+g6|42i$W%=!Sjx#f@AiA#PMskaGtyWABS7DQ^V z3p!}KDy~V58E>^M{PZLnD?2&ZACG@lbn#X-GB#+DLy!o0%F=l+1QnfjNBU`f-4j}aq+i(6q zw{1$kDf5tPpVhD!2)$jGNh%zTQyURtDuI3~M-xG2Vy4)%eIJZ!Q)pp7;2rENhu9ZMEd7 zCA(YIjpS4p&pma1y4e%^1QdIk7MIY(h*6y8b88l$gcNZP$+s3`>`dd*rnAe`GyA22 zx3~AjQ&RMYq0+A!g0X!~>`D4OX#VP0L*))RSEAo2lFv$BXIqYToO+G~F~0iGz|pYC z)sSdd_VXx6?93mrzBP=ZA@zAuUl(Fxi-F7T;QdR%abVD2`PIJBgo>Ca8?2`6=(YS_ zJnm>PTDH{n{+X}&R@AQvJmdo7nQy!XH4fwUqh_G&>VAXK_-{|$DxYj~rx6Zpba?8u zBcjA#T-u+yhR#;XW7?(!Ri{F$7Ee}5$)(N1zQ;?eH##6Goi|Cg_}?@`M6-zlody2i z`X+f&?oW7Y@&E5maX|JmtBIq&%i?wJ`tYfm?$|UjAuR@?9HJwB#6sv=rqcqsv(xEX z6ztHz3|4{}3c>wI=Br~toK9J$>;V$EAMBz-S1!K{66jQX6ahyFWR>4BAGIcmTgrv2 z!KpMdo14;#tRkMK8xC8u_I3p?tbgdhozo3uD)MS6$;-4HCf3nDvOI4(wUW*(<4@waD|jvmkH+)TdAsn1rsM1wUK%nQS4|;q zWFS4*J471p@4cU_9dfJ{5>W&@bc35mY;{4R4Z+x{$|+3#n`gv}&h zp9O#GD7{i5OHk!?M+w9M;l~Vi>h3eHuPkw7yCHB0(~GE!^z!A`lBz0=Uy?weAA&TL z>=XKrBDd4MCY0^PX2t$rd)NBZ#1+M_fK(k383q9XvA(Ed+n^CCC~l^$Qc4xZ$JoM< zfYhom0|hj^LV^^f4nkB)(NqaDJOv>`c}PS^iWbBNu^3nC^AfLKD7jtcltM_c3iO z5M{ES)lWs%>XA7*h&Th%01T`db81*1GbFgMC%>8*Q(b;n?U;noNB=&OSxKVvg5j{A zz$l5U+AnEucK51}z4XRzvy`~$HyK_?6YnUkbI^_^aqg9PlIlV%l&NmmGQ38OZb!%#;Z6~bv6lCfb7#L@4@8A9fC4W^ynuEkYZMmqGL+nONBQzGOljV4sHpqyu5I32oR^~`5=G}G~N ze|hKOvWd)V_CZruCyoj6RHL}#ZNTEFpGlxt=_Qb;{bZ`+iZ}7RD#!$i^|QPA86q3F zqhP*HB;*kyGlsFArqA(;<=ehH4!T~`!N`Eozb{tJbA5pSQ)MDjy^&lcLab6q$V~}^ zk-ri!xp$D$lVgp2q;LH~+pj~Kj9TMZEIGTqhm4qR62{+p9-q3*#F~iew9ngi@S}?O z_)_A#N?EPYaC_gvXN3l|R8noe8=EzaE^q2tn9aXM1kv!LH&6qv+j_^Lr;+_YKf}e*5 z&kxr`nWvu{RfDF)#|PPje`?*(xQO3c6_ooX&Rwoh#AK#=EN%cbLLv$&rk#J)xrlM* z1ZlHZl%ZU-Go9L{T`f+~XI#M^4#Bx4|(0(~DwMObbyb3ey~5 z!J{=)oim*kU5FPC=FPqo7bWGfj&LmDI;uZNYZ#Ub$hLuY2t{Q8PAQ5$0oE!|QdYTG z!C;*v6b7s-10@CPifNI86%1A|Sf7m+3|I{%N(@#o{0A@)BzuNI)niP)66vA}=?pLB=&oqK-g)436NVMX47ZwdIl1ZzVNJf#cD ziA?`06p9vkHA>mTWKW<^z%{iG;_Nig+J{rfu|5biFMtjdqL>IxCj#HM!}@463J@Sl5E4sdz+C7Nh>P*CW83!a z;~n%j z@~3oMJv<(lPW{!*9U$>QoRwN0mf@qAGzEz=4ebcHX|4s)27KZRcfO|r8)d*yjmN;T zJUj$ZlAx<7fKUK2jw2o>cNG|(C&|epgn*u60LVss&zYQXEXVA_&Bf)!TCdff=syX3 ehTeg%5cnTV#=?MlR&vt-0000B=Y2osn-}| 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 literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd0125e0506076a8fcb6a7617b5013d71e9cf9b GIT binary patch literal 736 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 V0n<>7YX2yoLR&*$y-L*%^&eHJ`tbk& literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..37eca2b4b2923b53540709ef22c0f4ad27cbb4ba GIT binary patch literal 1132 zcmV-y1e5!TP)B=Y2osn-}| zVtny|7d18*EP}K(4GGi$EtgWDOHDCdb{X~xEOXnrtlzBJx>;_qVJU=%xee=zDJa(g|wzj*u z+4sTak)ej{L>aH|$+otyTrPL3Cndx_u$;4bstM5IAVcM^ckG*j6`Q zpPcT}VzJ=LJ|2mu;fUJiUjVB2Ix=5!w>i2FPWi`Gf~6g&@d^H zEDGZN&S#&SE-Nc<&-YPzwDK%X)1Dhsldq|&Dn%oaQ36&}7)z4GILoe$kV_?zOpGU! z$=iiCyEloWgn{cwCG0M;B1+9^Vk|>1Q{T&xWtHJL}%gVdR;?FN##u#8uKF?F=DtjGY2YZp$NQa3L@>FYW^?gpV zmWoCrKi`_0Jx|u9!t-2MR+Ke8I4P?zJ~npNcjCl_#^X)rNs|!HV4v=ibUsTueeD4$ znJBT}RQBlp{Q-YuzrnTm0FrW2za`yzbMVqYF)5wC%}BcQoM|`|8e9v9hjaHj@YLkQ ztA#EDca}cU-_Hje9vZA7{^Ua2g8?;Cii8~d+q#I>6iM1)XQgRqib8^^dC#&A$O7GA zo}ug%6zRdhUT_Bk7OL?~CsbL&CL2Lo5>ZxN3ulQJTry4q@^BP;kcuTBO9EQDo(Go* zBeA*;F%^Z=Q;H%t1Ac1*kJQ&g=C`2`E>+rsg>pdJ-h{+U2rn)^Jm6+@4c>|>G<5he z`Q1ev^ZSvChDZP_n4^zEQx&)vH)6pJ+#SD`&0ujw1&%Ov*&QLa5{AR=fGDI;URMit zaf$4j6#2Z6jHb6iJ8i}?7@iLxi~yXBmpDvg>WBWlCzHFl`};qNQJ{zWSr9h&{oekY y`v3jS95$JNMr8sTl?iB6CZJK7fJSxb0sjR2QSXc4lLf;70000m=T%nO;OU=f|kuyi`kCf#;qRh%Z za-Va|&4^(d-#)*5|ANmC&-1*V-=1Hd*Xx~ZVgzLe3IG8B0K2}Pj@h3y`B&#z{y3Uz zw;BKduIcM&T7)xgW?e9`fC}`T`Wq!`y8)PZFP#(9digH?c~Lr_3tGtoQq@hG->ii%qF8@P$bzjNehnaT^uNA$S>zJN-Q0gS{qF5F{EurD)gP(Qy&p!k7s_ zF<-nPJT>wDpf)~&;czhOcsesW?Fi=AQP8Kght8eai)lcT0sInY+%nFmoBoHz7T~(< zs+lB`C-4w~{QDJfR~LS%+cffRe{g$Equ?}mW1bS>K6;^m4`d!)IqU*c;Jdhq*}wT( z&rMxjy`I5fWD-5#wQQqJ*D(tav&1L~tKnS8qzTyOIle#l-%4l52FBHNkaqY)sJc zWePgRH#`7cGoA)9*M9^bg1WoAZ`;UtV7j&a0u2Y)NTk%T;NW0S#`0ovvx3OQt0E$8 z>MrD>KCHp3aP)$YB&Oc5lH_4&X&GfWcr3hLV`Tpe_3B5J5|)?u2R1XaO?Hfpoqf74 zN_W0ST>1 zF-K;R=&AWcXH>k2ZHa07U3H>8{^)-6ynEq zrqSY`Wpskfq%@$p^Dt>4U%zL+JNhTphGW)BB7RZ)uY+5EGoRUV{41kK)js`nQ7s^Q*iS;#9pFbTVWxY(5VS$jmy`S zN0>X!<)XTO_%tdh$sh33rDZ)DJ~lKI5B|H*??mRboE9SHtyN!WE zpk)X|@H?epOI5MrqA;L&a?#D#09;c*ZfaT@!Z7ROp4LSq@*L;o7N%ttzckOOLp_hR zpIW296pw|*yP;rIa{EGPRqP43HL>F#N8c}zoPBfmRU4f7Gc?7P3ajNHAt%aBM-)9f ze}8}V&N_MJAiS7Y3cV$>Y?Qrgdv4C@LZfeJjRryMy;fna`I9Hdjgt#58O?wQsa6jX z1vCJ?z+~PD$9-yL49*j@$xA`?d0!>u$^hXZYGCt(xH z2WE@vnh{g%tM_Z0H3W@o#(ntD1Azv-^gzAkUc4H2_Q}%+cDy>V-p*tR>YGHdUT+Z7 zZzhfz8{aOpqPWde_YJWtClO6j8$w+c>+*7Ph{Jv?T^n5r!`z;PKjpY*CwuZ6-|)j) z*2>p9{1BeeO=JfGMfAJQg{uj3=d5InZOkPNW5XC*IRs|a)|cwMxU1}Rq7q8$rOe)#0A zn2@0TF*qzF8cZ@-LGp)u-YU*Wo2~ZsCI)W}VM{p&eH!LTZ*sVn_}Neuy!IZgaBOcc z-QU(W=M3nd7xvuUrkGN-3&%*ra4 z1l0s36E5^REH8*+JT6~LQa#;$^4pbQ&Nsn;>_V4c6=-PaNR9YTqPI#R1KA644EYn{ zw-IYb4|}_=p^bQ6ip+z(HPu1y;H>bl5IaHTo|0K4F6E92fM z?yab;7#TJt`kXazbFkj0wo26Fo|2DR#wJpd+Vh)*HtQBhvE_zb7kh+|I zh2~kV&8WYvz+YIO+VPE-)@i2_dXWT5K0KObEti5WRUpO&?&(zPBXj9>HjmGz?0zBH zi@J{YHajhpQ1|wex`w!yZlZ5UhbU2GpT?sT1*T{l#nc^6s3#`ThqI$(8<4NXnC5|= z^qWQ<-YQYslajGIXViAUf@rp@NmXP^FBaO-qHw8E>5+%wliT(C3}fnarTlpQ7Z0DF zr6EU6VMG2P%L`pNIbGjQn9oEb8!!Hg)bAisEC1;f^WzgFv9=vqwD45>9w`6T$re02 z#iMHWga^GblMoUcg%gtoh{VlMInary=WoH`=V7to7uc+_O!97)SO>kB$@Umq{|>C_lN zN4{s0g;x?NyJ8!iQ~Hrhvn1EUanPx!G}_=ehZQt`7QpL18q9 zpN=grB|c51jEtClxN7Orx$9nMK`GqvQ5M71YWR{AyrgX}HPAe4IG&Z~+w46E8G z*sQ$(oH1lR+uts1YfI_tyRkgY2^C(0ZFY<^CqW4AP-Fvjj2=!|ulMA|yN2GibWIL> z;;P7qRXvs6?@ zNK8&m|JGZU(jm&#q5T2o+T*#Jq#m8@|B?a!Pn7$P6S^4!Bh?K5Kky6C*EQ0q(Q=Ca EAE8`*RsaA1 literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..44d1383094a4c72f9785a7b75bdcbc6739c5ce29 GIT binary patch literal 5044 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 literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..9a22b7fc3ff5b59f8452c9a33b8fecb2b778f3c3 GIT binary patch literal 1448 zcmV;Z1y}lsP)0nBzngM zUWh@ z-+9h?-cv4~5pn-(2cDEz5T=O*VVYPFrile%nphB~i3MSrSP-U(1!0;Bf>ekh7V=SQ z8Nr}j1W~md3ld2LZ`yG?-%cWtYKn@$O#`Xq*ccrShllgqc|4w^xVV^##bQH~%wI&F z^!N*rNF-7QgTcPcJD<;=MNw3Beus1#kwC!T^GF~aJ8@Mx3kz25#ES1ez@Ei(v62js z+Pnvwj$Oz3j7?Ql^~R=V?dkgyq|=c|#Aq@Zw-36Umos%*ZR`G0p=ja73qLQ(Ijm49 z-%+XSJ|#{nQ>m0^cxdRn!Jzv%(_dMu+SbsZ*?XnEZH33<(YLNxd9=J-w)S7(>@=lBXBw#`)P;$h*&IH zR$Ht3tfi&(Z2NC*%lv+ynNRWM98Pgru8%@lyG^5MJm7J=&-LBCvzrnK=93k#$UtPB z;d0B!&teXjTaoocuX~q7eMw{E(gR!`Pii!Fy&nmOdmn_D6y&YlcrUvOOE@)uCfL%n{RgMh(dLAsEf@&&XbDJ7P0bdQ$@lq#N~Ns?fS*hzV`M8)m6erm zIvwh{<8Ta{8#J2T^$Qn$Nsc(l zbRoUZ>osKBQ^{oHUYQC^ph~3^q?qzdJsQYC`YYTH8}aMNv0RniW<4E`$JP^o60)Gl zNF-_}*~CmT+4zJ8gZ@JnwlV)JsXL53{js4 zPV-%;R=x}_)d3|XL@ew=(BXw-?tJhl3ekXO)Lo0#DXwQEC|!Yf-p@i2-Eb;fcyh#XI9ptLIfWG0000> literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f64ce773003fdb582ed97b7ca157a8bb1eb3a63b GIT binary patch literal 3816 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 I4SpK+KQRG+IRF3v literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..72baec5a174ceb47368a78cbe8cada26d493a6c5 GIT binary patch literal 1787 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 literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..41b217a5b9447732b98a4b258d75c4b961b46ae8 GIT binary patch literal 8815 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 S;XmI=-YLkaN>@voh5Qe5^+6;6 literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb65cb8dbad5f1a6fbf91c7c920af6cc33e2c66 GIT binary patch literal 2434 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 IdEG1iACs^`umAu6 literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5047fef8e6658f1a9ea5b03d4d6fdd223550925e GIT binary patch literal 7053 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 literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 000000000..0bedcf2fd --- /dev/null +++ b/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000..89c2725b7 --- /dev/null +++ b/packages/survey_form/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/packages/survey_form/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/survey_form/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f2e259c7c --- /dev/null +++ b/packages/survey_form/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/survey_form/example/ios/Runner/Base.lproj/Main.storyboard b/packages/survey_form/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/packages/survey_form/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/survey_form/example/ios/Runner/Info.plist b/packages/survey_form/example/ios/Runner/Info.plist new file mode 100644 index 000000000..5458fc418 --- /dev/null +++ b/packages/survey_form/example/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/packages/survey_form/example/ios/Runner/Runner-Bridging-Header.h b/packages/survey_form/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..308a2a560 --- /dev/null +++ b/packages/survey_form/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/packages/survey_form/example/ios/RunnerTests/RunnerTests.swift b/packages/survey_form/example/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 000000000..86a7c3b1b --- /dev/null +++ b/packages/survey_form/example/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/packages/survey_form/example/lib/data.json b/packages/survey_form/example/lib/data.json new file mode 100644 index 000000000..caff05901 --- /dev/null +++ b/packages/survey_form/example/lib/data.json @@ -0,0 +1,20 @@ +[ + { + "code": "ACKNOWLEDGEMENT_SUCCESS_ACTION_LABEL_TEXT", + "locale": "en_MZ", + "message": "Go Back", + "module": "hcm-acknowledgement" + }, + { + "code": "ACKNOWLEDGEMENT_SUCCESS_DESCRIPTION_TEXT", + "locale": "en_MZ", + "message": "The data has been recorded successfully.", + "module": "hcm-acknowledgement" + }, + { + "code": "ACKNOWLEDGEMENT_SUCCESS_LABEL_TEXT", + "locale": "en_MZ", + "message": "Data recorded successfully", + "module": "hcm-acknowledgement" + } +] \ No newline at end of file diff --git a/packages/survey_form/example/lib/localizedString.dart b/packages/survey_form/example/lib/localizedString.dart new file mode 100644 index 000000000..e573a6ae6 --- /dev/null +++ b/packages/survey_form/example/lib/localizedString.dart @@ -0,0 +1,34 @@ +class LocalizedString { + final String code; + final String locale; + final String message; + final String module; + + // Constructor + LocalizedString({ + required this.code, + required this.locale, + required this.message, + required this.module, + }); + + // Factory constructor to create an instance from JSON + factory LocalizedString.fromJson(Map json) { + return LocalizedString( + code: json['code'] as String, + locale: json['locale'] as String, + message: json['message'] as String, + module: json['module'] as String, + ); + } + + // Optional: Method to convert an instance back to JSON + Map toJson() { + return { + 'code': code, + 'locale': locale, + 'message': message, + 'module': module, + }; + } +} diff --git a/packages/survey_form/example/lib/main.dart b/packages/survey_form/example/lib/main.dart new file mode 100644 index 000000000..b017e1dc9 --- /dev/null +++ b/packages/survey_form/example/lib/main.dart @@ -0,0 +1,106 @@ +import 'dart:convert'; + +import 'package:survey_form/blocs/app_localization.dart'; +import 'package:survey_form/blocs/survey_form_localization_delegate.dart'; +import 'package:digit_components/widgets/digit_elevated_button.dart'; +import 'package:flutter/material.dart'; +import 'package:survey_form/pages/acknowledgement.dart'; +import 'package:flutter/services.dart'; + +import 'localizedString.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const MyHomePage(title: 'Survey Form Package Example'), + ); + } +} + +Future loadLocalizedStrings() async{ + String jsonString = await rootBundle.loadString('lib/data.json'); + // Decode the JSON string + List jsonList = jsonDecode(jsonString); + + // Convert the dynamic list to a list of LocalizedString objects + return jsonList.map((jsonItem) => LocalizedString.fromJson(jsonItem)).toList(); +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key, required this.title}); + + final String title; + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + late Future localizedStrings; + final languages=[ + { + "label":"PORTUGUÊS", + "value":"pt_MZ" + }, + { + "label":"FRENCH", + "value":"fr_MZ" + }, + { + "label":"ENGLISH", + "value":"en_MZ" + } + ]; + + @override + void initState() { + super.initState(); + localizedStrings = loadLocalizedStrings(); + + SurveyFormLocalizationDelegate delegate = SurveyFormLocalizationDelegate(localizedStrings, languages); + delegate.load(const Locale("en","MZ")); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + title: Text(widget.title), + ), + body: Center( + child:Container( + width: 300, + child: DigitElevatedButton( + child: const Text("Acknowledgement Page"), + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) => SurveyFormAcknowledgementPage( + appLocalizations: SurveyFormLocalization( + const Locale("en","MZ"), + localizedStrings, + languages + ), + )) + ); + }, + ), + ), + ), + ); + } +} diff --git a/packages/survey_form/example/pubspec.lock b/packages/survey_form/example/pubspec.lock new file mode 100644 index 000000000..b325ac022 --- /dev/null +++ b/packages/survey_form/example/pubspec.lock @@ -0,0 +1,1067 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" + source: hosted + version: "64.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + auto_route: + dependency: transitive + description: + name: auto_route + sha256: eb33554581a0a4aa7e6da0f13a44291a55bf71359012f1d9feb41634ff908ff8 + url: "https://pub.dev" + source: hosted + version: "7.9.2" + bloc: + dependency: transitive + description: + name: bloc + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + url: "https://pub.dev" + source: hosted + version: "8.1.4" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: transitive + description: + name: build_runner + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" + url: "https://pub.dev" + source: hosted + version: "2.4.9" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + url: "https://pub.dev" + source: hosted + version: "8.9.2" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dart_mappable: + dependency: transitive + description: + name: dart_mappable + sha256: "47269caf2060533c29b823ff7fa9706502355ffcb61e7f2a374e3a0fb2f2c3f0" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + url: "https://pub.dev" + source: hosted + version: "2.3.6" + db_viewer: + dependency: transitive + description: + name: db_viewer + sha256: "5f7e3cfcde9663321797d8f6f0c876f7c13f0825a2e77ec1ef065656797144d9" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + digit_components: + dependency: "direct main" + description: + name: digit_components + sha256: "01320d4c72829045e789d1a56e23ff2bd85dad6a1831d27bd507a1acaceae17e" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + digit_data_model: + dependency: transitive + description: + name: digit_data_model + sha256: "058168c32c198f7c76ff8765f56827812f9c71cd269d5cb792afd77302b766ab" + url: "https://pub.dev" + source: hosted + version: "1.0.4-dev.3" + dio: + dependency: transitive + description: + name: dio + sha256: "0dfb6b6a1979dac1c1245e17cef824d7b452ea29bd33d3467269f9bef3715fb0" + url: "https://pub.dev" + source: hosted + version: "5.6.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "36c5b2d79eb17cdae41e974b7a8284fec631651d2a6f39a8a2ff22327e90aeac" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + drift: + dependency: transitive + description: + name: drift + sha256: b50a8342c6ddf05be53bda1d246404cbad101b64dc73e8d6d1ac1090d119b4e2 + url: "https://pub.dev" + source: hosted + version: "2.15.0" + drift_db_viewer: + dependency: transitive + description: + name: drift_db_viewer + sha256: "5ea77858c52b55460a1e8f34ab5f88324621d486717d876fd745765fbc227f3f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + easy_stepper: + dependency: transitive + description: + name: easy_stepper + sha256: "77f3ab4ee3c867b5a2236bf712abb08fed2b1c533cf24cf3fcd46c2821072ffd" + url: "https://pub.dev" + source: hosted + version: "0.5.2+1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_bloc: + dependency: transitive + description: + name: flutter_bloc + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + url: "https://pub.dev" + source: hosted + version: "8.1.6" + flutter_focus_watcher: + dependency: transitive + description: + name: flutter_focus_watcher + sha256: a72ee539ae0237961308a25839887ca93a0b1cb6f87b0d492b139c8fccff8e79 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility: + dependency: transitive + description: + name: flutter_keyboard_visibility + sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" + url: "https://pub.dev" + source: hosted + version: "5.4.1" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_web: + dependency: transitive + description: + name: flutter_keyboard_visibility_web + sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_spinkit: + dependency: transitive + description: + name: flutter_spinkit + sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 + url: "https://pub.dev" + source: hosted + version: "5.2.1" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + url: "https://pub.dev" + source: hosted + version: "2.0.10+1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_typeahead: + dependency: transitive + description: + name: flutter_typeahead + sha256: b9942bd5b7611a6ec3f0730c477146cffa4cd4b051077983ba67ddfc9e7ee818 + url: "https://pub.dev" + source: hosted + version: "4.8.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fluttertoast: + dependency: transitive + description: + name: fluttertoast + sha256: "81b68579e23fcbcada2db3d50302813d2371664afe6165bc78148050ab94bf66" + url: "https://pub.dev" + source: hosted + version: "8.2.5" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 + url: "https://pub.dev" + source: hosted + version: "2.4.4" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + google_fonts: + dependency: transitive + description: + name: google_fonts + sha256: "2776c66b3e97c6cdd58d1bd3281548b074b64f1fd5c8f82391f7456e38849567" + url: "https://pub.dev" + source: hosted + version: "4.0.5" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + group_radio_button: + dependency: transitive + description: + name: group_radio_button + sha256: "204de8d16b224be7fc72dade0c3afd410ff5a34417d89f74f0fd8be7a8c2b4d6" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + horizontal_data_table: + dependency: transitive + description: + name: horizontal_data_table + sha256: c8ab5256bbced698a729f3e0ff2cb0e8e97416cdbb082860370eaf883badf722 + url: "https://pub.dev" + source: hosted + version: "4.3.1" + http: + dependency: transitive + description: + name: http + sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba + url: "https://pub.dev" + source: hosted + version: "1.2.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + intl: + dependency: transitive + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + isar: + dependency: transitive + description: + name: isar + sha256: "99165dadb2cf2329d3140198363a7e7bff9bbd441871898a87e26914d25cf1ea" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + isar_flutter_libs: + dependency: transitive + description: + name: isar_flutter_libs + sha256: bc6768cc4b9c61aabff77152e7f33b4b17d2fc93134f7af1c3dd51500fe8d5e8 + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + lints: + dependency: transitive + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + location: + dependency: transitive + description: + name: location + sha256: "06be54f682c9073cbfec3899eb9bc8ed90faa0e17735c9d9fa7fe426f5be1dd1" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: "8aa1d34eeecc979d7c9fe372931d84f6d2ebbd52226a54fe1620de6fdc0753b1" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + location_web: + dependency: transitive + description: + name: location_web + sha256: ec484c66e8a4ff1ee5d044c203f4b6b71e3a0556a97b739a5bc9616de672412b + url: "https://pub.dev" + source: hosted + version: "4.2.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + lottie: + dependency: transitive + description: + name: lottie + sha256: a93542cc2d60a7057255405f62252533f8e8956e7e06754955669fd32fb4b216 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" + source: hosted + version: "0.12.16" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + meta: + dependency: transitive + description: + name: meta + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" + source: hosted + version: "1.10.0" + mime: + dependency: transitive + description: + name: mime + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + mocktail: + dependency: transitive + description: + name: mocktail + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + overlay_builder: + dependency: transitive + description: + name: overlay_builder + sha256: "58b97bc5f67a2e2bb7006dd88e697ac757dfffc9dbd1e7dfc1917fb510a4b5c8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + path: + dependency: transitive + description: + name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" + source: hosted + version: "1.8.3" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" + source: hosted + version: "1.0.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + url: "https://pub.dev" + source: hosted + version: "2.1.4" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + url: "https://pub.dev" + source: hosted + version: "2.2.4" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointer_interceptor: + dependency: transitive + description: + name: pointer_interceptor + sha256: adf7a637f97c077041d36801b43be08559fd4322d2127b3f20bb7be1b9eebc22 + url: "https://pub.dev" + source: hosted + version: "0.9.3+7" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + reactive_flutter_typeahead: + dependency: transitive + description: + name: reactive_flutter_typeahead + sha256: ef91627df8cef70e603e8a6458749d8a99a385b78854332602fd08ad905cdab8 + url: "https://pub.dev" + source: hosted + version: "0.8.1" + reactive_forms: + dependency: transitive + description: + name: reactive_forms + sha256: "5aa9c48a0626c20d00a005e597cb10efbdebbfeecb9c4227b03a5945fbb91ec4" + url: "https://pub.dev" + source: hosted + version: "14.3.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + remove_emoji_input_formatter: + dependency: transitive + description: + name: remove_emoji_input_formatter + sha256: "82d195984f890de7a8fea936c698848e78c1a67ccefe18db3baf9f7a3bc0177f" + url: "https://pub.dev" + source: hosted + version: "0.0.1+1" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sqlite3: + dependency: transitive + description: + name: sqlite3 + sha256: "072128763f1547e3e9b4735ce846bfd226d68019ccda54db4cd427b12dfdedc9" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqlite3_flutter_libs: + dependency: transitive + description: + name: sqlite3_flutter_libs + sha256: "62bbb4073edbcdf53f40c80775f33eea01d301b7b81417e5b3fb7395416258c1" + url: "https://pub.dev" + source: hosted + version: "0.5.24" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + survey_form: + dependency: "direct main" + description: + path: "packages/survey_form" + ref: checklist-package + resolved-ref: bbac302cdb35f380fb369faf3bc778ee0cbf1bbf + url: "https://github.com/egovernments/health-campaign-field-worker-app" + source: git + version: "0.0.1-dev.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + type_plus: + dependency: transitive + description: + name: type_plus + sha256: d5d1019471f0d38b91603adb9b5fd4ce7ab903c879d2fbf1a3f80a630a03fcc9 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + uuid: + dependency: transitive + description: + name: uuid + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" + source: hosted + version: "3.0.7" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + url: "https://pub.dev" + source: hosted + version: "5.2.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.2.0 <3.9.0" + flutter: ">=3.16.0" diff --git a/packages/survey_form/example/pubspec.yaml b/packages/survey_form/example/pubspec.yaml new file mode 100644 index 000000000..bfd25c882 --- /dev/null +++ b/packages/survey_form/example/pubspec.yaml @@ -0,0 +1,96 @@ +name: example +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: '>=3.2.0 <4.0.0' + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + digit_components: ^1.0.0+2 + survey_form: + git: + url: https://github.com/egovernments/health-campaign-field-worker-app + ref: checklist-package + path: ./packages/survey_form + + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - lib/data.json + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/survey_form/lib/blocs/app_localization.dart b/packages/survey_form/lib/blocs/app_localization.dart new file mode 100644 index 000000000..5cbb3c195 --- /dev/null +++ b/packages/survey_form/lib/blocs/app_localization.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; + +import 'survey_form_localization_delegate.dart'; + +// Class responsible for handling survey_form localization +class SurveyFormLocalization { + final Locale locale; + final Future localizedStrings; + final List languages; + + SurveyFormLocalization(this.locale, this.localizedStrings, this.languages); + + // Method to get the current localization instance from context + static SurveyFormLocalization of(BuildContext context) { + return Localizations.of(context, SurveyFormLocalization)!; + } + + static final List _localizedStrings = []; + + // Method to get the delegate for localization + static LocalizationsDelegate getDelegate( + Future localizedStrings, List languages) { + return SurveyFormLocalizationDelegate(localizedStrings, languages); + } + + // Method to load localized strings + Future load() async { + _localizedStrings.clear(); + // Iterate over localized strings and filter based on locale + for (var element in await localizedStrings) { + if (element.locale == '${locale.languageCode}_${locale.countryCode}') { + _localizedStrings.add(element); + } + } + + return true; + } + + // Method to translate a given localized value + String translate(String localizedValues) { + if (_localizedStrings.isEmpty) { + return localizedValues; + } else { + final index = _localizedStrings.indexWhere( + (medium) => medium.code == localizedValues, + ); + + return index != -1 ? _localizedStrings[index].message : localizedValues; + } + } +} diff --git a/packages/digit_data_model/lib/blocs/service/service.dart b/packages/survey_form/lib/blocs/service.dart similarity index 70% rename from packages/digit_data_model/lib/blocs/service/service.dart rename to packages/survey_form/lib/blocs/service.dart index 367872d28..a0fe9e36f 100644 --- a/packages/digit_data_model/lib/blocs/service/service.dart +++ b/packages/survey_form/lib/blocs/service.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:digit_data_model/data_model.dart'; +import 'package:survey_form/survey_form.dart'; import '../../utils/typedefs.dart'; @@ -14,56 +14,58 @@ class ServiceBloc extends Bloc { final ServiceDataRepository serviceDataRepository; ServiceBloc( - super.initialState, { - required this.serviceDataRepository, - }) { + super.initialState, { + required this.serviceDataRepository, + }) { on(_handleCreate); - on(_multichecklistChanged); + on(_multiSurveyFormChanged); on(_handleSearch); on(_handlereset); on(_handleSelect); } - FutureOr _multichecklistChanged( - ServiceChecklistEvent event, - ServiceEmitter emit, - ) async { - emit(ServiceState.multichecklistChanged( + FutureOr _multiSurveyFormChanged( + ServiceSurveyFormEvent event, + ServiceEmitter emit, + ) async { + emit(ServiceState.multiSurveyFormChanged( value: event.value, submitTriggered: event.submitTriggered, )); } FutureOr _handleCreate( - ServiceCreateEvent event, - ServiceEmitter emit, - ) async { + ServiceCreateEvent event, + ServiceEmitter emit, + ) async { await serviceDataRepository.create(event.serviceModel); } FutureOr _handlereset( - ServiceResetEvent event, - ServiceEmitter emit, - ) async { + ServiceResetEvent event, + ServiceEmitter emit, + ) async { emit(ServiceSearchState( selectedService: null, serviceList: event.serviceList, )); } + //Handles the service search calls from local DB FutureOr _handleSearch( - ServiceSearchEvent event, - ServiceEmitter emit, - ) async { + ServiceSearchEvent event, + ServiceEmitter emit, + ) async { final results = - await serviceDataRepository.search(event.serviceSearchModel); + await serviceDataRepository.search(event.serviceSearchModel); emit(ServiceSearchState(serviceList: results)); } + // FutureOr _handleSelect( - ServiceSelectionEvent event, - ServiceEmitter emit, - ) async { + ServiceSelectionEvent event, + ServiceEmitter emit, + ) async { state.mapOrNull( serviceSearch: (value) => emit(value.copyWith( selectedService: event.service, @@ -75,16 +77,16 @@ class ServiceBloc extends Bloc { @freezed class ServiceEvent with _$ServiceEvent { const factory ServiceEvent.create({required ServiceModel serviceModel}) = - ServiceCreateEvent; + ServiceCreateEvent; const factory ServiceEvent.search({ required ServiceSearchModel serviceSearchModel, }) = ServiceSearchEvent; - const factory ServiceEvent.multichecklistChanged({ + const factory ServiceEvent.multiSurveyFormChanged({ required String value, required bool submitTriggered, - }) = ServiceChecklistEvent; + }) = ServiceSurveyFormEvent; const factory ServiceEvent.selectService({ required ServiceModel service, }) = ServiceSelectionEvent; @@ -100,10 +102,10 @@ class ServiceState with _$ServiceState { const factory ServiceState.isloading() = ServiceIsloadingState; - const factory ServiceState.multichecklistChanged({ + const factory ServiceState.multiSurveyFormChanged({ @Default('') String value, @Default(false) bool submitTriggered, - }) = ServiceMultichecklistChangedState; + }) = ServiceMultiSurveyFormChangedState; const factory ServiceState.serviceCreate({ required ServiceModel serviceList, diff --git a/packages/digit_data_model/lib/blocs/service/service.freezed.dart b/packages/survey_form/lib/blocs/service.freezed.dart similarity index 86% rename from packages/digit_data_model/lib/blocs/service/service.freezed.dart rename to packages/survey_form/lib/blocs/service.freezed.dart index 4dfeff427..8d099d19d 100644 --- a/packages/digit_data_model/lib/blocs/service/service.freezed.dart +++ b/packages/survey_form/lib/blocs/service.freezed.dart @@ -21,7 +21,7 @@ mixin _$ServiceEvent { required TResult Function(ServiceModel serviceModel) create, required TResult Function(ServiceSearchModel serviceSearchModel) search, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel service) selectService, required TResult Function(List serviceList) resetSelected, }) => @@ -31,7 +31,7 @@ mixin _$ServiceEvent { TResult? Function(ServiceModel serviceModel)? create, TResult? Function(ServiceSearchModel serviceSearchModel)? search, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel service)? selectService, TResult? Function(List serviceList)? resetSelected, }) => @@ -40,7 +40,8 @@ mixin _$ServiceEvent { TResult maybeWhen({ TResult Function(ServiceModel serviceModel)? create, TResult Function(ServiceSearchModel serviceSearchModel)? search, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel service)? selectService, TResult Function(List serviceList)? resetSelected, required TResult orElse(), @@ -50,8 +51,8 @@ mixin _$ServiceEvent { TResult map({ required TResult Function(ServiceCreateEvent value) create, required TResult Function(ServiceSearchEvent value) search, - required TResult Function(ServiceChecklistEvent value) - multichecklistChanged, + required TResult Function(ServiceSurveyFormEvent value) + multiSurveyFormChanged, required TResult Function(ServiceSelectionEvent value) selectService, required TResult Function(ServiceResetEvent value) resetSelected, }) => @@ -60,7 +61,7 @@ mixin _$ServiceEvent { TResult? mapOrNull({ TResult? Function(ServiceCreateEvent value)? create, TResult? Function(ServiceSearchEvent value)? search, - TResult? Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult? Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult? Function(ServiceSelectionEvent value)? selectService, TResult? Function(ServiceResetEvent value)? resetSelected, }) => @@ -69,7 +70,7 @@ mixin _$ServiceEvent { TResult maybeMap({ TResult Function(ServiceCreateEvent value)? create, TResult Function(ServiceSearchEvent value)? search, - TResult Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult Function(ServiceSelectionEvent value)? selectService, TResult Function(ServiceResetEvent value)? resetSelected, required TResult orElse(), @@ -164,7 +165,7 @@ class _$ServiceCreateEventImpl implements ServiceCreateEvent { required TResult Function(ServiceModel serviceModel) create, required TResult Function(ServiceSearchModel serviceSearchModel) search, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel service) selectService, required TResult Function(List serviceList) resetSelected, }) { @@ -177,7 +178,7 @@ class _$ServiceCreateEventImpl implements ServiceCreateEvent { TResult? Function(ServiceModel serviceModel)? create, TResult? Function(ServiceSearchModel serviceSearchModel)? search, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel service)? selectService, TResult? Function(List serviceList)? resetSelected, }) { @@ -189,7 +190,8 @@ class _$ServiceCreateEventImpl implements ServiceCreateEvent { TResult maybeWhen({ TResult Function(ServiceModel serviceModel)? create, TResult Function(ServiceSearchModel serviceSearchModel)? search, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel service)? selectService, TResult Function(List serviceList)? resetSelected, required TResult orElse(), @@ -205,8 +207,8 @@ class _$ServiceCreateEventImpl implements ServiceCreateEvent { TResult map({ required TResult Function(ServiceCreateEvent value) create, required TResult Function(ServiceSearchEvent value) search, - required TResult Function(ServiceChecklistEvent value) - multichecklistChanged, + required TResult Function(ServiceSurveyFormEvent value) + multiSurveyFormChanged, required TResult Function(ServiceSelectionEvent value) selectService, required TResult Function(ServiceResetEvent value) resetSelected, }) { @@ -218,7 +220,7 @@ class _$ServiceCreateEventImpl implements ServiceCreateEvent { TResult? mapOrNull({ TResult? Function(ServiceCreateEvent value)? create, TResult? Function(ServiceSearchEvent value)? search, - TResult? Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult? Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult? Function(ServiceSelectionEvent value)? selectService, TResult? Function(ServiceResetEvent value)? resetSelected, }) { @@ -230,7 +232,7 @@ class _$ServiceCreateEventImpl implements ServiceCreateEvent { TResult maybeMap({ TResult Function(ServiceCreateEvent value)? create, TResult Function(ServiceSearchEvent value)? search, - TResult Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult Function(ServiceSelectionEvent value)? selectService, TResult Function(ServiceResetEvent value)? resetSelected, required TResult orElse(), @@ -321,7 +323,7 @@ class _$ServiceSearchEventImpl implements ServiceSearchEvent { required TResult Function(ServiceModel serviceModel) create, required TResult Function(ServiceSearchModel serviceSearchModel) search, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel service) selectService, required TResult Function(List serviceList) resetSelected, }) { @@ -334,7 +336,7 @@ class _$ServiceSearchEventImpl implements ServiceSearchEvent { TResult? Function(ServiceModel serviceModel)? create, TResult? Function(ServiceSearchModel serviceSearchModel)? search, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel service)? selectService, TResult? Function(List serviceList)? resetSelected, }) { @@ -346,7 +348,8 @@ class _$ServiceSearchEventImpl implements ServiceSearchEvent { TResult maybeWhen({ TResult Function(ServiceModel serviceModel)? create, TResult Function(ServiceSearchModel serviceSearchModel)? search, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel service)? selectService, TResult Function(List serviceList)? resetSelected, required TResult orElse(), @@ -362,8 +365,8 @@ class _$ServiceSearchEventImpl implements ServiceSearchEvent { TResult map({ required TResult Function(ServiceCreateEvent value) create, required TResult Function(ServiceSearchEvent value) search, - required TResult Function(ServiceChecklistEvent value) - multichecklistChanged, + required TResult Function(ServiceSurveyFormEvent value) + multiSurveyFormChanged, required TResult Function(ServiceSelectionEvent value) selectService, required TResult Function(ServiceResetEvent value) resetSelected, }) { @@ -375,7 +378,7 @@ class _$ServiceSearchEventImpl implements ServiceSearchEvent { TResult? mapOrNull({ TResult? Function(ServiceCreateEvent value)? create, TResult? Function(ServiceSearchEvent value)? search, - TResult? Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult? Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult? Function(ServiceSelectionEvent value)? selectService, TResult? Function(ServiceResetEvent value)? resetSelected, }) { @@ -387,7 +390,7 @@ class _$ServiceSearchEventImpl implements ServiceSearchEvent { TResult maybeMap({ TResult Function(ServiceCreateEvent value)? create, TResult Function(ServiceSearchEvent value)? search, - TResult Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult Function(ServiceSelectionEvent value)? selectService, TResult Function(ServiceResetEvent value)? resetSelected, required TResult orElse(), @@ -411,21 +414,22 @@ abstract class ServiceSearchEvent implements ServiceEvent { } /// @nodoc -abstract class _$$ServiceChecklistEventImplCopyWith<$Res> { - factory _$$ServiceChecklistEventImplCopyWith( - _$ServiceChecklistEventImpl value, - $Res Function(_$ServiceChecklistEventImpl) then) = - __$$ServiceChecklistEventImplCopyWithImpl<$Res>; +abstract class _$$ServiceSurveyFormEventImplCopyWith<$Res> { + factory _$$ServiceSurveyFormEventImplCopyWith( + _$ServiceSurveyFormEventImpl value, + $Res Function(_$ServiceSurveyFormEventImpl) then) = + __$$ServiceSurveyFormEventImplCopyWithImpl<$Res>; @useResult $Res call({String value, bool submitTriggered}); } /// @nodoc -class __$$ServiceChecklistEventImplCopyWithImpl<$Res> - extends _$ServiceEventCopyWithImpl<$Res, _$ServiceChecklistEventImpl> - implements _$$ServiceChecklistEventImplCopyWith<$Res> { - __$$ServiceChecklistEventImplCopyWithImpl(_$ServiceChecklistEventImpl _value, - $Res Function(_$ServiceChecklistEventImpl) _then) +class __$$ServiceSurveyFormEventImplCopyWithImpl<$Res> + extends _$ServiceEventCopyWithImpl<$Res, _$ServiceSurveyFormEventImpl> + implements _$$ServiceSurveyFormEventImplCopyWith<$Res> { + __$$ServiceSurveyFormEventImplCopyWithImpl( + _$ServiceSurveyFormEventImpl _value, + $Res Function(_$ServiceSurveyFormEventImpl) _then) : super(_value, _then); @pragma('vm:prefer-inline') @@ -434,7 +438,7 @@ class __$$ServiceChecklistEventImplCopyWithImpl<$Res> Object? value = null, Object? submitTriggered = null, }) { - return _then(_$ServiceChecklistEventImpl( + return _then(_$ServiceSurveyFormEventImpl( value: null == value ? _value.value : value // ignore: cast_nullable_to_non_nullable @@ -449,8 +453,8 @@ class __$$ServiceChecklistEventImplCopyWithImpl<$Res> /// @nodoc -class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { - const _$ServiceChecklistEventImpl( +class _$ServiceSurveyFormEventImpl implements ServiceSurveyFormEvent { + const _$ServiceSurveyFormEventImpl( {required this.value, required this.submitTriggered}); @override @@ -460,14 +464,14 @@ class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { @override String toString() { - return 'ServiceEvent.multichecklistChanged(value: $value, submitTriggered: $submitTriggered)'; + return 'ServiceEvent.multiSurveyFormChanged(value: $value, submitTriggered: $submitTriggered)'; } @override bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && - other is _$ServiceChecklistEventImpl && + other is _$ServiceSurveyFormEventImpl && (identical(other.value, value) || other.value == value) && (identical(other.submitTriggered, submitTriggered) || other.submitTriggered == submitTriggered)); @@ -479,9 +483,9 @@ class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { @JsonKey(ignore: true) @override @pragma('vm:prefer-inline') - _$$ServiceChecklistEventImplCopyWith<_$ServiceChecklistEventImpl> - get copyWith => __$$ServiceChecklistEventImplCopyWithImpl< - _$ServiceChecklistEventImpl>(this, _$identity); + _$$ServiceSurveyFormEventImplCopyWith<_$ServiceSurveyFormEventImpl> + get copyWith => __$$ServiceSurveyFormEventImplCopyWithImpl< + _$ServiceSurveyFormEventImpl>(this, _$identity); @override @optionalTypeArgs @@ -489,11 +493,11 @@ class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { required TResult Function(ServiceModel serviceModel) create, required TResult Function(ServiceSearchModel serviceSearchModel) search, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel service) selectService, required TResult Function(List serviceList) resetSelected, }) { - return multichecklistChanged(value, submitTriggered); + return multiSurveyFormChanged(value, submitTriggered); } @override @@ -502,11 +506,11 @@ class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { TResult? Function(ServiceModel serviceModel)? create, TResult? Function(ServiceSearchModel serviceSearchModel)? search, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel service)? selectService, TResult? Function(List serviceList)? resetSelected, }) { - return multichecklistChanged?.call(value, submitTriggered); + return multiSurveyFormChanged?.call(value, submitTriggered); } @override @@ -514,13 +518,14 @@ class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { TResult maybeWhen({ TResult Function(ServiceModel serviceModel)? create, TResult Function(ServiceSearchModel serviceSearchModel)? search, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel service)? selectService, TResult Function(List serviceList)? resetSelected, required TResult orElse(), }) { - if (multichecklistChanged != null) { - return multichecklistChanged(value, submitTriggered); + if (multiSurveyFormChanged != null) { + return multiSurveyFormChanged(value, submitTriggered); } return orElse(); } @@ -530,12 +535,12 @@ class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { TResult map({ required TResult Function(ServiceCreateEvent value) create, required TResult Function(ServiceSearchEvent value) search, - required TResult Function(ServiceChecklistEvent value) - multichecklistChanged, + required TResult Function(ServiceSurveyFormEvent value) + multiSurveyFormChanged, required TResult Function(ServiceSelectionEvent value) selectService, required TResult Function(ServiceResetEvent value) resetSelected, }) { - return multichecklistChanged(this); + return multiSurveyFormChanged(this); } @override @@ -543,11 +548,11 @@ class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { TResult? mapOrNull({ TResult? Function(ServiceCreateEvent value)? create, TResult? Function(ServiceSearchEvent value)? search, - TResult? Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult? Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult? Function(ServiceSelectionEvent value)? selectService, TResult? Function(ServiceResetEvent value)? resetSelected, }) { - return multichecklistChanged?.call(this); + return multiSurveyFormChanged?.call(this); } @override @@ -555,27 +560,27 @@ class _$ServiceChecklistEventImpl implements ServiceChecklistEvent { TResult maybeMap({ TResult Function(ServiceCreateEvent value)? create, TResult Function(ServiceSearchEvent value)? search, - TResult Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult Function(ServiceSelectionEvent value)? selectService, TResult Function(ServiceResetEvent value)? resetSelected, required TResult orElse(), }) { - if (multichecklistChanged != null) { - return multichecklistChanged(this); + if (multiSurveyFormChanged != null) { + return multiSurveyFormChanged(this); } return orElse(); } } -abstract class ServiceChecklistEvent implements ServiceEvent { - const factory ServiceChecklistEvent( +abstract class ServiceSurveyFormEvent implements ServiceEvent { + const factory ServiceSurveyFormEvent( {required final String value, - required final bool submitTriggered}) = _$ServiceChecklistEventImpl; + required final bool submitTriggered}) = _$ServiceSurveyFormEventImpl; String get value; bool get submitTriggered; @JsonKey(ignore: true) - _$$ServiceChecklistEventImplCopyWith<_$ServiceChecklistEventImpl> + _$$ServiceSurveyFormEventImplCopyWith<_$ServiceSurveyFormEventImpl> get copyWith => throw _privateConstructorUsedError; } @@ -648,7 +653,7 @@ class _$ServiceSelectionEventImpl implements ServiceSelectionEvent { required TResult Function(ServiceModel serviceModel) create, required TResult Function(ServiceSearchModel serviceSearchModel) search, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel service) selectService, required TResult Function(List serviceList) resetSelected, }) { @@ -661,7 +666,7 @@ class _$ServiceSelectionEventImpl implements ServiceSelectionEvent { TResult? Function(ServiceModel serviceModel)? create, TResult? Function(ServiceSearchModel serviceSearchModel)? search, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel service)? selectService, TResult? Function(List serviceList)? resetSelected, }) { @@ -673,7 +678,8 @@ class _$ServiceSelectionEventImpl implements ServiceSelectionEvent { TResult maybeWhen({ TResult Function(ServiceModel serviceModel)? create, TResult Function(ServiceSearchModel serviceSearchModel)? search, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel service)? selectService, TResult Function(List serviceList)? resetSelected, required TResult orElse(), @@ -689,8 +695,8 @@ class _$ServiceSelectionEventImpl implements ServiceSelectionEvent { TResult map({ required TResult Function(ServiceCreateEvent value) create, required TResult Function(ServiceSearchEvent value) search, - required TResult Function(ServiceChecklistEvent value) - multichecklistChanged, + required TResult Function(ServiceSurveyFormEvent value) + multiSurveyFormChanged, required TResult Function(ServiceSelectionEvent value) selectService, required TResult Function(ServiceResetEvent value) resetSelected, }) { @@ -702,7 +708,7 @@ class _$ServiceSelectionEventImpl implements ServiceSelectionEvent { TResult? mapOrNull({ TResult? Function(ServiceCreateEvent value)? create, TResult? Function(ServiceSearchEvent value)? search, - TResult? Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult? Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult? Function(ServiceSelectionEvent value)? selectService, TResult? Function(ServiceResetEvent value)? resetSelected, }) { @@ -714,7 +720,7 @@ class _$ServiceSelectionEventImpl implements ServiceSelectionEvent { TResult maybeMap({ TResult Function(ServiceCreateEvent value)? create, TResult Function(ServiceSearchEvent value)? search, - TResult Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult Function(ServiceSelectionEvent value)? selectService, TResult Function(ServiceResetEvent value)? resetSelected, required TResult orElse(), @@ -812,7 +818,7 @@ class _$ServiceResetEventImpl implements ServiceResetEvent { required TResult Function(ServiceModel serviceModel) create, required TResult Function(ServiceSearchModel serviceSearchModel) search, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel service) selectService, required TResult Function(List serviceList) resetSelected, }) { @@ -825,7 +831,7 @@ class _$ServiceResetEventImpl implements ServiceResetEvent { TResult? Function(ServiceModel serviceModel)? create, TResult? Function(ServiceSearchModel serviceSearchModel)? search, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel service)? selectService, TResult? Function(List serviceList)? resetSelected, }) { @@ -837,7 +843,8 @@ class _$ServiceResetEventImpl implements ServiceResetEvent { TResult maybeWhen({ TResult Function(ServiceModel serviceModel)? create, TResult Function(ServiceSearchModel serviceSearchModel)? search, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel service)? selectService, TResult Function(List serviceList)? resetSelected, required TResult orElse(), @@ -853,8 +860,8 @@ class _$ServiceResetEventImpl implements ServiceResetEvent { TResult map({ required TResult Function(ServiceCreateEvent value) create, required TResult Function(ServiceSearchEvent value) search, - required TResult Function(ServiceChecklistEvent value) - multichecklistChanged, + required TResult Function(ServiceSurveyFormEvent value) + multiSurveyFormChanged, required TResult Function(ServiceSelectionEvent value) selectService, required TResult Function(ServiceResetEvent value) resetSelected, }) { @@ -866,7 +873,7 @@ class _$ServiceResetEventImpl implements ServiceResetEvent { TResult? mapOrNull({ TResult? Function(ServiceCreateEvent value)? create, TResult? Function(ServiceSearchEvent value)? search, - TResult? Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult? Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult? Function(ServiceSelectionEvent value)? selectService, TResult? Function(ServiceResetEvent value)? resetSelected, }) { @@ -878,7 +885,7 @@ class _$ServiceResetEventImpl implements ServiceResetEvent { TResult maybeMap({ TResult Function(ServiceCreateEvent value)? create, TResult Function(ServiceSearchEvent value)? search, - TResult Function(ServiceChecklistEvent value)? multichecklistChanged, + TResult Function(ServiceSurveyFormEvent value)? multiSurveyFormChanged, TResult Function(ServiceSelectionEvent value)? selectService, TResult Function(ServiceResetEvent value)? resetSelected, required TResult orElse(), @@ -908,7 +915,7 @@ mixin _$ServiceState { required TResult Function() empty, required TResult Function() isloading, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing) serviceCreate, @@ -922,7 +929,7 @@ mixin _$ServiceState { TResult? Function()? empty, TResult? Function()? isloading, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -935,7 +942,8 @@ mixin _$ServiceState { TResult maybeWhen({ TResult Function()? empty, TResult Function()? isloading, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -949,8 +957,8 @@ mixin _$ServiceState { TResult map({ required TResult Function(ServiceEmptyState value) empty, required TResult Function(ServiceIsloadingState value) isloading, - required TResult Function(ServiceMultichecklistChangedState value) - multichecklistChanged, + required TResult Function(ServiceMultiSurveyFormChangedState value) + multiSurveyFormChanged, required TResult Function(ServiceCreateState value) serviceCreate, required TResult Function(ServiceSearchState value) serviceSearch, }) => @@ -959,8 +967,8 @@ mixin _$ServiceState { TResult? mapOrNull({ TResult? Function(ServiceEmptyState value)? empty, TResult? Function(ServiceIsloadingState value)? isloading, - TResult? Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult? Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult? Function(ServiceCreateState value)? serviceCreate, TResult? Function(ServiceSearchState value)? serviceSearch, }) => @@ -969,8 +977,8 @@ mixin _$ServiceState { TResult maybeMap({ TResult Function(ServiceEmptyState value)? empty, TResult Function(ServiceIsloadingState value)? isloading, - TResult Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult Function(ServiceCreateState value)? serviceCreate, TResult Function(ServiceSearchState value)? serviceSearch, required TResult orElse(), @@ -1037,7 +1045,7 @@ class _$ServiceEmptyStateImpl implements ServiceEmptyState { required TResult Function() empty, required TResult Function() isloading, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing) serviceCreate, @@ -1054,7 +1062,7 @@ class _$ServiceEmptyStateImpl implements ServiceEmptyState { TResult? Function()? empty, TResult? Function()? isloading, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1070,7 +1078,8 @@ class _$ServiceEmptyStateImpl implements ServiceEmptyState { TResult maybeWhen({ TResult Function()? empty, TResult Function()? isloading, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1090,8 +1099,8 @@ class _$ServiceEmptyStateImpl implements ServiceEmptyState { TResult map({ required TResult Function(ServiceEmptyState value) empty, required TResult Function(ServiceIsloadingState value) isloading, - required TResult Function(ServiceMultichecklistChangedState value) - multichecklistChanged, + required TResult Function(ServiceMultiSurveyFormChangedState value) + multiSurveyFormChanged, required TResult Function(ServiceCreateState value) serviceCreate, required TResult Function(ServiceSearchState value) serviceSearch, }) { @@ -1103,8 +1112,8 @@ class _$ServiceEmptyStateImpl implements ServiceEmptyState { TResult? mapOrNull({ TResult? Function(ServiceEmptyState value)? empty, TResult? Function(ServiceIsloadingState value)? isloading, - TResult? Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult? Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult? Function(ServiceCreateState value)? serviceCreate, TResult? Function(ServiceSearchState value)? serviceSearch, }) { @@ -1116,8 +1125,8 @@ class _$ServiceEmptyStateImpl implements ServiceEmptyState { TResult maybeMap({ TResult Function(ServiceEmptyState value)? empty, TResult Function(ServiceIsloadingState value)? isloading, - TResult Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult Function(ServiceCreateState value)? serviceCreate, TResult Function(ServiceSearchState value)? serviceSearch, required TResult orElse(), @@ -1176,7 +1185,7 @@ class _$ServiceIsloadingStateImpl implements ServiceIsloadingState { required TResult Function() empty, required TResult Function() isloading, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing) serviceCreate, @@ -1193,7 +1202,7 @@ class _$ServiceIsloadingStateImpl implements ServiceIsloadingState { TResult? Function()? empty, TResult? Function()? isloading, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1209,7 +1218,8 @@ class _$ServiceIsloadingStateImpl implements ServiceIsloadingState { TResult maybeWhen({ TResult Function()? empty, TResult Function()? isloading, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1229,8 +1239,8 @@ class _$ServiceIsloadingStateImpl implements ServiceIsloadingState { TResult map({ required TResult Function(ServiceEmptyState value) empty, required TResult Function(ServiceIsloadingState value) isloading, - required TResult Function(ServiceMultichecklistChangedState value) - multichecklistChanged, + required TResult Function(ServiceMultiSurveyFormChangedState value) + multiSurveyFormChanged, required TResult Function(ServiceCreateState value) serviceCreate, required TResult Function(ServiceSearchState value) serviceSearch, }) { @@ -1242,8 +1252,8 @@ class _$ServiceIsloadingStateImpl implements ServiceIsloadingState { TResult? mapOrNull({ TResult? Function(ServiceEmptyState value)? empty, TResult? Function(ServiceIsloadingState value)? isloading, - TResult? Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult? Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult? Function(ServiceCreateState value)? serviceCreate, TResult? Function(ServiceSearchState value)? serviceSearch, }) { @@ -1255,8 +1265,8 @@ class _$ServiceIsloadingStateImpl implements ServiceIsloadingState { TResult maybeMap({ TResult Function(ServiceEmptyState value)? empty, TResult Function(ServiceIsloadingState value)? isloading, - TResult Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult Function(ServiceCreateState value)? serviceCreate, TResult Function(ServiceSearchState value)? serviceSearch, required TResult orElse(), @@ -1273,23 +1283,23 @@ abstract class ServiceIsloadingState implements ServiceState { } /// @nodoc -abstract class _$$ServiceMultichecklistChangedStateImplCopyWith<$Res> { - factory _$$ServiceMultichecklistChangedStateImplCopyWith( - _$ServiceMultichecklistChangedStateImpl value, - $Res Function(_$ServiceMultichecklistChangedStateImpl) then) = - __$$ServiceMultichecklistChangedStateImplCopyWithImpl<$Res>; +abstract class _$$ServiceMultiSurveyFormChangedStateImplCopyWith<$Res> { + factory _$$ServiceMultiSurveyFormChangedStateImplCopyWith( + _$ServiceMultiSurveyFormChangedStateImpl value, + $Res Function(_$ServiceMultiSurveyFormChangedStateImpl) then) = + __$$ServiceMultiSurveyFormChangedStateImplCopyWithImpl<$Res>; @useResult $Res call({String value, bool submitTriggered}); } /// @nodoc -class __$$ServiceMultichecklistChangedStateImplCopyWithImpl<$Res> +class __$$ServiceMultiSurveyFormChangedStateImplCopyWithImpl<$Res> extends _$ServiceStateCopyWithImpl<$Res, - _$ServiceMultichecklistChangedStateImpl> - implements _$$ServiceMultichecklistChangedStateImplCopyWith<$Res> { - __$$ServiceMultichecklistChangedStateImplCopyWithImpl( - _$ServiceMultichecklistChangedStateImpl _value, - $Res Function(_$ServiceMultichecklistChangedStateImpl) _then) + _$ServiceMultiSurveyFormChangedStateImpl> + implements _$$ServiceMultiSurveyFormChangedStateImplCopyWith<$Res> { + __$$ServiceMultiSurveyFormChangedStateImplCopyWithImpl( + _$ServiceMultiSurveyFormChangedStateImpl _value, + $Res Function(_$ServiceMultiSurveyFormChangedStateImpl) _then) : super(_value, _then); @pragma('vm:prefer-inline') @@ -1298,7 +1308,7 @@ class __$$ServiceMultichecklistChangedStateImplCopyWithImpl<$Res> Object? value = null, Object? submitTriggered = null, }) { - return _then(_$ServiceMultichecklistChangedStateImpl( + return _then(_$ServiceMultiSurveyFormChangedStateImpl( value: null == value ? _value.value : value // ignore: cast_nullable_to_non_nullable @@ -1313,9 +1323,9 @@ class __$$ServiceMultichecklistChangedStateImplCopyWithImpl<$Res> /// @nodoc -class _$ServiceMultichecklistChangedStateImpl - implements ServiceMultichecklistChangedState { - const _$ServiceMultichecklistChangedStateImpl( +class _$ServiceMultiSurveyFormChangedStateImpl + implements ServiceMultiSurveyFormChangedState { + const _$ServiceMultiSurveyFormChangedStateImpl( {this.value = '', this.submitTriggered = false}); @override @@ -1327,14 +1337,14 @@ class _$ServiceMultichecklistChangedStateImpl @override String toString() { - return 'ServiceState.multichecklistChanged(value: $value, submitTriggered: $submitTriggered)'; + return 'ServiceState.multiSurveyFormChanged(value: $value, submitTriggered: $submitTriggered)'; } @override bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && - other is _$ServiceMultichecklistChangedStateImpl && + other is _$ServiceMultiSurveyFormChangedStateImpl && (identical(other.value, value) || other.value == value) && (identical(other.submitTriggered, submitTriggered) || other.submitTriggered == submitTriggered)); @@ -1346,10 +1356,10 @@ class _$ServiceMultichecklistChangedStateImpl @JsonKey(ignore: true) @override @pragma('vm:prefer-inline') - _$$ServiceMultichecklistChangedStateImplCopyWith< - _$ServiceMultichecklistChangedStateImpl> - get copyWith => __$$ServiceMultichecklistChangedStateImplCopyWithImpl< - _$ServiceMultichecklistChangedStateImpl>(this, _$identity); + _$$ServiceMultiSurveyFormChangedStateImplCopyWith< + _$ServiceMultiSurveyFormChangedStateImpl> + get copyWith => __$$ServiceMultiSurveyFormChangedStateImplCopyWithImpl< + _$ServiceMultiSurveyFormChangedStateImpl>(this, _$identity); @override @optionalTypeArgs @@ -1357,7 +1367,7 @@ class _$ServiceMultichecklistChangedStateImpl required TResult Function() empty, required TResult Function() isloading, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing) serviceCreate, @@ -1365,7 +1375,7 @@ class _$ServiceMultichecklistChangedStateImpl ServiceModel? selectedService, bool loading) serviceSearch, }) { - return multichecklistChanged(value, submitTriggered); + return multiSurveyFormChanged(value, submitTriggered); } @override @@ -1374,7 +1384,7 @@ class _$ServiceMultichecklistChangedStateImpl TResult? Function()? empty, TResult? Function()? isloading, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1382,7 +1392,7 @@ class _$ServiceMultichecklistChangedStateImpl ServiceModel? selectedService, bool loading)? serviceSearch, }) { - return multichecklistChanged?.call(value, submitTriggered); + return multiSurveyFormChanged?.call(value, submitTriggered); } @override @@ -1390,7 +1400,8 @@ class _$ServiceMultichecklistChangedStateImpl TResult maybeWhen({ TResult Function()? empty, TResult Function()? isloading, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1399,8 +1410,8 @@ class _$ServiceMultichecklistChangedStateImpl serviceSearch, required TResult orElse(), }) { - if (multichecklistChanged != null) { - return multichecklistChanged(value, submitTriggered); + if (multiSurveyFormChanged != null) { + return multiSurveyFormChanged(value, submitTriggered); } return orElse(); } @@ -1410,12 +1421,12 @@ class _$ServiceMultichecklistChangedStateImpl TResult map({ required TResult Function(ServiceEmptyState value) empty, required TResult Function(ServiceIsloadingState value) isloading, - required TResult Function(ServiceMultichecklistChangedState value) - multichecklistChanged, + required TResult Function(ServiceMultiSurveyFormChangedState value) + multiSurveyFormChanged, required TResult Function(ServiceCreateState value) serviceCreate, required TResult Function(ServiceSearchState value) serviceSearch, }) { - return multichecklistChanged(this); + return multiSurveyFormChanged(this); } @override @@ -1423,12 +1434,12 @@ class _$ServiceMultichecklistChangedStateImpl TResult? mapOrNull({ TResult? Function(ServiceEmptyState value)? empty, TResult? Function(ServiceIsloadingState value)? isloading, - TResult? Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult? Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult? Function(ServiceCreateState value)? serviceCreate, TResult? Function(ServiceSearchState value)? serviceSearch, }) { - return multichecklistChanged?.call(this); + return multiSurveyFormChanged?.call(this); } @override @@ -1436,29 +1447,29 @@ class _$ServiceMultichecklistChangedStateImpl TResult maybeMap({ TResult Function(ServiceEmptyState value)? empty, TResult Function(ServiceIsloadingState value)? isloading, - TResult Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult Function(ServiceCreateState value)? serviceCreate, TResult Function(ServiceSearchState value)? serviceSearch, required TResult orElse(), }) { - if (multichecklistChanged != null) { - return multichecklistChanged(this); + if (multiSurveyFormChanged != null) { + return multiSurveyFormChanged(this); } return orElse(); } } -abstract class ServiceMultichecklistChangedState implements ServiceState { - const factory ServiceMultichecklistChangedState( +abstract class ServiceMultiSurveyFormChangedState implements ServiceState { + const factory ServiceMultiSurveyFormChangedState( {final String value, - final bool submitTriggered}) = _$ServiceMultichecklistChangedStateImpl; + final bool submitTriggered}) = _$ServiceMultiSurveyFormChangedStateImpl; String get value; bool get submitTriggered; @JsonKey(ignore: true) - _$$ServiceMultichecklistChangedStateImplCopyWith< - _$ServiceMultichecklistChangedStateImpl> + _$$ServiceMultiSurveyFormChangedStateImplCopyWith< + _$ServiceMultiSurveyFormChangedStateImpl> get copyWith => throw _privateConstructorUsedError; } @@ -1568,7 +1579,7 @@ class _$ServiceCreateStateImpl implements ServiceCreateState { required TResult Function() empty, required TResult Function() isloading, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing) serviceCreate, @@ -1585,7 +1596,7 @@ class _$ServiceCreateStateImpl implements ServiceCreateState { TResult? Function()? empty, TResult? Function()? isloading, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1602,7 +1613,8 @@ class _$ServiceCreateStateImpl implements ServiceCreateState { TResult maybeWhen({ TResult Function()? empty, TResult Function()? isloading, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1622,8 +1634,8 @@ class _$ServiceCreateStateImpl implements ServiceCreateState { TResult map({ required TResult Function(ServiceEmptyState value) empty, required TResult Function(ServiceIsloadingState value) isloading, - required TResult Function(ServiceMultichecklistChangedState value) - multichecklistChanged, + required TResult Function(ServiceMultiSurveyFormChangedState value) + multiSurveyFormChanged, required TResult Function(ServiceCreateState value) serviceCreate, required TResult Function(ServiceSearchState value) serviceSearch, }) { @@ -1635,8 +1647,8 @@ class _$ServiceCreateStateImpl implements ServiceCreateState { TResult? mapOrNull({ TResult? Function(ServiceEmptyState value)? empty, TResult? Function(ServiceIsloadingState value)? isloading, - TResult? Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult? Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult? Function(ServiceCreateState value)? serviceCreate, TResult? Function(ServiceSearchState value)? serviceSearch, }) { @@ -1648,8 +1660,8 @@ class _$ServiceCreateStateImpl implements ServiceCreateState { TResult maybeMap({ TResult Function(ServiceEmptyState value)? empty, TResult Function(ServiceIsloadingState value)? isloading, - TResult Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult Function(ServiceCreateState value)? serviceCreate, TResult Function(ServiceSearchState value)? serviceSearch, required TResult orElse(), @@ -1781,7 +1793,7 @@ class _$ServiceSearchStateImpl implements ServiceSearchState { required TResult Function() empty, required TResult Function() isloading, required TResult Function(String value, bool submitTriggered) - multichecklistChanged, + multiSurveyFormChanged, required TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing) serviceCreate, @@ -1798,7 +1810,7 @@ class _$ServiceSearchStateImpl implements ServiceSearchState { TResult? Function()? empty, TResult? Function()? isloading, TResult? Function(String value, bool submitTriggered)? - multichecklistChanged, + multiSurveyFormChanged, TResult? Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1814,7 +1826,8 @@ class _$ServiceSearchStateImpl implements ServiceSearchState { TResult maybeWhen({ TResult Function()? empty, TResult Function()? isloading, - TResult Function(String value, bool submitTriggered)? multichecklistChanged, + TResult Function(String value, bool submitTriggered)? + multiSurveyFormChanged, TResult Function(ServiceModel serviceList, ServiceModel? selectedService, bool loading, bool isEditing)? serviceCreate, @@ -1834,8 +1847,8 @@ class _$ServiceSearchStateImpl implements ServiceSearchState { TResult map({ required TResult Function(ServiceEmptyState value) empty, required TResult Function(ServiceIsloadingState value) isloading, - required TResult Function(ServiceMultichecklistChangedState value) - multichecklistChanged, + required TResult Function(ServiceMultiSurveyFormChangedState value) + multiSurveyFormChanged, required TResult Function(ServiceCreateState value) serviceCreate, required TResult Function(ServiceSearchState value) serviceSearch, }) { @@ -1847,8 +1860,8 @@ class _$ServiceSearchStateImpl implements ServiceSearchState { TResult? mapOrNull({ TResult? Function(ServiceEmptyState value)? empty, TResult? Function(ServiceIsloadingState value)? isloading, - TResult? Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult? Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult? Function(ServiceCreateState value)? serviceCreate, TResult? Function(ServiceSearchState value)? serviceSearch, }) { @@ -1860,8 +1873,8 @@ class _$ServiceSearchStateImpl implements ServiceSearchState { TResult maybeMap({ TResult Function(ServiceEmptyState value)? empty, TResult Function(ServiceIsloadingState value)? isloading, - TResult Function(ServiceMultichecklistChangedState value)? - multichecklistChanged, + TResult Function(ServiceMultiSurveyFormChangedState value)? + multiSurveyFormChanged, TResult Function(ServiceCreateState value)? serviceCreate, TResult Function(ServiceSearchState value)? serviceSearch, required TResult orElse(), diff --git a/packages/digit_data_model/lib/blocs/service_definition/service_definition.dart b/packages/survey_form/lib/blocs/service_definition.dart similarity index 73% rename from packages/digit_data_model/lib/blocs/service_definition/service_definition.dart rename to packages/survey_form/lib/blocs/service_definition.dart index 357eba268..18c6a475d 100644 --- a/packages/digit_data_model/lib/blocs/service_definition/service_definition.dart +++ b/packages/survey_form/lib/blocs/service_definition.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:digit_data_model/data_model.dart'; +import 'package:survey_form/survey_form.dart'; import '../../utils/typedefs.dart'; @@ -14,32 +14,33 @@ class ServiceDefinitionBloc extends Bloc { final ServiceDefinitionDataRepository serviceDefinitionDataRepository; ServiceDefinitionBloc( - super.initialState, { - required this.serviceDefinitionDataRepository, - }) { + super.initialState, { + required this.serviceDefinitionDataRepository, + }) { on(_handleFetch); on(_handleSelect); } + // This function is called to fetch all the service definitions from the table for the selected project FutureOr _handleFetch( - ServiceDefinitionFetchEvent event, - ServiceDefinitionEmitter emit, - ) async { + ServiceDefinitionFetchEvent event, + ServiceDefinitionEmitter emit, + ) async { final results = await serviceDefinitionDataRepository.search( ServiceDefinitionSearchModel( - tenantId: DigitDataModelSingleton().tenantId, + tenantId: SurveyFormSingleton().tenantId, ), ); - emit(ServiceDefinitionServiceFetchedState( serviceDefinitionList: results, )); } + // Called when we select a service definition from the displayed list of service definition FutureOr _handleSelect( - ServiceDefinitionSelectionEvent event, - ServiceDefinitionEmitter emit, - ) async { + ServiceDefinitionSelectionEvent event, + ServiceDefinitionEmitter emit, + ) async { state.mapOrNull( serviceDefinitionFetch: (value) => emit(value.copyWith( selectedServiceDefinition: event.serviceDefinition, @@ -60,9 +61,13 @@ class ServiceDefinitionEvent with _$ServiceDefinitionEvent { class ServiceDefinitionState with _$ServiceDefinitionState { const factory ServiceDefinitionState.empty() = ServiceDefinitionEmptyState; const factory ServiceDefinitionState.isloading() = - ServiceDefinitionIsloadingState; + ServiceDefinitionIsloadingState; const factory ServiceDefinitionState.serviceDefinitionFetch({ required List serviceDefinitionList, ServiceDefinitionModel? selectedServiceDefinition, }) = ServiceDefinitionServiceFetchedState; } + + + + diff --git a/packages/digit_data_model/lib/blocs/service_definition/service_definition.freezed.dart b/packages/survey_form/lib/blocs/service_definition.freezed.dart similarity index 100% rename from packages/digit_data_model/lib/blocs/service_definition/service_definition.freezed.dart rename to packages/survey_form/lib/blocs/service_definition.freezed.dart diff --git a/packages/survey_form/lib/blocs/survey_form_localization_delegate.dart b/packages/survey_form/lib/blocs/survey_form_localization_delegate.dart new file mode 100644 index 000000000..544c0fc76 --- /dev/null +++ b/packages/survey_form/lib/blocs/survey_form_localization_delegate.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +import 'app_localization.dart'; + +class SurveyFormLocalizationDelegate + extends LocalizationsDelegate { + final Future localizedStrings; + final List languages; + + const SurveyFormLocalizationDelegate(this.localizedStrings, this.languages); + + @override + bool isSupported(Locale locale) { + return languages.map((e) { + final results = e.value.split('_'); + if (results.isNotEmpty) return results.first; + }).contains(locale.languageCode); + } + + @override + Future load(Locale locale) async { + SurveyFormLocalization localization = + SurveyFormLocalization(locale, localizedStrings, languages); + await localization.load(); + + return localization; + } + + @override + bool shouldReload( + covariant LocalizationsDelegate old) { + return true; + } +} diff --git a/packages/digit_data_model/lib/data/repositories/local/service.dart b/packages/survey_form/lib/data/repositories/local/service.dart similarity index 75% rename from packages/digit_data_model/lib/data/repositories/local/service.dart rename to packages/survey_form/lib/data/repositories/local/service.dart index 785c1d7e9..522308291 100644 --- a/packages/digit_data_model/lib/data/repositories/local/service.dart +++ b/packages/survey_form/lib/data/repositories/local/service.dart @@ -2,18 +2,22 @@ import 'dart:async'; import 'package:collection/collection.dart'; import 'package:digit_data_model/data_model.dart'; + import 'package:drift/drift.dart'; +import 'package:survey_form/survey_form.dart'; + class ServiceLocalRepository extends LocalRepository { ServiceLocalRepository(super.sql, super.opLogManager); + // function to create a Service entity in the local database @override FutureOr create( - ServiceModel entity, { - bool createOpLog = true, - DataOperation dataOperation = DataOperation.singleCreate, - }) async { + ServiceModel entity, { + bool createOpLog = true, + DataOperation dataOperation = DataOperation.singleCreate, + }) async { return retryLocalCallOperation(() async { final serviceCompanion = entity.companion; final attributes = entity.attributes; @@ -65,19 +69,19 @@ class ServiceLocalRepository return e.dataType == 'Number' ? e.copyWith(value: int.tryParse(e.value)) : e.dataType == 'MultiValueList' - ? e.copyWith( - value: e.value.toString().split('.'), - additionalDetails: e.additionalDetails != null - ? {"value": e.additionalDetails} - : null, - ) - : e.dataType == 'SingleValueList' - ? e.copyWith( - additionalDetails: e.additionalDetails != null - ? {"value": e.additionalDetails} - : null, - ) - : e; + ? e.copyWith( + value: e.value.toString().split('.'), + additionalDetails: e.additionalDetails != null + ? {"value": e.additionalDetails} + : null, + ) + : e.dataType == 'SingleValueList' + ? e.copyWith( + additionalDetails: e.additionalDetails != null + ? {"value": e.additionalDetails} + : null, + ) + : e; }).toList(), ); @@ -89,23 +93,24 @@ class ServiceLocalRepository }); } + //function to search Service entities corresponding to selected service definition from local database @override FutureOr> search( - ServiceSearchModel query, - ) async { + ServiceSearchModel query, + ) async { return retryLocalCallOperation>(() async { final selectQuery = sql.select(sql.service).join([]); final results = await (selectQuery - ..where(buildAnd([ - if (query.id != null) - sql.service.serviceDefId.equals( - query.id!, - ), - if (query.clientId != null) - sql.service.clientId.equals( - query.clientId!, - ), - ]))) + ..where(buildAnd([ + if (query.id != null) + sql.service.serviceDefId.equals( + query.id!, + ), + if (query.clientId != null) + sql.service.clientId.equals( + query.clientId!, + ), + ]))) .get(); final List serviceList = []; @@ -114,11 +119,11 @@ class ServiceLocalRepository final selectattributeQuery = sql.select(sql.serviceAttributes).join([]); final val = await (selectattributeQuery - ..where(buildAnd([ - sql.serviceAttributes.referenceId.equals( - data.clientId, - ), - ]))) + ..where(buildAnd([ + sql.serviceAttributes.referenceId.equals( + data.clientId, + ), + ]))) .get(); final res = val.map((e) { final attribute = e.readTableOrNull(sql.serviceAttributes); diff --git a/packages/digit_data_model/lib/data/repositories/local/service_definition.dart b/packages/survey_form/lib/data/repositories/local/service_definition.dart similarity index 75% rename from packages/digit_data_model/lib/data/repositories/local/service_definition.dart rename to packages/survey_form/lib/data/repositories/local/service_definition.dart index 600e06750..30e3cbc49 100644 --- a/packages/digit_data_model/lib/data/repositories/local/service_definition.dart +++ b/packages/survey_form/lib/data/repositories/local/service_definition.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:collection/collection.dart'; import 'package:digit_data_model/data_model.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:drift/drift.dart'; class ServiceDefinitionLocalRepository extends LocalRepository< @@ -10,10 +11,10 @@ class ServiceDefinitionLocalRepository extends LocalRepository< @override FutureOr create( - ServiceDefinitionModel entity, { - bool createOpLog = false, - DataOperation dataOperation = DataOperation.create, - }) async { + ServiceDefinitionModel entity, { + bool createOpLog = false, + DataOperation dataOperation = DataOperation.create, + }) async { return retryLocalCallOperation(() async { final serviceDefinitionCompanion = entity.companion; final attributes = entity.attributes; @@ -42,24 +43,25 @@ class ServiceDefinitionLocalRepository extends LocalRepository< @override FutureOr> search( - ServiceDefinitionSearchModel query, { - bool createOpLog = false, - }) async { + ServiceDefinitionSearchModel query, { + bool createOpLog = false, + }) async { return retryLocalCallOperation(() async { final selectQuery = sql.select(sql.serviceDefinition).join([]); final results = await (selectQuery - ..where(buildAnd([ - if (query.id != null) - sql.serviceDefinition.id.equals( - query.id!, - ), - // To fetch service definition of a single checklist with the code - if (query.code != null) - sql.serviceDefinition.code.isIn( - query.code!, - ), - ]))) + ..where(buildAnd([ + // To fetch service definition with the id + if (query.id != null) + sql.serviceDefinition.id.equals( + query.id!, + ), + // To fetch service definition of a single survey_form with the code + if (query.code != null) + sql.serviceDefinition.code.isIn( + query.code!, + ), + ]))) .get(); final List serviceDefinitionList = []; @@ -68,11 +70,11 @@ class ServiceDefinitionLocalRepository extends LocalRepository< final selectattributeQuery = sql.select(sql.attributes).join([]); final val = await (selectattributeQuery - ..where(buildAnd([ - sql.attributes.referenceId.equals( - data.id!, - ), - ]))) + ..where(buildAnd([ + sql.attributes.referenceId.equals( + data.id!, + ), + ]))) .get(); final res = val.map((e) { @@ -80,10 +82,10 @@ class ServiceDefinitionLocalRepository extends LocalRepository< if (resull != null) { List list = resull.values != null ? resull.values! - .replaceFirst('[', '') - .replaceFirst(']', '') - .replaceAll(" ", '') - .split(',') + .replaceFirst('[', '') + .replaceFirst(']', '') + .replaceAll(" ", '') + .split(',') : []; if (list.isEmpty) list.removeRange(0, list.length); diff --git a/packages/survey_form/lib/data/repositories/oplog/oplog.dart b/packages/survey_form/lib/data/repositories/oplog/oplog.dart new file mode 100644 index 000000000..d7b1e9cda --- /dev/null +++ b/packages/survey_form/lib/data/repositories/oplog/oplog.dart @@ -0,0 +1,58 @@ +import 'package:digit_data_model/data/repositories/oplog/oplog.dart'; +import 'package:survey_form/survey_form.dart'; + + +//Oplog for managing Service definition +class ServiceDefinitionOpLogManager + extends OpLogManager { + ServiceDefinitionOpLogManager(super.isar); + + @override + ServiceDefinitionModel applyServerGeneratedIdToEntity( + ServiceDefinitionModel entity, + String serverGeneratedId, + int rowVersion, + ) => + entity.copyWith(id: serverGeneratedId, rowVersion: rowVersion); + + @override + String getClientReferenceId(ServiceDefinitionModel entity) { + throw UnimplementedError(); + } + + @override + String? getServerGeneratedId(ServiceDefinitionModel entity) => entity.id; + + @override + int? getRowVersion(ServiceDefinitionModel entity) => entity.rowVersion; + + @override + bool? getNonRecoverableError(ServiceDefinitionModel entity) => + entity.nonRecoverableError; +} + +//Oplog for managing Service +class ServiceOpLogManager extends OpLogManager { + ServiceOpLogManager(super.isar); + + @override + ServiceModel applyServerGeneratedIdToEntity( + ServiceModel entity, + String serverGeneratedId, + int rowVersion, + ) => + entity.copyWith(id: serverGeneratedId, rowVersion: rowVersion); + + @override + String getClientReferenceId(ServiceModel entity) => entity.clientId; + + @override + String? getServerGeneratedId(ServiceModel entity) => entity.id; + + @override + int? getRowVersion(ServiceModel entity) => entity.rowVersion; + + @override + bool? getNonRecoverableError(ServiceModel entity) => + entity.nonRecoverableError; +} \ No newline at end of file diff --git a/packages/digit_data_model/lib/data/repositories/remote/service.dart b/packages/survey_form/lib/data/repositories/remote/service.dart similarity index 76% rename from packages/digit_data_model/lib/data/repositories/remote/service.dart rename to packages/survey_form/lib/data/repositories/remote/service.dart index dc2a937cb..25eb3d70d 100644 --- a/packages/digit_data_model/lib/data/repositories/remote/service.dart +++ b/packages/survey_form/lib/data/repositories/remote/service.dart @@ -5,10 +5,10 @@ import '../../../models/entities/service.dart'; class ServiceRemoteRepository extends RemoteRepository { ServiceRemoteRepository( - super.dio, { - required super.actionMap, - super.entityName = 'Service', - }); + super.dio, { + required super.actionMap, + super.entityName = 'Service', + }); @override DataModelType get type => DataModelType.service; diff --git a/packages/digit_data_model/lib/data/repositories/remote/service_attributes.dart b/packages/survey_form/lib/data/repositories/remote/service_attributes.dart similarity index 78% rename from packages/digit_data_model/lib/data/repositories/remote/service_attributes.dart rename to packages/survey_form/lib/data/repositories/remote/service_attributes.dart index b3ec8a608..81d346d0c 100644 --- a/packages/digit_data_model/lib/data/repositories/remote/service_attributes.dart +++ b/packages/survey_form/lib/data/repositories/remote/service_attributes.dart @@ -5,10 +5,10 @@ import '../../../models/entities/service_attributes.dart'; class ServiceAttributesRemoteRepository extends RemoteRepository { ServiceAttributesRemoteRepository( - super.dio, { - required super.actionMap, - super.entityName = 'ServiceAttributes', - }); + super.dio, { + required super.actionMap, + super.entityName = 'ServiceAttributes', + }); @override DataModelType get type => DataModelType.serviceAttributes; diff --git a/packages/digit_data_model/lib/data/repositories/remote/service_definition.dart b/packages/survey_form/lib/data/repositories/remote/service_definition.dart similarity index 78% rename from packages/digit_data_model/lib/data/repositories/remote/service_definition.dart rename to packages/survey_form/lib/data/repositories/remote/service_definition.dart index 24d69707b..869bcea0d 100644 --- a/packages/digit_data_model/lib/data/repositories/remote/service_definition.dart +++ b/packages/survey_form/lib/data/repositories/remote/service_definition.dart @@ -5,10 +5,10 @@ import '../../../models/entities/service_definition.dart'; class ServiceDefinitionRemoteRepository extends RemoteRepository { ServiceDefinitionRemoteRepository( - super.dio, { - required super.actionMap, - super.entityName = 'ServiceDefinition', - }); + super.dio, { + required super.actionMap, + super.entityName = 'ServiceDefinition', + }); @override DataModelType get type => DataModelType.serviceDefinition; diff --git a/packages/digit_data_model/lib/models/entities/service.dart b/packages/survey_form/lib/models/entities/service.dart similarity index 94% rename from packages/digit_data_model/lib/models/entities/service.dart rename to packages/survey_form/lib/models/entities/service.dart index 87eccc440..4378198c5 100644 --- a/packages/digit_data_model/lib/models/entities/service.dart +++ b/packages/survey_form/lib/models/entities/service.dart @@ -3,8 +3,7 @@ import 'package:dart_mappable/dart_mappable.dart'; import 'package:drift/drift.dart'; import 'package:digit_data_model/data_model.dart'; - -import '../../data/local_store/sql_store/sql_store.dart'; +import '../entities/service_attributes.dart'; part 'service.mapper.dart'; @@ -16,7 +15,7 @@ class ServiceSearchModel extends EntitySearchModel with ServiceSearchModelMappab final String? accountId; final String? createdAt; final String? tenantId; - + ServiceSearchModel({ this.id, this.clientId, @@ -71,10 +70,13 @@ class ServiceModel extends EntityModel with ServiceModelMappable { this.tenantId, this.rowVersion, this.attributes, - super.auditDetails,super.clientAuditDetails, + super.auditDetails, + super.clientAuditDetails, super.isDeleted = false, }): super(); + + //Helper object to represents the data you want to insert or update in a table ServiceCompanion get companion { return ServiceCompanion( auditCreatedBy: Value(auditDetails?.createdBy), @@ -97,7 +99,7 @@ class ServiceModel extends EntityModel with ServiceModelMappable { nonRecoverableError: Value(nonRecoverableError), tenantId: Value(tenantId), rowVersion: Value(rowVersion), - ); + ); } } diff --git a/packages/digit_data_model/lib/models/entities/service.mapper.dart b/packages/survey_form/lib/models/entities/service.mapper.dart similarity index 100% rename from packages/digit_data_model/lib/models/entities/service.mapper.dart rename to packages/survey_form/lib/models/entities/service.mapper.dart diff --git a/packages/digit_data_model/lib/models/entities/service_attributes.dart b/packages/survey_form/lib/models/entities/service_attributes.dart similarity index 95% rename from packages/digit_data_model/lib/models/entities/service_attributes.dart rename to packages/survey_form/lib/models/entities/service_attributes.dart index 4cec2d732..13775fdb1 100644 --- a/packages/digit_data_model/lib/models/entities/service_attributes.dart +++ b/packages/survey_form/lib/models/entities/service_attributes.dart @@ -3,16 +3,13 @@ import 'package:dart_mappable/dart_mappable.dart'; import 'package:drift/drift.dart'; import 'package:digit_data_model/data_model.dart'; - -import '../../data/local_store/sql_store/sql_store.dart'; - part 'service_attributes.mapper.dart'; @MappableClass(ignoreNull: true, discriminatorValue: MappableClass.useAsDefault) class ServiceAttributesSearchModel extends EntitySearchModel with ServiceAttributesSearchModelMappable { final List? clientReferenceId; final String? tenantId; - + ServiceAttributesSearchModel({ this.clientReferenceId, this.tenantId, @@ -34,10 +31,10 @@ class ServiceAttributesModel extends EntityModel with ServiceAttributesModelMapp static const schemaName = 'ServiceAttributes'; final String? attributeCode; - final dynamic? value; + final dynamic value; final String? dataType; final String? referenceId; - final dynamic? additionalDetails; + final dynamic additionalDetails; final bool? nonRecoverableError; final String clientReferenceId; final String? tenantId; @@ -59,6 +56,7 @@ class ServiceAttributesModel extends EntityModel with ServiceAttributesModelMapp super.isDeleted = false, }): super(); + //Helper object to represents the data you want to insert or update in a table ServiceAttributesCompanion get companion { return ServiceAttributesCompanion( auditCreatedBy: Value(auditDetails?.createdBy), @@ -80,7 +78,7 @@ class ServiceAttributesModel extends EntityModel with ServiceAttributesModelMapp clientReferenceId: Value(clientReferenceId), tenantId: Value(tenantId), rowVersion: Value(rowVersion), - ); + ); } } diff --git a/packages/digit_data_model/lib/models/entities/service_attributes.mapper.dart b/packages/survey_form/lib/models/entities/service_attributes.mapper.dart similarity index 100% rename from packages/digit_data_model/lib/models/entities/service_attributes.mapper.dart rename to packages/survey_form/lib/models/entities/service_attributes.mapper.dart diff --git a/packages/digit_data_model/lib/models/entities/service_definition.dart b/packages/survey_form/lib/models/entities/service_definition.dart similarity index 97% rename from packages/digit_data_model/lib/models/entities/service_definition.dart rename to packages/survey_form/lib/models/entities/service_definition.dart index 238c4304d..0d66ce150 100644 --- a/packages/digit_data_model/lib/models/entities/service_definition.dart +++ b/packages/survey_form/lib/models/entities/service_definition.dart @@ -4,9 +4,6 @@ import 'package:drift/drift.dart'; import 'package:digit_data_model/data_model.dart'; -import '../../data/local_store/sql_store/sql_store.dart'; -import 'attributes.dart'; - part 'service_definition.mapper.dart'; @MappableClass(ignoreNull: true, discriminatorValue: MappableClass.useAsDefault) @@ -64,6 +61,7 @@ class ServiceDefinitionModel extends EntityModel super.isDeleted = false, }) : super(); + //Helper object to represents the data you want to insert or update in a table ServiceDefinitionCompanion get companion { return ServiceDefinitionCompanion( auditCreatedBy: Value(auditDetails?.createdBy), diff --git a/packages/digit_data_model/lib/models/entities/service_definition.mapper.dart b/packages/survey_form/lib/models/entities/service_definition.mapper.dart similarity index 100% rename from packages/digit_data_model/lib/models/entities/service_definition.mapper.dart rename to packages/survey_form/lib/models/entities/service_definition.mapper.dart diff --git a/packages/survey_form/lib/pages/acknowledgement.dart b/packages/survey_form/lib/pages/acknowledgement.dart new file mode 100644 index 000000000..cd4ec0f5f --- /dev/null +++ b/packages/survey_form/lib/pages/acknowledgement.dart @@ -0,0 +1,76 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:digit_components/digit_components.dart'; +import 'package:flutter/material.dart'; + +import '../utils/i18_key_constants.dart' as i18; +import '../widgets/localized.dart'; + +@RoutePage() +class SurveyFormAcknowledgementPage extends LocalizedStatefulWidget { + final bool isDataRecordSuccess; + final String? label; + final String? description; + final Map? descriptionTableData; + const SurveyFormAcknowledgementPage({ + super.key, + super.appLocalizations, + this.isDataRecordSuccess = false, + this.label, + this.description, + this.descriptionTableData, + }); + + @override + State createState() => AcknowledgementPageState(); +} + +class AcknowledgementPageState extends LocalizedState { + @override + Widget build(BuildContext context) { + return Scaffold( + body: DigitAcknowledgement.success( + description: widget.description ?? + localizations.translate( + i18.acknowledgementSuccess.acknowledgementDescriptionText, + ), + descriptionWidget: widget.isDataRecordSuccess + ? DigitTableCard( + element: widget.descriptionTableData ?? {}, + ) + : null, + label: widget.label ?? + localizations.translate( + i18.acknowledgementSuccess.acknowledgementLabelText, + ), + action: () { + context.router.popUntilRoot(); + }, + enableBackToSearch: widget.isDataRecordSuccess ? false : true, + actionLabel: + localizations.translate(i18.acknowledgementSuccess.actionLabelText), + ), + bottomNavigationBar: Offstage( + offstage: !widget.isDataRecordSuccess, + // Show the bottom navigation bar if `isDataRecordSuccess` is true + child: SizedBox( + height: 150, + child: DigitCard( + margin: const EdgeInsets.fromLTRB(0, kPadding, 0, 0), + padding: const EdgeInsets.fromLTRB(kPadding, 0, kPadding, 0), + child: Column( + children: [ + DigitElevatedButton( + child: Text(localizations + .translate(i18.acknowledgementSuccess.goToHome)), + onPressed: () { + context.router.maybePop(); + }, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/packages/survey_form/lib/pages/survey_form.dart b/packages/survey_form/lib/pages/survey_form.dart new file mode 100644 index 000000000..fc8db035c --- /dev/null +++ b/packages/survey_form/lib/pages/survey_form.dart @@ -0,0 +1,143 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:digit_components/digit_components.dart'; +import 'package:digit_components/widgets/digit_project_cell.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:survey_form/survey_form.dart'; + +import '../router/survey_form_router.gm.dart'; +import '../utils/constants.dart'; +import '../widgets/action_card.dart'; +import '../widgets/back_navigation_help_header.dart'; +import '../widgets/localized.dart'; +import '../utils/i18_key_constants.dart' as i18; +import '../widgets/no_result_card.dart'; + +@RoutePage() +class SurveyformPage extends LocalizedStatefulWidget { + const SurveyformPage({ + Key? key, + super.appLocalizations, + }) : super(key: key); + + @override + State createState() => SurveyFormPageState(); +} + +class SurveyFormPageState extends State { + @override + Widget build(BuildContext context) { + final localizations = SurveyFormLocalization.of(context); + + return Scaffold( + body: ScrollableContent( + header: const Column(children: [ + BackNavigationHelpHeaderWidget(), + ]), + children: [ + BlocBuilder( + builder: (context, state) { + return state.map( + empty: (value) => Text(localizations.translate( + i18.surveyForm.noSurveyFormFound, + ),), + isloading: (value) => const Center( + child: CircularProgressIndicator(), + ), + serviceDefinitionFetch: + (ServiceDefinitionServiceFetchedState value) { + final values = value.serviceDefinitionList.where( + (item) => + !SurveyFormSingleton().roles + .indexOf( + item.code!.split('.').lastOrNull!, + ) + .isNegative && + !item.code!.contains(Constants + .healthFacilitySurveyFormPrefix) && + (item.code ?? '').contains( + SurveyFormSingleton().projectName)); + + if (values.isEmpty) { + return Column( + children: [ + NoResultCard( + align: Alignment.center, + label: localizations.translate( + i18.common.noResultsFound, + ), + ), + ], + ); + } + return Column( + children: values + .map((e) => DigitProjectCell( + projectText: localizations + .translate('${e.code}'), + onTap: () { + context + .read() + .add( + ServiceDefinitionSelectionEvent( + serviceDefinition: e, + ), + ); + DigitActionDialog.show( + context, + widget: ActionCard(items: [ + ActionCardModel( + icon: Icons.edit_calendar, + label: localizations.translate(i18 + .surveyForm + .surveyFormCreateActionLabel), + action: () { + context.router.push( + SurveyFormBoundaryViewRoute(), + ); + Navigator.of( + context, + rootNavigator: true, + ).pop(); + }, + ), + ActionCardModel( + icon: Icons.visibility, + label: localizations.translate(i18 + .surveyForm + .surveyFormViewActionLabel), + action: () { + context + .read() + .add( + ServiceSearchEvent( + serviceSearchModel: + ServiceSearchModel( + id: e.id, + ), + ), + ); + context.router.push( + SurveyFormPreviewRoute(), + ); + Navigator.of( + context, + rootNavigator: true, + ).pop(); + }, + ), + ]), + ); + }, + )) + .toList(), + ); + }, + ); + }, + ), + ], + ), + ); + } +} diff --git a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_boundary_view.dart b/packages/survey_form/lib/pages/survey_form_boundary_view.dart similarity index 62% rename from apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_boundary_view.dart rename to packages/survey_form/lib/pages/survey_form_boundary_view.dart index 40f2f05f4..937cdaede 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_boundary_view.dart +++ b/packages/survey_form/lib/pages/survey_form_boundary_view.dart @@ -1,29 +1,34 @@ -import 'package:digit_components/digit_components.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:survey_form/survey_form.dart'; +import 'package:digit_components/widgets/digit_card.dart'; +import 'package:digit_components/widgets/digit_elevated_button.dart'; +import 'package:digit_components/widgets/digit_text_field.dart'; +import 'package:digit_components/widgets/scrollable_content.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import '../../router/app_router.dart'; -import '../../utils/i18_key_constants.dart' as i18; -import '../../utils/utils.dart'; -import '../../widgets/header/back_navigation_help_header.dart'; -import '../../widgets/localized.dart'; +import '../router/survey_form_router.gm.dart'; +import '../widgets/back_navigation_help_header.dart'; +import '../widgets/localized.dart'; +import '../utils/i18_key_constants.dart' as i18; @RoutePage() -class ChecklistBoundaryViewPage extends LocalizedStatefulWidget { - const ChecklistBoundaryViewPage({ +class SurveyFormBoundaryViewPage extends LocalizedStatefulWidget { + const SurveyFormBoundaryViewPage({ Key? key, super.appLocalizations, }) : super(key: key); @override - State createState() => - _ChecklistBoundaryViewPageState(); + State createState() => + SurveyFormBoundaryViewPageState(); } -class _ChecklistBoundaryViewPageState - extends LocalizedState { +class SurveyFormBoundaryViewPageState + extends State { @override Widget build(BuildContext context) { + final localizations = SurveyFormLocalization.of(context); final theme = Theme.of(context); return Scaffold( @@ -33,7 +38,7 @@ class _ChecklistBoundaryViewPageState ]), footer: DigitCard( child: DigitElevatedButton( - onPressed: () => context.router.push(ChecklistViewRoute()), + onPressed: () => context.router.push(SurveyFormViewRoute()), child: Text(localizations.translate( i18.common.coreCommonContinue, )), @@ -47,14 +52,14 @@ class _ChecklistBoundaryViewPageState children: [ Text( localizations.translate( - i18.checklist.checklistDetailLabel, + i18.surveyForm.surveyFormDetailLabel, ), style: theme.textTheme.displayMedium, ), DigitTextField( readOnly: true, label: localizations.translate( - i18.checklist.checklistdate, + i18.surveyForm.surveyFormdate, ), suffixIcon: const Padding( padding: EdgeInsets.all(8), @@ -73,7 +78,7 @@ class _ChecklistBoundaryViewPageState ), controller: TextEditingController( text: localizations - .translate(context.boundary.code.toString()), + .translate(SurveyFormSingleton().boundary!.code.toString()), ), ), ], diff --git a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_preview.dart b/packages/survey_form/lib/pages/survey_form_preview.dart similarity index 93% rename from apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_preview.dart rename to packages/survey_form/lib/pages/survey_form_preview.dart index 105936fc5..aa4ffaa74 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_preview.dart +++ b/packages/survey_form/lib/pages/survey_form_preview.dart @@ -1,29 +1,33 @@ -import 'package:digit_components/digit_components.dart'; +import 'package:auto_route/annotations.dart'; +import 'package:digit_components/theme/digit_theme.dart'; import 'package:digit_components/widgets/atoms/digit_divider.dart'; -import 'package:digit_data_model/data_model.dart'; +import 'package:digit_components/widgets/digit_card.dart'; +import 'package:digit_components/widgets/digit_elevated_button.dart'; +import 'package:digit_components/widgets/digit_outline_button.dart'; +import 'package:digit_components/widgets/scrollable_content.dart'; import 'package:flutter/material.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../widgets/no_result_card/no_result_card.dart'; import 'package:intl/intl.dart'; -import '../../router/app_router.dart'; -import '../../utils/constants.dart'; -import '../../utils/i18_key_constants.dart' as i18; -import '../../widgets/header/back_navigation_help_header.dart'; -import '../../widgets/localized.dart'; +import '../widgets/back_navigation_help_header.dart'; +import '../widgets/localized.dart'; +import '../utils/i18_key_constants.dart' as i18; +import '../utils/constants.dart'; +import '../widgets/no_result_card.dart'; @RoutePage() -class ChecklistPreviewPage extends LocalizedStatefulWidget { - const ChecklistPreviewPage({ +class SurveyFormPreviewPage extends LocalizedStatefulWidget { + const SurveyFormPreviewPage({ Key? key, super.appLocalizations, }) : super(key: key); @override - State createState() => _ChecklistPreviewPageState(); + State createState() => SurveyFormPreviewPageState(); } -class _ChecklistPreviewPageState extends LocalizedState { +class SurveyFormPreviewPageState extends LocalizedState { @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -76,11 +80,9 @@ class _ChecklistPreviewPageState extends LocalizedState { Align( alignment: Alignment.centerLeft, child: Text( - DateFormat(Constants - .checklistPreviewDateFormat) + DateFormat(Constants.SurveyFormPreviewDateFormat) .format( - DateFormat(Constants - .defaultDateFormat) + DateFormat(Constants.defaultDateFormat) .parse( e.createdAt.toString(), ), @@ -141,7 +143,7 @@ class _ChecklistPreviewPageState extends LocalizedState { child: NoResultCard( align: Alignment.center, label: localizations.translate( - i18.checklist.noChecklistFound), + i18.surveyForm.noSurveyFormFound), ), ), ), @@ -176,7 +178,7 @@ class _ChecklistPreviewPageState extends LocalizedState { ...(selectedService.attributes ?? []) .where((a) => a.value != - i18.checklist + i18.surveyForm .notSelectedKey && a.value != '') .map( diff --git a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_view.dart b/packages/survey_form/lib/pages/survey_form_view.dart similarity index 89% rename from apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_view.dart rename to packages/survey_form/lib/pages/survey_form_view.dart index 8556c1163..d280d4993 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_view.dart +++ b/packages/survey_form/lib/pages/survey_form_view.dart @@ -1,37 +1,47 @@ import 'dart:math'; -import 'package:digit_components/digit_components.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:survey_form/survey_form.dart'; +import 'package:survey_form/utils/extensions/context_utility.dart'; +import 'package:digit_components/blocs/location/location.dart'; +import 'package:digit_components/theme/colors.dart'; +import 'package:digit_components/theme/digit_theme.dart'; import 'package:digit_components/utils/date_utils.dart'; import 'package:digit_components/widgets/atoms/selection_card.dart'; +import 'package:digit_components/widgets/digit_card.dart'; +import 'package:digit_components/widgets/digit_checkbox_tile.dart'; +import 'package:digit_components/widgets/digit_dialog.dart'; +import 'package:digit_components/widgets/digit_elevated_button.dart'; +import 'package:digit_components/widgets/digit_text_field.dart'; +import 'package:digit_components/widgets/scrollable_content.dart'; import 'package:digit_data_model/data_model.dart'; +import 'package:group_radio_button/group_radio_button.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:group_radio_button/group_radio_button.dart'; -import '../../models/data_model.dart'; -import '../../models/entities/roles_type.dart'; -import '../../router/app_router.dart'; -import '../../utils/i18_key_constants.dart' as i18; -import '../../utils/utils.dart'; -import '../../widgets/header/back_navigation_help_header.dart'; -import '../../widgets/localized.dart'; +import '../router/survey_form_router.gm.dart'; +import '../utils/constants.dart'; +import '../widgets/back_navigation_help_header.dart'; +import '../widgets/localized.dart'; +import '../utils/i18_key_constants.dart' as i18; @RoutePage() -class ChecklistViewPage extends LocalizedStatefulWidget { +class SurveyFormViewPage extends LocalizedStatefulWidget { final String? referralClientRefId; - const ChecklistViewPage({ + const SurveyFormViewPage({ Key? key, this.referralClientRefId, super.appLocalizations, }) : super(key: key); @override - State createState() => _ChecklistViewPageState(); + State createState() => SurveyFormViewPageState(); } -class _ChecklistViewPageState extends LocalizedState { +class SurveyFormViewPageState extends LocalizedState { String isStateChanged = ''; var submitTriggered = false; List controller = []; @@ -39,13 +49,13 @@ class _ChecklistViewPageState extends LocalizedState { List? initialAttributes; ServiceDefinitionModel? selectedServiceDefinition; bool isControllersInitialized = false; - List visibleChecklistIndexes = []; - GlobalKey checklistFormKey = GlobalKey(); + List visibleSurveyFormIndexes = []; + GlobalKey surveyFormFormKey = GlobalKey(); @override void initState() { context.read().add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: Random().nextInt(100).toString(), submitTriggered: true, ), @@ -57,10 +67,7 @@ class _ChecklistViewPageState extends LocalizedState { Widget build(BuildContext context) { final theme = Theme.of(context); - bool isHealthFacilityWorker = context.loggedInUserRoles - .where((role) => role.code == RolesType.healthFacilityWorker.toValue()) - .toList() - .isNotEmpty; + bool isHealthFacilityWorker = SurveyFormSingleton().isHealthFacilityWorker; return WillPopScope( onWillPop: isHealthFacilityWorker && widget.referralClientRefId != null @@ -87,7 +94,6 @@ class _ChecklistViewPageState extends LocalizedState { } }, ); - return state.maybeMap( orElse: () => Text(state.runtimeType.toString()), serviceDefinitionFetch: (value) { @@ -108,13 +114,13 @@ class _ChecklistViewPageState extends LocalizedState { submitTriggered = true; context.read().add( - const ServiceChecklistEvent( + const ServiceSurveyFormEvent( value: '', submitTriggered: true, ), ); final isValid = - checklistFormKey.currentState?.validate(); + surveyFormFormKey.currentState?.validate(); if (!isValid!) { return; } @@ -124,7 +130,7 @@ class _ChecklistViewPageState extends LocalizedState { if (itemsAttributes?[i].required == true && ((itemsAttributes?[i].dataType == 'SingleValueList' && - visibleChecklistIndexes + visibleSurveyFormIndexes .any((e) => e == i) && (controller[i].text == '')) || (itemsAttributes?[i].dataType != @@ -151,14 +157,14 @@ class _ChecklistViewPageState extends LocalizedState { context, options: DigitDialogOptions( titleText: localizations.translate( - i18.checklist.checklistDialogLabel, + i18.surveyForm.surveyFormDialogLabel, ), content: Text(localizations.translate( - i18.checklist.checklistDialogDescription, + i18.surveyForm.surveyFormDialogDescription, )), primaryAction: DigitDialogActions( label: localizations.translate( - i18.checklist.checklistDialogPrimaryAction, + i18.surveyForm.surveyFormDialogPrimaryAction, ), action: (ctx) { final referenceId = IdGen.i.identifier; @@ -167,7 +173,7 @@ class _ChecklistViewPageState extends LocalizedState { final attribute = initialAttributes; attributes.add(ServiceAttributesModel( auditDetails: AuditDetails( - createdBy: context.loggedInUserUuid, + createdBy: SurveyFormSingleton().loggedInUserUuid, createdTime: context.millisecondsSinceEpoch(), ), @@ -187,9 +193,9 @@ class _ChecklistViewPageState extends LocalizedState { .isNotEmpty ? controller[i].text.toString() : '' - : visibleChecklistIndexes.contains(i) + : visibleSurveyFormIndexes.contains(i) ? controller[i].text.toString() - : i18.checklist.notSelectedKey, + : i18.surveyForm.notSelectedKey, rowVersion: 1, tenantId: attribute?[i].tenantId, additionalDetails: isHealthFacilityWorker && @@ -237,7 +243,7 @@ class _ChecklistViewPageState extends LocalizedState { .toLocal() .millisecondsSinceEpoch, dateFormat: Constants - .checklistViewDateFormat, + .SurveyFormViewDateFormat, ), tenantId: value .selectedServiceDefinition! @@ -252,24 +258,24 @@ class _ChecklistViewPageState extends LocalizedState { .selectedServiceDefinition?.id, attributes: attributes, rowVersion: 1, - accountId: context.projectId, + accountId: SurveyFormSingleton().projectId, auditDetails: AuditDetails( - createdBy: context.loggedInUserUuid, + createdBy: SurveyFormSingleton().loggedInUserUuid, createdTime: DateTime.now() .millisecondsSinceEpoch, ), clientAuditDetails: ClientAuditDetails( - createdBy: context.loggedInUserUuid, + createdBy: SurveyFormSingleton().loggedInUserUuid, createdTime: context .millisecondsSinceEpoch(), lastModifiedBy: - context.loggedInUserUuid, + SurveyFormSingleton().loggedInUserUuid, lastModifiedTime: context .millisecondsSinceEpoch(), ), additionalDetails: - context.boundary.code, + SurveyFormSingleton().boundary?.code, ), ), ); @@ -282,7 +288,7 @@ class _ChecklistViewPageState extends LocalizedState { ), secondaryAction: DigitDialogActions( label: localizations.translate( - i18.checklist.checklistDialogSecondaryAction, + i18.surveyForm.surveyFormDialogSecondaryAction, ), action: (context) { Navigator.of( @@ -294,9 +300,8 @@ class _ChecklistViewPageState extends LocalizedState { ), ); if (shouldSubmit ?? false) { - router.navigate(ChecklistRoute()); - - router.push(AcknowledgementRoute()); + router.navigate(SurveyformRoute()); + router.push(SurveyFormAcknowledgementRoute()); } }, child: Text( @@ -304,9 +309,10 @@ class _ChecklistViewPageState extends LocalizedState { ), ), ), + children: [ Form( - key: checklistFormKey, //assigning key to form + key: surveyFormFormKey, //assigning key to form child: DigitCard( child: Column(children: [ Padding( @@ -315,7 +321,7 @@ class _ChecklistViewPageState extends LocalizedState { '${localizations.translate( value.selectedServiceDefinition!.code .toString(), - )} ${localizations.translate(i18.checklist.checklist)}', + )} ${localizations.translate(i18.surveyForm.surveyForm)}', style: theme.textTheme.displayMedium, textAlign: TextAlign.left, ), @@ -324,13 +330,12 @@ class _ChecklistViewPageState extends LocalizedState { e, ) { int index = (initialAttributes ?? []).indexOf(e); - return Column(children: [ if (e.dataType == 'String' && !(e.code ?? '').contains('.')) ...[ DigitTextField( onChange: (value) { - checklistFormKey.currentState?.validate(); + surveyFormFormKey.currentState?.validate(); }, isRequired: false, controller: controller[index], @@ -362,7 +367,7 @@ class _ChecklistViewPageState extends LocalizedState { !(e.code ?? '').contains('.')) ...[ DigitTextField( onChange: (value) { - checklistFormKey.currentState?.validate(); + surveyFormFormKey.currentState?.validate(); }, textStyle: theme.textTheme.headlineMedium, textInputType: TextInputType.number, @@ -424,7 +429,7 @@ class _ChecklistViewPageState extends LocalizedState { context .read() .add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: e.toString(), submitTriggered: submitTriggered, @@ -454,10 +459,11 @@ class _ChecklistViewPageState extends LocalizedState { ); }, ), - ] else if (e.dataType == 'SingleValueList') ...[ + ] + else if (e.dataType == 'SingleValueList') ...[ if (!(e.code ?? '').contains('.')) DigitCard( - child: _buildChecklist( + child: _buildSurveyForm( e, index, value.selectedServiceDefinition, @@ -505,7 +511,7 @@ class _ChecklistViewPageState extends LocalizedState { context .read() .add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: curValue.toString(), submitTriggered: submitTriggered, @@ -542,16 +548,14 @@ class _ChecklistViewPageState extends LocalizedState { ); } - Widget _buildChecklist( + Widget _buildSurveyForm( AttributesModel item, int index, ServiceDefinitionModel? selectedServiceDefinition, BuildContext context, ) { - bool isHealthFacilityWorker = context.loggedInUserRoles - .where((role) => role.code == RolesType.healthFacilityWorker.toValue()) - .toList() - .isNotEmpty; + bool isHealthFacilityWorker = SurveyFormSingleton().isHealthFacilityWorker; + final theme = Theme.of(context); /* Check the data type of the attribute*/ if (item.dataType == 'SingleValueList') { @@ -562,14 +566,14 @@ class _ChecklistViewPageState extends LocalizedState { List excludedIndexes = []; // Ensure the current index is added to visible indexes and not excluded - if (!visibleChecklistIndexes.contains(index) && + if (!visibleSurveyFormIndexes.contains(index) && !excludedIndexes.contains(index)) { - visibleChecklistIndexes.add(index); + visibleSurveyFormIndexes.add(index); } // Determine excluded indexes for (int i = 0; i < (initialAttributes ?? []).length; i++) { - if (!visibleChecklistIndexes.contains(i)) { + if (!visibleSurveyFormIndexes.contains(i)) { excludedIndexes.add(i); } } @@ -596,7 +600,7 @@ class _ChecklistViewPageState extends LocalizedState { groupValue: controller[index].text.trim(), onChanged: (value) { context.read().add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: Random().nextInt(100).toString(), submitTriggered: submitTriggered, ), @@ -608,7 +612,7 @@ class _ChecklistViewPageState extends LocalizedState { initialAttributes?.indexOf(matchingChildItem); if (childIndex != null) { // controller[childIndex].clear(); - visibleChecklistIndexes + visibleSurveyFormIndexes .removeWhere((v) => v == childIndex); } } @@ -640,7 +644,7 @@ class _ChecklistViewPageState extends LocalizedState { }, items: item.values != null ? item.values! - .where((e) => e != i18.checklist.notSelectedKey) + .where((e) => e != i18.surveyForm.notSelectedKey) .toList() : [], itemBuilder: (item) => RadioButtonBuilder( @@ -709,7 +713,7 @@ class _ChecklistViewPageState extends LocalizedState { ), if (childItems.isNotEmpty && controller[index].text.trim().isNotEmpty) ...[ - _buildNestedChecklists( + _buildNestedSurveyForm( item.code.toString(), index, controller[index].text.trim(), @@ -724,7 +728,7 @@ class _ChecklistViewPageState extends LocalizedState { child: DigitTextField( maxLength: 1000, onChange: (value) { - checklistFormKey.currentState?.validate(); + surveyFormFormKey.currentState?.validate(); }, isRequired: item.required ?? true, controller: controller[index], @@ -753,7 +757,7 @@ class _ChecklistViewPageState extends LocalizedState { } else if (item.dataType == 'Number') { return DigitTextField( onChange: (value) { - checklistFormKey.currentState?.validate(); + surveyFormFormKey.currentState?.validate(); }, textStyle: theme.textTheme.headlineMedium, textInputType: TextInputType.number, @@ -809,7 +813,7 @@ class _ChecklistViewPageState extends LocalizedState { value: controller[index].text.split('.').contains(e), onChanged: (value) { context.read().add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: e.toString(), submitTriggered: submitTriggered, ), @@ -867,10 +871,8 @@ class _ChecklistViewPageState extends LocalizedState { initialSelection: const [false], options: const [true, false], onSelectionChanged: (valuec) { - print(submitTriggered); - print(controller[index].text.split('.').contains(e)); context.read().add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: valuec.toString(), submitTriggered: submitTriggered, ), @@ -899,8 +901,8 @@ class _ChecklistViewPageState extends LocalizedState { } } - // Function to build nested checklists for child attributes - Widget _buildNestedChecklists( + // Function to build nested SurveyForm for child attributes + Widget _buildNestedSurveyForm( String parentCode, int parentIndex, String parentControllerValue, @@ -922,7 +924,7 @@ class _ChecklistViewPageState extends LocalizedState { color: countDots(matchingChildItem.code ?? '') % 4 == 2 ? const Color.fromRGBO(238, 238, 238, 1) : const DigitColors().white, - child: _buildChecklist( + child: _buildSurveyForm( matchingChildItem, initialAttributes?.indexOf(matchingChildItem) ?? parentIndex, // Pass parentIndex here as we're building at the same level @@ -937,15 +939,15 @@ class _ChecklistViewPageState extends LocalizedState { // Function to get the next questions (child attributes) based on a parent code List getNextQuestions( String parentCode, - List checklistItems, + List surveyFormItems, ) { final childCodePrefix = '$parentCode.'; - final nextCheckLists = checklistItems.where((item) { + final nextSurveyForm = surveyFormItems.where((item) { return item.code!.startsWith(childCodePrefix) && item.code?.split('.').length == parentCode.split('.').length + 2; }).toList(); - return nextCheckLists; + return nextSurveyForm; } int countDots(String inputString) { @@ -965,14 +967,14 @@ class _ChecklistViewPageState extends LocalizedState { builder: (context) => DigitDialog( options: DigitDialogOptions( titleText: localizations.translate( - i18.checklist.checklistBackDialogLabel, + i18.surveyForm.surveyFormBackDialogLabel, ), content: Text(localizations.translate( - i18.checklist.checklistBackDialogDescription, + i18.surveyForm.surveyFormBackDialogDescription, )), primaryAction: DigitDialogActions( label: localizations - .translate(i18.checklist.checklistBackDialogPrimaryAction), + .translate(i18.surveyForm.surveyFormBackDialogPrimaryAction), action: (ctx) { Navigator.of( context, @@ -982,7 +984,7 @@ class _ChecklistViewPageState extends LocalizedState { ), secondaryAction: DigitDialogActions( label: localizations - .translate(i18.checklist.checklistBackDialogSecondaryAction), + .translate(i18.surveyForm.surveyFormBackDialogSecondaryAction), action: (context) { Navigator.of( context, diff --git a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_wrapper.dart b/packages/survey_form/lib/pages/survey_form_wrapper.dart similarity index 67% rename from apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_wrapper.dart rename to packages/survey_form/lib/pages/survey_form_wrapper.dart index f3627037c..ff640108d 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/checklist/checklist_wrapper.dart +++ b/packages/survey_form/lib/pages/survey_form_wrapper.dart @@ -1,33 +1,24 @@ import 'package:auto_route/auto_route.dart'; +import 'package:survey_form/utils/extensions/context_utility.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:digit_data_model/data_model.dart'; - -import '../../utils/extensions/extensions.dart'; -import '../../widgets/boundary_selection_wrapper.dart'; +import 'package:survey_form/survey_form.dart'; @RoutePage() -class ChecklistWrapperPage extends StatelessWidget implements AutoRouteWrapper { +class SurveyFormWrapperPage extends StatelessWidget { final bool isEditing; - const ChecklistWrapperPage({ + const SurveyFormWrapperPage({ super.key, this.isEditing = false, }); @override Widget build(BuildContext context) { - return const BoundarySelectionWrapper( - child: AutoRouter(), - ); - } - - @override - Widget wrappedRoute(BuildContext context) { final serviceDefinition = context - .repository(); + .repository(context); - final service = context.repository(); + final service = context.repository(context); return MultiBlocProvider( providers: [ @@ -36,6 +27,7 @@ class ChecklistWrapperPage extends StatelessWidget implements AutoRouteWrapper { const ServiceDefinitionEmptyState(), serviceDefinitionDataRepository: serviceDefinition, )..add(const ServiceDefinitionFetchEvent()), + lazy: false, ), BlocProvider( create: (_) => ServiceBloc( @@ -44,7 +36,7 @@ class ChecklistWrapperPage extends StatelessWidget implements AutoRouteWrapper { ), ), ], - child: this, + child: const AutoRouter(), ); } } diff --git a/packages/survey_form/lib/router/survey_form_router.dart b/packages/survey_form/lib/router/survey_form_router.dart new file mode 100644 index 000000000..70186e87a --- /dev/null +++ b/packages/survey_form/lib/router/survey_form_router.dart @@ -0,0 +1,29 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:survey_form/router/survey_form_router.gm.dart'; + + +//Used auto_route package to navigate to different pages in survey_form package + +@AutoRouterConfig.module() +class SurveyFormRoute extends $SurveyFormRoute { + + RouteType get defaultRouteType => const RouteType.material(); + + List routes = [ + AutoRoute( + page: SurveyFormWrapperRoute.page, + path: 'surveyForm', + children: [ + AutoRoute( + page: SurveyformRoute.page, + path: '', + ), + ], + ), + AutoRoute( + page: SurveyFormBoundaryViewRoute.page, path: 'view-boundary'), + AutoRoute(page: SurveyFormViewRoute.page, path: 'view'), + AutoRoute(page: SurveyFormPreviewRoute.page, path: 'preview'), + AutoRoute(page: SurveyFormAcknowledgementRoute.page, path: 'surveyForm-acknowledgement'), + ]; +} \ No newline at end of file diff --git a/packages/survey_form/lib/router/survey_form_router.gm.dart b/packages/survey_form/lib/router/survey_form_router.gm.dart new file mode 100644 index 000000000..50e3f4d55 --- /dev/null +++ b/packages/survey_form/lib/router/survey_form_router.gm.dart @@ -0,0 +1,354 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ************************************************************************** +// AutoRouterGenerator +// ************************************************************************** + +// ignore_for_file: type=lint +// coverage:ignore-file + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:auto_route/auto_route.dart' as _i7; +import 'package:flutter/material.dart' as _i8; +import 'package:survey_form/blocs/app_localization.dart' as _i9; +import 'package:survey_form/pages/acknowledgement.dart' as _i1; +import 'package:survey_form/pages/survey_form.dart' as _i6; +import 'package:survey_form/pages/survey_form_boundary_view.dart' as _i2; +import 'package:survey_form/pages/survey_form_preview.dart' as _i3; +import 'package:survey_form/pages/survey_form_view.dart' as _i4; +import 'package:survey_form/pages/survey_form_wrapper.dart' as _i5; +import 'package:survey_form/survey_form.dart' as _i10; + +abstract class $SurveyFormRoute extends _i7.AutoRouterModule { + @override + final Map pagesMap = { + SurveyFormAcknowledgementRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const SurveyFormAcknowledgementRouteArgs()); + return _i7.AutoRoutePage( + routeData: routeData, + child: _i1.SurveyFormAcknowledgementPage( + key: args.key, + appLocalizations: args.appLocalizations, + isDataRecordSuccess: args.isDataRecordSuccess, + label: args.label, + description: args.description, + descriptionTableData: args.descriptionTableData, + ), + ); + }, + SurveyFormBoundaryViewRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const SurveyFormBoundaryViewRouteArgs()); + return _i7.AutoRoutePage( + routeData: routeData, + child: _i2.SurveyFormBoundaryViewPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + SurveyFormPreviewRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const SurveyFormPreviewRouteArgs()); + return _i7.AutoRoutePage( + routeData: routeData, + child: _i3.SurveyFormPreviewPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + SurveyFormViewRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const SurveyFormViewRouteArgs()); + return _i7.AutoRoutePage( + routeData: routeData, + child: _i4.SurveyFormViewPage( + key: args.key, + referralClientRefId: args.referralClientRefId, + appLocalizations: args.appLocalizations, + ), + ); + }, + SurveyFormWrapperRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const SurveyFormWrapperRouteArgs()); + return _i7.AutoRoutePage( + routeData: routeData, + child: _i5.SurveyFormWrapperPage( + key: args.key, + isEditing: args.isEditing, + ), + ); + }, + SurveyformRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const SurveyformRouteArgs()); + return _i7.AutoRoutePage( + routeData: routeData, + child: _i6.SurveyformPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + }; +} + +/// generated route for +/// [_i1.SurveyFormAcknowledgementPage] +class SurveyFormAcknowledgementRoute + extends _i7.PageRouteInfo { + SurveyFormAcknowledgementRoute({ + _i8.Key? key, + _i9.SurveyFormLocalization? appLocalizations, + bool isDataRecordSuccess = false, + String? label, + String? description, + Map? descriptionTableData, + List<_i7.PageRouteInfo>? children, + }) : super( + SurveyFormAcknowledgementRoute.name, + args: SurveyFormAcknowledgementRouteArgs( + key: key, + appLocalizations: appLocalizations, + isDataRecordSuccess: isDataRecordSuccess, + label: label, + description: description, + descriptionTableData: descriptionTableData, + ), + initialChildren: children, + ); + + static const String name = 'SurveyFormAcknowledgementRoute'; + + static const _i7.PageInfo page = + _i7.PageInfo(name); +} + +class SurveyFormAcknowledgementRouteArgs { + const SurveyFormAcknowledgementRouteArgs({ + this.key, + this.appLocalizations, + this.isDataRecordSuccess = false, + this.label, + this.description, + this.descriptionTableData, + }); + + final _i8.Key? key; + + final _i9.SurveyFormLocalization? appLocalizations; + + final bool isDataRecordSuccess; + + final String? label; + + final String? description; + + final Map? descriptionTableData; + + @override + String toString() { + return 'SurveyFormAcknowledgementRouteArgs{key: $key, appLocalizations: $appLocalizations, isDataRecordSuccess: $isDataRecordSuccess, label: $label, description: $description, descriptionTableData: $descriptionTableData}'; + } +} + +/// generated route for +/// [_i2.SurveyFormBoundaryViewPage] +class SurveyFormBoundaryViewRoute + extends _i7.PageRouteInfo { + SurveyFormBoundaryViewRoute({ + _i8.Key? key, + _i10.SurveyFormLocalization? appLocalizations, + List<_i7.PageRouteInfo>? children, + }) : super( + SurveyFormBoundaryViewRoute.name, + args: SurveyFormBoundaryViewRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'SurveyFormBoundaryViewRoute'; + + static const _i7.PageInfo page = + _i7.PageInfo(name); +} + +class SurveyFormBoundaryViewRouteArgs { + const SurveyFormBoundaryViewRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i8.Key? key; + + final _i10.SurveyFormLocalization? appLocalizations; + + @override + String toString() { + return 'SurveyFormBoundaryViewRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i3.SurveyFormPreviewPage] +class SurveyFormPreviewRoute + extends _i7.PageRouteInfo { + SurveyFormPreviewRoute({ + _i8.Key? key, + _i10.SurveyFormLocalization? appLocalizations, + List<_i7.PageRouteInfo>? children, + }) : super( + SurveyFormPreviewRoute.name, + args: SurveyFormPreviewRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'SurveyFormPreviewRoute'; + + static const _i7.PageInfo page = + _i7.PageInfo(name); +} + +class SurveyFormPreviewRouteArgs { + const SurveyFormPreviewRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i8.Key? key; + + final _i10.SurveyFormLocalization? appLocalizations; + + @override + String toString() { + return 'SurveyFormPreviewRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i4.SurveyFormViewPage] +class SurveyFormViewRoute extends _i7.PageRouteInfo { + SurveyFormViewRoute({ + _i8.Key? key, + String? referralClientRefId, + _i10.SurveyFormLocalization? appLocalizations, + List<_i7.PageRouteInfo>? children, + }) : super( + SurveyFormViewRoute.name, + args: SurveyFormViewRouteArgs( + key: key, + referralClientRefId: referralClientRefId, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'SurveyFormViewRoute'; + + static const _i7.PageInfo page = + _i7.PageInfo(name); +} + +class SurveyFormViewRouteArgs { + const SurveyFormViewRouteArgs({ + this.key, + this.referralClientRefId, + this.appLocalizations, + }); + + final _i8.Key? key; + + final String? referralClientRefId; + + final _i10.SurveyFormLocalization? appLocalizations; + + @override + String toString() { + return 'SurveyFormViewRouteArgs{key: $key, referralClientRefId: $referralClientRefId, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i5.SurveyFormWrapperPage] +class SurveyFormWrapperRoute + extends _i7.PageRouteInfo { + SurveyFormWrapperRoute({ + _i8.Key? key, + bool isEditing = false, + List<_i7.PageRouteInfo>? children, + }) : super( + SurveyFormWrapperRoute.name, + args: SurveyFormWrapperRouteArgs( + key: key, + isEditing: isEditing, + ), + initialChildren: children, + ); + + static const String name = 'SurveyFormWrapperRoute'; + + static const _i7.PageInfo page = + _i7.PageInfo(name); +} + +class SurveyFormWrapperRouteArgs { + const SurveyFormWrapperRouteArgs({ + this.key, + this.isEditing = false, + }); + + final _i8.Key? key; + + final bool isEditing; + + @override + String toString() { + return 'SurveyFormWrapperRouteArgs{key: $key, isEditing: $isEditing}'; + } +} + +/// generated route for +/// [_i6.SurveyformPage] +class SurveyformRoute extends _i7.PageRouteInfo { + SurveyformRoute({ + _i8.Key? key, + _i10.SurveyFormLocalization? appLocalizations, + List<_i7.PageRouteInfo>? children, + }) : super( + SurveyformRoute.name, + args: SurveyformRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'SurveyformRoute'; + + static const _i7.PageInfo page = + _i7.PageInfo(name); +} + +class SurveyformRouteArgs { + const SurveyformRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i8.Key? key; + + final _i10.SurveyFormLocalization? appLocalizations; + + @override + String toString() { + return 'SurveyformRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} diff --git a/packages/survey_form/lib/survey_form.dart b/packages/survey_form/lib/survey_form.dart new file mode 100644 index 000000000..e74936cdb --- /dev/null +++ b/packages/survey_form/lib/survey_form.dart @@ -0,0 +1,24 @@ +@MappableLib( + generateInitializerForScope: InitializerScope.package, +) +library survey_form; + +import 'package:dart_mappable/dart_mappable.dart'; + +//exporting all the files from survey_form package +export 'survey_form.init.dart'; +export 'models/entities/service.dart'; +export 'models/entities/service_attributes.dart'; +export 'models/entities/service_definition.dart'; +export 'data/repositories/oplog/oplog.dart'; +export 'data/repositories/local/service.dart'; +export 'data/repositories/local/service_definition.dart'; +export 'data/repositories/remote/service.dart'; +export 'data/repositories/remote/service_definition.dart'; +export 'data/repositories/remote/service_attributes.dart'; +export 'utils/utils.dart'; +export 'blocs/service.dart'; +export 'blocs/service_definition.dart'; +export 'blocs/app_localization.dart'; + + diff --git a/packages/survey_form/lib/survey_form.init.dart b/packages/survey_form/lib/survey_form.init.dart new file mode 100644 index 000000000..b9bd11a14 --- /dev/null +++ b/packages/survey_form/lib/survey_form.init.dart @@ -0,0 +1,20 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element + +import 'models/entities/service.dart' as p0; +import 'models/entities/service_attributes.dart' as p1; +import 'models/entities/service_definition.dart' as p2; + +void initializeMappers() { + p0.ServiceSearchModelMapper.ensureInitialized(); + p0.ServiceModelMapper.ensureInitialized(); + p0.ServiceAdditionalFieldsMapper.ensureInitialized(); + p1.ServiceAttributesSearchModelMapper.ensureInitialized(); + p1.ServiceAttributesModelMapper.ensureInitialized(); + p1.ServiceAttributesAdditionalFieldsMapper.ensureInitialized(); + p2.ServiceDefinitionSearchModelMapper.ensureInitialized(); + p2.ServiceDefinitionModelMapper.ensureInitialized(); + p2.ServiceDefinitionAdditionalFieldsMapper.ensureInitialized(); +} diff --git a/packages/survey_form/lib/utils/constants.dart b/packages/survey_form/lib/utils/constants.dart new file mode 100644 index 000000000..2b8733375 --- /dev/null +++ b/packages/survey_form/lib/utils/constants.dart @@ -0,0 +1,10 @@ +class Constants { + static const String SurveyFormPreviewDateFormat = 'dd MMMM yyyy'; + static const String defaultDateFormat = 'dd/MM/yyyy'; + static const String defaultDateTimeFormat = 'dd/MM/yyyy hh:mm a'; + static const String SurveyFormViewDateFormat = 'dd/MM/yyyy hh:mm a'; + static const String healthFacilitySurveyFormPrefix = 'HF_RF'; +} + +const String noResultSvg = 'assets/icons/svg/no_result.svg'; +const String mySurveyFormSvg = 'assets/icons/svg/mychecklist.svg'; \ No newline at end of file diff --git a/packages/survey_form/lib/utils/extensions/context_utility.dart b/packages/survey_form/lib/utils/extensions/context_utility.dart new file mode 100644 index 000000000..58d7fd4b0 --- /dev/null +++ b/packages/survey_form/lib/utils/extensions/context_utility.dart @@ -0,0 +1,25 @@ +import 'package:digit_data_model/data_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../utils.dart'; + +extension ContextUtilityExtensions on BuildContext { + int millisecondsSinceEpoch([DateTime? dateTime]) { + return (dateTime ?? DateTime.now()).millisecondsSinceEpoch; + } + + // Provides survey_form repository based on the persistence configuration + DataRepository + repository( + BuildContext context, + ) { + switch (SurveyFormSingleton().persistenceConfiguration) { + case PersistenceConfiguration.offlineFirst: + return context.read>(); + case PersistenceConfiguration.onlineOnly: + return context.read>(); + default: + return context.read>(); + } + } +} diff --git a/packages/survey_form/lib/utils/i18_key_constants.dart b/packages/survey_form/lib/utils/i18_key_constants.dart new file mode 100644 index 000000000..9ca7563f3 --- /dev/null +++ b/packages/survey_form/lib/utils/i18_key_constants.dart @@ -0,0 +1,245 @@ +library i18; + +const common = Common(); +const surveyForm = SurveyForm(); +const selectSurveyFormShowcase = SelectSurveyFormShowcase(); +const surveyFormDataShowcase = SurveyFormDataShowcase(); +const surveyFormListShowcase = SurveyFormListShowcase(); +const searchBeneficiary = SearchBeneficiary(); +const householdLocation = HouseholdLocation(); +const acknowledgementSuccess = AcknowledgementSuccess(); + +class Common { + const Common(); + + String get coreCommonContinue => 'CORE_COMMON_CONTINUE'; + + String get coreCommonAge => 'CORE_COMMON_AGE'; + + String get coreCommonName => 'CORE_COMMON_NAME'; + + String get coreCommonEmailId => 'CORE_COMMON_EMAIL_ID'; + + String get coreCommonGender => 'CORE_COMMON_GENDER'; + + String get coreCommonMobileNumber => 'CORE_COMMON_MOBILE_NUMBER'; + + String get coreCommonSubmit => 'CORE_COMMON_SUBMIT'; + + String get coreCommonSave => 'CORE_COMMON_SAVE'; + + String get coreCommonCancel => 'CORE_COMMON_CANCEL'; + + String get corecommonRequired => 'CORE_COMMON_REQUIRED'; + + String get coreCommonReasonRequired => 'CORE_COMMON_REASON_REQUIRED'; + + String get corecommonclose => 'CORE_COMMON_CLOSE'; + + String get coreCommonOk => 'CORE_COMMON_OK'; + + String get coreCommonNA => 'CORE_COMMON_NA'; + + String get coreCommonProfile => 'CORE_COMMON_PROFILE'; + + String get coreCommonLogout => 'CORE_COMMON_LOGOUT'; + + String get coreCommonBack => 'CORE_COMMON_BACK'; + + String get coreCommonHelp => 'CORE_COMMON_HELP'; + + String get coreCommonHome => 'CORE_COMMON_HOME'; + + String get coreCommonViewDownloadedData => 'CORE_COMMON_VIEW_DOWNLOADED_DATA'; + + String get coreCommonlanguage => 'CORE_COMMON_LANGUAGE'; + + String get coreCommonSyncProgress => 'CORE_COMMON_SYNC_PROGRESS'; + + String get coreCommonDataSynced => 'CORE_COMMON_DATA_SYNCED'; + + String get coreCommonDataSyncFailed => 'CORE_COMMON_DATA_SYNC_FAILED'; + + String get coreCommonDataSyncRetry => 'CORE_COMMON_DATA_SYNC_RETRY'; + + String get connectionLabel => 'CORE_COMMON_CONNECTION_LABEL'; + + String get connectionContent => 'CORE_COMMON_CONNECTION_CONTENT'; + + String get coreCommonSkip => 'CORE_COMMON_SKIP'; + + String get coreCommonNext => 'CORE_COMMON_NEXT'; + + String get coreCommonYes => 'CORE_COMMON_YES'; + + String get coreCommonNo => 'CORE_COMMON_NO'; + String get coreCommonGoback => 'CORE_COMMON_GO_BACK'; + + String get coreCommonRequiredItems => 'CORE_COMMON_REQUIRED_ITEMS'; + + String get min2CharsRequired => 'MIN_2_CHARS_REQUIRED'; + + String get maxCharsRequired => 'MAX_CHARS_ALLOWED'; + + String get maxValue => 'MAX_VALUE_ALLOWED'; + String get minValue => 'MIN_VALUE_ALLOWED'; + + String get noResultsFound => 'NO_RESULTS_FOUND'; + + String get coreCommonSyncInProgress => 'CORE_COMMON_SYNC_IN_PROGRESS'; + + String get facilitySearchHeaderLabel => 'FACILITY_SEARCH_HEADER_LABEL'; + String get projectFacilitySearchHeaderLabel => + 'PROJECT_FACILITY_SEARCH_HEADER_LABEL'; + + String get coreCommonDownload => 'CORE_COMMON_DOWNLOAD'; + + String get coreCommonDownloadFailed => 'CORE_COMMON_DOWNLOAD_FAILED'; + + String get noMatchFound => 'CORE_COMMON_NO_MATCH_FOUND'; + + String get scanBales => 'CORE_COMMON_SCAN_BALES'; + String get ageInMonths => 'AGE_IN_MONTHS_LABEL'; + + String get profileUpdateSuccess => 'PROFILE_UPDATE_SUCCESS'; +} + +class SelectSurveyFormShowcase { + const SelectSurveyFormShowcase(); + + String get selectSurveyForm { + return 'SELECT_CHECKLIST_SHOWCASE_SELECT_CHECKLIST'; + } +} + +class SurveyFormDataShowcase { + const SurveyFormDataShowcase(); + + String get date { + return 'CHECKLIST_DATA_SHOWCASE_DATE'; + } + + String get administrativeUnit { + return 'CHECKLIST_DATA_SHOWCASE_ADMINISTRATIVE_UNIT'; + } +} + +class SurveyFormListShowcase { + const SurveyFormListShowcase(); + + String get open { + return 'CHECKLIST_LIST_SHOWCASE_OPEN'; + } +} + +class SurveyForm { + const SurveyForm(); + + String get surveyForm => 'CHECKLIST'; + + String get surveyFormlabel => 'CHECKLIST_LABEL'; + + String get surveyFormCreateActionLabel => 'CHECKLIST_CREATE_ACTION_LABEL'; + + String get surveyFormViewActionLabel => 'CHECKLIST_VIEW_ACTION_LABEL'; + + String get surveyFormDetailLabel => 'CHECKLIST_DETAILS_LABEL'; + + String get surveyFormDialogLabel => 'CHECKLIST_DIALOG_LABEL'; + + String get surveyFormDialogDescription => 'CHECKLIST_DIALOG_DESCRITPTION'; + + String get surveyFormDialogPrimaryAction => 'CHECKLIST_DIALOG_PRIMARY_ACTION'; + + String get surveyFormDialogSecondaryAction => + 'CHECKLIST_DIALOG_SECONDARY_ACTION'; + + String get surveyFormdate => 'CHECKLIST_DATE'; + + String get surveyFormReasonRequiredError => 'CHECKLIST_REASON_REQUIRED_ERROR'; + + String get notSelectedKey => 'NOT_SELECTED'; + + String get surveyFormBackDialogLabel => 'CHECKLIST_BACK_DIALOG_LABEL'; + + String get surveyFormBackDialogDescription => + 'CHECKLIST_BACK_DIALOG_DESCRITPTION'; + + String get surveyFormBackDialogPrimaryAction => + 'CHECKLIST_BACK_DIALOG_PRIMARY_ACTION'; + + String get surveyFormBackDialogSecondaryAction => + 'CHECKLIST_BACK_DIALOG_SECONDARY_ACTION'; + + String get noSurveyFormFound => 'NO_CHECKLIST_FOUND'; +} + +class SearchBeneficiary { + const SearchBeneficiary(); + + String get statisticsLabelText => 'BENEFICIARY_STATISTICS_LABEL_TEXT'; + + String get searchIndividualLabelText => + 'BENEFICIARY_STATISTICS_SEARCH_INDIVIDUAL_LABEL'; + + String get noOfHouseholdsRegistered => 'NO_OF_HOUSEHOLDS_REGISTERED'; + + String get noOfResourcesDelivered => 'NO_OF_RESOURCES_DELIVERED'; + + String get beneficiarySearchHintText => 'BENEFICIARY_SEARCH_HINT_TEXT'; + + String get beneficiaryIndividualSearchHintText => + 'BENEFICIARY_INDIVIDUAL_SEARCH_HINT_TEXT'; + + String get beneficiaryInfoDescription => 'BENEFICIARY_INFO_DESCRIPTION'; + + String get beneficiaryInfoTitle => 'BENEFICIARY_INFO_TITLE'; + + String get beneficiaryAddActionLabel => 'BENEFICIARY_ADD_ACTION_LABEL'; + + String get iconLabel => 'ICON_LABEL'; + + String get yearsAbbr => 'YEARS_ABBR'; + + String get monthsAbbr => 'MONTHS_ABBR'; + + String get proximityLabel => 'PROXIMITY_LABEL'; +} + +class HouseholdLocation { + const HouseholdLocation(); + + String get householdLocationLabelText => 'HOUSEHOLD_LOCATION_LABEL_TEXT'; + + String get administrationAreaFormLabel => 'ADMINISTRATION_AREA_FORM_LABEL'; + + String get administrationAreaRequiredValidation => + 'HOUSEHOLD_LOCATION_ADMINISTRATION_AREA_REQUIRED_VALIDATION'; + + String get householdAddressLine1LabelText => + 'HOUSEHOLD_ADDRESS_LINE_1_FORM_LABEL'; + + String get landmarkFormLabel => 'LANDMARK_FORM_LABEL'; + + String get householdAddressLine2LabelText => + 'HOUSEHOLD_ADDRESS_LINE_2_FORM_LABEL'; + + String get postalCodeFormLabel => 'POSTAL_CODE_FORM_LABEL'; + + String get actionLabel => 'HOUSEHOLD_LOCATION_ACTION_LABEL'; +} + +class AcknowledgementSuccess { + const AcknowledgementSuccess(); + + String get actionLabelText => 'ACKNOWLEDGEMENT_SUCCESS_ACTION_LABEL_TEXT'; + + String get acknowledgementDescriptionText => + 'ACKNOWLEDGEMENT_SUCCESS_DESCRIPTION_TEXT'; + + String get acknowledgementLabelText => 'ACKNOWLEDGEMENT_SUCCESS_LABEL_TEXT'; + + String get goToHome => 'GO_TO_HOME_SCREEN'; + String get downloadmoredata => 'DOWNLOAD_MORE_DATA'; + String get dataDownloadedSuccessLabel => 'DATA_DOWNLOADED_SUCCESS_LABEL'; +} diff --git a/packages/survey_form/lib/utils/typedefs.dart b/packages/survey_form/lib/utils/typedefs.dart new file mode 100644 index 000000000..151f8f549 --- /dev/null +++ b/packages/survey_form/lib/utils/typedefs.dart @@ -0,0 +1,7 @@ +import 'package:digit_data_model/data/data_repository.dart'; +import 'package:survey_form/survey_form.dart'; + +typedef ServiceDataRepository += DataRepository; +typedef ServiceDefinitionDataRepository += DataRepository; \ No newline at end of file diff --git a/packages/survey_form/lib/utils/utils.dart b/packages/survey_form/lib/utils/utils.dart new file mode 100644 index 000000000..8f706e679 --- /dev/null +++ b/packages/survey_form/lib/utils/utils.dart @@ -0,0 +1,65 @@ +import 'package:digit_data_model/data_model.dart'; + +// Singleton class for managing survey_form operations +class SurveyFormSingleton { + static final SurveyFormSingleton _singleton = SurveyFormSingleton._internal(); + + factory SurveyFormSingleton() { + return _singleton; + } + + SurveyFormSingleton._internal(); + + String _projectId = ''; + String _projectName=''; + String _loggedInIndividualId = ''; + String _loggedInUserUuid = ''; + String _appVersion = ''; + String _tenantId = ''; + Object _roles=[]; + bool _isHealthFacilityWorker = false; + BoundaryModel? _boundaryModel; + PersistenceConfiguration _persistenceConfiguration = PersistenceConfiguration + .offlineFirst; // Default to offline first persistence configuration + + void setBoundary({required BoundaryModel boundary}) { + _boundaryModel = boundary; + } + // Method to set survey_form listeners and other information + void setInitialData( + {required String projectId, + required String projectName, + required String loggedInIndividualId, + required String loggedInUserUuid, + required String appVersion, + required bool isHealthFacilityWorker, + required Object roles}) { + + _projectId = projectId; + _projectName=projectName; + _loggedInIndividualId = loggedInIndividualId; + _loggedInUserUuid = loggedInUserUuid; + _appVersion = appVersion; + _roles=roles; + _isHealthFacilityWorker=isHealthFacilityWorker; + } + + get projectId => _projectId; + get projectName => _projectName; + get loggedInIndividualId => _loggedInIndividualId; + get loggedInUserUuid => _loggedInUserUuid; + get appVersion => _appVersion; + get tenantId => _tenantId; + get persistenceConfiguration => _persistenceConfiguration; + get roles => _roles; + get isHealthFacilityWorker => _isHealthFacilityWorker; + BoundaryModel? get boundary => _boundaryModel; + + void setTenantId(String tenantId) { + _tenantId = tenantId; + } + + void setPersistenceConfiguration(PersistenceConfiguration configuration) { + _persistenceConfiguration = configuration; + } +} diff --git a/packages/survey_form/lib/widgets/action_card.dart b/packages/survey_form/lib/widgets/action_card.dart new file mode 100644 index 000000000..c5468f7bf --- /dev/null +++ b/packages/survey_form/lib/widgets/action_card.dart @@ -0,0 +1,57 @@ +import 'package:digit_components/digit_components.dart'; +import 'package:flutter/material.dart'; + +class ActionCard extends StatelessWidget { + final List items; + + const ActionCard({super.key, required this.items}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Column( + mainAxisSize: MainAxisSize.min, + children: items + .map( + (e) => Padding( + padding: const EdgeInsets.all(kPadding / 2), + child: DigitOutlineIconButton( + buttonStyle: OutlinedButton.styleFrom( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.zero, + ), + backgroundColor: Colors.white, + side: BorderSide( + width: 1.0, + color: e.action != null + ? theme.colorScheme.secondary + : theme.colorScheme.outline, + ), + minimumSize: Size( + MediaQuery.of(context).size.width / 1.25, + 50, + ), + ), + icon: e.icon, + label: e.label, + onPressed: e.action, + ), + ), + ) + .toList(), + ); + } +} + +class ActionCardModel { + final IconData icon; + final String label; + final VoidCallback? action; + + const ActionCardModel({ + required this.icon, + required this.label, + required this.action, + }); +} diff --git a/packages/survey_form/lib/widgets/back_navigation_help_header.dart b/packages/survey_form/lib/widgets/back_navigation_help_header.dart new file mode 100644 index 000000000..063f47bd1 --- /dev/null +++ b/packages/survey_form/lib/widgets/back_navigation_help_header.dart @@ -0,0 +1,79 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +import '../../utils/i18_key_constants.dart' as i18; +import '../blocs/app_localization.dart'; + +class BackNavigationHelpHeaderWidget extends StatelessWidget { + final bool showHelp; + final bool showBackNavigation; + final bool showLogoutCTA; + final VoidCallback? helpClicked; + final VoidCallback? handleBack; + + const BackNavigationHelpHeaderWidget({ + super.key, + this.showHelp = false, //hiding help + this.showBackNavigation = true, + this.showLogoutCTA = false, + this.helpClicked, + this.handleBack, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Padding( + padding: const EdgeInsets.all(4.0), + child: Row( + children: [ + Expanded( + child: Row( + children: [ + if (showBackNavigation) + Flexible( + child: TextButton.icon( + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.onSurface, + padding: EdgeInsets.zero, + ), + onPressed: () { + context.router.maybePop(); + handleBack != null ? handleBack!() : null; + }, + icon: const Icon(Icons.arrow_left_sharp), + label: Text( + SurveyFormLocalization.of(context).translate( + i18.common.coreCommonBack, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ), + ], + ), + ), + SizedBox(width: showHelp ? 16 : 0), + if (showHelp) + TextButton( + style: TextButton.styleFrom(padding: EdgeInsets.zero), + onPressed: helpClicked, + child: Row( + children: [ + Text( + SurveyFormLocalization.of(context) + .translate(i18.common.coreCommonHelp), + overflow: TextOverflow.ellipsis, + ), + const Icon( + Icons.help_outline_outlined, + ), // Add the icon to the right + ], + ), + ), + ], + ), + ); + } +} diff --git a/packages/survey_form/lib/widgets/localized.dart b/packages/survey_form/lib/widgets/localized.dart new file mode 100644 index 000000000..206a64dc4 --- /dev/null +++ b/packages/survey_form/lib/widgets/localized.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +import '../blocs/app_localization.dart'; + + +abstract class LocalizedStatefulWidget extends StatefulWidget { + final SurveyFormLocalization? appLocalizations; + + const LocalizedStatefulWidget({ + super.key, + this.appLocalizations, + }); +} + +abstract class LocalizedState + extends State { + late SurveyFormLocalization _localizations; + + SurveyFormLocalization get localizations => _localizations; + + set localizations(SurveyFormLocalization localizations) { + if (mounted) { + setState(() { + _localizations = localizations; + }); + } + } + + @override + @mustCallSuper + void didChangeDependencies() { + _localizations = widget.appLocalizations ?? SurveyFormLocalization.of(context); + super.didChangeDependencies(); + } +} diff --git a/packages/survey_form/lib/widgets/no_result_card.dart b/packages/survey_form/lib/widgets/no_result_card.dart new file mode 100644 index 000000000..270f75fa0 --- /dev/null +++ b/packages/survey_form/lib/widgets/no_result_card.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../utils/constants.dart'; + +class NoResultCard extends StatelessWidget { + final AlignmentGeometry align; + final String? label; + const NoResultCard({ + super.key, + this.align = Alignment.centerLeft, + this.label, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Align( + alignment: align, + child: Padding( + padding: const EdgeInsets.only(top: 100, bottom: 10, right: 8), + child: Column( + children: [ + SvgPicture.asset( + noResultSvg, + width: 340, + height: 200, + ), + const SizedBox(height: 20), + Text( + label ?? '', + style: theme.textTheme.bodyMedium, + ), + ], + ), + ), + ); + } +} diff --git a/packages/survey_form/pubspec.yaml b/packages/survey_form/pubspec.yaml new file mode 100644 index 000000000..171e7b3b4 --- /dev/null +++ b/packages/survey_form/pubspec.yaml @@ -0,0 +1,79 @@ +name: survey_form +description: "This package enables supervisors to monitor certain activities and record observations according to defined set of questions." +version: 0.0.1-dev.1 +homepage: "https://github.com/egovernments/health-campaign-field-worker-app/tree/checklist-package/packages/survey_form" +repository: "https://github.com/egovernments/health-campaign-field-worker-app" + +environment: + sdk: '>=3.0.0 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + digit_components: ^1.0.0+2 + flutter_bloc: ^8.1.1 + freezed_annotation: ^2.1.0 + build_runner: ^2.2.1 + reactive_forms: ^14.1.0 + fluttertoast: ^8.1.2 + overlay_builder: ^1.1.0 + intl: ^0.18.0 + flutter_svg: ^2.0.8 + dart_mappable: ^4.2.0 + drift: ^2.0.0 + auto_route: ^7.8.4 + digit_data_model: ^1.0.4-dev.4 + collection: ^1.16.0 + location: ^5.0.0 + dio: ^5.1.2 + group_radio_button: ^1.3.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + json_serializable: ^6.4.0 + freezed: ^2.2.0 + bloc_test: ^9.1.0 + mocktail: ^1.0.2 + dart_mappable_builder: ^4.2.0 + drift_dev: ^2.14.1 + auto_route_generator: ^7.3.2 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/survey_form/test/constants/test_constants.dart b/packages/survey_form/test/constants/test_constants.dart new file mode 100644 index 000000000..9a3132cb8 --- /dev/null +++ b/packages/survey_form/test/constants/test_constants.dart @@ -0,0 +1,86 @@ +import 'package:digit_data_model/data_model.dart'; +import 'package:survey_form/models/entities/service.dart'; +import 'package:survey_form/models/entities/service_definition.dart'; +import 'package:survey_form/models/entities/service_attributes.dart'; + +class ServiceTestConstants { + static const testTenantId = 'mz'; + static const testClientId = '170c46f0-5b95-11ef-8647-5ba267817823'; + static const testAccountId = 'a8e257fb-fa45-4488-b76c-7c2d2b70452c'; + static const testServiceDefId = '10a5342f-fe6b-4369-9197-7c871185d67d'; + static const testDataType = 'SingleValueList'; + + static final mockServiceAttributesModel1 = ServiceAttributesModel( + clientReferenceId: '170c46f1-5b95-11ef-8647-5ba267817823', + referenceId: testClientId, + tenantId: testTenantId, + attributeCode: 'ATTR1', + value: 'YES', + dataType: testDataType, + ); + + static final mockServiceAttributesModel2 = ServiceAttributesModel( + clientReferenceId: '170c46f2-5b95-11ef-8647-5ba267817823', + referenceId: testClientId, + tenantId: testTenantId, + attributeCode: 'ATTR2', + value: 'NO', + dataType: testDataType, + additionalDetails: { + "value": "kmlkml" + }, + ); + + static final mockServiceModel = ServiceModel( + clientId: testClientId, + serviceDefId: testServiceDefId, + isActive: true, + accountId: testAccountId, + additionalDetails: 'ADMIN_MO_06_05_03_01_04_SHERRIKEN', + createdAt: DateTime.utc(2024, 8, 16).toString(), + tenantId: testTenantId, + attributes: [mockServiceAttributesModel1, mockServiceAttributesModel2], + ); + + + static final mockAttributesModel1 = AttributesModel( + tenantId: testTenantId, + code: "ATTR1", + dataType: testDataType, + values: null, + required: true, + isActive: 'true', + regex: null, + order: 1, + ); + + static final mockAttributesModel2 = AttributesModel( + tenantId: testTenantId, + code: "ATTR2", + dataType: testDataType, + values: null, + required: true, + isActive: 'true', + regex: null, + order: 1, + ); + + static final mockServiceDefinitionModel = ServiceDefinitionModel( + id: testServiceDefId, + tenantId: testTenantId, + code: 'HEALTH', + isActive: true, + attributes: [mockAttributesModel1, mockAttributesModel2], + ); + + static final mockServiceSearchModel = ServiceSearchModel( + clientId: testClientId, + tenantId: testTenantId, + ); + + static final mockServiceDefinitionSearchModel = ServiceDefinitionSearchModel( + id: testServiceDefId, + tenantId: testTenantId, + code: ['HEALTH'], + ); +} diff --git a/packages/survey_form/test/unit/localization_methods_test.dart b/packages/survey_form/test/unit/localization_methods_test.dart new file mode 100644 index 000000000..6a913daaa --- /dev/null +++ b/packages/survey_form/test/unit/localization_methods_test.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; // Import necessary packages for testing. +import 'package:flutter_test/flutter_test.dart'; +import 'package:survey_form/survey_form.dart'; // Import your package for testing. + +void main() { + // Test for SurveyFormLocalization translation. + test('SurveyFormLocalization translation test', () async { + // Define mock localized strings for testing. + final mockLocalizedStrings = [ + Localization(locale: 'en_MZ', code: 'CORE_COMMON_NAME', message: 'Name'), + Localization(locale: 'fr_FR', code: 'CORE_COMMON_NAME', message: 'Nom'), + ]; + + // Define mock languages for testing. + final mockLanguages = [ + SurveyFormLanguages() + ..label = 'English' + ..value = 'en_MZ', + SurveyFormLanguages() + ..label = 'French' + ..value = 'fr_FR', + ]; + + // Define the test locale. + const testLocale = Locale('en', 'MZ'); + + // Initialize SurveyFormLocalization with mock data. + final surveyFormLocalization = SurveyFormLocalization( + testLocale, + Future.value(mockLocalizedStrings), + mockLanguages, + ); + + await surveyFormLocalization.load(); // Load the localization data. + + // Test if the translate function is working well, given the mock strings and languages. + expect(surveyFormLocalization.translate('CORE_COMMON_NAME'), 'Name'); + }); +} + +// Define a class for localization data. +class Localization { + late String code; + late String message; + late String module; + late String locale; + + // Constructor for localization data. + Localization( + {required this.locale, required this.code, required this.message}); +} + +// Class representing supported languages for surveyForm localization +class SurveyFormLanguages { + late String label; + late String value; +} diff --git a/packages/survey_form/test/unit/service_bloc_test.dart b/packages/survey_form/test/unit/service_bloc_test.dart new file mode 100644 index 000000000..090dcd514 --- /dev/null +++ b/packages/survey_form/test/unit/service_bloc_test.dart @@ -0,0 +1,82 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; //used for mocking dependencies and repositories in bloc test +import 'package:survey_form/survey_form.dart'; +import 'package:survey_form/utils/typedefs.dart'; + +import '../constants/test_constants.dart'; + +class MockServiceDataRepository extends Mock implements ServiceDataRepository {} + +void main() { + group('ServiceBloc', () { + late ServiceBloc serviceBloc; + final serviceDataRepository = MockServiceDataRepository(); + + setUp(() { + serviceBloc = ServiceBloc( + const ServiceState.empty(), + serviceDataRepository: serviceDataRepository, + ); + }); + + setUpAll(() { + registerFallbackValue(ServiceModel(clientId: '')); + registerFallbackValue(ServiceSearchModel(clientId: '')); + }); + + test('Initial state is correct', () { + expect(serviceBloc.state, equals(const ServiceState.empty())); + }); + + // Test for the ServiceSearchEvent + blocTest( + 'emits ServiceSearchState when search event is added', + build: () { + when(() => serviceDataRepository.search(any())) + .thenAnswer((_) async => [ServiceTestConstants.mockServiceModel]); + return serviceBloc; + }, + act: (bloc) => bloc.add(ServiceEvent.search( + serviceSearchModel: ServiceTestConstants.mockServiceSearchModel, + )), + expect: () => [ + ServiceSearchState(serviceList: [ServiceTestConstants.mockServiceModel]), + ], + verify: (_) { + // Verify that the search method was called + verify(() => serviceDataRepository.search(any())).called(1); + }, + ); + + // Test for the ServiceCreateEvent + blocTest( + 'creates a ServiceModel when create event is added', + build: () { + when(() => serviceDataRepository.create(any())) + .thenAnswer((_) async => ServiceTestConstants.mockServiceModel); + return serviceBloc; + }, + act: (bloc) => bloc.add(ServiceEvent.create( + serviceModel: ServiceTestConstants.mockServiceModel, + )), + expect: () => [], + verify: (_) { + // Verify that the create method was called + verify(() => serviceDataRepository.create(any())).called(1); + }, + ); + + // Test for the ServiceResetEvent + blocTest( + 'emits a ServiceSearchState when reset event is added', + build: () => ServiceBloc( + ServiceState.serviceSearch(serviceList: [ServiceTestConstants.mockServiceModel]), + serviceDataRepository: serviceDataRepository), + act: (bloc) => bloc.add(ServiceEvent.resetSelected( + serviceList: [ServiceTestConstants.mockServiceModel], + )), + expect: () => [ServiceState.serviceSearch(serviceList: [ServiceTestConstants.mockServiceModel])], + ); + }); +} diff --git a/packages/survey_form/test/unit/service_definition_bloc_test.dart b/packages/survey_form/test/unit/service_definition_bloc_test.dart new file mode 100644 index 000000000..0be5485b7 --- /dev/null +++ b/packages/survey_form/test/unit/service_definition_bloc_test.dart @@ -0,0 +1,54 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; //used for mocking dependencies and repositories in bloc test +import 'package:survey_form/survey_form.dart'; +import 'package:survey_form/utils/typedefs.dart'; + +import '../constants/test_constants.dart'; + +class MockServiceDefinitionDataRepository extends Mock implements ServiceDefinitionDataRepository {} + +void main() { + group('ServiceDefinitionBloc', () { + late ServiceDefinitionBloc serviceDefinitionBloc; + final serviceDefinitionDataRepository = MockServiceDefinitionDataRepository(); + + setUp(() { + serviceDefinitionBloc = ServiceDefinitionBloc( + const ServiceDefinitionState.empty(), + serviceDefinitionDataRepository: serviceDefinitionDataRepository + ); + }); + + setUpAll(() { + registerFallbackValue(ServiceDefinitionModel(tenantId : '')); + registerFallbackValue(ServiceDefinitionSearchModel(tenantId: '')); + }); + + test('Initial state is correct', () { + expect(serviceDefinitionBloc.state, equals(const ServiceDefinitionState.empty())); + }); + + // Test for the ServiceDefinitionFetchEvent + blocTest( + 'emits ServiceDefinitionServiceFetchedState when ServiceDefinitionFetchEvent is added', + build: () { + // Mocking the search method to return a list of ServiceDefinitionModel + when(() => serviceDefinitionDataRepository.search(any())) + .thenAnswer((_) async => [ServiceTestConstants.mockServiceDefinitionModel]); + + return serviceDefinitionBloc; + }, + act: (bloc) => bloc.add(const ServiceDefinitionEvent.fetch()), + expect: () => [ + ServiceDefinitionState.serviceDefinitionFetch( + serviceDefinitionList: [ServiceTestConstants.mockServiceDefinitionModel], + ), // State should be the fetched service definitions + ], + verify: (_) { + // Verify that the search method was called + verify(() => serviceDefinitionDataRepository.search(any())).called(1); + }, + ); + }); +} diff --git a/pubspec.lock b/pubspec.lock index ca5589ec2..8ec919d96 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -357,10 +357,10 @@ packages: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" pool: dependency: transitive description: @@ -413,10 +413,10 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.3.0" quiver: dependency: transitive description: @@ -477,10 +477,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" term_glyph: dependency: transitive description: @@ -493,10 +493,10 @@ packages: dependency: transitive description: name: test_api - sha256: "2419f20b0c8677b2d67c8ac4d1ac7372d862dc6c460cdbb052b40155408cd794" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.7.2" timing: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index be90b4ee5..6c653d317 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,3 +9,5 @@ dev_dependencies: dependencies: dart_mappable: ^4.2.0 + + diff --git a/tools/complaints_package.dart b/tools/complaints_package.dart new file mode 100644 index 000000000..1d230323b --- /dev/null +++ b/tools/complaints_package.dart @@ -0,0 +1,889 @@ +// Import the required Dart I/O package +import 'dart:io'; + +String createCaseCondition(String key, String value) { + return 'case "$key":\n $value'; +} + +void insertCaseCondition(List lines, String caseCondition) { + final defaultIndex = lines.indexWhere((line) => line.contains('default:')); + if (defaultIndex != -1 && + !lines.any((line) => line.contains(caseCondition.split('\n')[0]))) { + lines.insert(defaultIndex, caseCondition); + } +} + +// Define the main function +void main() { + // Get the current directory path + var appDir = Directory.current.path; + + // Define the paths for the application root and the files to be modified + var appRoot = appDir + '/apps/health_campaign_field_worker_app/lib'; + var localizationDelegatesFilePath = + appRoot + '/utils/localization_delegates.dart'; + var networkManagerProviderWrapperFilePath = + appRoot + '/widgets/network_manager_provider_wrapper.dart'; + var constantsFilePath = appRoot + '/utils/constants.dart'; + var utilsFilePath = appRoot + '/utils/utils.dart'; + var routerFilePath = appRoot + '/router/app_router.dart'; + var entityMapperFilePath = + appRoot + '/data/local_store/no_sql/schema/entity_mapper.dart'; + var syncUpFilePath = appRoot + '/data/repositories/sync/sync_up.dart'; + var homeFilePath = appRoot + '/pages/home.dart'; + var extensionsFilePath = appRoot + '/utils/extensions/extensions.dart'; + var contextUtilityFilePath = + appRoot + '/utils/extensions/context_utility.dart'; + + // Set boundary in the context utility file + _setBoundaryInContextUtilityFile(extensionsFilePath, contextUtilityFilePath); + + // Add complaints to home file + _updateHome(homeFilePath); + + // Update the sync_up.dart file + _updateSyncUpFile(syncUpFilePath); + + // Add complaints routes and import to the router file + _addComplaintsRoutesAndImportToRouterFile(routerFilePath); + + // Add new case statements to the entity_mapper.dart file + _updateEntityMapperFile(entityMapperFilePath); + + _createLocalizationDelegatesFile(localizationDelegatesFilePath); + + _addRepoToNetworkManagerProviderWrapper( + networkManagerProviderWrapperFilePath: + networkManagerProviderWrapperFilePath); + + _addComplaintsConstantsToConstantsFile(constantsFilePath: constantsFilePath); + + _addComplaintsMapperToUtilsFile(utilsFilePath: utilsFilePath); + + _formatFiles([ + homeFilePath, + syncUpFilePath, + entityMapperFilePath, + routerFilePath, + constantsFilePath, + utilsFilePath, + networkManagerProviderWrapperFilePath, + localizationDelegatesFilePath, + extensionsFilePath, + contextUtilityFilePath + ]); +} + +void _formatFiles(List filePaths) { + for (var filePath in filePaths) { + Process.runSync('dart', ['format', filePath]); + print('Formatted $filePath'); + } +} + +void _updateHome(String homeFilePath) { + var importStatement = ''' + import 'package:complaints/complaints.dart'; + import 'package:complaints/router/complaints_router.gm.dart'; + '''; + + var homeItemsData = ''' + i18.home.fileComplaint: + homeShowcaseData.distributorFileComplaint.buildWith( + child: HomeItemCard( + icon: Icons.announcement, + label: i18.home.fileComplaint, + onPressed: () => + context.router.push(const ComplaintsInboxWrapperRoute()), + ), + ), +'''; + + var showCaseData = ''' + i18.home.fileComplaint: + homeShowcaseData.distributorFileComplaint.showcaseKey, +'''; + + var itemsLabel = ''' + i18.home.fileComplaint, +'''; + + // Define the data to be added + var singletonData = ''' + ComplaintsSingleton().setInitialData( + tenantId: envConfig.variables.tenantId, + loggedInUserUuid: context.loggedInUserUuid, + userMobileNumber: context.loggedInUser.mobileNumber, + loggedInUserName: context.loggedInUser.name, + complaintTypes: + appConfiguration.complaintTypes!.map((e) => e.code).toList(), + userName: context.loggedInUser.name ?? '', + ); +'''; + + var localRepoData = ''' + context.read>(), +'''; + + var remoteRepoData = ''' + context.read>(), +'''; + + // Check if the home.dart file exists + var homeFile = File(homeFilePath); + if (!homeFile.existsSync()) { + print('Error: Home file does not exist at path: $homeFilePath'); + return; + } + + // Read the home.dart file + var homeFileContent = homeFile.readAsStringSync(); + + // Check if the import statement already exists and add it if not + if (!homeFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + homeFileContent = importStatement + '\n' + homeFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Insert the data to be added + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add singleton of package Here', singletonData); + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add local repo of package Here', localRepoData); + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add repo repo of package Here', remoteRepoData); + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add home items of package Here', homeItemsData); + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add showcase keys of package Here', showCaseData); + homeFileContent = insertData(homeFileContent, + '// INFO: Need to add items label of package Here', itemsLabel); + + // Write the updated content back to the home.dart file + homeFile.writeAsStringSync(homeFileContent); +} + +String insertData(String fileContent, String marker, String data) { + var markerIndex = fileContent.indexOf(marker); + if (markerIndex != -1) { + var endOfMarker = markerIndex + marker.length; + if (!fileContent.substring(endOfMarker).contains(data.trim())) { + fileContent = fileContent.substring(0, endOfMarker) + + '\n' + + data + + fileContent.substring(endOfMarker); + print('Data was added after marker: $marker'); + } else { + print('Data already exists after marker: $marker'); + } + } else { + print('Error: Could not find the marker: $marker'); + } + return fileContent; +} + +//script working +void _updateSyncUpFile(String syncUpFilePath) { + // Define the import statement and the new case statements + var importStatement = "import 'package:complaints/complaints.dart';"; + var newCases = ''' + case DataModelType.complaints: + for (final entity in entities) { + if (remote is PgrServiceRemoteRepository && + entity is PgrServiceModel) { + final response = await remote.create(entity); + final responseData = response.data; + if (responseData is! Map) { + AppLogger.instance.error( + title: 'NetworkManager : PgrServiceRemoteRepository', + message: responseData, + stackTrace: StackTrace.current, + ); + continue; + } + + + + + PgrServiceCreateResponseModel + pgrServiceCreateResponseModel; + PgrComplaintResponseModel pgrComplaintModel; + try { + pgrServiceCreateResponseModel = + PgrServiceCreateResponseModelMapper.fromMap( + responseData, + ); + pgrComplaintModel = + pgrServiceCreateResponseModel.serviceWrappers.first; + } catch (e) { + rethrow; + } + + + + + final service = pgrComplaintModel.service; + final serviceRequestId = service.serviceRequestId; + + + + + if (serviceRequestId == null || + serviceRequestId.isEmpty) { + AppLogger.instance.error( + title: 'NetworkManager : PgrServiceRemoteRepository', + message: 'Service Request ID is null', + stackTrace: StackTrace.current, + ); + continue; + } + + + + + await local.markSyncedUp( + entry: sublist.firstWhere((element) => + element.clientReferenceId == + entity.clientReferenceId), + clientReferenceId: entity.clientReferenceId, + nonRecoverableError: entity.nonRecoverableError, + ); + + + + + await local.opLogManager.updateServerGeneratedIds( + model: UpdateServerGeneratedIdModel( + clientReferenceId: entity.clientReferenceId, + serverGeneratedId: serviceRequestId, + dataOperation: operationGroupedEntity.key, + rowVersion: entity.rowVersion, + ), + ); + + + + + await local.update( + entity.copyWith( + serviceRequestId: serviceRequestId, + id: service.id, + applicationStatus: service.applicationStatus, + accountId: service.accountId, + ), + createOpLog: false, + ); + } + } + break; +'''; + + // Check if the sync_up file exists + var syncUpFile = File(syncUpFilePath); + + if (!syncUpFile.existsSync()) { + print('Error: Sync Up file does not exist at path: $syncUpFilePath'); + return; + } + + // Read the sync_up file + var syncUpFileContent = syncUpFile.readAsStringSync(); + print(syncUpFileContent); + // Check if the import statement already exists and add it if not + if (!syncUpFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + syncUpFileContent = importStatement + '\n' + syncUpFileContent; + print('The import statement was added to sync_up.dart.'); + } else { + print('The import statement already exists in sync_up.dart.'); + } + + // Insert the new case statements + if (!syncUpFileContent.contains( + 'case DataModelType.complaints:'.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the new cases within the switch statement + var switchIndex = + syncUpFileContent.indexOf('switch (typeGroupedEntity.key) {'); + if (switchIndex != -1) { + var caseInsertionIndex = + syncUpFileContent.indexOf('default:', switchIndex); + if (caseInsertionIndex != -1) { + syncUpFileContent = syncUpFileContent.substring(0, caseInsertionIndex) + + newCases + + '\n' + + syncUpFileContent.substring(caseInsertionIndex); + print('The new cases were added to sync_up.dart.'); + + // Write the updated content back to the file + syncUpFile.writeAsStringSync(syncUpFileContent); + } else { + print( + 'Error: Could not find the default case in the switch statement in sync_up.dart.'); + return; + } + } else { + print('Error: Could not find the switch statement in sync_up.dart.'); + return; + } + } else { + print('The new cases already exist in sync_up.dart.'); + } +} + +void _updateEntityMapperFile(String entityMapperFilePath) { + // Define the import statement and new case statements + var importStatement = "import 'package:complaints/complaints.dart';"; + var newCases = ''' + case "complaints": + final entity = PgrServiceModelMapper.fromJson(entityString); + return entity; +'''; + + // Check if the entity_mapper file exists + var entityMapperFile = File(entityMapperFilePath); + + if (!entityMapperFile.existsSync()) { + print( + 'Error: Entity Mapper file does not exist at path: $entityMapperFilePath'); + return; + } + + // Read the entity_mapper file + var entityMapperFileContent = entityMapperFile.readAsStringSync(); + + // Check if the import statement already exists and add it if not + if (!entityMapperFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + entityMapperFileContent = importStatement + '\n' + entityMapperFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Check if the new cases already exist in the file + if (!entityMapperFileContent + .contains('case "complaints":'.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the new cases (before the default case) + var caseInsertionIndex = entityMapperFileContent.indexOf('default:'); + if (caseInsertionIndex != -1) { + entityMapperFileContent = + entityMapperFileContent.substring(0, caseInsertionIndex) + + newCases + + '\n' + + entityMapperFileContent.substring(caseInsertionIndex); + print('The new cases were added.'); + + // Write the updated content back to the file + entityMapperFile.writeAsStringSync(entityMapperFileContent); + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The new cases already exist.'); + } +} + +//script working +void _addComplaintsRoutesAndImportToRouterFile(String routerFilePath) { + // Define the complaints route lines + var complaintsRoutes = ''' + AutoRoute( + page: ComplaintsInboxWrapperRoute.page, + path: 'complaints-inbox', + children: [ + AutoRoute( + page: ComplaintsInboxRoute.page, + path: 'complaints-inbox-items', + initial: true, + ), + AutoRoute( + page: ComplaintsInboxFilterRoute.page, + path: 'complaints-inbox-filter', + ), + AutoRoute( + page: ComplaintsInboxSearchRoute.page, + path: 'complaints-inbox-search', + ), + AutoRoute( + page: ComplaintsInboxSortRoute.page, + path: 'complaints-inbox-sort', + ), + AutoRoute( + page: ComplaintsDetailsViewRoute.page, + path: 'complaints-inbox-view-details', + ), + ], + ), + + + + + /// Complaints registration + AutoRoute( + page: ComplaintsRegistrationWrapperRoute.page, + path: 'complaints-registration', + children: [ + AutoRoute( + page: ComplaintTypeRoute.page, + path: 'complaints-type', + initial: true, + ), + AutoRoute( + page: ComplaintsLocationRoute.page, + path: 'complaints-location', + ), + AutoRoute( + page: ComplaintsDetailsRoute.page, + path: 'complaints-details', + ), + ], + ), + + + + + /// Complaints Acknowledgemnet + AutoRoute( + page: ComplaintsAcknowledgementRoute.page, + path: 'complaints-acknowledgement', + ), +'''; + + // Define the import statement + var importStatement1 = + "import 'package:complaints/router/complaints_router.gm.dart';"; + // Define the import statement + var importStatement2 = + "import 'package:complaints/router/complaints_router.dart';"; + + // Check if the router file exists + var routerFile = File(routerFilePath); + + if (!routerFile.existsSync()) { + print('Error: Router file does not exist at path: $routerFilePath'); + return; + } + + // Read the router file + var routerFileContent = routerFile.readAsStringSync(); + + // Normalize the whitespace in the file content + var normalizedFileContent = routerFileContent.replaceAll(RegExp(r'\s'), ''); + + // Check if the import statement already exists + if (!normalizedFileContent + .contains(importStatement1.replaceAll(RegExp(r'\s'), ''))) { + // Add the import statement at the beginning of the file + routerFileContent = importStatement1 + '\n' + routerFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Check if the import statement already exists + if (!normalizedFileContent + .contains(importStatement2.replaceAll(RegExp(r'\s'), ''))) { + // Add the import statement at the beginning of the file + routerFileContent = importStatement2 + '\n' + routerFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Check if the complaintsRoute module already exists + if (!routerFileContent + .contains('ComplaintsRoute'.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the module + var moduleInsertionIndex = routerFileContent.indexOf('@AutoRouterConfig('); + if (moduleInsertionIndex != -1) { + var endOfModulesIndex = + routerFileContent.indexOf(']', moduleInsertionIndex); + if (endOfModulesIndex != -1) { + var modulesEndIndex = + routerFileContent.lastIndexOf(']', endOfModulesIndex); + routerFileContent = routerFileContent.substring(0, modulesEndIndex) + + ' ComplaintsRoute,' + + routerFileContent.substring(modulesEndIndex); + + print('The ComplaintsRoute module was added.'); + } else { + print('Error: Could not find the end of the modules list.'); + return; + } + } else { + print('Error: Could not find @AutoRouterConfig annotation.'); + return; + } + } else { + print('The ComplaintsRoute module already exists.'); + } + + // Check if the complaints routes already exist in the file + if (!normalizedFileContent + .contains(complaintsRoutes.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the routes + var insertionIndex = routerFileContent + .indexOf('// INFO : Need to add Router of package Here'); + if (insertionIndex != -1) { + routerFileContent = routerFileContent.substring(0, insertionIndex) + + '// INFO : Need to add Router of package Here\n' + + complaintsRoutes + + routerFileContent.substring(insertionIndex + + '// INFO : Need to add Router of package Here'.length); + + print('The complaint routes were added.'); + // Write the updated content back to the file + routerFile.writeAsStringSync(routerFileContent); + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The complaint routes already exist.'); + } +} + +//initialise mappers +void _addComplaintsMapperToUtilsFile({required String utilsFilePath}) { + // Define the complaints related lines + var complaintsImportStatement = [ + "import 'package:complaints/complaints.init.dart' as complaints_mappers;" + ]; + var complaintsInitializationStatement = + "Future(() => complaints_mappers.initializeMappers()),"; + + // Check if the utils.dart file exists + var utilsFile = File(utilsFilePath); + + // Read the utils.dart file + var utilsFileContent = utilsFile.readAsStringSync(); + + // Normalize the whitespace in the file content + var normalizedFileContent = utilsFileContent.replaceAll(RegExp(r'\s'), ''); + + var getSyncCountStatement = "case DataModelType.complaints:"; + + // Check if the import statement and delegate already exist in the file + // If not, add them to the file + if (!normalizedFileContent + .contains(complaintsImportStatement[0].replaceAll(RegExp(r'\s'), ''))) { + var libraryIndex = utilsFileContent.indexOf('library app_utils;'); + if (libraryIndex != -1) { + var endOfLibrary = libraryIndex + + utilsFileContent.substring(libraryIndex).indexOf(';') + + 1; + utilsFileContent = utilsFileContent.substring(0, endOfLibrary + 1) + + '\n' + + complaintsImportStatement[0] + + utilsFileContent.substring(endOfLibrary + 1); + print('The import statement was added.'); + } + } else { + print('The import statement already exists.'); + } + + if (!utilsFileContent.contains(complaintsInitializationStatement)) { + // Add the complaints related initialization statement to the file + var initializeAllMappersIndex = + utilsFileContent.indexOf('initializeAllMappers() async {'); + if (initializeAllMappersIndex == -1) { + print( + 'Error: Could not find a place to insert the complaint initialization statement.'); + return; + } + var endOfInitializeAllMappers = initializeAllMappersIndex + + utilsFileContent.substring(initializeAllMappersIndex).indexOf(']') + + 1; + utilsFileContent = + utilsFileContent.substring(0, endOfInitializeAllMappers - 1) + + '\n ' + + complaintsInitializationStatement + + utilsFileContent.substring(endOfInitializeAllMappers - 1); + print('complaint initialization statement added to utils.dart'); + } else { + print('The complaint initialization statement already exists.'); + } + + if (!utilsFileContent.contains(getSyncCountStatement)) { + var getSyncCountStatementIndex = + utilsFileContent.indexOf('add SyncCount case for package'); + if (getSyncCountStatementIndex == -1) { + print( + 'Error: Could not find a place to insert the complaint DataModelType statement.'); + return; + } + + var endOfgetSyncCountStatementIndex = getSyncCountStatementIndex + + utilsFileContent.substring(getSyncCountStatementIndex).indexOf('}') + + 1; + utilsFileContent = + utilsFileContent.substring(0, getSyncCountStatementIndex + 30) + + '\n ' + + getSyncCountStatement + + utilsFileContent.substring(getSyncCountStatementIndex + 30); + print('complaint DataModelType statement added to utils.dart'); + } else { + print('The complaint DataModelType statement already exists.'); + } + + // Write the updated content back to the utils.dart file + utilsFile.writeAsStringSync(utilsFileContent); +} + +void _addComplaintsConstantsToConstantsFile( + {required String constantsFilePath}) { + // Define the import statements + var importStatements = [ + "import 'package:complaints/complaints.dart';", + ]; + + // Define the local and remote repositories + var localRepository = [ + ''' +PgrServiceLocalRepository( + sql, + PgrServiceOpLogManager(isar), + ), +''' + ]; + + var remoteRepository = [ + ''' +if (value == DataModelType.complaints) + PgrServiceRemoteRepository(dio, actionMap: actions), +''' + ]; + + // Check if the constants.dart file exists + var constantsFile = File(constantsFilePath); + if (!constantsFile.existsSync()) { + print('Error: The constants.dart file does not exist.'); + return; + } + + // Read the constants.dart file + var constantsFileContent = constantsFile.readAsStringSync(); + + // Normalize the whitespace in the file content and the complaints configuration + var normalizedFileContent = + constantsFileContent.replaceAll(RegExp(r'\s'), ''); + + // Check if the import statements already exist in the file + for (var importStatement in importStatements) { + if (!normalizedFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + // Add the import statement at the top of the file + constantsFileContent = importStatement + '\n' + constantsFileContent; + print('The import statement was added: $importStatement'); + } + } + + // Add the local and remote repositories to the getLocalRepositories and getRemoteRepositories methods + var getLocalRepositoriesIndex = + constantsFileContent.indexOf('getLocalRepositories('); + if (getLocalRepositoriesIndex != -1) { + var endOfGetLocalRepositories = getLocalRepositoriesIndex + + constantsFileContent.substring(getLocalRepositoriesIndex).indexOf(']') + + 1; + constantsFileContent = + constantsFileContent.substring(0, endOfGetLocalRepositories - 1) + + '\n' + + localRepository.join('\n') + + constantsFileContent.substring(endOfGetLocalRepositories - 1); + print('The local repositories were added.'); + } + + var getRemoteRepositoriesIndex = + constantsFileContent.indexOf('getRemoteRepositories('); + if (getRemoteRepositoriesIndex != -1) { + var endOfGetRemoteRepositories = getRemoteRepositoriesIndex + + constantsFileContent + .substring(getRemoteRepositoriesIndex) + .indexOf('addAll(') + + 'addAll('.length; + var endOfAddAll = constantsFileContent + .substring(endOfGetRemoteRepositories) + .indexOf(']') + + endOfGetRemoteRepositories; + constantsFileContent = constantsFileContent.substring(0, endOfAddAll) + + remoteRepository.join('\n') + + constantsFileContent.substring(endOfAddAll); + print('The remote repositories were added.'); + } + + // Write the updated content back to the constants.dart file + constantsFile.writeAsStringSync(constantsFileContent); +} + +void _addRepoToNetworkManagerProviderWrapper( + {required String networkManagerProviderWrapperFilePath}) { + // Define the import statements and repository providers + var importStatements = [ + "import 'package:complaints/complaints.dart';", + ]; + var localRepositories = [ + "RepositoryProvider<\n LocalRepository>(\n create: (_) => PgrServiceLocalRepository(\n sql,\n PgrServiceOpLogManager(isar),\n ),\n )," + ]; + +// Define the remote repositories of complaints + var remoteRepositoriesOfRegistrationDelivery = [ + "if (value == DataModelType.complaints)\n RepositoryProvider<\n RemoteRepository>(\n create: (_) => PgrServiceRemoteRepository(\n dio,\n actionMap: actions,\n ),\n)" + ]; + +// Read the network_manager_provider_wrapper.dart file + var networkManagerProviderWrapperFile = + File(networkManagerProviderWrapperFilePath); + var networkManagerProviderWrapperFileContent = + networkManagerProviderWrapperFile.readAsStringSync(); + +// Find the last import statement in the file + var lastImportIndex = networkManagerProviderWrapperFileContent + .lastIndexOf(RegExp(r'import .+;')); + + if (lastImportIndex != -1) { + var endOfLastImport = lastImportIndex + + networkManagerProviderWrapperFileContent + .substring(lastImportIndex) + .indexOf(';') + + 1; + + // Check if the import statements already exist in the file + for (var importStatement in importStatements) { + if (!networkManagerProviderWrapperFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + // Add the import statement after the last import + networkManagerProviderWrapperFileContent = + networkManagerProviderWrapperFileContent.substring( + 0, endOfLastImport) + + '\n' + + importStatement + + networkManagerProviderWrapperFileContent + .substring(endOfLastImport); + endOfLastImport += importStatement.length + 1; + print('The import statement was added: $importStatement'); + } else { + print('The import statement already exists.'); + } + } + + // Normalize the whitespace in the file content and the remote repository of complaints + var normalizedFileContent = + networkManagerProviderWrapperFileContent.replaceAll(RegExp(r'\s'), ''); + +// Check if the local repository providers already exist in the file + for (var repositoryProvider in localRepositories) { + var normalizedLocalRepositoryOfComplaints = + repositoryProvider.replaceAll(RegExp(r'\s'), ''); + + if (!normalizedFileContent + .contains(normalizedLocalRepositoryOfComplaints)) { + // Add the local repository provider to the file + networkManagerProviderWrapperFileContent = + networkManagerProviderWrapperFileContent.replaceFirst( + '];', ' $repositoryProvider\n];'); + print('The local repository provider was added: $repositoryProvider'); + } else { + print('The local repository provider already exists.'); + } + } + +// Check if the remote repository of complaints already exists in the file + for (var remoteRepositoryOfRegistrationDelivery + in remoteRepositoriesOfRegistrationDelivery) { + var normalizedRemoteRepositoryOfRegistrationDelivery = + remoteRepositoryOfRegistrationDelivery.replaceAll(RegExp(r'\s'), ''); + + if (!normalizedFileContent + .contains(normalizedRemoteRepositoryOfRegistrationDelivery)) { + // Add the remote repository of complaints to the _getRemoteRepositories method + var replacementString = + networkManagerProviderWrapperFileContent.contains(']);') + ? ' $remoteRepositoryOfRegistrationDelivery,\n]);' + : ' $remoteRepositoryOfRegistrationDelivery\n]);'; + networkManagerProviderWrapperFileContent = + networkManagerProviderWrapperFileContent.replaceFirst( + ']);', replacementString); + print( + 'The remote repository of complaints was added: $remoteRepositoryOfRegistrationDelivery'); + } else { + print('The remote repository of complaints already exists.'); + } + } + + // Write the updated content back to the file + networkManagerProviderWrapperFile + .writeAsStringSync(networkManagerProviderWrapperFileContent); + } +} + +void _createLocalizationDelegatesFile(String localizationDelegatesFilePath) { + // Define the import statement and delegate for localization + var importStatement = + "import 'package:complaints/blocs/localization/app_localization.dart' as complaints_localization;"; + var delegate = + " complaints_localization.ComplaintsLocalization.getDelegate( LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future,appConfig.languages!,),"; + + // Read the localization delegates file + var localizationDelegatesFile = File(localizationDelegatesFilePath); + var localizationDelegatesFileContent = + localizationDelegatesFile.readAsStringSync(); + + var normalizedFileContent = + localizationDelegatesFileContent.replaceAll(RegExp(r'\s'), ''); + + // Check if the import statement and delegate already exist in the file + // If not, add them to the file + if (!normalizedFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + localizationDelegatesFileContent = + '$importStatement\n$localizationDelegatesFileContent'; + print('The import statement was added.'); + } + + if (!normalizedFileContent.contains(delegate.replaceAll(RegExp(r'\s'), ''))) { + var lastDelegateIndex = + localizationDelegatesFileContent.lastIndexOf(RegExp(r',')); + if (lastDelegateIndex != -1) { + localizationDelegatesFileContent = + localizationDelegatesFileContent.substring(0, lastDelegateIndex + 1) + + '\n $delegate' + + localizationDelegatesFileContent.substring(lastDelegateIndex + 1); + print('The delegate was added.'); + } + } + + // Write the updated content back to the file + localizationDelegatesFile.writeAsStringSync(localizationDelegatesFileContent); +} + +void _setBoundaryInContextUtilityFile( + String extensionsFilePath, String contextUtilityFilePath) { + // Define the lines to be added + var importStatement = "import 'package:complaints/utils/utils.dart';"; + var boundaryStatement = + 'ComplaintsSingleton().setBoundary(boundary: selectedBoundary);'; + + // Update the extensions.dart file + var extensionsFile = File(extensionsFilePath); + var extensionsFileContent = extensionsFile.readAsStringSync(); + if (!extensionsFileContent.contains(importStatement)) { + extensionsFileContent = importStatement + '\n' + extensionsFileContent; + extensionsFile.writeAsStringSync(extensionsFileContent); + print('Updated the extensions.dart file.'); + } + + // Update the context_utility.dart file + var contextUtilityFile = File(contextUtilityFilePath); + var contextUtilityFileContent = contextUtilityFile.readAsStringSync(); + + // Use the insertData method to insert the boundaryStatement + contextUtilityFileContent = insertData(contextUtilityFileContent, + '// INFO: Set Boundary for packages', boundaryStatement); + + // Write the updated content back to the context_utility.dart file + contextUtilityFile.writeAsStringSync(contextUtilityFileContent); +} diff --git a/tools/survey_form_package_imports.dart b/tools/survey_form_package_imports.dart new file mode 100644 index 000000000..337bdc6b5 --- /dev/null +++ b/tools/survey_form_package_imports.dart @@ -0,0 +1,1054 @@ +// Import the required Dart I/O package +import 'dart:io'; + +String createCaseCondition(String key, String value) { + return 'case "$key":\n $value'; +} + +void insertCaseCondition(List lines, String caseCondition) { + final defaultIndex = lines.indexWhere((line) => line.contains('default:')); + if (defaultIndex != -1 && + !lines.any((line) => line.contains(caseCondition.split('\n')[0]))) { + lines.insert(defaultIndex, caseCondition); + } +} + +// Define the main function +void main() { + // Get the current directory path + var appDir = Directory.current.parent.path; + + // Define the paths for the application root and the files to be modified + var appRoot = appDir + '/apps/health_campaign_field_worker_app/lib'; + var localizationDelegatesFilePath = + appRoot + '/utils/localization_delegates.dart'; + var networkManagerProviderWrapperFilePath = + appRoot + '/widgets/network_manager_provider_wrapper.dart'; + var constantsFilePath = appRoot + '/utils/constants.dart'; + var utilsFilePath = appRoot + '/utils/utils.dart'; + var routerFilePath = appRoot + '/router/app_router.dart'; + var entityMapperFilePath = + appRoot + '/data/local_store/no_sql/schema/entity_mapper.dart'; + var syncDownFilePath = appRoot + '/data/repositories/sync/sync_down.dart'; + var homeFilePath = appRoot + '/pages/home.dart'; + var projectFilePath = appRoot + '/blocs/project/project.dart'; + var authenticatedFilePath = appRoot + '/pages/authenticated.dart'; + var contextUtilityFilePath = appRoot + '/utils/extensions/context_utility.dart'; + var appFilePath = appRoot + '/app.dart'; + var extensionFilePath = appRoot + '/utils/extensions/extensions.dart'; + + _updateExtensionFilePath(extensionFilePath); + + _updateAppFile(appFilePath); + + // Initialise Boundarycode in surveyFormSingleton class + _updateContextUtilityFile(contextUtilityFilePath); + + // Add Imports and service definition repo + _addprojectFilePath(projectFilePath); + + _addauthenticatedFilePath(authenticatedFilePath); + + + // Add surveyForm to home file + _updateHome(homeFilePath); + + // Add surveyForm routes and import to the router file + _addSurveyFormRoutesAndImportToRouterFile(routerFilePath); + + // Add new case statements to the entity_mapper.dart file + _updateEntityMapperFile(entityMapperFilePath); + + _createLocalizationDelegatesFile(localizationDelegatesFilePath); + + _addRepoToNetworkManagerProviderWrapper( + networkManagerProviderWrapperFilePath: + networkManagerProviderWrapperFilePath); + + _addSurveyFormConstantsToConstantsFile(constantsFilePath: constantsFilePath); + + _addSurveyFormMapperToUtilsFile(utilsFilePath: utilsFilePath); + + _formatFiles([ + homeFilePath, + syncDownFilePath, + entityMapperFilePath, + routerFilePath, + constantsFilePath, + utilsFilePath, + networkManagerProviderWrapperFilePath, + localizationDelegatesFilePath, + projectFilePath, + authenticatedFilePath, + contextUtilityFilePath, + appFilePath, + extensionFilePath + ]); +} + +void _formatFiles(List filePaths) { + for (var filePath in filePaths) { + Process.runSync('dart', ['format', filePath]); + print('Formatted $filePath'); + } +} + +void _updateExtensionFilePath(extensionFilePath){ + var importStatement = ''' + import 'package:survey_form/utils/utils.dart';'''; + + // Check if the extension.dart file exists + var extensionFile = File(extensionFilePath); + if (!extensionFile.existsSync()) { + print('Error: project file does not exist at path: $extensionFilePath'); + return; + } + + // Read the authenticated.dart file + var extensionFileContent = extensionFile.readAsStringSync(); + + // Check if the import statement already exists and add it if not + if (!extensionFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + extensionFileContent = importStatement + '\n' + extensionFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + extensionFile.writeAsStringSync(extensionFileContent); +} + +void _updateAppFile(appFilePath) { + var importStatement = ''' + import 'package:survey_form/survey_form.dart';'''; + + var ServiceDefinitionRepository = '''serviceDefinitionRemoteRepository: ctx.read< + RemoteRepository>(), + serviceDefinitionLocalRepository: ctx.read< + LocalRepository>(),'''; + + // Check if the app.dart file exists + var appFile = File(appFilePath); + if (!appFile.existsSync()) { + print('Error: project file does not exist at path: $appFilePath'); + return; + } + + // Read the app.dart file + var appFileContent = appFile.readAsStringSync(); + + // Check if the import statement already exists and add it if not + if (!appFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + appFileContent = importStatement + '\n' + appFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Check if the new cases already exist in the file + if (!appFileContent + .contains(ServiceDefinitionRepository.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the new cases (before the default case) + var caseInsertionIndex = appFileContent.indexOf('ProjectBloc('); + caseInsertionIndex += 'ProjectBloc('.length; + if (caseInsertionIndex != -1) { + appFileContent = + appFileContent.substring(0, caseInsertionIndex) + + ServiceDefinitionRepository + + '\n' + + appFileContent.substring(caseInsertionIndex); + print('The new cases were added.'); + + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The new cases already exist.'); + } + + appFile.writeAsStringSync(appFileContent); +} + +void _updateContextUtilityFile(String contextUtilityFilepath) { + var surveyFormBoundary = '''SurveyFormSingleton().setBoundary(boundary: selectedBoundary);'''; + + // Check if the context_utility.dart file exists + var contextUtilityFile = File(contextUtilityFilepath); + if (!contextUtilityFile.existsSync()) { + print('Error: Context Utility file does not exist at path: $contextUtilityFilepath'); + return; + } + + // Read the context_utility.dart file + var contextUtilityFileContent = contextUtilityFile.readAsStringSync(); + + // Insert the data to be added + contextUtilityFileContent = insertData(contextUtilityFileContent, + '// INFO: Set Boundary for packages', surveyFormBoundary); + + // Write the updated content back to the context_utility.dart file + contextUtilityFile.writeAsStringSync(contextUtilityFileContent); +} + +void _addauthenticatedFilePath(String authenticatedFilePath) { + var importStatement = ''' + import 'package:survey_form/survey_form.dart';'''; + + var providers = '''BlocProvider( + create: (_) => ServiceBloc( + const ServiceEmptyState(), + serviceDataRepository: context + .repository(), + ), + ),'''; + + // Check if the authenticated.dart file exists + var authenticatedFile = File(authenticatedFilePath); + if (!authenticatedFile.existsSync()) { + print('Error: project file does not exist at path: $authenticatedFilePath'); + return; + } + + // Read the authenticated.dart file + var authenticatedFileContent = authenticatedFile.readAsStringSync(); + + // Check if the import statement already exists and add it if not + if (!authenticatedFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + authenticatedFileContent = importStatement + '\n' + authenticatedFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Check if the new cases already exist in the file + if (!authenticatedFileContent + .contains(providers.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the new cases (before the default case) + var caseInsertionIndex = authenticatedFileContent.indexOf('providers: ['); + caseInsertionIndex += 'providers: ['.length; + if (caseInsertionIndex != -1) { + authenticatedFileContent = + authenticatedFileContent.substring(0, caseInsertionIndex) + + providers + + '\n' + + authenticatedFileContent.substring(caseInsertionIndex); + print('The new cases were added.'); + + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The new cases already exist.'); + } + + authenticatedFile.writeAsStringSync(authenticatedFileContent); +} + +void _addprojectFilePath(String projectFilePath) { + var importStatement = ''' + import 'package:survey_form/survey_form.dart';'''; + + var ServicedefinitionRepo = '''/// Service Definition Repositories + final RemoteRepository + serviceDefinitionRemoteRepository; + final LocalRepository + serviceDefinitionLocalRepository;'''; + + var projectBloc = '''required this.serviceDefinitionRemoteRepository, + required this.serviceDefinitionLocalRepository,'''; + + var loadServicedefinition = '''FutureOr _loadServiceDefinition(List projects) async { + final configs = await isar.appConfigurations.where().findAll(); + final userObject = await localSecureStore.userRequestModel; + List codes = []; + for (UserRoleModel elements in userObject!.roles) { + configs.first.checklistTypes?.map((e) => e.code).forEach((element) { + for (final project in projects) { + codes.add( + '\${project.name}.\$element.\${elements.code.snakeCase.toUpperCase()}', + ); + } + }); + } + + final serviceDefinition = await serviceDefinitionRemoteRepository + .search(ServiceDefinitionSearchModel( + tenantId: envConfig.variables.tenantId, + code: codes, + )); + + for (var element in serviceDefinition) { + await serviceDefinitionLocalRepository.create( + element, + createOpLog: false, + ); + } + }'''; + + var loadfunctions = '''try { + await _loadServiceDefinition(projects); + } catch (_) { + emit( + state.copyWith( + loading: false, + syncError: ProjectSyncErrorType.serviceDefinitions, + ), + ); + } + try { + await _loadServiceDefinition(projects); + } catch (_) { + emit( + state.copyWith( + loading: false, + syncError: ProjectSyncErrorType.serviceDefinitions, + ), + ); + }'''; + + // Check if the project.dart file exists + var projectFile = File(projectFilePath); + if (!projectFile.existsSync()) { + print('Error: project file does not exist at path: $projectFilePath'); + return; + } + + // Read the project.dart file + var projectFileContent = projectFile.readAsStringSync(); + + // Check if the import statement already exists and add it if not + if (!projectFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + projectFileContent = importStatement + '\n' + projectFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Check if the Service Definition repo already exist in the file + if (!projectFileContent + .contains(ServicedefinitionRepo.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the Service Definition Repo + var caseInsertionIndex = projectFileContent.indexOf('class ProjectBloc extends Bloc {'); + caseInsertionIndex += 'class ProjectBloc extends Bloc {'.length; + if (caseInsertionIndex != -1) { + projectFileContent = + projectFileContent.substring(0, caseInsertionIndex) + '\n' + + ServicedefinitionRepo + + '\n' + + projectFileContent.substring(caseInsertionIndex); + print('The Service Definition repo were added.'); + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The Service Definition Repo already exist.'); + } + + // Check if the Project Bloc already exist in the file + if (!projectFileContent + .contains(projectBloc.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the Project Bloc + var caseInsertionIndex = projectFileContent.indexOf('ProjectBloc({'); + caseInsertionIndex += 'ProjectBloc({'.length; + if (caseInsertionIndex != -1) { + projectFileContent = + projectFileContent.substring(0, caseInsertionIndex) + '\n' + + projectBloc + + '\n' + + projectFileContent.substring(caseInsertionIndex); + print('The Project Bloc were added.'); + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The Project Bloc already exist.'); + } + + // Check if the load service definition function already exist in the file + if (!projectFileContent + .contains(loadServicedefinition.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the load service definition function + var caseInsertionIndex = projectFileContent.indexOf('class ProjectBloc extends Bloc {'); + caseInsertionIndex += 'class ProjectBloc extends Bloc {'.length; + if (caseInsertionIndex != -1) { + projectFileContent = + projectFileContent.substring(0, caseInsertionIndex) + '\n' + + loadServicedefinition + + '\n' + + projectFileContent.substring(caseInsertionIndex); + print('The load service definition function were added.'); + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The load service definition function already exist.'); + } + + // Check if the load functions calling already exist in the file + if (!projectFileContent + .contains(loadfunctions.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the load function calling + var caseInsertionIndex = projectFileContent.indexOf('// INFO : Need to add project load functions'); + caseInsertionIndex += '// INFO : Need to add project load functions'.length; + if (caseInsertionIndex != -1) { + projectFileContent = + projectFileContent.substring(0, caseInsertionIndex) + '\n' + + loadfunctions + + '\n' + + projectFileContent.substring(caseInsertionIndex); + print('The load function calling were added.'); + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The load function calling already exist.'); + } + + // Write the updated content back to the project.dart file + projectFile.writeAsStringSync(projectFileContent); +} + +void _updateHome(String homeFilePath) { + var importStatement = ''' + import 'package:survey_form/survey_form.dart'; + import 'package:survey_form/router/survey_form_router.gm.dart'; + '''; + + var homeItemsData = ''' + i18.home.mySurveyForm: homeShowcaseData.supervisorMySurveyForm.buildWith( + child: HomeItemCard( + enableCustomIcon: true, + customIcon: mySurveyFormSvg, + icon: Icons.checklist, + label: i18.home.mySurveyForm, + onPressed: () => context.router.push(SurveyFormWrapperRoute()), + ), + ), + '''; + + var showCaseData = ''' + i18.home.mySurveyForm: homeShowcaseData.supervisorMySurveyForm.showcaseKey, + '''; + + var itemsLabel = ''' + i18.home.mySurveyForm, + '''; + + // Define the data to be added + var singletonData = ''' + SurveyFormSingleton().setInitialData( + projectId: context.projectId, + projectName: context.selectedProject.name, + loggedInIndividualId: context.loggedInIndividualId ?? '', + loggedInUserUuid: context.loggedInUserUuid, + appVersion: Constants().version, + isHealthFacilityWorker: context.loggedInUserRoles.where((role) => role.code == RolesType.healthFacilityWorker.toValue()).toList().isNotEmpty, + roles: context.read().state.maybeMap( + orElse: () => const Offstage(), + authenticated: (res) { + return res.userModel.roles + .map((e) => e.code.snakeCase.toUpperCase()) + .toList(); + }), + ); + '''; + + var localRepoData = ''' + context.read>(), + '''; + + var remoteRepoData = ''' + context.read>(), + '''; + + // Check if the home.dart file exists + var homeFile = File(homeFilePath); + if (!homeFile.existsSync()) { + print('Error: Home file does not exist at path: $homeFilePath'); + return; + } + + // Read the home.dart file + var homeFileContent = homeFile.readAsStringSync(); + + // Check if the import statement already exists and add it if not + if (!homeFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + homeFileContent = importStatement + '\n' + homeFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Insert the data to be added + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add singleton of package Here', singletonData); + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add local repo of package Here', localRepoData); + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add repo repo of package Here', remoteRepoData); + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add home items of package Here', homeItemsData); + homeFileContent = insertData(homeFileContent, + '// INFO : Need to add showcase keys of package Here', showCaseData); + homeFileContent = insertData(homeFileContent, + '// INFO: Need to add items label of package Here', itemsLabel); + + // Write the updated content back to the home.dart file + homeFile.writeAsStringSync(homeFileContent); +} + +String insertData(String fileContent, String marker, String data) { + var markerIndex = fileContent.indexOf(marker); + if (markerIndex != -1) { + var endOfMarker = markerIndex + marker.length; + if (!fileContent.substring(endOfMarker).contains(data.trim())) { + fileContent = fileContent.substring(0, endOfMarker) + + '\n' + + data + + fileContent.substring(endOfMarker); + print('Data was added after marker: $marker'); + } else { + print('Data already exists after marker: $marker'); + } + } else { + print('Error: Could not find the marker: $marker'); + } + return fileContent; +} + +void _updateEntityMapperFile(String entityMapperFilePath) { + // Define the import statement and new case statements + var importStatement = + "import 'package:survey_form/survey_form.dart';"; + var newCases = ''' + case "service": + final entity = ServiceModelMapper.fromJson(entityString); + return entity; +'''; + + // Check if the entity_mapper file exists + var entityMapperFile = File(entityMapperFilePath); + + if (!entityMapperFile.existsSync()) { + print( + 'Error: Entity Mapper file does not exist at path: $entityMapperFilePath'); + return; + } + + // Read the entity_mapper file + var entityMapperFileContent = entityMapperFile.readAsStringSync(); + + // Check if the import statement already exists and add it if not + if (!entityMapperFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + entityMapperFileContent = importStatement + '\n' + entityMapperFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Check if the new cases already exist in the file + if (!entityMapperFileContent + .contains('case "service":'.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the new cases (before the default case) + var caseInsertionIndex = entityMapperFileContent.indexOf('default:'); + if (caseInsertionIndex != -1) { + entityMapperFileContent = + entityMapperFileContent.substring(0, caseInsertionIndex) + + newCases + + '\n' + + entityMapperFileContent.substring(caseInsertionIndex); + print('The new cases were added.'); + + // Write the updated content back to the file + entityMapperFile.writeAsStringSync(entityMapperFileContent); + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The new cases already exist.'); + } +} + +void _addSurveyFormRoutesAndImportToRouterFile(String routerFilePath) { + // Define the SurveyForm route lines + var surveyFormRoutes = ''' + // SurveyForm Route + AutoRoute( + page: SurveyFormWrapperRoute.page, + path: 'surveyForm', + children: [ + AutoRoute( + page: SurveyformRoute.page, + path: '', + ), + AutoRoute( + page: SurveyFormBoundaryViewRoute.page, path: 'view-boundary'), + AutoRoute(page: SurveyFormViewRoute.page, path: 'view'), + AutoRoute(page: SurveyFormPreviewRoute.page, path: 'preview'), + AutoRoute(page: SurveyFormAcknowledgementRoute.page, path: 'surveyForm-acknowledgement'), + ]), + '''; + + // Define the import statement + var importStatement1 = + "import 'package:survey_form/router/survey_form_router.dart';"; + // Define the import statement + var importStatement2 = + "import 'package:survey_form/router/survey_form_router.gm.dart';"; + + // Check if the router file exists + var routerFile = File(routerFilePath); + + if (!routerFile.existsSync()) { + print('Error: Router file does not exist at path: $routerFilePath'); + return; + } + + // Read the router file + var routerFileContent = routerFile.readAsStringSync(); + + // Check if the import statement already exists + if (!routerFileContent + .contains(importStatement1.replaceAll(RegExp(r'\s'), ''))) { + // Add the import statement at the beginning of the file + routerFileContent = importStatement1 + '\n' + routerFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + + // Check if the import statement already exists + if (!routerFileContent + .contains(importStatement2.replaceAll(RegExp(r'\s'), ''))) { + // Add the import statement at the beginning of the file + routerFileContent = importStatement2 + '\n' + routerFileContent; + print('The import statement was added.'); + } else { + print('The import statement already exists.'); + } + // Check if the surveyFormRoute module already exists + if (!routerFileContent + .contains('SurveyFormRoute'.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the module + var moduleInsertionIndex = routerFileContent.indexOf('@AutoRouterConfig('); + if (moduleInsertionIndex != -1) { + var endOfModulesIndex = + routerFileContent.indexOf(']', moduleInsertionIndex); + if (endOfModulesIndex != -1) { + var modulesEndIndex = + routerFileContent.lastIndexOf(']', endOfModulesIndex); + routerFileContent = routerFileContent.substring(0, modulesEndIndex) + + 'SurveyFormRoute,' + + routerFileContent.substring(modulesEndIndex); + + // Write the updated content back to the project.dart file + routerFile.writeAsStringSync(routerFileContent); + print('The SurveyFormRoute module was added.'); + } else { + print('Error: Could not find the end of the modules list.'); + return; + } + } else { + print('Error: Could not find @AutoRouterConfig annotation.'); + return; + } + } else { + print('The SurveyFormRoute module already exists.'); + } + + // Check if the SurveyForm routes already exist in the file + if (!routerFileContent + .contains(surveyFormRoutes.replaceAll(RegExp(r'\s'), ''))) { + // Find the position to insert the routes + var insertionIndex = routerFileContent + .indexOf('// INFO : Need to add Router of package Here'); + if (insertionIndex != -1) { + routerFileContent = routerFileContent.substring(0, insertionIndex) + + '// INFO : Need to add Router of package Here\n' + + surveyFormRoutes + + routerFileContent.substring(insertionIndex + + '// INFO : Need to add Router of package Here'.length); + print('The surveyForm routes were added.'); + + } else { + print('Error: Could not find the insertion point.'); + return; + } + } else { + print('The surveyForm routes already exist.'); + } + // Write the updated content back to the file + routerFile.writeAsStringSync(routerFileContent); +} + +void _addSurveyFormMapperToUtilsFile({required String utilsFilePath}) { + // Define the surveyForm related lines + var surveyFormImportStatement = [ + '''import 'package:survey_form/survey_form.init.dart' + as surveyForm_mappers;''' + ]; + var surveyFormInitializationStatement = + "Future(() => surveyForm_mappers.initializeMappers()),"; + + // Check if the utils.dart file exists + var utilsFile = File(utilsFilePath); + + // Read the utils.dart file + var utilsFileContent = utilsFile.readAsStringSync(); + + // Normalize the whitespace in the file content + var normalizedFileContent = utilsFileContent.replaceAll(RegExp(r'\s'), ''); + + // Check if the import statement and delegate already exist in the file + // If not, add them to the file + if (!normalizedFileContent + .contains(surveyFormImportStatement[0].replaceAll(RegExp(r'\s'), ''))) { + var libraryIndex = utilsFileContent.indexOf('library app_utils;'); + if (libraryIndex != -1) { + var endOfLibrary = libraryIndex + + utilsFileContent.substring(libraryIndex).indexOf(';') + + 1; + utilsFileContent = utilsFileContent.substring(0, endOfLibrary + 1) + + '\n' + + surveyFormImportStatement[0] + + utilsFileContent.substring(endOfLibrary + 1); + print('The import statement was added.'); + } + } else { + print('The import statement already exists.'); + } + + if (!utilsFileContent.contains(surveyFormInitializationStatement)) { + // Add the surveyForm related initialization statement to the file + var initializeAllMappersIndex = + utilsFileContent.indexOf('initializeAllMappers() async {'); + if (initializeAllMappersIndex == -1) { + print( + 'Error: Could not find a place to insert the survey form initialization statement.'); + return; + } + var endOfInitializeAllMappers = initializeAllMappersIndex + + utilsFileContent.substring(initializeAllMappersIndex).indexOf(']') + + 1; + utilsFileContent = + utilsFileContent.substring(0, endOfInitializeAllMappers - 1) + + '\n ' + + surveyFormInitializationStatement + + utilsFileContent.substring(endOfInitializeAllMappers - 1); + + print('Survey Form initialization statement added to utils.dart'); + } else { + print('The Survey Form initialization statement already exists.'); + } + + // Write the updated content back to the utils.dart file + utilsFile.writeAsStringSync(utilsFileContent); +} + +void _addSurveyFormConstantsToConstantsFile( + {required String constantsFilePath}) { + // Define the import statements + var importStatements = [ + "import 'package:survey_form/survey_form.dart';", + ]; + + // Define the Survey Form configuration + var SurveyFormConfiguration = ''' +SurveyFormSingleton().setTenantId(envConfig.variables.tenantId); + '''; + + // Define the local and remote repositories + var localRepository = [ + ''' +ServiceDefinitionLocalRepository( + sql, + ServiceDefinitionOpLogManager(isar), + ), + ServiceLocalRepository( + sql, + ServiceOpLogManager(isar), + ), + ''' + ]; + + var remoteRepository = [ + ''' +if (value == DataModelType.serviceDefinition) + ServiceDefinitionRemoteRepository(dio, actionMap: actions), +if (value == DataModelType.service) + ServiceRemoteRepository(dio, actionMap: actions), + ''' + ]; + + // Check if the constants.dart file exists + var constantsFile = File(constantsFilePath); + if (!constantsFile.existsSync()) { + print('Error: The constants.dart file does not exist.'); + return; + } + + // Read the constants.dart file + var constantsFileContent = constantsFile.readAsStringSync(); + + // Normalize the whitespace in the file content and the Survey Form configuration + var normalizedFileContent = + constantsFileContent.replaceAll(RegExp(r'\s'), ''); + var normalizedSurveyFormConfiguration = + SurveyFormConfiguration.replaceAll(RegExp(r'\s'), ''); + + // Check if the import statements already exist in the file + for (var importStatement in importStatements) { + if (!normalizedFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + // Add the import statement at the top of the file + constantsFileContent = importStatement + '\n' + constantsFileContent; + print('The import statement was added: $importStatement'); + } + } + + // Check if the Survey Form configuration already exists in the file + // If not, add it to the file + if (!normalizedFileContent.contains(normalizedSurveyFormConfiguration)) { + // Find the setInitialDataOfPackages method and add the Survey Form configuration inside it + var setInitialDataOfPackagesIndex = + constantsFileContent.indexOf('void setInitialDataOfPackages() {'); + if (setInitialDataOfPackagesIndex != -1) { + var endOfSetInitialDataOfPackages = setInitialDataOfPackagesIndex + + constantsFileContent + .substring(setInitialDataOfPackagesIndex) + .indexOf('}') + + 1; + constantsFileContent = + constantsFileContent.substring(0, endOfSetInitialDataOfPackages - 1) + + '\n $SurveyFormConfiguration' + + constantsFileContent.substring(endOfSetInitialDataOfPackages - 1); + print('The Survey Form configuration was added.'); + } + } + + // Add the local and remote repositories to the getLocalRepositories and getRemoteRepositories methods + var getLocalRepositoriesIndex = + constantsFileContent.indexOf('getLocalRepositories('); + if (getLocalRepositoriesIndex != -1) { + var endOfGetLocalRepositories = getLocalRepositoriesIndex + + constantsFileContent.substring(getLocalRepositoriesIndex).indexOf(']') + + 1; + constantsFileContent = + constantsFileContent.substring(0, endOfGetLocalRepositories - 1) + + '\n' + + localRepository.join('\n') + + constantsFileContent.substring(endOfGetLocalRepositories - 1); + print('The local repositories were added.'); + } + + var getRemoteRepositoriesIndex = + constantsFileContent.indexOf('getRemoteRepositories('); + if (getRemoteRepositoriesIndex != -1) { + var endOfGetRemoteRepositories = getRemoteRepositoriesIndex + + constantsFileContent + .substring(getRemoteRepositoriesIndex) + .indexOf('addAll(') + + 'addAll('.length; + var endOfAddAll = constantsFileContent + .substring(endOfGetRemoteRepositories) + .indexOf(']') + + endOfGetRemoteRepositories; + constantsFileContent = constantsFileContent.substring(0, endOfAddAll) + + remoteRepository.join('\n') + + constantsFileContent.substring(endOfAddAll); + print('The remote repositories were added.'); + } + + // Write the updated content back to the constants.dart file + constantsFile.writeAsStringSync(constantsFileContent); +} + +void _addRepoToNetworkManagerProviderWrapper( + {required String networkManagerProviderWrapperFilePath}) { + // Define the import statements and repository providers + var importStatements = [ + "import 'package:survey_form/survey_form.dart';", + ]; + var localRepositories = [ + '''RepositoryProvider< + LocalRepository>( + create: (_) => ServiceDefinitionLocalRepository( + sql, + ServiceDefinitionOpLogManager( + isar, + ), + ), + ), + RepositoryProvider>( + create: (_) => ServiceLocalRepository( + sql, + ServiceOpLogManager(isar), + ), + )''' + ]; + +// Define the remote repositories of Survey Form + var remoteRepositoriesOfSurveyForm = [ + '''if (value == DataModelType.service) + RepositoryProvider< + RemoteRepository>( + create: (_) => ServiceRemoteRepository( + dio, + actionMap: actions, + ), + ), + if (value == DataModelType.serviceDefinition) + RepositoryProvider< + RemoteRepository>( + create: (_) => ServiceDefinitionRemoteRepository( + dio, + actionMap: actions, + ), + )''' + ]; + +// Read the network_manager_provider_wrapper.dart file + var networkManagerProviderWrapperFile = + File(networkManagerProviderWrapperFilePath); + var networkManagerProviderWrapperFileContent = + networkManagerProviderWrapperFile.readAsStringSync(); + +// Find the last import statement in the file + var lastImportIndex = networkManagerProviderWrapperFileContent + .lastIndexOf(RegExp(r'import .+;')); + + if (lastImportIndex != -1) { + var endOfLastImport = lastImportIndex + + networkManagerProviderWrapperFileContent + .substring(lastImportIndex) + .indexOf(';') + + 1; + + // Check if the import statements already exist in the file + for (var importStatement in importStatements) { + if (!networkManagerProviderWrapperFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + // Add the import statement after the last import + networkManagerProviderWrapperFileContent = + networkManagerProviderWrapperFileContent.substring( + 0, endOfLastImport) + + '\n' + + importStatement + + networkManagerProviderWrapperFileContent + .substring(endOfLastImport); + endOfLastImport += importStatement.length + 1; + print('The import statement was added: $importStatement'); + } else { + print('The import statement already exists.'); + } + } + + // Normalize the whitespace in the file content and the remote repository of Survey Form + var normalizedFileContent = + networkManagerProviderWrapperFileContent.replaceAll(RegExp(r'\s'), ''); + +// Check if the local repository providers already exist in the file + for (var repositoryProvider in localRepositories) { + var normalizedLocalRepositoryOfSurveyForm = + repositoryProvider.replaceAll(RegExp(r'\s'), ''); + + if (!normalizedFileContent + .contains(normalizedLocalRepositoryOfSurveyForm)) { + // Add the local repository provider to the file + networkManagerProviderWrapperFileContent = + networkManagerProviderWrapperFileContent.replaceFirst( + '];', ' $repositoryProvider\n];'); + print('The local repository provider was added: $repositoryProvider'); + } else { + print('The local repository provider already exists.'); + } + } + +// Check if the remote repository of Survey Form already exists in the file + for (var remoteRepositoryOfSurveyForm + in remoteRepositoriesOfSurveyForm) { + var normalizedRemoteRepositoryOfSurveyForm = + remoteRepositoryOfSurveyForm.replaceAll(RegExp(r'\s'), ''); + + if (!normalizedFileContent + .contains(normalizedRemoteRepositoryOfSurveyForm)) { + // Add the remote repository of Survey Form to the _getRemoteRepositories method + var replacementString = + networkManagerProviderWrapperFileContent.contains(']);') + ? ' $remoteRepositoryOfSurveyForm,\n]);' + : ' $remoteRepositoryOfSurveyForm\n]);'; + networkManagerProviderWrapperFileContent = + networkManagerProviderWrapperFileContent.replaceFirst( + ']);', replacementString); + print( + 'The remote repository of Survey Form was added: $remoteRepositoryOfSurveyForm'); + } else { + print('The remote repository of Survey Form already exists.'); + } + } + + // Write the updated content back to the file + networkManagerProviderWrapperFile + .writeAsStringSync(networkManagerProviderWrapperFileContent); + } +} + +void _createLocalizationDelegatesFile(String localizationDelegatesFilePath) { + // Define the import statement and delegate for localization + var importStatement = + "import 'package:survey_form/blocs/app_localization.dart' as surveyForm_localization;"; + var delegate = + '''surveyForm_localization.SurveyFormLocalization.getDelegate( + LocalizationLocalRepository().returnLocalizationFromSQL(sql) as Future, + appConfig.languages!, + ),'''; + + // Read the localization delegates file + var localizationDelegatesFile = File(localizationDelegatesFilePath); + var localizationDelegatesFileContent = + localizationDelegatesFile.readAsStringSync(); + + var normalizedFileContent = + localizationDelegatesFileContent.replaceAll(RegExp(r'\s'), ''); + + // Check if the import statement and delegate already exist in the file + // If not, add them to the file + if (!normalizedFileContent + .contains(importStatement.replaceAll(RegExp(r'\s'), ''))) { + localizationDelegatesFileContent = + '$importStatement\n$localizationDelegatesFileContent'; + print('The import statement was added.'); + } + + if (!normalizedFileContent.contains(delegate.replaceAll(RegExp(r'\s'), ''))) { + var lastDelegateIndex = + localizationDelegatesFileContent.lastIndexOf(RegExp(r',')); + if (lastDelegateIndex != -1) { + localizationDelegatesFileContent = + localizationDelegatesFileContent.substring(0, lastDelegateIndex + 1) + + '\n $delegate' + + localizationDelegatesFileContent.substring(lastDelegateIndex + 1); + print('The delegate was added.'); + } + } + + // Write the updated content back to the file + localizationDelegatesFile.writeAsStringSync(localizationDelegatesFileContent); +} From 0e30b80bac7f452485b4028b2212bd0cb5de8f77 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Thu, 21 Nov 2024 16:01:09 +0530 Subject: [PATCH 26/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 27 +++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 57bcdf8db..f8f4c0dff 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -49,14 +49,25 @@ jobs: echo "HIERARCHY_TYPE=${{ vars.HIERARCHY_TYPE }}" >> apps/health_campaign_field_worker_app/.env echo "ENV_NAME=${{ vars.ENV_NAME }}" >> apps/health_campaign_field_worker_app/.env - - name: Run APK build script - env: - BUILD_CONFIG: release # or profile depending on your choice - run: bash ./tools/generate-apk.sh + - name: Verify .env file + run: | + ls -l apps/health_campaign_field_worker_app/.env + cat apps/health_campaign_field_worker_app/.env + + # - name: Run APK build script + # env: + # BUILD_CONFIG: release # or profile depending on your choice + # run: bash ./tools/generate-apk.sh + + # # Archive the APK as a build artifact so it can be downloaded + # - name: Upload APKs + # uses: actions/upload-artifact@v3 + # with: + # name: app-release-apk + # path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk - # Archive the APK as a build artifact so it can be downloaded - - name: Upload APKs + - name: Upload .env as artifact uses: actions/upload-artifact@v3 with: - name: app-release-apk - path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file + name: env-file + path: apps/health_campaign_field_worker_app/.env From a1a27b2334d1caf6c306b70292bfc94b69c461cd Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Thu, 21 Nov 2024 16:04:55 +0530 Subject: [PATCH 27/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index f8f4c0dff..f43d3dfb0 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -71,3 +71,4 @@ jobs: with: name: env-file path: apps/health_campaign_field_worker_app/.env + include-hidden-files: true From 5e5c74ae19b17299dcce7deb49c0d075d837aa6e Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Thu, 21 Nov 2024 16:22:18 +0530 Subject: [PATCH 28/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index f43d3dfb0..c69c1ee9d 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -54,17 +54,17 @@ jobs: ls -l apps/health_campaign_field_worker_app/.env cat apps/health_campaign_field_worker_app/.env - # - name: Run APK build script - # env: - # BUILD_CONFIG: release # or profile depending on your choice - # run: bash ./tools/generate-apk.sh + - name: Run APK build script + env: + BUILD_CONFIG: release # or profile depending on your choice + run: bash ./tools/generate-apk.sh - # # Archive the APK as a build artifact so it can be downloaded - # - name: Upload APKs - # uses: actions/upload-artifact@v3 - # with: - # name: app-release-apk - # path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk + # Archive the APK as a build artifact so it can be downloaded + - name: Upload APKs + uses: actions/upload-artifact@v3 + with: + name: app-release-apk + path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk - name: Upload .env as artifact uses: actions/upload-artifact@v3 From d066c26bb3115ec5312437e21cb1c3ed7845d386 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Wed, 18 Dec 2024 14:14:23 +0530 Subject: [PATCH 29/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index c69c1ee9d..ec64aefd9 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -23,7 +23,7 @@ jobs: - name: Flutter action uses: subosito/flutter-action@v2.8.0 with: - flutter-version: "3.16.5" + flutter-version: "3.22.2" - name: Set up Android SDK uses: android-actions/setup-android@v2 From b687b9c779a4c321a8a2e6aed9f17e7110275af0 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Wed, 18 Dec 2024 15:03:16 +0530 Subject: [PATCH 30/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index ec64aefd9..c69c1ee9d 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -23,7 +23,7 @@ jobs: - name: Flutter action uses: subosito/flutter-action@v2.8.0 with: - flutter-version: "3.22.2" + flutter-version: "3.16.5" - name: Set up Android SDK uses: android-actions/setup-android@v2 From 95643b1b7986062d8d1752a8702d459bd56d2b5b Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Wed, 18 Dec 2024 15:49:57 +0530 Subject: [PATCH 31/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index c69c1ee9d..32ee605a1 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -23,13 +23,13 @@ jobs: - name: Flutter action uses: subosito/flutter-action@v2.8.0 with: - flutter-version: "3.16.5" + flutter-version: "3.22.2" - name: Set up Android SDK uses: android-actions/setup-android@v2 with: - api-level: 30 - build-tools: 30.0.3 + api-level: 33 + build-tools: 33.0.2 - name: Install Dependencies run: flutter pub get From aa1c872d92e60611795a1f53e81842aa255c8fd4 Mon Sep 17 00:00:00 2001 From: Shashwat12-egov Date: Thu, 19 Dec 2024 11:56:51 +0530 Subject: [PATCH 32/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 32ee605a1..86219a520 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -9,6 +9,7 @@ on: jobs: build-apk: runs-on: ubuntu-latest + environment: QA # Reference the QA environment steps: - name: Checkout code @@ -34,6 +35,10 @@ jobs: - name: Install Dependencies run: flutter pub get + - name: Print Environment Variables + run: | + echo "BASE_URL=${{ vars.BASE_URL }}" + - name: Create .env file run: | echo "BASE_URL=${{ vars.BASE_URL }}" >> apps/health_campaign_field_worker_app/.env @@ -54,17 +59,17 @@ jobs: ls -l apps/health_campaign_field_worker_app/.env cat apps/health_campaign_field_worker_app/.env - - name: Run APK build script - env: - BUILD_CONFIG: release # or profile depending on your choice - run: bash ./tools/generate-apk.sh + # - name: Run APK build script + # env: + # BUILD_CONFIG: release # or profile depending on your choice + # run: bash ./tools/generate-apk.sh - # Archive the APK as a build artifact so it can be downloaded - - name: Upload APKs - uses: actions/upload-artifact@v3 - with: - name: app-release-apk - path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk + # # Archive the APK as a build artifact so it can be downloaded + # - name: Upload APKs + # uses: actions/upload-artifact@v3 + # with: + # name: app-release-apk + # path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk - name: Upload .env as artifact uses: actions/upload-artifact@v3 From a860a702ce332cd2a0e4443006fcd0df98e89697 Mon Sep 17 00:00:00 2001 From: Naveen Renati <154230258+naveenr-egov@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:43:59 +0530 Subject: [PATCH 33/33] Update flutter-build-apk.yml --- .github/workflows/flutter-build-apk.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/flutter-build-apk.yml b/.github/workflows/flutter-build-apk.yml index 86219a520..1fa8589df 100644 --- a/.github/workflows/flutter-build-apk.yml +++ b/.github/workflows/flutter-build-apk.yml @@ -59,17 +59,17 @@ jobs: ls -l apps/health_campaign_field_worker_app/.env cat apps/health_campaign_field_worker_app/.env - # - name: Run APK build script - # env: - # BUILD_CONFIG: release # or profile depending on your choice - # run: bash ./tools/generate-apk.sh + - name: Run APK build script + env: + BUILD_CONFIG: release # or profile depending on your choice + run: bash ./tools/generate-apk.sh - # # Archive the APK as a build artifact so it can be downloaded - # - name: Upload APKs - # uses: actions/upload-artifact@v3 - # with: - # name: app-release-apk - # path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk + # Archive the APK as a build artifact so it can be downloaded + - name: Upload APKs + uses: actions/upload-artifact@v3 + with: + name: app-release-apk + path: apps/health_campaign_field_worker_app/build/app/outputs/flutter-apk/app-release.apk - name: Upload .env as artifact uses: actions/upload-artifact@v3

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 literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..41b217a5b9447732b98a4b258d75c4b961b46ae8 GIT binary patch literal 8815 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 S;XmI=-YLkaN>@voh5Qe5^+6;6 literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb65cb8dbad5f1a6fbf91c7c920af6cc33e2c66 GIT binary patch literal 2434 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 IdEG1iACs^`umAu6 literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5047fef8e6658f1a9ea5b03d4d6fdd223550925e GIT binary patch literal 7053 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 literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 000000000..0bedcf2fd --- /dev/null +++ b/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000..89c2725b7 --- /dev/null +++ b/packages/complaints/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/packages/complaints/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/complaints/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f2e259c7c --- /dev/null +++ b/packages/complaints/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/complaints/example/ios/Runner/Base.lproj/Main.storyboard b/packages/complaints/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/packages/complaints/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/complaints/example/ios/Runner/Info.plist b/packages/complaints/example/ios/Runner/Info.plist new file mode 100644 index 000000000..5458fc418 --- /dev/null +++ b/packages/complaints/example/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/packages/complaints/example/ios/Runner/Runner-Bridging-Header.h b/packages/complaints/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..308a2a560 --- /dev/null +++ b/packages/complaints/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/packages/complaints/example/ios/RunnerTests/RunnerTests.swift b/packages/complaints/example/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 000000000..86a7c3b1b --- /dev/null +++ b/packages/complaints/example/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/packages/complaints/example/lib/localization_strings.json b/packages/complaints/example/lib/localization_strings.json new file mode 100644 index 000000000..0da33f0ec --- /dev/null +++ b/packages/complaints/example/lib/localization_strings.json @@ -0,0 +1,68 @@ +[ + { + "code": "COMPLAINTS_INBOX_HEADING", + "locale": "en_US", + "message": "Complaints Inbox", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_INBOX_SEARCH_CTA", + "locale": "en_US", + "message": "Search", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_INBOX_FILTER_CTA", + "locale": "en_US", + "message": "Filter", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_INBOX_SORT_CTA", + "locale": "en_US", + "message": "Sort", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_NO_COMPLAINTS_EXIST", + "locale": "en_US", + "message": "No Complaints Exist", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_FILE_COMPLAINT_ACTION", + "locale": "en_MZ", + "message": "File Complaint", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_ACKNOWLEDGEMENT_LABEL", + "locale": "en_MZ", + "message": "File Complaint", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_ACKNOWLEDGEMENT_SUB_LABEL_MAIN", + "locale": "en_MZ", + "message": "Complaint No.", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_ACKNOWLEDGEMENT_SUB_LABEL_SUB", + "locale": "en_MZ", + "message": "(Please sync the data to generate)", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_ACKNOWLEDGEMENT_ACTION", + "locale": "en_MZ", + "message": "Back to Complaints", + "module": "hcm-common" + }, + { + "code": "COMPLAINTS_ACKNOWLEDGEMENT_DESCRIPTION", + "locale": "en_MZ", + "message": "The complaint has been registered successfully and sent to the concerned person.", + "module": "hcm-common" + } +] \ No newline at end of file diff --git a/packages/complaints/example/lib/main.dart b/packages/complaints/example/lib/main.dart new file mode 100644 index 000000000..7642de2f9 --- /dev/null +++ b/packages/complaints/example/lib/main.dart @@ -0,0 +1,123 @@ +import 'dart:convert'; + +import 'package:complaints/blocs/localization/app_localization.dart'; +import 'package:complaints/complaints.dart'; +import 'package:digit_components/digit_components.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +void main() { + runApp(MyApp()); +} +class Language{ + late String label; + late String value; + + Language(this.label,this.value); +} + +class Localization { + late String code; + + late String message; + + late String module; + + late String locale; + +} + +Future loadLocalizedStrings() async{ + final String jsonString = + await rootBundle.loadString('lib/localization_strings.json'); + final decode = json.decode(jsonString); + + + List localizationList; + localizationList = decode.map((e) { + final data = e; + return Localization() + ..code = data['code'] + ..locale = data['locale'] + ..module = data['module'] + ..message = data['message']; + }).toList(); + + return Future.value(localizationList); +} + +class MyApp extends StatelessWidget { + late Future localizedStrings = loadLocalizedStrings(); + MyApp({super.key}); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: MyHomePage(title: "Complaints Package Demo"), + locale: Locale('en','MZ'), + supportedLocales: [const Locale('en','MZ')], + localizationsDelegates: [ + ComplaintsLocalization.getDelegate(loadLocalizedStrings(), [ + Language("English", "en_MZ") + ]), + // Add other localizations delegates if needed + ], + ); + } +} + +class MyHomePage extends StatefulWidget { + final String title; + MyHomePage({super.key, required this.title}); + + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + appBar: AppBar( + title: Text("PGR-Complaints Example"), + ), + body: Center( + child :DigitOutLineButton( + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) => + ComplaintsAcknowledgementPage(), + ), + ); + }, + label: "Demo Acknowledgemnet", + buttonStyle: OutlinedButton.styleFrom( + shape: const BeveledRectangleBorder(), + padding: const EdgeInsets.all(14), + side: BorderSide( + width: 1.0, + color: theme.colorScheme.primary, + ), + ), + ), + ) + ); + } +} diff --git a/packages/complaints/example/pubspec.lock b/packages/complaints/example/pubspec.lock new file mode 100644 index 000000000..c30d8d54e --- /dev/null +++ b/packages/complaints/example/pubspec.lock @@ -0,0 +1,1073 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" + source: hosted + version: "64.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + auto_route: + dependency: transitive + description: + name: auto_route + sha256: eb33554581a0a4aa7e6da0f13a44291a55bf71359012f1d9feb41634ff908ff8 + url: "https://pub.dev" + source: hosted + version: "7.9.2" + bloc: + dependency: transitive + description: + name: bloc + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + url: "https://pub.dev" + source: hosted + version: "8.1.4" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: transitive + description: + name: build_runner + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" + url: "https://pub.dev" + source: hosted + version: "2.4.9" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + url: "https://pub.dev" + source: hosted + version: "8.9.2" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + complaints: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "0.0.1-dev.1" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dart_mappable: + dependency: transitive + description: + name: dart_mappable + sha256: "47269caf2060533c29b823ff7fa9706502355ffcb61e7f2a374e3a0fb2f2c3f0" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + url: "https://pub.dev" + source: hosted + version: "2.3.6" + db_viewer: + dependency: transitive + description: + name: db_viewer + sha256: "5f7e3cfcde9663321797d8f6f0c876f7c13f0825a2e77ec1ef065656797144d9" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + digit_components: + dependency: "direct main" + description: + name: digit_components + sha256: "01320d4c72829045e789d1a56e23ff2bd85dad6a1831d27bd507a1acaceae17e" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + digit_data_model: + dependency: "direct main" + description: + name: digit_data_model + sha256: "14ebea5f17921081025963b379efd5e16d155dd920d5a42ab2f2f392afb649de" + url: "https://pub.dev" + source: hosted + version: "1.0.4-dev.1" + dio: + dependency: transitive + description: + name: dio + sha256: "0dfb6b6a1979dac1c1245e17cef824d7b452ea29bd33d3467269f9bef3715fb0" + url: "https://pub.dev" + source: hosted + version: "5.6.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "36c5b2d79eb17cdae41e974b7a8284fec631651d2a6f39a8a2ff22327e90aeac" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + drift: + dependency: transitive + description: + name: drift + sha256: b50a8342c6ddf05be53bda1d246404cbad101b64dc73e8d6d1ac1090d119b4e2 + url: "https://pub.dev" + source: hosted + version: "2.15.0" + drift_db_viewer: + dependency: transitive + description: + name: drift_db_viewer + sha256: "5ea77858c52b55460a1e8f34ab5f88324621d486717d876fd745765fbc227f3f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + easy_stepper: + dependency: transitive + description: + name: easy_stepper + sha256: "77f3ab4ee3c867b5a2236bf712abb08fed2b1c533cf24cf3fcd46c2821072ffd" + url: "https://pub.dev" + source: hosted + version: "0.5.2+1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + url: "https://pub.dev" + source: hosted + version: "8.1.6" + flutter_dotenv: + dependency: transitive + description: + name: flutter_dotenv + sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77" + url: "https://pub.dev" + source: hosted + version: "5.1.0" + flutter_focus_watcher: + dependency: transitive + description: + name: flutter_focus_watcher + sha256: a72ee539ae0237961308a25839887ca93a0b1cb6f87b0d492b139c8fccff8e79 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility: + dependency: transitive + description: + name: flutter_keyboard_visibility + sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" + url: "https://pub.dev" + source: hosted + version: "5.4.1" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_web: + dependency: transitive + description: + name: flutter_keyboard_visibility_web + sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_spinkit: + dependency: transitive + description: + name: flutter_spinkit + sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 + url: "https://pub.dev" + source: hosted + version: "5.2.1" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + url: "https://pub.dev" + source: hosted + version: "2.0.10+1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_typeahead: + dependency: transitive + description: + name: flutter_typeahead + sha256: b9942bd5b7611a6ec3f0730c477146cffa4cd4b051077983ba67ddfc9e7ee818 + url: "https://pub.dev" + source: hosted + version: "4.8.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fluttertoast: + dependency: transitive + description: + name: fluttertoast + sha256: "81b68579e23fcbcada2db3d50302813d2371664afe6165bc78148050ab94bf66" + url: "https://pub.dev" + source: hosted + version: "8.2.5" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 + url: "https://pub.dev" + source: hosted + version: "2.4.4" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + google_fonts: + dependency: transitive + description: + name: google_fonts + sha256: "2776c66b3e97c6cdd58d1bd3281548b074b64f1fd5c8f82391f7456e38849567" + url: "https://pub.dev" + source: hosted + version: "4.0.5" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + group_radio_button: + dependency: transitive + description: + name: group_radio_button + sha256: "204de8d16b224be7fc72dade0c3afd410ff5a34417d89f74f0fd8be7a8c2b4d6" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + horizontal_data_table: + dependency: transitive + description: + name: horizontal_data_table + sha256: c8ab5256bbced698a729f3e0ff2cb0e8e97416cdbb082860370eaf883badf722 + url: "https://pub.dev" + source: hosted + version: "4.3.1" + http: + dependency: transitive + description: + name: http + sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba + url: "https://pub.dev" + source: hosted + version: "1.2.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + intl: + dependency: transitive + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + isar: + dependency: transitive + description: + name: isar + sha256: "99165dadb2cf2329d3140198363a7e7bff9bbd441871898a87e26914d25cf1ea" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + isar_flutter_libs: + dependency: transitive + description: + name: isar_flutter_libs + sha256: bc6768cc4b9c61aabff77152e7f33b4b17d2fc93134f7af1c3dd51500fe8d5e8 + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + lints: + dependency: transitive + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + location: + dependency: transitive + description: + name: location + sha256: "06be54f682c9073cbfec3899eb9bc8ed90faa0e17735c9d9fa7fe426f5be1dd1" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: "8aa1d34eeecc979d7c9fe372931d84f6d2ebbd52226a54fe1620de6fdc0753b1" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + location_web: + dependency: transitive + description: + name: location_web + sha256: ec484c66e8a4ff1ee5d044c203f4b6b71e3a0556a97b739a5bc9616de672412b + url: "https://pub.dev" + source: hosted + version: "4.2.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + lottie: + dependency: transitive + description: + name: lottie + sha256: a93542cc2d60a7057255405f62252533f8e8956e7e06754955669fd32fb4b216 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" + source: hosted + version: "0.12.16" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + meta: + dependency: transitive + description: + name: meta + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" + source: hosted + version: "1.10.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + mocktail: + dependency: transitive + description: + name: mocktail + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + overlay_builder: + dependency: transitive + description: + name: overlay_builder + sha256: "58b97bc5f67a2e2bb7006dd88e697ac757dfffc9dbd1e7dfc1917fb510a4b5c8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + path: + dependency: transitive + description: + name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" + source: hosted + version: "1.8.3" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" + source: hosted + version: "1.0.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + url: "https://pub.dev" + source: hosted + version: "2.1.4" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + url: "https://pub.dev" + source: hosted + version: "2.2.4" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointer_interceptor: + dependency: transitive + description: + name: pointer_interceptor + sha256: adf7a637f97c077041d36801b43be08559fd4322d2127b3f20bb7be1b9eebc22 + url: "https://pub.dev" + source: hosted + version: "0.9.3+7" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + reactive_flutter_typeahead: + dependency: transitive + description: + name: reactive_flutter_typeahead + sha256: ef91627df8cef70e603e8a6458749d8a99a385b78854332602fd08ad905cdab8 + url: "https://pub.dev" + source: hosted + version: "0.8.1" + reactive_forms: + dependency: transitive + description: + name: reactive_forms + sha256: "5aa9c48a0626c20d00a005e597cb10efbdebbfeecb9c4227b03a5945fbb91ec4" + url: "https://pub.dev" + source: hosted + version: "14.3.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + remove_emoji_input_formatter: + dependency: transitive + description: + name: remove_emoji_input_formatter + sha256: "82d195984f890de7a8fea936c698848e78c1a67ccefe18db3baf9f7a3bc0177f" + url: "https://pub.dev" + source: hosted + version: "0.0.1+1" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sqlite3: + dependency: transitive + description: + name: sqlite3 + sha256: "072128763f1547e3e9b4735ce846bfd226d68019ccda54db4cd427b12dfdedc9" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqlite3_flutter_libs: + dependency: transitive + description: + name: sqlite3_flutter_libs + sha256: "62bbb4073edbcdf53f40c80775f33eea01d301b7b81417e5b3fb7395416258c1" + url: "https://pub.dev" + source: hosted + version: "0.5.24" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + type_plus: + dependency: transitive + description: + name: type_plus + sha256: d5d1019471f0d38b91603adb9b5fd4ce7ab903c879d2fbf1a3f80a630a03fcc9 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + uuid: + dependency: transitive + description: + name: uuid + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" + source: hosted + version: "3.0.7" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + url: "https://pub.dev" + source: hosted + version: "5.2.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.2.0 <3.9.0" + flutter: ">=3.16.0" diff --git a/packages/complaints/example/pubspec.yaml b/packages/complaints/example/pubspec.yaml new file mode 100644 index 000000000..cfe25864a --- /dev/null +++ b/packages/complaints/example/pubspec.yaml @@ -0,0 +1,100 @@ +name: example +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: '>=3.0.0 <4.0.0' + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + digit_components: ^1.0.0+2 + digit_data_model: 1.0.4-dev.1 + flutter_bloc: + complaints: + path : ../ + + + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + assets: + - lib/localization_strings.json + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/apps/health_campaign_field_worker_app/lib/blocs/complaints_inbox/complaints_inbox.dart b/packages/complaints/lib/blocs/complaints_inbox/complaints_inbox.dart similarity index 83% rename from apps/health_campaign_field_worker_app/lib/blocs/complaints_inbox/complaints_inbox.dart rename to packages/complaints/lib/blocs/complaints_inbox/complaints_inbox.dart index 9bfb05c5f..689327ddf 100644 --- a/apps/health_campaign_field_worker_app/lib/blocs/complaints_inbox/complaints_inbox.dart +++ b/packages/complaints/lib/blocs/complaints_inbox/complaints_inbox.dart @@ -1,26 +1,30 @@ // GENERATED using mason_cli import 'dart:async'; +import 'package:digit_data_model/models/entities/pgr_application_status.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:digit_data_model/data_model.dart'; -import '../../models/complaints/complaints.dart'; -import '../../utils/environment_config.dart'; -import '../../utils/typedefs.dart'; +import '../../data/repositories/local/pgr_service.dart'; +import '../../data/repositories/remote/pgr_service.dart'; +import '../../models/pgr_complaints.dart'; +import '/models/complaints.dart'; +import '/utils/typedefs.dart'; +import '/utils/utils.dart'; part 'complaints_inbox.freezed.dart'; typedef ComplaintsInboxEmitter = Emitter; +/// Complaint inbox Bloc for Loading Complaints, Filtering Complaints, Sorting Complaints and Searching Complaints class ComplaintsInboxBloc extends Bloc { final PgrServiceDataRepository pgrRepository; ComplaintsInboxBloc( - super.initialState, { - required this.pgrRepository, - }) { + super.initialState, { + required this.pgrRepository, + }) { on(_handleLoadComplaints); on(_handleFilterComplaints); on(_handleSortComplaints); @@ -28,9 +32,9 @@ class ComplaintsInboxBloc } FutureOr _handleLoadComplaints( - ComplaintInboxLoadComplaintsEvent event, - ComplaintsInboxEmitter emit, - ) async { + ComplaintInboxLoadComplaintsEvent event, + ComplaintsInboxEmitter emit, + ) async { if (event.updatedModels != null) { emit(state.copyWith( complaints: event.updatedModels!, @@ -45,14 +49,14 @@ class ComplaintsInboxBloc if (pgrRepository is PgrServiceLocalRepository) { complaints = await (pgrRepository as PgrServiceLocalRepository).search( PgrServiceSearchModel( - tenantId: envConfig.variables.tenantId, + tenantId: ComplaintsSingleton().tenantId ), event.createdByUserId, ); } else if (pgrRepository is PgrServiceRemoteRepository) { complaints = await pgrRepository.search( PgrServiceSearchModel( - tenantId: envConfig.variables.tenantId, + tenantId: ComplaintsSingleton().tenantId ), ); } @@ -65,9 +69,9 @@ class ComplaintsInboxBloc } FutureOr _handleFilterComplaints( - ComplaintInboxFilterComplaintsEvent event, - ComplaintsInboxEmitter emit, - ) async { + ComplaintInboxFilterComplaintsEvent event, + ComplaintsInboxEmitter emit, + ) async { emit(state.copyWith(loading: true)); List complaints = []; @@ -75,7 +79,7 @@ class ComplaintsInboxBloc if (pgrRepository is PgrServiceLocalRepository) { complaints = await (pgrRepository as PgrServiceLocalRepository).search( PgrServiceSearchModel( - tenantId: envConfig.variables.tenantId, + tenantId: ComplaintsSingleton().tenantId, complaintAssignedTo: event.complaintAssignedTo, currentUserName: event.currentUserName, complaintStatus: event.complaintStatus, @@ -87,7 +91,7 @@ class ComplaintsInboxBloc } else if (pgrRepository is PgrServiceRemoteRepository) { complaints = await pgrRepository.search( PgrServiceSearchModel( - tenantId: envConfig.variables.tenantId, + tenantId: ComplaintsSingleton().tenantId, complaintAssignedTo: event.complaintAssignedTo, currentUserName: event.currentUserName, complaintStatus: event.complaintStatus, @@ -114,16 +118,16 @@ class ComplaintsInboxBloc } FutureOr _handleSortComplaints( - ComplaintInboxSortComplaintsEvent event, - ComplaintsInboxEmitter emit, - ) async { + ComplaintInboxSortComplaintsEvent event, + ComplaintsInboxEmitter emit, + ) async { var listToSort = (state.filteredComplaints.isNotEmpty) ? [...state.filteredComplaints] : [...state.complaints]; if (event.sortOrder == "COMPLAINT_SORT_DATE_ASC") { listToSort.sort( - (a, b) { + (a, b) { final d1 = a.auditDetails?.createdTime ?? 0; final d2 = b.auditDetails?.createdTime ?? 0; @@ -132,7 +136,7 @@ class ComplaintsInboxBloc ); } else { listToSort.sort( - (a, b) { + (a, b) { final d1 = b.auditDetails?.createdTime ?? 0; final d2 = a.auditDetails?.createdTime ?? 0; @@ -149,9 +153,9 @@ class ComplaintsInboxBloc } FutureOr _handleSearchComplaints( - ComplaintInboxSearchComplaintsEvent event, - ComplaintsInboxEmitter emit, - ) async { + ComplaintInboxSearchComplaintsEvent event, + ComplaintsInboxEmitter emit, + ) async { emit(state.copyWith(loading: true)); emit(state.copyWith( @@ -177,7 +181,7 @@ class ComplaintsInboxBloc if (pgrRepository is PgrServiceLocalRepository) { complaints = await (pgrRepository as PgrServiceLocalRepository).search( PgrServiceSearchModel( - tenantId: envConfig.variables.tenantId, + tenantId: ComplaintsSingleton().tenantId, complaintNumber: event.complaintNumber, complainantMobileNumber: event.mobileNumber, ), @@ -186,7 +190,7 @@ class ComplaintsInboxBloc } else if (pgrRepository is PgrServiceRemoteRepository) { complaints = await pgrRepository.search( PgrServiceSearchModel( - tenantId: envConfig.variables.tenantId, + tenantId: ComplaintsSingleton().tenantId, complaintNumber: event.complaintNumber, complainantMobileNumber: event.mobileNumber, ), diff --git a/apps/health_campaign_field_worker_app/lib/blocs/complaints_inbox/complaints_inbox.freezed.dart b/packages/complaints/lib/blocs/complaints_inbox/complaints_inbox.freezed.dart similarity index 100% rename from apps/health_campaign_field_worker_app/lib/blocs/complaints_inbox/complaints_inbox.freezed.dart rename to packages/complaints/lib/blocs/complaints_inbox/complaints_inbox.freezed.dart diff --git a/apps/health_campaign_field_worker_app/lib/blocs/complaints_registration/complaints_registration.dart b/packages/complaints/lib/blocs/complaints_registration/complaints_registration.dart similarity index 91% rename from apps/health_campaign_field_worker_app/lib/blocs/complaints_registration/complaints_registration.dart rename to packages/complaints/lib/blocs/complaints_registration/complaints_registration.dart index 2f08d9f79..145d775b7 100644 --- a/apps/health_campaign_field_worker_app/lib/blocs/complaints_registration/complaints_registration.dart +++ b/packages/complaints/lib/blocs/complaints_registration/complaints_registration.dart @@ -2,18 +2,22 @@ import 'dart:async'; import 'package:digit_data_model/data_model.dart'; +import 'package:digit_data_model/models/entities/pgr_application_status.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import '../../models/complaints/complaints.dart'; -import '../../models/entities/additional_fields_type.dart'; -import '../../utils/environment_config.dart'; -import '../../utils/typedefs.dart'; +import '../../models/pgr_address.dart'; +import '../../models/pgr_complaints.dart'; +import '/models/complaints.dart'; +import '/models/entities/additional_fields_type.dart'; +import '/utils/typedefs.dart'; +import '/utils/utils.dart'; part 'complaints_registration.freezed.dart'; typedef ComplaintsRegistrationEmitter = Emitter; +/// Complaints Registration Bloc for managing Complaint state (i.e. complaint type, complaint location and complaint details) class ComplaintsRegistrationBloc extends Bloc { final PgrServiceDataRepository pgrServiceRepository; @@ -28,10 +32,12 @@ class ComplaintsRegistrationBloc on(_handleSubmitComplaints); } + FutureOr _handleSaveComplaintType( ComplaintsRegistrationSaveComplaintTypeEvent event, ComplaintsRegistrationEmitter emit, ) async { + state.maybeMap( orElse: () => throw (const InvalidComplaintsRegistrationStateException()), create: (value) { @@ -83,9 +89,12 @@ class ComplaintsRegistrationBloc ComplaintsRegistrationSubmitComplaintEvent event, ComplaintsRegistrationEmitter emit, ) async { + + await state.maybeMap( orElse: () => throw (const InvalidComplaintsRegistrationStateException()), create: (value) async { + emit(value.copyWith(loading: true)); final serviceCode = value.complaintType; @@ -93,13 +102,14 @@ class ComplaintsRegistrationBloc value.otherComplaintTypeDescription; final complaintDetailsModel = value.complaintsDetailsModel; final address = value.addressModel; - if (serviceCode == null) { throw (const InvalidComplaintsRegistrationStateException( 'Complaint type is not provided', )); } + + if (complaintDetailsModel == null) { throw (const InvalidComplaintsRegistrationStateException( 'Complaint details are not provided', @@ -125,13 +135,15 @@ class ComplaintsRegistrationBloc final pgrServiceModel = PgrServiceModel( clientReferenceId: referenceId, - tenantId: envConfig.variables.tenantId, + tenantId: ComplaintsSingleton().tenantId, serviceCode: serviceCode, description: description, + source: AdditionalFieldsType.mobile.toValue(), + /// created Enum for application status in Digit Data model entities and using it here applicationStatus: PgrServiceApplicationStatus.created, user: PgrComplainantModel( - tenantId: envConfig.variables.tenantId, + tenantId: ComplaintsSingleton().tenantId, clientReferenceId: IdGen.i.identifier, complaintClientReferenceId: referenceId, name: complaintDetailsModel.complainantName, diff --git a/apps/health_campaign_field_worker_app/lib/blocs/complaints_registration/complaints_registration.freezed.dart b/packages/complaints/lib/blocs/complaints_registration/complaints_registration.freezed.dart similarity index 100% rename from apps/health_campaign_field_worker_app/lib/blocs/complaints_registration/complaints_registration.freezed.dart rename to packages/complaints/lib/blocs/complaints_registration/complaints_registration.freezed.dart diff --git a/packages/complaints/lib/blocs/localization/app_localization.dart b/packages/complaints/lib/blocs/localization/app_localization.dart new file mode 100644 index 000000000..7d1980c19 --- /dev/null +++ b/packages/complaints/lib/blocs/localization/app_localization.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; + +import '/blocs/localization/complaints_localization_delegate.dart'; + +// Class responsible for handling complaints localization +class ComplaintsLocalization { + final Locale locale; + final Future localizedStrings; + final List languages; + + ComplaintsLocalization(this.locale, this.localizedStrings, this.languages); + + // Method to get the current localization instance from context + static ComplaintsLocalization of(BuildContext context) { + return Localizations.of( + context, ComplaintsLocalization)!; + } + + static final List _localizedStrings = []; + + // Method to get the delegate for localization + static LocalizationsDelegate getDelegate( + Future localizedStrings, List languages) => + ComplaintsLocalizationDelegate(localizedStrings, languages); + + // Method to load localized strings + Future load() async { + _localizedStrings.clear(); + // Iterate over localized strings and filter based on locale + for (var element in await localizedStrings) { + if (element.locale == '${locale.languageCode}_${locale.countryCode}') { + _localizedStrings.add(element); + } + } + + return true; + } + + // Method to translate a given localized value + String translate(String localizedValues) { + if (_localizedStrings.isEmpty) { + return localizedValues; + } else { + final index = _localizedStrings.indexWhere( + (medium) => medium.code == localizedValues, + ); + + return index != -1 ? _localizedStrings[index].message : localizedValues; + } + } +} \ No newline at end of file diff --git a/packages/complaints/lib/blocs/localization/complaints_localization_delegate.dart b/packages/complaints/lib/blocs/localization/complaints_localization_delegate.dart new file mode 100644 index 000000000..cc94a2ad5 --- /dev/null +++ b/packages/complaints/lib/blocs/localization/complaints_localization_delegate.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +import 'app_localization.dart'; + +class ComplaintsLocalizationDelegate + extends LocalizationsDelegate { + final Future localizedStrings; + final List languages; + + const ComplaintsLocalizationDelegate(this.localizedStrings, this.languages); + + @override + bool isSupported(Locale locale) { + return languages.map((e) { + final results = e.value.split('_'); + if (results.isNotEmpty) return results.first; + }).contains(locale.languageCode); + } + + @override + Future load(Locale locale) async { + ComplaintsLocalization localization = + ComplaintsLocalization(locale, localizedStrings, languages); + await localization.load(); + + return localization; + } + + @override + bool shouldReload( + covariant LocalizationsDelegate old) { + return true; + } +} diff --git a/packages/complaints/lib/complaints.dart b/packages/complaints/lib/complaints.dart new file mode 100644 index 000000000..6b79e911e --- /dev/null +++ b/packages/complaints/lib/complaints.dart @@ -0,0 +1,29 @@ +@MappableLib( + generateInitializerForScope: InitializerScope.package, +) + +library complaints; + + +import 'package:dart_mappable/dart_mappable.dart'; +export 'pages/inbox/complaints_inbox_wrapper.dart'; +export 'pages/inbox/complaints_details_view.dart'; +export 'pages/inbox/complaints_inbox.dart'; +export 'pages/inbox/complaints_inbox_filter.dart'; +export 'pages/inbox/complaints_inbox_search.dart'; +export 'pages/inbox/complaints_inbox_sort.dart'; +export 'pages/registration/complaint_type.dart'; +export 'pages/registration/complaints_details.dart'; +export 'pages/registration/complaints_location.dart'; +export 'pages/registration/complaints_registration_wrapper.dart'; +export 'pages/complaints_acknowledgement.dart'; +export 'utils/utils.dart'; +export 'models/complaints.dart'; +export 'models/pgr_complaints.dart'; +export 'models/pgr_address.dart'; +export 'models/pgr_complaints_response.dart'; +export 'data/repositories/local/pgr_service.dart'; +export 'data/repositories/remote/pgr_service.dart'; +export 'data/repositories/oplog/oplog.dart'; +export 'blocs/complaints_inbox/complaints_inbox.dart'; +export 'blocs/complaints_registration/complaints_registration.dart'; \ No newline at end of file diff --git a/packages/complaints/lib/complaints.init.dart b/packages/complaints/lib/complaints.init.dart new file mode 100644 index 000000000..58b0922f9 --- /dev/null +++ b/packages/complaints/lib/complaints.init.dart @@ -0,0 +1,28 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element + +import 'models/entities/additional_fields_type.dart' as p0; +import 'models/pgr_address.dart' as p1; +import 'models/pgr_complaints.dart' as p2; +import 'models/pgr_complaints_response.dart' as p3; + +void initializeMappers() { + p0.AdditionalFieldsTypeMapper.ensureInitialized(); + p1.PgrAddressModelMapper.ensureInitialized(); + p1.GeoLocationMapper.ensureInitialized(); + p2.PgrComplaintModelMapper.ensureInitialized(); + p2.PgrComplainantModelMapper.ensureInitialized(); + p2.PgrRolesModelMapper.ensureInitialized(); + p2.PgrServiceSearchModelMapper.ensureInitialized(); + p2.PgrServiceModelMapper.ensureInitialized(); + p2.PgrWorkflowModelMapper.ensureInitialized(); + p2.PgrFiltersMapper.ensureInitialized(); + p2.PgrSearchKeysMapper.ensureInitialized(); + p2.PgrAdditionalDetailsMapper.ensureInitialized(); + p3.PgrServiceCreateResponseModelMapper.ensureInitialized(); + p3.PgrComplaintResponseModelMapper.ensureInitialized(); + p3.PgrComplainantResponseModelMapper.ensureInitialized(); + p3.PgrServiceResponseModelMapper.ensureInitialized(); +} diff --git a/packages/digit_data_model/lib/data/repositories/local/pgr_service.dart b/packages/complaints/lib/data/repositories/local/pgr_service.dart similarity index 98% rename from packages/digit_data_model/lib/data/repositories/local/pgr_service.dart rename to packages/complaints/lib/data/repositories/local/pgr_service.dart index ecdae8103..5b2283941 100644 --- a/packages/digit_data_model/lib/data/repositories/local/pgr_service.dart +++ b/packages/complaints/lib/data/repositories/local/pgr_service.dart @@ -3,6 +3,10 @@ import 'dart:async'; import 'package:digit_data_model/data_model.dart'; import 'package:drift/drift.dart'; +import '../../../models/pgr_address.dart'; +import '../../../models/pgr_complaints.dart'; + +// This will create , update and search data from local Repository class PgrServiceLocalRepository extends LocalRepository { PgrServiceLocalRepository(super.sql, super.opLogManager); @@ -189,7 +193,6 @@ class PgrServiceLocalRepository code: address.localityBoundaryCode ?? "", ), - /// boundary: address.boundary, geoLocation: GeoLocation( latitude: address.latitude, longitude: address.longitude, diff --git a/packages/complaints/lib/data/repositories/oplog/oplog.dart b/packages/complaints/lib/data/repositories/oplog/oplog.dart new file mode 100644 index 000000000..7e79e9ba6 --- /dev/null +++ b/packages/complaints/lib/data/repositories/oplog/oplog.dart @@ -0,0 +1,96 @@ +import 'dart:async'; + +import 'package:digit_data_model/data_model.dart'; +import 'package:isar/isar.dart'; + + +import '../../../models/pgr_complaints.dart'; + +class PgrServiceOpLogManager extends OpLogManager { + PgrServiceOpLogManager(super.isar); + + @override + PgrServiceModel applyServerGeneratedIdToEntity( + PgrServiceModel entity, + String serverGeneratedId, + int rowVersion, + ) => + entity.copyWith( + serviceRequestId: serverGeneratedId, + rowVersion: rowVersion, + ); + + @override + String getClientReferenceId(PgrServiceModel entity) { + return entity.clientReferenceId; + } + + @override + String? getServerGeneratedId(PgrServiceModel entity) { + return entity.serviceRequestId; + } + + @override + int? getRowVersion(PgrServiceModel entity) => entity.rowVersion; + + @override + bool? getNonRecoverableError(PgrServiceModel entity) => + entity.nonRecoverableError; + + @override + Future>> getPendingUpSync( + DataModelType type, { + required String createdBy, + }) async { + final pendingEntries = await isar.opLogs + .filter() + .entityTypeEqualTo(type) + .operationEqualTo(DataOperation.create) + .serverGeneratedIdIsNull() + .syncedUpEqualTo(false) + .syncedDownEqualTo(false) + .createdByEqualTo(createdBy) + .sortByCreatedAt() + .findAll(); + + final entriesList = pendingEntries.map((e) { + return OpLogEntry.fromOpLog(e); + }).toList(); + + return entriesList; + } + + //Note: PendingDownSync is not required for PGR Create Oplogs. This creates Mapper Exception issue for checking pending downsync entries of complaints type + // @override + // Future>> getPendingDownSync( + // DataModelType type, { + // required String createdBy, + // }) async { + // final pendingEntries = await isar.opLogs + // .filter() + // .entityTypeEqualTo(type) + // .serverGeneratedIdIsNotNull() + // .syncedUpEqualTo(true) + // .syncedDownEqualTo(false) + // .createdByEqualTo(createdBy) + // .sortByCreatedAt() + // .findAll(); + // + // final entriesList = pendingEntries + // .map((e) { + // final entity = e.getEntity(); + // if ([ + // PgrServiceApplicationStatus.created, + // PgrServiceApplicationStatus.pendingAssignment, + // ].contains(entity.applicationStatus)) { + // return OpLogEntry.fromOpLog(e); + // } + // + // return null; + // }) + // .whereNotNull() + // .toList(); + // + // return entriesList; + // } +} diff --git a/packages/digit_data_model/lib/data/repositories/remote/pgr_service.dart b/packages/complaints/lib/data/repositories/remote/pgr_service.dart similarity index 94% rename from packages/digit_data_model/lib/data/repositories/remote/pgr_service.dart rename to packages/complaints/lib/data/repositories/remote/pgr_service.dart index 0e11a5a89..6db675651 100644 --- a/packages/digit_data_model/lib/data/repositories/remote/pgr_service.dart +++ b/packages/complaints/lib/data/repositories/remote/pgr_service.dart @@ -3,6 +3,10 @@ import 'dart:async'; import 'package:digit_data_model/data_model.dart'; import 'package:dio/dio.dart'; +import '../../../models/pgr_complaints.dart'; +import '../../../models/pgr_complaints_response.dart'; + +// This will create , update and search data from remote Repository class PgrServiceRemoteRepository extends RemoteRepository { PgrServiceRemoteRepository( diff --git a/apps/health_campaign_field_worker_app/lib/models/complaints/complaints.dart b/packages/complaints/lib/models/complaints.dart similarity index 100% rename from apps/health_campaign_field_worker_app/lib/models/complaints/complaints.dart rename to packages/complaints/lib/models/complaints.dart diff --git a/apps/health_campaign_field_worker_app/lib/models/complaints/complaints.freezed.dart b/packages/complaints/lib/models/complaints.freezed.dart similarity index 100% rename from apps/health_campaign_field_worker_app/lib/models/complaints/complaints.freezed.dart rename to packages/complaints/lib/models/complaints.freezed.dart diff --git a/apps/health_campaign_field_worker_app/lib/models/complaints/complaints.g.dart b/packages/complaints/lib/models/complaints.g.dart similarity index 100% rename from apps/health_campaign_field_worker_app/lib/models/complaints/complaints.g.dart rename to packages/complaints/lib/models/complaints.g.dart diff --git a/packages/complaints/lib/models/entities/additional_fields_type.dart b/packages/complaints/lib/models/entities/additional_fields_type.dart new file mode 100644 index 000000000..32370f908 --- /dev/null +++ b/packages/complaints/lib/models/entities/additional_fields_type.dart @@ -0,0 +1,10 @@ +// Generated using mason. Do not modify by hand +import 'package:dart_mappable/dart_mappable.dart'; + +part 'additional_fields_type.mapper.dart'; +@MappableEnum(caseStyle: CaseStyle.upperCase) +enum AdditionalFieldsType { + @MappableValue("mobile") mobile, + @MappableValue("EMPLOYEE") employee, + ; +} \ No newline at end of file diff --git a/packages/complaints/lib/models/entities/additional_fields_type.mapper.dart b/packages/complaints/lib/models/entities/additional_fields_type.mapper.dart new file mode 100644 index 000000000..cf6a34c4d --- /dev/null +++ b/packages/complaints/lib/models/entities/additional_fields_type.mapper.dart @@ -0,0 +1,53 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'additional_fields_type.dart'; + +class AdditionalFieldsTypeMapper extends EnumMapper { + AdditionalFieldsTypeMapper._(); + + static AdditionalFieldsTypeMapper? _instance; + static AdditionalFieldsTypeMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AdditionalFieldsTypeMapper._()); + } + return _instance!; + } + + static AdditionalFieldsType fromValue(dynamic value) { + ensureInitialized(); + return MapperContainer.globals.fromValue(value); + } + + @override + AdditionalFieldsType decode(dynamic value) { + switch (value) { + case "mobile": + return AdditionalFieldsType.mobile; + case "EMPLOYEE": + return AdditionalFieldsType.employee; + default: + throw MapperException.unknownEnumValue(value); + } + } + + @override + dynamic encode(AdditionalFieldsType self) { + switch (self) { + case AdditionalFieldsType.mobile: + return "mobile"; + case AdditionalFieldsType.employee: + return "EMPLOYEE"; + } + } +} + +extension AdditionalFieldsTypeMapperExtension on AdditionalFieldsType { + dynamic toValue() { + AdditionalFieldsTypeMapper.ensureInitialized(); + return MapperContainer.globals.toValue(this); + } +} diff --git a/packages/complaints/lib/models/entities/complaint_types.dart b/packages/complaints/lib/models/entities/complaint_types.dart new file mode 100644 index 000000000..21b8fb33a --- /dev/null +++ b/packages/complaints/lib/models/entities/complaint_types.dart @@ -0,0 +1,5 @@ + +class ComplaintTypes { + late String name; + late String code; +} diff --git a/packages/digit_data_model/lib/models/pgr_complaints/pgr_address.dart b/packages/complaints/lib/models/pgr_address.dart similarity index 99% rename from packages/digit_data_model/lib/models/pgr_complaints/pgr_address.dart rename to packages/complaints/lib/models/pgr_address.dart index 8ad0b89e3..195b74e08 100644 --- a/packages/digit_data_model/lib/models/pgr_complaints/pgr_address.dart +++ b/packages/complaints/lib/models/pgr_address.dart @@ -49,10 +49,8 @@ class PgrAddressModel extends EntityModel with PgrAddressModelMappable { this.isDeleted, this.rowVersion, super.auditDetails, - }) : super(isDeleted: false); - AddressCompanion get companion { return AddressCompanion( auditCreatedBy: Value(auditDetails?.createdBy), diff --git a/packages/digit_data_model/lib/models/pgr_complaints/pgr_address.mapper.dart b/packages/complaints/lib/models/pgr_address.mapper.dart similarity index 100% rename from packages/digit_data_model/lib/models/pgr_complaints/pgr_address.mapper.dart rename to packages/complaints/lib/models/pgr_address.mapper.dart diff --git a/packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints.dart b/packages/complaints/lib/models/pgr_complaints.dart similarity index 96% rename from packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints.dart rename to packages/complaints/lib/models/pgr_complaints.dart index a28dbf64f..d061228ab 100644 --- a/packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints.dart +++ b/packages/complaints/lib/models/pgr_complaints.dart @@ -1,7 +1,9 @@ import 'dart:convert'; +import 'package:complaints/models/pgr_address.dart'; import 'package:dart_mappable/dart_mappable.dart'; import 'package:digit_data_model/data_model.dart'; +import 'package:digit_data_model/models/entities/pgr_application_status.dart'; import 'package:drift/drift.dart'; part 'pgr_complaints.mapper.dart'; @@ -204,20 +206,6 @@ class PgrWorkflowModel extends EntityModel with PgrWorkflowModelMappable { }) : super(); } -@MappableEnum() -enum PgrServiceApplicationStatus { - @MappableValue('CREATED') - created, - @MappableValue('PENDING_ASSIGNMENT') - pendingAssignment, - @MappableValue('RESOLVED') - resolved, - @MappableValue('REJECTED') - rejected, - @MappableValue('CANCELLED') - cancelled, -} - @MappableClass(ignoreNull: true) class PgrFilters with PgrFiltersMappable { String? complaintAssignedTo; diff --git a/packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints.mapper.dart b/packages/complaints/lib/models/pgr_complaints.mapper.dart similarity index 97% rename from packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints.mapper.dart rename to packages/complaints/lib/models/pgr_complaints.mapper.dart index 87d606df4..be32e8224 100644 --- a/packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints.mapper.dart +++ b/packages/complaints/lib/models/pgr_complaints.mapper.dart @@ -6,67 +6,6 @@ part of 'pgr_complaints.dart'; -class PgrServiceApplicationStatusMapper - extends EnumMapper { - PgrServiceApplicationStatusMapper._(); - - static PgrServiceApplicationStatusMapper? _instance; - static PgrServiceApplicationStatusMapper ensureInitialized() { - if (_instance == null) { - MapperContainer.globals - .use(_instance = PgrServiceApplicationStatusMapper._()); - } - return _instance!; - } - - static PgrServiceApplicationStatus fromValue(dynamic value) { - ensureInitialized(); - return MapperContainer.globals.fromValue(value); - } - - @override - PgrServiceApplicationStatus decode(dynamic value) { - switch (value) { - case 'CREATED': - return PgrServiceApplicationStatus.created; - case 'PENDING_ASSIGNMENT': - return PgrServiceApplicationStatus.pendingAssignment; - case 'RESOLVED': - return PgrServiceApplicationStatus.resolved; - case 'REJECTED': - return PgrServiceApplicationStatus.rejected; - case 'CANCELLED': - return PgrServiceApplicationStatus.cancelled; - default: - throw MapperException.unknownEnumValue(value); - } - } - - @override - dynamic encode(PgrServiceApplicationStatus self) { - switch (self) { - case PgrServiceApplicationStatus.created: - return 'CREATED'; - case PgrServiceApplicationStatus.pendingAssignment: - return 'PENDING_ASSIGNMENT'; - case PgrServiceApplicationStatus.resolved: - return 'RESOLVED'; - case PgrServiceApplicationStatus.rejected: - return 'REJECTED'; - case PgrServiceApplicationStatus.cancelled: - return 'CANCELLED'; - } - } -} - -extension PgrServiceApplicationStatusMapperExtension - on PgrServiceApplicationStatus { - dynamic toValue() { - PgrServiceApplicationStatusMapper.ensureInitialized(); - return MapperContainer.globals.toValue(this); - } -} - class PgrComplaintModelMapper extends ClassMapperBase { PgrComplaintModelMapper._(); diff --git a/packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints_response.dart b/packages/complaints/lib/models/pgr_complaints_response.dart similarity index 94% rename from packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints_response.dart rename to packages/complaints/lib/models/pgr_complaints_response.dart index dd869dad6..fde4e7c88 100644 --- a/packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints_response.dart +++ b/packages/complaints/lib/models/pgr_complaints_response.dart @@ -1,6 +1,8 @@ +import 'package:complaints/models/pgr_complaints.dart'; import 'package:dart_mappable/dart_mappable.dart'; import 'package:digit_data_model/data_model.dart'; +import 'package:digit_data_model/models/entities/pgr_application_status.dart'; part 'pgr_complaints_response.mapper.dart'; diff --git a/packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints_response.mapper.dart b/packages/complaints/lib/models/pgr_complaints_response.mapper.dart similarity index 100% rename from packages/digit_data_model/lib/models/pgr_complaints/pgr_complaints_response.mapper.dart rename to packages/complaints/lib/models/pgr_complaints_response.mapper.dart diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints_acknowledgement.dart b/packages/complaints/lib/pages/complaints_acknowledgement.dart similarity index 89% rename from apps/health_campaign_field_worker_app/lib/pages/complaints_acknowledgement.dart rename to packages/complaints/lib/pages/complaints_acknowledgement.dart index a51d6eb69..968a452e6 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints_acknowledgement.dart +++ b/packages/complaints/lib/pages/complaints_acknowledgement.dart @@ -1,7 +1,10 @@ + +import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; import 'package:flutter/material.dart'; -import '../router/app_router.dart'; + + import '../utils/i18_key_constants.dart' as i18; import '../widgets/localized.dart'; @@ -14,10 +17,10 @@ class ComplaintsAcknowledgementPage extends LocalizedStatefulWidget { @override State createState() => - _ComplaintsAcknowledgementPageState(); + ComplaintsAcknowledgementPageState(); } -class _ComplaintsAcknowledgementPageState +class ComplaintsAcknowledgementPageState extends LocalizedState { @override Widget build(BuildContext context) { diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_details_view.dart b/packages/complaints/lib/pages/inbox/complaints_details_view.dart similarity index 96% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_details_view.dart rename to packages/complaints/lib/pages/inbox/complaints_details_view.dart index b4c644922..368a8c8df 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_details_view.dart +++ b/packages/complaints/lib/pages/inbox/complaints_details_view.dart @@ -1,14 +1,15 @@ +import 'package:auto_route/annotations.dart'; +import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_components/widgets/atoms/digit_divider.dart'; import 'package:flutter/material.dart'; import 'package:recase/recase.dart'; -import 'package:digit_data_model/data_model.dart'; -import '../../../blocs/localization/app_localization.dart'; -import '../../../router/app_router.dart'; -import '../../../utils/i18_key_constants.dart' as i18; -import '../../../utils/utils.dart'; -import '../../../widgets/header/back_navigation_help_header.dart'; +import '../../models/pgr_complaints.dart'; +import '/blocs/localization/app_localization.dart'; +import '/utils/i18_key_constants.dart' as i18; +import '/utils/utils.dart'; +import '/widgets/header/back_navigation_help_header.dart'; @RoutePage() class ComplaintsDetailsViewPage extends StatelessWidget { @@ -23,7 +24,7 @@ class ComplaintsDetailsViewPage extends StatelessWidget { Widget build(BuildContext context) { final router = context.router; final theme = Theme.of(context); - final localizations = AppLocalizations.of(context); + final localizations = ComplaintsLocalization.of(context); return Scaffold( body: ScrollableContent( diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox.dart b/packages/complaints/lib/pages/inbox/complaints_inbox.dart similarity index 80% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox.dart rename to packages/complaints/lib/pages/inbox/complaints_inbox.dart index ce0b8f0b6..ed04baa35 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox.dart +++ b/packages/complaints/lib/pages/inbox/complaints_inbox.dart @@ -1,17 +1,19 @@ +import 'package:auto_route/annotations.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:complaints/router/complaints_router.gm.dart'; import 'package:digit_components/digit_components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:digit_data_model/data_model.dart'; import 'package:recase/recase.dart'; -import '../../../blocs/complaints_inbox/complaints_inbox.dart'; -import '../../../blocs/localization/app_localization.dart'; -import '../../../router/app_router.dart'; -import '../../../utils/i18_key_constants.dart' as i18; -import '../../../utils/utils.dart'; -import '../../../widgets/header/back_navigation_help_header.dart'; -import '../../../widgets/localized.dart'; -import '../../../widgets/no_result_card/no_result_card.dart'; +import '../../models/pgr_complaints.dart'; +import '/blocs/complaints_inbox/complaints_inbox.dart'; +import '/blocs/localization/app_localization.dart'; +import '/utils/i18_key_constants.dart' as i18; +import '/utils/utils.dart'; +import '/widgets/header/back_navigation_help_header.dart'; +import '/widgets/localized.dart'; +import '/widgets/no_result_card/no_result_card.dart'; @RoutePage() class ComplaintsInboxPage extends LocalizedStatefulWidget { @@ -21,10 +23,10 @@ class ComplaintsInboxPage extends LocalizedStatefulWidget { }); @override - State createState() => _ComplaintsInboxPageState(); + State createState() => ComplaintsInboxPageState(); } -class _ComplaintsInboxPageState extends LocalizedState { +class ComplaintsInboxPageState extends LocalizedState { @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -50,7 +52,7 @@ class _ComplaintsInboxPageState extends LocalizedState { SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.only( - left: kPadding*2, + left: kPadding * 2, bottom: kPadding, ), child: Text( @@ -69,7 +71,8 @@ class _ComplaintsInboxPageState extends LocalizedState { TextButton( style: TextButton.styleFrom( foregroundColor: theme.colorScheme.secondary, - padding: const EdgeInsets.only(left: kPadding*2), + padding: + const EdgeInsets.only(left: kPadding * 2), ), onPressed: () { router.push(ComplaintsInboxSearchRoute()); @@ -77,7 +80,9 @@ class _ComplaintsInboxPageState extends LocalizedState { child: Row( children: [ const Icon(Icons.search), - const SizedBox(width: 5,), + const SizedBox( + width: 5, + ), Text(localizations.translate( i18.complaints.searchCTA, )), @@ -95,7 +100,9 @@ class _ComplaintsInboxPageState extends LocalizedState { child: Row( children: [ const Icon(Icons.filter_list_alt), - const SizedBox(width: 5,), + const SizedBox( + width: 5, + ), Text(localizations.translate( i18.complaints.filterCTA, )), @@ -105,7 +112,8 @@ class _ComplaintsInboxPageState extends LocalizedState { TextButton( style: TextButton.styleFrom( foregroundColor: theme.colorScheme.secondary, - padding: const EdgeInsets.only(right: kPadding*2), + padding: + const EdgeInsets.only(right: kPadding * 2), ), onPressed: () { router.push(ComplaintsInboxSortRoute()); @@ -113,7 +121,9 @@ class _ComplaintsInboxPageState extends LocalizedState { child: Row( children: [ const Icon(Icons.segment), - const SizedBox(width: 5,), + const SizedBox( + width: 5, + ), Text(localizations.translate( i18.complaints.sortCTA, )), @@ -160,35 +170,36 @@ class _ComplaintsInboxPageState extends LocalizedState { margin: const EdgeInsets.fromLTRB(0, kPadding, 0, 0), padding: const EdgeInsets.fromLTRB(kPadding, 0, kPadding, 0), child: DigitElevatedButton( - onPressed: () async { - var loggedInUserUuid = context.loggedInUserUuid; - final bloc = context.read(); + onPressed: () async { + var loggedInUserUuid = + ComplaintsSingleton().loggedInUserUuid; + final bloc = context.read(); - await router.push( - ComplaintsRegistrationWrapperRoute(), - ); + await router.push( + ComplaintsRegistrationWrapperRoute(), + ); - try { - bloc.add( - ComplaintInboxLoadComplaintsEvent( - createdByUserId: loggedInUserUuid, - ), - ); - } catch (error) { - AppLogger.instance.error( - title: 'Error', - message: 'Error while loading complaints', - ); - } - }, - child: Center( - child: Text( - localizations.translate( - i18.complaints.fileComplaintAction, + try { + bloc.add( + ComplaintInboxLoadComplaintsEvent( + createdByUserId: loggedInUserUuid, ), + ); + } catch (error) { + AppLogger.instance.error( + title: 'Error', + message: 'Error while loading complaints', + ); + } + }, + child: Center( + child: Text( + localizations.translate( + i18.complaints.fileComplaintAction, ), ), ), + ), ), ), ], @@ -200,7 +211,7 @@ class _ComplaintsInboxPageState extends LocalizedState { } class _ComplaintsInboxItem extends StatelessWidget { - final AppLocalizations localizations; + final ComplaintsLocalization localizations; final PgrServiceModel item; const _ComplaintsInboxItem({ @@ -334,7 +345,7 @@ class _ComplaintsInboxItem extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(top: kPadding*2), + padding: const EdgeInsets.only(top: kPadding * 2), child: Row( children: [ Expanded( @@ -356,7 +367,11 @@ class _ComplaintsInboxItem extends StatelessWidget { ), child: Text( localizations.translate(i18.searchBeneficiary.iconLabel), - style: DigitTheme.instance.mobileTheme.textTheme.headlineSmall?.apply(color: theme.colorScheme.secondary,), + style: DigitTheme + .instance.mobileTheme.textTheme.headlineSmall + ?.apply( + color: theme.colorScheme.secondary, + ), ), ), ), diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_filter.dart b/packages/complaints/lib/pages/inbox/complaints_inbox_filter.dart similarity index 93% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_filter.dart rename to packages/complaints/lib/pages/inbox/complaints_inbox_filter.dart index 5f27d8a07..64afb6256 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_filter.dart +++ b/packages/complaints/lib/pages/inbox/complaints_inbox_filter.dart @@ -1,20 +1,22 @@ import 'dart:collection'; + +import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_components/widgets/atoms/digit_checkbox.dart'; -import 'package:digit_data_model/data_model.dart'; + +import 'package:digit_data_model/models/entities/pgr_application_status.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:group_radio_button/group_radio_button.dart'; import 'package:reactive_forms/reactive_forms.dart'; import 'package:recase/recase.dart'; -import '../../../blocs/auth/auth.dart'; -import '../../../blocs/complaints_inbox/complaints_inbox.dart'; -import '../../../router/app_router.dart'; -import '../../../utils/i18_key_constants.dart' as i18; -import '../../../utils/utils.dart'; -import '../../../widgets/localized.dart'; +import '/blocs/complaints_inbox/complaints_inbox.dart'; + +import '/utils/i18_key_constants.dart' as i18; +import '/utils/utils.dart'; +import '/widgets/localized.dart'; @RoutePage() class ComplaintsInboxFilterPage extends LocalizedStatefulWidget { @@ -25,10 +27,10 @@ class ComplaintsInboxFilterPage extends LocalizedStatefulWidget { @override State createState() => - _ComplaintsInboxFilterPageState(); + ComplaintsInboxFilterPageState(); } -class _ComplaintsInboxFilterPageState +class ComplaintsInboxFilterPageState extends LocalizedState { static const _complaintType = "complaintType"; static const _complaintLocality = "complaintLocality"; @@ -132,6 +134,7 @@ class _ComplaintsInboxFilterPageState ), ], ), + enableFixedButton: true, footer: SizedBox( child: DigitCard( margin: const EdgeInsets.fromLTRB(0, kPadding, 0, 0), @@ -168,7 +171,6 @@ class _ComplaintsInboxFilterPageState if (!formGroup.valid) return; final bloc = context.read(); - final userBloc = context.read(); final assignedTo = formGroup .control(_complaintAssignmentType) @@ -185,21 +187,13 @@ class _ComplaintsInboxFilterPageState bloc.add( ComplaintInboxFilterComplaintsEvent( complaintAssignedTo: assignedTo, - currentUserName: userBloc.state.whenOrNull( - authenticated: ( - accessToken, - refreshToken, - userModel, - actions, - individualId, - ) { - return userModel.name; - }, - ), + currentUserName: + ComplaintsSingleton().loggedInUserName, complaintTypeCode: complaintType, locality: locality, complaintStatus: statuses.toList(), - createdByUserId: context.loggedInUserUuid, + createdByUserId: + ComplaintsSingleton().loggedInUserUuid, ), ); diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_search.dart b/packages/complaints/lib/pages/inbox/complaints_inbox_search.dart similarity index 94% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_search.dart rename to packages/complaints/lib/pages/inbox/complaints_inbox_search.dart index bb6d3dcfe..c44542c29 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_search.dart +++ b/packages/complaints/lib/pages/inbox/complaints_inbox_search.dart @@ -1,13 +1,15 @@ + +import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:reactive_forms/reactive_forms.dart'; -import '../../../blocs/complaints_inbox/complaints_inbox.dart'; -import '../../../router/app_router.dart'; -import '../../../utils/i18_key_constants.dart' as i18; -import '../../../utils/utils.dart'; -import '../../../widgets/localized.dart'; +import '/blocs/complaints_inbox/complaints_inbox.dart'; + +import '/utils/i18_key_constants.dart' as i18; +import '/utils/utils.dart'; +import '/widgets/localized.dart'; import 'package:flutter/services.dart'; @RoutePage() @@ -19,10 +21,10 @@ class ComplaintsInboxSearchPage extends LocalizedStatefulWidget { @override State createState() => - _ComplaintsInboxSearchPageState(); + ComplaintsInboxSearchPageState(); } -class _ComplaintsInboxSearchPageState +class ComplaintsInboxSearchPageState extends LocalizedState { static const _complaintNumber = "complaintNumber"; static const _mobileNumber = "mobileNumber"; @@ -106,7 +108,7 @@ class _ComplaintsInboxSearchPageState complaintNumber: complaintNumberValue == "" ? null : complaintNumberValue, - createdByUserId: context.loggedInUserUuid, + createdByUserId: ComplaintsSingleton().loggedInUserUuid, ), ); diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_sort.dart b/packages/complaints/lib/pages/inbox/complaints_inbox_sort.dart similarity index 95% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_sort.dart rename to packages/complaints/lib/pages/inbox/complaints_inbox_sort.dart index 34f35713d..8a512e36e 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_sort.dart +++ b/packages/complaints/lib/pages/inbox/complaints_inbox_sort.dart @@ -1,13 +1,15 @@ + +import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:group_radio_button/group_radio_button.dart'; import 'package:reactive_forms/reactive_forms.dart'; -import '../../../blocs/complaints_inbox/complaints_inbox.dart'; -import '../../../router/app_router.dart'; -import '../../../utils/i18_key_constants.dart' as i18; -import '../../../widgets/localized.dart'; +import '/blocs/complaints_inbox/complaints_inbox.dart'; + +import '/utils/i18_key_constants.dart' as i18; +import '/widgets/localized.dart'; @RoutePage() class ComplaintsInboxSortPage extends LocalizedStatefulWidget { @@ -18,10 +20,10 @@ class ComplaintsInboxSortPage extends LocalizedStatefulWidget { @override State createState() => - _ComplaintsInboxSortPageState(); + ComplaintsInboxSortPageState(); } -class _ComplaintsInboxSortPageState +class ComplaintsInboxSortPageState extends LocalizedState { static const _sortOrder = "sortOrder"; static var sortOrders = [ diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_wrapper.dart b/packages/complaints/lib/pages/inbox/complaints_inbox_wrapper.dart similarity index 58% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_wrapper.dart rename to packages/complaints/lib/pages/inbox/complaints_inbox_wrapper.dart index fd110f711..27253c3a2 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/inbox/complaints_inbox_wrapper.dart +++ b/packages/complaints/lib/pages/inbox/complaints_inbox_wrapper.dart @@ -1,10 +1,10 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:digit_data_model/data_model.dart'; -import '../../../blocs/complaints_inbox/complaints_inbox.dart'; -import '../../../utils/utils.dart'; +import 'package:complaints/blocs/complaints_inbox/complaints_inbox.dart'; +import 'package:complaints/utils/utils.dart'; +import '/models/pgr_complaints.dart'; @RoutePage() class ComplaintsInboxWrapperPage extends StatelessWidget { @@ -17,14 +17,14 @@ class ComplaintsInboxWrapperPage extends StatelessWidget { return BlocProvider( create: (context) => ComplaintsInboxBloc( const ComplaintInboxState.complaints(), - pgrRepository: - context.repository(), + pgrRepository:context.repository(context), )..add( - ComplaintInboxLoadComplaintsEvent( - createdByUserId: context.loggedInUserUuid, - ), + ComplaintInboxLoadComplaintsEvent( + createdByUserId: ComplaintsSingleton().loggedInUserUuid, ), + ), child: const AutoRouter(), ); + } } diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaint_type.dart b/packages/complaints/lib/pages/registration/complaint_type.dart similarity index 67% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaint_type.dart rename to packages/complaints/lib/pages/registration/complaint_type.dart index d1f30f77c..f20cc19f1 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaint_type.dart +++ b/packages/complaints/lib/pages/registration/complaint_type.dart @@ -1,3 +1,7 @@ + +import 'package:auto_route/auto_route.dart'; +import 'package:complaints/complaints.dart'; +import 'package:complaints/router/complaints_router.gm.dart'; import 'package:digit_components/digit_components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -5,12 +9,12 @@ import 'package:group_radio_button/group_radio_button.dart'; import 'package:reactive_forms/reactive_forms.dart'; import 'package:recase/recase.dart'; -import '../../../blocs/app_initialization/app_initialization.dart'; -import '../../../blocs/complaints_registration/complaints_registration.dart'; -import '../../../router/app_router.dart'; -import '../../../utils/i18_key_constants.dart' as i18; -import '../../../widgets/header/back_navigation_help_header.dart'; -import '../../../widgets/localized.dart'; + + +import '/utils/i18_key_constants.dart' as i18; +import '/widgets/header/back_navigation_help_header.dart'; +import '/widgets/localized.dart'; + @RoutePage() class ComplaintTypePage extends LocalizedStatefulWidget { @@ -20,10 +24,10 @@ class ComplaintTypePage extends LocalizedStatefulWidget { }); @override - State createState() => _ComplaintTypePageState(); + State createState() => ComplaintTypePageState(); } -class _ComplaintTypePageState extends LocalizedState { +class ComplaintTypePageState extends LocalizedState { static const _complaintType = 'complaintType'; static const _otherComplaintType = 'otherComplaintType'; @@ -51,6 +55,7 @@ class _ComplaintTypePageState extends LocalizedState { header: const Column(children: [ BackNavigationHelpHeaderWidget(), ]), + enableFixedButton: true, footer: DigitCard( margin: const EdgeInsets.fromLTRB(0, kPadding, 0, 0), padding: const EdgeInsets.fromLTRB(kPadding, 0, kPadding, 0), @@ -80,12 +85,14 @@ class _ComplaintTypePageState extends LocalizedState { state.whenOrNull( create: ( - loading, - complaintType, - _, - addressModel, - complaintsDetailsModel, - ) { + + loading, + complaintType, + _, + addressModel, + complaintsDetailsModel, + ) { + bloc.add( ComplaintsRegistrationEvent.saveComplaintType( complaintType: form.control(_complaintType).value, @@ -104,8 +111,9 @@ class _ComplaintTypePageState extends LocalizedState { ), ), ), - children: [ - DigitCard( + slivers: [ + SliverToBoxAdapter( + child: DigitCard( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -123,50 +131,32 @@ class _ComplaintTypePageState extends LocalizedState { label: localizations.translate( i18.complaints.complaintsTypeLabel, ), - child: BlocBuilder( - builder: (context, state) { - return state.maybeWhen( - orElse: () => const Offstage(), - initialized: ( - appConfiguration, - serviceRegistryList, - _, - ) { - var complaintTypes = appConfiguration - .complaintTypes - ?.map((e) => e.code) - .toList(); - - final isDisabled = - form.control(_complaintType).disabled; - - return RadioGroup.builder( - groupValue: - form.control(_complaintType).value ?? "", - onChanged: (changedValue) { - if (isDisabled) return; - - setState(() { - form.control(_complaintType).value = - changedValue; - }); - }, - textStyle: TextStyle( - color: isDisabled - ? theme.colorScheme.shadow - : theme.colorScheme.onBackground, - ), - items: complaintTypes ?? [], - itemBuilder: (item) => RadioButtonBuilder( - localizations.translate( - item.snakeCase.toUpperCase().trim(), - ), - ), - ); - }, - ); - }, + child: RadioGroup.builder( + + groupValue: + form.control(_complaintType).value ?? "", + + onChanged: (changedValue) { + if (form.control(_complaintType).disabled) return; + + setState(() { + + form.control(_complaintType).value = + changedValue; + }); + }, + textStyle: TextStyle( + color: form.control(_complaintType).disabled + ? theme.colorScheme.shadow + : theme.colorScheme.onBackground, + + ), + items: ComplaintsSingleton().complaintTypes ?? [], + itemBuilder: (item) => RadioButtonBuilder( + localizations.translate( + item.snakeCase.toUpperCase().trim(), + ), + ), ), ), if (form.control(_complaintType).value == "Other") ...[ @@ -176,8 +166,9 @@ class _ComplaintTypePageState extends LocalizedState { maxLength: 100, validationMessages: { 'required': (object) => localizations.translate( - i18.complaints.validationRequiredError, - ), + i18.complaints.validationRequiredError, + ), + }, ), ], @@ -205,6 +196,7 @@ class _ComplaintTypePageState extends LocalizedState { ], ), ), + ), ], ); }, diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_details.dart b/packages/complaints/lib/pages/registration/complaints_details.dart similarity index 86% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_details.dart rename to packages/complaints/lib/pages/registration/complaints_details.dart index a1ecebbb9..f0c1d8d5d 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_details.dart +++ b/packages/complaints/lib/pages/registration/complaints_details.dart @@ -1,3 +1,7 @@ + +import 'package:auto_route/auto_route.dart'; + +import 'package:complaints/router/complaints_router.gm.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; @@ -6,10 +10,10 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:group_radio_button/group_radio_button.dart'; import 'package:reactive_forms/reactive_forms.dart'; -import '../../../blocs/auth/auth.dart'; import '../../../blocs/complaints_registration/complaints_registration.dart'; -import '../../../models/complaints/complaints.dart'; -import '../../../router/app_router.dart'; +import '../../../models/complaints.dart'; + + import '../../../utils/i18_key_constants.dart' as i18; import '../../../utils/utils.dart'; import '../../../widgets/header/back_navigation_help_header.dart'; @@ -23,10 +27,10 @@ class ComplaintsDetailsPage extends LocalizedStatefulWidget { }); @override - State createState() => _ComplaintsDetailsPageState(); + State createState() => ComplaintsDetailsPageState(); } -class _ComplaintsDetailsPageState +class ComplaintsDetailsPageState extends LocalizedState { static const _dateOfComplaint = 'dateOfComplaint'; static const _administrativeArea = 'administrativeArea'; @@ -53,13 +57,15 @@ class _ComplaintsDetailsPageState form: () => bloc.state.map( create: (value) => buildForm(value), persisted: (value) => - throw const InvalidComplaintsRegistrationStateException(), + + throw const InvalidComplaintsRegistrationStateException(), view: (value) => buildForm(value), ), builder: (_, form, __) => BlocListener( listener: (context, state) { - context.navigateTo(HomeRoute()); + context.navigateTo(const ComplaintsInboxWrapperRoute()); }, + child: BlocConsumer( listener: (context, complaintState) { @@ -73,6 +79,7 @@ class _ComplaintsDetailsPageState final isRaisedForSelf = form.control(_complaintRaisedFor).value == i18.complaints.raisedForMyself; + return ScrollableContent( enableFixedButton: true, header: const Column( @@ -84,7 +91,8 @@ class _ComplaintsDetailsPageState child: DigitCard( margin: const EdgeInsets.fromLTRB(0, kPadding, 0, 0), padding: - const EdgeInsets.fromLTRB(kPadding, 0, kPadding, 0), + + const EdgeInsets.fromLTRB(kPadding, 0, kPadding, 0), child: DigitElevatedButton( onPressed: () async { setState(() { @@ -95,58 +103,61 @@ class _ComplaintsDetailsPageState router.parent()?.maybePop(); } - if (!form.valid) return; + if (!form.valid){ + return; + } FocusManager.instance.primaryFocus?.unfocus(); final dateOfComplaint = - form.control(_dateOfComplaint).value as DateTime; + form.control(_dateOfComplaint).value as DateTime; final complaintRaisedFor = - form.control(_complaintRaisedFor).value as String; - - final administrativeArea = - form.control(_administrativeArea).value as String; + form.control(_complaintRaisedFor).value as String; final complainantName = - form.control(_complainantName).value as String; + form.control(_complainantName).value as String; final complainantContactNumber = form .control(_complainantContactNumber) .value as String; final supervisorName = - form.control(_supervisorName).value as String?; + form.control(_supervisorName).value as String?; + final supervisorContactNumber = form .control(_supervisorContactNumber) .value as String?; final complaintDescription = - form.control(_complaintDescription).value as String; + + form.control(_complaintDescription).value as String; + state.whenOrNull( create: ( - loading, - complaintType, - _, - addressModel, - complaintsDetailsModel, - ) { + loading, + complaintType, + _, + addressModel, + complaintsDetailsModel, + ) { bloc.add( ComplaintsRegistrationEvent.saveComplaintDetails( - boundaryModel: context.boundary, + boundaryModel: ComplaintsSingleton().boundary, complaintsDetailsModel: ComplaintsDetailsModel( administrativeArea: - context.boundary.code.toString(), + ComplaintsSingleton().boundary.code.toString(), dateOfComplaint: dateOfComplaint, complaintRaisedFor: complaintRaisedFor, complainantName: complainantName, complainantContactNumber: - complainantContactNumber, + complainantContactNumber, supervisorName: supervisorName, supervisorContactNumber: - supervisorContactNumber, + supervisorContactNumber, + complaintDescription: complaintDescription, ), ), @@ -154,7 +165,9 @@ class _ComplaintsDetailsPageState }, ); - final userId = context.loggedInUserUuid; + + final userId = ComplaintsSingleton().loggedInUserUuid; + final submit = await DigitDialog.show( context, @@ -170,6 +183,7 @@ class _ComplaintsDetailsPageState i18.common.coreCommonSubmit, ), action: (context) { + Navigator.of( context, rootNavigator: true, @@ -181,6 +195,7 @@ class _ComplaintsDetailsPageState i18.common.coreCommonCancel, ), action: (context) { + Navigator.of( context, rootNavigator: true, @@ -192,19 +207,23 @@ class _ComplaintsDetailsPageState if (submit != true) return; + bloc.add( ComplaintsRegistrationSubmitComplaintEvent( userId: userId, ), ); + }, child: Center( child: Text( form.control(_complaintDetailsForm).disabled ? localizations - .translate(i18.complaints.backToInbox) + + .translate(i18.complaints.backToInbox) : localizations - .translate(i18.common.coreCommonSubmit), + .translate(i18.common.coreCommonSubmit), + ), ), ), @@ -254,8 +273,10 @@ class _ComplaintsDetailsPageState children: [ RadioGroup.builder( groupValue: - form.control(_complaintRaisedFor).value ?? - "", + + form.control(_complaintRaisedFor).value ?? + "", + onChanged: (changedValue) { if (form .control(_complaintRaisedFor) @@ -268,6 +289,15 @@ class _ComplaintsDetailsPageState .control(_complainantContactNumber) .value = ""; } + + else{ + form.control(_complainantName).value = + ComplaintsSingleton().userName; + form.control(_complainantContactNumber).value = + ComplaintsSingleton().userMobileNumber; + + } + setState(() { form.control(_complaintRaisedFor).value = changedValue; @@ -275,8 +305,10 @@ class _ComplaintsDetailsPageState }, textStyle: TextStyle( color: form - .control(_complaintRaisedFor) - .disabled + + .control(_complaintRaisedFor) + .disabled + ? theme.colorScheme.shadow : theme.colorScheme.onBackground, ), @@ -310,23 +342,8 @@ class _ComplaintsDetailsPageState ], ), ), - BlocBuilder( - builder: (context, state) { - state.mapOrNull( - authenticated: (value) { - var user = value.userModel; - - if (isRaisedForSelf) { - form.control(_complainantName).value = - user.name; - form - .control(_complainantContactNumber) - .value = user.mobileNumber; - } - }, - ); - return Column( + Column( children: [ DigitTextFormField( formControlName: _complainantName, @@ -341,7 +358,7 @@ class _ComplaintsDetailsPageState .validationRequiredError), 'maxLength': (object) => localizations .translate( - i18.common.maxCharsRequired) + i18.common.maxCharsRequired) .replaceAll('{}', '64'), }, ), @@ -369,14 +386,13 @@ class _ComplaintsDetailsPageState .validationMinLengthError), 'maxLength': (object) => localizations .translate( - i18.common.maxCharsRequired) + i18.common.maxCharsRequired) .replaceAll('{}', '10'), }, ), ], - ); - }, - ), + ), + DigitTextFormField( formControlName: _supervisorName, label: localizations.translate( @@ -420,8 +436,10 @@ class _ComplaintsDetailsPageState isRequired: true, validationMessages: { 'required': (object) => localizations.translate( - i18.complaints.validationRequiredError, - ), + + i18.complaints.validationRequiredError, + ), + 'maxLength': (object) => localizations .translate(i18.common.maxCharsRequired) .replaceAll('{}', '1000'), @@ -454,9 +472,11 @@ class _ComplaintsDetailsPageState validators: [], ), _administrativeArea: FormControl( + value: localizations.translate( - (complaintDetails?.administrativeArea ?? context.boundary.name) + (complaintDetails?.administrativeArea ?? ComplaintsSingleton().boundary.name) .toString()), + disabled: shouldDisableForm, validators: [Validators.required], ), diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_location.dart b/packages/complaints/lib/pages/registration/complaints_location.dart similarity index 95% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_location.dart rename to packages/complaints/lib/pages/registration/complaints_location.dart index f4feece4f..9003d9cf3 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_location.dart +++ b/packages/complaints/lib/pages/registration/complaints_location.dart @@ -1,16 +1,22 @@ + + +import 'package:auto_route/auto_route.dart'; +import 'package:complaints/router/complaints_router.gm.dart'; import 'package:digit_components/digit_components.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:reactive_forms/reactive_forms.dart'; -import 'package:digit_data_model/data_model.dart'; -import '../../../blocs/complaints_registration/complaints_registration.dart'; -import '../../../router/app_router.dart'; -import '../../../utils/i18_key_constants.dart' as i18; -import '../../../utils/utils.dart'; -import '../../../widgets/header/back_navigation_help_header.dart'; -import '../../../widgets/localized.dart'; + + +import '../../models/pgr_address.dart'; +import '/blocs/complaints_registration/complaints_registration.dart'; +import '/utils/i18_key_constants.dart' as i18; +import '/utils/utils.dart'; +import '/widgets/header/back_navigation_help_header.dart'; +import '/widgets/localized.dart'; + @RoutePage() class ComplaintsLocationPage extends LocalizedStatefulWidget { @@ -20,10 +26,10 @@ class ComplaintsLocationPage extends LocalizedStatefulWidget { }); @override - State createState() => _ComplaintsLocationPageState(); + State createState() => ComplaintsLocationPageState(); } -class _ComplaintsLocationPageState +class ComplaintsLocationPageState extends LocalizedState { static const _addressLine1Key = 'addressLine1'; static const _addressLine2Key = 'addressLine2'; @@ -234,7 +240,9 @@ class _ComplaintsLocationPageState value: addressModel?.buildingName, disabled: shouldDisableForm, validators: [ + CustomValidator.requiredMin, + Validators.maxLength(maxLength), ], ), @@ -242,7 +250,9 @@ class _ComplaintsLocationPageState value: addressModel?.street, disabled: shouldDisableForm, validators: [ + CustomValidator.requiredMin, + Validators.maxLength(maxLength), ], ), @@ -250,7 +260,9 @@ class _ComplaintsLocationPageState value: addressModel?.landmark, disabled: shouldDisableForm, validators: [ + CustomValidator.requiredMin, + Validators.maxLength(maxLength), ], ), @@ -258,14 +270,18 @@ class _ComplaintsLocationPageState value: addressModel?.pincode, disabled: shouldDisableForm, validators: [ + CustomValidator.requiredMin, + Validators.maxLength(6), ], ), _latKey: FormControl( value: addressModel?.geoLocation?.latitude, validators: [ + CustomValidator.requiredMin, + ], ), _lngKey: FormControl( diff --git a/apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_registration_wrapper.dart b/packages/complaints/lib/pages/registration/complaints_registration_wrapper.dart similarity index 85% rename from apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_registration_wrapper.dart rename to packages/complaints/lib/pages/registration/complaints_registration_wrapper.dart index d5a07a3f5..4e722115d 100644 --- a/apps/health_campaign_field_worker_app/lib/pages/complaints/registration/complaints_registration_wrapper.dart +++ b/packages/complaints/lib/pages/registration/complaints_registration_wrapper.dart @@ -1,14 +1,18 @@ import 'dart:convert'; import 'package:auto_route/auto_route.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:digit_data_model/data_model.dart'; -import '../../../blocs/complaints_registration/complaints_registration.dart'; -import '../../../models/complaints/complaints.dart'; -import '../../../utils/utils.dart'; -import '../../../widgets/boundary_selection_wrapper.dart'; + + +import '../../models/pgr_complaints.dart'; +import '/blocs/complaints_registration/complaints_registration.dart'; +import '/models/complaints.dart'; +import '/utils/utils.dart'; +import '/widgets/boundary_selection_wrapper.dart'; + @RoutePage() class ComplaintsRegistrationWrapperPage extends StatelessWidget @@ -22,7 +26,9 @@ class ComplaintsRegistrationWrapperPage extends StatelessWidget @override Widget build(BuildContext context) { + return const BoundarySelectionWrapper( + child: AutoRouter(), ); } @@ -49,9 +55,11 @@ class ComplaintsRegistrationWrapperPage extends StatelessWidget complainantName: pgrItem.user.name ?? '', complaintDescription: pgrItem.description, complaintRaisedFor: - context.loggedInUser.mobileNumber != pgrItem.user.mobileNumber + + ComplaintsSingleton().userMobileNumber != pgrItem.user.mobileNumber ? 'Another user' : 'Myself', + dateOfComplaint: pgrItem.auditDetails?.createdTime.toDateTime ?? DateTime.now(), supervisorContactNumber: @@ -65,8 +73,10 @@ class ComplaintsRegistrationWrapperPage extends StatelessWidget return ComplaintsRegistrationBloc( initialState, + pgrServiceRepository: - context.repository(), + context.repository(context), + ); }, child: this, diff --git a/packages/complaints/lib/router/complaints_router.dart b/packages/complaints/lib/router/complaints_router.dart new file mode 100644 index 000000000..7df52f8a3 --- /dev/null +++ b/packages/complaints/lib/router/complaints_router.dart @@ -0,0 +1,71 @@ +import 'package:auto_route/auto_route.dart'; + +import 'complaints_router.gm.dart'; + +/// Complaint Inbox and registration Router +@AutoRouterConfig.module() +class ComplaintsRoute extends $ComplaintsRoute { + + RouteType get defaultRouteType => const RouteType.material(); + + + List routes = [ + /// Complaints Inbox + AutoRoute( + page: ComplaintsInboxWrapperRoute.page, + path: 'complaints-inbox', + children: [ + AutoRoute( + page: ComplaintsInboxRoute.page, + path: 'complaints-inbox-items', + initial: true, + ), + AutoRoute( + page: ComplaintsInboxFilterRoute.page, + path: 'complaints-inbox-filter', + ), + AutoRoute( + page: ComplaintsInboxSearchRoute.page, + path: 'complaints-inbox-search', + ), + AutoRoute( + page: ComplaintsInboxSortRoute.page, + path: 'complaints-inbox-sort', + ), + AutoRoute( + page: ComplaintsDetailsViewRoute.page, + path: 'complaints-inbox-view-details', + ), + ], + ), + + /// Complaints registration + AutoRoute( + page: ComplaintsRegistrationWrapperRoute.page, + path: 'complaints-registration', + children: [ + AutoRoute( + page: ComplaintTypeRoute.page, + path: 'complaints-type', + initial: true, + ), + AutoRoute( + page: ComplaintsLocationRoute.page, + path: 'complaints-location', + ), + AutoRoute( + page: ComplaintsDetailsRoute.page, + path: 'complaints-details', + ), + + ], + ), + + /// Complaints Acknowledgement + AutoRoute( + page: ComplaintsAcknowledgementRoute.page, + path: 'complaints-acknowledgement', + ), + + ]; +} diff --git a/packages/complaints/lib/router/complaints_router.gm.dart b/packages/complaints/lib/router/complaints_router.gm.dart new file mode 100644 index 000000000..f5fab4156 --- /dev/null +++ b/packages/complaints/lib/router/complaints_router.gm.dart @@ -0,0 +1,551 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ************************************************************************** +// AutoRouterGenerator +// ************************************************************************** + +// ignore_for_file: type=lint +// coverage:ignore-file + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:auto_route/auto_route.dart' as _i12; +import 'package:complaints/blocs/localization/app_localization.dart' as _i14; +import 'package:complaints/models/pgr_complaints.dart' as _i15; +import 'package:complaints/pages/complaints_acknowledgement.dart' as _i2; +import 'package:complaints/pages/inbox/complaints_details_view.dart' as _i4; +import 'package:complaints/pages/inbox/complaints_inbox.dart' as _i6; +import 'package:complaints/pages/inbox/complaints_inbox_filter.dart' as _i5; +import 'package:complaints/pages/inbox/complaints_inbox_search.dart' as _i7; +import 'package:complaints/pages/inbox/complaints_inbox_sort.dart' as _i8; +import 'package:complaints/pages/inbox/complaints_inbox_wrapper.dart' as _i9; +import 'package:complaints/pages/registration/complaint_type.dart' as _i1; +import 'package:complaints/pages/registration/complaints_details.dart' as _i3; +import 'package:complaints/pages/registration/complaints_location.dart' as _i10; +import 'package:complaints/pages/registration/complaints_registration_wrapper.dart' + as _i11; +import 'package:flutter/material.dart' as _i13; + +abstract class $ComplaintsRoute extends _i12.AutoRouterModule { + @override + final Map pagesMap = { + ComplaintTypeRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintTypeRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i1.ComplaintTypePage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + ComplaintsAcknowledgementRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintsAcknowledgementRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i2.ComplaintsAcknowledgementPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + ComplaintsDetailsRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintsDetailsRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i3.ComplaintsDetailsPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + ComplaintsDetailsViewRoute.name: (routeData) { + final args = routeData.argsAs(); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i4.ComplaintsDetailsViewPage( + key: args.key, + complaint: args.complaint, + ), + ); + }, + ComplaintsInboxFilterRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintsInboxFilterRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i5.ComplaintsInboxFilterPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + ComplaintsInboxRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintsInboxRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i6.ComplaintsInboxPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + ComplaintsInboxSearchRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintsInboxSearchRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i7.ComplaintsInboxSearchPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + ComplaintsInboxSortRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintsInboxSortRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i8.ComplaintsInboxSortPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + ComplaintsInboxWrapperRoute.name: (routeData) { + return _i12.AutoRoutePage( + routeData: routeData, + child: const _i9.ComplaintsInboxWrapperPage(), + ); + }, + ComplaintsLocationRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintsLocationRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i10.ComplaintsLocationPage( + key: args.key, + appLocalizations: args.appLocalizations, + ), + ); + }, + ComplaintsRegistrationWrapperRoute.name: (routeData) { + final args = routeData.argsAs( + orElse: () => const ComplaintsRegistrationWrapperRouteArgs()); + return _i12.AutoRoutePage( + routeData: routeData, + child: _i12.WrappedRoute( + child: _i11.ComplaintsRegistrationWrapperPage( + key: args.key, + pgrServiceModel: args.pgrServiceModel, + )), + ); + }, + }; +} + +/// generated route for +/// [_i1.ComplaintTypePage] +class ComplaintTypeRoute extends _i12.PageRouteInfo { + ComplaintTypeRoute({ + _i13.Key? key, + _i14.ComplaintsLocalization? appLocalizations, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintTypeRoute.name, + args: ComplaintTypeRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintTypeRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintTypeRouteArgs { + const ComplaintTypeRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i13.Key? key; + + final _i14.ComplaintsLocalization? appLocalizations; + + @override + String toString() { + return 'ComplaintTypeRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i2.ComplaintsAcknowledgementPage] +class ComplaintsAcknowledgementRoute + extends _i12.PageRouteInfo { + ComplaintsAcknowledgementRoute({ + _i13.Key? key, + _i14.ComplaintsLocalization? appLocalizations, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsAcknowledgementRoute.name, + args: ComplaintsAcknowledgementRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsAcknowledgementRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsAcknowledgementRouteArgs { + const ComplaintsAcknowledgementRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i13.Key? key; + + final _i14.ComplaintsLocalization? appLocalizations; + + @override + String toString() { + return 'ComplaintsAcknowledgementRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i3.ComplaintsDetailsPage] +class ComplaintsDetailsRoute + extends _i12.PageRouteInfo { + ComplaintsDetailsRoute({ + _i13.Key? key, + _i14.ComplaintsLocalization? appLocalizations, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsDetailsRoute.name, + args: ComplaintsDetailsRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsDetailsRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsDetailsRouteArgs { + const ComplaintsDetailsRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i13.Key? key; + + final _i14.ComplaintsLocalization? appLocalizations; + + @override + String toString() { + return 'ComplaintsDetailsRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i4.ComplaintsDetailsViewPage] +class ComplaintsDetailsViewRoute + extends _i12.PageRouteInfo { + ComplaintsDetailsViewRoute({ + _i13.Key? key, + required _i15.PgrServiceModel complaint, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsDetailsViewRoute.name, + args: ComplaintsDetailsViewRouteArgs( + key: key, + complaint: complaint, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsDetailsViewRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsDetailsViewRouteArgs { + const ComplaintsDetailsViewRouteArgs({ + this.key, + required this.complaint, + }); + + final _i13.Key? key; + + final _i15.PgrServiceModel complaint; + + @override + String toString() { + return 'ComplaintsDetailsViewRouteArgs{key: $key, complaint: $complaint}'; + } +} + +/// generated route for +/// [_i5.ComplaintsInboxFilterPage] +class ComplaintsInboxFilterRoute + extends _i12.PageRouteInfo { + ComplaintsInboxFilterRoute({ + _i13.Key? key, + _i14.ComplaintsLocalization? appLocalizations, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsInboxFilterRoute.name, + args: ComplaintsInboxFilterRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsInboxFilterRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsInboxFilterRouteArgs { + const ComplaintsInboxFilterRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i13.Key? key; + + final _i14.ComplaintsLocalization? appLocalizations; + + @override + String toString() { + return 'ComplaintsInboxFilterRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i6.ComplaintsInboxPage] +class ComplaintsInboxRoute + extends _i12.PageRouteInfo { + ComplaintsInboxRoute({ + _i13.Key? key, + _i14.ComplaintsLocalization? appLocalizations, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsInboxRoute.name, + args: ComplaintsInboxRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsInboxRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsInboxRouteArgs { + const ComplaintsInboxRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i13.Key? key; + + final _i14.ComplaintsLocalization? appLocalizations; + + @override + String toString() { + return 'ComplaintsInboxRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i7.ComplaintsInboxSearchPage] +class ComplaintsInboxSearchRoute + extends _i12.PageRouteInfo { + ComplaintsInboxSearchRoute({ + _i13.Key? key, + _i14.ComplaintsLocalization? appLocalizations, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsInboxSearchRoute.name, + args: ComplaintsInboxSearchRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsInboxSearchRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsInboxSearchRouteArgs { + const ComplaintsInboxSearchRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i13.Key? key; + + final _i14.ComplaintsLocalization? appLocalizations; + + @override + String toString() { + return 'ComplaintsInboxSearchRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i8.ComplaintsInboxSortPage] +class ComplaintsInboxSortRoute + extends _i12.PageRouteInfo { + ComplaintsInboxSortRoute({ + _i13.Key? key, + _i14.ComplaintsLocalization? appLocalizations, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsInboxSortRoute.name, + args: ComplaintsInboxSortRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsInboxSortRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsInboxSortRouteArgs { + const ComplaintsInboxSortRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i13.Key? key; + + final _i14.ComplaintsLocalization? appLocalizations; + + @override + String toString() { + return 'ComplaintsInboxSortRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i9.ComplaintsInboxWrapperPage] +class ComplaintsInboxWrapperRoute extends _i12.PageRouteInfo { + const ComplaintsInboxWrapperRoute({List<_i12.PageRouteInfo>? children}) + : super( + ComplaintsInboxWrapperRoute.name, + initialChildren: children, + ); + + static const String name = 'ComplaintsInboxWrapperRoute'; + + static const _i12.PageInfo page = _i12.PageInfo(name); +} + +/// generated route for +/// [_i10.ComplaintsLocationPage] +class ComplaintsLocationRoute + extends _i12.PageRouteInfo { + ComplaintsLocationRoute({ + _i13.Key? key, + _i14.ComplaintsLocalization? appLocalizations, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsLocationRoute.name, + args: ComplaintsLocationRouteArgs( + key: key, + appLocalizations: appLocalizations, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsLocationRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsLocationRouteArgs { + const ComplaintsLocationRouteArgs({ + this.key, + this.appLocalizations, + }); + + final _i13.Key? key; + + final _i14.ComplaintsLocalization? appLocalizations; + + @override + String toString() { + return 'ComplaintsLocationRouteArgs{key: $key, appLocalizations: $appLocalizations}'; + } +} + +/// generated route for +/// [_i11.ComplaintsRegistrationWrapperPage] +class ComplaintsRegistrationWrapperRoute + extends _i12.PageRouteInfo { + ComplaintsRegistrationWrapperRoute({ + _i13.Key? key, + _i15.PgrServiceModel? pgrServiceModel, + List<_i12.PageRouteInfo>? children, + }) : super( + ComplaintsRegistrationWrapperRoute.name, + args: ComplaintsRegistrationWrapperRouteArgs( + key: key, + pgrServiceModel: pgrServiceModel, + ), + initialChildren: children, + ); + + static const String name = 'ComplaintsRegistrationWrapperRoute'; + + static const _i12.PageInfo page = + _i12.PageInfo(name); +} + +class ComplaintsRegistrationWrapperRouteArgs { + const ComplaintsRegistrationWrapperRouteArgs({ + this.key, + this.pgrServiceModel, + }); + + final _i13.Key? key; + + final _i15.PgrServiceModel? pgrServiceModel; + + @override + String toString() { + return 'ComplaintsRegistrationWrapperRouteArgs{key: $key, pgrServiceModel: $pgrServiceModel}'; + } +} diff --git a/packages/complaints/lib/utils/constants.dart b/packages/complaints/lib/utils/constants.dart new file mode 100644 index 000000000..3186df232 --- /dev/null +++ b/packages/complaints/lib/utils/constants.dart @@ -0,0 +1,3 @@ + + +const String noResultSvg = 'assets/icons/svg/no_result.svg'; \ No newline at end of file diff --git a/packages/complaints/lib/utils/extensions/context_utility.dart b/packages/complaints/lib/utils/extensions/context_utility.dart new file mode 100644 index 000000000..0a64c331f --- /dev/null +++ b/packages/complaints/lib/utils/extensions/context_utility.dart @@ -0,0 +1,22 @@ +part of 'extensions.dart'; + +extension ContextUtilityExtensions on BuildContext { + int millisecondsSinceEpoch([DateTime? dateTime]) { + return (dateTime ?? DateTime.now()).millisecondsSinceEpoch; + } + + DataRepository + repository( + BuildContext context, + ) { + switch (ComplaintsSingleton().persistenceConfiguration) { + case PersistenceConfiguration.offlineFirst: + return context.read>(); + case PersistenceConfiguration.onlineOnly: + return context.read>(); + default: + return context.read>(); + } + } + +} \ No newline at end of file diff --git a/packages/complaints/lib/utils/extensions/extensions.dart b/packages/complaints/lib/utils/extensions/extensions.dart new file mode 100644 index 000000000..cee3aa97f --- /dev/null +++ b/packages/complaints/lib/utils/extensions/extensions.dart @@ -0,0 +1,24 @@ +import 'package:digit_data_model/data_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:intl/intl.dart'; + + +import '/utils/utils.dart'; + +part 'context_utility.dart'; + +// Extension to convert an integer (epoch) to a DateTime object. +extension EpochToDateTime on int? { + DateTime? get toDateTime { + return this == null ? null : DateTime.fromMillisecondsSinceEpoch(this!); + } +} + +extension DateTimeExtension on DateTime? { + String? getFormattedDate([String format = 'dd-MM-yyyy']) { + if (this == null) return null; + + return DateFormat(format).format(this!); + } +} diff --git a/packages/complaints/lib/utils/i18_key_constants.dart b/packages/complaints/lib/utils/i18_key_constants.dart new file mode 100644 index 000000000..632aa53de --- /dev/null +++ b/packages/complaints/lib/utils/i18_key_constants.dart @@ -0,0 +1,450 @@ +const common = Common(); +const complaints = Complaints(); +const complaintTypeShowcase = ComplaintTypeShowcase(); +const complaintsDetailsShowcase = ComplaintsDetailsShowcase(); +const complaintsDetailsViewShowcase = ComplaintsDetailsViewShowcase(); +const complaintsInboxShowcase = ComplaintsInboxShowcase(); + +const householdLocation = HouseholdLocation(); + +const searchBeneficiary = SearchBeneficiary(); + +const individualDetails = IndividualDetails(); + +class Common { + const Common(); + + String get coreCommonContinue => 'CORE_COMMON_CONTINUE'; + + String get coreCommonAge => 'CORE_COMMON_AGE'; + + String get coreCommonName => 'CORE_COMMON_NAME'; + + String get coreCommonEmailId => 'CORE_COMMON_EMAIL_ID'; + + String get coreCommonGender => 'CORE_COMMON_GENDER'; + + String get coreCommonMobileNumber => 'CORE_COMMON_MOBILE_NUMBER'; + + String get coreCommonSubmit => 'CORE_COMMON_SUBMIT'; + + String get coreCommonSave => 'CORE_COMMON_SAVE'; + + String get coreCommonCancel => 'CORE_COMMON_CANCEL'; + + String get corecommonRequired => 'CORE_COMMON_REQUIRED'; + + String get coreCommonReasonRequired => 'CORE_COMMON_REASON_REQUIRED'; + + String get corecommonclose => 'CORE_COMMON_CLOSE'; + + String get coreCommonOk => 'CORE_COMMON_OK'; + + String get coreCommonNA => 'CORE_COMMON_NA'; + + String get coreCommonProfile => 'CORE_COMMON_PROFILE'; + + String get coreCommonLogout => 'CORE_COMMON_LOGOUT'; + + String get coreCommonBack => 'CORE_COMMON_BACK'; + + String get coreCommonHelp => 'CORE_COMMON_HELP'; + + String get coreCommonHome => 'CORE_COMMON_HOME'; + + String get coreCommonViewDownloadedData => 'CORE_COMMON_VIEW_DOWNLOADED_DATA'; + + String get coreCommonlanguage => 'CORE_COMMON_LANGUAGE'; + + String get coreCommonSyncProgress => 'CORE_COMMON_SYNC_PROGRESS'; + + String get coreCommonDataSynced => 'CORE_COMMON_DATA_SYNCED'; + + String get coreCommonDataSyncFailed => 'CORE_COMMON_DATA_SYNC_FAILED'; + + String get coreCommonDataSyncRetry => 'CORE_COMMON_DATA_SYNC_RETRY'; + + String get connectionLabel => 'CORE_COMMON_CONNECTION_LABEL'; + + String get connectionContent => 'CORE_COMMON_CONNECTION_CONTENT'; + + String get coreCommonSkip => 'CORE_COMMON_SKIP'; + + String get coreCommonNext => 'CORE_COMMON_NEXT'; + + String get coreCommonYes => 'CORE_COMMON_YES'; + + String get coreCommonNo => 'CORE_COMMON_NO'; + String get coreCommonGoback => 'CORE_COMMON_GO_BACK'; + + String get coreCommonRequiredItems => 'CORE_COMMON_REQUIRED_ITEMS'; + + String get min2CharsRequired => 'MIN_2_CHARS_REQUIRED'; + + String get maxCharsRequired => 'MAX_CHARS_ALLOWED'; + + String get maxValue => 'MAX_VALUE_ALLOWED'; + String get minValue => 'MIN_VALUE_ALLOWED'; + + String get noResultsFound => 'NO_RESULTS_FOUND'; + + String get coreCommonSyncInProgress => 'CORE_COMMON_SYNC_IN_PROGRESS'; + + String get facilitySearchHeaderLabel => 'FACILITY_SEARCH_HEADER_LABEL'; + String get projectFacilitySearchHeaderLabel => + 'PROJECT_FACILITY_SEARCH_HEADER_LABEL'; + + String get coreCommonDownload => 'CORE_COMMON_DOWNLOAD'; + + String get coreCommonDownloadFailed => 'CORE_COMMON_DOWNLOAD_FAILED'; + + String get noMatchFound => 'CORE_COMMON_NO_MATCH_FOUND'; + + String get scanBales => 'CORE_COMMON_SCAN_BALES'; + String get ageInMonths => 'AGE_IN_MONTHS_LABEL'; + + String get profileUpdateSuccess => 'PROFILE_UPDATE_SUCCESS'; +} + +class Complaints { + const Complaints(); + + String get complaintsTypeHeading => 'COMPLAINTS_TYPE_HEADING'; + + String get complaintsTypeLabel => 'COMPLAINTS_TYPE_LABEL'; + + String get actionLabel => 'HOUSEHOLD_LOCATION_ACTION_LABEL'; + + String get complaintsLocationLabel => 'COMPLAINTS_LOCATION_LABEL'; + + String get complaintsDetailsLabel => 'COMPLAINTS_DETAILS_LABEL'; + + String get dateOfComplaint => 'COMPLAINTS_DATE'; + + String get complainantTypeQuestion => 'COMPLAINTS_COMPLAINANT_TYPE_QUESTION'; + + String get complainantName => 'COMPLAINTS_COMPLAINANT_NAME'; + + String get complainantContactNumber => + 'COMPLAINTS_COMPLAINANT_CONTACT_NUMBER'; + + String get supervisorName => 'COMPLAINTS_SUPERVISOR_NAME'; + + String get supervisorContactNumber => 'COMPLAINTS_SUPERVISOR_CONTACT_NUMBER'; + + String get complaintDescription => 'COMPLAINTS_DESCRIPTION'; + + String get dialogTitle => 'COMPLAINTS_DIALOG_TITLE'; + + String get dialogContent => 'COMPLAINTS_DIALOG_MESSAGE'; + + String get fileComplaintAction => 'COMPLAINTS_FILE_COMPLAINT_ACTION'; + + String get inboxHeading => 'COMPLAINTS_INBOX_HEADING'; + + String get searchCTA => 'COMPLAINTS_INBOX_SEARCH_CTA'; + + String get filterCTA => 'COMPLAINTS_INBOX_FILTER_CTA'; + + String get sortCTA => 'COMPLAINTS_INBOX_SORT_CTA'; + + String get complaintInboxFilterHeading => 'COMPLAINTS_INBOX_FILTER_HEADING'; + + String get complaintsFilterClearAll => 'COMPLAINTS_FILTER_CLEAR_ALL'; + + String get complaintInboxSearchHeading => 'COMPLAINTS_INBOX_SEARCH_HEADING'; + + String get complaintInboxSortHeading => 'COMPLAINTS_INBOX_SORT_HEADING'; + + String get complaintsSortDateAsc => 'COMPLAINT_SORT_DATE_ASC'; + + String get complaintsSortDateDesc => 'COMPLAINT_SORT_DATE_DESC'; + + String get assignedToAll => 'COMPLAINTS_ASSIGNED_TO_ALL'; + + String get assignedToSelf => 'COMPLAINTS_ASSIGNED_TO_SELF'; + + String get noComplaintsExist => 'COMPLAINTS_NO_COMPLAINTS_EXIST'; + + String get validationRequiredError => 'COMPLAINTS_VALIDATION_REQUIRED_ERROR'; + + String get inboxDateLabel => 'COMPLAINTS_INBOX_DATE_LABEL'; + + String get inboxNumberLabel => 'COMPLAINTS_INBOX_NUMBER_LABEL'; + + String get inboxTypeLabel => 'COMPLAINTS_INBOX_TYPE_LABEL'; + + String get inboxAreaLabel => 'COMPLAINTS_INBOX_AREA_LABEL'; + + String get inboxStatusLabel => 'COMPLAINTS_INBOX_STATUS_LABEL'; + + String get inboxNotGeneratedLabel => 'COMPLAINTS_INBOX_NOT_GENERATED_LABEL'; + + String get inboxSyncRequiredLabel => 'COMPLAINTS_INBOX_SYNC_REQUIRED_LABEL'; + + String get raisedForMyself => 'COMPLAINTS_RAISED_FOR_MYSELF'; + String get validationMinLengthError => + 'COMPLAINTS_VALIDATION_MINLENGTH_ERROR'; + + String get raisedForAnotherUser => 'COMPLAINTS_RAISED_FOR_ANOTHER_USER'; + + String get locality => 'COMPLAINTS_LOCALITY'; + + String get backToInbox => 'COMPLAINTS_BACK_TO_INBOX'; + + String get acknowledgementAction => 'COMPLAINTS_ACKNOWLEDGEMENT_ACTION'; + + String get acknowledgementDescription => + 'COMPLAINTS_ACKNOWLEDGEMENT_DESCRIPTION'; + + String get acknowledgementLabel => 'COMPLAINTS_ACKNOWLEDGEMENT_LABEL'; + + String get acknowledgementSubLabelMain => + 'COMPLAINTS_ACKNOWLEDGEMENT_SUB_LABEL_MAIN'; + + String get acknowledgementSubLabelSub => + 'COMPLAINTS_ACKNOWLEDGEMENT_SUB_LABEL_SUB'; + + String get complaintsError => 'COMPLAINTS_VALIDATION_REQUIRED_ERROR'; + + String get validationRadioRequiredError => + 'COMPLAINTS_VALIDATION_RADIO_REQUIRED_ERROR'; +} + +class ComplaintTypeShowcase { + const ComplaintTypeShowcase(); + + String get complaintType { + return 'COMPLAINT_TYPE_SHOWCASE_COMPLAINT_TYPE'; + } + + String get complaintTypeNext { + return 'COMPLAINT_TYPE_SHOWCASE_COMPLAINT_TYPE_NEXT'; + } +} + +class ComplaintsDetailsShowcase { + const ComplaintsDetailsShowcase(); + + String get complaintDate { + return 'COMPLAINT_DETAILS_SHOWCASE_DATE'; + } + + String get complaintOrganizationUnit { + return 'COMPLAINT_DETAILS_SHOWCASE_ORGANIZATION_UNIT'; + } + + String get complaintSelfOrOther { + return 'COMPLAINT_DETAILS_SHOWCASE_SELF_OR_OTHER'; + } + + String get complaintName { + return 'COMPLAINT_DETAILS_SHOWCASE_NAME'; + } + + String get complaintContact { + return 'COMPLAINT_DETAILS_SHOWCASE_CONTACT'; + } + + String get complaintSupervisorName { + return 'COMPLAINT_DETAILS_SHOWCASE_SUPERVISOR_NAME'; + } + + String get complaintSupervisorContact { + return 'COMPLAINT_DETAILS_SHOWCASE_SUPERVISOR_CONTACT'; + } + + String get complaintDescription { + return 'COMPLAINT_DETAILS_SHOWCASE_DESCRIPTION'; + } + + String get complaintSubmit { + return 'COMPLAINT_DETAILS_SHOWCASE_SUBMIT'; + } +} + +class ComplaintsDetailsViewShowcase { + const ComplaintsDetailsViewShowcase(); + + String get complaintNumber { + return 'COMPLAINT_DETAILS_VIEW_SHOWCASE_NUMBER'; + } + + String get complaintType { + return 'COMPLAINT_DETAILS_VIEW_SHOWCASE_TYPE'; + } + + String get complaintDate { + return 'COMPLAINT_DETAILS_VIEW_SHOWCASE_DATE'; + } + + String get complaintName { + return 'COMPLAINT_DETAILS_VIEW_SHOWCASE_NAME'; + } + + String get complaintArea { + return 'COMPLAINT_DETAILS_VIEW_SHOWCASE_AREA'; + } + + String get complaintContact { + return 'COMPLAINT_DETAILS_VIEW_CONTACT'; + } + + String get complaintStatus { + return 'COMPLAINT_DETAILS_VIEW_SHOWCASE_STATUS'; + } + + String get complaintDescription { + return 'COMPLAINT_DETAILS_VIEW_SHOWCASE_DESCRIPTION'; + } + + String get complaintClose { + return 'COMPLAINT_DETAILS_VIEW_SHOWCASE_CLOSE'; + } +} + +class ComplaintsInboxShowcase { + const ComplaintsInboxShowcase(); + + String get complaintSearch { + return 'COMPLAINT_INBOX_SHOWCASE_SEARCH'; + } + + String get complaintFilter { + return 'COMPLAINT_INBOX_SHOWCASE_FILTER'; + } + + String get complaintSort { + return 'COMPLAINT_INBOX_SHOWCASE_SORT'; + } + + String get complaintNumber { + return 'COMPLAINT_INBOX_SHOWCASE_NUMBER'; + } + + String get complaintType { + return 'COMPLAINT_INBOX_SHOWCASE_TYPE'; + } + + String get complaintDate { + return 'COMPLAINT_INBOX_SHOWCASE_DATE'; + } + + String get complaintArea { + return 'COMPLAINT_INBOX_SHOWCASE_AREA'; + } + + String get complaintStatus { + return 'COMPLAINT_INBOX_SHOWCASE_STATUS'; + } + + String get complaintOpen { + return 'COMPLAINT_INBOX_SHOWCASE_OPEN'; + } + + String get complaintCreate { + return 'COMPLAINT_INBOX_SHOWCASE_CREATE'; + } +} + +class HouseholdLocation { + const HouseholdLocation(); + + String get householdLocationLabelText => 'HOUSEHOLD_LOCATION_LABEL_TEXT'; + + String get administrationAreaFormLabel => 'ADMINISTRATION_AREA_FORM_LABEL'; + + String get administrationAreaRequiredValidation => + 'HOUSEHOLD_LOCATION_ADMINISTRATION_AREA_REQUIRED_VALIDATION'; + + String get householdAddressLine1LabelText => + 'HOUSEHOLD_ADDRESS_LINE_1_FORM_LABEL'; + + String get landmarkFormLabel => 'LANDMARK_FORM_LABEL'; + + String get householdAddressLine2LabelText => + 'HOUSEHOLD_ADDRESS_LINE_2_FORM_LABEL'; + + String get postalCodeFormLabel => 'POSTAL_CODE_FORM_LABEL'; + + String get actionLabel => 'HOUSEHOLD_LOCATION_ACTION_LABEL'; +} + +class IndividualDetails { + const IndividualDetails(); + + String get individualsDetailsLabelText => 'INDIVIDUAL_LABEL_TEXT'; + + String get nameLabelText => 'INDIVIDUAL_NAME_LABEL_TEXT'; + + String get checkboxLabelText => 'HEAD_OF_HOUSEHOLD_LABEL_TEXT'; + + String get idTypeLabelText => 'ID_TYPE_LABEL_TEXT'; + + String get idNumberLabelText => 'ID_NUMBER_LABEL_TEXT'; + + String get idNumberSuggestionText => 'ID_NUMBER_SUGGESTION_TEXT'; + + String get dobLabelText => 'DOB_LABEL_TEXT'; + + String get ageLabelText => 'AGE_LABEL_TEXT'; + + String get separatorLabelText => 'SEPARATOR_LABEL_TEXT'; + + String get genderLabelText => 'GENDER_LABEL_TEXT'; + + String get dobErrorText => 'DOB_ERROR_MESSAGE'; + + String get mobileNumberLabelText => 'MOBILE_NUMBER_LABEL_TEXT'; + + String get heightLabelText => 'HEIGHT_LABEL_TEXT'; + + String get submitButtonLabelText => 'INDIVIDUAL_DETAILS_SUBMIT'; + + String get mobileNumberInvalidFormatValidationMessage => + 'INDIVIDUAL_DETAILS_INVALID_MOBILE_NUMBER'; + + String get yearsHintText => 'YEARS_HINT_TEXT'; + String get monthsHintText => 'MONTHS_HINT_TEXT'; + + String get yearsErrorText => 'ERR_YEARS'; + + String get monthsErrorText => 'ERR_MONTHS'; + + String get yearsAndMonthsErrorText => 'ERR_YEARS_AND_MONTHS'; + + String get linkVoucherToIndividual => 'LINK_VOUCHER_TO_INDIVIDUAL'; +} + +class SearchBeneficiary { + const SearchBeneficiary(); + + String get statisticsLabelText => 'BENEFICIARY_STATISTICS_LABEL_TEXT'; + + String get searchIndividualLabelText => + 'BENEFICIARY_STATISTICS_SEARCH_INDIVIDUAL_LABEL'; + + String get noOfHouseholdsRegistered => 'NO_OF_HOUSEHOLDS_REGISTERED'; + + String get noOfResourcesDelivered => 'NO_OF_RESOURCES_DELIVERED'; + + String get beneficiarySearchHintText => 'BENEFICIARY_SEARCH_HINT_TEXT'; + + String get beneficiaryIndividualSearchHintText => + 'BENEFICIARY_INDIVIDUAL_SEARCH_HINT_TEXT'; + + String get beneficiaryInfoDescription => 'BENEFICIARY_INFO_DESCRIPTION'; + + String get beneficiaryInfoTitle => 'BENEFICIARY_INFO_TITLE'; + + String get beneficiaryAddActionLabel => 'BENEFICIARY_ADD_ACTION_LABEL'; + + String get iconLabel => 'ICON_LABEL'; + + String get yearsAbbr => 'YEARS_ABBR'; + + String get monthsAbbr => 'MONTHS_ABBR'; + + String get proximityLabel => 'PROXIMITY_LABEL'; +} + diff --git a/packages/complaints/lib/utils/typedefs.dart b/packages/complaints/lib/utils/typedefs.dart new file mode 100644 index 000000000..9e1a900e3 --- /dev/null +++ b/packages/complaints/lib/utils/typedefs.dart @@ -0,0 +1,6 @@ +import 'package:digit_data_model/data_model.dart'; + +import '../models/pgr_complaints.dart'; + +typedef PgrServiceDataRepository += DataRepository; \ No newline at end of file diff --git a/packages/complaints/lib/utils/utils.dart b/packages/complaints/lib/utils/utils.dart new file mode 100644 index 000000000..3f12f1df0 --- /dev/null +++ b/packages/complaints/lib/utils/utils.dart @@ -0,0 +1,105 @@ +import 'package:digit_data_model/data_model.dart'; +import 'package:reactive_forms/reactive_forms.dart'; + + + +export 'extensions/extensions.dart'; + +//singleton class for complaints operations +class ComplaintsSingleton { + static final ComplaintsSingleton _singleton = ComplaintsSingleton._internal(); + + // Factory constructor that returns the singleton instance. + factory ComplaintsSingleton() { + return _singleton; + } + + //Private constructor for the singleton pattern + ComplaintsSingleton._internal(); + + //various properties related to the Complaints + String? _tenantId = ''; + String? _loggedInUserUuid = ''; + String? _userMobileNumber = ''; + String? _loggedInUserName = ''; + + List? _complaintTypes; + BoundaryModel? _boundaryModel; + String? _userName =''; + + PersistenceConfiguration _persistenceConfiguration = PersistenceConfiguration + .offlineFirst; // Default to offline first persistence configuration + + void setInitialData({ + String? tenantId, + String? loggedInUserUuid, + String? userMobileNumber, + String? loggedInUserName, + + List? complaintTypes, + String? userName, + }){ + + _tenantId = tenantId; + _loggedInUserUuid = loggedInUserUuid; + _userMobileNumber = userMobileNumber; + _loggedInUserName = loggedInUserName; + + _complaintTypes = complaintTypes; + _userName = userName; + + } + + void setPersistenceConfiguration(PersistenceConfiguration configuration) { + _persistenceConfiguration = configuration; + } + + void setTenantId({required String tenantId}) { + _tenantId = tenantId; + } + + void setBoundary({required BoundaryModel boundary}) { + _boundaryModel = boundary; + } + + get tenantId => _tenantId; + get loggedInUserUuid => _loggedInUserUuid; + get userMobileNumber => _userMobileNumber; + get loggedInUserName => _loggedInUserName; + get complaintTypes => _complaintTypes; + get persistenceConfiguration => _persistenceConfiguration; + + get boundary => _boundaryModel; + get userName => _userName; + + +} + +class CustomValidator { + /// Validates that control's value must be `true` + static Map? requiredMin( + AbstractControl control, + ) { + return control.value == null || + control.value.toString().length >= 2 || + control.value.toString().trim().isEmpty + ? null + : {'required': true}; + } + + static Map? validMobileNumber( + AbstractControl control, + ) { + if (control.value == null || control.value.toString().isEmpty) { + return null; + } + + const pattern = r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$'; + + if (RegExp(pattern).hasMatch(control.value.toString())) return null; + + if (control.value.toString().length < 10) return {'mobileNumber': true}; + + return {'mobileNumber': true}; + } +} diff --git a/packages/complaints/lib/widgets/boundary_selection_wrapper.dart b/packages/complaints/lib/widgets/boundary_selection_wrapper.dart new file mode 100644 index 000000000..5489b088f --- /dev/null +++ b/packages/complaints/lib/widgets/boundary_selection_wrapper.dart @@ -0,0 +1,37 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:complaints/router/complaints_router.gm.dart'; +import 'package:digit_components/digit_components.dart'; +import 'package:digit_data_model/blocs/boundary/boundary.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + + +/// Wraps the [child] widget with a [BlocListener] that listens to +/// [BoundaryState] changes and navigates to [HomeRoute] when submitted. +class BoundarySelectionWrapper extends StatelessWidget { + final Widget child; + + const BoundarySelectionWrapper({ + Key? key, + required this.child, + }) : super(key: key); + + @override + Widget build(BuildContext context) => + BlocListener( + listener: (context, state) { + if (state.hasSubmitted) { + context.navigateTo( + const ComplaintsInboxWrapperRoute(), + onFailure: (failure) { + AppLogger.instance.error( + title: 'BoundarySelectionWrapper', + message: failure.toString(), + ); + }, + ); + } + }, + child: child, + ); +} diff --git a/packages/complaints/lib/widgets/header/back_navigation_help_header.dart b/packages/complaints/lib/widgets/header/back_navigation_help_header.dart new file mode 100644 index 000000000..3bb5b41c3 --- /dev/null +++ b/packages/complaints/lib/widgets/header/back_navigation_help_header.dart @@ -0,0 +1,80 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:digit_components/digit_components.dart'; +import 'package:flutter/material.dart'; + +import '/blocs/localization/app_localization.dart'; +import '/utils/i18_key_constants.dart' as i18; + +class BackNavigationHelpHeaderWidget extends StatelessWidget { + final bool showHelp; + final bool showBackNavigation; + final bool showLogoutCTA; + final VoidCallback? helpClicked; + final VoidCallback? handleBack; + + const BackNavigationHelpHeaderWidget({ + super.key, + this.showHelp = false, //hiding help + this.showBackNavigation = true, + this.showLogoutCTA = false, + this.helpClicked, + this.handleBack, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Padding( + padding: const EdgeInsets.all(kPadding / 2), + child: Row( + children: [ + Expanded( + child: Row( + children: [ + if (showBackNavigation) + Flexible( + child: TextButton.icon( + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.onSurface, + padding: EdgeInsets.zero, + ), + onPressed: () { + context.router.maybePop(); + handleBack != null ? handleBack!() : null; + }, + icon: const Icon(Icons.arrow_left_sharp), + label: Text( + ComplaintsLocalization.of(context).translate( + i18.common.coreCommonBack, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ), + ], + ), + ), + SizedBox(width: showHelp ? kPadding * 2 : 0), + if (showHelp) + TextButton( + style: TextButton.styleFrom(padding: EdgeInsets.zero), + onPressed: helpClicked, + child: Row( + children: [ + Text( + ComplaintsLocalization.of(context) + .translate(i18.common.coreCommonHelp), + overflow: TextOverflow.ellipsis, + ), + const Icon( + Icons.help_outline_outlined, + ), // Add the icon to the right + ], + ), + ), + ], + ), + ); + } +} diff --git a/packages/complaints/lib/widgets/localized.dart b/packages/complaints/lib/widgets/localized.dart new file mode 100644 index 000000000..c2a9e1ba1 --- /dev/null +++ b/packages/complaints/lib/widgets/localized.dart @@ -0,0 +1,34 @@ +import 'package:flutter/cupertino.dart'; + +import '/blocs/localization/app_localization.dart'; + +abstract class LocalizedStatefulWidget extends StatefulWidget { + final ComplaintsLocalization? appLocalizations; + + const LocalizedStatefulWidget({ + super.key, + this.appLocalizations, + }); +} + +abstract class LocalizedState + extends State { + late ComplaintsLocalization _localizations; + + ComplaintsLocalization get localizations => _localizations; + + set localizations(ComplaintsLocalization localizations) { + if (mounted) { + setState(() { + _localizations = localizations; + }); + } + } + + @override + @mustCallSuper + void didChangeDependencies() { + _localizations = widget.appLocalizations ?? ComplaintsLocalization.of(context); + super.didChangeDependencies(); + } +} diff --git a/packages/complaints/lib/widgets/no_result_card/no_result_card.dart b/packages/complaints/lib/widgets/no_result_card/no_result_card.dart new file mode 100644 index 000000000..fc7d52119 --- /dev/null +++ b/packages/complaints/lib/widgets/no_result_card/no_result_card.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '/utils/constants.dart'; + +class NoResultCard extends StatelessWidget { + final AlignmentGeometry align; + final String? label; + const NoResultCard({ + super.key, + this.align = Alignment.centerLeft, + this.label, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Align( + alignment: align, + child: Padding( + padding: const EdgeInsets.only(top: 100, bottom: 10, right: 8), + child: Column( + children: [ + SvgPicture.asset( + noResultSvg, + width: 340, + height: 200, + ), + const SizedBox(height: 20), + Text( + label ?? '', + style: theme.textTheme.bodyMedium, + ), + ], + ), + ), + ); + } +} diff --git a/packages/complaints/pubspec.yaml b/packages/complaints/pubspec.yaml new file mode 100644 index 000000000..070b3a346 --- /dev/null +++ b/packages/complaints/pubspec.yaml @@ -0,0 +1,85 @@ +name: complaints +description: This package offers filing complaints features, allowing users to file complaints. +version: 0.0.1-dev.1 +homepage: + +environment: + sdk: '>=3.0.0 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + digit_components: ^1.0.0+2 + flutter_bloc: ^8.1.1 + freezed_annotation: ^2.1.0 + build_runner: ^2.2.1 + auto_route: ^7.8.4 + digit_data_model: 1.0.4-dev.1 + dart_mappable: ^4.2.0 + group_radio_button: ^1.3.0 + reactive_forms: ^14.1.0 + recase: ^4.1.0 + flutter_dotenv: ^5.0.2 + flutter_svg: ^2.0.8 + path_provider: ^2.0.11 + intl: ^0.18.0 + drift: ^2.0.0 + dio: ^5.1.2 + isar: ^3.0.5 + + + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + auto_route_generator: ^7.3.2 + freezed: ^2.1.0+1 + json_serializable: ^6.4.0 + dart_mappable_builder: + git: + url: https://github.com/egovernments/health-campaign-field-worker-app/ + ref: master + path: ./packages/dart_mappable_builder + bloc_test: ^9.1.0 + mocktail: ^1.0.2 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + assets: + - assets/icons/svg/ + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/complaints/test/complaints_inbox_bloc_test.dart b/packages/complaints/test/complaints_inbox_bloc_test.dart new file mode 100644 index 000000000..7f0f06a11 --- /dev/null +++ b/packages/complaints/test/complaints_inbox_bloc_test.dart @@ -0,0 +1,55 @@ +import 'package:complaints/blocs/complaints_inbox/complaints_inbox.dart'; +import 'package:complaints/utils/typedefs.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:bloc_test/bloc_test.dart'; + +import 'package:complaints/complaints.dart'; + +import 'constants/test_constants.dart'; + + +class MockPgrServiceDataRepository extends Mock implements + PgrServiceDataRepository {} + +void main(){ + //Define a test group for the Complaints Inbox Bloc + group('ComplaintsInboxBloc', () { + //Declare a variable for complaint inbox bloc + late ComplaintsInboxBloc complaintsInboxBloc; + + //Mock the required repositories + late MockPgrServiceDataRepository pgrServiceDataRepository; + + setUp((){ + pgrServiceDataRepository = MockPgrServiceDataRepository(); + complaintsInboxBloc = ComplaintsInboxBloc( + const ComplaintInboxState.complaints(), + pgrRepository: pgrServiceDataRepository + ); + }); + + + //Test case for _handleLoadComplaints + blocTest( + 'emits [ComplaintsInboxState with isFiltered false] when ComplaintInboxLoadComplaintEvent is added', + build: (){ + return complaintsInboxBloc; + }, + act: (bloc){ + bloc.add( + ComplaintInboxLoadComplaintsEvent( + updatedModels: [ComplaintsConstants.mockPgrServiceModel], + createdByUserId: ComplaintsConstants.createdByUserId)); + }, + expect: ()=>[ + ComplaintInboxState.complaints( + loading: false, + complaints: [ComplaintsConstants.mockPgrServiceModel], + isFiltered: false, + ), + ] + ); + + }); +} \ No newline at end of file diff --git a/packages/complaints/test/complaints_registration_bloc_test.dart b/packages/complaints/test/complaints_registration_bloc_test.dart new file mode 100644 index 000000000..139a48def --- /dev/null +++ b/packages/complaints/test/complaints_registration_bloc_test.dart @@ -0,0 +1,122 @@ +// Import necessary packages for Flutter testing and mocktail. +import 'package:complaints/blocs/complaints_registration/complaints_registration.dart'; +import 'package:complaints/utils/typedefs.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:complaints/complaints.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:bloc_test/bloc_test.dart'; + +import 'constants/test_constants.dart'; + +class MockPgrServiceDataRepository extends Mock + implements PgrServiceDataRepository {} + + +void main() { + // Define a test group for the ComplaintsRegistrationBloc + group('ComplaintRegistrationBloc', () + { + late ComplaintsRegistrationBloc + complaintsRegistrationBloc; // Declare a variable for the ComplaintsRegistrationBloc. + // Mock the required repositories + final pgrServiceDataRepository = MockPgrServiceDataRepository(); + + // Set up the test environment before each test. + setUp(() { + complaintsRegistrationBloc = ComplaintsRegistrationBloc( + const ComplaintsRegistrationState.create(), + pgrServiceRepository: pgrServiceDataRepository + ); + }); + + setUpAll(() { + registerFallbackValue(ComplaintsConstants.mockPgrServiceModel); + }); + + // Test the initial state of the ComplaintsRegistrationBloc. + test('Initial state is correct', () { + expect( + complaintsRegistrationBloc.state, + equals(const ComplaintsRegistrationState + .create())); // Ensure that the initial state matches the expected state. + }); + + //Test case for _handleSaveComplaintType in create state + blocTest( + 'emits [ComplaintsRegistrationState with complaintType] when _handleSaveComplaintType is called in create state', + build: () => complaintsRegistrationBloc, + act: (bloc) { + bloc.add(const ComplaintsRegistrationSaveComplaintTypeEvent( + complaintType: ComplaintsConstants.complaintType, + )); + }, + expect: ()=> [ + const ComplaintsRegistrationState.create( + complaintType: ComplaintsConstants.complaintType, + ), + ], + ); + + //Test case for _handleSaveAddress in create state + blocTest( + 'emits [ComplaintsRegistrationState with complaintAddress] when _handleSaveAddress is called in create state', + build: ()=>complaintsRegistrationBloc, + act: (bloc){ + bloc.add(ComplaintsRegistrationSaveAddressEvent( + addressModel: ComplaintsConstants.addressModel, + )); + }, + expect: ()=>[ + ComplaintsRegistrationState.create( + addressModel: ComplaintsConstants.addressModel, + ), + ], + ); + + //Test case for _handleComplaintDetails in create state + blocTest( + 'emits [ComplaintsRegistrationState with complaintsDetails] when _handleComplaintDetails is called in create state', + build: ()=>complaintsRegistrationBloc, + act: (bloc){ + bloc.add( + ComplaintsRegistrationSaveComplaintDetailsEvent( + complaintsDetailsModel: ComplaintsConstants.complaintsDetailsModel, + boundaryModel: ComplaintsConstants.boundaryModel, + ) + ); + }, + expect: ()=>[ + ComplaintsRegistrationState.create( + complaintsDetailsModel: ComplaintsConstants.complaintsDetailsModel, + ), + ], + ); + + //Test case for _handleSubmitComplaints in create state + blocTest( + 'emits [ComplaintsRegistrationPersistedState] when _handleSubmitComplaints is called', + build: () { + when(()=>pgrServiceDataRepository.create(any())) + .thenAnswer((_) async => ComplaintsConstants.mockPgrServiceModel); + return complaintsRegistrationBloc; + }, + + act: (bloc){ + bloc.emit(ComplaintsRegistrationState.create( + complaintType: ComplaintsConstants.complaintType, + addressModel: ComplaintsConstants.addressModel, + complaintsDetailsModel: ComplaintsConstants.complaintsDetailsModel, + )); + }, + expect: ()=>[ + ComplaintsRegistrationState.create( + complaintType: ComplaintsConstants.complaintType, + addressModel: ComplaintsConstants.addressModel, + complaintsDetailsModel: ComplaintsConstants.complaintsDetailsModel, + loading: false, + ), + ], + ); + + }); +} diff --git a/packages/complaints/test/constants/test_constants.dart b/packages/complaints/test/constants/test_constants.dart new file mode 100644 index 000000000..9f489b38d --- /dev/null +++ b/packages/complaints/test/constants/test_constants.dart @@ -0,0 +1,41 @@ +import 'package:complaints/complaints.dart'; +import 'package:digit_data_model/data_model.dart'; +import 'package:digit_data_model/models/entities/pgr_application_status.dart'; + +class ComplaintsConstants{ + static final ComplaintsDetailsModel complaintsDetailsModel = ComplaintsDetailsModel( + dateOfComplaint: DateTime(2024), + administrativeArea: "Settlement 1", + complaintRaisedFor: "myself", + complainantName: "Security Issues", + complainantContactNumber: "9192939495", + complaintDescription: "test complaint" + ); + + static final BoundaryModel boundaryModel = BoundaryModel( + latitude: "76", + longitude: "88", + ); + + static const String complaintType = "Security Issues"; + + static final PgrAddressModel addressModel = PgrAddressModel( + street: "Jane", + city: "NY", + ); + static const String createdByUserId = "123456789"; + + static var mockPgrServiceModel = PgrServiceModel( + clientReferenceId: '123', + tenantId: 'mz', + serviceCode: complaintType, + description: 'test-complaint', + applicationStatus: PgrServiceApplicationStatus.created, + user: const PgrComplainantModel( + clientReferenceId: '123', + complaintClientReferenceId: '123', + tenantId: 'mz', + ), + address: addressModel + ); +} \ No newline at end of file diff --git a/packages/digit_components/lib/widgets/atoms/selection_card.dart b/packages/digit_components/lib/widgets/atoms/selection_card.dart index 1a9191c2f..3c1e256b5 100644 --- a/packages/digit_components/lib/widgets/atoms/selection_card.dart +++ b/packages/digit_components/lib/widgets/atoms/selection_card.dart @@ -43,7 +43,9 @@ class _SelectionBoxState extends State> { } if (widget.equalWidthOptions) { + WidgetsBinding.instance.addPostFrameCallback((_) { _calculateMaxOptionWidth(); + }); } } @@ -51,7 +53,9 @@ class _SelectionBoxState extends State> { void didChangeDependencies() { super.didChangeDependencies(); if (widget.equalWidthOptions) { + WidgetsBinding.instance.addPostFrameCallback((_) { _calculateMaxOptionWidth(); + }); } } @override diff --git a/packages/digit_components/pubspec.lock b/packages/digit_components/pubspec.lock index 7c84c45c4..348cbbff0 100644 --- a/packages/digit_components/pubspec.lock +++ b/packages/digit_components/pubspec.lock @@ -488,6 +488,30 @@ packages: url: "https://pub.dev" source: hosted version: "6.8.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -540,26 +564,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" mime: dependency: transitive description: @@ -628,10 +652,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_provider: dependency: transitive description: @@ -881,26 +905,26 @@ packages: dependency: transitive description: name: test - sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" url: "https://pub.dev" source: hosted - version: "1.24.9" + version: "1.25.2" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" test_core: dependency: transitive description: name: test_core - sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" url: "https://pub.dev" source: hosted - version: "0.5.9" + version: "0.6.0" timing: dependency: transitive description: @@ -929,10 +953,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.1" watcher: dependency: transitive description: @@ -990,5 +1014,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0 <3.9.0" - flutter: ">=3.16.0" + dart: ">=3.3.0 <3.9.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/packages/digit_data_model/CHANGELOG.md b/packages/digit_data_model/CHANGELOG.md index 49f954173..949ee91e7 100644 --- a/packages/digit_data_model/CHANGELOG.md +++ b/packages/digit_data_model/CHANGELOG.md @@ -1,12 +1,30 @@ +## 1.0.4-dev.5 + +* Merged pgr and checklist changes + ## 1.0.3+1 * Updated oplog transactions to synchronous - fix for write transaction lock +## 1.0.4-dev.4 + +* synced with 1.0.4-dev.3 changes + ## 1.0.4-dev.3 * Updated oplog transactions to synchronous - fix for write transaction lock * Same change in 1.0.3-hotfix, 1.0.4-dev.3 +## 1.0.4-dev.2 + +* Removed Service and Service Definition models + - Removed Service repositories and Service blocs to integrate in checklist package + +## 1.0.4-dev.1 + +* Separated PGR Package +* Moved Models, Bloc, Repositories related to PGR Package + ## 1.0.3 * Added localization table diff --git a/packages/digit_data_model/lib/data/local_store/sql_store/sql_store.dart b/packages/digit_data_model/lib/data/local_store/sql_store/sql_store.dart index 5ac28bd5d..3bb9ed6c1 100644 --- a/packages/digit_data_model/lib/data/local_store/sql_store/sql_store.dart +++ b/packages/digit_data_model/lib/data/local_store/sql_store/sql_store.dart @@ -11,7 +11,7 @@ import '../../../models/entities/address_type.dart'; import '../../../models/entities/beneficiary_type.dart'; import '../../../models/entities/blood_group.dart'; import '../../../models/entities/gender.dart'; -import '../../../models/pgr_complaints/pgr_complaints.dart'; +import '../../../models/entities/pgr_application_status.dart'; import 'tables/address.dart'; import 'tables/attributes.dart'; import 'tables/boundary.dart'; diff --git a/packages/digit_data_model/lib/data/local_store/sql_store/tables/pgr_service.dart b/packages/digit_data_model/lib/data/local_store/sql_store/tables/pgr_service.dart index d6934513b..abaa3745c 100644 --- a/packages/digit_data_model/lib/data/local_store/sql_store/tables/pgr_service.dart +++ b/packages/digit_data_model/lib/data/local_store/sql_store/tables/pgr_service.dart @@ -1,6 +1,6 @@ import 'package:drift/drift.dart'; -import '../../../../models/pgr_complaints/pgr_complaints.dart'; +import '/models/entities/pgr_application_status.dart'; class PgrService extends Table { diff --git a/packages/digit_data_model/lib/data/oplog/oplog.dart b/packages/digit_data_model/lib/data/oplog/oplog.dart index c22c3ede1..6ea7b7ba9 100644 --- a/packages/digit_data_model/lib/data/oplog/oplog.dart +++ b/packages/digit_data_model/lib/data/oplog/oplog.dart @@ -163,59 +163,6 @@ class ProjectOpLogManager extends OpLogManager { entity.nonRecoverableError; } -class ServiceDefinitionOpLogManager - extends OpLogManager { - ServiceDefinitionOpLogManager(super.isar); - - @override - ServiceDefinitionModel applyServerGeneratedIdToEntity( - ServiceDefinitionModel entity, - String serverGeneratedId, - int rowVersion, - ) => - entity.copyWith(id: serverGeneratedId, rowVersion: rowVersion); - - @override - String getClientReferenceId(ServiceDefinitionModel entity) { - throw UnimplementedError(); - } - - @override - String? getServerGeneratedId(ServiceDefinitionModel entity) => entity.id; - - @override - int? getRowVersion(ServiceDefinitionModel entity) => entity.rowVersion; - - @override - bool? getNonRecoverableError(ServiceDefinitionModel entity) => - entity.nonRecoverableError; -} - -class ServiceOpLogManager extends OpLogManager { - ServiceOpLogManager(super.isar); - - @override - ServiceModel applyServerGeneratedIdToEntity( - ServiceModel entity, - String serverGeneratedId, - int rowVersion, - ) => - entity.copyWith(id: serverGeneratedId, rowVersion: rowVersion); - - @override - String getClientReferenceId(ServiceModel entity) => entity.clientId; - - @override - String? getServerGeneratedId(ServiceModel entity) => entity.id; - - @override - int? getRowVersion(ServiceModel entity) => entity.rowVersion; - - @override - bool? getNonRecoverableError(ServiceModel entity) => - entity.nonRecoverableError; -} - class ProjectResourceOpLogManager extends OpLogManager { ProjectResourceOpLogManager(super.isar); @@ -292,92 +239,3 @@ class BoundaryOpLogManager extends OpLogManager { bool? getNonRecoverableError(BoundaryModel entity) => throw UnimplementedError(); } - -class PgrServiceOpLogManager extends OpLogManager { - PgrServiceOpLogManager(super.isar); - - @override - PgrServiceModel applyServerGeneratedIdToEntity( - PgrServiceModel entity, - String serverGeneratedId, - int rowVersion, - ) => - entity.copyWith( - serviceRequestId: serverGeneratedId, - rowVersion: rowVersion, - ); - - @override - String getClientReferenceId(PgrServiceModel entity) { - return entity.clientReferenceId; - } - - @override - String? getServerGeneratedId(PgrServiceModel entity) { - return entity.serviceRequestId; - } - - @override - int? getRowVersion(PgrServiceModel entity) => entity.rowVersion; - - @override - bool? getNonRecoverableError(PgrServiceModel entity) => - entity.nonRecoverableError; - - @override - Future>> getPendingUpSync( - DataModelType type, { - required String createdBy, - }) async { - final pendingEntries = await isar.opLogs - .filter() - .entityTypeEqualTo(type) - .operationEqualTo(DataOperation.create) - .serverGeneratedIdIsNull() - .syncedUpEqualTo(false) - .syncedDownEqualTo(false) - .createdByEqualTo(createdBy) - .sortByCreatedAt() - .findAll(); - - final entriesList = pendingEntries.map((e) { - return OpLogEntry.fromOpLog(e); - }).toList(); - - return entriesList; - } - - //Note: PendingDownSync is not required for PGR Create Oplogs. This creates Mapper Exception issue for checking pending downsync entries of complaints type - // @override - // Future>> getPendingDownSync( - // DataModelType type, { - // required String createdBy, - // }) async { - // final pendingEntries = await isar.opLogs - // .filter() - // .entityTypeEqualTo(type) - // .serverGeneratedIdIsNotNull() - // .syncedUpEqualTo(true) - // .syncedDownEqualTo(false) - // .createdByEqualTo(createdBy) - // .sortByCreatedAt() - // .findAll(); - // - // final entriesList = pendingEntries - // .map((e) { - // final entity = e.getEntity(); - // if ([ - // PgrServiceApplicationStatus.created, - // PgrServiceApplicationStatus.pendingAssignment, - // ].contains(entity.applicationStatus)) { - // return OpLogEntry.fromOpLog(e); - // } - // - // return null; - // }) - // .whereNotNull() - // .toList(); - // - // return entriesList; - // } -} diff --git a/packages/digit_data_model/lib/data/repositories/local/base/service_attributes_base.dart b/packages/digit_data_model/lib/data/repositories/local/base/service_attributes_base.dart deleted file mode 100644 index 038ba41fd..000000000 --- a/packages/digit_data_model/lib/data/repositories/local/base/service_attributes_base.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:digit_data_model/data_model.dart'; -import 'package:drift/drift.dart'; - -abstract class ServiceAttributesLocalBaseRepository - extends LocalRepository { - const ServiceAttributesLocalBaseRepository(super.sql, super.opLogManager); - - @override - DataModelType get type => DataModelType.serviceAttributes; - - TableInfo get table => sql.serviceAttributes; -} diff --git a/packages/digit_data_model/lib/data/repositories/local/base/service_base.dart b/packages/digit_data_model/lib/data/repositories/local/base/service_base.dart deleted file mode 100644 index 0b0d19dac..000000000 --- a/packages/digit_data_model/lib/data/repositories/local/base/service_base.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:digit_data_model/data_model.dart'; -import 'package:drift/drift.dart'; - -abstract class ServiceLocalBaseRepository - extends LocalRepository { - const ServiceLocalBaseRepository(super.sql, super.opLogManager); - - @override - DataModelType get type => DataModelType.service; - - TableInfo get table => sql.service; -} \ No newline at end of file diff --git a/packages/digit_data_model/lib/data/repositories/local/base/service_definition_base.dart b/packages/digit_data_model/lib/data/repositories/local/base/service_definition_base.dart deleted file mode 100644 index 9a5e0043b..000000000 --- a/packages/digit_data_model/lib/data/repositories/local/base/service_definition_base.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:digit_data_model/data_model.dart'; -import 'package:drift/drift.dart'; - - -abstract class ServiceDefinitionLocalBaseRepository - extends LocalRepository { - const ServiceDefinitionLocalBaseRepository(super.sql, super.opLogManager); - - @override - DataModelType get type => DataModelType.serviceDefinition; - - TableInfo get table => sql.serviceDefinition; -} diff --git a/packages/digit_data_model/lib/data_model.dart b/packages/digit_data_model/lib/data_model.dart index 15e7ae7be..9524a38d3 100644 --- a/packages/digit_data_model/lib/data_model.dart +++ b/packages/digit_data_model/lib/data_model.dart @@ -18,8 +18,6 @@ export 'blocs/product_variant/product_variant.dart'; export 'blocs/project_facility/project_facility.dart'; export 'blocs/user/user.dart'; export 'blocs/boundary/boundary.dart'; -export 'blocs/service/service.dart'; -export 'blocs/service_definition/service_definition.dart'; export 'data/data_repository.dart'; export 'data/local_store/no_sql/schema/oplog.dart' hide AdditionalId; export 'data/local_store/sql_store/sql_store.dart'; @@ -34,27 +32,20 @@ export 'data/repositories/local/base/project_facility_base.dart'; export 'data/repositories/local/base/project_product_variant_base.dart'; export 'data/repositories/local/base/project_resource_base.dart'; export 'data/repositories/local/base/project_staff_base.dart'; -export 'data/repositories/local/base/service_attributes_base.dart'; -export 'data/repositories/local/base/service_base.dart'; -export 'data/repositories/local/base/service_definition_base.dart'; export 'data/repositories/local/base/user_base.dart'; export 'data/repositories/local/boundary.dart'; export 'data/repositories/local/facility.dart'; export 'data/repositories/local/individual.dart'; -export 'data/repositories/local/pgr_service.dart'; export 'data/repositories/local/product_variant.dart'; export 'data/repositories/local/project.dart'; export 'data/repositories/local/project_facility.dart'; export 'data/repositories/local/project_resource.dart'; export 'data/repositories/local/project_staff.dart'; -export 'data/repositories/local/service.dart'; -export 'data/repositories/local/service_definition.dart'; export 'data/repositories/oplog/oplog.dart'; export 'data/repositories/remote/attributes.dart'; export 'data/repositories/remote/boundary.dart'; export 'data/repositories/remote/facility.dart'; export 'data/repositories/remote/individual.dart'; -export 'data/repositories/remote/pgr_service.dart'; export 'data/repositories/remote/product.dart'; export 'data/repositories/remote/product_variant.dart'; export 'data/repositories/remote/project.dart'; @@ -62,9 +53,6 @@ export 'data/repositories/remote/project_facility.dart'; export 'data/repositories/remote/project_product_variant.dart'; export 'data/repositories/remote/project_resource.dart'; export 'data/repositories/remote/project_staff.dart'; -export 'data/repositories/remote/service.dart'; -export 'data/repositories/remote/service_attributes.dart'; -export 'data/repositories/remote/service_definition.dart'; export 'data/repositories/remote/user.dart'; export 'models/entities/address.dart'; export 'models/entities/attributes.dart'; @@ -87,16 +75,10 @@ export 'models/entities/project_product_variant.dart'; export 'models/entities/project_resource.dart'; export 'models/entities/project_staff.dart'; export 'models/entities/project_type.dart'; -export 'models/entities/service.dart'; -export 'models/entities/service_attributes.dart'; -export 'models/entities/service_definition.dart'; export 'models/entities/target.dart'; export 'models/entities/user.dart'; export 'models/oplog/oplog_entry.dart' show OpLogEntry; export 'models/oplog/oplog_entry.dart'; -export 'models/pgr_complaints/pgr_address.dart'; -export 'models/pgr_complaints/pgr_complaints.dart'; -export 'models/pgr_complaints/pgr_complaints_response.dart'; export 'models/project_type/project_type_model.dart'; export 'utils/constants.dart' hide EntityPlurals; export 'utils/utils.dart'; diff --git a/packages/digit_data_model/lib/data_model.init.dart b/packages/digit_data_model/lib/data_model.init.dart index 3abdaf1ed..65238f663 100644 --- a/packages/digit_data_model/lib/data_model.init.dart +++ b/packages/digit_data_model/lib/data_model.init.dart @@ -17,23 +17,18 @@ import 'models/entities/identifier.dart' as p10; import 'models/entities/individual.dart' as p11; import 'models/entities/locality.dart' as p12; import 'models/entities/name.dart' as p13; -import 'models/entities/product.dart' as p14; -import 'models/entities/product_variant.dart' as p15; -import 'models/entities/project.dart' as p16; -import 'models/entities/project_facility.dart' as p17; -import 'models/entities/project_product_variant.dart' as p18; -import 'models/entities/project_resource.dart' as p19; -import 'models/entities/project_staff.dart' as p20; -import 'models/entities/project_type.dart' as p21; -import 'models/entities/service.dart' as p22; -import 'models/entities/service_attributes.dart' as p23; -import 'models/entities/service_definition.dart' as p24; -import 'models/entities/target.dart' as p25; -import 'models/entities/user.dart' as p26; -import 'models/oplog/oplog_entry.dart' as p27; -import 'models/pgr_complaints/pgr_address.dart' as p28; -import 'models/pgr_complaints/pgr_complaints.dart' as p29; -import 'models/pgr_complaints/pgr_complaints_response.dart' as p30; +import 'models/entities/pgr_application_status.dart' as p14; +import 'models/entities/product.dart' as p15; +import 'models/entities/product_variant.dart' as p16; +import 'models/entities/project.dart' as p17; +import 'models/entities/project_facility.dart' as p18; +import 'models/entities/project_product_variant.dart' as p19; +import 'models/entities/project_resource.dart' as p20; +import 'models/entities/project_staff.dart' as p21; +import 'models/entities/project_type.dart' as p22; +import 'models/entities/target.dart' as p23; +import 'models/entities/user.dart' as p24; +import 'models/oplog/oplog_entry.dart' as p25; void initializeMappers() { p0.EntityModelMapper.ensureInitialized(); @@ -72,67 +67,43 @@ void initializeMappers() { p13.NameSearchModelMapper.ensureInitialized(); p13.NameModelMapper.ensureInitialized(); p13.NameAdditionalFieldsMapper.ensureInitialized(); - p14.ProductSearchModelMapper.ensureInitialized(); - p14.ProductModelMapper.ensureInitialized(); - p14.ProductAdditionalFieldsMapper.ensureInitialized(); - p15.ProductVariantSearchModelMapper.ensureInitialized(); - p15.ProductVariantModelMapper.ensureInitialized(); - p15.ProductVariantAdditionalFieldsMapper.ensureInitialized(); - p16.ProjectSearchModelMapper.ensureInitialized(); - p16.ProjectModelMapper.ensureInitialized(); - p16.ProjectAdditionalFieldsMapper.ensureInitialized(); - p16.ProjectAdditionalDetailsMapper.ensureInitialized(); - p17.ProjectFacilitySearchModelMapper.ensureInitialized(); - p17.ProjectFacilityModelMapper.ensureInitialized(); - p17.ProjectFacilityAdditionalFieldsMapper.ensureInitialized(); - p18.ProjectProductVariantSearchModelMapper.ensureInitialized(); - p18.ProjectProductVariantModelMapper.ensureInitialized(); - p18.ProjectProductVariantAdditionalFieldsMapper.ensureInitialized(); - p19.ProjectResourceSearchModelMapper.ensureInitialized(); - p19.ProjectResourceModelMapper.ensureInitialized(); - p19.ProjectResourceAdditionalFieldsMapper.ensureInitialized(); - p20.ProjectStaffSearchModelMapper.ensureInitialized(); - p20.ProjectStaffModelMapper.ensureInitialized(); - p20.ProjectStaffAdditionalFieldsMapper.ensureInitialized(); - p21.ProjectTypeModelMapper.ensureInitialized(); - p21.ProjectTypeAdditionalFieldsMapper.ensureInitialized(); - p21.ProjectCycleMapper.ensureInitialized(); - p21.ProjectCycleDeliveryMapper.ensureInitialized(); - p21.DeliveryDoseCriteriaMapper.ensureInitialized(); - p21.DeliveryProductVariantMapper.ensureInitialized(); - p22.ServiceSearchModelMapper.ensureInitialized(); - p22.ServiceModelMapper.ensureInitialized(); - p22.ServiceAdditionalFieldsMapper.ensureInitialized(); - p23.ServiceAttributesSearchModelMapper.ensureInitialized(); - p23.ServiceAttributesModelMapper.ensureInitialized(); - p23.ServiceAttributesAdditionalFieldsMapper.ensureInitialized(); - p24.ServiceDefinitionSearchModelMapper.ensureInitialized(); - p24.ServiceDefinitionModelMapper.ensureInitialized(); - p24.ServiceDefinitionAdditionalFieldsMapper.ensureInitialized(); - p25.TargetSearchModelMapper.ensureInitialized(); - p25.TargetModelMapper.ensureInitialized(); - p25.TargetAdditionalFieldsMapper.ensureInitialized(); - p26.UserSearchModelMapper.ensureInitialized(); - p26.UserModelMapper.ensureInitialized(); - p26.UserAdditionalFieldsMapper.ensureInitialized(); - p27.OpLogEntryMapper.ensureInitialized(); - p27.AdditionalIdMapper.ensureInitialized(); - p27.DataOperationMapper.ensureInitialized(); - p27.ApiOperationMapper.ensureInitialized(); - p28.PgrAddressModelMapper.ensureInitialized(); - p28.GeoLocationMapper.ensureInitialized(); - p29.PgrComplaintModelMapper.ensureInitialized(); - p29.PgrComplainantModelMapper.ensureInitialized(); - p29.PgrRolesModelMapper.ensureInitialized(); - p29.PgrServiceSearchModelMapper.ensureInitialized(); - p29.PgrServiceModelMapper.ensureInitialized(); - p29.PgrWorkflowModelMapper.ensureInitialized(); - p29.PgrFiltersMapper.ensureInitialized(); - p29.PgrSearchKeysMapper.ensureInitialized(); - p29.PgrAdditionalDetailsMapper.ensureInitialized(); - p29.PgrServiceApplicationStatusMapper.ensureInitialized(); - p30.PgrServiceCreateResponseModelMapper.ensureInitialized(); - p30.PgrComplaintResponseModelMapper.ensureInitialized(); - p30.PgrComplainantResponseModelMapper.ensureInitialized(); - p30.PgrServiceResponseModelMapper.ensureInitialized(); + p14.PgrServiceApplicationStatusMapper.ensureInitialized(); + p15.ProductSearchModelMapper.ensureInitialized(); + p15.ProductModelMapper.ensureInitialized(); + p15.ProductAdditionalFieldsMapper.ensureInitialized(); + p16.ProductVariantSearchModelMapper.ensureInitialized(); + p16.ProductVariantModelMapper.ensureInitialized(); + p16.ProductVariantAdditionalFieldsMapper.ensureInitialized(); + p17.ProjectSearchModelMapper.ensureInitialized(); + p17.ProjectModelMapper.ensureInitialized(); + p17.ProjectAdditionalFieldsMapper.ensureInitialized(); + p17.ProjectAdditionalDetailsMapper.ensureInitialized(); + p18.ProjectFacilitySearchModelMapper.ensureInitialized(); + p18.ProjectFacilityModelMapper.ensureInitialized(); + p18.ProjectFacilityAdditionalFieldsMapper.ensureInitialized(); + p19.ProjectProductVariantSearchModelMapper.ensureInitialized(); + p19.ProjectProductVariantModelMapper.ensureInitialized(); + p19.ProjectProductVariantAdditionalFieldsMapper.ensureInitialized(); + p20.ProjectResourceSearchModelMapper.ensureInitialized(); + p20.ProjectResourceModelMapper.ensureInitialized(); + p20.ProjectResourceAdditionalFieldsMapper.ensureInitialized(); + p21.ProjectStaffSearchModelMapper.ensureInitialized(); + p21.ProjectStaffModelMapper.ensureInitialized(); + p21.ProjectStaffAdditionalFieldsMapper.ensureInitialized(); + p22.ProjectTypeModelMapper.ensureInitialized(); + p22.ProjectTypeAdditionalFieldsMapper.ensureInitialized(); + p22.ProjectCycleMapper.ensureInitialized(); + p22.ProjectCycleDeliveryMapper.ensureInitialized(); + p22.DeliveryDoseCriteriaMapper.ensureInitialized(); + p22.DeliveryProductVariantMapper.ensureInitialized(); + p23.TargetSearchModelMapper.ensureInitialized(); + p23.TargetModelMapper.ensureInitialized(); + p23.TargetAdditionalFieldsMapper.ensureInitialized(); + p24.UserSearchModelMapper.ensureInitialized(); + p24.UserModelMapper.ensureInitialized(); + p24.UserAdditionalFieldsMapper.ensureInitialized(); + p25.OpLogEntryMapper.ensureInitialized(); + p25.AdditionalIdMapper.ensureInitialized(); + p25.DataOperationMapper.ensureInitialized(); + p25.ApiOperationMapper.ensureInitialized(); } diff --git a/packages/digit_data_model/lib/models/entities/pgr_application_status.dart b/packages/digit_data_model/lib/models/entities/pgr_application_status.dart new file mode 100644 index 000000000..444a4c5a3 --- /dev/null +++ b/packages/digit_data_model/lib/models/entities/pgr_application_status.dart @@ -0,0 +1,17 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'pgr_application_status.mapper.dart'; + +@MappableEnum() +enum PgrServiceApplicationStatus { + @MappableValue('CREATED') + created, + @MappableValue('PENDING_ASSIGNMENT') + pendingAssignment, + @MappableValue('RESOLVED') + resolved, + @MappableValue('REJECTED') + rejected, + @MappableValue('CANCELLED') + cancelled, +} \ No newline at end of file diff --git a/packages/digit_data_model/lib/models/entities/pgr_application_status.mapper.dart b/packages/digit_data_model/lib/models/entities/pgr_application_status.mapper.dart new file mode 100644 index 000000000..34759f6df --- /dev/null +++ b/packages/digit_data_model/lib/models/entities/pgr_application_status.mapper.dart @@ -0,0 +1,68 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'pgr_application_status.dart'; + +class PgrServiceApplicationStatusMapper + extends EnumMapper { + PgrServiceApplicationStatusMapper._(); + + static PgrServiceApplicationStatusMapper? _instance; + static PgrServiceApplicationStatusMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals + .use(_instance = PgrServiceApplicationStatusMapper._()); + } + return _instance!; + } + + static PgrServiceApplicationStatus fromValue(dynamic value) { + ensureInitialized(); + return MapperContainer.globals.fromValue(value); + } + + @override + PgrServiceApplicationStatus decode(dynamic value) { + switch (value) { + case 'CREATED': + return PgrServiceApplicationStatus.created; + case 'PENDING_ASSIGNMENT': + return PgrServiceApplicationStatus.pendingAssignment; + case 'RESOLVED': + return PgrServiceApplicationStatus.resolved; + case 'REJECTED': + return PgrServiceApplicationStatus.rejected; + case 'CANCELLED': + return PgrServiceApplicationStatus.cancelled; + default: + throw MapperException.unknownEnumValue(value); + } + } + + @override + dynamic encode(PgrServiceApplicationStatus self) { + switch (self) { + case PgrServiceApplicationStatus.created: + return 'CREATED'; + case PgrServiceApplicationStatus.pendingAssignment: + return 'PENDING_ASSIGNMENT'; + case PgrServiceApplicationStatus.resolved: + return 'RESOLVED'; + case PgrServiceApplicationStatus.rejected: + return 'REJECTED'; + case PgrServiceApplicationStatus.cancelled: + return 'CANCELLED'; + } + } +} + +extension PgrServiceApplicationStatusMapperExtension + on PgrServiceApplicationStatus { + dynamic toValue() { + PgrServiceApplicationStatusMapper.ensureInitialized(); + return MapperContainer.globals.toValue(this); + } +} diff --git a/packages/digit_data_model/lib/utils/typedefs.dart b/packages/digit_data_model/lib/utils/typedefs.dart index 995fdfff0..d6d547030 100644 --- a/packages/digit_data_model/lib/utils/typedefs.dart +++ b/packages/digit_data_model/lib/utils/typedefs.dart @@ -6,8 +6,6 @@ import '../models/entities/individual.dart'; import '../models/entities/product_variant.dart'; import '../models/entities/project_facility.dart'; import '../models/entities/project_resource.dart'; -import '../models/entities/service.dart'; -import '../models/entities/service_definition.dart'; /// `FacilityDataRepository` is a type alias for a `DataRepository` that works with `FacilityModel` and `FacilitySearchModel`. typedef FacilityDataRepository @@ -33,7 +31,3 @@ typedef ProductVariantDataRepository typedef BoundaryDataRepository = DataRepository; -typedef ServiceDataRepository - = DataRepository; -typedef ServiceDefinitionDataRepository - = DataRepository; diff --git a/packages/digit_data_model/pubspec.lock b/packages/digit_data_model/pubspec.lock index a2f7c5b49..3f0249b33 100644 --- a/packages/digit_data_model/pubspec.lock +++ b/packages/digit_data_model/pubspec.lock @@ -252,11 +252,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "145091c3b5f05ccea22ec7520f5b9f4e50ff6106" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive diff --git a/packages/digit_data_model/pubspec.yaml b/packages/digit_data_model/pubspec.yaml index 96cf93b28..22502860d 100644 --- a/packages/digit_data_model/pubspec.yaml +++ b/packages/digit_data_model/pubspec.yaml @@ -1,6 +1,6 @@ name: digit_data_model description: The digit_data_model package is a data modeling library. It defines various classes, enums, and functions. -version: 1.0.3+1 +version: 1.0.4-dev.5 homepage: https://github.com/egovernments/health-campaign-field-worker-app/tree/master/packages/digit_data_model repository: https://github.com/egovernments/health-campaign-field-worker-app diff --git a/packages/digit_firebase_services/pubspec.lock b/packages/digit_firebase_services/pubspec.lock index 20c7bd06b..7b890a488 100644 --- a/packages/digit_firebase_services/pubspec.lock +++ b/packages/digit_firebase_services/pubspec.lock @@ -128,6 +128,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.7" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -140,34 +164,34 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" plugin_platform_interface: dependency: transitive description: @@ -225,10 +249,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" vector_math: dependency: transitive description: @@ -237,6 +261,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" web: dependency: transitive description: @@ -246,5 +278,5 @@ packages: source: hosted version: "0.3.0" sdks: - dart: ">=3.2.0 <4.0.0" - flutter: ">=3.3.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/packages/forms_engine/pubspec.lock b/packages/forms_engine/pubspec.lock index 1fbd7a910..a52776731 100644 --- a/packages/forms_engine/pubspec.lock +++ b/packages/forms_engine/pubspec.lock @@ -504,6 +504,30 @@ packages: url: "https://pub.dev" source: hosted version: "6.7.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -556,26 +580,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" mime: dependency: transitive description: @@ -644,10 +668,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_provider: dependency: transitive description: @@ -905,26 +929,26 @@ packages: dependency: transitive description: name: test - sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" url: "https://pub.dev" source: hosted - version: "1.24.9" + version: "1.25.2" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" test_core: dependency: transitive description: name: test_core - sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" url: "https://pub.dev" source: hosted - version: "0.5.9" + version: "0.6.0" timing: dependency: transitive description: @@ -953,10 +977,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.1" watcher: dependency: transitive description: @@ -1014,5 +1038,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0 <3.9.0" - flutter: ">=3.16.0" + dart: ">=3.3.0 <3.9.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/packages/referral_reconciliation/CHANGELOG.md b/packages/referral_reconciliation/CHANGELOG.md index 00372f19e..afa55e0e8 100644 --- a/packages/referral_reconciliation/CHANGELOG.md +++ b/packages/referral_reconciliation/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.3-dev.1 + +* Integrated with survey_form package + ## 1.0.2+1 * Updated digit_scanner package, digit_components, digit_data_model diff --git a/packages/referral_reconciliation/lib/blocs/referral_recon_service_definition.dart b/packages/referral_reconciliation/lib/blocs/referral_recon_service_definition.dart index 74bcc987f..60150794f 100644 --- a/packages/referral_reconciliation/lib/blocs/referral_recon_service_definition.dart +++ b/packages/referral_reconciliation/lib/blocs/referral_recon_service_definition.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:digit_data_model/data_model.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:referral_reconciliation/utils/typedefs.dart'; diff --git a/packages/referral_reconciliation/lib/pages/create_referral/create_hf_referral_wrapper.dart b/packages/referral_reconciliation/lib/pages/create_referral/create_hf_referral_wrapper.dart index c0c2c108a..7b8436f96 100644 --- a/packages/referral_reconciliation/lib/pages/create_referral/create_hf_referral_wrapper.dart +++ b/packages/referral_reconciliation/lib/pages/create_referral/create_hf_referral_wrapper.dart @@ -1,5 +1,6 @@ import 'package:auto_route/auto_route.dart'; import 'package:digit_data_model/data_model.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:referral_reconciliation/blocs/app_localization.dart'; diff --git a/packages/referral_reconciliation/lib/pages/create_referral/reason_checklist_preview.dart b/packages/referral_reconciliation/lib/pages/create_referral/reason_checklist_preview.dart index 02ca9eb26..88c7b6847 100644 --- a/packages/referral_reconciliation/lib/pages/create_referral/reason_checklist_preview.dart +++ b/packages/referral_reconciliation/lib/pages/create_referral/reason_checklist_preview.dart @@ -1,6 +1,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_components/widgets/atoms/digit_divider.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/packages/referral_reconciliation/lib/pages/create_referral/record_reason_checklist.dart b/packages/referral_reconciliation/lib/pages/create_referral/record_reason_checklist.dart index 5a5303e09..9433e2655 100644 --- a/packages/referral_reconciliation/lib/pages/create_referral/record_reason_checklist.dart +++ b/packages/referral_reconciliation/lib/pages/create_referral/record_reason_checklist.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:digit_components/utils/date_utils.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; @@ -45,7 +46,7 @@ class _ReferralReasonChecklistPageState @override void initState() { context.read().add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: Random().nextInt(100).toString(), submitTriggered: true, ), @@ -93,7 +94,7 @@ class _ReferralReasonChecklistPageState submitTriggered = true; context.read().add( - const ServiceChecklistEvent( + const ServiceSurveyFormEvent( value: '', submitTriggered: true, ), @@ -338,7 +339,7 @@ class _ReferralReasonChecklistPageState context .read() .add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: e.toString(), submitTriggered: submitTriggered, @@ -447,7 +448,7 @@ class _ReferralReasonChecklistPageState groupValue: controller[index].text.trim(), onChanged: (value) { context.read().add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: Random().nextInt(100).toString(), submitTriggered: submitTriggered, ), @@ -625,7 +626,7 @@ class _ReferralReasonChecklistPageState value: controller[index].text.split('.').contains(e), onChanged: (value) { context.read().add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: e.toString(), submitTriggered: submitTriggered, ), diff --git a/packages/referral_reconciliation/lib/pages/create_referral/record_referral_details.dart b/packages/referral_reconciliation/lib/pages/create_referral/record_referral_details.dart index f80e23055..d281a5f81 100644 --- a/packages/referral_reconciliation/lib/pages/create_referral/record_referral_details.dart +++ b/packages/referral_reconciliation/lib/pages/create_referral/record_referral_details.dart @@ -1,6 +1,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_components/widgets/atoms/digit_radio_button_list.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:digit_components/widgets/atoms/digit_toaster.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; diff --git a/packages/referral_reconciliation/lib/pages/search_referral_reconciliations.dart b/packages/referral_reconciliation/lib/pages/search_referral_reconciliations.dart index 51b1f0c13..d6bceeb6c 100644 --- a/packages/referral_reconciliation/lib/pages/search_referral_reconciliations.dart +++ b/packages/referral_reconciliation/lib/pages/search_referral_reconciliations.dart @@ -1,4 +1,5 @@ import 'package:auto_route/auto_route.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:digit_scanner/blocs/scanner.dart'; diff --git a/packages/referral_reconciliation/lib/utils/typedefs.dart b/packages/referral_reconciliation/lib/utils/typedefs.dart index 00ce8a627..638b1a60b 100644 --- a/packages/referral_reconciliation/lib/utils/typedefs.dart +++ b/packages/referral_reconciliation/lib/utils/typedefs.dart @@ -1,5 +1,6 @@ import 'package:digit_data_model/data_model.dart'; import 'package:referral_reconciliation/models/entities/hf_referral.dart'; +import 'package:survey_form/survey_form.dart'; typedef HFReferralDataRepository = DataRepository; diff --git a/packages/referral_reconciliation/pubspec.lock b/packages/referral_reconciliation/pubspec.lock index 60830a342..e6a925144 100644 --- a/packages/referral_reconciliation/pubspec.lock +++ b/packages/referral_reconciliation/pubspec.lock @@ -388,11 +388,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive @@ -421,26 +419,23 @@ packages: digit_components: dependency: "direct main" description: - name: digit_components - sha256: "9cca4d9a546037080afe02b6ade82fdf01574e11f5656ad12120fd6966578616" - url: "https://pub.dev" - source: hosted - version: "1.0.1+1" + path: "../digit_components" + relative: true + source: path + version: "1.0.2" digit_data_model: dependency: "direct main" description: - name: digit_data_model - sha256: "0b81e96636496b56b4f9c5d918690a17d8985d6b131e0ab54968eb5471ee4f54" - url: "https://pub.dev" - source: hosted + path: "../digit_data_model" + relative: true + source: path version: "1.0.3+1" digit_scanner: dependency: "direct main" description: - name: digit_scanner - sha256: "9862c4885465bb1942e36dc9b42596c201648db9b0f5ffb8ad768e2409fc2742" - url: "https://pub.dev" - source: hosted + path: "../digit_scanner" + relative: true + source: path version: "1.0.3+1" dio: dependency: transitive @@ -1278,6 +1273,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + survey_form: + dependency: "direct main" + description: + path: "../survey_form" + relative: true + source: path + version: "0.0.1-dev.1" synchronized: dependency: transitive description: diff --git a/packages/referral_reconciliation/pubspec.yaml b/packages/referral_reconciliation/pubspec.yaml index 4813ae9df..c8a2c3ca7 100644 --- a/packages/referral_reconciliation/pubspec.yaml +++ b/packages/referral_reconciliation/pubspec.yaml @@ -1,6 +1,6 @@ name: referral_reconciliation description: "This module will enable the health facility supervisors to track referrals made by on-field health workers to different health facilities digitally via the Digit HCM app" -version: 1.0.2+1 +version: 1.0.3-dev.1 homepage: https://github.com/egovernments/health-campaign-field-worker-app/tree/master/packages/referral_reconciliation repository: https://github.com/egovernments/health-campaign-field-worker-app @@ -35,6 +35,7 @@ dependencies: collection: ^1.16.0 digit_data_model: ^1.0.3+1 stream_transform: ^2.1.0 + survey_form: ^0.0.1-dev.1 dev_dependencies: flutter_test: diff --git a/packages/referral_reconciliation/test/blocs/referral_recon_service_definition_test.dart b/packages/referral_reconciliation/test/blocs/referral_recon_service_definition_test.dart index 638c25ec9..d47d6d7db 100644 --- a/packages/referral_reconciliation/test/blocs/referral_recon_service_definition_test.dart +++ b/packages/referral_reconciliation/test/blocs/referral_recon_service_definition_test.dart @@ -1,6 +1,7 @@ // Importing necessary packages and modules import 'package:bloc_test/bloc_test.dart'; import 'package:digit_data_model/data_model.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:referral_reconciliation/blocs/referral_recon_service_definition.dart'; @@ -91,7 +92,7 @@ void main() { // Description of the test 'emits [ReferralReconServiceDefinitionServiceFetchedState] when getServiceDefinitionsList returns non-null List', build: () { - // Mock the method getServiceDefinitions to return a saved checklist + // Mock the method getServiceDefinitions to return a saved survey_form when(() => serviceDefinitionDataRepository.search(any())).thenAnswer( (_) async => [ ServiceDefinitionModel( diff --git a/packages/referral_reconciliation/test/constants/test_constants.dart b/packages/referral_reconciliation/test/constants/test_constants.dart index 18ab284e4..bec892985 100644 --- a/packages/referral_reconciliation/test/constants/test_constants.dart +++ b/packages/referral_reconciliation/test/constants/test_constants.dart @@ -1,5 +1,6 @@ import 'package:digit_data_model/data_model.dart'; import 'package:referral_reconciliation/models/entities/hf_referral.dart'; +import 'package:survey_form/survey_form.dart'; class ReferralReconTestConstants { final String projectId = '11891de8-02a2-4844-80ff-a080b7b40b70'; diff --git a/packages/registration_delivery/CHANGELOG.md b/packages/registration_delivery/CHANGELOG.md index 10e985d7e..a74c879d5 100644 --- a/packages/registration_delivery/CHANGELOG.md +++ b/packages/registration_delivery/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.4-dev.1 + +* Integrated survey_form package + ## 1.0.3+1 * Bug Fixes - diff --git a/packages/registration_delivery/lib/pages/beneficiary/beneficiary_checklist.dart b/packages/registration_delivery/lib/pages/beneficiary/beneficiary_checklist.dart index 8a1980d7a..046d85347 100644 --- a/packages/registration_delivery/lib/pages/beneficiary/beneficiary_checklist.dart +++ b/packages/registration_delivery/lib/pages/beneficiary/beneficiary_checklist.dart @@ -4,6 +4,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:digit_components/digit_components.dart'; import 'package:digit_components/utils/date_utils.dart'; import 'package:digit_components/widgets/atoms/digit_toaster.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:digit_components/widgets/atoms/selection_card.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; @@ -48,7 +49,7 @@ class _BeneficiaryChecklistPageState @override void initState() { context.read().add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: Random().nextInt(100).toString(), submitTriggered: true, ), @@ -111,7 +112,7 @@ class _BeneficiaryChecklistPageState submitTriggered = true; context.read().add( - const ServiceChecklistEvent( + const ServiceSurveyFormEvent( value: '', submitTriggered: true, ), @@ -364,7 +365,7 @@ class _BeneficiaryChecklistPageState context .read() .add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: e.toString(), submitTriggered: submitTriggered, @@ -454,7 +455,7 @@ class _BeneficiaryChecklistPageState context .read() .add( - ServiceChecklistEvent( + ServiceSurveyFormEvent( value: curValue .toString(), submitTriggered: diff --git a/packages/registration_delivery/lib/pages/beneficiary/beneficiary_wrapper.dart b/packages/registration_delivery/lib/pages/beneficiary/beneficiary_wrapper.dart index c8fe2c357..9b2c4b080 100644 --- a/packages/registration_delivery/lib/pages/beneficiary/beneficiary_wrapper.dart +++ b/packages/registration_delivery/lib/pages/beneficiary/beneficiary_wrapper.dart @@ -3,6 +3,7 @@ import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:registration_delivery/utils/utils.dart'; +import 'package:survey_form/survey_form.dart'; import '../../blocs/delivery_intervention/deliver_intervention.dart'; import '../../blocs/household_overview/household_overview.dart'; diff --git a/packages/registration_delivery/lib/pages/beneficiary/household_overview.dart b/packages/registration_delivery/lib/pages/beneficiary/household_overview.dart index 61ca961b9..819405a0e 100644 --- a/packages/registration_delivery/lib/pages/beneficiary/household_overview.dart +++ b/packages/registration_delivery/lib/pages/beneficiary/household_overview.dart @@ -4,6 +4,7 @@ import 'package:digit_components/digit_components.dart'; import 'package:digit_components/utils/date_utils.dart'; import 'package:digit_data_model/data_model.dart'; import 'package:flutter/material.dart'; +import 'package:survey_form/survey_form.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../blocs/beneficiary_registration/beneficiary_registration.dart'; diff --git a/packages/registration_delivery/lib/pages/beneficiary_registration/individual_details.dart b/packages/registration_delivery/lib/pages/beneficiary_registration/individual_details.dart index 34ea6c862..ec37fdfeb 100644 --- a/packages/registration_delivery/lib/pages/beneficiary_registration/individual_details.dart +++ b/packages/registration_delivery/lib/pages/beneficiary_registration/individual_details.dart @@ -95,7 +95,6 @@ class IndividualDetailsPageState extends LocalizedState { ); }, builder: (context, state) { - // context. return ScrollableContent( enableFixedButton: true, header: const Column(children: [ diff --git a/packages/registration_delivery/pubspec.lock b/packages/registration_delivery/pubspec.lock index 95488a9b0..66c037a2c 100644 --- a/packages/registration_delivery/pubspec.lock +++ b/packages/registration_delivery/pubspec.lock @@ -388,11 +388,9 @@ packages: dart_mappable_builder: dependency: "direct dev" description: - path: "packages/dart_mappable_builder" - ref: master - resolved-ref: "9b887d24c05459c027a92391869d4c10b440e00f" - url: "https://github.com/egovernments/health-campaign-field-worker-app/" - source: git + path: "../dart_mappable_builder" + relative: true + source: path version: "4.2.0" dart_style: dependency: transitive @@ -430,10 +428,10 @@ packages: dependency: "direct main" description: name: digit_data_model - sha256: "0b81e96636496b56b4f9c5d918690a17d8985d6b131e0ab54968eb5471ee4f54" + sha256: "30f77f39977fabc3ef0cb7ed84b7377f987a309982b996096cb4bb8227fd363c" url: "https://pub.dev" source: hosted - version: "1.0.3+1" + version: "1.0.4-dev.4" digit_scanner: dependency: "direct main" description: @@ -729,6 +727,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.1" + group_radio_button: + dependency: transitive + description: + name: group_radio_button + sha256: "204de8d16b224be7fc72dade0c3afd410ff5a34417d89f74f0fd8be7a8c2b4d6" + url: "https://pub.dev" + source: hosted + version: "1.3.0" gs1_barcode_parser: dependency: "direct main" description: @@ -1294,6 +1300,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + survey_form: + dependency: "direct main" + description: + path: "../survey_form" + relative: true + source: path + version: "0.0.1-dev.1" synchronized: dependency: transitive description: diff --git a/packages/registration_delivery/pubspec.yaml b/packages/registration_delivery/pubspec.yaml index b88722f63..61ed53f30 100644 --- a/packages/registration_delivery/pubspec.yaml +++ b/packages/registration_delivery/pubspec.yaml @@ -1,6 +1,6 @@ name: registration_delivery description: This package enables health facility workers to register a household and individual members and deliver the resources. -version: 1.0.3+1 +version: 1.0.4-dev.1 homepage: https://github.com/egovernments/health-campaign-field-worker-app/tree/master/packages/registration_delivery repository: https://github.com/egovernments/health-campaign-field-worker-app @@ -40,6 +40,7 @@ dependencies: stream_transform: ^2.1.0 async: ^2.11.0 formula_parser: ^2.0.1 + survey_form: ^0.0.1-dev.1 dev_dependencies: flutter_test: diff --git a/packages/survey_form/.gitignore b/packages/survey_form/.gitignore new file mode 100644 index 000000000..ac5aa9893 --- /dev/null +++ b/packages/survey_form/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/packages/survey_form/.metadata b/packages/survey_form/.metadata new file mode 100644 index 000000000..88ae5644c --- /dev/null +++ b/packages/survey_form/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "b0850beeb25f6d5b10426284f506557f66181b36" + channel: "stable" + +project_type: package diff --git a/packages/survey_form/CHANGELOG.md b/packages/survey_form/CHANGELOG.md new file mode 100644 index 000000000..61d573b4a --- /dev/null +++ b/packages/survey_form/CHANGELOG.md @@ -0,0 +1,4 @@ +## 0.0.1-dev.1 + +* Removed survey_form models, blocs and repositories from digit_data_model +* Added imports for survey_form package in registration_delivery and referral_reconciliation diff --git a/packages/survey_form/LICENSE b/packages/survey_form/LICENSE new file mode 100644 index 000000000..f7d7ac958 --- /dev/null +++ b/packages/survey_form/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 eGovernments Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/survey_form/README.md b/packages/survey_form/README.md new file mode 100644 index 000000000..80275d629 --- /dev/null +++ b/packages/survey_form/README.md @@ -0,0 +1,52 @@ +# survey_form Package + +The `survey_form` package is a comprehensive solution for creating survey forms. + +## Features + +- **Survey form Pages**: The package includes several pages like `survey_form.dart`, `survey_form_boundary_view.dart`, and `survey_form_view.dart` that provide the user interface for creating survey forms. + + + + + + +- **SurveyForm Blocs**: It provides various BLoCs for state management using the BLoC pattern. These BLoCs handle the business logic for the SurveyForm. +- **SurveyForm Models**: It defines various data models like `ServiceModel`, `ServiceDefinitionModel`, etc. used in the SurveyForm creation process. +- **SurveyForm Repositories**: The package provides abstract classes for data repositories, `ServiceDefinitionLocalRepository`, `ServiceLocalRepository`, `ServiceDefinitionRemoteRepository`, and `ServiceRemoteRepository` which can be extended to create repositories for different Service models. It also includes error handling with `InvalidApiResponseException`. + +## Getting Started + +To use this package, add the following dependency to your `pubspec.yaml` file: + +```yaml +dependencies: + survey_form: ^any +``` + +## Usage + +To Navigate to any screens of the package: + +First add survey_form_router to your main app router + +Navigate to the required screen using the below code: + +```dart +context.router.push(SurveyFormWrapperRoute()); +``` + +SurveyForm package requires below data to be passed from main app: + +```dart + String _projectId = ''; + String _projectName=''; + String _loggedInIndividualId = ''; + String _loggedInUserUuid = ''; + String _appVersion = ''; + String _tenantId = ''; + Object _roles; + bool _isHealthFacilityWorker; + BoundaryModel? _boundaryModel; + PersistenceConfiguration _persistenceConfiguration; +``` \ No newline at end of file diff --git a/packages/survey_form/analysis_options.yaml b/packages/survey_form/analysis_options.yaml new file mode 100644 index 000000000..a5744c1cf --- /dev/null +++ b/packages/survey_form/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/survey_form/example/.gitignore b/packages/survey_form/example/.gitignore new file mode 100644 index 000000000..29a3a5017 --- /dev/null +++ b/packages/survey_form/example/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/packages/survey_form/example/.metadata b/packages/survey_form/example/.metadata new file mode 100644 index 000000000..d22992edb --- /dev/null +++ b/packages/survey_form/example/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "db7ef5bf9f59442b0e200a90587e8fa5e0c6336a" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: android + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: ios + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: linux + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: macos + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: web + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: windows + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/packages/survey_form/example/README.md b/packages/survey_form/example/README.md new file mode 100644 index 000000000..2b3fce4c8 --- /dev/null +++ b/packages/survey_form/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/survey_form/example/analysis_options.yaml b/packages/survey_form/example/analysis_options.yaml new file mode 100644 index 000000000..0d2902135 --- /dev/null +++ b/packages/survey_form/example/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/survey_form/example/android/.gitignore b/packages/survey_form/example/android/.gitignore new file mode 100644 index 000000000..6f568019d --- /dev/null +++ b/packages/survey_form/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/packages/survey_form/example/android/app/build.gradle b/packages/survey_form/example/android/app/build.gradle new file mode 100644 index 000000000..118ee1d92 --- /dev/null +++ b/packages/survey_form/example/android/app/build.gradle @@ -0,0 +1,67 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "com.example.example" + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies {} diff --git a/packages/survey_form/example/android/app/src/debug/AndroidManifest.xml b/packages/survey_form/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..399f6981d --- /dev/null +++ b/packages/survey_form/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/survey_form/example/android/app/src/main/AndroidManifest.xml b/packages/survey_form/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..19b862ec8 --- /dev/null +++ b/packages/survey_form/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/packages/survey_form/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/packages/survey_form/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 000000000..e793a000d --- /dev/null +++ b/packages/survey_form/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/packages/survey_form/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/survey_form/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/packages/survey_form/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/survey_form/example/android/app/src/main/res/drawable/launch_background.xml b/packages/survey_form/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..304732f88 --- /dev/null +++ b/packages/survey_form/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/survey_form/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/survey_form/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb65cb8dbad5f1a6fbf91c7c920af6cc33e2c66 GIT binary patch literal 2434 zcmb`Ji9ZvJ1BZ!Bd&yj{sSTqnIo?8woU<2|kX(_pDCb@klXM5{SWWw^L(H0zwqEJ%!~zrXMkK>T!J@Dke2_x$^XaC_phy2DaKq} zr*7Op8dyE&Ud;@#uo{ChS}>80ff;2H1>Z%2eigp?`ZZc+r}f?7CaTW4TH`ijGsR=b zMXNmb903I(xevKZ^%ctpyc#KGf~yM)O!ScjcH;92LXP?%B17e^(uxXoWj2rcmOo}o z=1O^Z4!bv3=lAT>upbAyKQN!z(*b~Co`s`hsn+i*eDSjX2^R}uIhUNKgdAP<1lmJ4 zA-ykgmyIu+RUS}xE6AEQQX=l$D#=5A3Xys{g^ioy0|2OwTi+KJ#4oF>k36oo7gVY6 zl`ExLOA$=Y`E$0nZ6pP-_Savo^>%a^st}lIHGB1TO3Lzt8_P?FJlv}ev1KXE5o#{y z_Tb_89q>spCurySBMwSJlp5LbLoCq1WZbo+^f_=DglWKLwHfnP;tX2ya)8#(ljF_60Zd4}4@I5WDG z=r{U)K3#!v;>3yHBV(h@mJSXa+Cw-DwqBH~`4nRg=?TrcU7EeJ!oj=i34+3#!1?k< zvIegDw`?TIQ7e(h6C+dzuef3E#8M$X0viydpFyckRDa-OdA@MdB=Y(?x-6m5S>ZT8=kGl)=#X)b| z#~APi3Z>G`Qq+6nqoQK-y5-})cPn`-*dNnI6fMh5Z^-++UAx&vZflD)vTW!T10^h5 z5TEliKkZZPf4+Laz}^9F1M0;`W@gfz)g_YlgEcGCgd;IXn-PG}>x0x%QGDqEygz$?vw)@GZ_|&#SNtvau@^h|S7` z5ZYO8{s{5p%j=s{W?bp0>}Yx6L3UM-pKN($FoO4`^+mBDG6e3TClWbSw{_Ngdux-J zmL_)ms4=u3Im}}fx~~4}_b5V^W85~Vr^!+cVte{>zF1_0Z=m=t$c03J#5;FUuxe_B zs|HD{`-u>#?-O%@{PUN0+Vy?dnl@eP8-Kag(#H7O8+9Fh`DS711DQN7zi7IfzxKXY z2n4C2HYuQ$(Z%dC35!XDU+Ypt7`{8%mv@*5lC($vc7Ii~?^wUeX1Aar5T%Ug!Mc)C z!ds-|z@qv&Y1qASpXQ3!TSw z`E~mAX){oH3Gz?kyNf;By(6UFKm3YnNN zi%`?{vOcE1_odQR)dL^Nw<;xTOn3IWsh^p`lF5BM$#eXssX57Q6 zVN5&@Q%W5Pw~55CrZ%Ik+!kiBzqNU-hBP5Z4ZOz=BM_QnTJM>8Rq%6}SJDetmzOKg zEz&$*%!!LH0DdSS@;#|zdrT`HA2fP5O4N_0qtl4bWYIJ!DWgWta@#gl;AYZ*ux9mS zMdig|=`IK^t;Tcg=5}MSIXUy6B13|CP0!t}MKSKw^Y?33rm17WX78n*cpdkQ9bky| z(q+06b5JpzVEv~OF)%lpi1-i3YR=0PI-T@RpT#!TJ&v<@agcT^qPZSbo*s*_tElpX= zI_7nC1rV>nMh1M|2a^+osbSCq7WVZTB_);2*0fWSbt!F8$T4cs({I05TyC0_&5_KM zkcdmFg&-V4bH7_p;(ZELITu)TBw}fq2ZMtXS0@wlY@qf%iXgH+?qikL%C!v*+U_zn z>atz0{E0?k_kQWtl9m?{ow<6kKJj`k2D@uOez=+l))PK!*q#y=yEiR@!hV5Xljxc? z>vf_*Mm2*j=r|;d{-rHcG>ct^&(VjVddLtokG8gJhm$Zb`st6~fH$>8g34RA!eHUZ zy`Fm(rNxCTL}|x_XzefKXZ}F%y#AB&&oGx5-q5e|=ZU7KXr_oMk|}W`Ao2)tz$2g@|tFU#fD}(Grt2pqh53{eJHx$N0D1>tZWFH z=U%6n6V$dJOsS8y@b)>EaOYOG1j2t(dmm{(Q&zsKo8Nd~mrxRv0G9c0IQqkm-X~Of T1VlQH<9 z#s?q}B@inZn>wmP$&^1Tz0*_MG|7 zH|Ko6bNOagi>F*#r2}|UsQ^k#1yEWlfYMR{l$Hvhv{V44r2;6eXA_`&0jwbb;kXE~ zwiK0G3XGqJhmRp9`xuSJMKnzpO7%=86O6@T>;oNZwFMfDMlXtD=y3wk>-84WPdt@M z#VDHAGe%=gZhIC;2+`=se*!EnMOE*Y=skBGj_=!W?C1S(XaMS#7nfEXz>D{Sx3q5G z;g-go?wm*v1gFd8{Kz*keqOS*w5&f-U@B}pclPuO>7Jq}{qp52KdGp!e4Bt<$>y6q~G5zwQt?ldUbNr-`;t-V^3p4kr=xNh1wGCIf$-JKGQr^L?`dgkuQ1 zJm|UULHB3?UT+Y0EDVaehS4qi=ydu5QW!Xn>$r2f_aIYHuxu$Au%%_4qwV5_)f^YP zZ7>>aG)gpeQTd|*{scJhqZ zJ9dH8FG$O~mH<>&SMPSYLWgr58HQO%g5Truj2^w#b@fBZHaO@$F>`EL$z+oAO-!7( z*-BnETdgm7JR?8yJU@`n_tA%V>;BJCw_z9A;2d^*{0pK}ZXDTJKf^04SEAAAEorj# zdP5oR&iZ{Bjf|ZX6wh&2Wm{EM_3KuvwWX)0`_Lm}cnm!np#6t0FzLPtr^5lA@qGwW zV|lzNxni@~Hf6IJ0ut#*4wxiChz^rNv{g=*9nM{P!=~U3jFiTdhYWgOfPIKgt zoxJXH9VEd9B%eq);w~!IFmg~%vQ?syNMA)oit& zF_~n^s!FLfGIxNG7{OlWQpD2<*+hcme|MZJmr|p2PXGidmF7Oy+1as=q&_OglpPr8 zKQ3MQh9N1kIg^u>B#~_Nt=m0tjP#$#_srt~NMe)hOcNPQl&)Exl9mCrs~ z@RH{CDN$T*1+8Te^gMj9mu-FpG^N4Kzb-ytFR80T-SgGxa{LW3o=l1DwW1NS~I|KXjm52mFWW)0$=n|}bV;9)r2}A<}5EB|`4LTT1MsVXS zTz{OI9{_<1foJ^)jtr4^#YV(K5x6g3A^<)VmR6y1RTEhqFVbX-h5f{Dd>p0)76gU| zQL}mtG&BvZ-hiYS!;SN2VK5Y;aG?c4WEgQ_5}el$icTRZP|)gV0_#UcqsbS_+yEjh zkM5Jdk(n`J?8e>K`|Y;&d#(NXpYcy;Ck%9S=53#&p6qiv5sl7M9COyQ`G4SPk_w=- tQ~;%=0w^sNKxwG}N=pS$S}K6j`UhpPMv$8u2HOAt002ovPDHLkV1lOzkevVk literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/survey_form/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f55918dc1b54d1e9673487ee07ef1e64c9865aba GIT binary patch literal 3670 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 TV`li57XeT$Bh4y^ee{0-G(7^) literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/survey_form/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..910eafa1d3a05a41259b546cf7ea0939b52ac353 GIT binary patch literal 6517 zcmds6Wm^*tv{wWi-91`K>5>kC(Ve5ayM#%1w}5n)G?VTaAf2P7yJWP${ongB?u&EI z^PCUx%V;$f5EeQ)`kOazu;k^WHU7Iv|2qKG|Mr3GcI%rrWFqp?l3HKip5>r@)mm7F zz50Aty0vOlBL0pmWgZe%KpVmv74!#bTNavM@QX#pQ0-wJTury$?98U6Xpmea2ZhE6 z(~ZzUf^hL^aQjn|{Iiu(vPK>6AXB+nmZS`5SrpR<;huvm#?+3Sr#z3B1JMip^NQZB z5s4drie56f>svR=K9s>^6cStzv7rP||Np^5CJ-RE^%#Y4YkheXy1m~aZG)n0h#82obfW7*ljHL`mOH++j`k%C7+9n70e>9t9?lX>?L z*9TBckVVzD(XxSZrl#A98AYZHq}xi~p?DC_%rq2hvB*gIki-_*Y5-!0Q%CjeI7yGE zKRW*Tmq#ltBU4(raBL~5HovsEcnaDKXKEGOn7S5QtQHLp4*qc&6?K)y=wM)Q^788! ze{tQ3l++h5+CJLlE`Bx_X&vi?zmJcP0|yp~9F}Od>#6q(2()`5=-eCY&Ndtp*q?aQPxcp>aaDz)eWRj-~IRf%g{jpj7pvaa3Y zka2(Dp`+Udsjp;;w9}_+SWne>!_S`V?W@r3?d|zn!=`-`IUwfd=J>TgcpoSpe^jag z4mo{t;H_@{Di8=H7UrL_l*R3PymTBCq;Ba`XXSC8iu_bq)PIry6#R?z4WkG2k0{CA z9W_FAY9J*+C`xOQ|F49(>4!b54`n@FMENs(zn;prj1_t4m@;&@&wj2&V@IK*^gCxq z`FMR!%JRiV<=9ZO-?zgEP=O4{G}tnPfcMM93Glj>AComo1V^?PbI?jH8>p36(Yqo zYu=y-VJ6wcp`+N@A;@z_tC+fHrQyQ z#%1-)Tlo6c`VpCnt2IX2QvYz+n)zdylQ(ne#o=N7;%&;5^Odf|xK8z<_R*)vxAv7! z?nWqzE@=9vxojPgi}Zl*NgjGF7NQ64tCBB-Uk+c9kNpUhK5NNg`_Rt%@In9B?F<_| zwA`F58DUYclaqCm?r+#_Yzv3x%dHML#(=zg3yxiT#=uaO!KS@-oN$dY4o&g1vSZK-0 zMgrbhNz9nrE_YbKe8f*S67sHuQCY-7MPp0>i{4D5q^ty95~NxXMdp3CG6xP8P{0r3 z)S6wpwEpE>Qs1x1Rk~egq_-W|H_Uog>5}aU zx5tWl0)u0*>^4*~WI%i&xBE-PsFf9{Cp;fzKV;oORaLb|NQl7?)%Wc|eea$f5-)k* z^lW3{ud-u|D$OniPE%=fsaZ--ks4PwZ|Ju?3T3q`NR97B(K0$uig4{{$mihiA>w`(~}3ucp`MgJ)yC8CAnug!!0 zddX!hqr2o`%z2dr!}UI26YD8!Z-;wvTz^x(Nly<4B~lrSdfNVV8i>FOG$g1P4Rg46 zDQBm3KvV?&f|8XjEb34rcrNf88rnPK#uZpTYN)F>lr=OI28k3x zz@d8=zPapXyk4+2KmY5+l@)LgNX%HyuK7R2Y<(g5dw1&F-cZ=!s(lwi+-^Ulne^^Fuy68G z*X&(FLc*;DETOh!>X^c2eH;w_WO&W2RnV}!ysX&$(*9T`CNj5byhpSHYap)kLb;h; z(^OWz8Thg`@<$2qm5%Jno2PSRr=6S-M z>rK)4ph^p0UZ%*IMn#Ypu^T(DjgiCo&cnYGxx(!M{ z?@ILnrIVJpT5MPTnEd;gRNNrc1~2^?`?Jdss0e#j`iT_>7?k-ko{$X z$`g%BElGrJY4wSPJc?fqbrQmcgyGM70+M#y!g#QA zez2090!ieJceGy*3(c?V4adVhk)>QYJp2?naGtl4L1$d`)!!hyaCFn=htj_N)a!DN zwVIkMdHf_k!p|SeFTq7#l46=#=lCbH+As9XQhhM1*yew*D^S4KOl-u?wi z`p`H?!w#gWE&4AXPp88=%b&KCjHLW`+0Guqi<0fK75^(} zRWktldto8X_7`25uPA #2XjO^LZ2*`jc5?rO}2eCub4W0~Qyz5L_5w^#1tmlvCu zm`IuT;-bG_;-pUM$z!eE~gp`)k2n2j6HU@|^litfC~j)gLUC0bc9>&nlPS({}T_6g|o7e zl?Pg|_Q9PjS=GeLJUOvM2)h`GqJ%;m8g&A|3muc6AKPu19eXB%Hn`ZYL;n!$B6L#k zfv=j5Pemm*?v>lifMM9sc#Y;s5ucTQN(MhAOp<5RG+j$HE+k`PUDFf%{k z_(h4@J2+(jM=Rdx3Y2I|0F^_3{eH>3$xgF@B_B(xc>Qc{k-bEOlHGSOBIly0%EKwr z;weGP5j{vm`yraZigjz10)71ZbUkO}I<3>Fs~jYbCKECis@oPtwbYnvjcwm@;Cz}o zI)tA@`SFbL(&$=aS9a}vM}=E$4jPN&Qcq+a38@nn)zg zlMVsO7-J<8Hvjz6MRj%cQ&n5r5w9QnSMN!`iq`u)b^YSaA|aKsS1c$WU*O3Qf9otE zQ^iZc&r>*Ru1ZF^&ifA_8M`^VG-74G%Cah6A)t3xAr#tB1BJp(ZP_@pU z^U~qtvO#$$B@!1X47rTS&Q+C_ljvyCz>PIS7=!qf57f9lLN-j9Q6=Y|P!wbG**>LC zw?JsFx~@*V(QV-I#CDfI?eC^Sh^-Kg@S0rgssX>tBUd_!!M%3Uo8NYW@YzV-$=KKj z^Fj|{P=F?iKh@pmfbK6~oy%WkWn}{gZZ(jA3XY3hc{QL#v)=Jq_QazQ*j@a0m-fPX zR}5ADH53H)TsWav$LRJq3Q8YK8#_sgRDPZu3gB7jIvem9d;PXvX|v}UDaWU1) zDRk4NwEunlPnBIVdLEYut{CDtuog|gkGS(*=!BH_&ckE69PT_l!pm*h?Z1!$kTmGn zKVoI9H%1}v2GCAFLCpl#pIIWFgx->+!YtM(aSEVUAF6P4>9?-wB9c(lyHyXJW}REg&I@8$}MB-1Xhb&FKn>G0KS6;<-L3zs5%V)xcNl zUh0~B+R@-q_xYEkrL%Le5tMrofVAZ3C*XS(kg$n~{8pU{z8s4z~vnMuxh)Kye{(cKuEl4qi4e{7J`oKp00Ev}JSB zmA6f}pLD8KVsc~Q*__`O99Ywrw1x*rQ0~nO3}7`%7xe!Gp42M*s}}FsB~>{X1IZVJ z?Kk)+$w;r+YEc-%GLe~PqfGb5?|6YuqOe;rPBrBD;6Vg) z>sA(xR>r*P@fVr-) zBxnBstQawhM2Z(5!P8%Az|A&nP3jlQMG=0=2_l=zOW5X?(u{f(|2t1RO?Ayj)QG)= zLB7Nn?9$cl!IH>4iL=W0csvL{rg^t03O7n5D6FziB(~TfFv5X4Ka@-01(-fmn#uc$ zSCQs1Jv$v|V7wCk_uUE8)79=WvH8)BASXEll3ike8W99H0LGUm?r?ZGhgXiqbVAMt zPj$um{|fSO`7D#O{9{edOb+%TnTqV7`0+UIF^!xkh6&=6BN84~^rEa(n#5v}q4`}%sm5XH z&JMP&1vN8(jseMrRMeA~OOT_%4f%N>Bd~HOAY!>A3(mB#;io3$Bqd=M$RZXoIv1yp4f>jpWsRp#x z@cjvS@cj&w?d-9AyVrxqK?npnf{|3HD}wUfR(o-i){hI$54dAY+|?g%*bV*8a;J6k zr5;|Sw5V6(K;7^dql@l$^FAm^R>HsN*)GcAcQfw+u{u&2_zBw_E!!!~4qUI#=AT~W zv5!@?#um76Ru!a$;D*xV z(y+OwZ00=l;5I0+Ce>Hmp;vvhSO(l=Gz&NT3*+52caopO#6O=Wsxu$@UGQ)VQqJeF zqf=gn2h~Dxc`Mi*3V6Yl>P9ieH=E|Wd`q)Dm|E+FyWA5WR`_k&6gVy)p60&dzxyJ= z5}yv93{c8?1=i~0%1~9JP>Xw!WWHZ+{)Tq`3c{*NqzZzB4Z&|-%H{I!h4#BzsO*(V ze>#C^P`jgjs4^pkjagy;`0{(zeDG=28*D4Z=+~PLp7};{MKKZsy7O4LQ7K+u$k&W= z8y*1A`I=s{{qqhab>#voS{84mM@h8#Mex-XkAT_!b>J`p<_K7l*{Snz?#t?D0UGvT ziu*rl#yC`&@ley@MFX(wA`}+Rl~}bBgVcD?9(Z;)yoIU$ne!l^&|UdNdZsEYnG=4~ zNeWiZ(=oItg}A{N)tJ&Jsph_~+t~~Er&-~iY^xTQeV|yIEf@#e7lZ4jD2CuJ9v6No zx_JO*O~~w);RqIbO<`jipE(eK)L3Zg@HQ`t3;Xj&IzL+^FPq7U$I!<2W~Xf8Ad3fL z;A%JJ#uvCYhOxBPEILy~2!*Q8Gx5$-;w!PFn+uH`0gB{dP+>#absmw=RN~=vUS(O&S$mG27ndBMZ#73!?Mn@@3ZhVF`XahvWa^9 zrKEyiEv2G6W6|;ry=M07?ppQwiv3XIs&knGlymu%(;gGx%&4mE(l?v6Bmb4wmS;)Q zOt;;UKAS#d=35zB`B<(UVSwKo*e}D#q!9pbPVMP9Z2R|-@4}?dm2sXBmNHuaOgt`_ zhQ?mi=|dd9O|^^21k0+RIr+CEZB7ltt7F9IW!Er+hQRFf!}@h=r3wxK=A|)$7pi}x z>81iU+7`_I&+0!LYARCruXLT_%ZsQqkWYSQhSvH@w9K$J5^a0 zGu$aAt8@s1g-a4GRh2U`I~)(k0zJHz6fu?48wUqSNs-*?{GL&~YmNU?D_#N(`vI{7 zB+p!U@b#iALGik!2_KUs?+oXbrx?Gs+t*PMwY%1qh<`~Lv@g|Uhe#2f42L71qty#t-5CS83u-?|K|^Jbx+u{?9V>x z8Y>_EE|#<%eBUWT6e)gB|5pB_(t}Yj*2>t3z+C;N|KSp4n!cuSWdBS}19h_Jj<5YX7dQ~@a>+Je!?D zf;-`sB_ppA;M=*(T3h19nKPyPG}SsKOzL4O)hK5#$DEE(W2KW2Y8$u#^?-q%@8dgX z7nj#;3IsubWC-F~W?Qd;)DZHkvpD6f(mDTWgGj$27~i=OMhm?3E{x7m^Tr|J7z*q_ z7*TrryeU44xbGu|d*R^VaOQdBihAg> z;EQz_@w@NIT+6O(1XM+QW6-ZW%woSg)T^W&oQMmLj&7f_sgoo`XMH-D%zmrS%gbv{ zX=YlDrry~(4}gkhn0OmEzzk@zBT2gP@MLmvabY(7T4&vshYe47KC%|(bHT}>Npe<6 ze7odXazA5gwzou-ozY`lPMsRcdg3!eSeM#ttUcWR<9QWTspa(01;HmJ2=t68uWEg+ z3+T@CGF!@)jgFZwsVi*n%-`11wmwpNdh#Mx%oX*O-oI;k}00uO?c;4m2FDp=->t8HiC)nKV~dU+e|s#cO3kiAsZ6!@n0kE|Y|Gz z*WSftF|K!XKU?I~)&7$fPR5VmCpIPm+uK2DL!OSJLJ!4!zM`=B~x2_UfX z;P)s#XfgA!XfCb4I{h1Sx!T`L<521ZhuA~}-Z=I%su2p)(^!l);=4qgPO~CicAj|q z)X*YJ`^zJ8_1@#K4bpurQfjX@>~4Q<6+|&a>n!y6j$JB7cvb`v^`*T-$27ztC9R|7 zx$B>;vvlE{cE(iF&&}zDk5eZmM1v!5cFyaz_*K z99KagmoIB;>pKkgL6u)5Oha*3+W3aC$8+6um+Tc86VGNuO|z_^K~ryliY63 z^Hb=^+&W>-BFvR2TKy)#W(NJ5gFpkFLTV5i@I4c6`GzwL=UaqS;YL8+C@%s0^^w+4 zv^}=qrUNcTvbw~Tu~4#SS=DN5O~nrj8X^Jf`y^Lnc>SR;PLTk6OPX|_n@5q<%yf2LR3IKpgtY4_ebjieav+{cW>WT>g2~Q%*VvW2tWvz1ejd-~ zOTRUGJ=>~~923hKj=o~NX3st+K}^H9bgI<%(~JdZ8{~Q4+A|~eh9fDeaIs+xg+i!a zO~9yVr}heZ0nyp;5s$D$G-d}NFrt4XC3wH`aE<@j+c~ywi<^Y<6nPlQ2)D2`+C{ z4L~(4dH*Qk6A--XX{b17omK|9o}8SWkmDYbvuEEw@X1vr8gT>c!;&z?Y_gE!0 zvRq3Pvju{4~$JFtgBSG|D<^zv@=O9nC34M=N z^b!7sQ@L?p3)arOO3HaOhZ@x{KdK2+n0QUMb6ksddmS@UQZCJ2GaFxT`_3?4Yz~tQ zeeRi0Y+l$oIe)p@oeuj0qFI6L4@2UgS_cOa`=bH(yvRl*_G+@~mgo))#$IS-IBy&` zcW%Edkyb~dCEY6-Yq_{`ML_rC2Ll5GJS@L=MStxbdTnEGV*c4nJVk&*Z+3H$hD*jIoC<9V;Lc@&ii*>8!R`zq4r}|?O#Ple zJONrn>sPSvR~k5efEfbd>ck~&o9N|p)1$ViR7qSnabDFOlZ^dtk z&7#+hi1GzP0h)y~JfUcI3klR=3kAC!0;J;1%%PZZ`ZApt6lM9$Wuff=Oe(SM?#`1b z*&u|Bi;~uZ;+&m(WZ%@n7MNqjU7&I=aPg!7R_$eXy>ojTQ<+FFg;aie@BT0<64gIB zCijc4MHqXwC}jUMkX_|dCdL-vh5yvW4k>c5=>~vuc(Xlb*hJjOrH3}dK3rT%;jx33 zA;OGXdhxAugXsUP$wbIT{8HP@g{nS!i+=FWBE#PK z>b#&ViSLdD|n#!rFm{L8W#_nS@h zo2Kf$*AV+|T!(`&Yo<`{`8`r|^8qF3gUHU;RwV1d)B|iO;YwIrTib{kLzW|Twz)m~ zHRi^q-iVw$7xrsF@V6oFMnRmejgA-jwbqP-FCx_ z%OdIRysH&ZxYLXDJK|dSpkS$`0-b#SW%<7GS<)hf`4}br`^~?HckD&sHw1Y%*4fhg zt3zBD)Pfy@A-V_Q;G8Q%D1C2za!ShA(ED?)H9MTPtDQ z06?)PQDh^Or3oa`FVTPepJ1Q^X0L*E+$A9nS`z430_WDznKxWGe6K+{52pXT@V?XP z01k}ebI&jOPa?Ko9zDZGsml~tsa{s5m(qhK32SudWj7ccW(IVLZ(-J1U>N3JhBjrT z?1FppEDds+73i9kqlOT3OzC4C6(qaTtsy#aTB|rg287=U4s%0d8%&qRPt0In zoBlc)XIgy=%0o@|7c%{=iZ(YkHdI*r(+5%fZ}*dkh&|;(xQq>Uzb{zXnod1^Be|L;;!&>$+l53!sQeAtW_Yv=W1>1*2xXre4hY+ zcLg8xX@`eOAshk9{|V=2^;k$3G&Y{s<5ts!D!FGc7|OPbwz1mcK6-)%^1amS^~DU% zuNy`Rt42??+LrBhW40VH3|qyu+v1FG$`?(pMI3wCT+yIsf;itPaTYtm91Ts9GJk_j z#k`(j*WP?sp5s1n*O?4kwPXHPZv<9;_yE4Nd^vnN*5R&)Kp^=!1_rzGs+h`idC7Lk zUl0(yw9B}KLTYQT|96v~&vf0xUtV7qL3}t_bQ~W^qQjkO3BB~{y7N9ueMJ$OL1%QM zrma|3$aM}UA(n=_{M~TRKbfPf8D1Jq+l7%Uc1cmNlRD%4X5`B7U9({2&N(#DZC=6p z*qTt-^AIOup1DIOw6?ZB*?Mh^@T`oE-mO*&&*d)3&ljhwW-;ncsoh)$p^x3qb(I=iVB`3He_;O`y3TxjxxE2pd!#8#(SPj!i zZN@;)h+!;x$fRZ|C@9zvz-^`MZDFzR5j*rdG!${};5dGI1M|uAMc&5FuKr}wP)&X^ zZoZrOb$(wg*TC&s<2=K0}Uf5 zDKqI##oGGF;d!r6ATC6FW+utBAdJOSjx)Q4|4nt*1jLyYK=52G1#za8m0tkYjw%2G zr3*U6EzV>}+Kdc!kDHp7+fAfnS4aq<7hx_>2dc}BTU+rkKww%vSq|AukP%Y74vVtV zk0j$kM`vd@p47CIcHf;JjJV1kG4fGoC7XUPZZisX`_XhBw!%EkP%21W#z^0~?{WB2 zbLrl(x;hY8r{Q6@oNmN^_$DGE{8HnfPEyU0xt1@jd?1B;(5;hamwxTgEBZ4S+f z5l_z)%_sk35MPd*VW`DNdwF;jUdmrVHnxkCg0LsUA>LY6sfA(&mbZpTY7Y$2u9)rP zV~dK)Qk^>Am&T8d_~t`bQitY+i}jn6tO#5>e@AYjUHT1tFOF!6hwmIq&VK*36~AMc z{t)iklOn~icG+_Hhpv>s5%BTT2k(C_6_Mm@lS?$M(Xz$bO}Yij8bz%m8tRLA$%Szm z#*+m>S8D#FJ}HPH^HET@Q4>#S%}$U@b{Fac>uwZERzt2*jR#em02_ z-$ciA(wClvZMo94qA;QmqD4Dtf4{!Lf*?oN+4nm%GmKB-Up91G#Eg=FBLj2Va5 z>AO8IkSENc>oLQ{dxyJgTnv&faP7VS?z7`dI6@v*ryoPV1h;Rh6;}}3vh@x8iKSD* zKPTe$v_gh{62Hc!68uV{=>qv#9`yPffiu0&QZe_Pii^uv(#y+>X2p*zKB(4jQBPl^ zqrgLJ3H9!7M^DiGM*mhFZgCM>d2HkjQ0TB?U>LDItfS=Rb+?d_sTTW>g~yaMV>r3F zL30gvAw%s;(^j0om2vQGZ;%Ueaq&Oh(J?u9l^E5S#vzST2R<#7A_CI1kmJaiwZU-8aDwQ13m6clP~t z?;uQ66Dv=Lb!RrjY9>)-=BO)2HiQ}SdAcS+iKBgGWhV&!N1s>b=XrF0D)oyKY~*hX4YQ#0r|Bis5iQc5mn2}rAuaZEhRw5Rw?`py2Z z0(VH&Q24(K&^rcLI-6Be3!I#sJaL=myA~WA{PO(rSz4PuB-_)#*f44P@&QEO>&1Q(IKwq*I;F{VAwmHZNwRaCT)lLOhcjtx-3gw9L9L6=GSwZ%|?h#SFv4)9K8jcC?9 zC;wQdC!;?_4W{Mhc0FWPFUI|M%OLqGmJ62D8u>}ZkpROOh4k8~u1VCE-NGRYNEHFO ziyZy?cb749h^=E_&`(ym6j1eG!Qk?gayy@tU|FjqbU?Vr@5W7PLPjR)b6B~ymX)IJ zoX|~loz4_m6*n4Xtcspo<8=c@hJ}TdSn|zR(vXxKC}sWaA+9G6XCy-jdd=4>Q-he13I4A4E~kQ6ACh6pY$UPR<&V@k+RghI%|+-O+F6? z$vqSgEq>LDhBM+{eQaI*COA5P6IV4&>ikiCFf_mjgHa;A1-E5I#0nD&Zkb1zPVw;8 zM>-BQ@px=xQ5-!AJ*k&eI5!*(oX@w?ZSZuAYuCMBTy1=^YWweYS>vEIcjB1erkq#NT>I}c|4@@C zW3@4-Y42H-N>&mB>NjL*5u?9oze;apx(hQmq-UT1E!D|-`IVUplJ1tr>NY`1{&V*$ zQ5mtaVULAgEt;MBnM#+9x_)GX*<+=MhBgs;_RaMiKmZ~bVZhC;Fm_#}WD>w+5mV9a(At>s ztf=(y5C)Qp9W}Sk3UbdgDh=COcPmGJK$Y6VsfqdWWOAIJ$3R_qTV{cbK2d#MECWE1 zU+XM9kHsu7&OKo>zd86YB)7VkA?ZxlE#VPq0mw^Coa~OA@dIZ`1!HL*HF*5%4 zpKnAe40F2|S?FEU*nfpRNI)MGIqLQUm)7tc)*GBYSC{f6%k2$Et=gZj4{wTaQ0WJ` zo^our&V`6#8oY*|tVyr0kFi}exP^m2)Z1dKnNTdEuin-HZUA+(+K^UzYk)q%kGSzB`uQbIg#LtL6u&@F_|iPXB~( z<8N=3xf#`&mx!^GUio`t^=xm@i`<}N_r-ER2duPP_Fb1Z>U9@$b zZo>*qeBKItuoYe=&616mzPQly9Vfi*>LeF2)d8~^gXDB!QU@7-qqpEJvN=mDnjpgU zN|_E8P8px=)+wuM#pc#<&f-yY42<{UEM#5FK9W z!VPBYB1n5XQfznYv-^$K5v!Lizx+7hk(=Lw2Ne6$6E4kLAz}0gV|KnC(%A>zDf{pu z`_SPJmi@)Hb{}WYpRzz6!cc-mavIUL@r1G2@y?&!L@tZ|^{~>a;-*i+R)B^d$(U|<;)|i{Hiz%Zdv5G1G~0xD@EyAFYjCwr zt0!GXQ=_1G(4(&2&0co;`?T$_0EE=-AHFW9%yhE$?Jui<)XPJ+ zm=B5mF30Q1LIgcSX<(A1lQrr$OZL37X0ow^&DdIIYmSMv#Z==3x$>*trFj;8w2SjI*!y5p znxaIm=VS3hToJUc_Bv#)kLyoxy}OWWOo_iUD->jI2OuV=q0I6c*Xti7n~m^`qU``C z0@nWDpZ5!Ez<6E0&ouMrST0_lg3&EiZU4vqQ#R^;-&m(;JX3vYWCGAA^l zh5{H5m1}X-x}8$XEwb||+W8f@M(78}J38sis+DFAPD2||!`-1SG1hlKi$!;|99K5v zEtr23zp|D(v(a2So7t?w`S6*=;Ia*BGwm<@BI-sW4!IbEY#KHI+(!;&8biC~1O7dx znbmnKcfMw4>p!Gh3-iHbUl5>3NS8hHA>_tyiJ%0Cdp2M)FT%O`WAi6Kzy%(q4t02a zPR%=Kpp#Ae%&vb^RTj(l%<9yj0aek!-`5(o+sH{;|7U^S>uFEx9e=$u%iu@Ey0VC$ z*Mk?MN?hSbI+A>c2W-k-F3ix~L}TZ426Kk56~EhN7!n-Pd!+ zW^{f+%pvTDy;GGP7i`Fuq&EGEgnM70RVc^9+tq&9&aK$#i&m^gN8B|(thkyQ9$Kd7 z*&O$KvK8oERTecrIXpo_FxZ`gOczq_QAZ)>MxIQQr`<&sJi*w}HrD0n@6&L|@g!?d zK&+b3g^ozT<~*h_#oD{1OF;4AiK0lZ7&f3DV*uYl(E(cicI9R}iW@8*Ffos``QCB# zD!BYu?0cG!{?Ag0+Rls{r8cq@Unq=A8YiE-mIX`_Y1veP*H(`({f)+T2|~>NyuiR; z@5k5ME9`W)TV22&rO?xmSe+Gi3U6q%aXmrdh}`81PJSPa+LOT)^A8)gwAjtGOr!Eu z5-r$yb$WVzadL7?JX9rlauC>WZ-w`C$C&lofG>8vzK#kg6=!tw@M}%A$%#v7dw?&p zQ}`k`>)iBCN>kzw!*#jm=ugu`1Iv}O3WxiIk;zvk=g)wq8KleN5Kcr8xz>+Ezcak% z4hIz0iD(n^#LgAF1zs&3VNQlcfgF>8r+EHt&C-;9s%ZC>a@`tnYw|Rn0AyM3%Easy zG;iPo*b|sWgf%^+@M_>>Lg4T*#H8hS!egRCP4|P^^->S7$e;c^*Zsrr>SRa`a`lg| z-$ST>^9l(Xsam)U?F$ff?kHt3kyMU{QKLrg?L(!*B>SN+32!0tfWrG`AK`hL{BkaC z^nyN;IdGLj{le{p!fB z!h1)Yo@cO=Ep4ZfuXEsGj4aufQX~TucBptHe|b3(RuXtt_w7jAE+COeV_d$?&tC|t3_8U+0_GCSdUd`F=b4&%CAacpGlRYwbyrjU^Pm! z=TC=~!8H6G@BsOaf9Gbz=#I$}^Ejk#>zu74*6l<$ieo$W>5$JEXJA6+MRj|J1(iz4DADkRQit2xg25~VkSv@74S9rZf0*l9Cc z1YY27g6&;K=Sp?%LG9Y7b?&n}>HtsBW z35VojYjV)xRYLAUU*00MP(B_LfxL8;!Dt-yChZ&@S#XIS;{D(YZd)=v+Xlt z2F0JF@K_a(w>iWK=B19$XFpgqU}g5`c*NW&O%EKe`9>O!h%dq(m-$Q|HKw)?Q@;$q zr*!Z(6eFf`Q@C)Zh{TsGe+fNne;Y2B_TC^1bAkG?3md{cBC1aOYSzolfj9na`0*aM>FEgKgDB^P*Er`S%MQuT-8B6<~ z?6+U`aOA|8-;y^hQW4umvblbYa4G9^))l3;5Xk6?o7M<3nJeu6K1!`0Oze99a~?)N z_VhZ8TI0o9U2Ex z5sf`y+=Q05k~}aR@GPnyVDgs%g9Qegiutb+wph13)iR9V_y6p@2oh@QLLH?o0^Gkw z-%mP5HPV(fG){4hH-1`Jd8!;3+jr8Fo;s1q%IYm<4QMnfj^r#@rgo$`(DSj + + + + + + diff --git a/packages/survey_form/example/android/app/src/main/res/values/styles.xml b/packages/survey_form/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..cb1ef8805 --- /dev/null +++ b/packages/survey_form/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/survey_form/example/android/app/src/profile/AndroidManifest.xml b/packages/survey_form/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..399f6981d --- /dev/null +++ b/packages/survey_form/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/survey_form/example/android/build.gradle b/packages/survey_form/example/android/build.gradle new file mode 100644 index 000000000..6c103613c --- /dev/null +++ b/packages/survey_form/example/android/build.gradle @@ -0,0 +1,30 @@ +buildscript { + ext.kotlin_version = '1.8.22' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/packages/survey_form/example/android/settings.gradle b/packages/survey_form/example/android/settings.gradle new file mode 100644 index 000000000..7cd712855 --- /dev/null +++ b/packages/survey_form/example/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false +} + +include ":app" diff --git a/packages/survey_form/example/ios/.gitignore b/packages/survey_form/example/ios/.gitignore new file mode 100644 index 000000000..7a7f9873a --- /dev/null +++ b/packages/survey_form/example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/packages/survey_form/example/ios/Flutter/AppFrameworkInfo.plist b/packages/survey_form/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..9625e105d --- /dev/null +++ b/packages/survey_form/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 11.0 + + diff --git a/packages/survey_form/example/ios/Flutter/Debug.xcconfig b/packages/survey_form/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/packages/survey_form/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/survey_form/example/ios/Flutter/Release.xcconfig b/packages/survey_form/example/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/packages/survey_form/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/survey_form/example/ios/Runner.xcodeproj/project.pbxproj b/packages/survey_form/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..75c0e507d --- /dev/null +++ b/packages/survey_form/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,614 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807E294A63A400263BE5 /* Frameworks */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/packages/survey_form/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/survey_form/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/survey_form/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..87131a09b --- /dev/null +++ b/packages/survey_form/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/survey_form/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/survey_form/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..1d526a16e --- /dev/null +++ b/packages/survey_form/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/survey_form/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/survey_form/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/survey_form/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/survey_form/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/survey_form/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/packages/survey_form/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/survey_form/example/ios/Runner/AppDelegate.swift b/packages/survey_form/example/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..70693e4a8 --- /dev/null +++ b/packages/survey_form/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d36b1fab2 --- /dev/null +++ b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4def642611f0102a748627bcbb13b46474e3bb28 GIT binary patch literal 125073 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%0DciSVRXKpGY=V@L^k_^%}OOOhg`>FbMo|vB9cW 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 ehTeg%5cnTV#=?MlR&vt-0000B=Y2osn-}| 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 literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd0125e0506076a8fcb6a7617b5013d71e9cf9b GIT binary patch literal 736 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 V0n<>7YX2yoLR&*$y-L*%^&eHJ`tbk& literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..37eca2b4b2923b53540709ef22c0f4ad27cbb4ba GIT binary patch literal 1132 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 EAE8`*RsaA1 literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..44d1383094a4c72f9785a7b75bdcbc6739c5ce29 GIT binary patch literal 5044 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 literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..9a22b7fc3ff5b59f8452c9a33b8fecb2b778f3c3 GIT binary patch literal 1448 zcmV;Z1y}lsP)0nBzngM zUWh@ z-+9h?-cv4~5pn-(2cDEz5T=O*VVYPFrile%nphB~i3MSrSP-U(1!0;Bf>ekh7V=SQ z8Nr}j1W~md3ld2LZ`yG?-%cWtYKn@$O#`Xq*ccrShllgqc|4w^xVV^##bQH~%wI&F z^!N*rNF-7QgTcPcJD<;=MNw3Beus1#kwC!T^GF~aJ8@Mx3kz25#ES1ez@Ei(v62js z+Pnvwj$Oz3j7?Ql^~R=V?dkgyq|=c|#Aq@Zw-36Umos%*ZR`G0p=ja73qLQ(Ijm49 z-%+XSJ|#{nQ>m0^cxdRn!Jzv%(_dMu+SbsZ*?XnEZH33<(YLNxd9=J-w)S7(>@=lBXBw#`)P;$h*&IH zR$Ht3tfi&(Z2NC*%lv+ynNRWM98Pgru8%@lyG^5MJm7J=&-LBCvzrnK=93k#$UtPB z;d0B!&teXjTaoocuX~q7eMw{E(gR!`Pii!Fy&nmOdmn_D6y&YlcrUvOOE@)uCfL%n{RgMh(dLAsEf@&&XbDJ7P0bdQ$@lq#N~Ns?fS*hzV`M8)m6erm zIvwh{<8Ta{8#J2T^$Qn$Nsc(l zbRoUZ>osKBQ^{oHUYQC^ph~3^q?qzdJsQYC`YYTH8}aMNv0RniW<4E`$JP^o60)Gl zNF-_}*~CmT+4zJ8gZ@JnwlV)JsXL53{js4 zPV-%;R=x}_)d3|XL@ew=(BXw-?tJhl3ekXO)Lo0#DXwQEC|!Yf-p@i2-Eb;fcyh#XI9ptLIfWG0000> literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f64ce773003fdb582ed97b7ca157a8bb1eb3a63b GIT binary patch literal 3816 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 I4SpK+KQRG+IRF3v literal 0 HcmV?d00001 diff --git a/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/packages/survey_form/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..72baec5a174ceb47368a78cbe8cada26d493a6c5 GIT binary patch literal 1787 zcmV3$g6vzM5S=tW6lwxUTrh8$iIBaDRqXGq$76_6EDvJ9Djfo$O5jARzVqBtP6!imv z7!y?Rg9|RK7HDbd6e#I}v_tnP%+i@ROQ*BXoAJDXDh$&_a7mu;pG@w%_nmw1`Q3Zo zxi=%h|3H%e+JS#V0wiA~K=MTbBwr*z@&IE4#6I^?WR;oQ3=8Rf^e#_LslGyAc*F zXDgRaD3~$hrq^j&>80)=pU>A}F`M@|osPEQF;i31vUED#o83LV+gwhjX}Dc17Rz#S zRLj!kaxLeicWCI$z<{+j8jZ%spEPOGjH%PK&-WXRJE*;0sZ^F~rw<>uv<=jP=<8486439^|3l1Le|ZhlAPIc=F^rq=*#SY1-$Cic4N9 zE-rb^Y%=Y&+ifQ=EyCpzmCc*~F#+DiIsOw<{bDhm!S43h56awE7*~$2o$zYc_0Yw|8yX*I0(K zyEh`>8322LP3+@xxlZ{5{s27&T3VW4QD$V!AxBoK)#^1IWTHL6<r&4H2Jf6Wu>Ry!lL4JX{l)%gQ4w{ zv0%rm(IM@9-3SM5aGq~Ne@iocFdo`T3p{pajB#U9nY4gP5z9sflNkhqK?nC8N~O}A z%iHtw@*ho?rxz0Br?|FEe3eFr9JCH#OJyNqEQJyq!-)-#!0k69IOI()lN|8j{ImQ!w%oaZMWgoMc16 zc)2*U0-H47Q(|H9SW6*HLG$HiYK`WJ6%{L&l9L$(nng{qeq-Nz7K`~%+#msyLY39) z>(?(?QeLOi&D>7E&!{cJWzB%!-*R=2YuETM1C~%9oDl}&9>)qcj!ooSgn@t*$6v?F&1R}kR9H3JkX>|9FPFpYO0Se9jiNK zQDa?gO=V(xFc@GuJ3F>vgc}uQW_?Zdk@6%%#v1hX8^`1NU%k8jZ6Wk;j(z zI!;U&$;qtZA}F&}=x=JIOdY=BU5Z2u?XB~`^qr?nZW(b5r79cIa2P|3^N%+9q>1pk zJW1^nbp4QpWednrDV!z~x*ATQV2+N?(H_jItUzyLBl2dI!BBk|Vp%F(EY`x>(F&j2 z4@K5wSUZgqM;}xscK~8 zOo3dPg}$a%WNHeLH(LjLPcJ%;_h9+cPtgVCBh0Q`&ZTN-W=#L*AUjSRr3uPtf+|{N z5lk(=!Pe19x22oOaXl1Ma*&}eg8u7WwBj>yeCOv#SITMS%@nQ@v>*L}!p@80g$r@| zyPu)bYT>d`_|q*YMpsdhSPW&M8pfsuxCgo^N;+vrvr)C}17uItqILfPi0Kw4N*j^o z`XSx@_V|yJ#jrhIhW$Yb(PQyvufq+i;avQ=OMmeW>vOu}Wi%3j$9D0#^Z3Q%ri*E~ zY7WMD{^DF_Tf7{!IO3(#Xd91&_>_K^M|9v&WNzx zJOd#SB~+Q{fY#{+#dsAljH2gD<@acG?DWwLi854lwNVNR}LBFxKiJKY1sJZHRUS@Ql)F&d`S;{2d3V^fv!+};R=L< zyBdH-VJbTO>m~OtLfcG5WnMAr4ebucmpB5WqPe{a(O0i5d;!=Qb8T(yg2`dNGQ)D2 zPz zjt0NGW7Mp1^B^?$Lf2Y%5*coJoT}$A8M=9Xey*1JV}PBL(=K;r+6+XpHHvwzl~W@k zE_g>)4Z&axvPSLg%jCGqn2&F7Zk|13M_>U^KyKy9X|AF#fSBt@Kik>OMa|R3W@@6K zAY2H!xF|Y0IhLJzqN<{@t$W;@-vRkMf!HAjZ44&m3a|D@Mi$mr?9L)8C<5Hn_No