Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions src/ui/app/AppRoot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,8 @@ export function AppRoot(): VNode {
applyTheme('light');
});

sf.getOnboarding().then(progress => {
if (!progress.dismissedAt && progress.completedSteps.length === 0) {
setShowOnboarding(true);
}
}).catch(() => {});
// Onboarding modal is no longer auto-shown on first launch. Users can
// open it from the Home "Getting started" surface when they choose.
Comment on lines +167 to +168

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add the promised Home onboarding entry point

On a fresh install, showOnboarding remains initialized to false after this effect stops loading onboarding progress, and there is no setShowOnboarding(true) anywhere else in AppRoot; HomeScreen also has no tutorial control. Consequently the stated opt-in “Getting started” surface does not exist and new users can reach the wizard only by discovering Help's “Restart Tutorial” action.

Useful? React with 👍 / 👎.

}, []);

useEffect(() => {
Expand Down Expand Up @@ -217,7 +214,7 @@ export function AppRoot(): VNode {
() => setRoute('import'),
),
shortcutRegistry.register(
{ id: 'toggle-undo', defaultKeys: 'ctrl+z', description: 'Toggle undo panel', scope: 'global' },
{ id: 'toggle-undo', defaultKeys: 'ctrl+shift+z', description: 'Toggle undo panel', scope: 'global' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid assigning the undo panel to the native redo chord

When an input or other editable control is focused on macOS, Command+Shift+Z is the native redo command; normalizeKeys maps Command/Meta to ctrl, so this new default matches it. The editable-target guard explicitly allows shifted chords, causing WaveLink to prevent the native redo and toggle its undo panel instead.

Useful? React with 👍 / 👎.

() => setUndoPanelOpen(v => !v),
),
];
Expand Down
4 changes: 2 additions & 2 deletions src/ui/components/OnboardingWizard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,15 @@ type OnboardingCategory = OnboardingStep['category'];
/** Category display labels in presentation order. */
const ONBOARDING_CATEGORIES: OnboardingCategory[] = [
'getting-started',
'data-push',
'import',
'query',
'advanced',
];

/** Human-readable labels for each category. */
const CATEGORY_LABELS: Record<OnboardingCategory, string> = {
'getting-started': 'Getting Started',
'data-push': 'Data Push',
'import': 'Import',
'query': 'Query',
'advanced': 'Advanced',
};
Expand Down
4 changes: 2 additions & 2 deletions src/ui/screens/HelpScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ const HELP_CATEGORIES: Array<{
filter: (s) => s.category === 'getting-started',
},
{
name: 'Data Push',
name: 'Import',
description: 'Upload files, map fields, push records, and review push history.',
filter: (s) => s.category === 'data-push',
filter: (s) => s.category === 'import',
Comment on lines +34 to +36

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Map the renamed Import help category to its topics

After renaming this display category to Import, getTopicsForCategory looks it up in CATEGORY_NAME_MAP, which still contains only Data Push -> data-push. The lookup therefore falls back to the capitalized string Import, while the topics now use lowercase import, leaving this card empty and hiding it entirely whenever a search is active.

Useful? React with 👍 / 👎.

},
{
name: 'Query & Objects',
Expand Down
8 changes: 4 additions & 4 deletions src/ui/utils/onboarding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export interface OnboardingStep {
title: string;
description: string;
targetRoute?: AppRoute;
category: 'getting-started' | 'data-push' | 'query' | 'advanced';
category: 'getting-started' | 'import' | 'query' | 'advanced';
/** Opens a bounded, non-sensitive example in the relevant workflow. */
example?: 'export' | 'import';
}
Expand Down Expand Up @@ -59,22 +59,22 @@ export const ONBOARDING_STEPS: OnboardingStep[] = [
title: 'Upload Data from a File',
description: 'Upload a CSV or Excel file to prepare data for pushing to Salesforce. WaveLink will parse and preview your records.',
targetRoute: APP_ROUTES.import,
category: 'data-push',
category: 'import',
example: 'import',
},
{
id: 'push-data',
title: 'Push Data to Salesforce',
description: 'Map your uploaded fields to Salesforce fields and push records using insert, update, upsert, or delete operations.',
targetRoute: APP_ROUTES.import,
category: 'data-push',
category: 'import',
},
{
id: 'use-templates',
title: 'Save and Use Data Templates',
description: 'Save your field mappings and sample data as reusable templates for repeated data push operations.',
targetRoute: APP_ROUTES.templates,
category: 'data-push',
category: 'import',
},

// ── Advanced ──
Expand Down
16 changes: 16 additions & 0 deletions src/ui/utils/shortcuts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,22 @@ class ShortcutRegistryImpl {
}

handleKeydown(e: KeyboardEvent): boolean {
// Never hijack native undo/redo/editing inside text inputs unless the
// binding uses a modifier combo that users don't expect to conflict
// (ctrl+shift, ctrl+alt, etc.). Plain ctrl+z / ctrl+y must pass through.
const target = e.target as HTMLElement | null;
if (target) {
const tag = target.tagName.toLowerCase();
const isEditable =
tag === 'input' ||
tag === 'textarea' ||
tag === 'select' ||
target.isContentEditable;
if (isEditable && !e.shiftKey && !e.altKey) {
return false;
}
Comment on lines +112 to +114

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve global non-editing shortcuts in editable controls

Whenever focus is in an input, textarea, select, or contenteditable element, this condition suppresses every shortcut lacking Shift or Alt rather than only native editing chords. For example, the globally scoped Command/Ctrl+K command-palette shortcut now stops working while users are editing a SOQL field or search box; the exemption should be based on known editing bindings such as undo/redo instead.

Useful? React with 👍 / 👎.

}

const normalized = normalizeKeys(e);
const id = this.keyIndex.get(normalized);
if (!id) return false;
Expand Down
Loading