@salesforce/webapp-template-feature-react-global-search-experimental 1.73.0 → 1.74.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.
Files changed (92) hide show
  1. package/README.md +12 -0
  2. package/dist/CHANGELOG.md +16 -0
  3. package/dist/force-app/main/default/webapplications/feature-react-global-search/package.json +3 -3
  4. package/dist/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/api/recordListGraphQLService.ts +1 -2
  5. package/dist/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/types/filters/filters.ts +1 -0
  6. package/dist/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/types/index.ts +1 -0
  7. package/dist/force-app/main/default/webapplications/feature-react-global-search/src/index.ts +10 -0
  8. package/dist/package.json +1 -1
  9. package/package.json +12 -7
  10. package/src/force-app/main/default/webapplications/feature-react-global-search/src/__inherit__appLayout.tsx +9 -0
  11. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/alerts/__inherit__status-alert.tsx +27 -0
  12. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/layouts/__inherit__card-layout.tsx +9 -0
  13. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__alert.tsx +41 -0
  14. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__button.tsx +45 -0
  15. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__card.tsx +33 -0
  16. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__field.tsx +62 -0
  17. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__input.tsx +5 -0
  18. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__label.tsx +8 -0
  19. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__pagination.tsx +47 -0
  20. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__select.tsx +63 -0
  21. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__skeleton.tsx +5 -0
  22. package/src/force-app/main/default/webapplications/feature-react-global-search/src/components/ui/__inherit__spinner.tsx +7 -0
  23. package/src/force-app/main/default/webapplications/feature-react-global-search/src/constants.ts +39 -0
  24. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/api/index.ts +19 -0
  25. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/api/objectDetailService.ts +125 -0
  26. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/api/objectInfoGraphQLService.ts +194 -0
  27. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/api/objectInfoService.ts +199 -0
  28. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/api/recordListGraphQLService.ts +364 -0
  29. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/DetailFields.tsx +55 -0
  30. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/DetailForm.tsx +146 -0
  31. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/DetailHeader.tsx +34 -0
  32. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/DetailLayoutSections.tsx +80 -0
  33. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/Section.tsx +108 -0
  34. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/SectionRow.tsx +20 -0
  35. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/UiApiDetailForm.tsx +140 -0
  36. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/formatted/FieldValueDisplay.tsx +73 -0
  37. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/formatted/FormattedAddress.tsx +29 -0
  38. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/formatted/FormattedEmail.tsx +17 -0
  39. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/formatted/FormattedPhone.tsx +24 -0
  40. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/formatted/FormattedText.tsx +11 -0
  41. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/formatted/FormattedUrl.tsx +29 -0
  42. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/detail/formatted/index.ts +6 -0
  43. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/filters/FilterField.tsx +54 -0
  44. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/filters/FilterInput.tsx +55 -0
  45. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/filters/FilterSelect.tsx +72 -0
  46. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/filters/FiltersPanel.tsx +380 -0
  47. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/forms/filters-form.tsx +114 -0
  48. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/forms/submit-button.tsx +47 -0
  49. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/search/GlobalSearchInput.tsx +114 -0
  50. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/search/ResultCardFields.tsx +71 -0
  51. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/search/SearchHeader.tsx +31 -0
  52. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/search/SearchPagination.tsx +144 -0
  53. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/search/SearchResultCard.tsx +136 -0
  54. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/search/SearchResultsPanel.tsx +197 -0
  55. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/components/shared/LoadingFallback.tsx +61 -0
  56. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/filters/FilterInput.tsx +55 -0
  57. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/filters/FilterSelect.tsx +72 -0
  58. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/hooks/form.tsx +209 -0
  59. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/hooks/index.ts +22 -0
  60. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/hooks/useObjectInfoBatch.ts +65 -0
  61. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/hooks/useObjectSearchData.ts +395 -0
  62. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/hooks/useRecordDetailLayout.ts +156 -0
  63. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/hooks/useRecordListGraphQL.ts +135 -0
  64. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/pages/DetailPage.tsx +109 -0
  65. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/pages/GlobalSearch.tsx +229 -0
  66. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/types/filters/filters.ts +121 -0
  67. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/types/filters/picklist.ts +32 -0
  68. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/types/index.ts +5 -0
  69. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/types/objectInfo/objectInfo.ts +166 -0
  70. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/types/recordDetail/recordDetail.ts +61 -0
  71. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/types/search/searchResults.ts +229 -0
  72. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/apiUtils.ts +125 -0
  73. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/cacheUtils.ts +76 -0
  74. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/debounce.ts +89 -0
  75. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/fieldUtils.ts +354 -0
  76. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/fieldValueExtractor.ts +67 -0
  77. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/filterUtils.ts +32 -0
  78. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/formDataTransformUtils.ts +260 -0
  79. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/formUtils.ts +142 -0
  80. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/graphQLNodeFieldUtils.ts +186 -0
  81. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/graphQLObjectInfoAdapter.ts +319 -0
  82. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/graphQLRecordAdapter.ts +90 -0
  83. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/index.ts +59 -0
  84. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/layoutTransformUtils.ts +236 -0
  85. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/linkUtils.ts +14 -0
  86. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/paginationUtils.ts +49 -0
  87. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/recordUtils.ts +159 -0
  88. package/src/force-app/main/default/webapplications/feature-react-global-search/src/features/global-search/utils/sanitizationUtils.ts +49 -0
  89. package/src/force-app/main/default/webapplications/feature-react-global-search/src/index.ts +10 -0
  90. package/src/force-app/main/default/webapplications/feature-react-global-search/src/lib/__inherit__utils.ts +6 -0
  91. package/src/force-app/main/default/webapplications/feature-react-global-search/src/pages/Home.tsx +13 -0
  92. package/src/force-app/main/default/webapplications/feature-react-global-search/src/routes.tsx +52 -0
