@salesforce/ui-bundle-template-app-react-sample-b2x 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.
- package/LICENSE.txt +82 -0
- package/README.md +52 -0
- package/dist/.forceignore +15 -0
- package/dist/.husky/pre-commit +4 -0
- package/dist/.prettierignore +11 -0
- package/dist/.prettierrc +17 -0
- package/dist/AGENT.md +193 -0
- package/dist/CHANGELOG.md +2128 -0
- package/dist/README.md +112 -0
- package/dist/config/project-scratch-def.json +13 -0
- package/dist/eslint.config.js +7 -0
- package/dist/force-app/main/default/classes/MaintenanceRequestTriggerHandler.cls +69 -0
- package/dist/force-app/main/default/classes/MaintenanceRequestTriggerHandler.cls-meta.xml +5 -0
- package/dist/force-app/main/default/classes/MaintenanceRequestTriggerHandler_Test.cls +308 -0
- package/dist/force-app/main/default/classes/MaintenanceRequestTriggerHandler_Test.cls-meta.xml +5 -0
- package/dist/force-app/main/default/classes/TenantTriggerHandler.cls +77 -0
- package/dist/force-app/main/default/classes/TenantTriggerHandler.cls-meta.xml +5 -0
- package/dist/force-app/main/default/classes/TenantTriggerHandler_Test.cls +100 -0
- package/dist/force-app/main/default/classes/TenantTriggerHandler_Test.cls-meta.xml +5 -0
- package/dist/force-app/main/default/classes/UIBundleAuthUtils.cls +68 -0
- package/dist/force-app/main/default/classes/UIBundleAuthUtils.cls-meta.xml +5 -0
- package/dist/force-app/main/default/classes/UIBundleChangePassword.cls +77 -0
- package/dist/force-app/main/default/classes/UIBundleChangePassword.cls-meta.xml +5 -0
- package/dist/force-app/main/default/classes/UIBundleForgotPassword.cls +71 -0
- package/dist/force-app/main/default/classes/UIBundleForgotPassword.cls-meta.xml +5 -0
- package/dist/force-app/main/default/classes/UIBundleLogin.cls +105 -0
- package/dist/force-app/main/default/classes/UIBundleLogin.cls-meta.xml +5 -0
- package/dist/force-app/main/default/classes/UIBundleRegistration.cls +162 -0
- package/dist/force-app/main/default/classes/UIBundleRegistration.cls-meta.xml +5 -0
- package/dist/force-app/main/default/cspTrustedSites/GitHub_Avatars.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/cspTrustedSites/Google_Fonts.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/cspTrustedSites/Google_Fonts_Static.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/cspTrustedSites/OpenStreetMap_Nominatim.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/cspTrustedSites/OpenStreetMap_Tiles.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/cspTrustedSites/Open_Meteo_API.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/cspTrustedSites/Pexels_Images.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/cspTrustedSites/Pexels_Videos.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/cspTrustedSites/Unsplash_Images.cspTrustedSite-meta.xml +15 -0
- package/dist/force-app/main/default/data/Agent__c.json +79 -0
- package/dist/force-app/main/default/data/Application__c.json +124 -0
- package/dist/force-app/main/default/data/Contact.json +44 -0
- package/dist/force-app/main/default/data/KPI_Snapshot__c.json +160 -0
- package/dist/force-app/main/default/data/Lease__c.json +9442 -0
- package/dist/force-app/main/default/data/Maintenance_Request__c.json +514 -0
- package/dist/force-app/main/default/data/Maintenance_Worker__c.json +304 -0
- package/dist/force-app/main/default/data/Notification__c.json +214 -0
- package/dist/force-app/main/default/data/Payment__c.json +1024 -0
- package/dist/force-app/main/default/data/Property_Cost__c.json +484 -0
- package/dist/force-app/main/default/data/Property_Feature__c.json +169 -0
- package/dist/force-app/main/default/data/Property_Image__c.json +148 -0
- package/dist/force-app/main/default/data/Property_Listing__c.json +130 -0
- package/dist/force-app/main/default/data/Property_Management_Company__c.json +70 -0
- package/dist/force-app/main/default/data/Property_Owner__c.json +184 -0
- package/dist/force-app/main/default/data/Property_Sale__c.json +246 -0
- package/dist/force-app/main/default/data/Property__c.json +704 -0
- package/dist/force-app/main/default/data/Tenant__c.json +184 -0
- package/dist/force-app/main/default/data/data-plan.json +110 -0
- package/dist/force-app/main/default/data/prepare-import-unique-fields.js +85 -0
- package/dist/force-app/main/default/digitalExperienceConfigs/propertyrentalapp1.digitalExperienceConfig-meta.xml +8 -0
- package/dist/force-app/main/default/digitalExperiences/site/propertyrentalapp1/propertyrentalapp1.digitalExperience-meta.xml +11 -0
- package/dist/force-app/main/default/digitalExperiences/site/propertyrentalapp1/sfdc_cms__site/propertyrentalapp1/_meta.json +5 -0
- package/dist/force-app/main/default/digitalExperiences/site/propertyrentalapp1/sfdc_cms__site/propertyrentalapp1/content.json +10 -0
- package/dist/force-app/main/default/layouts/Application__c-Application Layout.layout-meta.xml +58 -0
- package/dist/force-app/main/default/layouts/KPI_Snapshot__c-KPI Snapshot Layout.layout-meta.xml +87 -0
- package/dist/force-app/main/default/layouts/Lease__c-Lease Layout.layout-meta.xml +83 -0
- package/dist/force-app/main/default/layouts/Maintenance_Request__c-Maintenance Request Layout.layout-meta.xml +89 -0
- package/dist/force-app/main/default/layouts/Maintenance_Worker__c-Maintenance Worker Layout.layout-meta.xml +66 -0
- package/dist/force-app/main/default/layouts/Payment__c-Payment Layout.layout-meta.xml +88 -0
- package/dist/force-app/main/default/layouts/Property_Cost__c-Property Cost Layout.layout-meta.xml +88 -0
- package/dist/force-app/main/default/layouts/Property_Feature__c-Property Feature Layout.layout-meta.xml +80 -0
- package/dist/force-app/main/default/layouts/Property_Image__c-Property Image Layout.layout-meta.xml +75 -0
- package/dist/force-app/main/default/layouts/Property_Listing__c-Property Listing Layout.layout-meta.xml +92 -0
- package/dist/force-app/main/default/layouts/Property_Management_Company__c-Property Management Company Layout.layout-meta.xml +75 -0
- package/dist/force-app/main/default/layouts/Property_Owner__c-Property Owner Layout.layout-meta.xml +67 -0
- package/dist/force-app/main/default/layouts/Property_Sale__c-Property Sale Layout.layout-meta.xml +87 -0
- package/dist/force-app/main/default/layouts/Property__c-Property Layout.layout-meta.xml +130 -0
- package/dist/force-app/main/default/layouts/Tenant__c-Tenant Layout.layout-meta.xml +58 -0
- package/dist/force-app/main/default/networks/propertyrentalapp.network-meta.xml +60 -0
- package/dist/force-app/main/default/objects/Agent__c/Agent__c.object-meta.xml +66 -0
- package/dist/force-app/main/default/objects/Agent__c/fields/Agent_Type__c.field-meta.xml +37 -0
- package/dist/force-app/main/default/objects/Agent__c/fields/Availability__c.field-meta.xml +37 -0
- package/dist/force-app/main/default/objects/Agent__c/fields/Emergency_Alt__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Agent__c/fields/Language__c.field-meta.xml +42 -0
- package/dist/force-app/main/default/objects/Agent__c/fields/License_Expiry__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Agent__c/fields/License_Number__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Agent__c/fields/Office_Location__c.field-meta.xml +42 -0
- package/dist/force-app/main/default/objects/Agent__c/fields/Territory__c.field-meta.xml +42 -0
- package/dist/force-app/main/default/objects/Application__c/Application__c.object-meta.xml +67 -0
- package/dist/force-app/main/default/objects/Application__c/fields/Employment__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Application__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Application__c/fields/References__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Application__c/fields/Start_Date__c.field-meta.xml +9 -0
- package/dist/force-app/main/default/objects/Application__c/fields/Status__c.field-meta.xml +47 -0
- package/dist/force-app/main/default/objects/Application__c/fields/User__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/KPI_Snapshot__c.object-meta.xml +65 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Previous_Month_Sales__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Sales_MoM_Change__c.field-meta.xml +18 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Snapshot_Date__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Total_Properties__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Total_Sales_Amount__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Total_Sales_Count__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Units_Available__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/KPI_Snapshot__c/fields/Units_Occupied__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Lease__c/Lease__c.object-meta.xml +67 -0
- package/dist/force-app/main/default/objects/Lease__c/fields/End_Date__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Lease__c/fields/Lease_Status__c.field-meta.xml +36 -0
- package/dist/force-app/main/default/objects/Lease__c/fields/Monthly_Rent__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Lease__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Lease__c/fields/Security_Deposit__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Lease__c/fields/Start_Date__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Lease__c/fields/Tenant__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Lease__c/validationRules/End_Date_After_Start_Date.validationRule-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/Maintenance_Request__c.object-meta.xml +73 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Actual_Cost__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Assigned_Worker__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Completed__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Description__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Est_Cost__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Priority__c.field-meta.xml +32 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Scheduled__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Status__c.field-meta.xml +42 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Tenant_Home__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/Type__c.field-meta.xml +62 -0
- package/dist/force-app/main/default/objects/Maintenance_Request__c/fields/User__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/Maintenance_Worker__c.object-meta.xml +71 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Certifications__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Employment_Type__c.field-meta.xml +32 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Hourly_Rate__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/IsActive__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Location__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Phone__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Rating__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Maintenance_Worker__c/fields/Type__c.field-meta.xml +57 -0
- package/dist/force-app/main/default/objects/Notification__c/Notification__c.object-meta.xml +67 -0
- package/dist/force-app/main/default/objects/Notification__c/fields/Is_Read__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Notification__c/fields/Message__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Notification__c/fields/Priority__c.field-meta.xml +36 -0
- package/dist/force-app/main/default/objects/Notification__c/fields/Related_Object_Type__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Notification__c/fields/Related_Record_Id__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Notification__c/fields/Title__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Notification__c/fields/Type__c.field-meta.xml +36 -0
- package/dist/force-app/main/default/objects/Notification__c/fields/User__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Payment__c/Payment__c.object-meta.xml +67 -0
- package/dist/force-app/main/default/objects/Payment__c/fields/Amount__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Payment__c/fields/Lease__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Payment__c/fields/Notes__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Payment__c/fields/Payment_Date__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Payment__c/fields/Payment_Method__c.field-meta.xml +41 -0
- package/dist/force-app/main/default/objects/Payment__c/fields/Payment_Status__c.field-meta.xml +36 -0
- package/dist/force-app/main/default/objects/Property_Cost__c/Property_Cost__c.object-meta.xml +67 -0
- package/dist/force-app/main/default/objects/Property_Cost__c/fields/Cost_Amount__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property_Cost__c/fields/Cost_Category__c.field-meta.xml +56 -0
- package/dist/force-app/main/default/objects/Property_Cost__c/fields/Cost_Date__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Property_Cost__c/fields/Description__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property_Cost__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Property_Cost__c/fields/Vendor__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property_Cost__c/validationRules/Cost_Amount_Limit.validationRule-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Feature__c/Property_Feature__c.object-meta.xml +65 -0
- package/dist/force-app/main/default/objects/Property_Feature__c/fields/Description__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Property_Feature__c/fields/Display_on_Listing__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Feature__c/fields/Feature_Category__c.field-meta.xml +51 -0
- package/dist/force-app/main/default/objects/Property_Feature__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Property_Image__c/Property_Image__c.object-meta.xml +65 -0
- package/dist/force-app/main/default/objects/Property_Image__c/fields/Alt_Text__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property_Image__c/fields/Display_Order__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Property_Image__c/fields/Image_Type__c.field-meta.xml +41 -0
- package/dist/force-app/main/default/objects/Property_Image__c/fields/Image_URL__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Image__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Property_Listing__c/Property_Listing__c.object-meta.xml +65 -0
- package/dist/force-app/main/default/objects/Property_Listing__c/fields/Display_Order__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Property_Listing__c/fields/Featured__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Listing__c/fields/Listing_Price__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property_Listing__c/fields/Listing_Status__c.field-meta.xml +41 -0
- package/dist/force-app/main/default/objects/Property_Listing__c/fields/Marketing_Description__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Property_Listing__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Property_Listing__c/fields/Short_Description__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property_Management_Company__c/Property_Management_Company__c.object-meta.xml +65 -0
- package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Active__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Company_Code__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Email__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Phone__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Management_Company__c/fields/Primary_Contact__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Property_Owner__c/Property_Owner__c.object-meta.xml +65 -0
- package/dist/force-app/main/default/objects/Property_Owner__c/fields/Address__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Owner__c/fields/Email__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Property_Owner__c/fields/Phone__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/Property_Sale__c.object-meta.xml +67 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/fields/Buyer_Tenant__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/fields/Payment_Method__c.field-meta.xml +41 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/fields/Reference_Number__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/fields/Sale_Amount__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/fields/Sale_Date__c.field-meta.xml +10 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/fields/Sale_Status__c.field-meta.xml +36 -0
- package/dist/force-app/main/default/objects/Property_Sale__c/fields/Sale_Type__c.field-meta.xml +51 -0
- package/dist/force-app/main/default/objects/Property__c/Property__c.object-meta.xml +71 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Address__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Agent__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Available_Date__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Bathrooms__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Bedrooms__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Coordinates__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Deposit__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Description__c.field-meta.xml +12 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Features__c.field-meta.xml +38 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Hero_Image__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Lease_Term__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Monthly_Rent__c.field-meta.xml +13 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Parking__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Pet_Friendly__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Sq_Ft__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Status__c.field-meta.xml +37 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Tour_URL__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Type__c.field-meta.xml +37 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Utilities__c.field-meta.xml +38 -0
- package/dist/force-app/main/default/objects/Property__c/fields/Year_Built__c.field-meta.xml +14 -0
- package/dist/force-app/main/default/objects/Tenant__c/Tenant__c.object-meta.xml +67 -0
- package/dist/force-app/main/default/objects/Tenant__c/fields/End_Date__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Tenant__c/fields/Property__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/objects/Tenant__c/fields/Start_Date__c.field-meta.xml +11 -0
- package/dist/force-app/main/default/objects/Tenant__c/fields/Status__c.field-meta.xml +37 -0
- package/dist/force-app/main/default/objects/Tenant__c/fields/User_Status__c.field-meta.xml +42 -0
- package/dist/force-app/main/default/objects/Tenant__c/fields/User__c.field-meta.xml +15 -0
- package/dist/force-app/main/default/package.xml +20 -0
- package/dist/force-app/main/default/permissionsets/Property_Management_Access.permissionset-meta.xml +633 -0
- package/dist/force-app/main/default/permissionsets/Tenant_Maintenance_Access.permissionset-meta.xml +137 -0
- package/dist/force-app/main/default/sites/propertyrentalapp.site-meta.xml +31 -0
- package/dist/force-app/main/default/triggers/MaintenanceRequestTrigger.trigger +5 -0
- package/dist/force-app/main/default/triggers/MaintenanceRequestTrigger.trigger-meta.xml +5 -0
- package/dist/force-app/main/default/triggers/TenantTrigger.trigger +8 -0
- package/dist/force-app/main/default/triggers/TenantTrigger.trigger-meta.xml +5 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/.forceignore +15 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/.graphqlrc.yml +2 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/.prettierignore +9 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/.prettierrc +11 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/CHANGELOG.md +10 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/README.md +35 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/codegen.yml +95 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/components.json +18 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/e2e/app.spec.ts +17 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/eslint.config.js +169 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/index.html +18 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/package.json +74 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/playwright.config.ts +24 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/propertyrentalapp.uibundle-meta.xml +8 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/scripts/get-graphql-schema.mjs +68 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/scripts/rewrite-e2e-assets.mjs +23 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/applications/applicationApi.ts +54 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/graphql-operations-types.ts +16005 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/graphqlClient.ts +25 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/leads/leadApi.ts +78 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/maintenanceRequests/maintenanceRequestApi.ts +74 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/maintenanceRequests/query/maintenanceRequests.graphql +60 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/propertyDetailGraphQL.ts +75 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/propertyNodeUtils.ts +29 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/propertySearchService.ts +56 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/query/distinctPropertyStatus.graphql +19 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/query/distinctPropertyType.graphql +19 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/query/listingById.graphql +29 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/query/propertyAddressesByIds.graphql +17 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/query/propertyDetailById.graphql +124 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/properties/query/searchProperties.graphql +85 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/query/tenantAccess.graphql +13 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/api/tenantApi.ts +12 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/app.tsx +43 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/appLayout.tsx +24 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/appliances.svg +13 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/book.svg +3 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/copy.svg +4 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/electrical.svg +39 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/hvac.svg +78 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/pest.svg +5 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/plumbing.svg +7 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/rocket.svg +3 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/star.svg +3 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/icons/zen-logo.svg +5 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/images/codey-1.png +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/images/codey-2.png +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/images/codey-3.png +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/assets/images/vibe-codey.svg +194 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/SkeletonPrimitives.tsx +36 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/alerts/status-alert.tsx +49 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/dashboard/WeatherWidget.tsx +235 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/layout/TopBar.tsx +133 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/layout/VerticalNav.tsx +97 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/layouts/card-layout.tsx +29 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/maintenanceRequests/MaintenanceRequestIcon.tsx +46 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/maintenanceRequests/MaintenanceRequestList.tsx +52 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/maintenanceRequests/MaintenanceRequestListItem.tsx +74 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/maintenanceRequests/MaintenanceSummaryDetailsModal.tsx +92 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/maintenanceRequests/StatusBadge.tsx +36 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/properties/PropertyListingCard.tsx +178 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/properties/PropertyMap.tsx +186 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/properties/PropertySearchFilters.tsx +315 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/alert.tsx +76 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/badge.tsx +48 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/breadcrumb.tsx +109 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/button.tsx +67 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/calendar.tsx +232 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/card.tsx +103 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/checkbox.tsx +32 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/collapsible.tsx +33 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/datePicker.tsx +127 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/dialog.tsx +162 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/field.tsx +237 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/index.ts +84 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/input.tsx +19 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/label.tsx +22 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/pagination.tsx +132 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/popover.tsx +89 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/select.tsx +193 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/separator.tsx +26 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/skeleton.tsx +14 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/sonner.tsx +20 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/spinner.tsx +16 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/table.tsx +114 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/components/ui/tabs.tsx +88 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/api/userProfileApi.ts +95 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/authHelpers.ts +73 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/authenticationConfig.ts +61 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/context/AuthContext.tsx +95 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/footers/footer-link.tsx +36 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/forms/auth-form.tsx +81 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/forms/submit-button.tsx +49 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/hooks/form.tsx +120 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/hooks/useCountdownTimer.ts +266 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/hooks/useRetryWithBackoff.ts +109 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/layout/card-skeleton.tsx +38 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/layout/centered-page-layout.tsx +87 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/layouts/AuthAppLayout.tsx +12 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/layouts/TenantRoute.tsx +22 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/layouts/authenticationRouteLayout.tsx +21 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/layouts/privateRouteLayout.tsx +44 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/pages/ChangePassword.tsx +107 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/pages/ForgotPassword.tsx +73 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/pages/Login.tsx +97 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/pages/Profile.tsx +161 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/pages/Register.tsx +133 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/pages/ResetPassword.tsx +107 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/sessionTimeout/SessionTimeoutValidator.tsx +602 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/sessionTimeout/sessionTimeService.ts +149 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/sessionTimeout/sessionTimeoutConfig.ts +77 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/authentication/utils/helpers.ts +121 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/__examples__/api/accountSearchService.ts +46 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/__examples__/api/query/distinctAccountIndustries.graphql +19 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/__examples__/api/query/distinctAccountTypes.graphql +19 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/__examples__/api/query/getAccountDetail.graphql +121 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/__examples__/api/query/searchAccounts.graphql +51 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/__examples__/pages/AccountObjectDetailPage.tsx +357 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/__examples__/pages/AccountSearch.tsx +312 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/__examples__/pages/Home.tsx +34 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/api/objectSearchService.ts +84 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/ActiveFilters.tsx +89 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/FilterContext.tsx +83 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/ObjectBreadcrumb.tsx +66 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/PaginationControls.tsx +109 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/SearchBar.tsx +41 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/SortControl.tsx +143 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/BooleanFilter.tsx +78 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/DateFilter.tsx +128 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/DateRangeFilter.tsx +70 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/FilterFieldWrapper.tsx +33 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/MultiSelectFilter.tsx +97 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/NumericRangeFilter.tsx +163 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/SearchFilter.tsx +50 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/SelectFilter.tsx +97 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/components/filters/TextFilter.tsx +91 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/hooks/useAsyncData.ts +54 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/hooks/useCachedAsyncData.ts +184 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/hooks/useDebouncedCallback.ts +34 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/hooks/useObjectSearchParams.ts +252 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/utils/debounce.ts +25 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/utils/fieldUtils.ts +29 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/utils/filterUtils.ts +395 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/features/object-search/utils/sortUtils.ts +38 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/hooks/useGeocode.ts +33 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/hooks/useMaintenanceRequests.ts +43 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/hooks/usePropertyDetail.ts +63 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/hooks/usePropertyMapMarkers.ts +181 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/hooks/useTenantAccess.ts +38 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/hooks/useWeather.ts +311 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/lib/utils.ts +6 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/navigationMenu.tsx +80 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/Application.tsx +235 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/Contact.tsx +247 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/Dashboard.tsx +45 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/Home.tsx +507 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/Maintenance.tsx +330 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/NotFound.tsx +14 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/PropertyDetails.tsx +356 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/PropertySearch.tsx +472 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/pages/PropertySearchPlaceholder.tsx +49 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-01.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-02.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-03.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-04.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-05.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-06.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-07.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-08.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-09.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-10.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-11.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-12.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-13.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-14.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-15.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-16.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-17.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-18.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-19.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-20.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-21.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-22.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-23.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-24.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/public/property-25.jpg +0 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/router-utils.tsx +35 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/routes.tsx +130 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/styles/global.css +229 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/types/leaflet.d.ts +17 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/types/searchResults.ts +229 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/utils/geocode.ts +90 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/src/utils/propertyListingPaginationUtils.ts +18 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/tsconfig.json +42 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/tsconfig.node.json +13 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/ui-bundle.json +7 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/vite-env.d.ts +1 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/vite.config.ts +106 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/vitest-env.d.ts +2 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/vitest.config.ts +11 -0
- package/dist/force-app/main/default/uiBundles/propertyrentalapp/vitest.setup.ts +1 -0
- package/dist/jest.config.js +6 -0
- package/dist/package-lock.json +9995 -0
- package/dist/package.json +40 -0
- package/dist/scripts/apex/hello.apex +10 -0
- package/dist/scripts/graphql-search.sh +191 -0
- package/dist/scripts/prepare-import-unique-fields.js +122 -0
- package/dist/scripts/setup-cli.mjs +563 -0
- package/dist/scripts/sf-project-setup.mjs +66 -0
- package/dist/scripts/soql/account.soql +6 -0
- package/dist/sfdx-project.json +12 -0
- package/package.json +43 -0
package/dist/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Property Rental App
|
|
2
|
+
|
|
3
|
+
A property rental sample React UI Bundle for Salesforce Experience Cloud. Demonstrates property listings, maintenance requests, and a dashboard with an app shell designed for external-facing deployment. Built with React, Vite, TypeScript, and Tailwind/shadcn.
|
|
4
|
+
|
|
5
|
+
## What's included
|
|
6
|
+
|
|
7
|
+
| Path | Description |
|
|
8
|
+
| ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
9
|
+
| `force-app/main/default/uiBundles/propertyrentalapp/` | React UI Bundle (source, config, tests) |
|
|
10
|
+
| `force-app/main/default/objects/` | 17 custom objects — Agent\_\_c, Application\_\_c, KPI_Snapshot\_\_c, Lease\_\_c, Maintenance_Request\_\_c, Maintenance_Worker\_\_c, Notification\_\_c, Payment\_\_c, Property\_\_c, Property_Cost\_\_c, Property_Feature\_\_c, Property_Image\_\_c, Property_Listing\_\_c, Property_Management_Company\_\_c, Property_Owner\_\_c, Property_Sale\_\_c, Tenant\_\_c |
|
|
11
|
+
| `force-app/main/default/layouts/` | Page layouts for each custom object |
|
|
12
|
+
| `force-app/main/default/permissionsets/` | `Property_Management_Access` permission set |
|
|
13
|
+
| `force-app/main/default/classes/` | Apex classes — `MaintenanceRequestListAction`, `MaintenanceRequestUpdatePriorityAction` |
|
|
14
|
+
| `force-app/main/default/cspTrustedSites/` | CSP trusted sites for external resources (Google Fonts, Pexels, Unsplash, GitHub Avatars) |
|
|
15
|
+
| `force-app/main/default/data/` | Sample data (JSON) for all objects, importable via `sf data import tree` |
|
|
16
|
+
| `force-app/main/default/digitalExperienceConfigs/` | Experience Cloud site configuration |
|
|
17
|
+
| `force-app/main/default/digitalExperiences/` | Experience Cloud site definition |
|
|
18
|
+
| `force-app/main/default/networks/` | Experience Cloud network |
|
|
19
|
+
| `force-app/main/default/sites/` | Salesforce site |
|
|
20
|
+
|
|
21
|
+
## Getting started
|
|
22
|
+
|
|
23
|
+
Navigate to the UI Bundle and install dependencies:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
cd force-app/main/default/uiBundles/propertyrentalapp
|
|
27
|
+
npm install
|
|
28
|
+
npm run dev
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Opens at http://localhost:5173 by default. For build and test instructions, see the [UI Bundle README](force-app/main/default/uiBundles/propertyrentalapp/README.md).
|
|
32
|
+
|
|
33
|
+
## Deploy
|
|
34
|
+
|
|
35
|
+
### Deploy everything (metadata + Experience Cloud site + UI Bundle)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
cd force-app/main/default/uiBundles/propertyrentalapp && npm install && npm run build && cd -
|
|
39
|
+
sf project deploy start --source-dir force-app --target-org <alias>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Deploy the UI Bundle only
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
cd force-app/main/default/uiBundles/propertyrentalapp && npm install && npm run build && cd -
|
|
46
|
+
sf project deploy start --source-dir force-app/main/default/ui-bundles --target-org <alias>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Deploy metadata only (objects, layouts, permission sets, Apex classes)
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
sf project deploy start \
|
|
53
|
+
--source-dir force-app/main/default/objects \
|
|
54
|
+
--source-dir force-app/main/default/layouts \
|
|
55
|
+
--source-dir force-app/main/default/permissionsets \
|
|
56
|
+
--source-dir force-app/main/default/classes \
|
|
57
|
+
--target-org <alias>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Deploy Experience Cloud site only
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
sf project deploy start \
|
|
64
|
+
--source-dir force-app/main/default/digitalExperienceConfigs \
|
|
65
|
+
--source-dir force-app/main/default/digitalExperiences \
|
|
66
|
+
--source-dir force-app/main/default/networks \
|
|
67
|
+
--source-dir force-app/main/default/sites \
|
|
68
|
+
--target-org <alias>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Replace `<alias>` with your target org alias.
|
|
72
|
+
|
|
73
|
+
## Import sample data
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
sf data import tree --plan force-app/main/default/data/data-plan.json --target-org <alias>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Using setup-cli.mjs
|
|
80
|
+
|
|
81
|
+
When this app is built (e.g. from the monorepo or from a published package), a `setup-cli.mjs` script is included at the project root. It runs the full setup in one go: login (if needed), deploy metadata, assign the `Property_Management_Access` permission set, prepare and import sample data, fetch GraphQL schema and run codegen, build the UI Bundle, and optionally start the dev server.
|
|
82
|
+
|
|
83
|
+
Run from the **project root** (the directory that contains `force-app/`, `sfdx-project.json`, and `setup-cli.mjs`):
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
node setup-cli.mjs --target-org <alias>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Common options:
|
|
90
|
+
|
|
91
|
+
| Option | Description |
|
|
92
|
+
| ------------------------ | ---------------------------------------------------------------- |
|
|
93
|
+
| `--skip-login` | Skip browser login (org already authenticated) |
|
|
94
|
+
| `--skip-data` | Skip data preparation and import |
|
|
95
|
+
| `--skip-graphql` | Skip GraphQL schema fetch and codegen |
|
|
96
|
+
| `--skip-ui-bundle-build` | Skip `npm install` and UI Bundle build |
|
|
97
|
+
| `--skip-dev` | Do not start the dev server at the end |
|
|
98
|
+
| `--permset <name>` | Permission set to assign (default: `Property_Management_Access`) |
|
|
99
|
+
| `--app <name>` | Web app folder name when multiple exist |
|
|
100
|
+
|
|
101
|
+
For all options: `node setup-cli.mjs --help`.
|
|
102
|
+
|
|
103
|
+
## Configure Your Salesforce DX Project
|
|
104
|
+
|
|
105
|
+
The `sfdx-project.json` file contains useful configuration information for your project. See [Salesforce DX Project Configuration](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_ws_config.htm) in the _Salesforce DX Developer Guide_ for details about this file.
|
|
106
|
+
|
|
107
|
+
## Read All About It
|
|
108
|
+
|
|
109
|
+
- [Salesforce Extensions Documentation](https://developer.salesforce.com/tools/vscode/)
|
|
110
|
+
- [Salesforce CLI Setup Guide](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_intro.htm)
|
|
111
|
+
- [Salesforce DX Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_intro.htm)
|
|
112
|
+
- [Salesforce CLI Command Reference](https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference.htm)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"orgName": "My Saleforce Org",
|
|
3
|
+
"edition": "Developer",
|
|
4
|
+
"features": ["EnableSetPasswordInApi"],
|
|
5
|
+
"settings": {
|
|
6
|
+
"lightningExperienceSettings": {
|
|
7
|
+
"enableS1DesktopEnabled": true
|
|
8
|
+
},
|
|
9
|
+
"mobileSettings": {
|
|
10
|
+
"enableS1EncryptedStoragePref2": false
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
public without sharing class MaintenanceRequestTriggerHandler {
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Handles before insert logic for Maintenance Request records
|
|
5
|
+
* Automatically assigns workers based on request type and updates status to Assigned
|
|
6
|
+
*/
|
|
7
|
+
public static void handleBeforeInsert(List<Maintenance_Request__c> newRequests) {
|
|
8
|
+
// Map to store request type to worker type mappings
|
|
9
|
+
Map<String, String> requestTypeToWorkerType = new Map<String, String>{
|
|
10
|
+
'Plumbing' => 'Plumbing',
|
|
11
|
+
'Electrical' => 'Electrical',
|
|
12
|
+
'HVAC' => 'HVAC (Heating & Cooling)',
|
|
13
|
+
'Appliance' => 'Appliance Repair',
|
|
14
|
+
'Carpentry' => 'General Carpentry',
|
|
15
|
+
'Landscaping' => 'Landscaping / Grounds',
|
|
16
|
+
'Cleaning' => 'Janitorial / Cleaning',
|
|
17
|
+
'Pest' => 'Pest Control'
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Collect unique worker types needed
|
|
21
|
+
Set<String> workerTypesNeeded = new Set<String>();
|
|
22
|
+
for (Maintenance_Request__c request : newRequests) {
|
|
23
|
+
if (request.Type__c != null && requestTypeToWorkerType.containsKey(request.Type__c)) {
|
|
24
|
+
workerTypesNeeded.add(requestTypeToWorkerType.get(request.Type__c));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Query for available workers by type
|
|
29
|
+
Map<String, List<Maintenance_Worker__c>> workersByType = new Map<String, List<Maintenance_Worker__c>>();
|
|
30
|
+
if (!workerTypesNeeded.isEmpty()) {
|
|
31
|
+
for (Maintenance_Worker__c worker : [
|
|
32
|
+
SELECT Id, Name, Type__c, Rating__c
|
|
33
|
+
FROM Maintenance_Worker__c
|
|
34
|
+
WHERE Type__c IN :workerTypesNeeded
|
|
35
|
+
AND IsActive__c = true
|
|
36
|
+
ORDER BY Rating__c DESC NULLS LAST, Name ASC
|
|
37
|
+
]) {
|
|
38
|
+
if (!workersByType.containsKey(worker.Type__c)) {
|
|
39
|
+
workersByType.put(worker.Type__c, new List<Maintenance_Worker__c>());
|
|
40
|
+
}
|
|
41
|
+
workersByType.get(worker.Type__c).add(worker);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Assign workers to requests
|
|
46
|
+
for (Maintenance_Request__c request : newRequests) {
|
|
47
|
+
// Only process requests with 'New' status (or null, since 'New' is the default)
|
|
48
|
+
if ((request.Status__c == 'New' || request.Status__c == null) &&
|
|
49
|
+
request.Type__c != null && requestTypeToWorkerType.containsKey(request.Type__c)) {
|
|
50
|
+
String workerType = requestTypeToWorkerType.get(request.Type__c);
|
|
51
|
+
|
|
52
|
+
// Check if we have available workers for this type
|
|
53
|
+
if (workersByType.containsKey(workerType) && !workersByType.get(workerType).isEmpty()) {
|
|
54
|
+
// Assign the first available worker (highest rated)
|
|
55
|
+
Maintenance_Worker__c assignedWorker = workersByType.get(workerType).get(0);
|
|
56
|
+
request.Assigned_Worker__c = assignedWorker.Id;
|
|
57
|
+
request.Status__c = 'Assigned';
|
|
58
|
+
|
|
59
|
+
// Set scheduled date to 3 days from now
|
|
60
|
+
request.Scheduled__c = DateTime.now().addDays(3);
|
|
61
|
+
|
|
62
|
+
// Rotate worker to end of list for round-robin assignment
|
|
63
|
+
workersByType.get(workerType).remove(0);
|
|
64
|
+
workersByType.get(workerType).add(assignedWorker);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test class for MaintenanceRequestTriggerHandler
|
|
3
|
+
* Validates automatic worker assignment, status updates to Assigned, and scheduled date setting
|
|
4
|
+
*/
|
|
5
|
+
@isTest
|
|
6
|
+
private class MaintenanceRequestTriggerHandler_Test {
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Setup test data for all test methods
|
|
10
|
+
*/
|
|
11
|
+
@testSetup
|
|
12
|
+
static void setupTestData() {
|
|
13
|
+
// Create test maintenance workers with different specialties
|
|
14
|
+
List<Maintenance_Worker__c> workers = new List<Maintenance_Worker__c>{
|
|
15
|
+
new Maintenance_Worker__c(
|
|
16
|
+
Name = 'John Plumber',
|
|
17
|
+
Type__c = 'Plumbing',
|
|
18
|
+
IsActive__c = true,
|
|
19
|
+
Rating__c = 4.5,
|
|
20
|
+
Phone__c = '555-0001'
|
|
21
|
+
),
|
|
22
|
+
new Maintenance_Worker__c(
|
|
23
|
+
Name = 'Jane Electrician',
|
|
24
|
+
Type__c = 'Electrical',
|
|
25
|
+
IsActive__c = true,
|
|
26
|
+
Rating__c = 4.8,
|
|
27
|
+
Phone__c = '555-0002'
|
|
28
|
+
),
|
|
29
|
+
new Maintenance_Worker__c(
|
|
30
|
+
Name = 'Bob HVAC',
|
|
31
|
+
Type__c = 'HVAC (Heating & Cooling)',
|
|
32
|
+
IsActive__c = true,
|
|
33
|
+
Rating__c = 4.2,
|
|
34
|
+
Phone__c = '555-0003'
|
|
35
|
+
),
|
|
36
|
+
new Maintenance_Worker__c(
|
|
37
|
+
Name = 'Alice Appliance',
|
|
38
|
+
Type__c = 'Appliance Repair',
|
|
39
|
+
IsActive__c = true,
|
|
40
|
+
Rating__c = 4.7,
|
|
41
|
+
Phone__c = '555-0004'
|
|
42
|
+
),
|
|
43
|
+
new Maintenance_Worker__c(
|
|
44
|
+
Name = 'Charlie Pest',
|
|
45
|
+
Type__c = 'Pest Control',
|
|
46
|
+
IsActive__c = true,
|
|
47
|
+
Rating__c = 4.3,
|
|
48
|
+
Phone__c = '555-0005'
|
|
49
|
+
),
|
|
50
|
+
new Maintenance_Worker__c(
|
|
51
|
+
Name = 'Inactive Worker',
|
|
52
|
+
Type__c = 'Plumbing',
|
|
53
|
+
IsActive__c = false,
|
|
54
|
+
Rating__c = 5.0,
|
|
55
|
+
Phone__c = '555-0006'
|
|
56
|
+
)
|
|
57
|
+
};
|
|
58
|
+
insert workers;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Test that plumbing requests are assigned to plumbing workers
|
|
63
|
+
*/
|
|
64
|
+
@isTest
|
|
65
|
+
static void testPlumbingRequestAssignment() {
|
|
66
|
+
// Query for plumbing worker
|
|
67
|
+
Maintenance_Worker__c plumber = [SELECT Id FROM Maintenance_Worker__c WHERE Type__c = 'Plumbing' AND IsActive__c = true LIMIT 1];
|
|
68
|
+
|
|
69
|
+
Test.startTest();
|
|
70
|
+
Maintenance_Request__c request = new Maintenance_Request__c(
|
|
71
|
+
Type__c = 'Plumbing',
|
|
72
|
+
Description__c = 'Leaky faucet in bathroom',
|
|
73
|
+
Priority__c = 'Standard'
|
|
74
|
+
);
|
|
75
|
+
insert request;
|
|
76
|
+
Test.stopTest();
|
|
77
|
+
|
|
78
|
+
// Verify assignment
|
|
79
|
+
Maintenance_Request__c insertedRequest = [
|
|
80
|
+
SELECT Id, Assigned_Worker__c, Status__c, Scheduled__c, Type__c
|
|
81
|
+
FROM Maintenance_Request__c
|
|
82
|
+
WHERE Id = :request.Id
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
System.assertEquals(plumber.Id, insertedRequest.Assigned_Worker__c, 'Worker should be assigned');
|
|
86
|
+
System.assertEquals('Assigned', insertedRequest.Status__c, 'Status should be Assigned');
|
|
87
|
+
System.assertNotEquals(null, insertedRequest.Scheduled__c, 'Scheduled date should be set');
|
|
88
|
+
|
|
89
|
+
// Verify scheduled date is approximately 3 days from now (within 1 minute tolerance)
|
|
90
|
+
DateTime expectedDate = DateTime.now().addDays(3);
|
|
91
|
+
Long timeDiff = Math.abs(insertedRequest.Scheduled__c.getTime() - expectedDate.getTime());
|
|
92
|
+
System.assert(timeDiff < 60000, 'Scheduled date should be 3 days from now');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Test that electrical requests are assigned to electrical workers
|
|
97
|
+
*/
|
|
98
|
+
@isTest
|
|
99
|
+
static void testElectricalRequestAssignment() {
|
|
100
|
+
Maintenance_Worker__c electrician = [SELECT Id FROM Maintenance_Worker__c WHERE Type__c = 'Electrical' AND IsActive__c = true LIMIT 1];
|
|
101
|
+
|
|
102
|
+
Test.startTest();
|
|
103
|
+
Maintenance_Request__c request = new Maintenance_Request__c(
|
|
104
|
+
Type__c = 'Electrical',
|
|
105
|
+
Description__c = 'Outlet not working',
|
|
106
|
+
Priority__c = 'High (Same Day)'
|
|
107
|
+
);
|
|
108
|
+
insert request;
|
|
109
|
+
Test.stopTest();
|
|
110
|
+
|
|
111
|
+
Maintenance_Request__c insertedRequest = [
|
|
112
|
+
SELECT Id, Assigned_Worker__c, Status__c
|
|
113
|
+
FROM Maintenance_Request__c
|
|
114
|
+
WHERE Id = :request.Id
|
|
115
|
+
];
|
|
116
|
+
|
|
117
|
+
System.assertEquals(electrician.Id, insertedRequest.Assigned_Worker__c, 'Electrician should be assigned');
|
|
118
|
+
System.assertEquals('Assigned', insertedRequest.Status__c, 'Status should be Assigned');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Test that HVAC requests are assigned to HVAC workers
|
|
123
|
+
*/
|
|
124
|
+
@isTest
|
|
125
|
+
static void testHVACRequestAssignment() {
|
|
126
|
+
Maintenance_Worker__c hvacWorker = [SELECT Id FROM Maintenance_Worker__c WHERE Type__c = 'HVAC (Heating & Cooling)' AND IsActive__c = true LIMIT 1];
|
|
127
|
+
|
|
128
|
+
Test.startTest();
|
|
129
|
+
Maintenance_Request__c request = new Maintenance_Request__c(
|
|
130
|
+
Type__c = 'HVAC',
|
|
131
|
+
Description__c = 'AC not cooling',
|
|
132
|
+
Priority__c = 'High (Same Day)'
|
|
133
|
+
);
|
|
134
|
+
insert request;
|
|
135
|
+
Test.stopTest();
|
|
136
|
+
|
|
137
|
+
Maintenance_Request__c insertedRequest = [
|
|
138
|
+
SELECT Id, Assigned_Worker__c, Status__c
|
|
139
|
+
FROM Maintenance_Request__c
|
|
140
|
+
WHERE Id = :request.Id
|
|
141
|
+
];
|
|
142
|
+
|
|
143
|
+
System.assertEquals(hvacWorker.Id, insertedRequest.Assigned_Worker__c, 'HVAC worker should be assigned');
|
|
144
|
+
System.assertEquals('Assigned', insertedRequest.Status__c, 'Status should be Assigned');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Test that appliance requests are assigned to appliance repair workers
|
|
149
|
+
*/
|
|
150
|
+
@isTest
|
|
151
|
+
static void testApplianceRequestAssignment() {
|
|
152
|
+
Maintenance_Worker__c applianceWorker = [SELECT Id FROM Maintenance_Worker__c WHERE Type__c = 'Appliance Repair' AND IsActive__c = true LIMIT 1];
|
|
153
|
+
|
|
154
|
+
Test.startTest();
|
|
155
|
+
Maintenance_Request__c request = new Maintenance_Request__c(
|
|
156
|
+
Type__c = 'Appliance',
|
|
157
|
+
Description__c = 'Dishwasher not draining',
|
|
158
|
+
Priority__c = 'Standard'
|
|
159
|
+
);
|
|
160
|
+
insert request;
|
|
161
|
+
Test.stopTest();
|
|
162
|
+
|
|
163
|
+
Maintenance_Request__c insertedRequest = [
|
|
164
|
+
SELECT Id, Assigned_Worker__c, Status__c
|
|
165
|
+
FROM Maintenance_Request__c
|
|
166
|
+
WHERE Id = :request.Id
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
System.assertEquals(applianceWorker.Id, insertedRequest.Assigned_Worker__c, 'Appliance worker should be assigned');
|
|
170
|
+
System.assertEquals('Assigned', insertedRequest.Status__c, 'Status should be Assigned');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Test that pest requests are assigned to pest control workers
|
|
175
|
+
*/
|
|
176
|
+
@isTest
|
|
177
|
+
static void testPestRequestAssignment() {
|
|
178
|
+
Maintenance_Worker__c pestWorker = [SELECT Id FROM Maintenance_Worker__c WHERE Type__c = 'Pest Control' AND IsActive__c = true LIMIT 1];
|
|
179
|
+
|
|
180
|
+
Test.startTest();
|
|
181
|
+
Maintenance_Request__c request = new Maintenance_Request__c(
|
|
182
|
+
Type__c = 'Pest',
|
|
183
|
+
Description__c = 'Ants in kitchen',
|
|
184
|
+
Priority__c = 'Standard'
|
|
185
|
+
);
|
|
186
|
+
insert request;
|
|
187
|
+
Test.stopTest();
|
|
188
|
+
|
|
189
|
+
Maintenance_Request__c insertedRequest = [
|
|
190
|
+
SELECT Id, Assigned_Worker__c, Status__c
|
|
191
|
+
FROM Maintenance_Request__c
|
|
192
|
+
WHERE Id = :request.Id
|
|
193
|
+
];
|
|
194
|
+
|
|
195
|
+
System.assertEquals(pestWorker.Id, insertedRequest.Assigned_Worker__c, 'Pest control worker should be assigned');
|
|
196
|
+
System.assertEquals('Assigned', insertedRequest.Status__c, 'Status should be Assigned');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Test bulk insert with multiple request types
|
|
201
|
+
*/
|
|
202
|
+
@isTest
|
|
203
|
+
static void testBulkRequestAssignment() {
|
|
204
|
+
Test.startTest();
|
|
205
|
+
List<Maintenance_Request__c> requests = new List<Maintenance_Request__c>{
|
|
206
|
+
new Maintenance_Request__c(Type__c = 'Plumbing', Description__c = 'Leak 1', Priority__c = 'High (Same Day)'),
|
|
207
|
+
new Maintenance_Request__c(Type__c = 'Electrical', Description__c = 'Issue 1', Priority__c = 'Standard'),
|
|
208
|
+
new Maintenance_Request__c(Type__c = 'Plumbing', Description__c = 'Leak 2', Priority__c = 'Standard'),
|
|
209
|
+
new Maintenance_Request__c(Type__c = 'HVAC', Description__c = 'AC Issue', Priority__c = 'High (Same Day)'),
|
|
210
|
+
new Maintenance_Request__c(Type__c = 'Appliance', Description__c = 'Fridge Issue', Priority__c = 'Standard')
|
|
211
|
+
};
|
|
212
|
+
insert requests;
|
|
213
|
+
Test.stopTest();
|
|
214
|
+
|
|
215
|
+
List<Maintenance_Request__c> insertedRequests = [
|
|
216
|
+
SELECT Id, Assigned_Worker__c, Status__c, Type__c
|
|
217
|
+
FROM Maintenance_Request__c
|
|
218
|
+
WHERE Id IN :requests
|
|
219
|
+
];
|
|
220
|
+
|
|
221
|
+
// Verify all requests were assigned
|
|
222
|
+
for (Maintenance_Request__c req : insertedRequests) {
|
|
223
|
+
System.assertNotEquals(null, req.Assigned_Worker__c, 'All requests should have assigned workers');
|
|
224
|
+
System.assertEquals('Assigned', req.Status__c, 'All requests should be Assigned');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
System.assertEquals(5, insertedRequests.size(), 'All 5 requests should be inserted');
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Test that requests without type are not assigned
|
|
232
|
+
*/
|
|
233
|
+
@isTest
|
|
234
|
+
static void testRequestWithoutType() {
|
|
235
|
+
Test.startTest();
|
|
236
|
+
Maintenance_Request__c request = new Maintenance_Request__c(
|
|
237
|
+
Description__c = 'General maintenance',
|
|
238
|
+
Priority__c = 'Standard'
|
|
239
|
+
);
|
|
240
|
+
insert request;
|
|
241
|
+
Test.stopTest();
|
|
242
|
+
|
|
243
|
+
Maintenance_Request__c insertedRequest = [
|
|
244
|
+
SELECT Id, Assigned_Worker__c, Status__c
|
|
245
|
+
FROM Maintenance_Request__c
|
|
246
|
+
WHERE Id = :request.Id
|
|
247
|
+
];
|
|
248
|
+
|
|
249
|
+
System.assertEquals(null, insertedRequest.Assigned_Worker__c, 'Worker should not be assigned without type');
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Test that inactive workers are not assigned
|
|
254
|
+
*/
|
|
255
|
+
@isTest
|
|
256
|
+
static void testInactiveWorkerNotAssigned() {
|
|
257
|
+
// Delete all active plumbing workers
|
|
258
|
+
delete [SELECT Id FROM Maintenance_Worker__c WHERE Type__c = 'Plumbing' AND IsActive__c = true];
|
|
259
|
+
|
|
260
|
+
Test.startTest();
|
|
261
|
+
Maintenance_Request__c request = new Maintenance_Request__c(
|
|
262
|
+
Type__c = 'Plumbing',
|
|
263
|
+
Description__c = 'Emergency leak',
|
|
264
|
+
Priority__c = 'High (Same Day)'
|
|
265
|
+
);
|
|
266
|
+
insert request;
|
|
267
|
+
Test.stopTest();
|
|
268
|
+
|
|
269
|
+
Maintenance_Request__c insertedRequest = [
|
|
270
|
+
SELECT Id, Assigned_Worker__c, Status__c
|
|
271
|
+
FROM Maintenance_Request__c
|
|
272
|
+
WHERE Id = :request.Id
|
|
273
|
+
];
|
|
274
|
+
|
|
275
|
+
System.assertEquals(null, insertedRequest.Assigned_Worker__c, 'Inactive worker should not be assigned');
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Test that requests with non-New status are not automatically processed
|
|
280
|
+
*/
|
|
281
|
+
@isTest
|
|
282
|
+
static void testNonNewStatusNotProcessed() {
|
|
283
|
+
// Query for plumbing worker
|
|
284
|
+
Maintenance_Worker__c plumber = [SELECT Id FROM Maintenance_Worker__c WHERE Type__c = 'Plumbing' AND IsActive__c = true LIMIT 1];
|
|
285
|
+
|
|
286
|
+
Test.startTest();
|
|
287
|
+
// Create a request with status explicitly set to 'In Progress'
|
|
288
|
+
Maintenance_Request__c request = new Maintenance_Request__c(
|
|
289
|
+
Type__c = 'Plumbing',
|
|
290
|
+
Description__c = 'Manually assigned request',
|
|
291
|
+
Priority__c = 'Standard',
|
|
292
|
+
Status__c = 'In Progress'
|
|
293
|
+
);
|
|
294
|
+
insert request;
|
|
295
|
+
Test.stopTest();
|
|
296
|
+
|
|
297
|
+
// Verify the request was not processed by trigger (no worker assigned)
|
|
298
|
+
Maintenance_Request__c insertedRequest = [
|
|
299
|
+
SELECT Id, Assigned_Worker__c, Status__c, Scheduled__c
|
|
300
|
+
FROM Maintenance_Request__c
|
|
301
|
+
WHERE Id = :request.Id
|
|
302
|
+
];
|
|
303
|
+
|
|
304
|
+
System.assertEquals(null, insertedRequest.Assigned_Worker__c, 'Worker should not be auto-assigned for non-New status');
|
|
305
|
+
System.assertEquals('In Progress', insertedRequest.Status__c, 'Status should remain as originally set');
|
|
306
|
+
System.assertEquals(null, insertedRequest.Scheduled__c, 'Scheduled date should not be set by trigger');
|
|
307
|
+
}
|
|
308
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assigns Tenant_Maintenance_Access permission set to users linked to Tenant__c records.
|
|
3
|
+
* When a Tenant is created or updated with User__c set, the linked user gets the permission set.
|
|
4
|
+
*/
|
|
5
|
+
public with sharing class TenantTriggerHandler {
|
|
6
|
+
|
|
7
|
+
private static final String PERMISSION_SET_NAME = 'Tenant_Maintenance_Access';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Assign Tenant_Maintenance_Access to each user linked via Tenant__c.User__c.
|
|
11
|
+
* Insert: all records with User__c set.
|
|
12
|
+
* Update: records where User__c was set or changed to a non-null value.
|
|
13
|
+
*/
|
|
14
|
+
public static void assignTenantMaintenanceAccess(List<Tenant__c> newList, Map<Id, Tenant__c> oldMap) {
|
|
15
|
+
Set<Id> userIds = new Set<Id>();
|
|
16
|
+
for (Tenant__c t : newList) {
|
|
17
|
+
if (t.User__c == null) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (oldMap == null) {
|
|
21
|
+
userIds.add(t.User__c);
|
|
22
|
+
} else {
|
|
23
|
+
Tenant__c oldRec = oldMap.get(t.Id);
|
|
24
|
+
if (oldRec == null || oldRec.User__c != t.User__c) {
|
|
25
|
+
userIds.add(t.User__c);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (userIds.isEmpty()) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
assignTenantMaintenanceAccessAsync(new List<Id>(userIds));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@future
|
|
36
|
+
private static void assignTenantMaintenanceAccessAsync(List<Id> userIdsList) {
|
|
37
|
+
Set<Id> userIds = new Set<Id>(userIdsList);
|
|
38
|
+
if (userIds.isEmpty()) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
List<PermissionSet> permSets = [
|
|
42
|
+
SELECT Id
|
|
43
|
+
FROM PermissionSet
|
|
44
|
+
WHERE Name = :PERMISSION_SET_NAME
|
|
45
|
+
AND IsOwnedByProfile = false
|
|
46
|
+
LIMIT 1
|
|
47
|
+
];
|
|
48
|
+
if (permSets.isEmpty()) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
Id permSetId = permSets[0].Id;
|
|
52
|
+
|
|
53
|
+
Set<Id> alreadyAssigned = new Set<Id>();
|
|
54
|
+
for (PermissionSetAssignment psa : [
|
|
55
|
+
SELECT AssigneeId
|
|
56
|
+
FROM PermissionSetAssignment
|
|
57
|
+
WHERE PermissionSetId = :permSetId
|
|
58
|
+
AND AssigneeId IN :userIds
|
|
59
|
+
]) {
|
|
60
|
+
alreadyAssigned.add(psa.AssigneeId);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
List<PermissionSetAssignment> toInsert = new List<PermissionSetAssignment>();
|
|
64
|
+
for (Id uid : userIds) {
|
|
65
|
+
if (alreadyAssigned.contains(uid)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
toInsert.add(new PermissionSetAssignment(
|
|
69
|
+
PermissionSetId = permSetId,
|
|
70
|
+
AssigneeId = uid
|
|
71
|
+
));
|
|
72
|
+
}
|
|
73
|
+
if (!toInsert.isEmpty()) {
|
|
74
|
+
insert toInsert;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|