Skip to content

[ENG-1890] Add Publish tab to Roam query-results share dialog#1133

Open
sid597 wants to merge 4 commits into
mainfrom
eng-1890-add-publish-tab-to-roam-query-results-share-dialog
Open

[ENG-1890] Add Publish tab to Roam query-results share dialog#1133
sid597 wants to merge 4 commits into
mainfrom
eng-1890-add-publish-tab-to-roam-query-results-share-dialog

Conversation

@sid597

@sid597 sid597 commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

https://www.loom.com/share/d7cd9e76c02f46c6ad13fcda24088b90

Adds a "Publish" tab to the Roam Share Data / query-results dialog (Export.tsx), gated on isSyncEnabled(), that grants a sharing group access to the selected query-result discourse nodes via the existing SpaceAccess/ResourceAccess group-targeted model.

  • Promote getMyGroups/getAvailableGroupIds/MyGroup from Obsidian's importNodes util to shared @repo/database/lib/groups; Obsidian's file becomes a behaviour-preserving re-export shim.
  • New apps/roam/src/utils/publishNodesToGroups.ts: grants access only to nodes already synced (present in my_concepts) and reports the rest as not-yet-synced; upserts SpaceAccess (partial) + ResourceAccess for each node and its schema concept.
  • PublishPanel with multi-group picker, non-discourse-result filter, and a success/skipped/failed count toast.

Open in Devin Review

Adds a "Publish" tab to the Roam Share Data / query-results dialog
(Export.tsx), gated on isSyncEnabled(), that grants a sharing group
access to the selected query-result discourse nodes via the existing
SpaceAccess/ResourceAccess group-targeted model.

- Promote getMyGroups/getAvailableGroupIds/MyGroup from Obsidian's
  importNodes util to shared @repo/database/lib/groups; Obsidian's file
  becomes a behaviour-preserving re-export shim.
- New apps/roam/src/utils/publishNodesToGroups.ts: grants access only to
  nodes already synced (present in my_concepts) and reports the rest as
  not-yet-synced; upserts SpaceAccess (partial) + ResourceAccess for each
  node and its schema concept.
- PublishPanel with multi-group picker, non-discourse-result filter, and
  a success/skipped/failed count toast.
@linear-code

linear-code Bot commented Jun 19, 2026

Copy link
Copy Markdown

ENG-1890

@vercel

vercel Bot commented Jun 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
discourse-graph Skipped Skipped Jun 23, 2026 5:33pm

Request Review

@supabase

supabase Bot commented Jun 19, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project zytfjzqyijgagqxrzbmz because there are no changes detected in packages/database/supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 4 potential issues.

View 1 additional finding in Devin Review.

Open in Devin Review

Comment thread apps/roam/src/components/Export.tsx Outdated
Comment thread apps/roam/src/utils/publishNodesToGroups.ts
Comment thread apps/roam/src/utils/publishNodesToGroups.ts
Comment thread apps/roam/src/utils/publishNodesToGroups.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 75ec5a3916

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/roam/src/utils/publishNodesToGroups.ts
@graphite-app

graphite-app Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

PR size/scope check

This PR is over our review-size guideline.

  • Recommended: ~200 lines changed
  • Acceptable limit: up to 400 lines when well-scoped/self-contained
  • Preferred file count: fewer than 5 files

Please split this into smaller PRs unless there is a clear reason the changes need to land together.

If keeping it as one PR, please add a brief justification covering:

  • What single problem this PR solves
  • Why the files/changes are coupled

@sid597 sid597 requested review from maparent and mdroidian and removed request for maparent and mdroidian June 23, 2026 18:14
@@ -0,0 +1,49 @@
import type { DGSupabaseClient } from "./client";

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a shared-home move for existing Obsidian group helpers, not new group behavior. Roam now needs the same getMyGroups / getAvailableGroupIds logic for publishing, and importing from apps/obsidian would create an app-
to-app dependency.

);
};

const getResultPublishNodes = (result: Result): PublishNode[] => {

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Roam query results can return wrapper pages whose UID is not itself a discourse node. In that case, the visible row points at the real DG page through :block/refs, so publish resolves referenced user-backed DG nodes before granting access.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sid597 Can you show an example of this where we wouldn't be expecting to export the uid of the queried row?


const getResultPublishNodes = (result: Result): PublishNode[] => {
const directNode = findDiscourseNode({ uid: result.uid });
if (directNode && directNode.backedBy === "user")

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We still require backedBy === "user" here because sync only uploads user-backed discourse node types; default Page/Block matches should not become publishable.

@sid597 sid597 requested review from maparent and mdroidian June 23, 2026 18:26

const { publishableNodes, nonDiscourseCount } = useMemo(() => {
if (!syncEnabled)
return { publishableNodes: [] as PublishNode[], nonDiscourseCount: 0 };

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoid asserting when possible. If not possible, make a comment explaining why we must resort to asserting.

);
};

const getResultPublishNodes = (result: Result): PublishNode[] => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sid597 Can you show an example of this where we wouldn't be expecting to export the uid of the queried row?

@maparent maparent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@maparent maparent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved, but then saw missing functionality: When a node is already shared to a group, the button for that group should be already checked.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants