@salesforce/templates 66.5.6 → 66.6.1
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/lib/generators/projectGenerator.d.ts +1 -1
- package/lib/generators/projectGenerator.js +3 -3
- package/lib/generators/projectGenerator.js.map +1 -1
- package/lib/templates/project/{reactb2e → reactexternalapp}/AGENT.md +6 -10
- package/lib/templates/project/{reactb2e → reactexternalapp}/CHANGELOG.md +59 -0
- package/lib/templates/project/{reactb2x → reactexternalapp}/README.md +14 -14
- package/lib/templates/project/{reactb2x/_p_/_m_/_d_/_s_/_a1_/appreacttemplateb2x1.digitalExperience-meta.xml → reactexternalapp/_p_/_m_/_d_/_s_/_a1_/reactexternalapp1.digitalExperience-meta.xml} +1 -1
- package/lib/templates/project/{reactb2x/_p_/_m_/_d_/_s_/_a1_/sfdc_cms__site/appreacttemplateb2x1 → reactexternalapp/_p_/_m_/_d_/_s_/_a1_/sfdc_cms__site/reactexternalapp1}/_meta.json +1 -1
- package/lib/templates/project/{reactb2x/_p_/_m_/_d_/_s_/_a1_/sfdc_cms__site/appreacttemplateb2x1 → reactexternalapp/_p_/_m_/_d_/_s_/_a1_/sfdc_cms__site/reactexternalapp1}/content.json +3 -3
- package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/README.md +2 -2
- package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/package.json +3 -3
- package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/appreacttemplateb2x.webapplication-meta.xml → reactexternalapp/_p_/_m_/_w_/_a_/reactexternalapp.webapplication-meta.xml} +1 -1
- package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/pages/AccountSearch.tsx +82 -54
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/FilterContext.tsx +73 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +109 -0
- package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/BooleanFilter.tsx +16 -36
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +121 -0
- package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateRangeFilter.tsx +14 -23
- package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/MultiSelectFilter.tsx +18 -26
- package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/NumericRangeFilter.tsx +22 -39
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +37 -0
- package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SelectFilter.tsx +30 -34
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +74 -0
- package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useAsyncData.ts +1 -0
- package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useCachedAsyncData.ts +1 -0
- package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useObjectSearchParams.ts +22 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/graphqlClient.ts +25 -0
- package/lib/templates/project/{reactb2x/_p_/_m_/digitalExperienceConfigs/appreacttemplateb2x1.digitalExperienceConfig → reactexternalapp/_p_/_m_/digitalExperienceConfigs/reactexternalapp1.digitalExperienceConfig} +3 -3
- package/lib/templates/project/{reactb2x/_p_/_m_/networks/appreacttemplateb2x.network → reactexternalapp/_p_/_m_/networks/reactexternalapp.network} +4 -4
- package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/package.xml +4 -4
- package/lib/templates/project/{reactb2x/_p_/_m_/sites/appreacttemplateb2x.site → reactexternalapp/_p_/_m_/sites/reactexternalapp.site} +2 -2
- package/lib/templates/project/{reactb2e → reactexternalapp}/_r_/webapp-data.md +5 -5
- package/lib/templates/project/{reactb2x → reactexternalapp}/_r_/webapp-ui.md +2 -2
- package/lib/templates/project/{reactb2e → reactexternalapp}/package-lock.json +2 -2
- package/lib/templates/project/{reactb2e → reactexternalapp}/package.json +1 -1
- package/lib/templates/project/{reactb2x/_r_/skills/using-salesforce-data → reactexternalapp/scripts}/graphql-search.sh +73 -21
- package/lib/templates/project/{reactb2x → reactinternalapp}/AGENT.md +6 -10
- package/lib/templates/project/{reactb2x → reactinternalapp}/CHANGELOG.md +59 -0
- package/lib/templates/project/{reactb2e → reactinternalapp}/README.md +9 -9
- package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/README.md +2 -2
- package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/package.json +3 -3
- package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/appreacttemplateb2e.webapplication-meta.xml → reactinternalapp/_p_/_m_/_w_/_a_/reactinternalapp.webapplication-meta.xml} +1 -1
- package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/pages/AccountSearch.tsx +82 -54
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/FilterContext.tsx +73 -0
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +109 -0
- package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/BooleanFilter.tsx +16 -36
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +121 -0
- package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateRangeFilter.tsx +14 -23
- package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/MultiSelectFilter.tsx +18 -26
- package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/NumericRangeFilter.tsx +22 -39
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +37 -0
- package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SelectFilter.tsx +30 -34
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +74 -0
- package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useAsyncData.ts +1 -0
- package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useCachedAsyncData.ts +1 -0
- package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useObjectSearchParams.ts +22 -0
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/graphqlClient.ts +25 -0
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/routes.tsx +21 -0
- package/lib/templates/project/{reactb2x → reactinternalapp}/_r_/webapp-data.md +5 -5
- package/lib/templates/project/{reactb2e → reactinternalapp}/_r_/webapp-ui.md +2 -2
- package/lib/templates/project/{reactb2x → reactinternalapp}/package-lock.json +2 -2
- package/lib/templates/project/{reactb2x → reactinternalapp}/package.json +1 -1
- package/lib/templates/project/{reactb2e/_r_/skills/using-salesforce-data → reactinternalapp/scripts}/graphql-search.sh +73 -21
- package/lib/templates/webapplication/reactbasic/package.json +3 -3
- package/lib/templates/webapplication/reactbasic/src/api/graphqlClient.ts +25 -0
- package/lib/utils/template-placeholders.js +8 -1
- package/lib/utils/template-placeholders.js.map +1 -1
- package/lib/utils/types.d.ts +1 -1
- package/lib/utils/webappTemplateUtils.d.ts +12 -4
- package/lib/utils/webappTemplateUtils.js +46 -14
- package/lib/utils/webappTemplateUtils.js.map +1 -1
- package/package.json +5 -5
- package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/FilterPanel.tsx +0 -127
- package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +0 -151
- package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +0 -165
- package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +0 -40
- package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +0 -77
- package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/pages/TestAccPage.tsx +0 -19
- package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/routes.tsx +0 -38
- package/lib/templates/project/reactb2e/_r_/skills/building-data-visualization/SKILL.md +0 -72
- package/lib/templates/project/reactb2e/_r_/skills/building-data-visualization/implementation/bar-line-chart.md +0 -316
- package/lib/templates/project/reactb2e/_r_/skills/building-data-visualization/implementation/dashboard-layout.md +0 -189
- package/lib/templates/project/reactb2e/_r_/skills/building-data-visualization/implementation/donut-chart.md +0 -181
- package/lib/templates/project/reactb2e/_r_/skills/building-data-visualization/implementation/stat-card.md +0 -150
- package/lib/templates/project/reactb2e/_r_/skills/building-react-components/SKILL.md +0 -96
- package/lib/templates/project/reactb2e/_r_/skills/building-react-components/implementation/component.md +0 -78
- package/lib/templates/project/reactb2e/_r_/skills/building-react-components/implementation/header-footer.md +0 -132
- package/lib/templates/project/reactb2e/_r_/skills/building-react-components/implementation/page.md +0 -93
- package/lib/templates/project/reactb2e/_r_/skills/configuring-csp-trusted-sites/SKILL.md +0 -90
- package/lib/templates/project/reactb2e/_r_/skills/configuring-csp-trusted-sites/implementation/metadata-format.md +0 -281
- package/lib/templates/project/reactb2e/_r_/skills/configuring-webapp-metadata/SKILL.md +0 -158
- package/lib/templates/project/reactb2e/_r_/skills/creating-webapp/SKILL.md +0 -140
- package/lib/templates/project/reactb2e/_r_/skills/deploying-to-salesforce/SKILL.md +0 -226
- package/lib/templates/project/reactb2e/_r_/skills/implementing-file-upload/SKILL.md +0 -396
- package/lib/templates/project/reactb2e/_r_/skills/installing-webapp-features/SKILL.md +0 -210
- package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/SKILL.md +0 -186
- package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/references/constraints.md +0 -134
- package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/references/examples.md +0 -132
- package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/references/style-tokens.md +0 -101
- package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/references/troubleshooting.md +0 -57
- package/lib/templates/project/reactb2e/_r_/skills/using-salesforce-data/SKILL.md +0 -363
- package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/FilterPanel.tsx +0 -127
- package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +0 -151
- package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +0 -165
- package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +0 -40
- package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +0 -77
- package/lib/templates/project/reactb2x/_r_/skills/building-data-visualization/SKILL.md +0 -72
- package/lib/templates/project/reactb2x/_r_/skills/building-data-visualization/implementation/bar-line-chart.md +0 -316
- package/lib/templates/project/reactb2x/_r_/skills/building-data-visualization/implementation/dashboard-layout.md +0 -189
- package/lib/templates/project/reactb2x/_r_/skills/building-data-visualization/implementation/donut-chart.md +0 -181
- package/lib/templates/project/reactb2x/_r_/skills/building-data-visualization/implementation/stat-card.md +0 -150
- package/lib/templates/project/reactb2x/_r_/skills/building-react-components/SKILL.md +0 -96
- package/lib/templates/project/reactb2x/_r_/skills/building-react-components/implementation/component.md +0 -78
- package/lib/templates/project/reactb2x/_r_/skills/building-react-components/implementation/header-footer.md +0 -132
- package/lib/templates/project/reactb2x/_r_/skills/building-react-components/implementation/page.md +0 -93
- package/lib/templates/project/reactb2x/_r_/skills/configuring-csp-trusted-sites/SKILL.md +0 -90
- package/lib/templates/project/reactb2x/_r_/skills/configuring-csp-trusted-sites/implementation/metadata-format.md +0 -281
- package/lib/templates/project/reactb2x/_r_/skills/configuring-webapp-metadata/SKILL.md +0 -158
- package/lib/templates/project/reactb2x/_r_/skills/creating-webapp/SKILL.md +0 -140
- package/lib/templates/project/reactb2x/_r_/skills/deploying-to-salesforce/SKILL.md +0 -226
- package/lib/templates/project/reactb2x/_r_/skills/implementing-file-upload/SKILL.md +0 -396
- package/lib/templates/project/reactb2x/_r_/skills/installing-webapp-features/SKILL.md +0 -210
- package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/SKILL.md +0 -186
- package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/references/constraints.md +0 -134
- package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/references/examples.md +0 -132
- package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/references/style-tokens.md +0 -101
- package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/references/troubleshooting.md +0 -57
- package/lib/templates/project/reactb2x/_r_/skills/using-salesforce-data/SKILL.md +0 -363
- /package/lib/templates/project/{reactb2e → reactexternalapp}/.forceignore +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/.husky/pre-commit +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/.prettierignore +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/.prettierrc +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/.forceignore +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/.graphqlrc.yml +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/.prettierignore +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/.prettierrc +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/CHANGELOG.md +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/codegen.yml +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/components.json +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/e2e/app.spec.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/eslint.config.js +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/index.html +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/playwright.config.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/scripts/get-graphql-schema.mjs +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +0 -0
- /package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/accountSearchService.ts +0 -0
- /package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/query/distinctAccountIndustries.graphql +0 -0
- /package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/query/distinctAccountTypes.graphql +0 -0
- /package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/query/getAccountDetail.graphql +0 -0
- /package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/query/searchAccounts.graphql +0 -0
- /package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/pages/AccountObjectDetailPage.tsx +0 -0
- /package/lib/templates/project/{reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/pages/Home.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/api/objectSearchService.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ActiveFilters.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ObjectBreadcrumb.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SearchBar.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SortControl.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/debounce.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/fieldUtils.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/filterUtils.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/sortUtils.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/api/userProfileApi.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/authHelpers.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/authenticationConfig.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/context/AuthContext.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/footers/footer-link.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/forms/auth-form.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/forms/submit-button.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/hooks/form.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/hooks/useCountdownTimer.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/hooks/useRetryWithBackoff.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/layout/card-skeleton.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/layout/centered-page-layout.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/layouts/AuthAppLayout.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/layouts/authenticationRouteLayout.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/layouts/privateRouteLayout.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/ChangePassword.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/ForgotPassword.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Login.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Profile.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Register.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/ResetPassword.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/sessionTimeout/SessionTimeoutValidator.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/sessionTimeout/sessionTimeService.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/sessionTimeout/sessionTimeoutConfig.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/_f_/authentication/utils/helpers.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/api/graphql-operations-types.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/app.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/appLayout.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/assets/icons/book.svg +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/assets/icons/copy.svg +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/assets/icons/rocket.svg +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/assets/icons/star.svg +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/assets/images/codey-1.png +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/assets/images/codey-2.png +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/assets/images/codey-3.png +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/assets/images/vibe-codey.svg +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/alerts/status-alert.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/layouts/card-layout.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/alert.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/badge.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/breadcrumb.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/button.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/calendar.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/card.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/checkbox.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/collapsible.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/datePicker.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/dialog.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/field.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/index.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/input.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/label.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/pagination.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/popover.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/select.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/separator.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/skeleton.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/sonner.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/spinner.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/table.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/components/ui/tabs.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/lib/utils.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/navigationMenu.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/pages/Home.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/pages/NotFound.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/router-utils.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/_w_/_a_/src/routes.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/src/styles/global.css +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/tsconfig.json +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/tsconfig.node.json +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/vite-env.d.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/vite.config.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/vitest-env.d.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/vitest.config.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/vitest.setup.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/_p_/_m_/_w_/_a_/webapplication.json +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppAuthUtils.cls +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppAuthUtils.cls-meta.xml +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppChangePassword.cls +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppChangePassword.cls-meta.xml +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppForgotPassword.cls +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppForgotPassword.cls-meta.xml +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppLogin.cls +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppLogin.cls-meta.xml +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppRegistration.cls +0 -0
- /package/lib/templates/project/{reactb2x → reactexternalapp}/_p_/_m_/classes/WebAppRegistration.cls-meta.xml +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/config/project-scratch-def.json +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/eslint.config.js +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/jest.config.js +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/scripts/apex/hello.apex +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/scripts/prepare-import-unique-fields.js +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/scripts/setup-cli.mjs +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/scripts/sf-project-setup.mjs +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/scripts/soql/account.soql +0 -0
- /package/lib/templates/project/{reactb2e → reactexternalapp}/sfdx-project.json +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/.forceignore +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/.husky/pre-commit +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/.prettierignore +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/.prettierrc +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/.forceignore +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/.graphqlrc.yml +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/.prettierignore +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/.prettierrc +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/CHANGELOG.md +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/codegen.yml +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/components.json +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/e2e/app.spec.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/eslint.config.js +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/index.html +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/playwright.config.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/scripts/get-graphql-schema.mjs +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +0 -0
- /package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/accountSearchService.ts +0 -0
- /package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/query/distinctAccountIndustries.graphql +0 -0
- /package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/query/distinctAccountTypes.graphql +0 -0
- /package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/query/getAccountDetail.graphql +0 -0
- /package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/api/query/searchAccounts.graphql +0 -0
- /package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/pages/AccountObjectDetailPage.tsx +0 -0
- /package/lib/templates/project/{reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__ → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_}/pages/Home.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/api/objectSearchService.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ActiveFilters.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ObjectBreadcrumb.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SearchBar.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SortControl.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/debounce.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/fieldUtils.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/filterUtils.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/sortUtils.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/api/graphql-operations-types.ts +0 -0
- /package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/app.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/appLayout.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/assets/icons/book.svg +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/assets/icons/copy.svg +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/assets/icons/rocket.svg +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/assets/icons/star.svg +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/assets/images/codey-1.png +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/assets/images/codey-2.png +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/assets/images/codey-3.png +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/assets/images/vibe-codey.svg +0 -0
- /package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/AgentforceConversationClient.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/__inherit_AgentforceConversationClient.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/alerts/status-alert.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/layouts/card-layout.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/alert.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/badge.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/breadcrumb.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/button.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/calendar.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/card.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/checkbox.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/collapsible.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/datePicker.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/dialog.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/field.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/index.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/input.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/label.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/pagination.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/popover.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/select.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/separator.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/skeleton.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/sonner.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/spinner.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/table.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/components/ui/tabs.tsx +0 -0
- /package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/index.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/lib/utils.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/navigationMenu.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/pages/Home.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/pages/NotFound.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/router-utils.tsx +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/src/styles/global.css +0 -0
- /package/lib/templates/project/{reactb2e → reactinternalapp}/_p_/_m_/_w_/_a_/src/types/conversation.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/tsconfig.json +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/tsconfig.node.json +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/vite-env.d.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/vite.config.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/vitest-env.d.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/vitest.config.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/vitest.setup.ts +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/_p_/_m_/_w_/_a_/webapplication.json +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/config/project-scratch-def.json +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/eslint.config.js +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/jest.config.js +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/scripts/apex/hello.apex +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/scripts/prepare-import-unique-fields.js +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/scripts/setup-cli.mjs +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/scripts/sf-project-setup.mjs +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/scripts/soql/account.soql +0 -0
- /package/lib/templates/project/{reactb2x → reactinternalapp}/sfdx-project.json +0 -0
|
@@ -3,6 +3,65 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [1.114.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.113.0...v1.114.0) (2026-03-25)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# [1.113.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.112.10...v1.113.0) (2026-03-25)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## [1.112.10](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.112.9...v1.112.10) (2026-03-24)
|
|
23
|
+
|
|
24
|
+
**Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## [1.112.9](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.112.8...v1.112.9) (2026-03-24)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### Bug Fixes
|
|
34
|
+
|
|
35
|
+
* address PR [#81](https://github.com/salesforce-experience-platform-emu/webapps/issues/81) review feedback on graphql-search.sh ([#345](https://github.com/salesforce-experience-platform-emu/webapps/issues/345)) ([54a6e59](https://github.com/salesforce-experience-platform-emu/webapps/commit/54a6e590afd1923a12f776eba6b6cc147729c697))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## [1.112.8](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.112.7...v1.112.8) (2026-03-24)
|
|
42
|
+
|
|
43
|
+
**Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## [1.112.7](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.112.6...v1.112.7) (2026-03-23)
|
|
50
|
+
|
|
51
|
+
**Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
## [1.112.6](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.112.5...v1.112.6) (2026-03-23)
|
|
58
|
+
|
|
59
|
+
**Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
6
65
|
## [1.112.5](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.112.4...v1.112.5) (2026-03-21)
|
|
7
66
|
|
|
8
67
|
**Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
#
|
|
1
|
+
# React Internal App
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An internal React starter template for the Salesforce platform. Includes an Agentforce conversation client and global search; intended for internal (non-Experience Cloud) deployment. Built with React, Vite, TypeScript, and Tailwind/shadcn.
|
|
4
4
|
|
|
5
5
|
## What's included
|
|
6
6
|
|
|
7
7
|
This project ships the web application only. No additional Salesforce metadata (objects, classes, etc.) is included — bring your own data model.
|
|
8
8
|
|
|
9
|
-
| Path
|
|
10
|
-
|
|
|
11
|
-
| `force-app/main/default/webapplications/
|
|
9
|
+
| Path | Description |
|
|
10
|
+
| ---------------------------------------------------------- | ------------------------------------- |
|
|
11
|
+
| `force-app/main/default/webapplications/reactinternalapp/` | React web app (source, config, tests) |
|
|
12
12
|
|
|
13
13
|
## Getting started
|
|
14
14
|
|
|
15
15
|
Navigate to the web app and install dependencies:
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
cd force-app/main/default/webapplications/
|
|
18
|
+
cd force-app/main/default/webapplications/reactinternalapp
|
|
19
19
|
npm install
|
|
20
20
|
npm run dev
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
Opens at http://localhost:5173 by default. For build and test instructions, see the [web app README](force-app/main/default/webapplications/
|
|
23
|
+
Opens at http://localhost:5173 by default. For build and test instructions, see the [web app README](force-app/main/default/webapplications/reactinternalapp/README.md).
|
|
24
24
|
|
|
25
25
|
## Deploy
|
|
26
26
|
|
|
27
27
|
### Deploy everything (web app)
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
cd force-app/main/default/webapplications/
|
|
30
|
+
cd force-app/main/default/webapplications/reactinternalapp && npm install && npm run build && cd -
|
|
31
31
|
sf project deploy start --source-dir force-app --target-org <alias>
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
### Deploy the web app only
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
cd force-app/main/default/webapplications/
|
|
37
|
+
cd force-app/main/default/webapplications/reactinternalapp && npm install && npm run build && cd -
|
|
38
38
|
sf project deploy start --source-dir force-app/main/default/webapplications --target-org <alias>
|
|
39
39
|
```
|
|
40
40
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# React Internal App
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An internal React template for the Salesforce platform. Includes an Agentforce conversation client and global search; intended for internal (non-Experience Cloud) deployment. Built with React, Vite, TypeScript, and Tailwind/shadcn.
|
|
4
4
|
|
|
5
5
|
For project-level details (metadata, deploy), see the [project README](../../../../../../README.md).
|
|
6
6
|
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"graphql:schema": "node scripts/get-graphql-schema.mjs"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@salesforce/sdk-data": "^1.
|
|
19
|
-
"@salesforce/webapp-experimental": "^1.
|
|
18
|
+
"@salesforce/sdk-data": "^1.114.0",
|
|
19
|
+
"@salesforce/webapp-experimental": "^1.114.0",
|
|
20
20
|
"@tailwindcss/vite": "^4.1.17",
|
|
21
21
|
"class-variance-authority": "^0.7.1",
|
|
22
22
|
"clsx": "^2.1.1",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"@graphql-eslint/eslint-plugin": "^4.1.0",
|
|
43
43
|
"@graphql-tools/utils": "^11.0.0",
|
|
44
44
|
"@playwright/test": "^1.49.0",
|
|
45
|
-
"@salesforce/vite-plugin-webapp-experimental": "^1.
|
|
45
|
+
"@salesforce/vite-plugin-webapp-experimental": "^1.114.0",
|
|
46
46
|
"@testing-library/jest-dom": "^6.6.3",
|
|
47
47
|
"@testing-library/react": "^16.1.0",
|
|
48
48
|
"@testing-library/user-event": "^14.5.2",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<WebApplication xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
3
|
-
<masterLabel>
|
|
3
|
+
<masterLabel>reactinternalapp</masterLabel>
|
|
4
4
|
<description>A Salesforce web application.</description>
|
|
5
5
|
<isActive>true</isActive>
|
|
6
6
|
<version>1</version>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
1
|
+
import { useMemo, useState } from "react";
|
|
2
2
|
import { Link } from "react-router";
|
|
3
|
-
import { AlertCircle, SearchX } from "lucide-react";
|
|
3
|
+
import { AlertCircle, ChevronDown, SearchX } from "lucide-react";
|
|
4
4
|
import {
|
|
5
5
|
searchAccounts,
|
|
6
6
|
fetchDistinctIndustries,
|
|
@@ -10,8 +10,27 @@ import { useCachedAsyncData } from "../../hooks/useCachedAsyncData";
|
|
|
10
10
|
import { fieldValue } from "../../utils/fieldUtils";
|
|
11
11
|
import { useObjectSearchParams } from "../../hooks/useObjectSearchParams";
|
|
12
12
|
import { Alert, AlertTitle, AlertDescription } from "../../../../components/ui/alert";
|
|
13
|
+
import {
|
|
14
|
+
Card,
|
|
15
|
+
CardContent,
|
|
16
|
+
CardHeader,
|
|
17
|
+
CardTitle,
|
|
18
|
+
} from "../../../../components/ui/card";
|
|
19
|
+
import { Button } from "../../../../components/ui/button";
|
|
20
|
+
import {
|
|
21
|
+
Collapsible,
|
|
22
|
+
CollapsibleContent,
|
|
23
|
+
CollapsibleTrigger,
|
|
24
|
+
} from "../../../../components/ui/collapsible";
|
|
13
25
|
import { Skeleton } from "../../../../components/ui/skeleton";
|
|
14
|
-
import {
|
|
26
|
+
import { FilterProvider, FilterResetButton } from "../../components/FilterContext";
|
|
27
|
+
import { SearchFilter } from "../../components/filters/SearchFilter";
|
|
28
|
+
import { TextFilter } from "../../components/filters/TextFilter";
|
|
29
|
+
import { SelectFilter } from "../../components/filters/SelectFilter";
|
|
30
|
+
import { MultiSelectFilter } from "../../components/filters/MultiSelectFilter";
|
|
31
|
+
import { NumericRangeFilter } from "../../components/filters/NumericRangeFilter";
|
|
32
|
+
import { DateFilter } from "../../components/filters/DateFilter";
|
|
33
|
+
import { DateRangeFilter } from "../../components/filters/DateRangeFilter";
|
|
15
34
|
import { ActiveFilters } from "../../components/ActiveFilters";
|
|
16
35
|
import { SortControl } from "../../components/SortControl";
|
|
17
36
|
import type { FilterFieldConfig } from "../../utils/filterUtils";
|
|
@@ -31,48 +50,21 @@ type AccountNode = NonNullable<
|
|
|
31
50
|
NonNullable<NonNullable<AccountSearchResult["edges"]>[number]>["node"]
|
|
32
51
|
>;
|
|
33
52
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
field: "Name",
|
|
52
|
-
label: "Account Name",
|
|
53
|
-
type: "text",
|
|
54
|
-
placeholder: "Search by name...",
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
field: "Industry",
|
|
58
|
-
label: "Industry",
|
|
59
|
-
type: "picklist",
|
|
60
|
-
options: industryOptions,
|
|
61
|
-
},
|
|
62
|
-
{ field: "Type", label: "Type", type: "multipicklist", options: typeOptions },
|
|
63
|
-
{ field: "AnnualRevenue", label: "Annual Revenue", type: "numeric" },
|
|
64
|
-
{
|
|
65
|
-
field: "CreatedDate",
|
|
66
|
-
label: "Created Date",
|
|
67
|
-
type: "date",
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
field: "LastModifiedDate",
|
|
71
|
-
label: "Last Modified Date",
|
|
72
|
-
type: "daterange",
|
|
73
|
-
},
|
|
74
|
-
];
|
|
75
|
-
}
|
|
53
|
+
const FILTER_CONFIGS: FilterFieldConfig[] = [
|
|
54
|
+
{
|
|
55
|
+
field: "search",
|
|
56
|
+
label: "Search",
|
|
57
|
+
type: "search",
|
|
58
|
+
searchFields: ["Name", "Phone", "Industry"],
|
|
59
|
+
placeholder: "Search by name, phone, or industry...",
|
|
60
|
+
},
|
|
61
|
+
{ field: "Name", label: "Account Name", type: "text", placeholder: "Search by name..." },
|
|
62
|
+
{ field: "Industry", label: "Industry", type: "picklist" },
|
|
63
|
+
{ field: "Type", label: "Type", type: "multipicklist" },
|
|
64
|
+
{ field: "AnnualRevenue", label: "Annual Revenue", type: "numeric" },
|
|
65
|
+
{ field: "CreatedDate", label: "Created Date", type: "date" },
|
|
66
|
+
{ field: "LastModifiedDate", label: "Last Modified Date", type: "daterange" },
|
|
67
|
+
];
|
|
76
68
|
|
|
77
69
|
const ACCOUNT_SORT_CONFIGS: SortFieldConfig<keyof Account_OrderBy>[] = [
|
|
78
70
|
{ field: "Name", label: "Name" },
|
|
@@ -84,6 +76,7 @@ const ACCOUNT_SORT_CONFIGS: SortFieldConfig<keyof Account_OrderBy>[] = [
|
|
|
84
76
|
// -- Component --------------------------------------------------------------
|
|
85
77
|
|
|
86
78
|
export default function AccountSearch() {
|
|
79
|
+
const [filtersOpen, setFiltersOpen] = useState(true);
|
|
87
80
|
const { data: industryOptions } = useCachedAsyncData(fetchDistinctIndustries, [], {
|
|
88
81
|
key: "distinctIndustries",
|
|
89
82
|
ttl: 300_000,
|
|
@@ -93,15 +86,10 @@ export default function AccountSearch() {
|
|
|
93
86
|
ttl: 300_000,
|
|
94
87
|
});
|
|
95
88
|
|
|
96
|
-
const filterConfigs = useMemo(
|
|
97
|
-
() => buildAccountFilterConfigs(industryOptions ?? [], typeOptions ?? []),
|
|
98
|
-
[industryOptions, typeOptions],
|
|
99
|
-
);
|
|
100
|
-
|
|
101
89
|
const { filters, sort, query, pagination, resetAll } = useObjectSearchParams<
|
|
102
90
|
Account_Filter,
|
|
103
91
|
Account_OrderBy
|
|
104
|
-
>(
|
|
92
|
+
>(FILTER_CONFIGS, ACCOUNT_SORT_CONFIGS, PAGINATION_CONFIG);
|
|
105
93
|
|
|
106
94
|
const searchKey = `accounts:${JSON.stringify({ where: query.where, orderBy: query.orderBy, first: pagination.pageSize, after: pagination.afterCursor })}`;
|
|
107
95
|
const { data, loading, error } = useCachedAsyncData(
|
|
@@ -139,12 +127,52 @@ export default function AccountSearch() {
|
|
|
139
127
|
<div className="flex flex-col lg:flex-row gap-6">
|
|
140
128
|
{/* Sidebar — Filter Panel */}
|
|
141
129
|
<aside className="w-full lg:w-80 shrink-0">
|
|
142
|
-
<
|
|
143
|
-
configs={filterConfigs}
|
|
130
|
+
<FilterProvider
|
|
144
131
|
filters={filters.active}
|
|
145
132
|
onFilterChange={filters.set}
|
|
133
|
+
onFilterRemove={filters.remove}
|
|
146
134
|
onReset={resetAll}
|
|
147
|
-
|
|
135
|
+
>
|
|
136
|
+
<Card>
|
|
137
|
+
<Collapsible open={filtersOpen} onOpenChange={setFiltersOpen}>
|
|
138
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
139
|
+
<CardTitle className="text-base font-semibold">
|
|
140
|
+
<h2>Filters</h2>
|
|
141
|
+
</CardTitle>
|
|
142
|
+
<div className="flex items-center gap-1">
|
|
143
|
+
<FilterResetButton variant="destructive" size="sm" />
|
|
144
|
+
<CollapsibleTrigger asChild>
|
|
145
|
+
<Button variant="ghost" size="icon">
|
|
146
|
+
<ChevronDown
|
|
147
|
+
className={`h-4 w-4 transition-transform ${filtersOpen ? "" : "-rotate-90"}`}
|
|
148
|
+
/>
|
|
149
|
+
<span className="sr-only">Toggle filters</span>
|
|
150
|
+
</Button>
|
|
151
|
+
</CollapsibleTrigger>
|
|
152
|
+
</div>
|
|
153
|
+
</CardHeader>
|
|
154
|
+
<CollapsibleContent>
|
|
155
|
+
<CardContent className="space-y-4 pt-0">
|
|
156
|
+
<SearchFilter
|
|
157
|
+
field="search"
|
|
158
|
+
label="Search"
|
|
159
|
+
placeholder="Search by name, phone, or industry..."
|
|
160
|
+
/>
|
|
161
|
+
<TextFilter field="Name" label="Account Name" placeholder="Search by name..." />
|
|
162
|
+
<SelectFilter
|
|
163
|
+
field="Industry"
|
|
164
|
+
label="Industry"
|
|
165
|
+
options={industryOptions ?? []}
|
|
166
|
+
/>
|
|
167
|
+
<MultiSelectFilter field="Type" label="Type" options={typeOptions ?? []} />
|
|
168
|
+
<NumericRangeFilter field="AnnualRevenue" label="Annual Revenue" />
|
|
169
|
+
<DateFilter field="CreatedDate" label="Created Date" />
|
|
170
|
+
<DateRangeFilter field="LastModifiedDate" label="Last Modified Date" />
|
|
171
|
+
</CardContent>
|
|
172
|
+
</CollapsibleContent>
|
|
173
|
+
</Collapsible>
|
|
174
|
+
</Card>
|
|
175
|
+
</FilterProvider>
|
|
148
176
|
</aside>
|
|
149
177
|
|
|
150
178
|
{/* Main area — Sort + Results */}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { createContext, useContext, useCallback, type ReactNode } from "react";
|
|
2
|
+
import { Button } from "../../../components/ui/button";
|
|
3
|
+
import type { ActiveFilterValue } from "../utils/filterUtils";
|
|
4
|
+
|
|
5
|
+
interface FilterContextValue {
|
|
6
|
+
filters: ActiveFilterValue[];
|
|
7
|
+
onFilterChange: (field: string, value: ActiveFilterValue | undefined) => void;
|
|
8
|
+
onFilterRemove: (field: string) => void;
|
|
9
|
+
onReset: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const FilterContext = createContext<FilterContextValue | null>(null);
|
|
13
|
+
|
|
14
|
+
interface FilterProviderProps {
|
|
15
|
+
filters: ActiveFilterValue[];
|
|
16
|
+
onFilterChange: (field: string, value: ActiveFilterValue | undefined) => void;
|
|
17
|
+
onFilterRemove: (field: string) => void;
|
|
18
|
+
onReset: () => void;
|
|
19
|
+
children: ReactNode;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function FilterProvider({
|
|
23
|
+
filters,
|
|
24
|
+
onFilterChange,
|
|
25
|
+
onFilterRemove,
|
|
26
|
+
onReset,
|
|
27
|
+
children,
|
|
28
|
+
}: FilterProviderProps) {
|
|
29
|
+
return (
|
|
30
|
+
<FilterContext.Provider value={{ filters, onFilterChange, onFilterRemove, onReset }}>
|
|
31
|
+
{children}
|
|
32
|
+
</FilterContext.Provider>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function useFilterContext() {
|
|
37
|
+
const ctx = useContext(FilterContext);
|
|
38
|
+
if (!ctx) throw new Error("useFilterField must be used within a FilterProvider");
|
|
39
|
+
return ctx;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function useFilterField(field: string) {
|
|
43
|
+
const { filters, onFilterChange, onFilterRemove } = useFilterContext();
|
|
44
|
+
const value = filters.find((f) => f.field === field);
|
|
45
|
+
const onChange = useCallback(
|
|
46
|
+
(next: ActiveFilterValue | undefined) => {
|
|
47
|
+
if (next) {
|
|
48
|
+
onFilterChange(field, next);
|
|
49
|
+
} else {
|
|
50
|
+
onFilterRemove(field);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
[field, onFilterChange, onFilterRemove],
|
|
54
|
+
);
|
|
55
|
+
return { value, onChange };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function useFilterPanel() {
|
|
59
|
+
const { filters, onReset } = useFilterContext();
|
|
60
|
+
return { hasActiveFilters: filters.length > 0, resetAll: onReset };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface FilterResetButtonProps extends Omit<React.ComponentProps<typeof Button>, "onClick"> {}
|
|
64
|
+
|
|
65
|
+
export function FilterResetButton({ children, ...props }: FilterResetButtonProps) {
|
|
66
|
+
const { hasActiveFilters, resetAll } = useFilterPanel();
|
|
67
|
+
if (!hasActiveFilters) return null;
|
|
68
|
+
return (
|
|
69
|
+
<Button onClick={resetAll} aria-label="Reset filters" variant="destructive" {...props}>
|
|
70
|
+
{children ?? "Reset"}
|
|
71
|
+
</Button>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Pagination,
|
|
3
|
+
PaginationContent,
|
|
4
|
+
PaginationItem,
|
|
5
|
+
PaginationPrevious,
|
|
6
|
+
PaginationNext,
|
|
7
|
+
} from "../../../components/ui/pagination";
|
|
8
|
+
import {
|
|
9
|
+
Select,
|
|
10
|
+
SelectContent,
|
|
11
|
+
SelectItem,
|
|
12
|
+
SelectTrigger,
|
|
13
|
+
SelectValue,
|
|
14
|
+
} from "../../../components/ui/select";
|
|
15
|
+
import { Label } from "../../../components/ui/label";
|
|
16
|
+
|
|
17
|
+
interface PaginationControlsProps {
|
|
18
|
+
pageIndex: number;
|
|
19
|
+
hasNextPage: boolean;
|
|
20
|
+
hasPreviousPage: boolean;
|
|
21
|
+
pageSize: number;
|
|
22
|
+
pageSizeOptions: readonly number[];
|
|
23
|
+
onNextPage: () => void;
|
|
24
|
+
onPreviousPage: () => void;
|
|
25
|
+
onPageSizeChange: (newPageSize: number) => void;
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default function PaginationControls({
|
|
30
|
+
pageIndex,
|
|
31
|
+
hasNextPage,
|
|
32
|
+
hasPreviousPage,
|
|
33
|
+
pageSize,
|
|
34
|
+
pageSizeOptions,
|
|
35
|
+
onNextPage,
|
|
36
|
+
onPreviousPage,
|
|
37
|
+
onPageSizeChange,
|
|
38
|
+
disabled = false,
|
|
39
|
+
}: PaginationControlsProps) {
|
|
40
|
+
const handlePageSizeChange = (newValue: string) => {
|
|
41
|
+
const newSize = parseInt(newValue, 10);
|
|
42
|
+
if (!isNaN(newSize) && newSize !== pageSize) {
|
|
43
|
+
onPageSizeChange(newSize);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const currentPage = pageIndex + 1;
|
|
47
|
+
const prevDisabled = disabled || !hasPreviousPage;
|
|
48
|
+
const nextDisabled = disabled || !hasNextPage;
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<div className="w-full grid grid-cols-1 sm:grid-cols-2 items-center justify-center gap-4 py-2">
|
|
52
|
+
<div
|
|
53
|
+
className="flex justify-center sm:justify-start items-center gap-2 shrink-0 row-2 sm:row-1"
|
|
54
|
+
role="group"
|
|
55
|
+
aria-label="Page size selector"
|
|
56
|
+
>
|
|
57
|
+
<Label htmlFor="page-size-select" className="text-sm font-normal whitespace-nowrap">
|
|
58
|
+
Results per page:
|
|
59
|
+
</Label>
|
|
60
|
+
<Select
|
|
61
|
+
value={pageSize.toString()}
|
|
62
|
+
onValueChange={handlePageSizeChange}
|
|
63
|
+
disabled={disabled}
|
|
64
|
+
>
|
|
65
|
+
<SelectTrigger
|
|
66
|
+
id="page-size-select"
|
|
67
|
+
className="w-16"
|
|
68
|
+
aria-label="Select number of results per page"
|
|
69
|
+
>
|
|
70
|
+
<SelectValue />
|
|
71
|
+
</SelectTrigger>
|
|
72
|
+
<SelectContent>
|
|
73
|
+
{pageSizeOptions.map((size) => (
|
|
74
|
+
<SelectItem key={size} value={size.toString()}>
|
|
75
|
+
{size}
|
|
76
|
+
</SelectItem>
|
|
77
|
+
))}
|
|
78
|
+
</SelectContent>
|
|
79
|
+
</Select>
|
|
80
|
+
</div>
|
|
81
|
+
<Pagination className="w-full mx-0 sm:justify-end">
|
|
82
|
+
<PaginationContent>
|
|
83
|
+
<PaginationItem>
|
|
84
|
+
<PaginationPrevious
|
|
85
|
+
onClick={prevDisabled ? undefined : onPreviousPage}
|
|
86
|
+
aria-disabled={prevDisabled}
|
|
87
|
+
className={prevDisabled ? "pointer-events-none opacity-50" : "cursor-pointer"}
|
|
88
|
+
/>
|
|
89
|
+
</PaginationItem>
|
|
90
|
+
<PaginationItem>
|
|
91
|
+
<span
|
|
92
|
+
className="min-w-16 text-center text-sm text-muted-foreground px-2"
|
|
93
|
+
aria-current="page"
|
|
94
|
+
>
|
|
95
|
+
Page {currentPage}
|
|
96
|
+
</span>
|
|
97
|
+
</PaginationItem>
|
|
98
|
+
<PaginationItem>
|
|
99
|
+
<PaginationNext
|
|
100
|
+
onClick={nextDisabled ? undefined : onNextPage}
|
|
101
|
+
aria-disabled={nextDisabled}
|
|
102
|
+
className={nextDisabled ? "pointer-events-none opacity-50" : "cursor-pointer"}
|
|
103
|
+
/>
|
|
104
|
+
</PaginationItem>
|
|
105
|
+
</PaginationContent>
|
|
106
|
+
</Pagination>
|
|
107
|
+
</div>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
@@ -7,52 +7,31 @@ import {
|
|
|
7
7
|
} from "../../../../components/ui/select";
|
|
8
8
|
import { Label } from "../../../../components/ui/label";
|
|
9
9
|
import { cn } from "../../../../lib/utils";
|
|
10
|
-
import
|
|
10
|
+
import { useFilterField } from "../FilterContext";
|
|
11
|
+
import type { ActiveFilterValue } from "../../utils/filterUtils";
|
|
11
12
|
|
|
12
13
|
const ALL_VALUE = "__all__";
|
|
13
14
|
|
|
14
15
|
interface BooleanFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
labelProps?: React.ComponentProps<typeof Label>;
|
|
19
|
-
controlProps?: Omit<
|
|
20
|
-
React.ComponentProps<typeof BooleanFilterSelect>,
|
|
21
|
-
"config" | "value" | "onChange"
|
|
22
|
-
>;
|
|
23
|
-
helpTextProps?: React.ComponentProps<"p">;
|
|
16
|
+
field: string;
|
|
17
|
+
label: string;
|
|
18
|
+
helpText?: string;
|
|
24
19
|
}
|
|
25
20
|
|
|
26
|
-
export function BooleanFilter({
|
|
27
|
-
|
|
28
|
-
value,
|
|
29
|
-
onChange,
|
|
30
|
-
className,
|
|
31
|
-
labelProps,
|
|
32
|
-
controlProps,
|
|
33
|
-
helpTextProps,
|
|
34
|
-
...props
|
|
35
|
-
}: BooleanFilterProps) {
|
|
21
|
+
export function BooleanFilter({ field, label, helpText, className, ...props }: BooleanFilterProps) {
|
|
22
|
+
const { value, onChange } = useFilterField(field);
|
|
36
23
|
return (
|
|
37
24
|
<div className={cn("space-y-1.5", className)} {...props}>
|
|
38
|
-
<Label htmlFor={`filter-${
|
|
39
|
-
|
|
40
|
-
</
|
|
41
|
-
<BooleanFilterSelect config={config} value={value} onChange={onChange} {...controlProps} />
|
|
42
|
-
{config.helpText && (
|
|
43
|
-
<p
|
|
44
|
-
{...helpTextProps}
|
|
45
|
-
className={cn("text-xs text-muted-foreground", helpTextProps?.className)}
|
|
46
|
-
>
|
|
47
|
-
{helpTextProps?.children ?? config.helpText}
|
|
48
|
-
</p>
|
|
49
|
-
)}
|
|
25
|
+
<Label htmlFor={`filter-${field}`}>{label}</Label>
|
|
26
|
+
<BooleanFilterSelect field={field} label={label} value={value} onChange={onChange} />
|
|
27
|
+
{helpText && <p className="text-xs text-muted-foreground">{helpText}</p>}
|
|
50
28
|
</div>
|
|
51
29
|
);
|
|
52
30
|
}
|
|
53
31
|
|
|
54
32
|
interface BooleanFilterSelectProps {
|
|
55
|
-
|
|
33
|
+
field: string;
|
|
34
|
+
label: string;
|
|
56
35
|
value: ActiveFilterValue | undefined;
|
|
57
36
|
onChange: (value: ActiveFilterValue | undefined) => void;
|
|
58
37
|
triggerProps?: React.ComponentProps<typeof SelectTrigger>;
|
|
@@ -60,7 +39,8 @@ interface BooleanFilterSelectProps {
|
|
|
60
39
|
}
|
|
61
40
|
|
|
62
41
|
export function BooleanFilterSelect({
|
|
63
|
-
|
|
42
|
+
field,
|
|
43
|
+
label,
|
|
64
44
|
value,
|
|
65
45
|
onChange,
|
|
66
46
|
triggerProps,
|
|
@@ -73,12 +53,12 @@ export function BooleanFilterSelect({
|
|
|
73
53
|
if (v === ALL_VALUE) {
|
|
74
54
|
onChange(undefined);
|
|
75
55
|
} else {
|
|
76
|
-
onChange({ field
|
|
56
|
+
onChange({ field, label, type: "boolean", value: v });
|
|
77
57
|
}
|
|
78
58
|
}}
|
|
79
59
|
>
|
|
80
60
|
<SelectTrigger
|
|
81
|
-
id={`filter-${
|
|
61
|
+
id={`filter-${field}`}
|
|
82
62
|
{...triggerProps}
|
|
83
63
|
className={cn("w-full", triggerProps?.className)}
|
|
84
64
|
>
|