@salesforce/templates 66.11.1 → 66.13.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/projectGenerator.js +4 -1
- package/lib/generators/projectGenerator.js.map +1 -1
- package/lib/generators/uiEmbeddingGenerator.d.ts +6 -0
- package/lib/generators/{lightningEmbeddingGenerator.js → uiEmbeddingGenerator.js} +12 -12
- package/lib/generators/uiEmbeddingGenerator.js.map +1 -0
- package/lib/i18n/i18n.d.ts +6 -6
- package/lib/i18n/i18n.js +6 -6
- package/lib/i18n/i18n.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/templates/project/angularextapp/.forceignore +15 -0
- package/lib/templates/project/angularextapp/.husky/pre-commit +4 -0
- package/lib/templates/project/angularextapp/.prettierignore +11 -0
- package/lib/templates/project/angularextapp/.prettierrc +17 -0
- package/lib/templates/project/angularextapp/CHANGELOG.md +4086 -0
- package/lib/templates/project/angularextapp/README.md +77 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/angularextapp1.digitalExperience-meta.xml +11 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/_meta.json +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/content.json +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_dc_/angularextapp1.digitalExperienceConfig-meta.xml +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/README.md +85 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angular.json +101 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angularextapp.uibundle-meta.xml +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +13600 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package.json +56 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/user-profile.service.ts +126 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +77 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +53 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +89 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +81 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.guard.ts +50 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.service.ts +126 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.html +34 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.ts +94 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.html +2 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.ts +30 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.html +16 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.ts +40 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/config/authentication.config.ts +75 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.html +9 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.ts +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.html +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.ts +46 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/reactive-form-page.base.ts +50 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.html +55 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.ts +205 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.html +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.ts +52 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.html +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.scss +17 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.ts +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-helpers.ts +68 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-validators.ts +72 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/helpers.ts +85 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-time-servlet.ts +130 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.config.ts +83 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.service.ts +201 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.html +68 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.ts +82 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.html +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.ts +87 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.html +47 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.ts +89 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.html +116 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.ts +194 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.html +80 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.ts +93 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.html +60 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.ts +96 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls +68 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls +77 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls +71 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls +105 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls +162 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/networks/angularextapp.network-meta.xml +60 -0
- package/lib/templates/project/angularextapp/_p_/_m_/package.xml +24 -0
- package/lib/templates/project/angularextapp/_p_/_m_/permissionsets/angularextapp_Guest_User_Api_Access.permissionset-meta.xml +9 -0
- package/lib/templates/project/angularextapp/_p_/_m_/sites/angularextapp.site-meta.xml +31 -0
- package/lib/templates/project/angularextapp/config/project-scratch-def.json +13 -0
- package/lib/templates/project/angularextapp/eslint.config.js +7 -0
- package/lib/templates/project/angularextapp/jest.config.js +6 -0
- package/lib/templates/project/angularextapp/package.json +46 -0
- package/lib/templates/project/angularextapp/scripts/apex/hello.apex +10 -0
- package/lib/templates/project/angularextapp/scripts/gitignore-templates.json +4 -0
- package/lib/templates/project/angularextapp/scripts/graphql-search.sh +191 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-config-schema.mjs +103 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-dev.mjs +87 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-utils.mjs +369 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-xml.mjs +182 -0
- package/lib/templates/project/angularextapp/scripts/org-setup.config.json +9 -0
- package/lib/templates/project/angularextapp/scripts/org-setup.mjs +1702 -0
- package/lib/templates/project/angularextapp/scripts/sf-project-setup.mjs +103 -0
- package/lib/templates/project/angularextapp/scripts/soql/account.soql +6 -0
- package/lib/templates/project/angularextapp/scripts/validate-org-setup-config.mjs +38 -0
- package/lib/templates/project/angularextapp/sfdx-project.json +12 -0
- package/lib/templates/project/angularintapp/.forceignore +15 -0
- package/lib/templates/project/angularintapp/.husky/pre-commit +4 -0
- package/lib/templates/project/angularintapp/.prettierignore +11 -0
- package/lib/templates/project/angularintapp/.prettierrc +17 -0
- package/lib/templates/project/angularintapp/CHANGELOG.md +4086 -0
- package/lib/templates/project/angularintapp/README.md +77 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/README.md +85 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angular.json +101 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angularintapp.uibundle-meta.xml +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +13619 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +57 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +31 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +52 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +90 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +67 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/agentforce-embed.service.ts +177 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.html +3 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.ts +119 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/conversation.ts +55 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/globals.d.ts +13 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.ts +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
- package/lib/templates/project/angularintapp/_p_/_m_/applications/angularintapp.app-meta.xml +17 -0
- package/lib/templates/project/angularintapp/_p_/_m_/permissionsets/angularintapp_Access.permissionset-meta.xml +13 -0
- package/lib/templates/project/angularintapp/config/project-scratch-def.json +13 -0
- package/lib/templates/project/angularintapp/eslint.config.js +7 -0
- package/lib/templates/project/angularintapp/jest.config.js +6 -0
- package/lib/templates/project/angularintapp/package.json +46 -0
- package/lib/templates/project/angularintapp/scripts/apex/hello.apex +10 -0
- package/lib/templates/project/angularintapp/scripts/gitignore-templates.json +4 -0
- package/lib/templates/project/angularintapp/scripts/graphql-search.sh +191 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-config-schema.mjs +103 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-dev.mjs +87 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-utils.mjs +369 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-xml.mjs +182 -0
- package/lib/templates/project/angularintapp/scripts/org-setup.config.json +9 -0
- package/lib/templates/project/angularintapp/scripts/org-setup.mjs +1702 -0
- package/lib/templates/project/angularintapp/scripts/sf-project-setup.mjs +103 -0
- package/lib/templates/project/angularintapp/scripts/soql/account.soql +6 -0
- package/lib/templates/project/angularintapp/scripts/validate-org-setup-config.mjs +38 -0
- package/lib/templates/project/angularintapp/sfdx-project.json +12 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +601 -572
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +601 -572
- package/lib/templates/uiBundles/angularbasic/package-lock.json +147 -168
- package/lib/templates/uiBundles/reactbasic/package-lock.json +601 -572
- package/lib/templates/{lightningembedding → uiembedding}/default/default.html +3 -3
- package/lib/templates/{lightningembedding → uiembedding}/default/default.js +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utils/types.d.ts +5 -5
- package/lib/utils/types.js +3 -3
- package/lib/utils/types.js.map +1 -1
- package/lib/utils/uiBundleTemplateUtils.js +10 -0
- package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
- package/lib/utils/uiEmbedding.d.ts +12 -0
- package/lib/utils/{lightningEmbedding.js → uiEmbedding.js} +7 -7
- package/lib/utils/uiEmbedding.js.map +1 -0
- package/package.json +4 -2
- package/lib/generators/lightningEmbeddingGenerator.d.ts +0 -6
- package/lib/generators/lightningEmbeddingGenerator.js.map +0 -1
- package/lib/utils/lightningEmbedding.d.ts +0 -12
- package/lib/utils/lightningEmbedding.js.map +0 -1
- /package/lib/templates/{lightningembedding → uiembedding}/default/default.css +0 -0
- /package/lib/templates/{lightningembedding → uiembedding}/default/default.js-meta.xml +0 -0
package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
import { DataClient } from './data-client.service';
|
|
3
|
+
import { createDataSDK } from '@salesforce/platform-sdk';
|
|
4
|
+
|
|
5
|
+
vi.mock('@salesforce/platform-sdk', () => ({
|
|
6
|
+
createDataSDK: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
|
|
9
|
+
describe('DataClient', () => {
|
|
10
|
+
let service: DataClient;
|
|
11
|
+
let mockGraphqlQuery: ReturnType<typeof vi.fn>;
|
|
12
|
+
let mockGraphqlMutate: ReturnType<typeof vi.fn>;
|
|
13
|
+
let mockFetch: ReturnType<typeof vi.fn>;
|
|
14
|
+
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
mockGraphqlQuery = vi.fn();
|
|
17
|
+
mockGraphqlMutate = vi.fn();
|
|
18
|
+
mockFetch = vi.fn();
|
|
19
|
+
|
|
20
|
+
vi.mocked(createDataSDK).mockResolvedValue({
|
|
21
|
+
graphql: {
|
|
22
|
+
query: mockGraphqlQuery,
|
|
23
|
+
mutate: mockGraphqlMutate,
|
|
24
|
+
},
|
|
25
|
+
fetch: mockFetch,
|
|
26
|
+
} as any);
|
|
27
|
+
|
|
28
|
+
await TestBed.configureTestingModule({
|
|
29
|
+
providers: [DataClient],
|
|
30
|
+
}).compileComponents();
|
|
31
|
+
|
|
32
|
+
service = TestBed.inject(DataClient);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
vi.clearAllMocks();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should create the service', () => {
|
|
40
|
+
expect(service).toBeTruthy();
|
|
41
|
+
expect(service).toBeInstanceOf(DataClient);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should route plain query operations to graphql.query and return result.data', async () => {
|
|
45
|
+
const operation = 'query { user { id name } }';
|
|
46
|
+
const expectedData = { user: { id: '123', name: 'Test User' } };
|
|
47
|
+
mockGraphqlQuery.mockResolvedValue({ data: expectedData });
|
|
48
|
+
|
|
49
|
+
const result = await service.execute(operation);
|
|
50
|
+
|
|
51
|
+
expect(mockGraphqlQuery).toHaveBeenCalledWith({ query: operation, variables: undefined });
|
|
52
|
+
expect(mockGraphqlMutate).not.toHaveBeenCalled();
|
|
53
|
+
expect(result).toEqual(expectedData);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should route anonymous query operations to graphql.query', async () => {
|
|
57
|
+
const operation = '{ user { id name } }';
|
|
58
|
+
const expectedData = { user: { id: '456', name: 'Anonymous User' } };
|
|
59
|
+
mockGraphqlQuery.mockResolvedValue({ data: expectedData });
|
|
60
|
+
|
|
61
|
+
const result = await service.execute(operation);
|
|
62
|
+
|
|
63
|
+
expect(mockGraphqlQuery).toHaveBeenCalledWith({ query: operation, variables: undefined });
|
|
64
|
+
expect(mockGraphqlMutate).not.toHaveBeenCalled();
|
|
65
|
+
expect(result).toEqual(expectedData);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should route mutation operations to graphql.mutate', async () => {
|
|
69
|
+
const operation = 'mutation { updateUser(id: "123", name: "New Name") { id name } }';
|
|
70
|
+
const expectedData = { updateUser: { id: '123', name: 'New Name' } };
|
|
71
|
+
mockGraphqlMutate.mockResolvedValue({ data: expectedData });
|
|
72
|
+
|
|
73
|
+
const result = await service.execute(operation);
|
|
74
|
+
|
|
75
|
+
expect(mockGraphqlMutate).toHaveBeenCalledWith({ mutation: operation, variables: undefined });
|
|
76
|
+
expect(mockGraphqlQuery).not.toHaveBeenCalled();
|
|
77
|
+
expect(result).toEqual(expectedData);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should detect mutation with leading GraphQL comment and route to graphql.mutate', async () => {
|
|
81
|
+
const operation = '# This is a comment\nmutation { deleteUser(id: "123") { success } }';
|
|
82
|
+
const expectedData = { deleteUser: { success: true } };
|
|
83
|
+
mockGraphqlMutate.mockResolvedValue({ data: expectedData });
|
|
84
|
+
|
|
85
|
+
const result = await service.execute(operation);
|
|
86
|
+
|
|
87
|
+
expect(mockGraphqlMutate).toHaveBeenCalledWith({ mutation: operation, variables: undefined });
|
|
88
|
+
expect(mockGraphqlQuery).not.toHaveBeenCalled();
|
|
89
|
+
expect(result).toEqual(expectedData);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('should not treat query as mutation when comment contains "mutation" word', async () => {
|
|
93
|
+
const operation = '# this is not a mutation, just a query\nquery { user { id } }';
|
|
94
|
+
const expectedData = { user: { id: '789' } };
|
|
95
|
+
mockGraphqlQuery.mockResolvedValue({ data: expectedData });
|
|
96
|
+
|
|
97
|
+
const result = await service.execute(operation);
|
|
98
|
+
|
|
99
|
+
expect(mockGraphqlQuery).toHaveBeenCalledWith({ query: operation, variables: undefined });
|
|
100
|
+
expect(mockGraphqlMutate).not.toHaveBeenCalled();
|
|
101
|
+
expect(result).toEqual(expectedData);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should throw error when result.errors contains errors', async () => {
|
|
105
|
+
const operation = 'query { user { id } }';
|
|
106
|
+
mockGraphqlQuery.mockResolvedValue({
|
|
107
|
+
data: null,
|
|
108
|
+
errors: [{ message: 'Field not found' }, { message: 'Permission denied' }],
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
await expect(service.execute(operation)).rejects.toThrow(
|
|
112
|
+
'GraphQL Error: Field not found; Permission denied',
|
|
113
|
+
);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should throw error when result.errors contains a single error', async () => {
|
|
117
|
+
const operation = 'query { user { id } }';
|
|
118
|
+
mockGraphqlQuery.mockResolvedValue({
|
|
119
|
+
data: null,
|
|
120
|
+
errors: [{ message: 'Unauthorized' }],
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
await expect(service.execute(operation)).rejects.toThrow('GraphQL Error: Unauthorized');
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should throw error when result.data is null with no errors', async () => {
|
|
127
|
+
const operation = 'query { user { id } }';
|
|
128
|
+
mockGraphqlQuery.mockResolvedValue({ data: null });
|
|
129
|
+
|
|
130
|
+
await expect(service.execute(operation)).rejects.toThrow('GraphQL response data is null');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('should pass variables through to graphql.query', async () => {
|
|
134
|
+
const operation = 'query GetUser($id: ID!) { user(id: $id) { id name } }';
|
|
135
|
+
const variables = { id: '999' };
|
|
136
|
+
const expectedData = { user: { id: '999', name: 'Variable User' } };
|
|
137
|
+
mockGraphqlQuery.mockResolvedValue({ data: expectedData });
|
|
138
|
+
|
|
139
|
+
const result = await service.execute(operation, variables);
|
|
140
|
+
|
|
141
|
+
expect(mockGraphqlQuery).toHaveBeenCalledWith({ query: operation, variables });
|
|
142
|
+
expect(result).toEqual(expectedData);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('should pass variables through to graphql.mutate', async () => {
|
|
146
|
+
const operation =
|
|
147
|
+
'mutation UpdateUser($id: ID!, $name: String!) { updateUser(id: $id, name: $name) { id name } }';
|
|
148
|
+
const variables = { id: '888', name: 'Updated Name' };
|
|
149
|
+
const expectedData = { updateUser: { id: '888', name: 'Updated Name' } };
|
|
150
|
+
mockGraphqlMutate.mockResolvedValue({ data: expectedData });
|
|
151
|
+
|
|
152
|
+
const result = await service.execute(operation, variables);
|
|
153
|
+
|
|
154
|
+
expect(mockGraphqlMutate).toHaveBeenCalledWith({ mutation: operation, variables });
|
|
155
|
+
expect(result).toEqual(expectedData);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('should proxy fetch to sdk.fetch and return the raw Response', async () => {
|
|
159
|
+
const url = '/services/apexrest/auth/login';
|
|
160
|
+
const init: RequestInit = {
|
|
161
|
+
method: 'POST',
|
|
162
|
+
body: JSON.stringify({ email: 'a@b.com' }),
|
|
163
|
+
headers: { 'Content-Type': 'application/json' },
|
|
164
|
+
};
|
|
165
|
+
const expectedResponse = { ok: true, status: 200 } as Response;
|
|
166
|
+
mockFetch.mockResolvedValue(expectedResponse);
|
|
167
|
+
|
|
168
|
+
const response = await service.fetch(url, init);
|
|
169
|
+
|
|
170
|
+
expect(mockFetch).toHaveBeenCalledWith(url, init);
|
|
171
|
+
expect(response).toBe(expectedResponse);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('should call fetch with no init when omitted', async () => {
|
|
175
|
+
const url = '/services/data/v64.0/chatter/users/me';
|
|
176
|
+
const expectedResponse = { ok: true, status: 200 } as Response;
|
|
177
|
+
mockFetch.mockResolvedValue(expectedResponse);
|
|
178
|
+
|
|
179
|
+
const response = await service.fetch(url);
|
|
180
|
+
|
|
181
|
+
expect(mockFetch).toHaveBeenCalledWith(url, undefined);
|
|
182
|
+
expect(response).toBe(expectedResponse);
|
|
183
|
+
});
|
|
184
|
+
});
|
package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { createDataSDK } from '@salesforce/platform-sdk';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* True when the operation's first definition is a `mutation`. Strips GraphQL
|
|
6
|
+
* comments first so a leading `# ...` line can't mask the keyword. Queries
|
|
7
|
+
* (named or anonymous `{ ... }` shorthand) and subscriptions fall through to
|
|
8
|
+
* query().
|
|
9
|
+
*/
|
|
10
|
+
function isMutation(operation: string): boolean {
|
|
11
|
+
return /^\s*mutation\b/.test(operation.replace(/#[^\n\r]*/g, ''));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The single data-access client for the app — a thin wrapper over
|
|
16
|
+
* `createDataSDK` that centralizes both of the SDK's surfaces:
|
|
17
|
+
*
|
|
18
|
+
* - `execute()` for GraphQL (routes mutations to `sdk.graphql.mutate` and
|
|
19
|
+
* everything else to `sdk.graphql.query`, with centralized error handling).
|
|
20
|
+
* Use with gql-tagged queries and generated operation types for type-safe
|
|
21
|
+
* calls.
|
|
22
|
+
* - `fetch()` for REST (proxies `sdk.fetch`, returning the raw `Response` so
|
|
23
|
+
* callers keep full control over response parsing / error shaping).
|
|
24
|
+
*
|
|
25
|
+
* Consumers inject this instead of calling `createDataSDK` directly, so the SDK
|
|
26
|
+
* bootstrap lives in exactly one place. Feature packages consume it via an
|
|
27
|
+
* `__inherit__data-client.service` stub (base wins at compose).
|
|
28
|
+
*/
|
|
29
|
+
@Injectable({ providedIn: 'root' })
|
|
30
|
+
export class DataClient {
|
|
31
|
+
/**
|
|
32
|
+
* Executes a GraphQL operation and returns its `data`, throwing on GraphQL
|
|
33
|
+
* errors or a null payload.
|
|
34
|
+
*/
|
|
35
|
+
async execute<TData, TVariables = Record<string, unknown>>(
|
|
36
|
+
operation: string,
|
|
37
|
+
variables?: TVariables,
|
|
38
|
+
): Promise<TData> {
|
|
39
|
+
const data = await createDataSDK();
|
|
40
|
+
const result = isMutation(operation)
|
|
41
|
+
? await data.graphql!.mutate<TData, TVariables>({
|
|
42
|
+
mutation: operation,
|
|
43
|
+
variables,
|
|
44
|
+
})
|
|
45
|
+
: await data.graphql!.query<TData, TVariables>({
|
|
46
|
+
query: operation,
|
|
47
|
+
variables,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
if (result.errors?.length) {
|
|
51
|
+
const msg = result.errors.map((e) => e.message).join('; ');
|
|
52
|
+
throw new Error(`GraphQL Error: ${msg}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (result.data == null) {
|
|
56
|
+
throw new Error('GraphQL response data is null');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return result.data;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Performs a REST request through the SDK's authenticated `fetch`, returning
|
|
64
|
+
* the raw `Response`. Callers parse the body / shape errors themselves (e.g.
|
|
65
|
+
* via `handleApiResponse`).
|
|
66
|
+
*
|
|
67
|
+
* @param input - The request URL (e.g. an Apex REST route).
|
|
68
|
+
* @param init - Standard `fetch` options (method, headers, body, …).
|
|
69
|
+
*/
|
|
70
|
+
async fetch(input: string, init?: RequestInit): Promise<Response> {
|
|
71
|
+
const sdk = await createDataSDK();
|
|
72
|
+
return sdk.fetch!(input, init);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core';
|
|
7
|
+
import { provideRouter } from '@angular/router';
|
|
8
|
+
import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
|
|
9
|
+
import { provideNativeDateAdapter } from '@angular/material/core';
|
|
10
|
+
|
|
11
|
+
import { routes } from './app.routes';
|
|
12
|
+
|
|
13
|
+
export const appConfig: ApplicationConfig = {
|
|
14
|
+
providers: [
|
|
15
|
+
provideBrowserGlobalErrorListeners(),
|
|
16
|
+
provideRouter(routes),
|
|
17
|
+
provideAnimationsAsync(),
|
|
18
|
+
// Enables mat-datepicker (used by the object-search Date / DateRange
|
|
19
|
+
// filters) with the browser's native Date, avoiding a moment/luxon dep.
|
|
20
|
+
provideNativeDateAdapter(),
|
|
21
|
+
],
|
|
22
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<router-outlet />
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Routes } from '@angular/router';
|
|
2
|
+
import { AppLayoutComponent } from './components/layout/app-layout/app-layout';
|
|
3
|
+
import { NotFoundComponent } from './pages/not-found/not-found';
|
|
4
|
+
import { HomePageComponent } from "./pages/home/home-page";
|
|
5
|
+
import { AccountSearchPageComponent } from "./pages/account-search/account-search-page";
|
|
6
|
+
import { AccountDetailPageComponent } from "./pages/account-detail/account-detail-page";
|
|
7
|
+
export const routes: Routes = [
|
|
8
|
+
{
|
|
9
|
+
path: "",
|
|
10
|
+
component: AppLayoutComponent,
|
|
11
|
+
children: [
|
|
12
|
+
{
|
|
13
|
+
path: "",
|
|
14
|
+
component: HomePageComponent,
|
|
15
|
+
data: { showInNavigation: true, label: "Home" }
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
path: "accounts/:recordId",
|
|
19
|
+
component: AccountDetailPageComponent
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
path: "accounts",
|
|
23
|
+
component: AccountSearchPageComponent
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
path: '**',
|
|
27
|
+
component: NotFoundComponent
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
import { provideRouter } from '@angular/router';
|
|
3
|
+
import { App } from './app';
|
|
4
|
+
|
|
5
|
+
describe('App', () => {
|
|
6
|
+
beforeEach(async () => {
|
|
7
|
+
await TestBed.configureTestingModule({
|
|
8
|
+
imports: [App],
|
|
9
|
+
providers: [provideRouter([])],
|
|
10
|
+
}).compileComponents();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should create the app', () => {
|
|
14
|
+
const fixture = TestBed.createComponent(App);
|
|
15
|
+
const app = fixture.componentInstance;
|
|
16
|
+
expect(app).toBeTruthy();
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
7
|
+
import { RouterOutlet } from '@angular/router';
|
|
8
|
+
|
|
9
|
+
@Component({
|
|
10
|
+
selector: 'app-root',
|
|
11
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
12
|
+
imports: [RouterOutlet],
|
|
13
|
+
templateUrl: './app.html',
|
|
14
|
+
})
|
|
15
|
+
export class App {}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<nav class="bg-white border-b border-gray-200">
|
|
2
|
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
3
|
+
<div class="flex justify-between items-center h-16">
|
|
4
|
+
<a routerLink="/" class="text-xl font-semibold text-gray-900"> Angular App </a>
|
|
5
|
+
<button
|
|
6
|
+
(click)="toggleMenu()"
|
|
7
|
+
class="p-2 rounded-md text-gray-700 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
8
|
+
aria-label="Toggle menu"
|
|
9
|
+
aria-controls="app-layout-nav-menu"
|
|
10
|
+
[attr.aria-expanded]="isOpen()"
|
|
11
|
+
>
|
|
12
|
+
<div class="w-6 h-6 flex flex-col justify-center space-y-1.5">
|
|
13
|
+
<span
|
|
14
|
+
class="block h-0.5 w-6 bg-current transition-all"
|
|
15
|
+
[class.rotate-45]="isOpen()"
|
|
16
|
+
[class.translate-y-2]="isOpen()"
|
|
17
|
+
></span>
|
|
18
|
+
<span
|
|
19
|
+
class="block h-0.5 w-6 bg-current transition-all"
|
|
20
|
+
[class.opacity-0]="isOpen()"
|
|
21
|
+
></span>
|
|
22
|
+
<span
|
|
23
|
+
class="block h-0.5 w-6 bg-current transition-all"
|
|
24
|
+
[class.-rotate-45]="isOpen()"
|
|
25
|
+
[class.-translate-y-2]="isOpen()"
|
|
26
|
+
></span>
|
|
27
|
+
</div>
|
|
28
|
+
</button>
|
|
29
|
+
</div>
|
|
30
|
+
@if (isOpen()) {
|
|
31
|
+
<div id="app-layout-nav-menu" class="pb-4">
|
|
32
|
+
<ul class="flex flex-col space-y-2 list-none">
|
|
33
|
+
@for (item of navigationItems(); track item.path) {
|
|
34
|
+
<li>
|
|
35
|
+
<a
|
|
36
|
+
[routerLink]="item.path"
|
|
37
|
+
routerLinkActive="bg-blue-100 text-blue-700"
|
|
38
|
+
[routerLinkActiveOptions]="{ exact: true }"
|
|
39
|
+
(click)="closeMenu()"
|
|
40
|
+
class="block px-3 py-2 rounded-md text-sm font-medium transition-colors text-gray-700 hover:bg-gray-100"
|
|
41
|
+
>
|
|
42
|
+
{{ item.label }}
|
|
43
|
+
</a>
|
|
44
|
+
</li>
|
|
45
|
+
}
|
|
46
|
+
</ul>
|
|
47
|
+
</div>
|
|
48
|
+
}
|
|
49
|
+
</div>
|
|
50
|
+
</nav>
|
|
51
|
+
<router-outlet />
|
|
52
|
+
<app-agentforce-conversation-client agentId="<USER_AGENT_ID_18_CHAR_0Xx...>" />
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { Component, input } from "@angular/core";
|
|
7
|
+
import { TestBed } from "@angular/core/testing";
|
|
8
|
+
import { provideRouter } from "@angular/router";
|
|
9
|
+
import { AppLayoutComponent } from "./app-layout";
|
|
10
|
+
import { AgentforceConversationClientComponent } from "../../../features/agentforce/conversation";
|
|
11
|
+
|
|
12
|
+
// Stub the Agentforce client to keep this layout test hermetic (the real one
|
|
13
|
+
// embeds Lightning Out on render).
|
|
14
|
+
@Component({ selector: "app-agentforce-conversation-client", template: "" })
|
|
15
|
+
class StubAgentforceConversationClientComponent {
|
|
16
|
+
readonly agentId = input.required<string>();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe("AppLayoutComponent", () => {
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
TestBed.configureTestingModule({
|
|
22
|
+
imports: [AppLayoutComponent],
|
|
23
|
+
providers: [
|
|
24
|
+
provideRouter([
|
|
25
|
+
{
|
|
26
|
+
path: "",
|
|
27
|
+
children: [
|
|
28
|
+
{
|
|
29
|
+
path: "accounts",
|
|
30
|
+
component: AppLayoutComponent,
|
|
31
|
+
data: { showInNavigation: true, label: "Accounts" },
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
]),
|
|
36
|
+
],
|
|
37
|
+
});
|
|
38
|
+
TestBed.overrideComponent(AppLayoutComponent, {
|
|
39
|
+
remove: { imports: [AgentforceConversationClientComponent] },
|
|
40
|
+
add: { imports: [StubAgentforceConversationClientComponent] },
|
|
41
|
+
});
|
|
42
|
+
await TestBed.compileComponents();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("should create the component", () => {
|
|
46
|
+
const fixture = TestBed.createComponent(AppLayoutComponent);
|
|
47
|
+
expect(fixture.componentInstance).toBeTruthy();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("should toggle menu", () => {
|
|
51
|
+
const component = TestBed.createComponent(AppLayoutComponent).componentInstance;
|
|
52
|
+
expect(component.isOpen()).toBe(false);
|
|
53
|
+
component.toggleMenu();
|
|
54
|
+
expect(component.isOpen()).toBe(true);
|
|
55
|
+
component.toggleMenu();
|
|
56
|
+
expect(component.isOpen()).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("should close menu", () => {
|
|
60
|
+
const component = TestBed.createComponent(AppLayoutComponent).componentInstance;
|
|
61
|
+
component.toggleMenu();
|
|
62
|
+
expect(component.isOpen()).toBe(true);
|
|
63
|
+
component.closeMenu();
|
|
64
|
+
expect(component.isOpen()).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("should derive navigation items from the router config", () => {
|
|
68
|
+
const component = TestBed.createComponent(AppLayoutComponent).componentInstance;
|
|
69
|
+
const items = component.navigationItems();
|
|
70
|
+
expect(items.some((i) => i.path === "/accounts" && i.label === "Accounts")).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("should render nav element", async () => {
|
|
74
|
+
const fixture = TestBed.createComponent(AppLayoutComponent);
|
|
75
|
+
await fixture.whenStable();
|
|
76
|
+
const compiled = fixture.nativeElement as HTMLElement;
|
|
77
|
+
expect(compiled.querySelector("nav")).toBeTruthy();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("should set aria-expanded on toggle button", async () => {
|
|
81
|
+
const fixture = TestBed.createComponent(AppLayoutComponent);
|
|
82
|
+
await fixture.whenStable();
|
|
83
|
+
const button = (fixture.nativeElement as HTMLElement).querySelector("button");
|
|
84
|
+
expect(button?.getAttribute("aria-expanded")).toBe("false");
|
|
85
|
+
|
|
86
|
+
fixture.componentInstance.toggleMenu();
|
|
87
|
+
fixture.detectChanges();
|
|
88
|
+
expect(button?.getAttribute("aria-expanded")).toBe("true");
|
|
89
|
+
});
|
|
90
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { ChangeDetectionStrategy, Component, computed, inject, signal } from "@angular/core";
|
|
7
|
+
import { Router, RouterLink, RouterLinkActive, RouterOutlet, type Route } from "@angular/router";
|
|
8
|
+
import { AgentforceConversationClientComponent } from "../../../features/agentforce/conversation";
|
|
9
|
+
|
|
10
|
+
interface NavItem {
|
|
11
|
+
path: string;
|
|
12
|
+
label: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* App-owned layout — overrides the base `app-layout` at compose (app copy wins).
|
|
17
|
+
* Angular analogue of the React internal app's `appLayout.tsx`: renders the
|
|
18
|
+
* floating Agentforce client after the outlet, and derives nav from the merged
|
|
19
|
+
* router config (routes with `data.showInNavigation`).
|
|
20
|
+
*/
|
|
21
|
+
@Component({
|
|
22
|
+
selector: "app-layout",
|
|
23
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
24
|
+
imports: [RouterOutlet, RouterLink, RouterLinkActive, AgentforceConversationClientComponent],
|
|
25
|
+
templateUrl: "./app-layout.html",
|
|
26
|
+
})
|
|
27
|
+
export class AppLayoutComponent {
|
|
28
|
+
private readonly router = inject(Router);
|
|
29
|
+
|
|
30
|
+
readonly isOpen = signal(false);
|
|
31
|
+
|
|
32
|
+
/** Routes flagged `data.showInNavigation` with a label, flattened. */
|
|
33
|
+
readonly navigationItems = computed<NavItem[]>(() =>
|
|
34
|
+
this.collectNavItems(this.router.config, ""),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
private collectNavItems(routes: Route[], parentPath: string): NavItem[] {
|
|
38
|
+
const items: NavItem[] = [];
|
|
39
|
+
for (const route of routes) {
|
|
40
|
+
const segment = route.path ?? "";
|
|
41
|
+
const fullPath =
|
|
42
|
+
segment === ""
|
|
43
|
+
? parentPath || "/"
|
|
44
|
+
: parentPath === "/" || parentPath === ""
|
|
45
|
+
? `/${segment}`
|
|
46
|
+
: `${parentPath}/${segment}`;
|
|
47
|
+
|
|
48
|
+
const data = route.data as { showInNavigation?: boolean; label?: string } | undefined;
|
|
49
|
+
if (data?.showInNavigation === true && data.label) {
|
|
50
|
+
items.push({ path: fullPath, label: data.label });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (route.children?.length) {
|
|
54
|
+
items.push(...this.collectNavItems(route.children, fullPath));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return items;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
toggleMenu(): void {
|
|
61
|
+
this.isOpen.update((v) => !v);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
closeMenu(): void {
|
|
65
|
+
this.isOpen.set(false);
|
|
66
|
+
}
|
|
67
|
+
}
|
package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Shared height scale for the form-field wrappers (app-input, app-select,
|
|
9
|
+
* app-date-picker): sm = 24px, default = 32px, lg = 40px.
|
|
10
|
+
*
|
|
11
|
+
* Material's density scale only reaches 36px at its -5 floor, so these compact
|
|
12
|
+
* heights can't come from `mat.form-field-density`. Instead we set the two M3
|
|
13
|
+
* tokens that drive the height directly:
|
|
14
|
+
* --mat-form-field-container-height -> `.mat-mdc-form-field-flex` min-height
|
|
15
|
+
* --mat-form-field-container-vertical-padding -> infix padding-top / -bottom
|
|
16
|
+
*
|
|
17
|
+
* These are CSS custom properties, so setting them on the wrapper's own
|
|
18
|
+
* `mat-form-field` (an in-view element that matches under emulated
|
|
19
|
+
* encapsulation) is enough — they INHERIT down to Material's internal flex /
|
|
20
|
+
* infix elements. No `::ng-deep` and no global classes needed. This mirrors how
|
|
21
|
+
* `app-button` sizes work (it sets `--mat-button-*-container-height` tokens).
|
|
22
|
+
*/
|
|
23
|
+
@mixin apply($height, $vertical-padding) {
|
|
24
|
+
--mat-form-field-container-height: #{$height};
|
|
25
|
+
--mat-form-field-container-vertical-padding: #{$vertical-padding};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* Emit the three size classes. Consumers opt in via `size` on the wrapper,
|
|
30
|
+
* which renders `size-sm | size-default | size-lg` on the mat-form-field.
|
|
31
|
+
*/
|
|
32
|
+
@mixin sizes {
|
|
33
|
+
.size-sm {
|
|
34
|
+
@include apply(1.5rem, 0.25rem); // 24px, 4px
|
|
35
|
+
}
|
|
36
|
+
.size-default {
|
|
37
|
+
@include apply(2rem, 0.5rem); // 32px, 8px
|
|
38
|
+
}
|
|
39
|
+
.size-lg {
|
|
40
|
+
@include apply(2.5rem, 0.75rem); // 40px, 12px
|
|
41
|
+
}
|
|
42
|
+
}
|
package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
@if (icon()) {
|
|
2
|
+
<mat-icon class="row-span-2 translate-y-0.5 !size-4 !text-base leading-4" aria-hidden="true">{{
|
|
3
|
+
icon()
|
|
4
|
+
}}</mat-icon>
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
@if (title()) {
|
|
8
|
+
<div data-slot="alert-title" class="col-start-2 font-medium">{{ title() }}</div>
|
|
9
|
+
}
|
|
10
|
+
@if (description()) {
|
|
11
|
+
<div
|
|
12
|
+
data-slot="alert-description"
|
|
13
|
+
class="col-start-2 text-sm"
|
|
14
|
+
[class.text-muted-foreground]="variant() === 'default'"
|
|
15
|
+
[class.text-destructive]="variant() === 'destructive'"
|
|
16
|
+
>
|
|
17
|
+
{{ description() }}
|
|
18
|
+
</div>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
<!--
|
|
22
|
+
Default slot for callers that project body content (e.g. app-status-alert
|
|
23
|
+
composing a message with a link) instead of the `description` input. Sits in
|
|
24
|
+
the second grid column to align with the icon. Inert when only inputs are used.
|
|
25
|
+
-->
|
|
26
|
+
<div class="col-start-2 text-sm">
|
|
27
|
+
<ng-content />
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<!-- Optional caller-owned trailing control, pinned top-right. -->
|
|
31
|
+
<ng-content select="app-alert-action" />
|