mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) Fix bugs when both welcomeTour and docTour are available
Summary: - Unify where in the code tours get initiated. - Avoid start a new tour while one is being started or is in progress. - Ignore welcome tour when on a doc that has a doc tour. - Fix tours when starting with a special page like Access Rules. - Remove mention of the no-longer-present "Give Feedback" button in the last message of the welcome tour. Test Plan: Add a browser test case that docTour preempts the welcome tour and shows no errors (this test case fails in multiple ways without the changes). Reviewers: georgegevoian Reviewed By: georgegevoian Differential Revision: https://phab.getgrist.com/D3330
This commit is contained in:
@@ -80,6 +80,11 @@ export function startOnBoarding(messages: IOnBoardingMsg[], onFinishCB: () => vo
|
||||
ctl.start().catch(reportError);
|
||||
}
|
||||
|
||||
// Returns whether some tour is currently active.
|
||||
export function isTourActive(): boolean {
|
||||
return !tourSingleton.isEmpty();
|
||||
}
|
||||
|
||||
class OnBoardingError extends Error {
|
||||
public name = 'OnBoardingError';
|
||||
constructor(message: string) {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import {GristDoc} from 'app/client/components/GristDoc';
|
||||
import {loadGristDoc} from 'app/client/lib/imports';
|
||||
import {urlState} from 'app/client/models/gristUrlState';
|
||||
import {getUserOrgPrefObs} from 'app/client/models/UserPrefs';
|
||||
import {getUserOrgPrefObs, markAsSeen} from 'app/client/models/UserPrefs';
|
||||
import {showExampleCard} from 'app/client/ui/ExampleCard';
|
||||
import {examples} from 'app/client/ui/ExampleInfo';
|
||||
import {createHelpTools, cssLinkText, cssPageEntry, cssPageEntryMain, cssPageEntrySmall,
|
||||
@@ -14,7 +13,7 @@ import {cssLink} from 'app/client/ui2018/links';
|
||||
import {menuAnnotate} from 'app/client/ui2018/menus';
|
||||
import {confirmModal} from 'app/client/ui2018/modals';
|
||||
import {userOverrideParams} from 'app/common/gristUrls';
|
||||
import {Computed, Disposable, dom, makeTestId, Observable, observable, styled} from 'grainjs';
|
||||
import {Disposable, dom, makeTestId, Observable, observable, styled} from 'grainjs';
|
||||
|
||||
const testId = makeTestId('test-tools-');
|
||||
|
||||
@@ -22,8 +21,6 @@ export function tools(owner: Disposable, gristDoc: GristDoc, leftPanelOpen: Obse
|
||||
const docPageModel = gristDoc.docPageModel;
|
||||
const isOwner = docPageModel.currentDoc.get()?.access === 'owners';
|
||||
const isOverridden = Boolean(docPageModel.userOverride.get());
|
||||
const hasDocTour = Computed.create(owner, use =>
|
||||
use(gristDoc.docModel.allTableIds.getObservable()).includes('GristDocTour'));
|
||||
const canViewAccessRules = observable(false);
|
||||
function updateCanViewAccessRules() {
|
||||
canViewAccessRules.set((isOwner && !isOverridden) ||
|
||||
@@ -106,20 +103,12 @@ export function tools(owner: Disposable, gristDoc: GristDoc, leftPanelOpen: Obse
|
||||
);
|
||||
}),
|
||||
// Show the 'Tour of this Document' button if a GristDocTour table exists.
|
||||
dom.maybe(hasDocTour, () =>
|
||||
dom.maybe(gristDoc.hasDocTour, () =>
|
||||
cssSplitPageEntry(
|
||||
cssPageEntryMain(
|
||||
cssPageLink(cssPageIcon('Page'),
|
||||
cssLinkText('Tour of this Document'),
|
||||
automaticHelpTool(
|
||||
async ({markAsSeen}) => {
|
||||
const gristDocModule = await loadGristDoc();
|
||||
await gristDocModule.startDocTour(gristDoc.docData, gristDoc.docComm, markAsSeen);
|
||||
},
|
||||
gristDoc,
|
||||
"seenDocTours",
|
||||
gristDoc.docId()
|
||||
),
|
||||
urlState().setLinkUrl({docTour: true}),
|
||||
testId('doctour'),
|
||||
),
|
||||
),
|
||||
@@ -165,24 +154,7 @@ function automaticHelpTool(
|
||||
return;
|
||||
}
|
||||
|
||||
// When the help is closed, if it's the first time it's dismissed, save this fact, to avoid
|
||||
// showing it automatically again in the future.
|
||||
function markAsSeen() {
|
||||
try {
|
||||
if (!seenIds.includes(itemId)) {
|
||||
const seen = new Set(seenIds);
|
||||
seen.add(itemId);
|
||||
prefObs.set([...seen].sort());
|
||||
}
|
||||
} catch (e) {
|
||||
// If we fail to save this preference, it's probably not worth alerting the user about,
|
||||
// so just log to console.
|
||||
// tslint:disable-next-line:no-console
|
||||
console.warn("Failed to save userPref " + prefKey, e);
|
||||
}
|
||||
}
|
||||
|
||||
showFunc({elem, reopen, markAsSeen});
|
||||
showFunc({elem, reopen, markAsSeen: () => markAsSeen(prefObs, itemId)});
|
||||
}
|
||||
|
||||
return [
|
||||
|
||||
@@ -63,8 +63,7 @@ export const welcomeTour: IOnBoardingMsg[] = [
|
||||
selector: '.tour-help-center',
|
||||
title: 'Flying higher',
|
||||
body: () => [
|
||||
dom('p', 'Use ', Key(GreyIcon('Help'), 'Help Center'), ' for documentation, videos, and tutorials.'),
|
||||
dom('p', 'Use ', Key(GreyIcon('Feedback'), 'Give Feedback'), ' for issues or questions.'),
|
||||
dom('p', 'Use ', Key(GreyIcon('Help'), 'Help Center'), ' for documentation or questions.'),
|
||||
],
|
||||
placement: 'right',
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user