Skip to content

Commit 61c3170

Browse files
committed
enhance(view-cm): add eject document action
1 parent e2f5ff6 commit 61c3170

7 files changed

Lines changed: 64 additions & 2 deletions

File tree

src/lang/lang.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ export const lang = {
141141

142142
// export
143143
cm_export_document: 'Export document',
144+
cm_eject_document: 'Eject document',
144145
cm_export_selection: 'Export',
145146
cm_export_section: 'Export section',
146147
cm_export_branch_with_subitems: 'Export branch',

src/obsidian/commands/add-commands.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { exportDocument } from 'src/obsidian/commands/helpers/export-document/ex
1616
import { onPluginError } from 'src/lib/store/on-plugin-error';
1717
import invariant from 'tiny-invariant';
1818
import { sortChildNodes } from 'src/view/actions/context-menu/card-context-menu/helpers/sort-child-nodes';
19+
import { ejectDocument } from 'src/obsidian/commands/helpers/export-document/eject-document';
1920

2021
const createCommands = (plugin: Lineage) => {
2122
const commands: (Omit<Command, 'id' | 'callback'> & {
@@ -200,6 +201,18 @@ const createCommands = (plugin: Lineage) => {
200201
},
201202
});
202203

204+
commands.push({
205+
name: lang.cm_eject_document,
206+
icon: 'file-text',
207+
checkCallback: (checking) => {
208+
const view = getActiveLineageView(plugin);
209+
if (checking) {
210+
return Boolean(view);
211+
}
212+
ejectDocument(view!);
213+
},
214+
});
215+
203216
commands.push({
204217
name: lang.cmd_toggle_minimap,
205218
icon: 'panel-right',
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { onPluginError } from 'src/lib/store/on-plugin-error';
2+
import { mapDocumentToText } from 'src/obsidian/commands/helpers/export-document/map-document-to-text';
3+
import { getDocumentFormat } from 'src/obsidian/events/workspace/helpers/get-document-format';
4+
import { LineageView } from 'src/view/view';
5+
import { saveNodeContent } from 'src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/save-node-content';
6+
import { setViewType } from 'src/obsidian/events/workspace/actions/set-view-type';
7+
import { toggleObsidianViewType } from 'src/obsidian/events/workspace/effects/toggle-obsidian-view-type';
8+
9+
export const ejectDocument = async (view: LineageView) => {
10+
try {
11+
const file = view.file;
12+
if (!file) return;
13+
if (!file.parent) return;
14+
15+
const viewState = view.viewStore.getValue();
16+
const isEditing = Boolean(viewState.document.editing.activeNodeId);
17+
if (isEditing) {
18+
saveNodeContent(view);
19+
setTimeout(() => {
20+
ejectDocument(view);
21+
}, 100);
22+
return;
23+
}
24+
const fileData = await view.plugin.app.vault.read(file);
25+
const format = getDocumentFormat(view);
26+
const text = mapDocumentToText(fileData, format);
27+
await view.plugin.app.vault.modify(file, text);
28+
toggleObsidianViewType(view.plugin, view.leaf, 'markdown');
29+
setViewType(view.plugin, file.path, 'markdown');
30+
} catch (e) {
31+
onPluginError(e, 'command', { type: 'export-document' });
32+
}
33+
};

src/obsidian/commands/helpers/export-document/export-document.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const exportDocument = async (view: LineageView) => {
2323
}
2424
const fileData = await view.plugin.app.vault.read(file);
2525
const format = getDocumentFormat(view);
26-
const output = mapDocumentToText(fileData, file.basename, format);
26+
const output = mapDocumentToText(fileData, format);
2727
const newFile = await createNewFile(
2828
view.plugin,
2929
file.parent,

src/obsidian/commands/helpers/export-document/map-document-to-text.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { htmlElementToJson } from 'src/lib/data-conversion/x-to-json/html-elemen
77

88
export const mapDocumentToText = (
99
fileData: string,
10-
basename: string,
1110
format: LineageDocumentFormat,
1211
) => {
1312
const { data, frontmatter } = extractFrontmatter(fileData);

src/obsidian/context-menu/render-context-menu.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export type MenuItemObject =
77
icon: string;
88
disabled?: boolean;
99
checked?: boolean;
10+
dangerous?: boolean;
1011
} & (
1112
| {
1213
submenu: MenuItemObject[];
@@ -35,6 +36,12 @@ const addMenuItem = (menu: Menu, menuItem: MenuItemObject) => {
3536
} else {
3637
item.onClick(menuItem.action);
3738
}
39+
if (menuItem.dangerous) {
40+
if ('dom' in item) {
41+
// @ts-ignore
42+
item.dom.classList.add('is-warning');
43+
}
44+
}
3845
});
3946
}
4047
};

src/view/actions/context-menu/view-context-menu/show-view-context-menu.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { setDocumentFormat } from 'src/obsidian/events/workspace/actions/set-doc
99
import { exportDocument } from 'src/obsidian/commands/helpers/export-document/export-document';
1010
import { saveNodeContent } from 'src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/save-node-content';
1111
import { hasNHeadings } from 'src/lib/format-detection/has-n-headings';
12+
import { ejectDocument } from 'src/obsidian/commands/helpers/export-document/eject-document';
1213

1314
export const showViewContextMenu = (event: MouseEvent, view: LineageView) => {
1415
const file = view.file;
@@ -75,6 +76,14 @@ export const showViewContextMenu = (event: MouseEvent, view: LineageView) => {
7576
exportDocument(view);
7677
},
7778
},
79+
{
80+
title: lang.cm_eject_document,
81+
icon: 'file-text',
82+
action: () => {
83+
ejectDocument(view);
84+
},
85+
dangerous: true,
86+
},
7887
];
7988

8089
renderContextMenu(event, menuItems);

0 commit comments

Comments
 (0)