diff --git a/components/contextmenu.tsx b/components/contextmenu.tsx index 560df0fa..a6e73cf8 100644 --- a/components/contextmenu.tsx +++ b/components/contextmenu.tsx @@ -54,6 +54,7 @@ export default interface ContextMenuProps { target: OrgRoamNode | string | null nodeType?: string coordinates: { [direction: string]: number | undefined } + readonlyMode: boolean handleLocal: (node: OrgRoamNode, add: string) => void menuClose: () => void scope: { nodeIds: string[] } @@ -71,6 +72,7 @@ export const ContextMenu = (props: ContextMenuProps) => { target, nodeType, coordinates, + readonlyMode, handleLocal, menuClose, scope, @@ -132,7 +134,7 @@ export const ContextMenu = (props: ContextMenuProps) => { > Open in Emacs - ) : ( + ) : !readonlyMode && ( } onClick={() => createNodeInEmacs(target, webSocket)}> Create node @@ -183,7 +185,7 @@ export const ContextMenu = (props: ContextMenuProps) => { > Preview - {target?.level === 0 && ( + {!readonlyMode && target?.level === 0 && ( } diff --git a/org-roam-ui.el b/org-roam-ui.el index e13349b2..297997c4 100644 --- a/org-roam-ui.el +++ b/org-roam-ui.el @@ -131,6 +131,11 @@ Defaults to #'browse-url." :group 'org-roam-ui :type 'function) +(defcustom org-roam-ui-readonly-mode nil + "If true, 'org-roam-ui' will open in readonly mode." + :group 'org-roam-ui + :type 'boolean) + ;;Hooks (defcustom org-roam-ui-before-open-node-functions nil @@ -255,20 +260,22 @@ Takes _WS and FRAME as arguments." "Delete a node when receiving DATA from the websocket. TODO: Be able to delete individual nodes." - (progn - (message "Deleted %s" (alist-get 'file data)) - (delete-file (alist-get 'file data)) - (org-roam-db-sync) - (org-roam-ui--send-graphdata))) + (if (not org-roam-ui-readonly-mode) + (progn + (message "Deleted %s" (alist-get 'file data)) + (delete-file (alist-get 'file data)) + (org-roam-db-sync) + (org-roam-ui--send-graphdata)))) (defun org-roam-ui--on-msg-create-node (data) "Create a node when receiving DATA from the websocket." - (progn - (if (and (fboundp #'orb-edit-note) (alist-get 'ROAM_REFS data)) + (if (not org-roam-ui-readonly-mode) + (progn + (if (and (fboundp #'orb-edit-note) (alist-get 'ROAM_REFS data)) (orb-edit-note (alist-get 'id data))) - (org-roam-capture- - :node (org-roam-node-create :title (alist-get 'title data)) - :props '(:finalize find-file)))) + (org-roam-capture- + :node (org-roam-node-create :title (alist-get 'title data)) + :props '(:finalize find-file))))) (defun org-roam-ui--ws-on-close (_websocket) "What to do when _WEBSOCKET to org-roam-ui is closed." @@ -601,6 +608,8 @@ from all other links." ("useInheritance" . ,use-inheritance) ("roamDir" . ,org-roam-directory) + ("readonlyMode" . + ,org-roam-ui-readonly-mode) ("katexMacros" . ,org-roam-ui-latex-macros)))))))) (defun org-roam-ui-sql-to-alist (column-names rows) diff --git a/pages/index.tsx b/pages/index.tsx index 8770283f..09cd46eb 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -85,6 +85,7 @@ export interface EmacsVariables { katexMacros?: { [key: string]: string } attachDir?: string useInheritance?: boolean + readonlyMode?: boolean subDirs: string[] } export type Tags = string[] @@ -710,6 +711,7 @@ export function GraphPage() { target={contextMenuTarget} background={false} coordinates={contextPos} + readonlyMode={emacsVariables.readonlyMode || false} handleLocal={handleLocal} menuClose={contextMenu.onClose.bind(contextMenu)} webSocket={WebSocketRef.current}