package/README.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  This feature provides API services and utilities for implementing global search functionality in Salesforce Web Applications. It includes:
4
4
 
5
+ ## Consuming as a dependency
6
+
7
+ Apps (e.g. `appreactsampleb2e`) can depend on this package and import **API, hooks, types, and utilities** (no UI). The package exposes a built ESM bundle.
8
+
9
+ 1. Add the dependency: `"@salesforce/webapp-template-feature-react-global-search-experimental": "^1.71.3"`.
10
+ 2. **Before building or running the app**, build the library bundle from this package:
11
+ ```bash
12
+ cd packages/template/feature/feature-react-global-search && npm run build:lib
13
+ ```
14
+ This produces `dist/index.js`, which is the package entry point.
15
+ 3. Import what you need (e.g. `useObjectListMetadata`, `parseFilterValue`, `sanitizeFilterValue`, `FilterCriteria`, `objectInfoService`). Use your own UI for filters and list pages.
16
+
5
17
  - **API Service Layer** - Type-safe API client for Salesforce search endpoints
6
18
  - **Type Definitions** - Complete TypeScript types with Zod schema validation
7
19
  - **Utility Functions** - Helper functions for debouncing and data extraction
package/dist/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.74.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.73.1...v1.74.0) (2026-03-05)
7
+
8
+ **Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
9
+
10
+
11
+
12
+
13
+
14
+ ## [1.73.1](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.73.0...v1.73.1) (2026-03-05)
15
+
16
+ **Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
17
+
18
+
19
+
20
+
21
+
6
22
  # [1.73.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.72.0...v1.73.0) (2026-03-05)
7
23
 
8
24
  **Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
@@ -15,8 +15,8 @@
15
15
  "graphql:schema": "node scripts/get-graphql-schema.mjs"
16
16
  },
