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}