@salesforce/ui-bundle-template-app-react-sample-b2e 1.117.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. package/LICENSE.txt +82 -0
  2. package/README.md +52 -0
  3. package/dist/.forceignore +15 -0
  4. package/dist/.husky/pre-commit +4 -0
  5. package/dist/.prettierignore +11 -0
  6. package/dist/.prettierrc +17 -0
  7. package/dist/AGENT.md +193 -0
  8. package/dist/CHANGELOG.md +2128 -0
  9. package/dist/README.md +104 -0
  10. package/dist/config/project-scratch-def.json +13 -0
  11. package/dist/eslint.config.js +7 -0
  12. package/dist/force-app/main/default/classes/MaintenanceRequestTriggerHandler.cls +69 -0
  13. package/dist/force-app/main/default/classes/MaintenanceRequestTriggerHandler.cls-meta.xml +5 -0
  14. package/dist/force-app/main/default/classes/MaintenanceRequestTriggerHandler_Test.cls +308 -0
  15. package/dist/force-app/main/default/classes/MaintenanceRequestTriggerHandler_Test.cls-meta.xml +5 -0
  16. package/dist/force-app/main/default/classes/TenantTriggerHandler.cls +77 -0
  17. package/dist/force-app/main/default/classes/TenantTriggerHandler.cls-meta.xml +5 -0
  18. package/dist/force-app/main/default/classes/TenantTriggerHandler_Test.cls +100 -0
  19. package/dist/force-app/main/default/classes/TenantTriggerHandler_Test.cls-meta.xml +5 -0
  20. package/dist/force-app/main/default/cspTrustedSites/GitHub_Avatars.cspTrustedSite-meta.xml +15 -0
  21. package/dist/force-app/main/default/cspTrustedSites/Google_Fonts.cspTrustedSite-meta.xml +15 -0
  22. package/dist/force-app/main/default/cspTrustedSites/Google_Fonts_Static.cspTrustedSite-meta.xml +15 -0
  23. package/dist/force-app/main/default/cspTrustedSites/OpenStreetMap_Nominatim.cspTrustedSite-meta.xml +15 -0
  24. package/dist/force-app/main/default/cspTrustedSites/OpenStreetMap_Tiles.cspTrustedSite-meta.xml +15 -0
  25. package/dist/force-app/main/default/cspTrustedSites/Open_Meteo_API.cspTrustedSite-meta.xml +15 -0
  26. package/dist/force-app/main/default/cspTrustedSites/Pexels_Images.cspTrustedSite-meta.xml +15 -0
  27. package/dist/force-app/main/default/cspTrustedSites/Pexels_Videos.cspTrustedSite-meta.xml +15 -0
  28. package/dist/force-app/main/default/cspTrustedSites/Unsplash_Images.cspTrustedSite-meta.xml +15 -0
  29. package/dist/force-app/main/default/data/Agent__c.json +79 -0
  30. package/dist/force-app/main/default/data/Application__c.json +124 -0
  31. package/dist/force-app/main/default/data/Contact.json +44 -0
  32. package/dist/force-app/main/default/data/KPI_Snapshot__c.json +160 -0
  33. package/dist/force-app/main/default/data/Lease__c.json +9442 -0
  34. package/dist/force-app/main/default/data/Maintenance_Request__c.json +514 -0
  35. package/dist/force-app/main/default/data/Maintenance_Worker__c.json +304 -0
  36. package/dist/force-app/main/default/data/Notification__c.json +214 -0
  37. package/dist/force-app/main/default/data/Payment__c.json +1024 -0
  38. package/dist/force-app/main/default/data/Property_Cost__c.json +484 -0
  39. package/dist/force-app/main/default/data/Property_Feature__c.json +169 -0
  40. package/dist/force-app/main/default/data/Property_Image__c.json +148 -0
  41. package/dist/force-app/main/default/data/Property_Listing__c.json +130 -0
  42. package/dist/force-app/main/default/data/Property_Management_Company__c.json +70 -0
  43. package/dist/force-app/main/default/data/Property_Owner__c.json +184 -0
  44. package/dist/force-app/main/default/data/Property_Sale__c.json +246 -0
  45. package/dist/force-app/main/default/data/Property__c.json +704 -0
  46. package/dist/force-app/main/default/data/Tenant__c.json +184 -0
  47. package/dist/force-app/main/default/data/data-plan.json +110 -0
  48. package/dist/force-app/main/default/data/prepare-import-unique-fields.js +85 -0
  49. package/dist/force-app/main/default/layouts/Application__c-Application Layout.layout-meta.xml +58 -0
  50. package/dist/force-app/main/default/layouts/KPI_Snapshot__c-KPI Snapshot Layout.layout-meta.xml +87 -0
  51. package/dist/force-app/main/default/layouts/Lease__c-Lease Layout.layout-meta.xml +83 -0
  52. package/dist/force-app/main/default/layouts/Maintenance_Request__c-Maintenance Request Layout.layout-meta.xml +89 -0
  53. package/dist/force-app/main/default/layouts/Maintenance_Worker__c-Maintenance Worker Layout.layout-meta.xml +66 -0
  54. package/dist/force-app/main/default/layouts/Payment__c-Payment Layout.layout-meta.xml +88 -0
  55. package/dist/force-app/main/default/layouts/Property_Cost__c-Property Cost Layout.layout-meta.xml +88 -0
  56. package/dist/force-app/main/default/layouts/Property_Feature__c-Property Feature Layout.layout-meta.xml +80 -0
  57. package/dist/force-app/main/default/layouts/Property_Image__c-Property Image Layout.layout-meta.xml +75 -0
  58. package/dist/force-app/main/default/layouts/Property_Listing__c-Property Listing Layout.layout-meta.xml +92 -0
  59. package/dist/force-app/main/default/layouts/Property_Management_Company__c-Property Management Company Layout.layout-meta.xml +75 -0
  60. package/dist/force-app/main/default/layouts/Property_Owner__c-Property Owner Layout.layout-meta.xml +67 -0
  61. package/dist/force-app/main/default/layouts/Property_Sale__c-Property Sale Layout.layout-meta.xml +87 -0
  62. package/dist/force-app/main/default/layouts/Property__c-Property Layout.layout-meta.xml +130 -0
  63. package/dist/force-app/main/default/layouts/Tenant__c-Tenant Layout.layout-meta.xml +58 -0
  64. package/dist/force-app/main/default/objects/Agent__c/Agent__c.object-meta.xml +66 -0
  65. package/dist/force-app/main/default/objects/Agent__c/fields/Agent_Type__c.field-meta.xml +37 -0
  66. package/dist/force-app/main/default/objects/Agent__c/fields/Availability__c.field-meta.xml +37 -0
  67. package/dist/force-app/main/default/objects/Agent__c/fields/Emergency_Alt__c.field-meta.xml +11 -0
  68. package/dist/force-app/main/default/objects/Agent__c/fields/Language__c.field-meta.xml +42 -0
  69. package/dist/force-app/main/default/objects/Agent__c/fields/License_Expiry__c.field-meta.xml +11 -0
  70. package/dist/force-app/main/default/objects/Agent__c/fields/License_Number__c.field-meta.xml +14 -0
  71. package/dist/force-app/main/default/objects/Agent__c/fields/Office_Location__c.field-meta.xml +42 -0
  72. package/dist/force-app/main/default/objects/Agent__c/fields/Territory__c.field-meta.xml +42 -0
  73. package/dist/force-app/main/default/objects/Application__c/Application__c.object-meta.xml +67 -0
  74. package/dist/force-app/main/default/objects/Application__c/fields/Employment__c.field-meta.xml +10 -0
  75. package/dist/force-app/main/default/objects/Application__c/fields/Property__c.field-meta.xml +15 -0
  76. package/dist/force-app/main/default/objects/Application__c/fields/References__c.field-meta.xml +10 -0
  77. package/dist/force-app/main/default/objects/Application__c/fields/Start_Date__c.field-meta.xml +9 -0
  78. package/dist/force-app/main/default/objects/Application__c/fields/Status__c.field-meta.xml +47 -0
  79. package/dist/force-app/main/default/objects/Application__c/fields/User__c.field-meta.xml +15 -0
  80. package/dist/force-app/main/default/objects/KPI_Snapshot__c/KPI_Snapshot__c.object-meta.xml +65 -0
  81. package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Previous_Month_Sales__c.field-meta.xml +12 -0
  82. package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Sales_MoM_Change__c.field-meta.xml +18 -0
  83. package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Snapshot_Date__c.field-meta.xml +10 -0
  84. package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Total_Properties__c.field-meta.xml +13 -0
  85. package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Total_Sales_Amount__c.field-meta.xml +12 -0
  86. package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Total_Sales_Count__c.field-meta.xml +13 -0
  87. package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Units_Available__c.field-meta.xml +13 -0
  88. package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Units_Occupied__c.field-meta.xml +13 -0
  89. package/dist/force-app/main/default/objects/Lease__c/Lease__c.object-meta.xml +67 -0
  90. package/dist/force-app/main/default/objects/Lease__c/fields/End_Date__c.field-meta.xml +10 -0
  91. package/dist/force-app/main/default/objects/Lease__c/fields/Lease_Status__c.field-meta.xml +36 -0
  92. package/dist/force-app/main/default/objects/Lease__c/fields/Monthly_Rent__c.field-meta.xml +12 -0
  93. package/dist/force-app/main/default/objects/Lease__c/fields/Property__c.field-meta.xml +15 -0
  94. package/dist/force-app/main/default/objects/Lease__c/fields/Security_Deposit__c.field-meta.xml +12 -0
  95. package/dist/force-app/main/default/objects/Lease__c/fields/Start_Date__c.field-meta.xml +10 -0
  96. package/dist/force-app/main/default/objects/Lease__c/fields/Tenant__c.field-meta.xml +14 -0
  97. package/dist/force-app/main/default/objects/Lease__c/validationRules/End_Date_After_Start_Date.validationRule-meta.xml +10 -0
  98. package/dist/force-app/main/default/objects/Maintenance_Request__c/Maintenance_Request__c.object-meta.xml +73 -0
  99. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Actual_Cost__c.field-meta.xml +13 -0
  100. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Assigned_Worker__c.field-meta.xml +15 -0
  101. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Completed__c.field-meta.xml +11 -0
  102. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Description__c.field-meta.xml +12 -0
  103. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Est_Cost__c.field-meta.xml +13 -0
  104. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Priority__c.field-meta.xml +32 -0
  105. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Property__c.field-meta.xml +15 -0
  106. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Scheduled__c.field-meta.xml +11 -0
  107. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Status__c.field-meta.xml +42 -0
  108. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Tenant_Home__c.field-meta.xml +11 -0
  109. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Type__c.field-meta.xml +62 -0
  110. package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/User__c.field-meta.xml +15 -0
  111. package/dist/force-app/main/default/objects/Maintenance_Worker__c/Maintenance_Worker__c.object-meta.xml +71 -0
  112. package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Certifications__c.field-meta.xml +12 -0
  113. package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Employment_Type__c.field-meta.xml +32 -0
  114. package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Hourly_Rate__c.field-meta.xml +13 -0
  115. package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/IsActive__c.field-meta.xml +11 -0
  116. package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Location__c.field-meta.xml +13 -0
  117. package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Phone__c.field-meta.xml +11 -0
  118. package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Rating__c.field-meta.xml +14 -0
  119. package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Type__c.field-meta.xml +57 -0
  120. package/dist/force-app/main/default/objects/Notification__c/Notification__c.object-meta.xml +67 -0
  121. package/dist/force-app/main/default/objects/Notification__c/fields/Is_Read__c.field-meta.xml +10 -0
  122. package/dist/force-app/main/default/objects/Notification__c/fields/Message__c.field-meta.xml +11 -0
  123. package/dist/force-app/main/default/objects/Notification__c/fields/Priority__c.field-meta.xml +36 -0
  124. package/dist/force-app/main/default/objects/Notification__c/fields/Related_Object_Type__c.field-meta.xml +12 -0
  125. package/dist/force-app/main/default/objects/Notification__c/fields/Related_Record_Id__c.field-meta.xml +12 -0
  126. package/dist/force-app/main/default/objects/Notification__c/fields/Title__c.field-meta.xml +12 -0
  127. package/dist/force-app/main/default/objects/Notification__c/fields/Type__c.field-meta.xml +36 -0
  128. package/dist/force-app/main/default/objects/Notification__c/fields/User__c.field-meta.xml +14 -0
  129. package/dist/force-app/main/default/objects/Payment__c/Payment__c.object-meta.xml +67 -0
  130. package/dist/force-app/main/default/objects/Payment__c/fields/Amount__c.field-meta.xml +12 -0
  131. package/dist/force-app/main/default/objects/Payment__c/fields/Lease__c.field-meta.xml +15 -0
  132. package/dist/force-app/main/default/objects/Payment__c/fields/Notes__c.field-meta.xml +11 -0
  133. package/dist/force-app/main/default/objects/Payment__c/fields/Payment_Date__c.field-meta.xml +10 -0
  134. package/dist/force-app/main/default/objects/Payment__c/fields/Payment_Method__c.field-meta.xml +41 -0
  135. package/dist/force-app/main/default/objects/Payment__c/fields/Payment_Status__c.field-meta.xml +36 -0
  136. package/dist/force-app/main/default/objects/Property_Cost__c/Property_Cost__c.object-meta.xml +67 -0
  137. package/dist/force-app/main/default/objects/Property_Cost__c/fields/Cost_Amount__c.field-meta.xml +12 -0
  138. package/dist/force-app/main/default/objects/Property_Cost__c/fields/Cost_Category__c.field-meta.xml +56 -0
  139. package/dist/force-app/main/default/objects/Property_Cost__c/fields/Cost_Date__c.field-meta.xml +11 -0
  140. package/dist/force-app/main/default/objects/Property_Cost__c/fields/Description__c.field-meta.xml +12 -0
  141. package/dist/force-app/main/default/objects/Property_Cost__c/fields/Property__c.field-meta.xml +15 -0
  142. package/dist/force-app/main/default/objects/Property_Cost__c/fields/Vendor__c.field-meta.xml +12 -0
  143. package/dist/force-app/main/default/objects/Property_Cost__c/validationRules/Cost_Amount_Limit.validationRule-meta.xml +10 -0
  144. package/dist/force-app/main/default/objects/Property_Feature__c/Property_Feature__c.object-meta.xml +65 -0
  145. package/dist/force-app/main/default/objects/Property_Feature__c/fields/Description__c.field-meta.xml +11 -0
  146. package/dist/force-app/main/default/objects/Property_Feature__c/fields/Display_on_Listing__c.field-meta.xml +10 -0
  147. package/dist/force-app/main/default/objects/Property_Feature__c/fields/Feature_Category__c.field-meta.xml +51 -0
  148. package/dist/force-app/main/default/objects/Property_Feature__c/fields/Property__c.field-meta.xml +15 -0
  149. package/dist/force-app/main/default/objects/Property_Image__c/Property_Image__c.object-meta.xml +65 -0
  150. package/dist/force-app/main/default/objects/Property_Image__c/fields/Alt_Text__c.field-meta.xml +12 -0
  151. package/dist/force-app/main/default/objects/Property_Image__c/fields/Display_Order__c.field-meta.xml +13 -0
  152. package/dist/force-app/main/default/objects/Property_Image__c/fields/Image_Type__c.field-meta.xml +41 -0
  153. package/dist/force-app/main/default/objects/Property_Image__c/fields/Image_URL__c.field-meta.xml +10 -0
  154. package/dist/force-app/main/default/objects/Property_Image__c/fields/Property__c.field-meta.xml +15 -0
  155. package/dist/force-app/main/default/objects/Property_Listing__c/Property_Listing__c.object-meta.xml +65 -0
  156. package/dist/force-app/main/default/objects/Property_Listing__c/fields/Display_Order__c.field-meta.xml +13 -0
  157. package/dist/force-app/main/default/objects/Property_Listing__c/fields/Featured__c.field-meta.xml +10 -0
  158. package/dist/force-app/main/default/objects/Property_Listing__c/fields/Listing_Price__c.field-meta.xml +12 -0
  159. package/dist/force-app/main/default/objects/Property_Listing__c/fields/Listing_Status__c.field-meta.xml +41 -0
  160. package/dist/force-app/main/default/objects/Property_Listing__c/fields/Marketing_Description__c.field-meta.xml +11 -0
  161. package/dist/force-app/main/default/objects/Property_Listing__c/fields/Property__c.field-meta.xml +15 -0
  162. package/dist/force-app/main/default/objects/Property_Listing__c/fields/Short_Description__c.field-meta.xml +12 -0
  163. package/dist/force-app/main/default/objects/Property_Management_Company__c/Property_Management_Company__c.object-meta.xml +65 -0
  164. package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Active__c.field-meta.xml +10 -0
  165. package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Company_Code__c.field-meta.xml +13 -0
  166. package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Email__c.field-meta.xml +10 -0
  167. package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Phone__c.field-meta.xml +10 -0
  168. package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Primary_Contact__c.field-meta.xml +14 -0
  169. package/dist/force-app/main/default/objects/Property_Owner__c/Property_Owner__c.object-meta.xml +65 -0
  170. package/dist/force-app/main/default/objects/Property_Owner__c/fields/Address__c.field-meta.xml +10 -0
  171. package/dist/force-app/main/default/objects/Property_Owner__c/fields/Email__c.field-meta.xml +11 -0
  172. package/dist/force-app/main/default/objects/Property_Owner__c/fields/Phone__c.field-meta.xml +10 -0
  173. package/dist/force-app/main/default/objects/Property_Sale__c/Property_Sale__c.object-meta.xml +67 -0
  174. package/dist/force-app/main/default/objects/Property_Sale__c/fields/Buyer_Tenant__c.field-meta.xml +13 -0
  175. package/dist/force-app/main/default/objects/Property_Sale__c/fields/Payment_Method__c.field-meta.xml +41 -0
  176. package/dist/force-app/main/default/objects/Property_Sale__c/fields/Property__c.field-meta.xml +15 -0
  177. package/dist/force-app/main/default/objects/Property_Sale__c/fields/Reference_Number__c.field-meta.xml +12 -0
  178. package/dist/force-app/main/default/objects/Property_Sale__c/fields/Sale_Amount__c.field-meta.xml +12 -0
  179. package/dist/force-app/main/default/objects/Property_Sale__c/fields/Sale_Date__c.field-meta.xml +10 -0
  180. package/dist/force-app/main/default/objects/Property_Sale__c/fields/Sale_Status__c.field-meta.xml +36 -0
  181. package/dist/force-app/main/default/objects/Property_Sale__c/fields/Sale_Type__c.field-meta.xml +51 -0
  182. package/dist/force-app/main/default/objects/Property__c/Property__c.object-meta.xml +71 -0
  183. package/dist/force-app/main/default/objects/Property__c/fields/Address__c.field-meta.xml +13 -0
  184. package/dist/force-app/main/default/objects/Property__c/fields/Agent__c.field-meta.xml +15 -0
  185. package/dist/force-app/main/default/objects/Property__c/fields/Available_Date__c.field-meta.xml +11 -0
  186. package/dist/force-app/main/default/objects/Property__c/fields/Bathrooms__c.field-meta.xml +14 -0
  187. package/dist/force-app/main/default/objects/Property__c/fields/Bedrooms__c.field-meta.xml +14 -0
  188. package/dist/force-app/main/default/objects/Property__c/fields/Coordinates__c.field-meta.xml +12 -0
  189. package/dist/force-app/main/default/objects/Property__c/fields/Deposit__c.field-meta.xml +13 -0
  190. package/dist/force-app/main/default/objects/Property__c/fields/Description__c.field-meta.xml +12 -0
  191. package/dist/force-app/main/default/objects/Property__c/fields/Features__c.field-meta.xml +38 -0
  192. package/dist/force-app/main/default/objects/Property__c/fields/Hero_Image__c.field-meta.xml +11 -0
  193. package/dist/force-app/main/default/objects/Property__c/fields/Lease_Term__c.field-meta.xml +14 -0
  194. package/dist/force-app/main/default/objects/Property__c/fields/Monthly_Rent__c.field-meta.xml +13 -0
  195. package/dist/force-app/main/default/objects/Property__c/fields/Parking__c.field-meta.xml +14 -0
  196. package/dist/force-app/main/default/objects/Property__c/fields/Pet_Friendly__c.field-meta.xml +11 -0
  197. package/dist/force-app/main/default/objects/Property__c/fields/Sq_Ft__c.field-meta.xml +14 -0
  198. package/dist/force-app/main/default/objects/Property__c/fields/Status__c.field-meta.xml +37 -0
  199. package/dist/force-app/main/default/objects/Property__c/fields/Tour_URL__c.field-meta.xml +11 -0
  200. package/dist/force-app/main/default/objects/Property__c/fields/Type__c.field-meta.xml +37 -0
  201. package/dist/force-app/main/default/objects/Property__c/fields/Utilities__c.field-meta.xml +38 -0
  202. package/dist/force-app/main/default/objects/Property__c/fields/Year_Built__c.field-meta.xml +14 -0
  203. package/dist/force-app/main/default/objects/Tenant__c/Tenant__c.object-meta.xml +67 -0
  204. package/dist/force-app/main/default/objects/Tenant__c/fields/End_Date__c.field-meta.xml +11 -0
  205. package/dist/force-app/main/default/objects/Tenant__c/fields/Property__c.field-meta.xml +15 -0
  206. package/dist/force-app/main/default/objects/Tenant__c/fields/Start_Date__c.field-meta.xml +11 -0
  207. package/dist/force-app/main/default/objects/Tenant__c/fields/Status__c.field-meta.xml +37 -0
  208. package/dist/force-app/main/default/objects/Tenant__c/fields/User_Status__c.field-meta.xml +42 -0
  209. package/dist/force-app/main/default/objects/Tenant__c/fields/User__c.field-meta.xml +15 -0
  210. package/dist/force-app/main/default/permissionsets/Property_Management_Access.permissionset-meta.xml +633 -0
  211. package/dist/force-app/main/default/permissionsets/Tenant_Maintenance_Access.permissionset-meta.xml +137 -0
  212. package/dist/force-app/main/default/triggers/MaintenanceRequestTrigger.trigger +5 -0
  213. package/dist/force-app/main/default/triggers/MaintenanceRequestTrigger.trigger-meta.xml +5 -0
  214. package/dist/force-app/main/default/triggers/TenantTrigger.trigger +8 -0
  215. package/dist/force-app/main/default/triggers/TenantTrigger.trigger-meta.xml +5 -0
  216. package/dist/force-app/main/default/uiBundles/propertymanagementapp/.forceignore +15 -0
  217. package/dist/force-app/main/default/uiBundles/propertymanagementapp/.graphqlrc.yml +2 -0
  218. package/dist/force-app/main/default/uiBundles/propertymanagementapp/.prettierignore +9 -0
  219. package/dist/force-app/main/default/uiBundles/propertymanagementapp/.prettierrc +11 -0
  220. package/dist/force-app/main/default/uiBundles/propertymanagementapp/CHANGELOG.md +10 -0
  221. package/dist/force-app/main/default/uiBundles/propertymanagementapp/README.md +35 -0
  222. package/dist/force-app/main/default/uiBundles/propertymanagementapp/codegen.yml +95 -0
  223. package/dist/force-app/main/default/uiBundles/propertymanagementapp/components.json +18 -0
  224. package/dist/force-app/main/default/uiBundles/propertymanagementapp/e2e/app.spec.ts +17 -0
  225. package/dist/force-app/main/default/uiBundles/propertymanagementapp/eslint.config.js +169 -0
  226. package/dist/force-app/main/default/uiBundles/propertymanagementapp/index.html +12 -0
  227. package/dist/force-app/main/default/uiBundles/propertymanagementapp/package.json +70 -0
  228. package/dist/force-app/main/default/uiBundles/propertymanagementapp/playwright.config.ts +24 -0
  229. package/dist/force-app/main/default/uiBundles/propertymanagementapp/propertymanagementapp.uibundle-meta.xml +7 -0
  230. package/dist/force-app/main/default/uiBundles/propertymanagementapp/scripts/get-graphql-schema.mjs +68 -0
  231. package/dist/force-app/main/default/uiBundles/propertymanagementapp/scripts/rewrite-e2e-assets.mjs +23 -0
  232. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/applicationSearchService.ts +46 -0
  233. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/applications.ts +122 -0
  234. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/applicationForApproval.graphql +22 -0
  235. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/distinctApplicationStatus.graphql +19 -0
  236. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/existingTenant.graphql +16 -0
  237. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/getApplications.graphql +44 -0
  238. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/searchApplications.graphql +65 -0
  239. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/updateApplicationStatus.graphql +13 -0
  240. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/userByContact.graphql +13 -0
  241. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/dashboard/dashboard.ts +108 -0
  242. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/dashboard/query/getDashboardMetrics.graphql +39 -0
  243. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/dashboard/query/getOpenApplications.graphql +36 -0
  244. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/dashboard/query/getUserInfo.graphql +16 -0
  245. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/graphql-operations-types.ts +16420 -0
  246. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/graphqlClient.ts +25 -0
  247. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/maintenanceRequestSearchService.ts +66 -0
  248. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/maintenanceRequests.ts +75 -0
  249. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/distinctMaintenanceRequestPriority.graphql +19 -0
  250. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/distinctMaintenanceRequestStatus.graphql +19 -0
  251. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/distinctMaintenanceRequestType.graphql +19 -0
  252. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/getAllMaintenanceRequests.graphql +71 -0
  253. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/getMaintenanceRequests.graphql +41 -0
  254. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/searchMaintenanceRequests.graphql +82 -0
  255. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/updateMaintenanceStatus.graphql +13 -0
  256. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceWorkers/maintenanceWorkerSearchService.ts +46 -0
  257. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceWorkers/query/distinctMaintenanceWorkerEmploymentType.graphql +19 -0
  258. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceWorkers/query/searchMaintenanceWorkers.graphql +64 -0
  259. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/properties.ts +43 -0
  260. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/propertySearchService.ts +56 -0
  261. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/query/distinctPropertyStatus.graphql +19 -0
  262. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/query/distinctPropertyType.graphql +19 -0
  263. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/query/getProperties.graphql +77 -0
  264. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/query/searchProperties.graphql +105 -0
  265. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/app.tsx +17 -0
  266. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/appLayout.tsx +32 -0
  267. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/appliances.svg +13 -0
  268. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/book.svg +3 -0
  269. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/copy.svg +4 -0
  270. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/dashboard.svg +4 -0
  271. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/downgraph.svg +3 -0
  272. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/electrical.svg +41 -0
  273. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/files.svg +7 -0
  274. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/hvac.svg +79 -0
  275. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/maintenance-worker.svg +8 -0
  276. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/maintenance.svg +4 -0
  277. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/pest.svg +5 -0
  278. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/plumbing.svg +7 -0
  279. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/properties.svg +14 -0
  280. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/rocket.svg +3 -0
  281. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/star.svg +3 -0
  282. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/support.svg +6 -0
  283. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/upgraph.svg +3 -0
  284. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/users.svg +8 -0
  285. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/icons/zen-logo.svg +5 -0
  286. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/images/codey-1.png +0 -0
  287. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/images/codey-2.png +0 -0
  288. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/images/codey-3.png +0 -0
  289. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/assets/images/vibe-codey.svg +194 -0
  290. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/AgentforceConversationClient.tsx +168 -0
  291. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/alerts/status-alert.tsx +49 -0
  292. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/applications/ApplicationDetailsModal.tsx +142 -0
  293. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/GlobalSearchBar.tsx +101 -0
  294. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/IssuesDonutChart.tsx +122 -0
  295. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/MaintenanceTable.tsx +129 -0
  296. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/StatCard.tsx +73 -0
  297. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/FilterRow.tsx +23 -0
  298. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/PageContainer.tsx +13 -0
  299. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/PageHeader.tsx +17 -0
  300. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/TopBar.tsx +55 -0
  301. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/VerticalNav.tsx +75 -0
  302. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layouts/card-layout.tsx +29 -0
  303. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/maintenanceRequests/MaintenanceDetailsModal.tsx +193 -0
  304. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/maintenanceRequests/MaintenanceRequestCard.tsx +80 -0
  305. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/maintenanceWorkers/WorkerDetailsModal.tsx +66 -0
  306. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/properties/PropertyCard.tsx +61 -0
  307. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/properties/PropertyDetailsModal.tsx +263 -0
  308. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/shared/ObjectSearchErrorState.tsx +45 -0
  309. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/shared/UserAvatar.tsx +35 -0
  310. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/alert.tsx +76 -0
  311. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/badge.tsx +48 -0
  312. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/breadcrumb.tsx +109 -0
  313. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/button.tsx +67 -0
  314. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/calendar.tsx +232 -0
  315. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/card.tsx +103 -0
  316. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/checkbox.tsx +32 -0
  317. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/collapsible.tsx +33 -0
  318. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/datePicker.tsx +127 -0
  319. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/dialog.tsx +162 -0
  320. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/field.tsx +237 -0
  321. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/index.ts +84 -0
  322. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/input.tsx +19 -0
  323. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/label.tsx +22 -0
  324. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/pagination.tsx +132 -0
  325. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/popover.tsx +89 -0
  326. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/select.tsx +193 -0
  327. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/separator.tsx +26 -0
  328. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/skeleton.tsx +14 -0
  329. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/sonner.tsx +20 -0
  330. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/spinner.tsx +16 -0
  331. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/table.tsx +114 -0
  332. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/ui/tabs.tsx +88 -0
  333. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/accountSearchService.ts +46 -0
  334. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/query/distinctAccountIndustries.graphql +19 -0
  335. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/query/distinctAccountTypes.graphql +19 -0
  336. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/query/getAccountDetail.graphql +121 -0
  337. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/query/searchAccounts.graphql +51 -0
  338. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/pages/AccountObjectDetailPage.tsx +357 -0
  339. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/pages/AccountSearch.tsx +312 -0
  340. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/pages/Home.tsx +34 -0
  341. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/api/objectSearchService.ts +84 -0
  342. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/ActiveFilters.tsx +89 -0
  343. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/FilterContext.tsx +83 -0
  344. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/ObjectBreadcrumb.tsx +66 -0
  345. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/PaginationControls.tsx +109 -0
  346. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/SearchBar.tsx +41 -0
  347. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/SortControl.tsx +143 -0
  348. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/BooleanFilter.tsx +78 -0
  349. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/DateFilter.tsx +128 -0
  350. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/DateRangeFilter.tsx +70 -0
  351. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/FilterFieldWrapper.tsx +33 -0
  352. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/MultiSelectFilter.tsx +97 -0
  353. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/NumericRangeFilter.tsx +163 -0
  354. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/SearchFilter.tsx +50 -0
  355. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/SelectFilter.tsx +97 -0
  356. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/TextFilter.tsx +91 -0
  357. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/hooks/useAsyncData.ts +54 -0
  358. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/hooks/useCachedAsyncData.ts +184 -0
  359. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/hooks/useDebouncedCallback.ts +34 -0
  360. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/hooks/useObjectSearchParams.ts +252 -0
  361. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/utils/debounce.ts +25 -0
  362. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/utils/fieldUtils.ts +29 -0
  363. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/utils/filterUtils.ts +395 -0
  364. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/utils/sortUtils.ts +38 -0
  365. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/index.ts +6 -0
  366. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/lib/constants.ts +60 -0
  367. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/lib/routeConfig.ts +35 -0
  368. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/lib/utils.ts +6 -0
  369. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/navigationMenu.tsx +80 -0
  370. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/ApplicationSearch.tsx +373 -0
  371. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/Home.tsx +183 -0
  372. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/MaintenanceRequestSearch.tsx +465 -0
  373. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/MaintenanceWorkerSearch.tsx +324 -0
  374. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/NotFound.tsx +18 -0
  375. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/PropertySearch.tsx +258 -0
  376. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/TestAccPage.tsx +19 -0
  377. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/router-utils.tsx +35 -0
  378. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/routes.tsx +63 -0
  379. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/styles/global.css +173 -0
  380. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/types/conversation.ts +33 -0
  381. package/dist/force-app/main/default/uiBundles/propertymanagementapp/tsconfig.json +42 -0
  382. package/dist/force-app/main/default/uiBundles/propertymanagementapp/tsconfig.node.json +13 -0
  383. package/dist/force-app/main/default/uiBundles/propertymanagementapp/ui-bundle.json +7 -0
  384. package/dist/force-app/main/default/uiBundles/propertymanagementapp/vite-env.d.ts +1 -0
  385. package/dist/force-app/main/default/uiBundles/propertymanagementapp/vite.config.ts +106 -0
  386. package/dist/force-app/main/default/uiBundles/propertymanagementapp/vitest-env.d.ts +2 -0
  387. package/dist/force-app/main/default/uiBundles/propertymanagementapp/vitest.config.ts +11 -0
  388. package/dist/force-app/main/default/uiBundles/propertymanagementapp/vitest.setup.ts +1 -0
  389. package/dist/jest.config.js +6 -0
  390. package/dist/package-lock.json +9995 -0
  391. package/dist/package.json +40 -0
  392. package/dist/scripts/apex/hello.apex +10 -0
  393. package/dist/scripts/graphql-search.sh +191 -0
  394. package/dist/scripts/prepare-import-unique-fields.js +122 -0
  395. package/dist/scripts/setup-cli.mjs +563 -0
  396. package/dist/scripts/sf-project-setup.mjs +66 -0
  397. package/dist/scripts/soql/account.soql +6 -0
  398. package/dist/sfdx-project.json +12 -0
  399. package/package.json +51 -0
