Skip to content

Commit 6478ced

Browse files
rubenvdlindeConduction Release Bot
andauthored
feat(walkthrough): a first-visit tour built from this app's own menu (#484)
* feat(walkthrough): a first-visit tour built from this app's own menu ADR-043. The app had no walkthrough, so a new user arrived on a shell with no orientation at all. Every step targets a route READ FROM THIS MANIFEST, never invented. CnWalkthrough resolves target {kind: nav-item, ref} by querying [data-cn-route=<ref>], which CnAppNav emits from the ROUTE - so a tour pointing at a menu id that differs from its route still renders, as a centred anchorless coachmark that points at nothing. Verified: every ref resolves to a page this manifest declares. Where a menu label is a translation KEY rather than a sentence, the copy uses the key's last segment as a word. Printing launchpad.menu.dashboards at a user is worse than useless, and falling back to the route gives 'Click dashboard-detail in the menu' - an internal identifier read aloud. Verified: manifest validates against schema 2.26.0, every target ref resolves, and no raw translation key reaches the copy. * fix(walkthrough): point the tour at flows, and translate its copy gate-70 walkthrough-flows-stop - this app ships a flows page and no tour step targeted it. The gate's own measurement is why it exists: across 20 manifests, 12 apps shipped a flows page and exactly ONE tour mentioned it, so the automation surface was discoverable only by someone who already knew. Detected the way the gate detects it - type:'flows' OR the migrated form, an index over config.entitySource:'flows'. Matching on type alone would miss every app the flow-page migration touched, which is all of them. The step advances on route-match and sets allowManualNext. The same gate fails a step advancing only on object-created: that turns 'here is where flows live' into 'build an automation before you may continue', and a tour nobody can finish is worse than one that never mentions flows. gate-102 manifest-l10n-coverage - the tour's titles, bodies and tasks had no l10n/nl.json key. Added, and the browser catalogue rebuilt where the app ships one, because the browser reads nl.js rather than nl.json. * style(walkthrough): drop the em-dash from the flows step gate-96 (manifest-copy-style) fails this: voice.md section 8 is unambiguous — no em-dashes, Conduction strips them fleet-wide. The nl.json KEY is the English string, so it is renamed with it; leaving the key behind would orphan the Dutch translation of a string that still ships. The Dutch VALUE carried the same em-dash and gets the same treatment — the gate only counts manifest strings, but it is the same user-facing sentence. Note for a later sweep: this app's nl.json still holds 16 other em-dash strings from Vue copy. They are outside this gate's scope (it reads manifest strings) and outside this PR's. * fix(l10n): refresh the browser catalogue after the em-dash rename check:l10n-js reported 'Stale browser catalogue: l10n/nl.js'. Renaming the key in nl.json without nl.js leaves the two halves of the same catalogue disagreeing, and the runtime reads the .js one. --------- Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
1 parent c2d7977 commit 6478ced

3 files changed

Lines changed: 122 additions & 0 deletions

File tree

