@salesforce/ui-bundle-template-app-react-sample-b2e 11.8.4 → 11.9.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/dist/CHANGELOG.md +8 -0
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/package.json +4 -4
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/appLayout.tsx +7 -1
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/IssuesDonutChart.tsx +0 -9
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/StatCard.tsx +0 -9
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/TopBar.tsx +7 -5
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/VerticalNav.tsx +11 -4
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/properties/PropertyDetailsModal.tsx +1 -1
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/FilterFieldWrapper.tsx +6 -1
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/NumericRangeFilter.tsx +5 -1
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/ApplicationSearch.tsx +1 -1
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/Home.tsx +1 -0
- package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/MaintenanceRequestSearch.tsx +1 -1
- package/dist/package-lock.json +2 -2
- package/dist/package.json +1 -1
- package/package.json +2 -2
package/dist/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
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
|
+
## [11.9.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.8.4...v11.9.0) (2026-07-07)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
## [11.8.4](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.8.3...v11.8.4) (2026-07-07)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"graphql:schema": "node scripts/get-graphql-schema.mjs"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@salesforce/platform-sdk": "^11.
|
|
22
|
-
"@salesforce/ui-bundle": "^11.
|
|
21
|
+
"@salesforce/platform-sdk": "^11.9.0",
|
|
22
|
+
"@salesforce/ui-bundle": "^11.9.0",
|
|
23
23
|
"@tailwindcss/vite": "^4.1.17",
|
|
24
24
|
"class-variance-authority": "^0.7.1",
|
|
25
25
|
"clsx": "^2.1.1",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"@graphql-eslint/eslint-plugin": "^4.1.0",
|
|
47
47
|
"@graphql-tools/utils": "^11.0.0",
|
|
48
48
|
"@playwright/test": "^1.49.0",
|
|
49
|
-
"@salesforce/graphiti": "^11.
|
|
50
|
-
"@salesforce/vite-plugin-ui-bundle": "^11.
|
|
49
|
+
"@salesforce/graphiti": "^11.9.0",
|
|
50
|
+
"@salesforce/vite-plugin-ui-bundle": "^11.9.0",
|
|
51
51
|
"@testing-library/jest-dom": "^6.6.3",
|
|
52
52
|
"@testing-library/react": "^16.1.0",
|
|
53
53
|
"@testing-library/user-event": "^14.5.2",
|
|
@@ -11,6 +11,12 @@ export default function AppLayout() {
|
|
|
11
11
|
return (
|
|
12
12
|
<div className="flex flex-col">
|
|
13
13
|
<Toaster />
|
|
14
|
+
<a
|
|
15
|
+
href="#main-content"
|
|
16
|
+
className="sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 focus:z-50 focus:rounded-md focus:bg-white focus:px-4 focus:py-2 focus:text-purple-700 focus:shadow-lg focus:outline focus:outline-2 focus:outline-purple-700"
|
|
17
|
+
>
|
|
18
|
+
Skip to main content
|
|
19
|
+
</a>
|
|
14
20
|
{/* Top Bar */}
|
|
15
21
|
<TopBar onMenuClick={() => setIsNavOpen(true)} />
|
|
16
22
|
|
|
@@ -20,7 +26,7 @@ export default function AppLayout() {
|
|
|
20
26
|
<VerticalNav isOpen={isNavOpen} onClose={() => setIsNavOpen(false)} />
|
|
21
27
|
|
|
22
28
|
{/* Page Content */}
|
|
23
|
-
<main className="flex-1 overflow-auto">
|
|
29
|
+
<main id="main-content" className="flex-1 overflow-auto">
|
|
24
30
|
<Outlet />
|
|
25
31
|
</main>
|
|
26
32
|
</div>
|
|
@@ -2,7 +2,6 @@ import React from "react";
|
|
|
2
2
|
import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from "recharts";
|
|
3
3
|
import { Card } from "../ui/card";
|
|
4
4
|
import { Skeleton } from "../ui/skeleton";
|
|
5
|
-
import { MoreVertical } from "lucide-react";
|
|
6
5
|
|
|
7
6
|
interface ChartData {
|
|
8
7
|
name: string;
|
|
@@ -58,14 +57,6 @@ export const IssuesDonutChart: React.FC<IssuesDonutChartProps> = ({ data, loadin
|
|
|
58
57
|
|
|
59
58
|
return (
|
|
60
59
|
<Card className="p-4 border-gray-200 shadow-sm flex flex-col relative">
|
|
61
|
-
{/* Three-dot menu */}
|
|
62
|
-
<button
|
|
63
|
-
className="absolute top-4 right-4 p-1 hover:bg-gray-100 rounded-md transition-colors z-10"
|
|
64
|
-
aria-label="More options"
|
|
65
|
-
>
|
|
66
|
-
<MoreVertical className="w-4 h-4 text-gray-400" />
|
|
67
|
-
</button>
|
|
68
|
-
|
|
69
60
|
<h3 className="text-sm font-medium text-primary-purple mb-2 uppercase tracking-wide">
|
|
70
61
|
Top Maintenance Issues
|
|
71
62
|
</h3>
|
|
@@ -3,7 +3,6 @@ import { Card } from "../ui/card";
|
|
|
3
3
|
import { Skeleton } from "../ui/skeleton";
|
|
4
4
|
import upgraphIcon from "../../assets/icons/upgraph.svg";
|
|
5
5
|
import downgraphIcon from "../../assets/icons/downgraph.svg";
|
|
6
|
-
import { MoreVertical } from "lucide-react";
|
|
7
6
|
|
|
8
7
|
interface StatCardProps {
|
|
9
8
|
title: string;
|
|
@@ -30,14 +29,6 @@ export const StatCard: React.FC<StatCardProps> = ({
|
|
|
30
29
|
className={`p-4 border-gray-200 shadow-sm relative ${onClick ? "cursor-pointer hover:shadow-lg transition-shadow" : ""}`}
|
|
31
30
|
onClick={onClick}
|
|
32
31
|
>
|
|
33
|
-
{/* Three-dot menu */}
|
|
34
|
-
<button
|
|
35
|
-
className="absolute top-4 right-4 p-1 hover:bg-gray-100 rounded-md transition-colors"
|
|
36
|
-
aria-label="More options"
|
|
37
|
-
>
|
|
38
|
-
<MoreVertical className="w-4 h-4 text-gray-400" />
|
|
39
|
-
</button>
|
|
40
|
-
|
|
41
32
|
<div className="space-y-1">
|
|
42
33
|
<p className="text-sm font-medium text-gray-600 uppercase tracking-wide">{title}</p>
|
|
43
34
|
{loading ? (
|
package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/TopBar.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { useEffect, useState } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { Menu } from "lucide-react";
|
|
3
3
|
import zenLogo from "../../assets/icons/zen-logo.svg";
|
|
4
4
|
import { getUserInfo } from "../../api/dashboard/dashboard";
|
|
5
5
|
|
|
@@ -42,13 +42,15 @@ export const TopBar: React.FC<TopBarProps> = ({ onMenuClick }) => {
|
|
|
42
42
|
{/* Right section - Profile */}
|
|
43
43
|
<div className="flex items-center gap-4">
|
|
44
44
|
{/* User Profile */}
|
|
45
|
-
<
|
|
46
|
-
<div
|
|
45
|
+
<div className="flex items-center gap-2 px-3 py-2">
|
|
46
|
+
<div
|
|
47
|
+
className="w-8 h-8 bg-purple-300 rounded-full flex items-center justify-center text-purple-900 font-semibold"
|
|
48
|
+
aria-hidden="true"
|
|
49
|
+
>
|
|
47
50
|
{userName.charAt(0).toUpperCase()}
|
|
48
51
|
</div>
|
|
49
52
|
<span className="hidden md:inline font-medium">{userName.toUpperCase()}</span>
|
|
50
|
-
|
|
51
|
-
</button>
|
|
53
|
+
</div>
|
|
52
54
|
</div>
|
|
53
55
|
</div>
|
|
54
56
|
);
|
|
@@ -42,6 +42,7 @@ export const VerticalNav: React.FC<VerticalNavProps> = ({ isOpen = false, onClos
|
|
|
42
42
|
key={item.path}
|
|
43
43
|
to={item.path}
|
|
44
44
|
onClick={handleClick}
|
|
45
|
+
aria-current={isActive(item.path) ? "page" : undefined}
|
|
45
46
|
className={`flex flex-col items-center justify-center gap-2 py-4 px-2 transition-colors ${
|
|
46
47
|
isActive(item.path)
|
|
47
48
|
? "bg-purple-100 text-purple-700 border-l-4 border-purple-700"
|
|
@@ -57,17 +58,23 @@ export const VerticalNav: React.FC<VerticalNavProps> = ({ isOpen = false, onClos
|
|
|
57
58
|
return (
|
|
58
59
|
<>
|
|
59
60
|
{/* Desktop sidebar */}
|
|
60
|
-
<
|
|
61
|
+
<nav
|
|
62
|
+
aria-label="Main"
|
|
63
|
+
className="hidden md:flex flex-col w-24 bg-white border-r border-gray-200 py-8 space-y-4"
|
|
64
|
+
>
|
|
61
65
|
{navContent()}
|
|
62
|
-
</
|
|
66
|
+
</nav>
|
|
63
67
|
|
|
64
68
|
{/* Mobile overlay */}
|
|
65
69
|
{isOpen && (
|
|
66
70
|
<>
|
|
67
71
|
<div className="fixed inset-0 z-40 bg-black/50" onClick={onClose} aria-hidden />
|
|
68
|
-
<
|
|
72
|
+
<nav
|
|
73
|
+
aria-label="Main menu"
|
|
74
|
+
className="fixed left-0 top-0 bottom-0 z-50 flex flex-col w-24 bg-white border-r border-gray-200 py-8 space-y-4"
|
|
75
|
+
>
|
|
69
76
|
{navContent(onClose)}
|
|
70
|
-
</
|
|
77
|
+
</nav>
|
|
71
78
|
</>
|
|
72
79
|
)}
|
|
73
80
|
</>
|
|
@@ -56,7 +56,7 @@ export const PropertyDetailsModal: React.FC<PropertyDetailsModalProps> = ({
|
|
|
56
56
|
case "rented":
|
|
57
57
|
return "bg-blue-100 text-blue-700";
|
|
58
58
|
case "maintenance":
|
|
59
|
-
return "bg-yellow-100 text-yellow-
|
|
59
|
+
return "bg-yellow-100 text-yellow-800";
|
|
60
60
|
default:
|
|
61
61
|
return "bg-gray-100 text-gray-700";
|
|
62
62
|
}
|
|
@@ -6,6 +6,8 @@ interface FilterFieldWrapperProps extends React.ComponentProps<"div"> {
|
|
|
6
6
|
htmlFor?: string;
|
|
7
7
|
/** id applied to the visible label so a non-native control can reference it via aria-labelledby */
|
|
8
8
|
labelId?: string;
|
|
9
|
+
/** id applied to the error message so a control can reference it via aria-describedby */
|
|
10
|
+
errorId?: string;
|
|
9
11
|
helpText?: string;
|
|
10
12
|
error?: string;
|
|
11
13
|
}
|
|
@@ -14,6 +16,7 @@ export function FilterFieldWrapper({
|
|
|
14
16
|
label,
|
|
15
17
|
htmlFor,
|
|
16
18
|
labelId,
|
|
19
|
+
errorId,
|
|
17
20
|
helpText,
|
|
18
21
|
error,
|
|
19
22
|
className,
|
|
@@ -28,7 +31,9 @@ export function FilterFieldWrapper({
|
|
|
28
31
|
{children}
|
|
29
32
|
<div className="min-h-4">
|
|
30
33
|
{error ? (
|
|
31
|
-
<p className="text-xs text-destructive">
|
|
34
|
+
<p id={errorId} role="alert" className="text-xs text-destructive">
|
|
35
|
+
{error}
|
|
36
|
+
</p>
|
|
32
37
|
) : (
|
|
33
38
|
helpText && <p className="text-xs text-muted-foreground">{helpText}</p>
|
|
34
39
|
)}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
1
|
+
import { useId, useState } from "react";
|
|
2
2
|
import { Input } from "../../../../components/ui/input";
|
|
3
3
|
|
|
4
4
|
import { useFilterField } from "../FilterContext";
|
|
@@ -62,6 +62,7 @@ export function NumericRangeFilterInputs({
|
|
|
62
62
|
className,
|
|
63
63
|
...props
|
|
64
64
|
}: NumericRangeFilterInputsProps) {
|
|
65
|
+
const errorId = useId();
|
|
65
66
|
const [localMin, setLocalMin] = useState(value?.min ?? "");
|
|
66
67
|
const [localMax, setLocalMax] = useState(value?.max ?? "");
|
|
67
68
|
|
|
@@ -129,6 +130,7 @@ export function NumericRangeFilterInputs({
|
|
|
129
130
|
label={label}
|
|
130
131
|
helpText={helpText}
|
|
131
132
|
error={errorMessage}
|
|
133
|
+
errorId={errorId}
|
|
132
134
|
className={className}
|
|
133
135
|
{...props}
|
|
134
136
|
>
|
|
@@ -146,6 +148,7 @@ export function NumericRangeFilterInputs({
|
|
|
146
148
|
}}
|
|
147
149
|
aria-label={`${label} minimum`}
|
|
148
150
|
aria-invalid={hasError || undefined}
|
|
151
|
+
aria-describedby={hasError ? errorId : undefined}
|
|
149
152
|
/>
|
|
150
153
|
<Input
|
|
151
154
|
type="number"
|
|
@@ -160,6 +163,7 @@ export function NumericRangeFilterInputs({
|
|
|
160
163
|
}}
|
|
161
164
|
aria-label={`${label} maximum`}
|
|
162
165
|
aria-invalid={hasError || undefined}
|
|
166
|
+
aria-describedby={hasError ? errorId : undefined}
|
|
163
167
|
/>
|
|
164
168
|
</div>
|
|
165
169
|
</FilterFieldWrapper>
|
package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/ApplicationSearch.tsx
CHANGED
|
@@ -326,7 +326,7 @@ const getStatusColor = (status: string) => {
|
|
|
326
326
|
if (statusLower.includes("approved")) return "bg-green-100 text-green-700";
|
|
327
327
|
if (statusLower.includes("rejected")) return "bg-red-100 text-red-700";
|
|
328
328
|
if (statusLower.includes("background")) return "bg-blue-100 text-blue-700";
|
|
329
|
-
if (statusLower.includes("review")) return "bg-yellow-100 text-yellow-
|
|
329
|
+
if (statusLower.includes("review")) return "bg-yellow-100 text-yellow-800";
|
|
330
330
|
return "bg-gray-100 text-gray-700";
|
|
331
331
|
};
|
|
332
332
|
|
|
@@ -131,6 +131,7 @@ export default function Home() {
|
|
|
131
131
|
return (
|
|
132
132
|
<PageContainer>
|
|
133
133
|
<div className="max-w-7xl mx-auto space-y-6">
|
|
134
|
+
<h1 className="sr-only">Dashboard</h1>
|
|
134
135
|
<GlobalSearchBar
|
|
135
136
|
searchableObjects={SEARCHABLE_OBJECTS}
|
|
136
137
|
selectedObjectApiName={selectedObjectApiName}
|
|
@@ -386,7 +386,7 @@ function StatusBadge({ status }: { status: string }) {
|
|
|
386
386
|
statusLower === "new"
|
|
387
387
|
? "bg-pink-100 text-pink-700"
|
|
388
388
|
: statusLower === "in progress"
|
|
389
|
-
? "bg-yellow-100 text-yellow-
|
|
389
|
+
? "bg-yellow-100 text-yellow-800"
|
|
390
390
|
: statusLower === "resolved"
|
|
391
391
|
? "bg-green-100 text-green-700"
|
|
392
392
|
: "bg-gray-100 text-gray-700";
|
package/dist/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/webapp-template-base-sfdx-project-experimental",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.9.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@salesforce/webapp-template-base-sfdx-project-experimental",
|
|
9
|
-
"version": "11.
|
|
9
|
+
"version": "11.9.0",
|
|
10
10
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@lwc/eslint-plugin-lwc": "^3.3.0",
|
package/dist/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/ui-bundle-template-app-react-sample-b2e",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.9.0",
|
|
4
4
|
"description": "Salesforce sample property rental React app",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"clean": "rm -rf dist"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@salesforce/ui-bundle": "^11.
|
|
19
|
+
"@salesforce/ui-bundle": "^11.9.0",
|
|
20
20
|
"sonner": "^1.7.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|