@@ -0,0 +1,324 @@
1
+ import { useMemo, useState } from "react";
2
+ import { useNavigate } from "react-router";
3
+ import {
4
+ searchMaintenanceWorkers,
5
+ fetchDistinctMaintenanceWorkerType,
6
+ type MaintenanceWorkerSearchNode,
7
+ } from "../api/maintenanceWorkers/maintenanceWorkerSearchService";
8
+ import { useCachedAsyncData } from "../features/object-search/hooks/useCachedAsyncData";
9
+ import {
10
+ useObjectSearchParams,
11
+ type UseObjectSearchParamsReturn,
12
+ } from "../features/object-search/hooks/useObjectSearchParams";
13
+ import type { FilterFieldConfig } from "../features/object-search/utils/filterUtils";
14
+ import type { SortFieldConfig } from "../features/object-search/utils/sortUtils";
15
+ import { PageHeader } from "../components/layout/PageHeader";
16
+ import { PageContainer } from "../components/layout/PageContainer";
17
+ import {
18
+ FilterProvider,
19
+ FilterResetButton,
20
+ } from "../features/object-search/components/FilterContext";
21
+ import { FilterRow } from "../components/layout/FilterRow";
22
+ import { SearchFilter } from "../features/object-search/components/filters/SearchFilter";
23
+ import { MultiSelectFilter } from "../features/object-search/components/filters/MultiSelectFilter";
24
+ import { TextFilter } from "../features/object-search/components/filters/TextFilter";
25
+ import { NumericRangeFilter } from "../features/object-search/components/filters/NumericRangeFilter";
26
+ import { DateFilter } from "../features/object-search/components/filters/DateFilter";
27
+ import { ObjectSearchErrorState } from "../components/shared/ObjectSearchErrorState";
28
+ import PaginationControls from "../features/object-search/components/PaginationControls";
29
+ import { WorkerDetailsModal } from "../components/maintenanceWorkers/WorkerDetailsModal";
30
+ import { Skeleton } from "../components/ui/skeleton";
31
+ import {
32
+ Table,
33
+ TableHeader,
34
+ TableBody,
35
+ TableRow,
36
+ TableHead,
37
+ TableCell,
38
+ } from "../components/ui/table";
39
+ import type {
40
+ Maintenance_Worker__C_Filter,
41
+ Maintenance_Worker__C_OrderBy,
42
+ } from "../api/graphql-operations-types";
43
+ import { PAGINATION_CONFIG } from "../lib/constants";
44
+
45
+ const FILTER_CONFIGS: FilterFieldConfig[] = [
46
+ {
47
+ field: "search",
48
+ label: "Search",
49
+ type: "search",
50
+ searchFields: ["Name", "Phone__c"],
51
+ placeholder: "By name, or phone...",
52
+ },
53
+ { field: "Employment_Type__c", label: "Employment Type", type: "picklist" },
54
+ { field: "Location__c", label: "Location", type: "text", placeholder: "Location" },
55
+ { field: "Hourly_Rate__c", label: "Hourly Rate", type: "numeric" },
56
+ { field: "CreatedDate", label: "Created Date", type: "datetime" },
57
+ ];
58
+
59
+ const SORT_CONFIGS: SortFieldConfig<string>[] = [
60
+ { field: "Name", label: "Name" },
61
+ { field: "Employment_Type__c", label: "Employment Type" },
62
+ { field: "Hourly_Rate__c", label: "Hourly Rate" },
63
+ { field: "Rating__c", label: "Rating" },
64
+ { field: "CreatedDate", label: "Created Date" },
65
+ ];
66
+
67
+ export default function MaintenanceWorkerSearch() {
68
+ const [selectedWorker, setSelectedWorker] = useState<MaintenanceWorkerSearchNode | null>(null);
69
+
70
+ const { data: typeOptions } = useCachedAsyncData(fetchDistinctMaintenanceWorkerType, [], {
71
+ key: "distinctMaintenanceWorkerType",
72
+ ttl: 30_000,
73
+ });
74
+
75
+ const { filters, query, pagination, resetAll } = useObjectSearchParams<
76
+ Maintenance_Worker__C_Filter,
77
+ Maintenance_Worker__C_OrderBy
78
+ >(FILTER_CONFIGS, SORT_CONFIGS, PAGINATION_CONFIG);
79
+
80
+ const searchKey = `maintenance-workers:${JSON.stringify({ where: query.where, orderBy: query.orderBy, first: pagination.pageSize, after: pagination.afterCursor })}`;
81
+ const { data, loading, error } = useCachedAsyncData(
82
+ () =>
83
+ searchMaintenanceWorkers({
84
+ where: query.where,
85
+ orderBy: query.orderBy,
86
+ first: pagination.pageSize,
87
+ after: pagination.afterCursor,
88
+ }),
89
+ [query.where, query.orderBy, pagination.pageSize, pagination.afterCursor],
90
+ { key: searchKey },
91
+ );
92
+
93
+ const validMaintenanceWorkerNodes = useMemo(
94
+ () =>
95
+ (data?.edges ?? []).reduce<MaintenanceWorkerSearchNode[]>((acc, edge) => {
96
+ if (edge?.node) acc.push(edge.node);
97
+ return acc;
98
+ }, []),
99
+ [data?.edges],
100
+ );
101
+
102
+ const pageInfo = data?.pageInfo;
103
+ const hasNextPage = pageInfo?.hasNextPage ?? false;
104
+ const hasPreviousPage = pagination.pageIndex > 0;
105
+
106
+ return (
107
+ <>
108
+ <PageContainer>
109
+ <PageHeader title="Maintenance Workers" description="View and filter maintenance workers" />
110
+ <MaintenanceWorkerSearchFilters
111
+ filters={filters}
112
+ typeOptions={typeOptions ?? []}
113
+ resetAll={resetAll}
114
+ />
115
+
116
+ <div className="bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden">
117
+ <Table>
118
+ <MaintenanceWorkerSearchTableHeader />
119
+ <TableBody>
120
+ {loading && <MaintenanceWorkerSearchSkeleton pageSize={pagination.pageSize} />}
121
+
122
+ {!loading && error && <MaintenanceWorkerSearchErrorState />}
123
+
124
+ {!loading && !error && validMaintenanceWorkerNodes.length === 0 && (
125
+ <MaintenanceWorkerSearchNoResults />
126
+ )}
127
+
128
+ {!loading && !error && validMaintenanceWorkerNodes.length > 0 && (
129
+ <MaintenanceWorkerSearchTable
130
+ workerNodes={validMaintenanceWorkerNodes}
131
+ setSelectedWorker={setSelectedWorker}
132
+ />
133
+ )}
134
+ </TableBody>
135
+ </Table>
136
+ </div>
137
+
138
+ <PaginationControls
139
+ pageIndex={pagination.pageIndex}
140
+ hasNextPage={hasNextPage}
141
+ hasPreviousPage={hasPreviousPage}
142
+ pageSize={pagination.pageSize}
143
+ pageSizeOptions={PAGINATION_CONFIG.validPageSizes}
144
+ onNextPage={() => {
145
+ if (pageInfo?.endCursor) pagination.goToNextPage(pageInfo.endCursor);
146
+ }}
147
+ onPreviousPage={pagination.goToPreviousPage}
148
+ onPageSizeChange={pagination.setPageSize}
149
+ disabled={loading || !!error}
150
+ />
151
+ </PageContainer>
152
+
153
+ {!loading && !error && selectedWorker && (
154
+ <WorkerDetailsModal
155
+ worker={selectedWorker}
156
+ isOpen={!!selectedWorker}
157
+ onClose={() => setSelectedWorker(null)}
158
+ />
159
+ )}
160
+ </>
161
+ );
162
+ }
163
+
164
+ function MaintenanceWorkerSearchFilters({
165
+ filters,
166
+ typeOptions,
167
+ resetAll,
168
+ }: {
169
+ filters: UseObjectSearchParamsReturn<
170
+ Maintenance_Worker__C_Filter,
171
+ Maintenance_Worker__C_OrderBy
172
+ >["filters"];
173
+ typeOptions: Array<{ value: string; label: string }>;
174
+ resetAll: () => void;
175
+ }) {
176
+ return (
177
+ <FilterProvider
178
+ filters={filters.active}
179
+ onFilterChange={filters.set}
180
+ onFilterRemove={filters.remove}
181
+ onReset={resetAll}
182
+ >
183
+ <FilterRow ariaLabel="Maintenance Workers filters">
184
+ <SearchFilter
185
+ field="search"
186
+ label="Search"
187
+ placeholder="By name, or phone..."
188
+ className="w-full sm:w-50"
189
+ />
190
+ <MultiSelectFilter
191
+ field="Employment_Type__c"
192
+ label="Employment Type"
193
+ options={typeOptions}
194
+ className="w-full sm:w-36"
195
+ />
196
+ <TextFilter
197
+ field="Location__c"
198
+ label="Location"
199
+ placeholder="Location"
200
+ className="w-full sm:w-50"
201
+ />
202
+ <NumericRangeFilter
203
+ field="Hourly_Rate__c"
204
+ label="Hourly Rate"
205
+ min={0}
206
+ max={1000}
207
+ className="w-full sm:w-50"
208
+ />
209
+ <DateFilter
210
+ field="CreatedDate"
211
+ label="Created Date"
212
+ filterType="datetime"
213
+ className="w-full sm:w-56"
214
+ />
215
+ <FilterResetButton />
216
+ </FilterRow>
217
+ </FilterProvider>
218
+ );
219
+ }
220
+
221
+ function MaintenanceWorkerSearchTableHeader() {
222
+ return (
223
+ <TableHeader>
224
+ <TableRow>
225
+ <TableHead className="w-4/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
226
+ Name
227
+ </TableHead>
228
+ <TableHead className="w-3/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
229
+ Organization
230
+ </TableHead>
231
+ <TableHead className="w-3/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
232
+ Active Requests
233
+ </TableHead>
234
+ <TableHead className="w-2/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
235
+ Status
236
+ </TableHead>
237
+ </TableRow>
238
+ </TableHeader>
239
+ );
240
+ }
241
+
242
+ function MaintenanceWorkerSearchNoResults() {
243
+ return (
244
+ <TableRow>
245
+ <TableCell colSpan={4} className="text-center py-12 text-gray-500">
246
+ No maintenance workers found
247
+ </TableCell>
248
+ </TableRow>
249
+ );
250
+ }
251
+
252
+ function MaintenanceWorkerSearchTable({
253
+ workerNodes,
254
+ setSelectedWorker,
255
+ }: {
256
+ workerNodes: MaintenanceWorkerSearchNode[];
257
+ setSelectedWorker: (worker: MaintenanceWorkerSearchNode) => void;
258
+ }) {
259
+ return (
260
+ <>
261
+ {workerNodes.map((worker) => {
262
+ const name = worker.Name?.value ?? "";
263
+ const isActive = worker.IsActive__c?.value;
264
+ return (
265
+ <TableRow
266
+ key={worker.Id}
267
+ onClick={() => setSelectedWorker(worker)}
268
+ className="hover:bg-gray-50 transition-colors cursor-pointer"
269
+ >
270
+ <TableCell className="px-6 py-4 font-medium text-gray-900">{name}</TableCell>
271
+ <TableCell className="px-6 py-4 text-gray-600">
272
+ {worker.Employment_Type__c?.value ?? worker.Type__c?.value ?? "\u2014"}
273
+ </TableCell>
274
+ <TableCell className="px-6 py-4 text-gray-600">
275
+ {worker.Maintenance_Requests__r?.totalCount ?? 0}
276
+ </TableCell>
277
+ <TableCell className="px-6 py-4 text-gray-600">
278
+ {typeof isActive === "boolean" ? (isActive ? "Active" : "Inactive") : "\u2014"}
279
+ </TableCell>
280
+ </TableRow>
281
+ );
282
+ })}
283
+ </>
284
+ );
285
+ }
286
+
287
+ function MaintenanceWorkerSearchSkeleton({ pageSize }: { pageSize: number }) {
288
+ return (
289
+ <>
290
+ {Array.from({ length: pageSize }, (_, i) => (
291
+ <TableRow key={i}>
292
+ <TableCell className="w-4/12 px-6 py-4">
293
+ <Skeleton className="h-5 w-3/4" />
294
+ </TableCell>
295
+ <TableCell className="w-3/12 px-6 py-4">
296
+ <Skeleton className="h-5 w-2/3" />
297
+ </TableCell>
298
+ <TableCell className="w-3/12 px-6 py-4">
299
+ <Skeleton className="h-5 w-1/4" />
300
+ </TableCell>
301
+ <TableCell className="w-2/12 px-6 py-4">
302
+ <Skeleton className="h-5 w-1/2" />
303
+ </TableCell>
304
+ </TableRow>
305
+ ))}
306
+ </>
307
+ );
308
+ }
309
+
310
+ function MaintenanceWorkerSearchErrorState() {
311
+ const navigate = useNavigate();
312
+
313
+ return (
314
+ <TableRow>
315
+ <TableCell colSpan={4} className="p-0">
316
+ <ObjectSearchErrorState
317
+ message="There was an error loading the maintenance workers. Please try again."
318
+ onGoHome={() => navigate("/")}
319
+ onRetry={() => navigate(0)}
320
+ />
321
+ </TableCell>
322
+ </TableRow>
323
+ );
324
+ }
@@ -0,0 +1,18 @@
1
+ import { Link } from 'react-router';
2
+
3
+ export default function NotFound() {
4
+ return (
5
+ <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
6
+ <div className="text-center">
7
+ <h1 className="text-4xl font-bold text-gray-900 mb-4">404</h1>
8
+ <p className="text-lg text-gray-600 mb-8">Page not found</p>
9
+ <Link
10
+ to="/"
11
+ className="inline-block px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"
12
+ >
13
+ Go to Home
14
+ </Link>
15
+ </div>
16
+ </div>
17
+ );
18
+ }
@@ -0,0 +1,258 @@
1
+ import { useMemo, useState } from "react";
2
+ import { useNavigate } from "react-router";
3
+ import {
4
+ searchProperties,
5
+ fetchDistinctPropertyStatus,
6
+ fetchDistinctPropertyType,
7
+ type PropertySearchNode,
8
+ } from "../api/properties/propertySearchService";
9
+ import { useCachedAsyncData } from "../features/object-search/hooks/useCachedAsyncData";
10
+ import {
11
+ useObjectSearchParams,
12
+ type UseObjectSearchParamsReturn,
13
+ } from "../features/object-search/hooks/useObjectSearchParams";
14
+ import type { FilterFieldConfig } from "../features/object-search/utils/filterUtils";
15
+ import type { SortFieldConfig } from "../features/object-search/utils/sortUtils";
16
+ import type { Property__C_Filter, Property__C_OrderBy } from "../api/graphql-operations-types";
17
+ import { PageHeader } from "../components/layout/PageHeader";
18
+ import { PageContainer } from "../components/layout/PageContainer";
19
+ import {
20
+ FilterProvider,
21
+ FilterResetButton,
22
+ } from "../features/object-search/components/FilterContext";
23
+ import { FilterRow } from "../components/layout/FilterRow";
24
+ import { SearchFilter } from "../features/object-search/components/filters/SearchFilter";
25
+ import { MultiSelectFilter } from "../features/object-search/components/filters/MultiSelectFilter";
26
+ import { NumericRangeFilter } from "../features/object-search/components/filters/NumericRangeFilter";
27
+ import { ObjectSearchErrorState } from "../components/shared/ObjectSearchErrorState";
28
+ import PaginationControls from "../features/object-search/components/PaginationControls";
29
+ import { PropertyCard } from "../components/properties/PropertyCard";
30
+ import { PropertyDetailsModal } from "../components/properties/PropertyDetailsModal";
31
+ import { Skeleton } from "../components/ui/skeleton";
32
+ import { PAGINATION_CONFIG } from "../lib/constants";
33
+
34
+ const FILTER_CONFIGS: FilterFieldConfig[] = [
35
+ {
36
+ field: "search",
37
+ label: "Search",
38
+ type: "search",
39
+ searchFields: ["Name", "Address__c"],
40
+ placeholder: "Search by name or address...",
41
+ },
42
+ { field: "Name", label: "Property Name", type: "text", placeholder: "Search by name..." },
43
+ { field: "Status__c", label: "Status", type: "picklist" },
44
+ { field: "Type__c", label: "Type", type: "picklist" },
45
+ { field: "Monthly_Rent__c", label: "Monthly Rent", type: "numeric" },
46
+ { field: "Bedrooms__c", label: "Bedrooms", type: "numeric" },
47
+ ];
48
+
49
+ const PROPERTY_SORT_CONFIGS: SortFieldConfig<string>[] = [
50
+ { field: "Name", label: "Name" },
51
+ { field: "Monthly_Rent__c", label: "Monthly Rent" },
52
+ { field: "Status__c", label: "Status" },
53
+ { field: "CreatedDate", label: "Created Date" },
54
+ ];
55
+
56
+ export default function PropertySearch() {
57
+ const [selectedProperty, setSelectedProperty] = useState<PropertySearchNode | null>(null);
58
+
59
+ const { data: statusOptions } = useCachedAsyncData(fetchDistinctPropertyStatus, [], {
60
+ key: "distinctPropertyStatus",
61
+ ttl: 30_000,
62
+ });
63
+ const { data: typeOptions } = useCachedAsyncData(fetchDistinctPropertyType, [], {
64
+ key: "distinctPropertyType",
65
+ ttl: 30_000,
66
+ });
67
+
68
+ const { filters, query, pagination, resetAll } = useObjectSearchParams<
69
+ Property__C_Filter,
70
+ Property__C_OrderBy
71
+ >(FILTER_CONFIGS, PROPERTY_SORT_CONFIGS, PAGINATION_CONFIG);
72
+
73
+ const searchKey = `properties:${JSON.stringify({ where: query.where, orderBy: query.orderBy, first: pagination.pageSize, after: pagination.afterCursor })}`;
74
+ const { data, loading, error } = useCachedAsyncData(
75
+ () =>
76
+ searchProperties({
77
+ where: query.where,
78
+ orderBy: query.orderBy,
79
+ first: pagination.pageSize,
80
+ after: pagination.afterCursor,
81
+ }),
82
+ [query.where, query.orderBy, pagination.pageSize, pagination.afterCursor],
83
+ { key: searchKey },
84
+ );
85
+
86
+ const validPropertyNodes = useMemo(
87
+ () =>
88
+ (data?.edges ?? []).reduce<PropertySearchNode[]>((acc, edge) => {
89
+ if (edge?.node) acc.push(edge.node);
90
+ return acc;
91
+ }, []),
92
+ [data?.edges],
93
+ );
94
+
95
+ const pageInfo = data?.pageInfo;
96
+ const hasNextPage = pageInfo?.hasNextPage ?? false;
97
+ const hasPreviousPage = pagination.pageIndex > 0;
98
+
99
+ return (
100
+ <>
101
+ <PageContainer>
102
+ <PageHeader title="Properties" description="Browse and manage available properties" />
103
+ <PropertySearchFilters
104
+ filters={filters}
105
+ statusOptions={statusOptions ?? []}
106
+ typeOptions={typeOptions ?? []}
107
+ resetAll={resetAll}
108
+ />
109
+
110
+ {loading && <PropertySearchSkeleton pageSize={pagination.pageSize} />}
111
+
112
+ {!loading && error && <PropertySearchErrorState />}
113
+
114
+ {!loading && !error && validPropertyNodes.length === 0 && <PropertySearchNoResults />}
115
+
116
+ {!loading && !error && validPropertyNodes.length > 0 && (
117
+ <PropertySearchGrid
118
+ propertyNodes={validPropertyNodes}
119
+ setSelectedProperty={setSelectedProperty}
120
+ />
121
+ )}
122
+
123
+ <PaginationControls
124
+ pageIndex={pagination.pageIndex}
125
+ hasNextPage={hasNextPage}
126
+ hasPreviousPage={hasPreviousPage}
127
+ pageSize={pagination.pageSize}
128
+ pageSizeOptions={PAGINATION_CONFIG.validPageSizes}
129
+ onNextPage={() => {
130
+ if (pageInfo?.endCursor) pagination.goToNextPage(pageInfo.endCursor);
131
+ }}
132
+ onPreviousPage={pagination.goToPreviousPage}
133
+ onPageSizeChange={pagination.setPageSize}
134
+ disabled={loading || !!error}
135
+ />
136
+ </PageContainer>
137
+
138
+ {!loading && !error && selectedProperty && (
139
+ <PropertyDetailsModal
140
+ property={selectedProperty}
141
+ isOpen={!!selectedProperty}
142
+ onClose={() => setSelectedProperty(null)}
143
+ />
144
+ )}
145
+ </>
146
+ );
147
+ }
148
+
149
+ function PropertySearchFilters({
150
+ filters,
151
+ statusOptions,
152
+ typeOptions,
153
+ resetAll,
154
+ }: {
155
+ filters: UseObjectSearchParamsReturn<Property__C_Filter, Property__C_OrderBy>["filters"];
156
+ statusOptions: Array<{ value: string; label: string }>;
157
+ typeOptions: Array<{ value: string; label: string }>;
158
+ resetAll: () => void;
159
+ }) {
160
+ return (
161
+ <FilterProvider
162
+ filters={filters.active}
163
+ onFilterChange={filters.set}
164
+ onFilterRemove={filters.remove}
165
+ onReset={resetAll}
166
+ >
167
+ <FilterRow ariaLabel="Properties filters">
168
+ <SearchFilter
169
+ field="search"
170
+ label="Search"
171
+ placeholder="Search by name or address..."
172
+ className="w-full sm:w-50"
173
+ />
174
+ <MultiSelectFilter
175
+ field="Status__c"
176
+ label="Status"
177
+ options={statusOptions}
178
+ className="w-full sm:w-36"
179
+ />
180
+ <MultiSelectFilter
181
+ field="Type__c"
182
+ label="Type"
183
+ options={typeOptions}
184
+ className="w-full sm:w-36"
185
+ />
186
+ <NumericRangeFilter
187
+ field="Monthly_Rent__c"
188
+ label="Monthly Rent"
189
+ min={0}
190
+ max={100_000}
191
+ className="w-full sm:w-50"
192
+ />
193
+ <NumericRangeFilter
194
+ field="Bedrooms__c"
195
+ label="Bedrooms"
196
+ min={0}
197
+ max={20}
198
+ className="w-full sm:w-50"
199
+ />
200
+ <FilterResetButton />
201
+ </FilterRow>
202
+ </FilterProvider>
203
+ );
204
+ }
205
+
206
+ function PropertySearchNoResults() {
207
+ return (
208
+ <div className="text-center py-12">
209
+ <p className="text-gray-500 text-lg">No properties found</p>
210
+ </div>
211
+ );
212
+ }
213
+
214
+ function PropertySearchGrid({
215
+ propertyNodes,
216
+ setSelectedProperty,
217
+ }: {
218
+ propertyNodes: PropertySearchNode[];
219
+ setSelectedProperty: (property: PropertySearchNode) => void;
220
+ }) {
221
+ return (
222
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
223
+ {propertyNodes.map((property) => (
224
+ <PropertyCard key={property.Id} property={property} onClick={setSelectedProperty} />
225
+ ))}
226
+ </div>
227
+ );
228
+ }
229
+
230
+ function PropertySearchSkeleton({ pageSize }: { pageSize: number }) {
231
+ return (
232
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
233
+ {Array.from({ length: pageSize }, (_, i) => (
234
+ <div key={i} className="bg-white rounded-lg shadow-md overflow-hidden">
235
+ <Skeleton className="h-48 w-full rounded-none" />
236
+ <div className="p-6 space-y-2">
237
+ <Skeleton className="h-6 w-48" />
238
+ <Skeleton className="h-4 w-full" />
239
+ <Skeleton className="h-4 w-40" />
240
+ <Skeleton className="h-4 w-24" />
241
+ </div>
242
+ </div>
243
+ ))}
244
+ </div>
245
+ );
246
+ }
247
+
248
+ function PropertySearchErrorState() {
249
+ const navigate = useNavigate();
250
+
251
+ return (
252
+ <ObjectSearchErrorState
253
+ message="There was an error loading the properties. Please try again."
254
+ onGoHome={() => navigate("/")}
255
+ onRetry={() => navigate(0)}
256
+ />
257
+ );
258
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+
7
+ import AgentforceConversationClient from "../components/AgentforceConversationClient";
8
+
9
+ export default function TestAccPage() {
10
+ return (
11
+ <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
12
+ <div className="text-center">
13
+ <h1 className="text-4xl font-bold text-gray-900 mb-4">ACC</h1>
14
+ <p className="text-lg text-gray-600 mb-8">Welcome to your ACC application.</p>
15
+ </div>
16
+ <AgentforceConversationClient agentId="0Xx000000000000AAA" />
17
+ </div>
18
+ );
19
+ }
@@ -0,0 +1,35 @@
1
+ import type { RouteObject } from 'react-router';
2
+ import { routes } from './routes';
3
+
4
+ export type RouteWithFullPath = RouteObject & { fullPath: string };
5
+
6
+ const flatMapRoutes = (
7
+ route: RouteObject,
8
+ parentPath: string = ''
9
+ ): RouteWithFullPath[] => {
10
+ let fullPath: string;
11
+
12
+ if (route.index) {
13
+ fullPath = parentPath || '/';
14
+ } else if (route.path) {
15
+ if (route.path.startsWith('/')) {
16
+ fullPath = route.path;
17
+ } else {
18
+ fullPath =
19
+ parentPath === '/' ? `/${route.path}` : `${parentPath}/${route.path}`;
20
+ }
21
+ } else {
22
+ fullPath = parentPath;
23
+ }
24
+
25
+ const routeWithPath = { ...route, fullPath };
26
+
27
+ const childRoutes =
28
+ route.children?.flatMap(child => flatMapRoutes(child, fullPath)) || [];
29
+
30
+ return [routeWithPath, ...childRoutes];
31
+ };
32
+
33
+ export const getAllRoutes = (): RouteWithFullPath[] => {
34
+ return routes.flatMap(route => flatMapRoutes(route));
35
+ };