Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
1b522cf
Start workspace onboarding
tristantr Nov 19, 2025
2a9e367
Add pictures to tutorial steps
tristantr Nov 19, 2025
bafdc0b
Remove unecessary step
tristantr Nov 19, 2025
28fad43
Continue tutorial by creating a flow together
tristantr Nov 19, 2025
657fe86
Add image into the Create Flow tutorial pop up
tristantr Nov 19, 2025
95a3717
Generate flow from frontend
tristantr Nov 19, 2025
ace69f7
Set pause between each node
tristantr Nov 19, 2025
39fa5f3
Add automatic scripts overview
tristantr Nov 19, 2025
9dc1bc5
Simplify tutorial, and add step to show the code
tristantr Nov 19, 2025
eafee18
Add input step
tristantr Nov 19, 2025
0ddfd9a
Autoremove last step after 5 seconds
tristantr Nov 19, 2025
6db4a0f
Add flow typing when opening code editor
tristantr Nov 19, 2025
62f13bb
Remove lock field from json file
tristantr Nov 19, 2025
ff118b9
Add Guides tab on left menu
tristantr Nov 19, 2025
ef13ace
Add /guides page
tristantr Nov 19, 2025
ccdeba5
Add tutorial card in Guides tab
tristantr Nov 20, 2025
ca1d90f
Add step to show data connector
tristantr Nov 20, 2025
41f327c
Add second text input to show 2 types of inputs and fill them dynamic…
tristantr Nov 20, 2025
d3f5ada
Improve tutorial chronology
tristantr Nov 20, 2025
7b85682
Add flow input connexion with first sctript
tristantr Nov 20, 2025
3610304
Improve overlay
tristantr Nov 20, 2025
0b5806e
Improve wording
tristantr Nov 20, 2025
691464d
Add new tutorial step to show node b
tristantr Nov 20, 2025
5d05d66
Add test step
tristantr Nov 20, 2025
faf29ac
Add cursor to pick typescript
tristantr Nov 20, 2025
b81d089
Improve end of tutorial
tristantr Nov 20, 2025
c16a8a6
Refactor
tristantr Nov 20, 2025
2b2b9b2
Highlight bottom right corner for 5 and 6
tristantr Nov 20, 2025
29e4645
Fix last step overlay
tristantr Nov 20, 2025
b3f239a
change home tutorial button
diegoimbert Nov 21, 2025
fc1b996
guidelines nits
diegoimbert Nov 21, 2025
59eeeee
Automate onNext() trigger on step 3
tristantr Nov 21, 2025
b948e58
Improve fakr cursor for Test this step button
tristantr Nov 21, 2025
d2a8007
Improve overlay transitions
tristantr Nov 21, 2025
da5fcfc
Merge data connectors and test step steps
tristantr Nov 21, 2025
ccf5098
Improve live code writing in step 3
tristantr Nov 21, 2025
f57f01c
Add a step to complete the flow
tristantr Nov 21, 2025
e66552a
Improve the step where we generate remaining scripts
tristantr Nov 21, 2025
8d54ab5
Refactor
tristantr Nov 21, 2025
e950eed
Add blocking behavior on step 3
tristantr Nov 21, 2025
59e80b7
nit about delay
tristantr Nov 21, 2025
f774fa6
Prevent clicking on Next while code not generated
tristantr Nov 21, 2025
b46783e
Sharpen wordings
tristantr Nov 21, 2025
43714a8
Remove Svelte 4 and migrate to Svelte 5
tristantr Nov 21, 2025
b131531
Remove unecesary helper function
tristantr Nov 21, 2025
6da825a
Add toast if the user clicks on Next button before code finished gene…
tristantr Nov 21, 2025
920e0c7
Add toasts to each step
tristantr Nov 21, 2025
c388425
Improve tutorial trigger timing
tristantr Nov 21, 2025
b7fe4db
Improve delays
tristantr Nov 21, 2025
6818d32
Add cursor movement to Test Flow button
tristantr Nov 21, 2025
d13c0ee
Block previous on certain steps to prevent bug
tristantr Nov 21, 2025
8fb52fe
Fix for github npm check
tristantr Nov 21, 2025
f986cb4
Fix for github npm check
tristantr Nov 21, 2025
eb58e8f
Unlike workspace onboarding and flow tutorial
tristantr Nov 21, 2025
dd6b01e
Rename flow tutorial with better name
tristantr Nov 21, 2025
563e5a3
Remove the automatic trigger for flow previous and broken tutorial
tristantr Nov 21, 2025
f05c290
Push tutorials to Help sectionof the sidebar
tristantr Nov 21, 2025
bda24ea
Fix redirection t /tutorials page
tristantr Nov 21, 2025
ff8199e
Add tutorials page and update workspace onboarding flow
tristantr Nov 21, 2025
2cec77c
Add tutorials to workspace homepage
tristantr Dec 1, 2025
dbb212b
Start tutorials for Run/logs section
tristantr Dec 1, 2025
e5d93cc
Fix data connector
tristantr Dec 1, 2025
020da0a
Add flow execution graph from Run drawer
tristantr Dec 1, 2025
cdfecb0
Add tabs highlighting in drawer
tristantr Dec 1, 2025
84f830c
Improve tutorial on run drawer
tristantr Dec 1, 2025
ff92339
Add mouse cursor moving from graph tab
tristantr Dec 1, 2025
fad9a3d
Add cursor click on script in Drawer Graph tabs
tristantr Dec 1, 2025
2dad0e0
Add troubleshooting flow in tutorial
tristantr Dec 2, 2025
2e03f7d
Add step to show logs of failed step
tristantr Dec 2, 2025
6f38c16
add step 7 to invite the user to fix by himself and se the new results
tristantr Dec 2, 2025
7ec392b
Improve wording
tristantr Dec 2, 2025
2f16c9b
Nit improvements
tristantr Dec 2, 2025
6d238de
Nits
tristantr Dec 2, 2025
0d1ed7c
Refactor
tristantr Dec 2, 2025
8740091
Refactor
tristantr Dec 2, 2025
04ffeb5
Rename the tutorial
tristantr Dec 2, 2025
6e7fbf3
Remove deleted file
tristantr Dec 2, 2025
47756ea
Improve wording
tristantr Dec 2, 2025
1c970bb
Improve first step of troubleshooting flow tutorial
tristantr Dec 2, 2025
7bb2bc0
Add tutorials to /tutorials page and create component
tristantr Dec 3, 2025
9ff7923
Remove previous Flow tutorials
tristantr Dec 3, 2025
dcbceb0
Fixes, and improve tutorial button design
tristantr Dec 3, 2025
84a90ab
Improve status in Tutorial button
tristantr Dec 3, 2025
5d0e0e1
Align tutorial button to brand guidelines
tristantr Dec 3, 2025
a096e07
Add skip all to onboarding workspace tutorial
tristantr Dec 3, 2025
c23d814
Add skipped_all to tutorial_progress
tristantr Dec 3, 2025
3b3df19
Connect backend and frontend for tutorial progress
tristantr Dec 3, 2025
998e3d4
Add store and helper to display or not Tutorials from left menu
tristantr Dec 3, 2025
699ddfb
Add reminder at the end of each tutorial
tristantr Dec 3, 2025
16a398c
Add tutorial banner
tristantr Dec 3, 2025
cb14b5b
Remove tutorials from elpty workspace
tristantr Dec 3, 2025
bd4f543
Improve Tutorials page
tristantr Dec 3, 2025
f1cb5c1
Align banner to guidelines
tristantr Dec 3, 2025
df54c35
Add reset tutorials buttons
tristantr Dec 3, 2025
66a75ac
Refactor
tristantr Dec 3, 2025
2cf75d1
Refactor to make it easy to add new tutorials and tabs
tristantr Dec 4, 2025
c726489
Improve tutorial config to make it easy to add new tutorials
tristantr Dec 4, 2025
c3e4c4a
Refactor and remove hardcoded indexes
tristantr Dec 4, 2025
6ec9df4
Add getTutorialIndex in tutorial config file
tristantr Dec 4, 2025
d4566ff
Nit
tristantr Dec 4, 2025
58bf060
Add Mark all as complete button in tutorial page
tristantr Dec 4, 2025
97c5943
Add skip tutorial button in banner toast
tristantr Dec 4, 2025
2a9cf69
Replace if else in tutorials router by map to make it easier to maint…
tristantr Dec 4, 2025
ea2a93b
Delete broken simple app tutorial
tristantr Dec 4, 2025
fbc1a08
Add Guide flow guide buttons inside the Create Flow page
tristantr Dec 4, 2025
5627a46
Add flow editor tutorials into flow builder page
tristantr Dec 4, 2025
c29ccb7
Update existing app tutorials with new tutorial system
tristantr Dec 4, 2025
0aa2cc5
Create a dedicated tutorial category for app editor
tristantr Dec 4, 2025
6b32d38
Add global progress bar
tristantr Dec 4, 2025
2a62cd9
Add Reset & Skip at tutorial category level
tristantr Dec 4, 2025
e7bcde1
Add progress to tab title
tristantr Dec 4, 2025
dc9ec0b
Nits on design
tristantr Dec 4, 2025
1b14429
Make progress bar a props and design nits
tristantr Dec 4, 2025
8f86688
Add active props for Tutorial Category
tristantr Dec 5, 2025
b230d7d
Display tutorials according to the user role
tristantr Dec 5, 2025
b94bf5e
Adapt progress bar to the user role
tristantr Dec 5, 2025
8d2c2b8
Add roles array for each tutorial
tristantr Dec 5, 2025
31b53c8
Add Tutorials tab in Operator menu
tristantr Dec 5, 2025
9ee182e
Edge case if no Category and no Tutorial available for my role
tristantr Dec 5, 2025
18c6297
Allow the user to reset a single tutorial
tristantr Dec 5, 2025
7e0b636
Allow a user to mark as completed a single tutorial
tristantr Dec 5, 2025
bbc57e2
Nit on hoovering tutorial status
tristantr Dec 5, 2025
2c08bad
Allow admins to see which tutorials are available per role
tristantr Dec 5, 2025
9442300
Create utils that allow admins to see which tutorials can access othe…
tristantr Dec 5, 2025
71ac2f7
Refactor resetSingleTutorial and completeSingleTutorial into one func…
tristantr Dec 5, 2025
b2fdf62
Improve role system
tristantr Dec 5, 2025
4f86b66
Remove hardcoded MAX_TUTORIAL_ID
tristantr Dec 5, 2025
543e0c9
Fix type assertion
tristantr Dec 5, 2025
967e88e
Remove console log
tristantr Dec 5, 2025
215a4c8
Reduce recalculations when unrelated state changes
tristantr Dec 5, 2025
a20cbfc
Add console.error
tristantr Dec 5, 2025
eeb0cba
Remove unused function
tristantr Dec 5, 2025
3e1df0d
Add tutorial wrapper and better router
tristantr Dec 5, 2025
404faa5
Nits to pass npm checks
tristantr Dec 5, 2025
1a49f50
Fix typescripts and lint errors
tristantr Dec 5, 2025
8ec4143
Add SQLx query cache for tutorial_progress queries
tristantr Dec 5, 2025
053fae1
Improve wording for workspace tutorial
tristantr Dec 8, 2025
f4acaa1
Merge branch 'main' into tl/workspace-onboarding
rubenfiszel Dec 8, 2025
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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-- Remove skipped_all column from tutorial_progress table
ALTER TABLE tutorial_progress
DROP COLUMN skipped_all;
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
-- Add skipped_all column to tutorial_progress table
ALTER TABLE tutorial_progress
ADD COLUMN skipped_all BOOLEAN NOT NULL DEFAULT FALSE;

