Allow URLs with only a docID #768 (#771)

Co-authored-by: Florent FAYOLLE <florent.fayolle@beta.gouv.fr>
This commit is contained in:
Florent
2023-11-29 21:13:29 +01:00
committed by GitHub
parent de13a2fd7a
commit cf0cbb404e
12 changed files with 55 additions and 49 deletions

View File

@@ -41,7 +41,7 @@ export type PageType =
| "billing"
| "welcome"
| "account"
| "support-grist"
| "support"
| "activation";
const G = getBrowserGlobals('document', 'window');
@@ -316,7 +316,7 @@ export class AppModelImpl extends Disposable implements AppModel {
} else if (state.account) {
return 'account';
} else if (state.supportGrist) {
return 'support-grist';
return 'support';
} else if (state.activation) {
return 'activation';
} else {

View File

@@ -226,7 +226,7 @@ export class AccountWidget extends Disposable {
return menuItemLink(
t('Support Grist'),
cssHeartIcon('💛'),
urlState().setLinkUrl({supportGrist: 'support-grist'}),
urlState().setLinkUrl({supportGrist: 'support'}),
testId('usermenu-support-grist'),
);
}

View File

@@ -77,7 +77,7 @@ function createMainPage(appModel: AppModel, appObj: App) {
return dom.create(WelcomePage, appModel);
} else if (pageType === 'account') {
return domAsync(loadAccountPage().then(ap => dom.create(ap.AccountPage, appModel)));
} else if (pageType === 'support-grist') {
} else if (pageType === 'support') {
return domAsync(loadSupportGristPage().then(sgp => dom.create(sgp.SupportGristPage, appModel)));
} else if (pageType === 'activation') {
return domAsync(loadActivationPage().then(ap => dom.create(ap.ActivationPage, appModel)));

View File

@@ -22,7 +22,7 @@ type ButtonState =
| 'expanded';
type CardPage =
| 'support-grist'
| 'support'
| 'opted-in';
/**
@@ -45,7 +45,7 @@ export class SupportGristNudge extends Disposable {
this._buttonState = localStorageObs(
`u=${this._appModel.currentValidUser?.id ?? 0};supportGristNudge`, 'expanded'
) as Observable<ButtonState>;
this._currentPage = Observable.create(null, 'support-grist');
this._currentPage = Observable.create(null, 'support');
this._isClosed = Observable.create(this, false);
}
@@ -122,7 +122,7 @@ export class SupportGristNudge extends Disposable {
private _buildCard() {
return cssCard(
dom.domComputed(this._currentPage, page => {
if (page === 'support-grist') {
if (page === 'support') {
return this._buildSupportGristCardContent();
} else {
return this._buildOptedInCardContent();
@@ -205,7 +205,7 @@ function helpCenterLink() {
function supportGristLink() {
return cssLink(
t('Support Grist page'),
{href: urlState().makeUrl({supportGrist: 'support-grist'}), target: '_blank'},
{href: urlState().makeUrl({supportGrist: 'support'}), target: '_blank'},
);
}

View File

@@ -194,7 +194,7 @@ export class SupportGristPage extends Disposable {
const suffix = getPageTitleSuffix(getGristConfig());
switch (page) {
case undefined:
case 'support-grist': {
case 'support': {
return document.title = `Support Grist${suffix}`;
}
}

View File

@@ -43,7 +43,7 @@ export type ActivationPage = typeof ActivationPage.type;
export const LoginPage = StringUnion('signup', 'login', 'verified', 'forgot-password');
export type LoginPage = typeof LoginPage.type;
export const SupportGristPage = StringUnion('support-grist');
export const SupportGristPage = StringUnion('support');
export type SupportGristPage = typeof SupportGristPage.type;
// Overall UI style. "full" is normal, "singlePage" is a single page focused, panels hidden experience.
@@ -408,8 +408,8 @@ export function decodeUrl(gristConfig: Partial<GristLoadConfig>, location: Locat
state.activation = ActivationPage.parse(map.get('activation')) || 'activation';
}
if (map.has('welcome')) { state.welcome = WelcomePage.parse(map.get('welcome')); }
if (map.has('support-grist')) {
state.supportGrist = SupportGristPage.parse(map.get('support-grist')) || 'support-grist';
if (map.has('support')) {
state.supportGrist = SupportGristPage.parse(map.get('support')) || 'support';
}
if (sp.has('planType')) { state.params!.planType = sp.get('planType')!; }
if (sp.has('billingPlan')) { state.params!.billingPlan = sp.get('billingPlan')!; }

View File

@@ -212,6 +212,6 @@ export function attachAppEndpoint(options: AttachOptions): void {
// The * is a wildcard in express 4, rather than a regex symbol.
// See https://expressjs.com/en/guide/routing.html
app.get('/doc/:urlId([^/]+):remainder(*)', ...docMiddleware, docHandler);
app.get('/:urlId([^/]{12,})/:slug([^/]+):remainder(*)',
app.get('/:urlId([^/]{12,})(/:slug([^/]+):remainder(*))?',
...docMiddleware, docHandler);
}

View File

@@ -186,7 +186,7 @@ export class Telemetry implements ITelemetry {
public addPages(app: express.Application, middleware: express.RequestHandler[]) {
if (this._deploymentType === 'core') {
app.get('/support-grist', ...middleware, expressWrap(async (req, resp) => {
app.get('/support', ...middleware, expressWrap(async (req, resp) => {
return this._gristServer.sendAppPage(req, resp,
{path: 'app.html', status: 200, config: {}});
}));