Skip to content

Commit 74aae3a

Browse files
committed
feat(search): cut/copy search results
1 parent 724b9ec commit 74aae3a

18 files changed

Lines changed: 290 additions & 33 deletions
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export const sortSectionsByDepthDesc = (keys: string[]): string[] => {
2+
return keys.sort((a, b) => {
3+
const aParts = a.split('.');
4+
const bParts = b.split('.');
5+
6+
return bParts.length - aParts.length;
7+
});
8+
};

src/lang/lang.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export const lang = {
5454
hkg_delete_cards: 'Delete cards',
5555
modals_snapshots_deleted_card: 'Deleted card ',
5656

57-
// copy
57+
// clipboard
5858
cm_copy: 'Copy',
5959
cm_copy_branches: 'Copy branches',
6060
cm_copy_branch: 'Copy branch',
@@ -66,8 +66,19 @@ export const lang = {
6666
hk_copy_node_unformatted: 'Copy branch as plain text',
6767
hk_copy_node_without_subitems: 'Copy without subitems',
6868
cm_copy_link_to_block: 'Copy link to block',
69+
toolbar_copy_search_results: 'Copy search results',
70+
toolbar_copy_search_results_wo_subitems:
71+
'Copy search results without sub-items',
72+
toolbar_cut_search_results: 'Cut search results',
6973
hkg_clipboard: 'Clipboard',
70-
hk_notice_copy: (
74+
modals_snapshots_cut_card: 'Cut card ',
75+
cm_cut: 'Cut branch',
76+
hk_cut_node: 'Cut branch',
77+
cm_paste: 'Paste',
78+
hk_paste_node: 'Paste branch',
79+
modals_snapshots_pasted_card: 'Pasted card ',
80+
error_cant_paste: 'Paste command failed. Try pasting directly into a card',
81+
/*hk_notice_copy: (
7182
size: number,
7283
formatted: boolean,
7384
type: 'branch' | 'section',
@@ -84,16 +95,7 @@ export const lang = {
8495
: size === 1
8596
? null
8697
: size + ' sections copied to clipboard';
87-
},
88-
89-
// cut paste
90-
cm_cut: 'Cut branch',
91-
hk_cut_node: 'Cut branch',
92-
cm_paste: 'Paste',
93-
hk_paste_node: 'Paste branch',
94-
modals_snapshots_cut_card: 'Cut card ',
95-
modals_snapshots_pasted_card: 'Pasted card ',
96-
error_cant_paste: 'Paste command failed. Try pasting directly into a card',
98+
},*/
9799

98100
// merge
99101
cm_merge_above: 'Merge with branch above',
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Sections } from 'src/stores/document/document-state-type';
2+
import { sortSectionsByDepthDesc } from 'src/helpers/sort-sections-by-depth';
3+
4+
export const sortNodeIdsByDepthDesc = (sections: Sections, ids: string[]) => {
5+
const sectionNumbers = ids.map((id) => sections.id_section[id]);
6+
const sortedSections = sortSectionsByDepthDesc(sectionNumbers);
7+
return sortedSections.map((section) => sections.section_id[section]);
8+
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { Sections } from 'src/stores/document/document-state-type';
2+
import { sortSections } from 'src/helpers/sort-sections';
3+
4+
export const sortNodeIdsBySectionNumber = (
5+
sections: Sections,
6+
ids: string[],
7+
) => {
8+
const pinnedSections = ids.map((id) => sections.id_section[id]);
9+
const sortedSections = sortSections(pinnedSections);
10+
return sortedSections.map((section) => sections.section_id[section]);
11+
};

src/stores/document/reducers/pinned-nodes/pin-node.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,7 @@ import {
22
PinnedNodesState,
33
Sections,
44
} from 'src/stores/document/document-state-type';
5-
import { sortSections } from 'src/helpers/sort-sections';
6-
7-
export const sortNodeIdsBySectionNumber = (
8-
sections: Sections,
9-
ids: string[],
10-
) => {
11-
const pinnedSections = ids.map((id) => sections.id_section[id]);
12-
const sortedSections = sortSections(pinnedSections);
13-
return sortedSections.map((section) => sections.section_id[section]);
14-
};
5+
import { sortNodeIdsBySectionNumber } from 'src/lib/tree-utils/sort/sort-node-ids-by-section-number';
156

167
export type PinNodeAction = {
178
type: 'document/pinned-nodes/pin';

src/stores/document/reducers/pinned-nodes/remove-stale-pinned-nodes.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {
2-
Sections,
32
PinnedNodesState,
3+
Sections,
44
} from 'src/stores/document/document-state-type';
5-
import { sortNodeIdsBySectionNumber } from 'src/stores/document/reducers/pinned-nodes/pin-node';
5+
6+
import { sortNodeIdsBySectionNumber } from 'src/lib/tree-utils/sort/sort-node-ids-by-section-number';
67

78
export type RemoveStalePinnedNodesAction = {
89
type: 'document/pinned-nodes/remove-stale-nodes';

src/stores/view/default-view-state.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const defaultViewState = (): ViewState => ({
66
results: new Map(),
77
searching: false,
88
showInput: false,
9-
fuzzySearch: true,
9+
fuzzySearch: false,
1010
showAllNodes: true,
1111
},
1212
ui: {

src/stores/view/subscriptions/actions/update-search-results.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ export const updateSearchResults = debounce((view: LineageView) => {
3131
},
3232
});
3333

34-
const newSearchResults = Array.from(results).sort().join('');
34+
const newSearchResults = Array.from(results.keys()).sort().join('');
3535
const previousSearchResults = Array.from(viewState.search.results.keys())
3636
.sort()
3737
.join('');
3838
if (previousSearchResults !== newSearchResults) {
3939
updateActiveNodeAfterSearch(view, Array.from(results.keys()));
4040
}
41-
}, 350);
41+
}, 100);
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import { LineageView } from 'src/view/view';
22
import { getActiveNodes } from 'src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/clipboard/get-active-nodes';
3+
import { copyNodesToClipboard } from 'src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/clipboard/copy-nodes-to-clipboard';
34

45
export const copyActiveNodesToClipboard = async (
56
view: LineageView,
67
isInSidebar: boolean,
78
) => {
89
const nodes = getActiveNodes(view, isInSidebar);
9-
const text = nodes
10-
.map((id) => view.documentStore.getValue().document.content[id].content)
11-
.join('\n\n');
12-
await navigator.clipboard.writeText(text);
10+
await copyNodesToClipboard(view, nodes);
1311
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { LineageView } from 'src/view/view';
2+
import { sortNodeIdsBySectionNumber } from 'src/lib/tree-utils/sort/sort-node-ids-by-section-number';
3+
import { copyNodesToClipboard } from 'src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/clipboard/copy-nodes-to-clipboard';
4+
5+
export const copyFlatSearchResultsToClipboard = async (view: LineageView) => {
6+
const results = Array.from(view.viewStore.getValue().search.results.keys());
7+
const sortedResults = sortNodeIdsBySectionNumber(
8+
view.documentStore.getValue().sections,
9+
results,
10+
);
11+
await copyNodesToClipboard(view, sortedResults, true);
12+
};

0 commit comments

Comments
 (0)