COMMENT ON COLUMN tutorial_progress.skipped_all IS 'Indicates if the user has skipped all tutorials (vs completing them all)';
4 changes: 4 additions & 0 deletions backend/windmill-api/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,8 @@ paths:
properties:
progress:
type: integer
skipped_all:
type: boolean
post:
summary: update tutorial progress
operationId: updateTutorialProgress
Expand All @@ -1350,6 +1352,8 @@ paths:
properties:
progress:
type: integer
skipped_all:
type: boolean
responses:
"200":
description: tutorial progress
Expand Down
29 changes: 20 additions & 9 deletions backend/windmill-api/src/users.rs
Original file line number Diff line number Diff line change
Expand Up @@ -562,31 +562,42 @@ async fn list_users_as_super_admin(
#[derive(Serialize, Deserialize)]
struct Progress {
progress: u64,
skipped_all: bool,
}
async fn get_tutorial_progress(
authed: ApiAuthed,
Extension(db): Extension<DB>,
) -> JsonResult<Progress> {
let res = sqlx::query_scalar!(
"SELECT progress::bigint FROM tutorial_progress WHERE email = $1",
let row = sqlx::query!(
"SELECT progress::bigint as progress, skipped_all FROM tutorial_progress WHERE email = $1",
authed.email
)
.fetch_optional(&db)
.await?
.flatten()
.unwrap_or_default() as u64;
Ok(Json(Progress { progress: res }))
.await?;

if let Some(row) = row {
Ok(Json(Progress {
progress: row.progress.unwrap_or_default() as u64,
skipped_all: row.skipped_all,
}))
} else {
Ok(Json(Progress {
progress: 0,
skipped_all: false,
}))
}
}

async fn update_tutorial_progress(
authed: ApiAuthed,
Extension(db): Extension<DB>,
Json(progress): Json<Progress>,
) -> Result<String> {
sqlx::query_scalar!(
"INSERT INTO tutorial_progress VALUES ($2, $1::bigint::bit(64)) ON CONFLICT (email) DO UPDATE SET progress = EXCLUDED.progress",
sqlx::query!(
"INSERT INTO tutorial_progress (email, progress, skipped_all) VALUES ($2, $1::bigint::bit(64), $3) ON CONFLICT (email) DO UPDATE SET progress = EXCLUDED.progress, skipped_all = EXCLUDED.skipped_all",
progress.progress as i64,
authed.email
authed.email,
progress.skipped_all
)
.execute(&db)
.await?;
Expand Down
60 changes: 19 additions & 41 deletions frontend/src/lib/components/AppTutorials.svelte
Original file line number Diff line number Diff line change
@@ -1,51 +1,29 @@
<script lang="ts">
import { skipAllTodos } from '$lib/tutorialUtils'
import AppTutorial from './tutorials/app/AppTutorial.svelte'
import TutorialRouter from './tutorials/TutorialRouter.svelte'
import BackgroundRunnablesTutorial from './tutorials/app/BackgroundRunnablesTutorial.svelte'
import ConnectionTutorial from './tutorials/app/ConnectionTutorial.svelte'

let backgroundRunnablesTutorial: BackgroundRunnablesTutorial | undefined = undefined
let connectionTutorial: ConnectionTutorial | undefined = undefined
let appTutorial: AppTutorial | undefined = undefined
let tutorialRouter: TutorialRouter | undefined = $state(undefined)

export function runTutorialById(id: string, options?: { skipStepsCount?: number }) {
if (id === 'backgroundrunnables') {
backgroundRunnablesTutorial?.runTutorial(options?.skipStepsCount)
} else if (id === 'connection') {
connectionTutorial?.runTutorial()
} else if (id === 'simpleapptutorial') {
appTutorial?.runTutorial()
}
}

function skipAll() {
skipAllTodos()
tutorialRouter?.runTutorialById(id, options)
}
</script>

<AppTutorial
bind:this={appTutorial}
on:error
on:skipAll={skipAll}
on:reload
index={7}
name="simpleapptutorial"
/>

<BackgroundRunnablesTutorial
bind:this={backgroundRunnablesTutorial}
on:error
on:skipAll={skipAll}
on:reload
index={5}
name="backgroundrunnables"
/>

<ConnectionTutorial
bind:this={connectionTutorial}
on:error
on:skipAll={skipAll}
on:reload
index={6}
name="connection"
<TutorialRouter
bind:this={tutorialRouter}
tutorials={[
{
id: 'backgroundrunnables',
component: BackgroundRunnablesTutorial,
name: 'backgroundrunnables',
supportsSkipSteps: true
},
{
id: 'connection',
component: ConnectionTutorial,
name: 'connection',
supportsSkipSteps: true
}
]}
/>
14 changes: 2 additions & 12 deletions frontend/src/lib/components/FlowBuilder.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import { initHistory, redo, undo } from '$lib/history.svelte'
import {
enterpriseLicense,
tutorialsToDo,
userStore,
workspaceStore,
usedTriggerKinds
Expand Down Expand Up @@ -61,11 +60,10 @@
import { getAllModules } from './flows/flowExplorer'
import { type FlowCopilotContext } from './copilot/flow'
import { loadFlowModuleState } from './flows/flowStateUtils.svelte'
import FlowBuilderTutorials from './FlowBuilderTutorials.svelte'
import Dropdown from '$lib/components/DropdownV2.svelte'
import FlowTutorials from './FlowTutorials.svelte'
import { ignoredTutorials } from './tutorials/ignoredTutorials'
import FlowHistory from './flows/FlowHistory.svelte'
import FlowEditorTutorial from './flows/FlowEditorTutorial.svelte'
import Summary from './Summary.svelte'
import type { FlowBuilderWhitelabelCustomUi } from './custom_ui'
import FlowYamlEditor from './flows/header/FlowYamlEditor.svelte'
Expand Down Expand Up @@ -805,8 +803,6 @@

if (tutorial) {
flowTutorials?.runTutorialById(tutorial)
} else if ($tutorialsToDo.includes(0) && !$ignoredTutorials.includes(0)) {
flowTutorials?.runTutorialById('action')
}
}

Expand Down Expand Up @@ -1110,13 +1106,7 @@
<Dropdown items={moreItems} />
{/if}
</div>
{#if customUi?.topBar?.tutorials != false}
<FlowBuilderTutorials
on:reload={() => {
renderCount += 1
}}
/>
{/if}
<FlowEditorTutorial />
{#if customUi?.topBar?.diff != false}
<Button
variant="default"
Expand Down
82 changes: 0 additions & 82 deletions frontend/src/lib/components/FlowBuilderTutorials.svelte

This file was deleted.

Loading
Loading