l10n/nl.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
OC.L10N.register(
22
"keepiq",
33
{
4+
"Getting started": "Aan de slag",
5+
"A short tour of the main screens. It takes under a minute, and you can close it at any point and pick it up again from the help menu.": "Een korte rondleiding langs de belangrijkste schermen. Het duurt minder dan een minuut en je kunt op elk moment stoppen en later verder gaan via het helpmenu.",
6+
"Open Dashboard from the menu.": "Open Dashboard via het menu.",
7+
"Click Dashboard in the menu": "Klik op Dashboard in het menu",
8+
"Open All secrets from the menu.": "Open All secrets via het menu.",
9+
"Click All secrets in the menu": "Klik op All secrets in het menu",
10+
"Open Features & roadmap from the menu.": "Open Features & roadmap via het menu.",
11+
"Click Features & roadmap in the menu": "Klik op Features & roadmap in het menu",
12+
"Open My activity from the menu.": "Open My activity via het menu.",
13+
"Click My activity in the menu": "Klik op My activity in het menu",
14+
"Flows automate the repetitive parts of this app. Have a look, though you do not have to build one now.": "Flows automatiseren het repeterende werk in deze app. Kijk gerust rond, je hoeft er nu geen te maken.",
15+
"Open Flows from the menu": "Open Flows via het menu",
416
"Take over as vault administrator": "Overnemen als kluisbeheerder",
517
"Select {name}": "{name} selecteren",
618
"Could not load the password policy.": "Kan het wachtwoordbeleid niet laden.",

l10n/nl.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
{
22
"translations": {
3+
"Getting started": "Aan de slag",
4+
"A short tour of the main screens. It takes under a minute, and you can close it at any point and pick it up again from the help menu.": "Een korte rondleiding langs de belangrijkste schermen. Het duurt minder dan een minuut en je kunt op elk moment stoppen en later verder gaan via het helpmenu.",
5+
"Open Dashboard from the menu.": "Open Dashboard via het menu.",
6+
"Click Dashboard in the menu": "Klik op Dashboard in het menu",
7+
"Open All secrets from the menu.": "Open All secrets via het menu.",
8+
"Click All secrets in the menu": "Klik op All secrets in het menu",
9+
"Open Features & roadmap from the menu.": "Open Features & roadmap via het menu.",
10+
"Click Features & roadmap in the menu": "Klik op Features & roadmap in het menu",
11+
"Open My activity from the menu.": "Open My activity via het menu.",
12+
"Click My activity in the menu": "Klik op My activity in het menu",
13+
"Flows automate the repetitive parts of this app. Have a look, though you do not have to build one now.": "Flows automatiseren het repeterende werk in deze app. Kijk gerust rond, je hoeft er nu geen te maken.",
14+
"Open Flows from the menu": "Open Flows via het menu",
315
"Take over as vault administrator": "Overnemen als kluisbeheerder",
416
"Select {name}": "{name} selecteren",
517
"Could not load the password policy.": "Kan het wachtwoordbeleid niet laden.",

src/manifest.json

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,103 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/ConductionNL/nextcloud-vue/main/src/schemas/app-manifest-v2.schema.json",
3+
"walkthrough": {
4+
"enabled": true,
5+
"version": 1,
6+
"completionConfigKey": "walkthrough_completed_version",
7+
"tours": [
8+
{
9+
"id": "keepiq:getting-started",
10+
"title": "Getting started",
11+
"trigger": "first-visit",
12+
"steps": [
13+
{
14+
"id": "welcome",
15+
"placement": "center",
16+
"title": "Welcome to Keepiq",
17+
"body": "A short tour of the main screens. It takes under a minute, and you can close it at any point and pick it up again from the help menu.",
18+
"target": {
19+
"kind": "page",
20+
"ref": "Dashboard"
21+
},
22+
"advanceOn": {
23+
"type": "manual"
24+
}
25+
},
26+
{
27+
"id": "go-dashboard",
28+
"placement": "right",
29+
"body": "Open Dashboard from the menu.",
30+
"task": "Click Dashboard in the menu",
31+
"target": {
32+
"kind": "nav-item",
33+
"ref": "Dashboard"
34+
},
35+
"advanceOn": {
36+
"type": "route-match",
37+
"route": "Dashboard"
38+
}
39+
},
40+
{
41+
"id": "go-secretlist",
42+
"placement": "right",
43+
"body": "Open All secrets from the menu.",
44+
"task": "Click All secrets in the menu",
45+
"target": {
46+
"kind": "nav-item",
47+
"ref": "SecretList"
48+
},
49+
"advanceOn": {
50+
"type": "route-match",
51+
"route": "SecretList"
52+
}
53+
},
54+
{
55+
"id": "go-featuresroadmap",
56+
"placement": "right",
57+
"body": "Open Features & roadmap from the menu.",
58+
"task": "Click Features & roadmap in the menu",
59+
"target": {
60+
"kind": "nav-item",
61+
"ref": "FeaturesRoadmap"
62+
},
63+
"advanceOn": {
64+
"type": "route-match",
65+
"route": "FeaturesRoadmap"
66+
}
67+
},
68+
{
69+
"id": "go-personalactivity",
70+
"placement": "right",
71+
"body": "Open My activity from the menu.",
72+
"task": "Click My activity in the menu",
73+
"target": {
74+
"kind": "nav-item",
75+
"ref": "PersonalActivity"
76+
},
77+
"advanceOn": {
78+
"type": "route-match",
79+
"route": "PersonalActivity"
80+
}
81+
},
82+
{
83+
"id": "go-flows",
84+
"placement": "right",
85+
"body": "Flows automate the repetitive parts of this app. Have a look, though you do not have to build one now.",
86+
"task": "Open Flows from the menu",
87+
"target": {
88+
"kind": "nav-item",
89+
"ref": "Flows"
90+
},
91+
"advanceOn": {
92+
"type": "route-match",
93+
"route": "Flows"
94+
},
95+
"allowManualNext": true
96+
}
97+
]
98+
}
99+
]
100+
},
3101
"version": "1.0.0",
4102
"dependencies": [],
5103
"nav": {

0 commit comments

Comments
 (0)