@salesforce/webapp-template-app-react-template-b2x-experimental 1.71.0 → 1.71.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CHANGELOG.md +16 -0
- package/dist/README.md +58 -4
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/package.json +3 -3
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/components/alerts/status-alert.tsx +36 -32
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/components/layouts/card-layout.tsx +29 -0
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/footers/footer-link.tsx +1 -1
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/forms/auth-form.tsx +3 -3
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/forms/submit-button.tsx +3 -3
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/hooks/form.tsx +3 -3
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/layout/card-skeleton.tsx +2 -2
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/layout/centered-page-layout.tsx +1 -1
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/layouts/AuthAppLayout.tsx +1 -1
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/pages/ResetPassword.tsx +2 -2
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/sessionTimeout/SessionTimeoutValidator.tsx +3 -3
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{api → features/global-search/api}/objectDetailService.ts +2 -2
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/DetailHeader.tsx +1 -1
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/filters/FilterInput.tsx +2 -2
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/filters/FilterSelect.tsx +2 -2
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components/filters}/FiltersPanel.tsx +15 -10
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/forms/filters-form.tsx +4 -4
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/forms/submit-button.tsx +3 -3
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components/shared → features/global-search/components/search}/GlobalSearchInput.tsx +4 -4
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/search/SearchPagination.tsx +3 -3
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components/search}/SearchResultCard.tsx +10 -5
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/search/SearchResultsPanel.tsx +5 -5
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components/shared}/LoadingFallback.tsx +1 -1
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/features/global-search/filters/FilterInput.tsx +55 -0
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/features/global-search/filters/FilterSelect.tsx +72 -0
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{hooks → features/global-search/hooks}/form.tsx +9 -4
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{pages → features/global-search/pages}/DetailPage.tsx +4 -4
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{pages → features/global-search/pages}/GlobalSearch.tsx +4 -4
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/pages/Home.tsx +1 -1
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/routes.tsx +13 -13
- package/dist/package.json +1 -1
- package/package.json +1 -1
- package/dist/force-app/main/default/README.md +0 -72
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/auth/alerts/status-alert.tsx +0 -45
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/auth/layout/card-layout.tsx +0 -29
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/components/layout/card-layout.tsx +0 -19
- package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/features/global-search/index.ts +0 -33
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/authHelpers.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/authenticationConfig.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/context/AuthContext.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/hooks/useCountdownTimer.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/hooks/useRetryWithBackoff.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/layouts/authenticationRouteLayout.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/layouts/privateRouteLayout.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/pages/ChangePassword.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/pages/ForgotPassword.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/pages/Login.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/pages/Profile.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/pages/Register.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/sessionTimeout/sessionTimeService.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/sessionTimeout/sessionTimeoutConfig.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{auth → features/authentication}/utils/helpers.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{api → features/global-search/api}/index.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{api → features/global-search/api}/objectInfoGraphQLService.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{api → features/global-search/api}/objectInfoService.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{api → features/global-search/api}/recordListGraphQLService.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/DetailFields.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/DetailForm.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/DetailLayoutSections.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/Section.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/SectionRow.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/UiApiDetailForm.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/formatted/FieldValueDisplay.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/formatted/FormattedAddress.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/formatted/FormattedEmail.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/formatted/FormattedPhone.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/formatted/FormattedText.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/formatted/FormattedUrl.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/detail/formatted/index.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/filters/FilterField.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/search/ResultCardFields.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{components → features/global-search/components}/search/SearchHeader.tsx +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{hooks → features/global-search/hooks}/index.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{hooks → features/global-search/hooks}/useObjectInfoBatch.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{hooks → features/global-search/hooks}/useObjectSearchData.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{hooks → features/global-search/hooks}/useRecordDetailLayout.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{hooks → features/global-search/hooks}/useRecordListGraphQL.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{types → features/global-search/types}/filters/filters.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{types → features/global-search/types}/filters/picklist.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{types → features/global-search/types}/index.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{types → features/global-search/types}/objectInfo/objectInfo.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{types → features/global-search/types}/recordDetail/recordDetail.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{types → features/global-search/types}/search/searchResults.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/apiUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/cacheUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/debounce.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/fieldUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/fieldValueExtractor.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/filterUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/formDataTransformUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/formUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/graphQLNodeFieldUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/graphQLObjectInfoAdapter.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/graphQLRecordAdapter.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/index.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/layoutTransformUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/linkUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/paginationUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/recordUtils.ts +0 -0
- /package/dist/force-app/main/default/webapplications/appreacttemplateb2x/src/{utils → features/global-search/utils}/sanitizationUtils.ts +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FilterSelect Component
|
|
3
|
+
*
|
|
4
|
+
* Renders a dropdown select field for filter values with picklist options.
|
|
5
|
+
* Used for filters with affordance === 'select'.
|
|
6
|
+
*
|
|
7
|
+
* @param filter - Filter definition containing field path, label, and attributes
|
|
8
|
+
* @param value - Currently selected filter value
|
|
9
|
+
* @param options - Array of picklist values to display as options
|
|
10
|
+
* @param onChange - Callback when selection changes
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* - Filters out invalid options (null/undefined values)
|
|
14
|
+
* - Displays option label if available, otherwise uses value
|
|
15
|
+
* - Shows placeholder from filter attributes or default "Select..."
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <FilterSelect
|
|
20
|
+
* filter={selectFilter}
|
|
21
|
+
* value={selectedValue}
|
|
22
|
+
* options={picklistOptions}
|
|
23
|
+
* onChange={(value) => setSelectedValue(value)}
|
|
24
|
+
* />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import {
|
|
28
|
+
Select,
|
|
29
|
+
SelectContent,
|
|
30
|
+
SelectItem,
|
|
31
|
+
SelectTrigger,
|
|
32
|
+
SelectValue,
|
|
33
|
+
} from "../../../components/ui/select";
|
|
34
|
+
import { Field, FieldLabel, FieldDescription } from "../../../components/ui/field";
|
|
35
|
+
import type { Filter } from "../types/filters/filters";
|
|
36
|
+
import type { PicklistValue } from "../types/filters/picklist";
|
|
37
|
+
|
|
38
|
+
interface FilterSelectProps {
|
|
39
|
+
filter: Filter;
|
|
40
|
+
value: string;
|
|
41
|
+
options: PicklistValue[];
|
|
42
|
+
onChange: (value: string) => void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default function FilterSelect({ filter, value, options, onChange }: FilterSelectProps) {
|
|
46
|
+
return (
|
|
47
|
+
<Field>
|
|
48
|
+
<FieldLabel htmlFor={filter.targetFieldPath}>
|
|
49
|
+
{filter.label || filter.targetFieldPath}
|
|
50
|
+
</FieldLabel>
|
|
51
|
+
<Select value={value} onValueChange={onChange}>
|
|
52
|
+
<SelectTrigger
|
|
53
|
+
id={filter.targetFieldPath}
|
|
54
|
+
aria-label={filter.label || filter.targetFieldPath}
|
|
55
|
+
>
|
|
56
|
+
<SelectValue placeholder={filter.attributes?.placeholder || "Select..."} />
|
|
57
|
+
</SelectTrigger>
|
|
58
|
+
<SelectContent>
|
|
59
|
+
{options.map((option) => {
|
|
60
|
+
if (!option || !option.value) return null;
|
|
61
|
+
return (
|
|
62
|
+
<SelectItem key={option.value} value={option.value}>
|
|
63
|
+
{option.label || option.value}
|
|
64
|
+
</SelectItem>
|
|
65
|
+
);
|
|
66
|
+
})}
|
|
67
|
+
</SelectContent>
|
|
68
|
+
</Select>
|
|
69
|
+
{filter.helpMessage && <FieldDescription>{filter.helpMessage}</FieldDescription>}
|
|
70
|
+
</Field>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { useId } from "react";
|
|
2
2
|
import { createFormHookContexts, createFormHook } from "@tanstack/react-form";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
Field,
|
|
5
|
+
FieldDescription,
|
|
6
|
+
FieldError,
|
|
7
|
+
FieldLabel,
|
|
8
|
+
} from "../../../components/ui/field";
|
|
9
|
+
import { Input } from "../../../components/ui/input";
|
|
5
10
|
import {
|
|
6
11
|
Select,
|
|
7
12
|
SelectContent,
|
|
8
13
|
SelectItem,
|
|
9
14
|
SelectTrigger,
|
|
10
15
|
SelectValue,
|
|
11
|
-
} from "
|
|
12
|
-
import { cn } from "
|
|
16
|
+
} from "../../../components/ui/select";
|
|
17
|
+
import { cn } from "../../../lib/utils";
|
|
13
18
|
import type { PicklistValue } from "../types/filters/picklist";
|
|
14
19
|
import { getUniqueErrors } from "../utils/formUtils";
|
|
15
20
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useMemo } from "react";
|
|
2
2
|
import { useParams, useNavigate } from "react-router";
|
|
3
|
-
import { Card, CardContent, CardHeader, CardTitle } from "
|
|
4
|
-
import { Skeleton } from "
|
|
5
|
-
import { Alert, AlertDescription, AlertTitle } from "
|
|
3
|
+
import { Card, CardContent, CardHeader, CardTitle } from "../../../components/ui/card";
|
|
4
|
+
import { Skeleton } from "../../../components/ui/skeleton";
|
|
5
|
+
import { Alert, AlertDescription, AlertTitle } from "../../../components/ui/alert";
|
|
6
6
|
import { AlertCircle } from "lucide-react";
|
|
7
7
|
import DetailHeader from "../components/detail/DetailHeader";
|
|
8
8
|
import { UiApiDetailForm } from "../components/detail/UiApiDetailForm";
|
|
9
|
-
import { OBJECT_API_NAMES, DEFAULT_DETAIL_PAGE_TITLE } from "
|
|
9
|
+
import { OBJECT_API_NAMES, DEFAULT_DETAIL_PAGE_TITLE } from "../../../constants";
|
|
10
10
|
import { toRecordDisplayNameMetadata } from "../utils/fieldUtils";
|
|
11
11
|
import { useRecordDetailLayout } from "../hooks/useRecordDetailLayout";
|
|
12
12
|
import { getGraphQLRecordDisplayName } from "../utils/graphQLNodeFieldUtils";
|
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { useMemo, useState, useCallback, useEffect, useRef } from "react";
|
|
15
15
|
import { useParams } from "react-router";
|
|
16
|
-
import { OBJECT_API_NAMES, DEFAULT_PAGE_SIZE } from "
|
|
16
|
+
import { OBJECT_API_NAMES, DEFAULT_PAGE_SIZE } from "../../../constants";
|
|
17
17
|
import { useObjectListMetadata } from "../hooks/useObjectSearchData";
|
|
18
18
|
import { useObjectInfoBatch } from "../hooks/useObjectInfoBatch";
|
|
19
19
|
import { useRecordListGraphQL } from "../hooks/useRecordListGraphQL";
|
|
20
|
-
import FiltersPanel from "../components/FiltersPanel";
|
|
20
|
+
import FiltersPanel from "../components/filters/FiltersPanel";
|
|
21
21
|
import SearchHeader from "../components/search/SearchHeader";
|
|
22
22
|
import SearchResultsPanel from "../components/search/SearchResultsPanel";
|
|
23
|
-
import { Card, CardContent, CardHeader, CardTitle } from "
|
|
24
|
-
import { Skeleton } from "
|
|
23
|
+
import { Card, CardContent, CardHeader, CardTitle } from "../../../components/ui/card";
|
|
24
|
+
import { Skeleton } from "../../../components/ui/skeleton";
|
|
25
25
|
import type { FilterCriteria } from "../types/filters/filters";
|
|
26
26
|
import type { SearchResultRecord } from "../types/search/searchResults";
|
|
27
27
|
import { graphQLNodeToSearchResultRecordData } from "../utils/graphQLRecordAdapter";
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import type { RouteObject } from 'react-router';
|
|
2
2
|
import Home from './pages/Home';
|
|
3
3
|
import NotFound from './pages/NotFound';
|
|
4
|
-
import Login from "./
|
|
5
|
-
import Register from "./
|
|
6
|
-
import ForgotPassword from "./
|
|
7
|
-
import ResetPassword from "./
|
|
8
|
-
import Profile from "./
|
|
9
|
-
import ChangePassword from "./
|
|
10
|
-
import AuthenticationRoute from "./
|
|
11
|
-
import PrivateRoute from "./
|
|
12
|
-
import { ROUTES } from "./
|
|
13
|
-
import GlobalSearch from "./pages/GlobalSearch";
|
|
14
|
-
import DetailPage from "./pages/DetailPage";
|
|
4
|
+
import Login from "./features/authentication/pages/Login";
|
|
5
|
+
import Register from "./features/authentication/pages/Register";
|
|
6
|
+
import ForgotPassword from "./features/authentication/pages/ForgotPassword";
|
|
7
|
+
import ResetPassword from "./features/authentication/pages/ResetPassword";
|
|
8
|
+
import Profile from "./features/authentication/pages/Profile";
|
|
9
|
+
import ChangePassword from "./features/authentication/pages/ChangePassword";
|
|
10
|
+
import AuthenticationRoute from "./features/authentication/layouts/authenticationRouteLayout";
|
|
11
|
+
import PrivateRoute from "./features/authentication/layouts/privateRouteLayout";
|
|
12
|
+
import { ROUTES } from "./features/authentication/authenticationConfig";
|
|
13
|
+
import GlobalSearch from "./features/global-search/pages/GlobalSearch";
|
|
14
|
+
import DetailPage from "./features/global-search/pages/DetailPage";
|
|
15
15
|
import { Suspense } from "react";
|
|
16
|
-
import LoadingFallback from "./components/LoadingFallback";
|
|
17
|
-
import AuthAppLayout from "./
|
|
16
|
+
import LoadingFallback from "./features/global-search/components/shared/LoadingFallback";
|
|
17
|
+
import AuthAppLayout from "./features/authentication/layouts/AuthAppLayout";
|
|
18
18
|
|
|
19
19
|
export const routes: RouteObject[] = [
|
|
20
20
|
{
|
package/dist/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# App React Template B2X
|
|
2
|
-
|
|
3
|
-
A B2X (Business-to-Consumer) React starter template for customer-facing apps on the Salesforce platform. Includes authentication, global search, and an Experience Cloud site container. Built with React, Vite, TypeScript, and Tailwind/shadcn.
|
|
4
|
-
|
|
5
|
-
## What's included
|
|
6
|
-
|
|
7
|
-
| Path | Description |
|
|
8
|
-
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
9
|
-
| `force-app/main/default/webapplications/appreacttemplateb2x/` | React web app (source, config, tests) |
|
|
10
|
-
| `force-app/main/default/classes/` | Apex classes for authentication — `WebAppAuthUtils`, `WebAppChangePassword`, `WebAppForgotPassword`, `WebAppLogin`, `WebAppRegistration` |
|
|
11
|
-
| `force-app/main/default/digitalExperienceConfigs/` | Experience Cloud site configuration |
|
|
12
|
-
| `force-app/main/default/digitalExperiences/` | Experience Cloud site definition |
|
|
13
|
-
| `force-app/main/default/networks/` | Experience Cloud network |
|
|
14
|
-
| `force-app/main/default/sites/` | Salesforce site |
|
|
15
|
-
|
|
16
|
-
## Getting started
|
|
17
|
-
|
|
18
|
-
Navigate to the web app and install dependencies:
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
cd force-app/main/default/webapplications/appreacttemplateb2x
|
|
22
|
-
npm install
|
|
23
|
-
npm run dev
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Opens at http://localhost:5173 by default. For build and test instructions, see the [web app README](force-app/main/default/webapplications/appreacttemplateb2x/README.md).
|
|
27
|
-
|
|
28
|
-
## Deploy
|
|
29
|
-
|
|
30
|
-
### Deploy everything (metadata + Experience Cloud site + web app)
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
cd force-app/main/default/webapplications/appreacttemplateb2x && npm install && npm run build && cd -
|
|
34
|
-
sf project deploy start --source-dir force-app --target-org <alias>
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
### Deploy the web app only
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
cd force-app/main/default/webapplications/appreacttemplateb2x && npm install && npm run build && cd -
|
|
41
|
-
sf project deploy start --source-dir force-app/main/default/webapplications --target-org <alias>
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Deploy Experience Cloud site only
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
sf project deploy start \
|
|
48
|
-
--source-dir force-app/main/default/digitalExperienceConfigs \
|
|
49
|
-
--source-dir force-app/main/default/digitalExperiences \
|
|
50
|
-
--source-dir force-app/main/default/networks \
|
|
51
|
-
--source-dir force-app/main/default/sites \
|
|
52
|
-
--target-org <alias>
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Deploy authentication classes only
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
sf project deploy start --source-dir force-app/main/default/classes --target-org <alias>
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Replace `<alias>` with your target org alias.
|
|
62
|
-
|
|
63
|
-
## Configure Your Salesforce DX Project
|
|
64
|
-
|
|
65
|
-
The `sfdx-project.json` file contains useful configuration information for your project. See [Salesforce DX Project Configuration](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_ws_config.htm) in the _Salesforce DX Developer Guide_ for details about this file.
|
|
66
|
-
|
|
67
|
-
## Read All About It
|
|
68
|
-
|
|
69
|
-
- [Salesforce Extensions Documentation](https://developer.salesforce.com/tools/vscode/)
|
|
70
|
-
- [Salesforce CLI Setup Guide](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_intro.htm)
|
|
71
|
-
- [Salesforce DX Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_intro.htm)
|
|
72
|
-
- [Salesforce CLI Command Reference](https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference.htm)
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { cva, type VariantProps } from "class-variance-authority";
|
|
2
|
-
import { AlertCircleIcon, CheckCircle2Icon } from "lucide-react";
|
|
3
|
-
import { Alert, AlertDescription } from "../../components/ui/alert";
|
|
4
|
-
import { useId } from "react";
|
|
5
|
-
|
|
6
|
-
const statusAlertVariants = cva("", {
|
|
7
|
-
variants: {
|
|
8
|
-
variant: {
|
|
9
|
-
error: "",
|
|
10
|
-
success: "",
|
|
11
|
-
},
|
|
12
|
-
},
|
|
13
|
-
defaultVariants: {
|
|
14
|
-
variant: "error",
|
|
15
|
-
},
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
interface StatusAlertProps extends VariantProps<typeof statusAlertVariants> {
|
|
19
|
-
children?: React.ReactNode;
|
|
20
|
-
/** Alert variant type. @default "error" */
|
|
21
|
-
variant?: "error" | "success";
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Status alert component for displaying error or success messages.
|
|
26
|
-
* Returns null if no children are provided.
|
|
27
|
-
*/
|
|
28
|
-
export function StatusAlert({ children, variant = "error" }: StatusAlertProps) {
|
|
29
|
-
if (!children) return null;
|
|
30
|
-
|
|
31
|
-
const isError = variant === "error";
|
|
32
|
-
const descriptionId = useId();
|
|
33
|
-
|
|
34
|
-
return (
|
|
35
|
-
<Alert
|
|
36
|
-
variant={isError ? "destructive" : "default"}
|
|
37
|
-
className={statusAlertVariants({ variant })}
|
|
38
|
-
aria-describedby={descriptionId}
|
|
39
|
-
role={isError ? "alert" : "status"}
|
|
40
|
-
>
|
|
41
|
-
{isError ? <AlertCircleIcon aria-hidden="true" /> : <CheckCircle2Icon aria-hidden="true" />}
|
|
42
|
-
<AlertDescription id={descriptionId}>{children}</AlertDescription>
|
|
43
|
-
</Alert>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Card,
|
|
3
|
-
CardContent,
|
|
4
|
-
CardDescription,
|
|
5
|
-
CardHeader,
|
|
6
|
-
CardTitle,
|
|
7
|
-
} from "../../components/ui/card";
|
|
8
|
-
|
|
9
|
-
interface CardLayoutProps {
|
|
10
|
-
title: string;
|
|
11
|
-
description?: string;
|
|
12
|
-
children: React.ReactNode;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Card layout component for authentication pages.
|
|
17
|
-
* Provides CardHeader with title and optional description, and CardContent.
|
|
18
|
-
*/
|
|
19
|
-
export function CardLayout({ title, description, children }: CardLayoutProps) {
|
|
20
|
-
return (
|
|
21
|
-
<Card>
|
|
22
|
-
<CardHeader>
|
|
23
|
-
<CardTitle className="text-2xl">{title}</CardTitle>
|
|
24
|
-
{description && <CardDescription>{description}</CardDescription>}
|
|
25
|
-
</CardHeader>
|
|
26
|
-
<CardContent>{children}</CardContent>
|
|
27
|
-
</Card>
|
|
28
|
-
);
|
|
29
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card";
|
|
2
|
-
|
|
3
|
-
interface CardLayoutProps {
|
|
4
|
-
title: string;
|
|
5
|
-
description?: string;
|
|
6
|
-
children: React.ReactNode;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function CardLayout({ title, description, children }: CardLayoutProps) {
|
|
10
|
-
return (
|
|
11
|
-
<Card className="w-full">
|
|
12
|
-
<CardHeader>
|
|
13
|
-
<CardTitle className="text-2xl">{title}</CardTitle>
|
|
14
|
-
{description && <CardDescription>{description}</CardDescription>}
|
|
15
|
-
</CardHeader>
|
|
16
|
-
<CardContent>{children}</CardContent>
|
|
17
|
-
</Card>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Global Search Feature - Public API
|
|
3
|
-
*
|
|
4
|
-
* Main entry point for the global search feature.
|
|
5
|
-
* Exports all public APIs, components, and utilities that can be consumed by other packages.
|
|
6
|
-
*
|
|
7
|
-
* @remarks
|
|
8
|
-
* This is the public API of the feature. Components and utilities exported here
|
|
9
|
-
* can be imported by other packages that depend on this feature.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```tsx
|
|
13
|
-
* // In another package's appLayout.tsx
|
|
14
|
-
* import { GlobalSearchInput } from 'feature-react-global-search';
|
|
15
|
-
*
|
|
16
|
-
* export default function AppLayout() {
|
|
17
|
-
* return (
|
|
18
|
-
* <div>
|
|
19
|
-
* <GlobalSearchInput />
|
|
20
|
-
* <Outlet />
|
|
21
|
-
* </div>
|
|
22
|
-
* );
|
|
23
|
-
* }
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
export * from "../../api";
|
|
28
|
-
export * from "../../hooks";
|
|
29
|
-
export * from "../../utils";
|
|
30
|
-
export * from "../../constants";
|
|
31
|
-
export * from "../../routes";
|
|
32
|
-
export * from "../../hooks";
|
|
33
|
-
export * from "../../types";
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|