17
17
  "dependencies": {
18
- "@salesforce/sdk-data": "^1.73.0",
19
- "@salesforce/webapp-experimental": "^1.73.0",
18
+ "@salesforce/sdk-data": "^1.74.0",
19
+ "@salesforce/webapp-experimental": "^1.74.0",
20
20
  "@tailwindcss/vite": "^4.1.17",
21
21
  "@tanstack/react-form": "^1.28.4",
22
22
  "class-variance-authority": "^0.7.1",
@@ -40,7 +40,7 @@
40
40
  "@graphql-eslint/eslint-plugin": "^4.1.0",
41
41
  "@graphql-tools/utils": "^11.0.0",
42
42
  "@playwright/test": "^1.49.0",
43
- "@salesforce/vite-plugin-webapp-experimental": "^1.73.0",
43
+ "@salesforce/vite-plugin-webapp-experimental": "^1.74.0",
44
44
  "@testing-library/jest-dom": "^6.6.3",
45
45
  "@testing-library/react": "^16.1.0",
46
46
  "@testing-library/user-event": "^14.5.2",
@@ -149,10 +149,9 @@ export function buildWhereFromCriteria(
149
149
 
150
150
  for (const c of criteria) {
151
151
  if (!c.fieldPath || !c.operator || !c.values?.length) continue;
152
- const value = c.values[0];
153
152
  const op = c.operator;
154
153
  const parts = c.fieldPath.split(".");
155
- const fieldClause = { [op]: value };
154
+ const fieldClause = op === "in" ? { in: c.values } : { [op]: c.values[0] };
156
155
  if (parts.length === 1) {
157
156
  conditions.push({ [parts[0]]: fieldClause });
158
157
  } else {
@@ -12,6 +12,7 @@ export const FILTER_OPERATORS = [
12
12
  "eq", // Equals
13
13
  "ne", // Not equals
14
14
  "like", // Pattern matching (contains)
15
+ "in", // In list (multiple values)
15
16
  "gt", // Greater than
16
17
  "gte", // Greater than or equal
17
18
  "lt", // Less than
@@ -1,4 +1,5 @@
1
1
  export * from "./filters/filters";
2
+ export * from "./filters/picklist";
2
3
  export * from "./objectInfo/objectInfo";
3
4
  export * from "./recordDetail/recordDetail";
4
5
  export * from "./search/searchResults";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Package entry for @salesforce/webapp-template-feature-react-global-search-experimental.
3
+ * Exports only API, hooks, utils, types, and constants so that consuming apps do not
4
+ * pull in the feature's UI (routes, __inherit__ components) which depend on @radix-ui.
5
+ */
6
+ export * from "./features/global-search/api";
7
+ export * from "./features/global-search/hooks";
8
+ export * from "./features/global-search/utils";
9
+ export * from "./features/global-search/types";
10
+ export * from "./constants";
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/webapp-template-base-sfdx-project-experimental",
3
- "version": "1.73.0",
3
+ "version": "1.74.0",
4
4
  "description": "Base SFDX project template",
5
5
  "private": true,
6
6
  "files": [
package/package.json CHANGED
@@ -1,17 +1,22 @@
1
1
  {
2
2
  "name": "@salesforce/webapp-template-feature-react-global-search-experimental",
3
- "version": "1.73.0",
3
+ "version": "1.74.0",
4
4
  "description": "Global search feature for Salesforce objects with filtering and pagination",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "",
7
- "type": "module",
8
- "main": "index.js",
7
+ "main": "src/force-app/main/default/webapplications/feature-react-global-search/src/index.ts",
8
+ "types": "src/force-app/main/default/webapplications/feature-react-global-search/src/index.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./src/force-app/main/default/webapplications/feature-react-global-search/src/index.ts",
12
+ "import": "./src/force-app/main/default/webapplications/feature-react-global-search/src/index.ts",
13
+ "default": "./src/force-app/main/default/webapplications/feature-react-global-search/src/index.ts"
14
+ }
15
+ },
9
16
  "files": [
10
- "dist"
17
+ "dist",
18
+ "src"
11
19
  ],
12
- "publishConfig": {
13
- "access": "public"
14
- },
15
20
  "scripts": {
16
21
  "clean": "rm -rf dist"
17
22
  },
@@ -0,0 +1,9 @@
1
+ import { Outlet } from "react-router";
2
+
3
+ export default function AppLayout() {
4
+ return (
5
+ <>
6
+ <Outlet />
7
+ </>
8
+ );
9
+ }
@@ -0,0 +1,27 @@
1
+ import { cva, type VariantProps } from "class-variance-authority";
2
+
3
+ const statusAlertVariants = cva("", {
4
+ variants: {
5
+ variant: {
6
+ error: "",
7
+ success: "",
8
+ },
9
+ },
10
+ defaultVariants: {
11
+ variant: "error",
12
+ },
13
+ });
14
+
15
+ interface StatusAlertProps extends VariantProps<typeof statusAlertVariants> {
16
+ children?: React.ReactNode;
17
+ /** Alert variant type. @default "error" */
18
+ variant?: "error" | "success";
19
+ }
20
+
21
+ /**
22
+ * Status alert component for displaying error or success messages.
23
+ * Returns null if no children are provided.
24
+ */
25
+ export function StatusAlert({}: StatusAlertProps) {
26
+ return <></>;
27
+ }
@@ -0,0 +1,9 @@
1
+ interface CardLayoutProps {
2
+ title: string;
3
+ description?: string;
4
+ children: React.ReactNode;
5
+ }
6
+
7
+ export function CardLayout({}: CardLayoutProps) {
8
+ return <></>;
9
+ }
@@ -0,0 +1,41 @@
1
+ import { cva, type VariantProps } from "class-variance-authority";
2
+
3
+ const alertVariants = cva(
4
+ "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
5
+ {
6
+ variants: {
7
+ variant: {
8
+ default: "bg-card text-card-foreground",
9
+ destructive:
10
+ "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
11
+ },
12
+ },
13
+ defaultVariants: {
14
+ variant: "default",
15
+ },
16
+ },
17
+ );
18
+
19
+ function Alert({
20
+ className,
21
+ variant,
22
+ role,
23
+ ...props
24
+ }: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>) {
25
+ return <> </>;
26
+ }
27
+
28
+ // Maintenance/A11y: Added 'asChild' pattern or a simple 'as' prop
29
+ // to allow rendering semantic headings (h1-h6).
30
+ interface AlertTitleProps extends React.ComponentProps<"div"> {
31
+ as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "div" | "p";
32
+ }
33
+ function AlertTitle({ className, as: Component = "div", ...props }: AlertTitleProps) {
34
+ return <></>;
35
+ }
36
+
37
+ function AlertDescription({ className, ...props }: React.ComponentProps<"div">) {
38
+ return <></>;
39
+ }
40
+
41
+ export { Alert, AlertTitle, AlertDescription };
@@ -0,0 +1,45 @@
1
+ import * as React from "react";
2
+ import { cva, type VariantProps } from "class-variance-authority";
3
+
4
+ const buttonVariants = cva(
5
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
6
+ {
7
+ variants: {
8
+ variant: {
9
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
10
+ destructive:
11
+ "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
12
+ outline:
13
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
14
+ secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
15
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
16
+ link: "text-primary underline-offset-4 hover:underline",
17
+ },
18
+ size: {
19
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
20
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
21
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
22
+ icon: "size-9",
23
+ },
24
+ },
25
+ defaultVariants: {
26
+ variant: "default",
27
+ size: "default",
28
+ },
29
+ },
30
+ );
31
+
32
+ function Button({
33
+ className,
34
+ variant,
35
+ size,
36
+ asChild = false,
37
+ ...props
38
+ }: React.ComponentProps<"button"> &
39
+ VariantProps<typeof buttonVariants> & {
40
+ asChild?: boolean;
41
+ }) {
42
+ return <> </>;
43
+ }
44
+
45
+ export { Button, buttonVariants };
@@ -0,0 +1,33 @@
1
+ function Card({ className, ...props }: React.ComponentProps<"div">) {
2
+ return <> </>;
3
+ }
4
+
5
+ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
6
+ return <> </>;
7
+ }
8
+
9
+ function CardTitle({
10
+ className,
11
+ as: Component = "h3",
12
+ ...props
13
+ }: React.ComponentProps<"div"> & { as?: any }) {
14
+ return <> </>;
15
+ }
16
+
17
+ function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
18
+ return <></>;
19
+ }
20
+
21
+ function CardAction({ className, ...props }: React.ComponentProps<"div">) {
22
+ return <></>;
23
+ }
24
+
25
+ function CardContent({ className, ...props }: React.ComponentProps<"div">) {
26
+ return <></>;
27
+ }
28
+
29
+ function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
30
+ return <></>;
31
+ }
32
+
33
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent };
@@ -0,0 +1,62 @@
1
+ import * as React from "react";
2
+
3
+ import { Label } from "./__inherit__label";
4
+
5
+ function Field({
6
+ className,
7
+ orientation = "vertical",
8
+ ...props
9
+ }: React.ComponentProps<"div"> & {
10
+ orientation?: "horizontal" | "vertical";
11
+ }) {
12
+ return <> </>;
13
+ }
14
+
15
+ function FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>) {
16
+ return <> </>;
17
+ }
18
+
19
+ function FieldDescription({ className, ...props }: React.ComponentProps<"p">) {
20
+ return <> </>;
21
+ }
22
+
23
+ function FieldError({
24
+ className,
25
+ errors,
26
+ ...props
27
+ }: React.ComponentProps<"p"> & { errors?: (Error | undefined | null)[] }) {
28
+ const errorMessages = errors?.filter(Boolean).map((e) => e?.message);
29
+
30
+ if (!errorMessages?.length) {
31
+ return null;
32
+ }
33
+
34
+ return <></>;
35
+ }
36
+
37
+ function FieldGroup({ className, ...props }: React.ComponentProps<"div">) {
38
+ return <> </>;
39
+ }
40
+
41
+ function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) {
42
+ return <> </>;
43
+ }
44
+
45
+ function FieldLegend({ className, ...props }: React.ComponentProps<"legend">) {
46
+ return <> </>;
47
+ }
48
+
49
+ function FieldSeparator({ className, ...props }: React.ComponentProps<"div">) {
50
+ return <></>;
51
+ }
52
+
53
+ export {
54
+ Field,
55
+ FieldDescription,
56
+ FieldError,
57
+ FieldGroup,
58
+ FieldLabel,
59
+ FieldLegend,
60
+ FieldSeparator,
61
+ FieldSet,
62
+ };
@@ -0,0 +1,5 @@
1
+ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
2
+ return <> </>;
3
+ }
4
+
5
+ export { Input };
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import * as LabelPrimitive from "@radix-ui/react-label";
3
+
4
+ function Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {
5
+ return <> </>;
6
+ }
7
+
8
+ export { Label };
@@ -0,0 +1,47 @@
1
+ import * as React from "react";
2
+ import { Button } from "./__inherit__button";
3
+
4
+ const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => <></>;
5
+ Pagination.displayName = "Pagination";
6
+
7
+ const PaginationContent = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(
8
+ ({ className, ...props }, ref) => <></>,
9
+ );
10
+ PaginationContent.displayName = "PaginationContent";
11
+
12
+ const PaginationItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(
13
+ ({ className, ...props }, ref) => <></>,
14
+ );
15
+ PaginationItem.displayName = "PaginationItem";
16
+
17
+ type PaginationLinkProps = {
18
+ isActive?: boolean;
19
+ } & React.ComponentProps<"button">;
20
+
21
+ const PaginationLink = ({ className, isActive, disabled, ...props }: PaginationLinkProps) => <></>;
22
+ PaginationLink.displayName = "PaginationLink";
23
+
24
+ const PaginationPrevious = ({
25
+ className,
26
+ disabled,
27
+ ...props
28
+ }: React.ComponentProps<typeof Button>) => <></>;
29
+ PaginationPrevious.displayName = "PaginationPrevious";
30
+
31
+ const PaginationNext = ({ className, disabled, ...props }: React.ComponentProps<typeof Button>) => (
32
+ <></>
33
+ );
34
+ PaginationNext.displayName = "PaginationNext";
35
+
36
+ const PaginationEllipsis = ({ className, ...props }: React.ComponentProps<"span">) => <></>;
37
+ PaginationEllipsis.displayName = "PaginationEllipsis";
38
+
39
+ export {
40
+ Pagination,
41
+ PaginationContent,
42
+ PaginationEllipsis,
43
+ PaginationItem,
44
+ PaginationLink,
45
+ PaginationNext,
46
+ PaginationPrevious,
47
+ };
@@ -0,0 +1,63 @@
1
+ import * as React from "react";
2
+ import * as SelectPrimitive from "@radix-ui/react-select";
3
+
4
+ const Select = SelectPrimitive.Root;
5
+
6
+ const SelectGroup = SelectPrimitive.Group;
7
+
8
+ const SelectValue = SelectPrimitive.Value;
9
+
10
+ const SelectTrigger = React.forwardRef<
11
+ React.ElementRef<typeof SelectPrimitive.Trigger>,
12
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
13
+ >(({ className, children, ...props }, ref) => <></>);
14
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
15
+
16
+ const SelectScrollUpButton = React.forwardRef<
17
+ React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
18
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
19
+ >(({ className, ...props }, ref) => <></>);
20
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
21
+
22
+ const SelectScrollDownButton = React.forwardRef<
23
+ React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
24
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
25
+ >(({ className, ...props }, ref) => <></>);
26
+ SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
27
+
28
+ const SelectContent = React.forwardRef<
29
+ React.ElementRef<typeof SelectPrimitive.Content>,
30
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
31
+ >(({ className, children, position = "popper", ...props }, ref) => <></>);
32
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
33
+
34
+ const SelectLabel = React.forwardRef<
35
+ React.ElementRef<typeof SelectPrimitive.Label>,
36
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
37
+ >(({ className, ...props }, ref) => <></>);
38
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
39
+
40
+ const SelectItem = React.forwardRef<
41
+ React.ElementRef<typeof SelectPrimitive.Item>,
42
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
43
+ >(({ className, children, ...props }, ref) => <></>);
44
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
45
+
46
+ const SelectSeparator = React.forwardRef<
47
+ React.ElementRef<typeof SelectPrimitive.Separator>,
48
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
49
+ >(({ className, ...props }, ref) => <></>);
50
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
51
+
52
+ export {
53
+ Select,
54
+ SelectGroup,
55
+ SelectValue,
56
+ SelectTrigger,
57
+ SelectContent,
58
+ SelectLabel,
59
+ SelectItem,
60
+ SelectSeparator,
61
+ SelectScrollUpButton,
62
+ SelectScrollDownButton,
63
+ };
@@ -0,0 +1,5 @@
1
+ function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
2
+ return <></>;
3
+ }
4
+
5
+ export { Skeleton };
@@ -0,0 +1,7 @@
1
+ import { LoaderIcon } from "lucide-react";
2
+
3
+ function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
4
+ return <> </>;
5
+ }
6
+
7
+ export { Spinner };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Application-wide Constants
3
+ *
4
+ * Defines constants used throughout the global search feature.
5
+ */
6
+
7
+ /**
8
+ * Object API names to search across in the global search feature.
9
+ * Currently supports single object search.
10
+ *
11
+ * @remarks
12
+ * - Array of Salesforce object API names
13
+ * - First element is used as the primary search object
14
+ * - Can be extended to support multiple objects in the future
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * const objectApiName = OBJECT_API_NAMES[0]; // 'Account'
19
+ * ```
20
+ */
21
+ export const OBJECT_API_NAMES = ["Account"] as const;
22
+
23
+ /** Fallback title when record display name cannot be resolved (e.g. before load or no name field). */
24
+ export const DEFAULT_DETAIL_PAGE_TITLE = "Untitled";
25
+
26
+ /**
27
+ * Default page size for search results pagination.
28
+ * This should match one of the values in PAGE_SIZE_OPTIONS from paginationUtils.
29
+ *
30
+ * @remarks
31
+ * - Default value is 20 (second option in PAGE_SIZE_OPTIONS)
32
+ * - Can be changed by user via pagination controls
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE);
37
+ * ```
38
+ */
39
+ export const DEFAULT_PAGE_SIZE = 20;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * API layer: object metadata (GraphQL), layout + record detail (REST layout + GraphQL record), record list/single (GraphQL).
3
+ */
4
+ export { objectInfoService } from "./objectInfoService";
5
+ export { objectDetailService, extractFieldsFromLayout } from "./objectDetailService";
6
+ export type { RecordDetailResult } from "./objectDetailService";
7
+ export {
8
+ getRecordsGraphQL,
9
+ getRecordByIdGraphQL,
10
+ buildGetRecordsQuery,
11
+ buildWhereFromCriteria,
12
+ buildOrderByFromSort,
13
+ } from "./recordListGraphQLService";
14
+ export type {
15
+ RecordListGraphQLResult,
16
+ RecordListGraphQLVariables,
17
+ RecordListGraphQLOptions,
18
+ GraphQLRecordNode,
19
+ } from "./recordListGraphQLService";