From 67afd748178efe5896351adaa340c29f95800f18 Mon Sep 17 00:00:00 2001 From: Paul Fitzpatrick Date: Thu, 21 Mar 2024 13:02:25 -0400 Subject: [PATCH] (core) clean up snapshot list when access rules are in effect Summary: When access rules are in effect on a document, non-owners currently don't have access to snapshots. Previously when the document history tab is opened in this situation, an error toast would appear, along with a small message that was hard to see in dark mode. This change removes the toast and improves the message somewhat. Test Plan: updated test Reviewers: jarek Reviewed By: jarek Differential Revision: https://phab.getgrist.com/D4218 --- app/client/ui/DocHistory.ts | 18 ++++++++++++++++-- app/server/lib/ActiveDoc.ts | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/client/ui/DocHistory.ts b/app/client/ui/DocHistory.ts index 55c2f1a8..30ac2ff2 100644 --- a/app/client/ui/DocHistory.ts +++ b/app/client/ui/DocHistory.ts @@ -74,12 +74,24 @@ export class DocHistory extends Disposable implements IDomComponent { docApi.getSnapshots().then(result => snapshots.isDisposed() || snapshots.set(result.snapshots)).catch(err => { snapshotsDenied.set(true); - reportError(err); + // "cannot confirm access" is what we expect if snapshots + // are denied because of access rules. + if (!String(err).match(/cannot confirm access/)) { + reportError(err); + } }); return dom( 'div', + {tabIndex: '-1'}, // Voodoo needed to allow copying text. dom.maybe(snapshotsDenied, () => cssSnapshotDenied( - t("Snapshots are unavailable."), + dom( + 'p', + t("Snapshots are unavailable."), + ), + dom( + 'p', + t("Only owners have access to snapshots for documents with access rules."), + ), testId('doc-history-error'))), // Note that most recent snapshots are first. dom.domComputed(snapshots, (snapshotList) => snapshotList.map((snapshot, index) => { @@ -128,6 +140,8 @@ const cssSnapshot = styled('div', ` const cssSnapshotDenied = styled('div', ` margin: 8px 16px; + text-align: center; + color: ${theme.text}; `); const cssSnapshotTime = styled('div', ` diff --git a/app/server/lib/ActiveDoc.ts b/app/server/lib/ActiveDoc.ts index a7eb4c30..8f23ba12 100644 --- a/app/server/lib/ActiveDoc.ts +++ b/app/server/lib/ActiveDoc.ts @@ -1715,7 +1715,7 @@ export class ActiveDoc extends EventEmitter { public async getSnapshots(docSession: OptDocSession, skipMetadataCache?: boolean): Promise { if (await this._granularAccess.hasNuancedAccess(docSession)) { - throw new Error('cannot confirm access to snapshots'); + throw new Error('cannot confirm access to snapshots because of access rules'); } return this._docManager.storageManager.getSnapshots(this.docName, skipMetadataCache); }