@salesforce/templates 66.13.9 → 66.15.0
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/analyticsTemplateGenerator.js +1 -1
- package/lib/generators/analyticsTemplateGenerator.js.map +1 -1
- package/lib/generators/apexClassGenerator.js +1 -1
- package/lib/generators/apexClassGenerator.js.map +1 -1
- package/lib/generators/apexTriggerGenerator.js +1 -1
- package/lib/generators/apexTriggerGenerator.js.map +1 -1
- package/lib/generators/baseGenerator.js +3 -3
- package/lib/generators/baseGenerator.js.map +1 -1
- package/lib/generators/digitalExperienceSiteGenerator.js +2 -2
- package/lib/generators/digitalExperienceSiteGenerator.js.map +1 -1
- package/lib/generators/flexipageGenerator.js +2 -2
- package/lib/generators/flexipageGenerator.js.map +1 -1
- package/lib/generators/lightningAppGenerator.js +1 -1
- package/lib/generators/lightningAppGenerator.js.map +1 -1
- package/lib/generators/lightningComponentGenerator.js +1 -1
- package/lib/generators/lightningComponentGenerator.js.map +1 -1
- package/lib/generators/lightningEventGenerator.js +1 -1
- package/lib/generators/lightningEventGenerator.js.map +1 -1
- package/lib/generators/lightningInterfaceGenerator.js +1 -1
- package/lib/generators/lightningInterfaceGenerator.js.map +1 -1
- package/lib/generators/lightningTestGenerator.js +1 -1
- package/lib/generators/lightningTestGenerator.js.map +1 -1
- package/lib/generators/projectGenerator.js +1 -1
- package/lib/generators/projectGenerator.js.map +1 -1
- package/lib/generators/staticResourceGenerator.js +1 -1
- package/lib/generators/staticResourceGenerator.js.map +1 -1
- package/lib/generators/uiBundleGenerator.js +1 -1
- package/lib/generators/uiBundleGenerator.js.map +1 -1
- package/lib/generators/uiEmbeddingGenerator.js +7 -7
- package/lib/generators/uiEmbeddingGenerator.js.map +1 -1
- package/lib/generators/visualforceComponentGenerator.js +1 -1
- package/lib/generators/visualforceComponentGenerator.js.map +1 -1
- package/lib/generators/visualforcePageGenerator.js +1 -1
- package/lib/generators/visualforcePageGenerator.js.map +1 -1
- package/lib/i18n/i18n.d.ts +2 -2
- package/lib/i18n/i18n.js +2 -2
- package/lib/i18n/i18n.js.map +1 -1
- package/lib/i18n/localization.js +2 -1
- package/lib/i18n/localization.js.map +1 -1
- package/lib/service/gitRepoUtils.js +5 -5
- package/lib/service/gitRepoUtils.js.map +1 -1
- package/lib/templates/project/angularextapp/CHANGELOG.md +429 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +4076 -9105
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package.json +3 -3
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/_f_/_ls_/__examples__/html-middleware-site-example.ts +41 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/_f_/_ls_/__examples__/language-switcher-example.ts +41 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/_f_/_ls_/build-language-url.ts +158 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/_f_/_ls_/index.ts +28 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/_f_/_ls_/language-switcher.html +22 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/_f_/_ls_/language-switcher.ts +110 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/_f_/_ls_/languages.ts +46 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/auth/auth.service.ts +53 -21
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/icon/icon.ts +6 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +14 -0
- package/lib/templates/project/angularextapp/package.json +1 -1
- package/lib/templates/project/angularextapp/scripts/org-setup-config-schema.mjs +14 -2
- package/lib/templates/project/angularextapp/scripts/org-setup-dev.mjs +27 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-url.mjs +108 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-xml.mjs +96 -0
- package/lib/templates/project/angularextapp/scripts/org-setup.mjs +195 -3
- package/lib/templates/project/angularintapp/CHANGELOG.md +429 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +4083 -9112
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +4 -4
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/icon/icon.ts +6 -0
- package/lib/templates/project/angularintapp/package.json +1 -1
- package/lib/templates/project/angularintapp/scripts/org-setup-config-schema.mjs +14 -2
- package/lib/templates/project/angularintapp/scripts/org-setup-dev.mjs +27 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-url.mjs +108 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-xml.mjs +96 -0
- package/lib/templates/project/angularintapp/scripts/org-setup.mjs +195 -3
- package/lib/templates/project/reactexternalapp/CHANGELOG.md +533 -0
- package/lib/templates/project/reactexternalapp/README.md +2 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +888 -640
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package.json +6 -4
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/patches/aria-hidden+1.2.6.patch +45 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Login.tsx +3 -2
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Register.tsx +3 -2
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/searchableContentTypesService.ts +9 -6
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/cmsQueryFragment.ts +14 -3
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/contentTypeUtils.ts +7 -5
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/index.ts +1 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/searchChannel.ts +17 -1
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/types.ts +2 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/MergedSearchResults.tsx +16 -4
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SearchResults.tsx +1 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SourceSection.tsx +27 -4
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/DefaultFilterPanel.tsx +7 -1
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useSearch.ts +12 -7
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/filterUtils.ts +24 -5
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/appLayout.tsx +42 -7
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ObjectBreadcrumb.tsx +1 -5
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/AccountObjectDetailPage.tsx +34 -47
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/Home.tsx +3 -2
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/utils/accountFields.ts +1 -14
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +1 -1
- package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleAuthUtils_Test.cls +141 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleAuthUtils_Test.cls-meta.xml +5 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig.cls +23 -11
- package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig_Test.cls +80 -0
- package/lib/templates/project/reactexternalapp/package.json +1 -1
- package/lib/templates/project/reactexternalapp/scripts/org-setup-config-schema.mjs +14 -2
- package/lib/templates/project/reactexternalapp/scripts/org-setup-dev.mjs +27 -0
- package/lib/templates/project/reactexternalapp/scripts/org-setup-url.mjs +108 -0
- package/lib/templates/project/reactexternalapp/scripts/org-setup-xml.mjs +96 -0
- package/lib/templates/project/reactexternalapp/scripts/org-setup.mjs +195 -3
- package/lib/templates/project/reactinternalapp/CHANGELOG.md +533 -0
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +892 -644
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package.json +7 -5
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/patches/aria-hidden+1.2.6.patch +45 -0
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/searchableContentTypesService.ts +9 -6
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/cmsQueryFragment.ts +14 -3
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/contentTypeUtils.ts +7 -5
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/index.ts +1 -0
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/searchChannel.ts +17 -1
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/types.ts +2 -0
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/MergedSearchResults.tsx +16 -4
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SearchResults.tsx +1 -0
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SourceSection.tsx +27 -4
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/DefaultFilterPanel.tsx +7 -1
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useSearch.ts +12 -7
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/filterUtils.ts +24 -5
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/appLayout.tsx +41 -7
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/ObjectBreadcrumb.tsx +1 -5
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/AccountObjectDetailPage.tsx +40 -50
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/Home.tsx +7 -2
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/utils/accountFields.ts +1 -14
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +1 -1
- package/lib/templates/project/reactinternalapp/package.json +1 -1
- package/lib/templates/project/reactinternalapp/scripts/org-setup-config-schema.mjs +14 -2
- package/lib/templates/project/reactinternalapp/scripts/org-setup-dev.mjs +27 -0
- package/lib/templates/project/reactinternalapp/scripts/org-setup-url.mjs +108 -0
- package/lib/templates/project/reactinternalapp/scripts/org-setup-xml.mjs +96 -0
- package/lib/templates/project/reactinternalapp/scripts/org-setup.mjs +195 -3
- package/lib/templates/uiBundles/angularbasic/package-lock.json +4076 -9105
- package/lib/templates/uiBundles/angularbasic/package.json +3 -3
- package/lib/templates/uiBundles/angularbasic/src/app/components/ui/icon/icon.ts +6 -0
- package/lib/templates/uiBundles/reactbasic/package-lock.json +885 -637
- package/lib/templates/uiBundles/reactbasic/package.json +6 -4
- package/lib/templates/uiBundles/reactbasic/patches/aria-hidden+1.2.6.patch +45 -0
- package/lib/templates/uiembedding/default/default.html +1 -1
- package/lib/utils/constants.js +2 -1
- package/lib/utils/constants.js.map +1 -1
- package/lib/utils/createUtil.js +3 -2
- package/lib/utils/createUtil.js.map +1 -1
- package/lib/utils/template-placeholders.d.ts +1 -1
- package/lib/utils/template-placeholders.js +3 -1
- package/lib/utils/template-placeholders.js.map +1 -1
- package/lib/utils/types.d.ts +1 -1
- package/lib/utils/types.js +17 -16
- package/lib/utils/types.js.map +1 -1
- package/lib/utils/uiBundleTemplateUtils.js +4 -4
- package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
- package/package.json +23 -23
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/README.md +0 -246
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/README.md +0 -246
- package/lib/tsconfig.tsbuildinfo +0 -1
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/api/object-search.service.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/breadcrumb/breadcrumb.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/breadcrumb/breadcrumb.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/active-filters.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/active-filters.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/date-filter.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/date-filter.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/date-range-filter.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/date-range-filter.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/filter-field-wrapper.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/filter-field-wrapper.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/multi-select-filter.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/multi-select-filter.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/numeric-range-filter.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/numeric-range-filter.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/search-filter.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/search-filter.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/select-filter.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/select-filter.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/text-filter.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/text-filter.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/object-search-state.service.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/pagination/pagination.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/pagination/pagination.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/search-bar/search-bar.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/search-bar/search-bar.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/sort-control/sort-control.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/sort-control/sort-control.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/debounce.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/field-utils.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/filter-utils.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/index.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/sort-utils.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/auth/auth.guard.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/auth-form/auth-form.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/auth-form/auth-form.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/auth-layout/auth-layout.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/auth-layout/auth-layout.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/card-layout/card-layout.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/card-layout/card-layout.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/config/authentication.config.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/footer-link/footer-link.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/footer-link/footer-link.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/menu/auth-menu/auth-menu.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/menu/auth-menu/auth-menu.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/reactive-form-page.base.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/session/session.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/session/session.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/status-alert/status-alert.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/status-alert/status-alert.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/submit-button/submit-button.html +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/submit-button/submit-button.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/utils/auth-helpers.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/utils/auth-validators.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/utils/helpers.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/utils/session-time-servlet.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/utils/session-timeout.config.ts +0 -0
- /package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/authentication/utils/session-timeout.service.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/api/object-search.service.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/breadcrumb/breadcrumb.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/breadcrumb/breadcrumb.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/active-filters.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/active-filters.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/date-filter.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/date-filter.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/date-range-filter.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/date-range-filter.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/filter-field-wrapper.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/filter-field-wrapper.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/multi-select-filter.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/multi-select-filter.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/numeric-range-filter.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/numeric-range-filter.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/search-filter.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/search-filter.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/select-filter.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/select-filter.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/text-filter.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/filters/text-filter.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/object-search-state.service.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/pagination/pagination.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/pagination/pagination.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/search-bar/search-bar.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/search-bar/search-bar.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/sort-control/sort-control.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/sort-control/sort-control.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/debounce.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/field-utils.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/filter-utils.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/index.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features/object-search → _f_/_os_}/utils/sort-utils.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/agentforce/agentforce-embed.service.ts +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/agentforce/conversation.html +0 -0
- /package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/{features → _f_}/agentforce/conversation.ts +0 -0
package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/AccountObjectDetailPage.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
2
|
import { useParams, useNavigate } from "react-router";
|
|
3
3
|
import { createDataSDK } from "@salesforce/platform-sdk";
|
|
4
4
|
import { AlertCircle, ChevronDown, ChevronRight, FileQuestion } from "lucide-react";
|
|
@@ -6,7 +6,7 @@ import GET_ACCOUNT_DETAIL from "../api/account/query/getAccountDetail.graphql?ra
|
|
|
6
6
|
import { Alert, AlertTitle, AlertDescription } from "../components/ui/alert";
|
|
7
7
|
import { Button } from "../components/ui/button";
|
|
8
8
|
import { Card, CardContent } from "../components/ui/card";
|
|
9
|
-
import { fieldValue, getAddressFieldLines
|
|
9
|
+
import { fieldValue, getAddressFieldLines } from "../utils/accountFields";
|
|
10
10
|
import {
|
|
11
11
|
Collapsible,
|
|
12
12
|
CollapsibleTrigger,
|
|
@@ -15,13 +15,8 @@ import {
|
|
|
15
15
|
import { Separator } from "../components/ui/separator";
|
|
16
16
|
import { Skeleton } from "../components/ui/skeleton";
|
|
17
17
|
import { useAsyncData } from "../hooks/useAsyncData";
|
|
18
|
-
import { ObjectBreadcrumb } from "../components/ObjectBreadcrumb";
|
|
19
18
|
|
|
20
|
-
/**
|
|
21
|
-
* A uiapi scalar field as returned with `@optional { value displayValue }`.
|
|
22
|
-
* Typed locally so this page no longer depends on the generated
|
|
23
|
-
* `graphql-operations-types` that shipped with feature-react-object-search.
|
|
24
|
-
*/
|
|
19
|
+
/** A uiapi scalar field as returned with `@optional { value displayValue }`. Typed locally to avoid a generated-types dependency. */
|
|
25
20
|
type FieldValue = { value?: unknown; displayValue?: string | null } | null;
|
|
26
21
|
type NameHolder = { Name?: FieldValue } | null;
|
|
27
22
|
|
|
@@ -88,23 +83,20 @@ export default function AccountObjectDetail() {
|
|
|
88
83
|
error,
|
|
89
84
|
} = useAsyncData(() => fetchAccountDetail(recordId!), [recordId]);
|
|
90
85
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
: loading
|
|
103
|
-
? undefined
|
|
104
|
-
: "Not Found"
|
|
105
|
-
}
|
|
106
|
-
/>
|
|
86
|
+
const pageTitle = loading
|
|
87
|
+
? "Loading Account | MyApp"
|
|
88
|
+
: error
|
|
89
|
+
? "Error | MyApp"
|
|
90
|
+
: account
|
|
91
|
+
? `${fieldValue(account.Name) ?? "Account"} | MyApp`
|
|
92
|
+
: "Account Not Found | MyApp";
|
|
93
|
+
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
document.title = pageTitle;
|
|
96
|
+
}, [pageTitle]);
|
|
107
97
|
|
|
98
|
+
return (
|
|
99
|
+
<main className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
|
108
100
|
{/* Loading state */}
|
|
109
101
|
{loading && <AccountDetailSkeleton />}
|
|
110
102
|
|
|
@@ -115,8 +107,8 @@ export default function AccountObjectDetail() {
|
|
|
115
107
|
{!loading && !error && !account && <AccountDetailNotFound onBack={() => navigate(-1)} />}
|
|
116
108
|
|
|
117
109
|
{/* Content */}
|
|
118
|
-
{account && <AccountDetailContent account={account} />}
|
|
119
|
-
</
|
|
110
|
+
{!loading && !error && account && <AccountDetailContent account={account} />}
|
|
111
|
+
</main>
|
|
120
112
|
);
|
|
121
113
|
}
|
|
122
114
|
|
|
@@ -137,17 +129,8 @@ function AccountDetailContent({ account }: { account: AccountNode }) {
|
|
|
137
129
|
country: fieldValue(account.ShippingCountry),
|
|
138
130
|
});
|
|
139
131
|
|
|
140
|
-
const
|
|
141
|
-
const
|
|
142
|
-
fieldValue(account.CreatedDate),
|
|
143
|
-
undefined,
|
|
144
|
-
dateTimeOptions,
|
|
145
|
-
);
|
|
146
|
-
const lastModifiedDate = formatDateTimeField(
|
|
147
|
-
fieldValue(account.LastModifiedDate),
|
|
148
|
-
undefined,
|
|
149
|
-
dateTimeOptions,
|
|
150
|
-
);
|
|
132
|
+
const createdDate = fieldValue(account.CreatedDate);
|
|
133
|
+
const lastModifiedDate = fieldValue(account.LastModifiedDate);
|
|
151
134
|
|
|
152
135
|
return (
|
|
153
136
|
<>
|
|
@@ -258,10 +241,16 @@ function Section({ title, children }: { title: string; children: React.ReactNode
|
|
|
258
241
|
const [open, setOpen] = useState(true);
|
|
259
242
|
return (
|
|
260
243
|
<Collapsible open={open} onOpenChange={setOpen}>
|
|
261
|
-
<
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
244
|
+
<h2>
|
|
245
|
+
<CollapsibleTrigger className="flex items-center gap-2 cursor-pointer text-lg font-semibold py-2">
|
|
246
|
+
{open ? (
|
|
247
|
+
<ChevronDown aria-hidden="true" className="size-5" />
|
|
248
|
+
) : (
|
|
249
|
+
<ChevronRight aria-hidden="true" className="size-5" />
|
|
250
|
+
)}
|
|
251
|
+
{title}
|
|
252
|
+
</CollapsibleTrigger>
|
|
253
|
+
</h2>
|
|
265
254
|
<CollapsibleContent>
|
|
266
255
|
<div className="mt-2 space-y-4">{children}</div>
|
|
267
256
|
</CollapsibleContent>
|
|
@@ -273,9 +262,9 @@ function AccountDetailError({ onBack }: { onBack: () => void }) {
|
|
|
273
262
|
return (
|
|
274
263
|
<>
|
|
275
264
|
<Alert variant="destructive" role="alert">
|
|
276
|
-
<AlertCircle />
|
|
265
|
+
<AlertCircle aria-hidden="true" />
|
|
277
266
|
<AlertTitle>
|
|
278
|
-
<
|
|
267
|
+
<h1>Failed to load account</h1>
|
|
279
268
|
</AlertTitle>
|
|
280
269
|
<AlertDescription>
|
|
281
270
|
Something went wrong while loading this account. Please try again later.
|
|
@@ -283,7 +272,7 @@ function AccountDetailError({ onBack }: { onBack: () => void }) {
|
|
|
283
272
|
</Alert>
|
|
284
273
|
<div className="mt-4 flex gap-3">
|
|
285
274
|
<Button variant="outline" onClick={onBack}>
|
|
286
|
-
|
|
275
|
+
<span aria-hidden="true">←</span> Back
|
|
287
276
|
</Button>
|
|
288
277
|
<Button variant="outline" onClick={() => window.location.reload()}>
|
|
289
278
|
Retry
|
|
@@ -295,15 +284,15 @@ function AccountDetailError({ onBack }: { onBack: () => void }) {
|
|
|
295
284
|
|
|
296
285
|
function AccountDetailNotFound({ onBack }: { onBack: () => void }) {
|
|
297
286
|
return (
|
|
298
|
-
<Card>
|
|
287
|
+
<Card role="status">
|
|
299
288
|
<CardContent className="flex flex-col items-center justify-center py-16 text-center">
|
|
300
|
-
<FileQuestion className="size-12 text-muted-foreground mb-4" />
|
|
301
|
-
<
|
|
289
|
+
<FileQuestion aria-hidden="true" className="size-12 text-muted-foreground mb-4" />
|
|
290
|
+
<h1 className="text-lg font-semibold mb-1">Account not found</h1>
|
|
302
291
|
<p className="text-sm text-muted-foreground mb-6">
|
|
303
292
|
The account you're looking for doesn't exist or may have been deleted.
|
|
304
293
|
</p>
|
|
305
294
|
<Button variant="outline" onClick={onBack}>
|
|
306
|
-
|
|
295
|
+
<span aria-hidden="true">←</span> Go back
|
|
307
296
|
</Button>
|
|
308
297
|
</CardContent>
|
|
309
298
|
</Card>
|
|
@@ -312,7 +301,8 @@ function AccountDetailNotFound({ onBack }: { onBack: () => void }) {
|
|
|
312
301
|
|
|
313
302
|
function AccountDetailSkeleton() {
|
|
314
303
|
return (
|
|
315
|
-
|
|
304
|
+
<div role="status" aria-live="polite">
|
|
305
|
+
<span className="sr-only">Loading account…</span>
|
|
316
306
|
<Skeleton className="h-8 w-56 mb-4" />
|
|
317
307
|
|
|
318
308
|
<Card>
|
|
@@ -361,7 +351,7 @@ function AccountDetailSkeleton() {
|
|
|
361
351
|
</div>
|
|
362
352
|
</CardContent>
|
|
363
353
|
</Card>
|
|
364
|
-
|
|
354
|
+
</div>
|
|
365
355
|
);
|
|
366
356
|
}
|
|
367
357
|
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
1
2
|
import { GlobalSearchBox } from "../features/search";
|
|
2
3
|
|
|
3
4
|
export default function HomePage() {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
document.title = "Home | MyApp";
|
|
7
|
+
}, []);
|
|
8
|
+
|
|
4
9
|
return (
|
|
5
|
-
<
|
|
10
|
+
<main className="max-w-2xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
|
6
11
|
<h1 className="text-2xl font-bold mb-6">Home</h1>
|
|
7
12
|
<GlobalSearchBox placeholder="Search accounts, contacts, opportunities..." />
|
|
8
|
-
</
|
|
13
|
+
</main>
|
|
9
14
|
);
|
|
10
15
|
}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Field helpers for reading uiapi GraphQL response nodes on the Account
|
|
3
|
-
* detail page. Previously imported from feature-react-object-search; inlined
|
|
4
|
-
* here so the app no longer depends on that feature.
|
|
5
|
-
*/
|
|
1
|
+
/** Field helpers for reading uiapi GraphQL response nodes: values arrive as `{ value, displayValue }` objects, so callers need one place to unwrap them. */
|
|
6
2
|
|
|
7
3
|
/** Picks the user-facing string for a `{ value, displayValue }` field. */
|
|
8
4
|
export function fieldValue(
|
|
@@ -27,12 +23,3 @@ export function getAddressFieldLines(address: {
|
|
|
27
23
|
if (lines.length === 0) return null;
|
|
28
24
|
return lines;
|
|
29
25
|
}
|
|
30
|
-
|
|
31
|
-
/** Formats an ISO datetime string with `toLocaleString`, or null if absent. */
|
|
32
|
-
export function formatDateTimeField(
|
|
33
|
-
value?: string | null,
|
|
34
|
-
...args: Parameters<Date["toLocaleString"]>
|
|
35
|
-
) {
|
|
36
|
-
if (!value) return null;
|
|
37
|
-
return new Date(value).toLocaleString(...args);
|
|
38
|
-
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/app.tsx","./src/appLayout.tsx","./src/index.ts","./src/navigationMenu.tsx","./src/router-utils.tsx","./src/routes.tsx","./src/api/graphqlClient.ts","./src/components/AgentforceConversationClient.tsx","./src/components/ObjectBreadcrumb.tsx","./src/components/__inherit_AgentforceConversationClient.tsx","./src/components/alerts/status-alert.tsx","./src/components/layouts/card-layout.tsx","./src/components/ui/alert.tsx","./src/components/ui/avatar.tsx","./src/components/ui/badge.tsx","./src/components/ui/breadcrumb.tsx","./src/components/ui/button.tsx","./src/components/ui/calendar.tsx","./src/components/ui/card.tsx","./src/components/ui/checkbox.tsx","./src/components/ui/collapsible.tsx","./src/components/ui/datePicker.tsx","./src/components/ui/dialog.tsx","./src/components/ui/dropdown-menu.tsx","./src/components/ui/field.tsx","./src/components/ui/index.ts","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/components/ui/pagination.tsx","./src/components/ui/popover.tsx","./src/components/ui/select.tsx","./src/components/ui/separator.tsx","./src/components/ui/skeleton.tsx","./src/components/ui/sonner.tsx","./src/components/ui/spinner.tsx","./src/components/ui/table.tsx","./src/components/ui/tabs.tsx","./src/features/search/constants.ts","./src/features/search/index.ts","./src/features/search/loadConfig.ts","./src/features/search/queryBuilder.ts","./src/features/search/types.ts","./src/features/search/__tests__/queryBuilder.test.ts","./src/features/search/adapters/registry.ts","./src/features/search/adapters/types.ts","./src/features/search/adapters/cms/channelResolver.ts","./src/features/search/adapters/cms/cmsQueryFragment.ts","./src/features/search/adapters/cms/contentTypeSessionCache.ts","./src/features/search/adapters/cms/contentTypeUtils.ts","./src/features/search/adapters/cms/index.ts","./src/features/search/adapters/cms/parseResponse.ts","./src/features/search/adapters/cms/searchChannel.ts","./src/features/search/adapters/cms/types.ts","./src/features/search/adapters/cms/__tests__/channelResolver.test.ts","./src/features/search/adapters/cms/__tests__/cmsQueryFragment.test.ts","./src/features/search/adapters/cms/__tests__/contentTypeSessionCache.test.ts","./src/features/search/adapters/cms/__tests__/contentTypeUtils.test.ts","./src/features/search/adapters/cms/__tests__/orgApiVersionService.test.ts","./src/features/search/adapters/cms/__tests__/parseResponse.test.ts","./src/features/search/adapters/cms/__tests__/searchChannel.test.ts","./src/features/search/adapters/cms/__tests__/searchableContentTypesService.test.ts","./src/features/search/adapters/cms/api/apiUtils.ts","./src/features/search/adapters/cms/api/orgApiVersionService.ts","./src/features/search/adapters/cms/api/searchableContentTypesService.ts","./src/features/search/adapters/cms/hooks/useSearchableContentTypes.ts","./src/features/search/adapters/sobject/index.ts","./src/features/search/adapters/sobject/parseResponse.ts","./src/features/search/adapters/sobject/queryFragment.ts","./src/features/search/api/distinctValuesService.ts","./src/features/search/api/searchService.ts","./src/features/search/api/__tests__/searchService.test.ts","./src/features/search/components/GlobalSearchBox.tsx","./src/features/search/components/MergedSearchResults.tsx","./src/features/search/components/Search.tsx","./src/features/search/components/SearchResults.tsx","./src/features/search/components/SourceSection.tsx","./src/features/search/components/__tests__/Search.test.tsx","./src/features/search/components/controls/PaginationControls.tsx","./src/features/search/components/controls/ScopeSelector.tsx","./src/features/search/components/controls/SearchBar.tsx","./src/features/search/components/controls/SortControl.tsx","./src/features/search/components/filters/ActiveFilters.tsx","./src/features/search/components/filters/DefaultFilterPanel.tsx","./src/features/search/components/filters/FilterContext.tsx","./src/features/search/components/filters/inputs/BooleanFilter.tsx","./src/features/search/components/filters/inputs/DateRangeFilter.tsx","./src/features/search/components/filters/inputs/FilterFieldWrapper.tsx","./src/features/search/components/filters/inputs/MultiSelectFilter.tsx","./src/features/search/components/filters/inputs/NumericRangeFilter.tsx","./src/features/search/components/filters/inputs/SelectFilter.tsx","./src/features/search/components/filters/inputs/TextFilter.tsx","./src/features/search/components/results/CmsResultRow.tsx","./src/features/search/components/results/DefaultResultRow.tsx","./src/features/search/components/results/resolveResultRenderer.ts","./src/features/search/components/results/__tests__/CmsResultRow.test.tsx","./src/features/search/components/results/__tests__/resolveResultRenderer.test.ts","./src/features/search/hooks/useAsyncData.ts","./src/features/search/hooks/useDistinctValues.ts","./src/features/search/hooks/useSearch.ts","./src/features/search/utils/debounce.ts","./src/features/search/utils/fieldUtils.ts","./src/features/search/utils/filterUtils.ts","./src/features/search/utils/sortUtils.ts","./src/hooks/useAsyncData.ts","./src/lib/utils.ts","./src/pages/AccountObjectDetailPage.tsx","./src/pages/Home.tsx","./src/pages/NotFound.tsx","./src/types/conversation.ts","./src/types/globals.d.ts","./src/utils/accountFields.ts","./e2e/app.spec.ts","./vite-env.d.ts","./vitest-env.d.ts","./vitest.setup.ts","../../../../../../../../../sdk/platform-sdk/types/env.d.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["./src/app.tsx","./src/appLayout.tsx","./src/index.ts","./src/navigationMenu.tsx","./src/router-utils.tsx","./src/routes.tsx","./src/api/graphqlClient.ts","./src/components/AgentforceConversationClient.tsx","./src/components/ObjectBreadcrumb.tsx","./src/components/__inherit_AgentforceConversationClient.tsx","./src/components/alerts/status-alert.tsx","./src/components/layouts/card-layout.tsx","./src/components/ui/alert.tsx","./src/components/ui/avatar.tsx","./src/components/ui/badge.tsx","./src/components/ui/breadcrumb.tsx","./src/components/ui/button.tsx","./src/components/ui/calendar.tsx","./src/components/ui/card.tsx","./src/components/ui/checkbox.tsx","./src/components/ui/collapsible.tsx","./src/components/ui/datePicker.tsx","./src/components/ui/dialog.tsx","./src/components/ui/dropdown-menu.tsx","./src/components/ui/field.tsx","./src/components/ui/index.ts","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/components/ui/pagination.tsx","./src/components/ui/popover.tsx","./src/components/ui/select.tsx","./src/components/ui/separator.tsx","./src/components/ui/skeleton.tsx","./src/components/ui/sonner.tsx","./src/components/ui/spinner.tsx","./src/components/ui/table.tsx","./src/components/ui/tabs.tsx","./src/features/search/constants.ts","./src/features/search/index.ts","./src/features/search/loadConfig.ts","./src/features/search/queryBuilder.ts","./src/features/search/types.ts","./src/features/search/__tests__/queryBuilder.test.ts","./src/features/search/adapters/registry.ts","./src/features/search/adapters/types.ts","./src/features/search/adapters/cms/channelResolver.ts","./src/features/search/adapters/cms/cmsQueryFragment.ts","./src/features/search/adapters/cms/contentTypeSessionCache.ts","./src/features/search/adapters/cms/contentTypeUtils.ts","./src/features/search/adapters/cms/index.ts","./src/features/search/adapters/cms/parseResponse.ts","./src/features/search/adapters/cms/searchChannel.ts","./src/features/search/adapters/cms/types.ts","./src/features/search/adapters/cms/__tests__/channelResolver.test.ts","./src/features/search/adapters/cms/__tests__/cmsQueryFragment.test.ts","./src/features/search/adapters/cms/__tests__/contentTypeSessionCache.test.ts","./src/features/search/adapters/cms/__tests__/contentTypeUtils.test.ts","./src/features/search/adapters/cms/__tests__/orgApiVersionService.test.ts","./src/features/search/adapters/cms/__tests__/parseResponse.test.ts","./src/features/search/adapters/cms/__tests__/searchChannel.test.ts","./src/features/search/adapters/cms/__tests__/searchableContentTypesService.test.ts","./src/features/search/adapters/cms/api/apiUtils.ts","./src/features/search/adapters/cms/api/orgApiVersionService.ts","./src/features/search/adapters/cms/api/searchableContentTypesService.ts","./src/features/search/adapters/cms/hooks/useSearchableContentTypes.ts","./src/features/search/adapters/sobject/index.ts","./src/features/search/adapters/sobject/parseResponse.ts","./src/features/search/adapters/sobject/queryFragment.ts","./src/features/search/api/distinctValuesService.ts","./src/features/search/api/searchService.ts","./src/features/search/api/__tests__/searchService.test.ts","./src/features/search/components/GlobalSearchBox.tsx","./src/features/search/components/MergedSearchResults.tsx","./src/features/search/components/Search.tsx","./src/features/search/components/SearchResults.tsx","./src/features/search/components/SourceSection.tsx","./src/features/search/components/__tests__/MergedSearchResults.test.tsx","./src/features/search/components/__tests__/Search.test.tsx","./src/features/search/components/__tests__/SourceSection.test.tsx","./src/features/search/components/controls/PaginationControls.tsx","./src/features/search/components/controls/ScopeSelector.tsx","./src/features/search/components/controls/SearchBar.tsx","./src/features/search/components/controls/SortControl.tsx","./src/features/search/components/filters/ActiveFilters.tsx","./src/features/search/components/filters/DefaultFilterPanel.tsx","./src/features/search/components/filters/FilterContext.tsx","./src/features/search/components/filters/inputs/BooleanFilter.tsx","./src/features/search/components/filters/inputs/DateRangeFilter.tsx","./src/features/search/components/filters/inputs/FilterFieldWrapper.tsx","./src/features/search/components/filters/inputs/MultiSelectFilter.tsx","./src/features/search/components/filters/inputs/NumericRangeFilter.tsx","./src/features/search/components/filters/inputs/SelectFilter.tsx","./src/features/search/components/filters/inputs/TextFilter.tsx","./src/features/search/components/results/CmsResultRow.tsx","./src/features/search/components/results/DefaultResultRow.tsx","./src/features/search/components/results/resolveResultRenderer.ts","./src/features/search/components/results/__tests__/CmsResultRow.test.tsx","./src/features/search/components/results/__tests__/resolveResultRenderer.test.ts","./src/features/search/hooks/useAsyncData.ts","./src/features/search/hooks/useDistinctValues.ts","./src/features/search/hooks/useSearch.ts","./src/features/search/utils/debounce.ts","./src/features/search/utils/fieldUtils.ts","./src/features/search/utils/filterUtils.ts","./src/features/search/utils/sortUtils.ts","./src/features/search/utils/__tests__/filterUtils.test.ts","./src/hooks/useAsyncData.ts","./src/lib/utils.ts","./src/pages/AccountObjectDetailPage.tsx","./src/pages/Home.tsx","./src/pages/NotFound.tsx","./src/types/conversation.ts","./src/types/globals.d.ts","./src/utils/accountFields.ts","./src/utils/__tests__/accountFields.test.ts","./e2e/app.spec.ts","./vite-env.d.ts","./vitest-env.d.ts","./vitest.setup.ts","../../../../../../../../../sdk/platform-sdk/types/env.d.ts"],"version":"5.9.3"}
|
|
@@ -72,13 +72,25 @@ export const ConfigSchema = z
|
|
|
72
72
|
// Required because React (Site Container) sites hide SSO config in Admin UI.
|
|
73
73
|
authProviderNames: z.array(z.string().min(1)).min(1),
|
|
74
74
|
// Permission set to assign to community users created via SSO.
|
|
75
|
-
// Required because getCurrentUser() calls
|
|
76
|
-
// API access (PermissionsApiEnabled) that the community profile lacks.
|
|
75
|
+
// Required because getCurrentUser() calls UI API GraphQL (uiapi.currentUser)
|
|
76
|
+
// which needs API access (PermissionsApiEnabled) that the community profile lacks.
|
|
77
77
|
// Typically the app's "*_Guest_User_Api_Access" permset.
|
|
78
78
|
communityUserPermset: z.string().min(1).optional(),
|
|
79
79
|
})
|
|
80
80
|
.strict()
|
|
81
81
|
.optional(),
|
|
82
|
+
// URL members are redirected to after logging out, written to the site's
|
|
83
|
+
// <logoutUrl> network metadata (a post-deploy step). Steers logout back to THIS
|
|
84
|
+
// site so members aren't dropped on the org default-site login (which, in an
|
|
85
|
+
// org hosting multiple sites, can be a different community). Prefer a
|
|
86
|
+
// site-relative path (e.g. "/myapp/"): it is domain-independent, so the same
|
|
87
|
+
// shipped value is valid on every org. The platform REQUIRES an absolute logout
|
|
88
|
+
// URL, so org-setup resolves a relative path against the site's Experience Cloud
|
|
89
|
+
// origin (discovered from the org at deploy time) before writing it; an
|
|
90
|
+
// already-absolute value is used as-is. Kept a permissive non-empty string (not
|
|
91
|
+
// z.string().url()) so relative paths are valid; character-safety for raw XML
|
|
92
|
+
// interpolation is enforced at write time.
|
|
93
|
+
logoutUrl: z.string().min(1).optional(),
|
|
82
94
|
})
|
|
83
95
|
.strict();
|
|
84
96
|
|
|
@@ -60,6 +60,31 @@ Options:
|
|
|
60
60
|
return { targetOrg, uiBundleName };
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Print a heads-up about auth surfaces that only work on the deployed Experience
|
|
65
|
+
* site. In local preview, `sdk.fetch` is proxied to the org outside the site's
|
|
66
|
+
* guest/community context, so social login and password/MFA login cannot be
|
|
67
|
+
* exercised on localhost. This mirrors the "Local preview limitations" sections
|
|
68
|
+
* in the feature-react-authentication / feature-react-mfa READMEs — surfaced here
|
|
69
|
+
* so it is seen even when the READMEs are not.
|
|
70
|
+
*/
|
|
71
|
+
function printLocalPreviewWarning() {
|
|
72
|
+
console.log(
|
|
73
|
+
[
|
|
74
|
+
'',
|
|
75
|
+
'⚠️ Local preview limitation — some auth surfaces only work on the DEPLOYED site',
|
|
76
|
+
' Local preview proxies sdk.fetch to the org outside the Experience site guest',
|
|
77
|
+
' context (Site.getBaseUrl() is blank, no site session), so on localhost:',
|
|
78
|
+
' • Social Login buttons do not render (/auth/social-login-config returns no providers)',
|
|
79
|
+
' • Password / MFA login fails with "Your login attempt has failed…" (Site.login() cannot',
|
|
80
|
+
' establish the site session)',
|
|
81
|
+
' This is expected, not a misconfiguration. Test social login and MFA on the published',
|
|
82
|
+
' site login page: https://<domain>.site.com/<site-path>/login',
|
|
83
|
+
'',
|
|
84
|
+
].join('\n'),
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
63
88
|
async function main() {
|
|
64
89
|
const parsed = parseArgs();
|
|
65
90
|
|
|
@@ -76,6 +101,8 @@ async function main() {
|
|
|
76
101
|
});
|
|
77
102
|
run('GraphQL codegen', 'npm', ['run', 'graphql:codegen'], { cwd: uiBundleDir });
|
|
78
103
|
|
|
104
|
+
printLocalPreviewWarning();
|
|
105
|
+
|
|
79
106
|
console.log('\n--- Launching dev server (Ctrl+C to stop) ---\n');
|
|
80
107
|
const devResult = run('Dev server', 'npm', ['run', 'dev'], { cwd: uiBundleDir, optional: true });
|
|
81
108
|
process.exit(devResult.status ?? 0);
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure URL helpers for org-setup.mjs logout-URL productization.
|
|
3
|
+
*
|
|
4
|
+
* The platform requires an ABSOLUTE logout URL on Network metadata — a relative
|
|
5
|
+
* value is rejected at deploy time ("The logout page URL must be an absolute
|
|
6
|
+
* URL."). Apps ship a domain-INDEPENDENT, site-relative path in
|
|
7
|
+
* org-setup.config.json (so the same value is valid on every org the app deploys
|
|
8
|
+
* to); these helpers resolve it to an absolute URL at deploy time, against the
|
|
9
|
+
* site's Experience Cloud origin discovered from the target org's communities.
|
|
10
|
+
*
|
|
11
|
+
* Pure (no fs / no process / no network): org-setup.mjs fetches the community list
|
|
12
|
+
* (Connect API) and owns the fail modes; these helpers only classify + resolve
|
|
13
|
+
* strings, so they carry automated coverage in the consuming test package
|
|
14
|
+
* (org-setup-tests/test/org-setup-url.spec.ts). Companion to org-setup-xml.mjs.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** True when `value` is an absolute http(s) URL — already deployable as-is. */
|
|
18
|
+
export function isAbsoluteLogoutUrl(value) {
|
|
19
|
+
return /^https?:\/\//i.test(String(value).trim());
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Leading path segment of a URL or path:
|
|
24
|
+
* "/propertyrentalapp/" -> "propertyrentalapp"
|
|
25
|
+
* "https://h.site.com/propertyrentalapp" -> "propertyrentalapp"
|
|
26
|
+
* "/" -> ""
|
|
27
|
+
*/
|
|
28
|
+
export function firstPathSegment(pathOrUrl) {
|
|
29
|
+
let pathname;
|
|
30
|
+
try {
|
|
31
|
+
pathname = new URL(pathOrUrl).pathname; // absolute URL
|
|
32
|
+
} catch {
|
|
33
|
+
pathname = String(pathOrUrl).split(/[?#]/)[0]; // relative path
|
|
34
|
+
}
|
|
35
|
+
return pathname.replace(/^\/+/, '').split('/')[0];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Choose the Experience Cloud community whose site URL should anchor a relative
|
|
40
|
+
* logout path, and return its siteUrl (or null when none matches).
|
|
41
|
+
*
|
|
42
|
+
* Matches on the community's siteUrl PATH first — robust even when a community's
|
|
43
|
+
* `urlPathPrefix` differs from its public path (e.g. a React "site container" site
|
|
44
|
+
* whose companion ChatterNetwork carries a "…vforcesite" prefix), and correct on
|
|
45
|
+
* custom domains where each site can have its own origin. Falls back to a
|
|
46
|
+
* community whose `name` equals the derived site name. Does NOT fall back to an
|
|
47
|
+
* arbitrary community: resolving against the wrong origin would silently produce a
|
|
48
|
+
* valid-but-wrong absolute URL, so an unmatched relative path is left for the
|
|
49
|
+
* caller to surface loudly.
|
|
50
|
+
*
|
|
51
|
+
* @param {Array<{name?: string, siteUrl?: string}>} communities
|
|
52
|
+
* @param {string} configLogoutUrl the site-relative path being resolved
|
|
53
|
+
* @param {string} [siteName]
|
|
54
|
+
* @returns {string|null} the matched community siteUrl
|
|
55
|
+
*/
|
|
56
|
+
export function pickCommunityBaseUrl(communities, configLogoutUrl, siteName) {
|
|
57
|
+
const list = Array.isArray(communities) ? communities.filter((c) => c && c.siteUrl) : [];
|
|
58
|
+
const seg = firstPathSegment(configLogoutUrl);
|
|
59
|
+
|
|
60
|
+
if (seg) {
|
|
61
|
+
const byPath = list.find((c) => firstPathSegment(c.siteUrl) === seg);
|
|
62
|
+
if (byPath) return byPath.siteUrl;
|
|
63
|
+
}
|
|
64
|
+
if (siteName) {
|
|
65
|
+
const byName = list.find((c) => c.name === siteName);
|
|
66
|
+
if (byName) return byName.siteUrl;
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Resolve a shipped logout-URL config value to an absolute URL.
|
|
73
|
+
* - already absolute -> returned unchanged (trimmed).
|
|
74
|
+
* - site-relative path -> resolved against `baseUrl` (a community siteUrl).
|
|
75
|
+
* Because the config path is root-relative ("/app/"), only baseUrl's ORIGIN is
|
|
76
|
+
* used, so any siteUrl on the same Experience Cloud domain yields the same
|
|
77
|
+
* result.
|
|
78
|
+
*
|
|
79
|
+
* Throws when a relative value has no baseUrl to resolve against, or when
|
|
80
|
+
* resolution fails to produce an absolute http(s) URL.
|
|
81
|
+
*
|
|
82
|
+
* @param {string} configLogoutUrl
|
|
83
|
+
* @param {string|null} baseUrl
|
|
84
|
+
* @returns {string} an absolute URL
|
|
85
|
+
*/
|
|
86
|
+
export function resolveLogoutUrl(configLogoutUrl, baseUrl) {
|
|
87
|
+
const value = String(configLogoutUrl).trim();
|
|
88
|
+
if (isAbsoluteLogoutUrl(value)) return value;
|
|
89
|
+
|
|
90
|
+
if (!baseUrl) {
|
|
91
|
+
throw new Error(
|
|
92
|
+
`logout URL "${configLogoutUrl}" is site-relative but no Experience Cloud ` +
|
|
93
|
+
`community site URL was found to resolve it into an absolute URL`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
let resolved;
|
|
97
|
+
try {
|
|
98
|
+
resolved = new URL(value, baseUrl).href;
|
|
99
|
+
} catch (e) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`could not resolve logout URL "${configLogoutUrl}" against "${baseUrl}": ${e.message}`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
if (!isAbsoluteLogoutUrl(resolved)) {
|
|
105
|
+
throw new Error(`resolved logout URL "${resolved}" is not an absolute http(s) URL`);
|
|
106
|
+
}
|
|
107
|
+
return resolved;
|
|
108
|
+
}
|
|
@@ -180,3 +180,99 @@ export function enableSelfRegInXml(xml, selfRegProfile) {
|
|
|
180
180
|
);
|
|
181
181
|
return { xml: updated, changed: true };
|
|
182
182
|
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Indentation of the first indented child element, so an inserted node matches
|
|
186
|
+
* the file's own formatting — byte-faithful on 2-space and 4-space files alike.
|
|
187
|
+
* Falls back to 4 spaces when the document has no indented child to sample.
|
|
188
|
+
*/
|
|
189
|
+
function firstChildIndent(xml) {
|
|
190
|
+
const m = xml.match(/\n([ \t]+)</);
|
|
191
|
+
return m ? m[1] : ' ';
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Assert a logout URL is safe to interpolate into the network metadata as-is.
|
|
196
|
+
*
|
|
197
|
+
* Mirrors assertSafeProfileName: the value is developer-authored config, so a
|
|
198
|
+
* character that would need XML entity-escaping (& < > " ') signals a mistake to
|
|
199
|
+
* surface loudly rather than silently rewrite. A logout landing URL is a site
|
|
200
|
+
* home path/URL and legitimately needs none of these. Throws NetworkXmlError
|
|
201
|
+
* (mapped by callers to their fail mode) otherwise.
|
|
202
|
+
*/
|
|
203
|
+
export function assertSafeLogoutUrl(url) {
|
|
204
|
+
const s = String(url);
|
|
205
|
+
if (XML_SPECIAL_CHARS.test(s)) {
|
|
206
|
+
throw new NetworkXmlError(
|
|
207
|
+
`logoutUrl "${url}" contains an XML-special character (& < > " '); ` +
|
|
208
|
+
`use a URL without these characters in org-setup.config.json`,
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
return s;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Set <logoutUrl> so members land on THIS site after logging out, instead of the
|
|
216
|
+
* org's default-site logout — which, in an org hosting multiple Experience Cloud
|
|
217
|
+
* sites, can drop a member on a different community's login page.
|
|
218
|
+
*
|
|
219
|
+
* `url` MUST already be an absolute URL: the platform rejects a relative value at
|
|
220
|
+
* deploy time ("The logout page URL must be an absolute URL."). A shipped
|
|
221
|
+
* site-relative config path is resolved to an absolute URL before this is called
|
|
222
|
+
* (see org-setup-url.mjs, driven by ensureLogoutUrl in org-setup.mjs).
|
|
223
|
+
*
|
|
224
|
+
* Asserts this is a Network document (throws NetworkXmlError otherwise). Returns
|
|
225
|
+
* `{ xml, changed }`:
|
|
226
|
+
* - `changed: false` (input returned unchanged) when <logoutUrl> already equals
|
|
227
|
+
* `url` — a configured re-run is a true byte-for-byte no-op.
|
|
228
|
+
* - present-but-different: the value is replaced in place (position preserved).
|
|
229
|
+
* - absent: a <logoutUrl> node is inserted in the CANONICAL position the Metadata
|
|
230
|
+
* API emits. Network's top-level elements serialize in alphabetical order, so
|
|
231
|
+
* the node is placed immediately before the first existing sibling that sorts
|
|
232
|
+
* after "logoutUrl" (or as the last child, before </Network>, when none does).
|
|
233
|
+
* Inserting where a later retrieve would place it keeps this org-deployed file
|
|
234
|
+
* free of reorder churn. The node adopts the file's own indentation and every
|
|
235
|
+
* untouched region is preserved byte-for-byte.
|
|
236
|
+
*
|
|
237
|
+
* Assumes an existing <logoutUrl> is a paired, non-empty node (the shipped sparse
|
|
238
|
+
* network omits it entirely; a deployed org carries a paired value) — the case
|
|
239
|
+
* this productizes.
|
|
240
|
+
*/
|
|
241
|
+
export function setLogoutUrl(xml, url) {
|
|
242
|
+
const network = parseNetwork(xml);
|
|
243
|
+
// Reject XML-special characters rather than escaping them (see
|
|
244
|
+
// assertSafeLogoutUrl) before interpolating raw.
|
|
245
|
+
const safeUrl = assertSafeLogoutUrl(url);
|
|
246
|
+
const current = 'logoutUrl' in network ? String(network.logoutUrl) : null;
|
|
247
|
+
if (current === safeUrl) {
|
|
248
|
+
return { xml, changed: false };
|
|
249
|
+
}
|
|
250
|
+
const node = `<logoutUrl>${safeUrl}</logoutUrl>`;
|
|
251
|
+
// Present-but-different — replace the value in place (preserves position).
|
|
252
|
+
if (/<logoutUrl>[^<]*<\/logoutUrl>/.test(xml)) {
|
|
253
|
+
return { xml: xml.replace(/<logoutUrl>[^<]*<\/logoutUrl>/, node), changed: true };
|
|
254
|
+
}
|
|
255
|
+
// Absent — insert in alphabetical order among the Network's top-level children to
|
|
256
|
+
// match the canonical Metadata API serialization. parseNetwork's keys are the
|
|
257
|
+
// direct child element names; drop fast-xml-parser's attribute (@_*) and text
|
|
258
|
+
// (#*) pseudo-keys.
|
|
259
|
+
const siblings = Object.keys(network).filter((k) => !k.startsWith('@_') && !k.startsWith('#'));
|
|
260
|
+
// The first sibling that sorts AFTER "logoutUrl" — the node goes just before it.
|
|
261
|
+
const successor = siblings.filter((name) => name > 'logoutUrl').sort()[0];
|
|
262
|
+
if (successor) {
|
|
263
|
+
const beforeSuccessor = new RegExp(`(\\n[ \\t]*)(<${successor}\\b)`);
|
|
264
|
+
if (beforeSuccessor.test(xml)) {
|
|
265
|
+
// Reuse the successor's own leading whitespace so the node adopts its indent.
|
|
266
|
+
return { xml: xml.replace(beforeSuccessor, `$1${node}$1$2`), changed: true };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// No later-sorting sibling (or its tag wasn't found) — insert as the last child,
|
|
270
|
+
// right before </Network>, at the file's own indent.
|
|
271
|
+
const indent = firstChildIndent(xml);
|
|
272
|
+
const beforeClose = /(\n)([ \t]*<\/Network>)/;
|
|
273
|
+
if (beforeClose.test(xml)) {
|
|
274
|
+
return { xml: xml.replace(beforeClose, `\n${indent}${node}$1$2`), changed: true };
|
|
275
|
+
}
|
|
276
|
+
// Degenerate single-line / rootless form — fall back to just after the open tag.
|
|
277
|
+
return { xml: xml.replace(/(<Network\b[^>]*>)/, `$1\n${indent}${node}`), changed: true };
|
|
278
|
+
}
|