@gravity-ui/markdown-editor 15.22.1 → 15.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/bundle/ToolbarView.js +1 -2
- package/build/cjs/bundle/ToolbarView.js.map +1 -1
- package/build/cjs/bundle/settings/index.js +1 -4
- package/build/cjs/bundle/settings/index.js.map +1 -1
- package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js +1 -3
- package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/commands/backspace.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmTable/commands/backspace.js +61 -84
- package/build/cjs/extensions/yfm/YfmTable/commands/backspace.js.map +1 -1
- package/build/cjs/i18n/search/en.json +5 -2
- package/build/cjs/i18n/search/index.d.ts +4 -1
- package/build/cjs/i18n/search/ru.json +5 -2
- package/build/cjs/markup/codemirror/search-plugin/plugin.d.ts +2 -0
- package/build/cjs/markup/codemirror/search-plugin/plugin.js +13 -0
- package/build/cjs/markup/codemirror/search-plugin/plugin.js.map +1 -1
- package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +3 -0
- package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js +9 -0
- package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +1 -0
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.css +1 -0
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.d.ts +2 -0
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js +12 -2
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js.map +1 -1
- package/build/cjs/toolbar/ToolbarListButton.js +1 -3
- package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/bundle/ToolbarView.js +1 -2
- package/build/esm/bundle/ToolbarView.js.map +1 -1
- package/build/esm/bundle/settings/index.js +1 -4
- package/build/esm/bundle/settings/index.js.map +1 -1
- package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +1 -3
- package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/commands/backspace.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmTable/commands/backspace.js +60 -83
- package/build/esm/extensions/yfm/YfmTable/commands/backspace.js.map +1 -1
- package/build/esm/i18n/search/en.json +5 -2
- package/build/esm/i18n/search/index.d.ts +4 -1
- package/build/esm/i18n/search/ru.json +5 -2
- package/build/esm/markup/codemirror/search-plugin/plugin.d.ts +2 -0
- package/build/esm/markup/codemirror/search-plugin/plugin.js +14 -1
- package/build/esm/markup/codemirror/search-plugin/plugin.js.map +1 -1
- package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +3 -0
- package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js +4 -0
- package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +1 -0
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.css +1 -0
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.d.ts +2 -0
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js +12 -2
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js.map +1 -1
- package/build/esm/toolbar/ToolbarListButton.js +1 -3
- package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +1 -0
- package/package.json +1 -1
- package/build/cjs/common/layout.d.ts +0 -3
- package/build/cjs/common/layout.js +0 -7
- package/build/cjs/common/layout.js.map +0 -1
- package/build/cjs/utils/get-target-z-index.d.ts +0 -1
- package/build/cjs/utils/get-target-z-index.js +0 -13
- package/build/cjs/utils/get-target-z-index.js.map +0 -1
- package/build/esm/common/layout.d.ts +0 -3
- package/build/esm/common/layout.js +0 -4
- package/build/esm/common/layout.js.map +0 -1
- package/build/esm/utils/get-target-z-index.d.ts +0 -1
- package/build/esm/utils/get-target-z-index.js +0 -10
- package/build/esm/utils/get-target-z-index.js.map +0 -1
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { chainCommands } from
|
|
2
|
-
import { TextSelection } from
|
|
3
|
-
import {
|
|
1
|
+
import { chainCommands } from "../../../../pm/commands.js";
|
|
2
|
+
import { TextSelection } from "../../../../pm/state.js";
|
|
3
|
+
import { pType } from "../../../base/specs.js";
|
|
4
|
+
import { range } from "../../../../lodash.js";
|
|
5
|
+
import { isTableCellNode, isTableNode, isTableRowNode } from "../../../../table-utils/index.js";
|
|
6
|
+
import { TableDesc } from "../../../../table-utils/table-desc.js";
|
|
4
7
|
import { isNodeSelection, isTextSelection } from "../../../../utils/selection.js";
|
|
8
|
+
import { yfmTableBodyType, yfmTableRowType, yfmTableType } from "../utils.js";
|
|
5
9
|
const removeCellNodeContent = (state, dispatch) => {
|
|
6
10
|
const sel = state.selection;
|
|
7
11
|
if (!isNodeSelection(sel))
|
|
@@ -25,97 +29,70 @@ const removeCellNodeContent = (state, dispatch) => {
|
|
|
25
29
|
}
|
|
26
30
|
return false;
|
|
27
31
|
};
|
|
28
|
-
// eslint-disable-next-line complexity
|
|
29
32
|
export const clearSelectedCells = (state, dispatch) => {
|
|
30
33
|
const sel = state.selection;
|
|
31
34
|
if (!isTextSelection(sel))
|
|
32
35
|
return false;
|
|
33
36
|
const { $from, $to } = sel;
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
const sharedDepth = $from.sharedDepth($to.pos);
|
|
38
|
+
const commonAncestor = $from.node(sharedDepth);
|
|
39
|
+
const { schema } = commonAncestor.type;
|
|
40
|
+
if (!isAnyOfTypes(commonAncestor, [
|
|
41
|
+
yfmTableType(schema),
|
|
42
|
+
yfmTableBodyType(schema),
|
|
43
|
+
yfmTableRowType(schema),
|
|
44
|
+
]))
|
|
40
45
|
return false;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return false;
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (trRow && isEmptyTableRow(trRow)) {
|
|
72
|
-
tr = tr.delete(rowPos, rowPos + trRow.nodeSize);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
rowIndex--;
|
|
76
|
-
}
|
|
77
|
-
tr = tr.delete($from.pos, fromCell.pos + fromCell.node.nodeSize);
|
|
78
|
-
const fromRowPos = tBody.pos + bodyRows[fromRowIndexInBody].pos + 1;
|
|
79
|
-
const trFromRow = tr.doc.nodeAt(fromRowPos);
|
|
80
|
-
if (fromCellIndexInRow === 0 && trFromRow && isEmptyTableRow(trFromRow)) {
|
|
81
|
-
const rowsCountBeforeDelete = tr.doc.nodeAt(tBody.pos).childCount;
|
|
82
|
-
tr = tr.delete(fromRowPos, fromRowPos + tr.doc.nodeAt(fromRowPos).nodeSize);
|
|
83
|
-
const trTable = tr.doc.nodeAt(table.pos);
|
|
84
|
-
if (rowsCountBeforeDelete <= 1) {
|
|
85
|
-
if (trTable) {
|
|
86
|
-
if (trTable.childCount <= 1) {
|
|
87
|
-
tr = tr.delete(table.pos, trTable.nodeSize);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
tr = tr.delete(tBody.pos, tBody.pos + tr.doc.nodeAt(tBody.pos).nodeSize);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
46
|
+
const tablePos = findTablePos($from, sharedDepth);
|
|
47
|
+
if (typeof tablePos !== 'number')
|
|
48
|
+
return false;
|
|
49
|
+
const tableNode = $from.doc.nodeAt(tablePos);
|
|
50
|
+
if (!tableNode)
|
|
51
|
+
return false;
|
|
52
|
+
const tableDesc = TableDesc.create(tableNode)?.bind(tablePos);
|
|
53
|
+
if (!tableDesc)
|
|
54
|
+
return false;
|
|
55
|
+
if (dispatch) {
|
|
56
|
+
const tr = state.tr;
|
|
57
|
+
const cells = range(0, tableDesc.rows)
|
|
58
|
+
.flatMap((rowIdx) => tableDesc.getPosForRowCells(rowIdx))
|
|
59
|
+
.filter((cell) => cell.type === 'real');
|
|
60
|
+
const isAllSelected = $from.pos <= cells[0].from + 2 && $to.pos >= cells[cells.length - 1].to - 2;
|
|
61
|
+
if (isAllSelected) {
|
|
62
|
+
// all table content is selected, we should remove table
|
|
63
|
+
tr.replaceWith(tablePos, tablePos + tableNode.nodeSize, pType(schema).create());
|
|
64
|
+
tr.setSelection(TextSelection.create(tr.doc, tablePos + 1));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
for (const cell of cells) {
|
|
68
|
+
if ($from.pos > cell.to)
|
|
69
|
+
continue;
|
|
70
|
+
if ($to.pos < cell.from)
|
|
71
|
+
break;
|
|
72
|
+
const from = Math.max($from.pos, cell.from + 1);
|
|
73
|
+
const to = Math.min($to.pos, cell.to - 1);
|
|
74
|
+
tr.delete(tr.mapping.map(from), tr.mapping.map(to));
|
|
75
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(tr.mapping.map(to)), -1));
|
|
94
76
|
}
|
|
95
|
-
tr = tr.setSelection(TextSelection.create(tr.doc, tr.mapping.map(sel.head)));
|
|
96
|
-
dispatch(tr);
|
|
97
77
|
}
|
|
98
|
-
|
|
78
|
+
dispatch(tr.scrollIntoView());
|
|
99
79
|
}
|
|
100
|
-
return
|
|
80
|
+
return true;
|
|
101
81
|
};
|
|
102
82
|
export const backspaceCommand = chainCommands(removeCellNodeContent, clearSelectedCells);
|
|
103
|
-
function
|
|
104
|
-
|
|
105
|
-
return false;
|
|
106
|
-
if (node.childCount === 0)
|
|
107
|
-
return true;
|
|
108
|
-
let isRowEmpty = true;
|
|
109
|
-
node.forEach((cellNode) => {
|
|
110
|
-
isRowEmpty = isEmptyTableCell(cellNode);
|
|
111
|
-
});
|
|
112
|
-
return isRowEmpty;
|
|
83
|
+
function isAnyOfTypes(node, types) {
|
|
84
|
+
return types.some((type) => type === node.type);
|
|
113
85
|
}
|
|
114
|
-
function
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
86
|
+
function findTablePos($pos, startDepth) {
|
|
87
|
+
const ASCENTS = 5;
|
|
88
|
+
let depth = startDepth;
|
|
89
|
+
while (depth >= 0 && startDepth - depth <= ASCENTS) {
|
|
90
|
+
const node = $pos.node(depth);
|
|
91
|
+
if (isTableNode(node)) {
|
|
92
|
+
return $pos.before(depth);
|
|
93
|
+
}
|
|
94
|
+
depth--;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
120
97
|
}
|
|
121
98
|
//# sourceMappingURL=backspace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backspace.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/commands/backspace.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands} from 'prosemirror-commands';\nimport type {Node} from 'prosemirror-model';\nimport {type Command, TextSelection} from 'prosemirror-state';\n\nimport {\n findChildTableCells,\n findChildTableRows,\n findParentTableBodyFromPos,\n findParentTableCellFromPos,\n findParentTableFromPos,\n isTableCellNode,\n isTableRowNode,\n} from '../../../../table-utils';\nimport {isNodeSelection, isTextSelection} from '../../../../utils/selection';\n\nconst removeCellNodeContent: Command = (state, dispatch) => {\n const sel = state.selection;\n if (!isNodeSelection(sel)) return false;\n const selNode = sel.node;\n if (isTableRowNode(selNode)) {\n // remove the table row\n dispatch?.(state.tr.deleteSelection());\n return true;\n }\n if (isTableCellNode(selNode)) {\n if (dispatch) {\n // clearing the table cell\n const from = sel.from + 1;\n const to = sel.to - 1;\n let tr = state.tr.delete(from, to);\n tr = tr.setSelection(TextSelection.create(tr.doc, from));\n dispatch(tr);\n }\n return true;\n }\n return false;\n};\n\n// eslint-disable-next-line complexity\nexport const clearSelectedCells: Command = (state, dispatch) => {\n const sel = state.selection;\n if (!isTextSelection(sel)) return false;\n const {$from, $to} = sel;\n\n const fromCell = findParentTableCellFromPos($from);\n const toCell = findParentTableCellFromPos($to);\n const fromTBody = findParentTableBodyFromPos($from);\n const toTBody = findParentTableBodyFromPos($to);\n const fromTable = findParentTableFromPos($to);\n\n if (!fromCell || !toCell || !fromTBody || !toTBody || !fromTable) return false;\n\n if (fromCell.node === toCell.node) {\n // selection inside table cell\n return false; // should executes default command\n }\n\n if (fromTBody && toTBody && fromTBody.pos === toTBody.pos) {\n if (dispatch) {\n const table = fromTable;\n const tBody = fromTBody;\n\n const fromCellIndexInRow = $from.index(fromCell.depth - 1);\n const toCellIndexInRow = $to.index(toCell.depth - 1);\n\n const fromRowIndexInBody = $from.index(fromCell.depth - 2);\n const toRowIndexInBody = $to.index(toCell.depth - 2);\n\n const bodyRows = findChildTableRows(tBody.node);\n\n let tr = state.tr;\n tr = tr.delete(toCell.start, $to.pos);\n\n let rowIndex = toRowIndexInBody;\n while (rowIndex >= fromRowIndexInBody) {\n const row = bodyRows[rowIndex];\n const rowCells = findChildTableCells(row.node);\n\n let cellIndex =\n rowIndex === toRowIndexInBody ? toCellIndexInRow - 1 : rowCells.length - 1;\n while (cellIndex > (rowIndex === fromRowIndexInBody ? fromCellIndexInRow : -1)) {\n const cell = rowCells[cellIndex];\n\n const from = tBody.pos + row.pos + cell.pos + 3;\n const to = from + cell.node.nodeSize - 2;\n\n tr = tr.delete(from, to);\n\n cellIndex--;\n }\n\n if (rowIndex !== fromRowIndexInBody) {\n const rowPos = tBody.pos + row.pos + 1;\n const trRow = tr.doc.nodeAt(rowPos);\n if (trRow && isEmptyTableRow(trRow)) {\n tr = tr.delete(rowPos, rowPos + trRow.nodeSize);\n }\n }\n\n rowIndex--;\n }\n\n tr = tr.delete($from.pos, fromCell.pos + fromCell.node.nodeSize);\n\n const fromRowPos = tBody.pos + bodyRows[fromRowIndexInBody].pos + 1;\n const trFromRow = tr.doc.nodeAt(fromRowPos);\n if (fromCellIndexInRow === 0 && trFromRow && isEmptyTableRow(trFromRow)) {\n const rowsCountBeforeDelete = tr.doc.nodeAt(tBody.pos)!.childCount;\n tr = tr.delete(fromRowPos, fromRowPos + tr.doc.nodeAt(fromRowPos)!.nodeSize);\n\n const trTable = tr.doc.nodeAt(table.pos);\n if (rowsCountBeforeDelete <= 1) {\n if (trTable) {\n if (trTable.childCount <= 1) {\n tr = tr.delete(table.pos, trTable.nodeSize);\n }\n } else {\n tr = tr.delete(tBody.pos, tBody.pos + tr.doc.nodeAt(tBody.pos)!.nodeSize);\n }\n }\n }\n tr = tr.setSelection(TextSelection.create(tr.doc, tr.mapping.map(sel.head)));\n\n dispatch(tr);\n }\n\n return true;\n }\n\n return false;\n};\n\nexport const backspaceCommand = chainCommands(removeCellNodeContent, clearSelectedCells);\n\nfunction isEmptyTableRow(node: Node) {\n if (!isTableRowNode(node)) return false;\n if (node.childCount === 0) return true;\n let isRowEmpty = true;\n node.forEach((cellNode) => {\n isRowEmpty = isEmptyTableCell(cellNode);\n });\n return isRowEmpty;\n}\n\nfunction isEmptyTableCell(node: Node): boolean {\n if (!isTableCellNode(node)) return false;\n if (node.childCount === 0) return true;\n return node.childCount === 1 && node.child(0).isTextblock && node.child(0).childCount === 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"backspace.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/commands/backspace.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands} from '#pm/commands';\nimport type {Node, NodeType, ResolvedPos} from '#pm/model';\nimport {type Command, TextSelection} from '#pm/state';\nimport {pType} from 'src/extensions/base/specs';\nimport {range} from 'src/lodash';\nimport {isTableCellNode, isTableNode, isTableRowNode} from 'src/table-utils';\nimport {TableDesc} from 'src/table-utils/table-desc';\nimport {isNodeSelection, isTextSelection} from 'src/utils/selection';\n\nimport {yfmTableBodyType, yfmTableRowType, yfmTableType} from '../utils';\n\nconst removeCellNodeContent: Command = (state, dispatch) => {\n const sel = state.selection;\n if (!isNodeSelection(sel)) return false;\n const selNode = sel.node;\n if (isTableRowNode(selNode)) {\n // remove the table row\n dispatch?.(state.tr.deleteSelection());\n return true;\n }\n if (isTableCellNode(selNode)) {\n if (dispatch) {\n // clearing the table cell\n const from = sel.from + 1;\n const to = sel.to - 1;\n let tr = state.tr.delete(from, to);\n tr = tr.setSelection(TextSelection.create(tr.doc, from));\n dispatch(tr);\n }\n return true;\n }\n return false;\n};\n\nexport const clearSelectedCells: Command = (state, dispatch) => {\n const sel = state.selection;\n if (!isTextSelection(sel)) return false;\n const {$from, $to} = sel;\n\n const sharedDepth = $from.sharedDepth($to.pos);\n const commonAncestor = $from.node(sharedDepth);\n const {schema} = commonAncestor.type;\n\n if (\n !isAnyOfTypes(commonAncestor, [\n yfmTableType(schema),\n yfmTableBodyType(schema),\n yfmTableRowType(schema),\n ])\n )\n return false;\n\n const tablePos = findTablePos($from, sharedDepth);\n if (typeof tablePos !== 'number') return false;\n const tableNode = $from.doc.nodeAt(tablePos);\n if (!tableNode) return false;\n const tableDesc = TableDesc.create(tableNode)?.bind(tablePos);\n if (!tableDesc) return false;\n\n if (dispatch) {\n const tr = state.tr;\n\n const cells = range(0, tableDesc.rows)\n .flatMap((rowIdx) => tableDesc.getPosForRowCells(rowIdx))\n .filter((cell) => cell.type === 'real');\n\n const isAllSelected =\n $from.pos <= cells[0].from + 2 && $to.pos >= cells[cells.length - 1].to - 2;\n\n if (isAllSelected) {\n // all table content is selected, we should remove table\n tr.replaceWith(tablePos, tablePos + tableNode.nodeSize, pType(schema).create());\n tr.setSelection(TextSelection.create(tr.doc, tablePos + 1));\n } else {\n for (const cell of cells) {\n if ($from.pos > cell.to) continue;\n if ($to.pos < cell.from) break;\n\n const from = Math.max($from.pos, cell.from + 1);\n const to = Math.min($to.pos, cell.to - 1);\n\n tr.delete(tr.mapping.map(from), tr.mapping.map(to));\n tr.setSelection(TextSelection.near(tr.doc.resolve(tr.mapping.map(to)), -1));\n }\n }\n\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n};\n\nexport const backspaceCommand = chainCommands(removeCellNodeContent, clearSelectedCells);\n\nfunction isAnyOfTypes(node: Node, types: NodeType[]): boolean {\n return types.some((type) => type === node.type);\n}\n\nfunction findTablePos($pos: ResolvedPos, startDepth: number): number | null {\n const ASCENTS = 5;\n let depth = startDepth;\n while (depth >= 0 && startDepth - depth <= ASCENTS) {\n const node = $pos.node(depth);\n if (isTableNode(node)) {\n return $pos.before(depth);\n }\n depth--;\n }\n return null;\n}\n"]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
export declare const i18n: <G extends "title" | "label_case-sensitive" | "label_whole-word", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
1
|
+
export declare const i18n: <G extends "title" | "label_case-sensitive" | "label_whole-word" | "action_replace" | "action_replace_all" | "replace_placeholder", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
2
2
|
[key: string]: any;
|
|
3
3
|
}) => S extends G ? {
|
|
4
4
|
"label_case-sensitive": string;
|
|
5
5
|
"label_whole-word": string;
|
|
6
6
|
title: string;
|
|
7
|
+
action_replace: string;
|
|
8
|
+
action_replace_all: string;
|
|
9
|
+
replace_placeholder: string;
|
|
7
10
|
}[G] : string;
|
|
@@ -29,5 +29,7 @@ export declare const SearchPanelPlugin: (params: SearchPanelPluginParams) => Vie
|
|
|
29
29
|
handleSearchNext(): void;
|
|
30
30
|
handleSearchPrev(): void;
|
|
31
31
|
handleSearchConfigChange(config: Partial<SearchQueryConfig>): void;
|
|
32
|
+
handleReplaceNext(query: string, replacement: string): void;
|
|
33
|
+
handleReplaceAll(query: string, replacement: string): void;
|
|
32
34
|
}>;
|
|
33
35
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SearchQuery, closeSearchPanel, findNext, findPrevious, getSearchQuery, search, searchKeymap, searchPanelOpen, setSearchQuery, } from '@codemirror/search';
|
|
1
|
+
import { SearchQuery, closeSearchPanel, findNext, findPrevious, getSearchQuery, replaceAll, replaceNext, search, searchKeymap, searchPanelOpen, setSearchQuery, } from '@codemirror/search';
|
|
2
2
|
import { ViewPlugin, keymap, } from '@codemirror/view';
|
|
3
3
|
import { debounce } from "../../../lodash.js";
|
|
4
4
|
import { ReactRendererFacet } from "../react-facet.js";
|
|
@@ -13,6 +13,7 @@ export const SearchPanelPlugin = (params) => ViewPlugin.fromClass(class {
|
|
|
13
13
|
search: '',
|
|
14
14
|
caseSensitive: false,
|
|
15
15
|
wholeWord: false,
|
|
16
|
+
replace: '',
|
|
16
17
|
};
|
|
17
18
|
receiver;
|
|
18
19
|
setViewSearchWithDelay;
|
|
@@ -26,6 +27,8 @@ export const SearchPanelPlugin = (params) => ViewPlugin.fromClass(class {
|
|
|
26
27
|
this.handleChange = this.handleChange.bind(this);
|
|
27
28
|
this.handleSearchNext = this.handleSearchNext.bind(this);
|
|
28
29
|
this.handleSearchPrev = this.handleSearchPrev.bind(this);
|
|
30
|
+
this.handleReplaceNext = this.handleReplaceNext.bind(this);
|
|
31
|
+
this.handleReplaceAll = this.handleReplaceAll.bind(this);
|
|
29
32
|
this.handleSearchConfigChange = this.handleSearchConfigChange.bind(this);
|
|
30
33
|
this.handleEditorModeChange = this.handleEditorModeChange.bind(this);
|
|
31
34
|
this.setViewSearchWithDelay = debounce(this.setViewSearch, this.params.inputDelay ?? INPUT_DELAY);
|
|
@@ -46,6 +49,8 @@ export const SearchPanelPlugin = (params) => ViewPlugin.fromClass(class {
|
|
|
46
49
|
onClose: this.handleClose,
|
|
47
50
|
onSearchNext: this.handleSearchNext,
|
|
48
51
|
onSearchPrev: this.handleSearchPrev,
|
|
52
|
+
onReplaceNext: this.handleReplaceNext,
|
|
53
|
+
onReplaceAll: this.handleReplaceAll,
|
|
49
54
|
onConfigChange: this.handleSearchConfigChange,
|
|
50
55
|
}));
|
|
51
56
|
}
|
|
@@ -90,6 +95,14 @@ export const SearchPanelPlugin = (params) => ViewPlugin.fromClass(class {
|
|
|
90
95
|
handleSearchConfigChange(config) {
|
|
91
96
|
this.setViewSearch(config);
|
|
92
97
|
}
|
|
98
|
+
handleReplaceNext(query, replacement) {
|
|
99
|
+
this.setViewSearch({ search: query, replace: replacement });
|
|
100
|
+
replaceNext(this.view);
|
|
101
|
+
}
|
|
102
|
+
handleReplaceAll(query, replacement) {
|
|
103
|
+
this.setViewSearch({ search: query, replace: replacement });
|
|
104
|
+
replaceAll(this.view);
|
|
105
|
+
}
|
|
93
106
|
}, {
|
|
94
107
|
provide: () => [
|
|
95
108
|
keymap.of(searchKeymap),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["markup/codemirror/search-plugin/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SearchQuery,\n closeSearchPanel,\n findNext,\n findPrevious,\n getSearchQuery,\n search,\n searchKeymap,\n searchPanelOpen,\n setSearchQuery,\n} from '@codemirror/search';\nimport {\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n keymap,\n} from '@codemirror/view';\n\nimport type {MarkdownEditorMode} from '../../../bundle';\nimport type {EventMap} from '../../../bundle/Editor';\nimport type {RendererItem} from '../../../extensions';\nimport {debounce} from '../../../lodash';\nimport type {Receiver} from '../../../utils';\nimport {ReactRendererFacet} from '../react-facet';\n\nimport {renderSearchPopup} from './view/SearchPopup';\n\ntype SearchQueryConfig = ConstructorParameters<typeof SearchQuery>[0];\n\nconst INPUT_DELAY = 200;\n\nexport interface SearchPanelPluginParams {\n anchorSelector: string;\n inputDelay?: number;\n receiver?: Receiver<EventMap>;\n}\n\nexport const SearchPanelPlugin = (params: SearchPanelPluginParams) =>\n ViewPlugin.fromClass(\n class implements PluginValue {\n readonly view: EditorView;\n readonly params: SearchPanelPluginParams;\n\n anchor: HTMLElement | null;\n renderer: RendererItem | null;\n searchConfig: SearchQueryConfig = {\n search: '',\n caseSensitive: false,\n wholeWord: false,\n };\n receiver: Receiver<EventMap> | undefined;\n\n setViewSearchWithDelay: (config: Partial<SearchQueryConfig>) => void;\n\n constructor(view: EditorView) {\n this.view = view;\n this.anchor = null;\n this.renderer = null;\n this.params = params;\n this.receiver = params.receiver;\n\n this.handleClose = this.handleClose.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleSearchNext = this.handleSearchNext.bind(this);\n this.handleSearchPrev = this.handleSearchPrev.bind(this);\n this.handleSearchConfigChange = this.handleSearchConfigChange.bind(this);\n this.handleEditorModeChange = this.handleEditorModeChange.bind(this);\n\n this.setViewSearchWithDelay = debounce(\n this.setViewSearch,\n this.params.inputDelay ?? INPUT_DELAY,\n );\n this.receiver?.on('change-editor-mode', this.handleEditorModeChange);\n }\n\n update(update: ViewUpdate): void {\n const isPanelOpen = searchPanelOpen(update.state);\n\n if (isPanelOpen && !this.renderer) {\n const initial = getSearchQuery(update.state);\n this.anchor = document.querySelector(this.params.anchorSelector);\n this.renderer = this.view.state\n .facet(ReactRendererFacet)\n .createItem('cm-search', () =>\n renderSearchPopup({\n initial,\n open: true,\n anchor: this.anchor,\n onChange: this.handleChange,\n onClose: this.handleClose,\n onSearchNext: this.handleSearchNext,\n onSearchPrev: this.handleSearchPrev,\n onConfigChange: this.handleSearchConfigChange,\n }),\n );\n } else if (!isPanelOpen && this.renderer) {\n this.renderer?.remove();\n this.renderer = null;\n }\n }\n\n destroy() {\n this.renderer?.remove();\n this.renderer = null;\n this.receiver?.off('change-editor-mode', this.handleEditorModeChange);\n }\n\n setViewSearch(config: Partial<SearchQueryConfig>) {\n this.searchConfig = {\n ...this.searchConfig,\n ...config,\n };\n const searchQuery = new SearchQuery({\n ...this.searchConfig,\n });\n\n this.view.dispatch({effects: setSearchQuery.of(searchQuery)});\n }\n\n handleEditorModeChange({mode}: {mode: MarkdownEditorMode}) {\n if (mode === 'wysiwyg') {\n closeSearchPanel(this.view);\n }\n }\n\n handleChange(search: string) {\n this.setViewSearchWithDelay({search});\n }\n\n handleClose() {\n this.setViewSearch({search: ''});\n closeSearchPanel(this.view);\n }\n\n handleSearchNext() {\n findNext(this.view);\n }\n\n handleSearchPrev() {\n findPrevious(this.view);\n }\n\n handleSearchConfigChange(config: Partial<SearchQueryConfig>) {\n this.setViewSearch(config);\n }\n },\n {\n provide: () => [\n keymap.of(searchKeymap),\n search({\n createPanel: () => ({\n // Create an empty search panel\n dom: document.createElement('div'),\n }),\n }),\n ],\n },\n );\n"]}
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["markup/codemirror/search-plugin/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SearchQuery,\n closeSearchPanel,\n findNext,\n findPrevious,\n getSearchQuery,\n replaceAll,\n replaceNext,\n search,\n searchKeymap,\n searchPanelOpen,\n setSearchQuery,\n} from '@codemirror/search';\nimport {\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n keymap,\n} from '@codemirror/view';\n\nimport type {MarkdownEditorMode} from '../../../bundle';\nimport type {EventMap} from '../../../bundle/Editor';\nimport type {RendererItem} from '../../../extensions';\nimport {debounce} from '../../../lodash';\nimport type {Receiver} from '../../../utils';\nimport {ReactRendererFacet} from '../react-facet';\n\nimport {renderSearchPopup} from './view/SearchPopup';\n\ntype SearchQueryConfig = ConstructorParameters<typeof SearchQuery>[0];\n\nconst INPUT_DELAY = 200;\n\nexport interface SearchPanelPluginParams {\n anchorSelector: string;\n inputDelay?: number;\n receiver?: Receiver<EventMap>;\n}\n\nexport const SearchPanelPlugin = (params: SearchPanelPluginParams) =>\n ViewPlugin.fromClass(\n class implements PluginValue {\n readonly view: EditorView;\n readonly params: SearchPanelPluginParams;\n\n anchor: HTMLElement | null;\n renderer: RendererItem | null;\n searchConfig: SearchQueryConfig = {\n search: '',\n caseSensitive: false,\n wholeWord: false,\n replace: '',\n };\n receiver: Receiver<EventMap> | undefined;\n\n setViewSearchWithDelay: (config: Partial<SearchQueryConfig>) => void;\n\n constructor(view: EditorView) {\n this.view = view;\n this.anchor = null;\n this.renderer = null;\n this.params = params;\n this.receiver = params.receiver;\n\n this.handleClose = this.handleClose.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleSearchNext = this.handleSearchNext.bind(this);\n this.handleSearchPrev = this.handleSearchPrev.bind(this);\n this.handleReplaceNext = this.handleReplaceNext.bind(this);\n this.handleReplaceAll = this.handleReplaceAll.bind(this);\n this.handleSearchConfigChange = this.handleSearchConfigChange.bind(this);\n this.handleEditorModeChange = this.handleEditorModeChange.bind(this);\n\n this.setViewSearchWithDelay = debounce(\n this.setViewSearch,\n this.params.inputDelay ?? INPUT_DELAY,\n );\n this.receiver?.on('change-editor-mode', this.handleEditorModeChange);\n }\n\n update(update: ViewUpdate): void {\n const isPanelOpen = searchPanelOpen(update.state);\n\n if (isPanelOpen && !this.renderer) {\n const initial = getSearchQuery(update.state);\n this.anchor = document.querySelector(this.params.anchorSelector);\n this.renderer = this.view.state\n .facet(ReactRendererFacet)\n .createItem('cm-search', () =>\n renderSearchPopup({\n initial,\n open: true,\n anchor: this.anchor,\n onChange: this.handleChange,\n onClose: this.handleClose,\n onSearchNext: this.handleSearchNext,\n onSearchPrev: this.handleSearchPrev,\n onReplaceNext: this.handleReplaceNext,\n onReplaceAll: this.handleReplaceAll,\n onConfigChange: this.handleSearchConfigChange,\n }),\n );\n } else if (!isPanelOpen && this.renderer) {\n this.renderer?.remove();\n this.renderer = null;\n }\n }\n\n destroy() {\n this.renderer?.remove();\n this.renderer = null;\n this.receiver?.off('change-editor-mode', this.handleEditorModeChange);\n }\n\n setViewSearch(config: Partial<SearchQueryConfig>) {\n this.searchConfig = {\n ...this.searchConfig,\n ...config,\n };\n const searchQuery = new SearchQuery({\n ...this.searchConfig,\n });\n\n this.view.dispatch({effects: setSearchQuery.of(searchQuery)});\n }\n\n handleEditorModeChange({mode}: {mode: MarkdownEditorMode}) {\n if (mode === 'wysiwyg') {\n closeSearchPanel(this.view);\n }\n }\n\n handleChange(search: string) {\n this.setViewSearchWithDelay({search});\n }\n\n handleClose() {\n this.setViewSearch({search: ''});\n closeSearchPanel(this.view);\n }\n\n handleSearchNext() {\n findNext(this.view);\n }\n\n handleSearchPrev() {\n findPrevious(this.view);\n }\n\n handleSearchConfigChange(config: Partial<SearchQueryConfig>) {\n this.setViewSearch(config);\n }\n\n handleReplaceNext(query: string, replacement: string) {\n this.setViewSearch({search: query, replace: replacement});\n replaceNext(this.view);\n }\n\n handleReplaceAll(query: string, replacement: string) {\n this.setViewSearch({search: query, replace: replacement});\n replaceAll(this.view);\n }\n },\n {\n provide: () => [\n keymap.of(searchKeymap),\n search({\n createPanel: () => ({\n // Create an empty search panel\n dom: document.createElement('div'),\n }),\n }),\n ],\n },\n );\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export const ReplaceIcon = (props) => (_jsx("svg", { viewBox: "0 0 16 16", xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", width: 14, height: 14, ...props, children: _jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M3.221 3.739l2.261 2.269L7.7 3.784l-.7-.7-1.012 1.007-.008-1.6a.523.523 0 0 1 .5-.526H8V1H6.48A1.482 1.482 0 0 0 5 2.489V4.1L3.927 3.033l-.706.706zm6.67 1.794h.01c.183.311.451.467.806.467.393 0 .706-.168.94-.503.236-.335.353-.78.353-1.333 0-.511-.1-.913-.301-1.207-.201-.295-.488-.442-.86-.442-.405 0-.718.194-.938.581h-.01V1H9v4.919h.89v-.386zm-.015-1.061v-.34c0-.248.058-.448.175-.601a.54.54 0 0 1 .445-.23.49.49 0 0 1 .436.233c.104.154.155.368.155.643 0 .33-.056.587-.169.768a.524.524 0 0 1-.47.27.495.495 0 0 1-.411-.211.853.853 0 0 1-.16-.532zM9 12.769c-.256.154-.625.231-1.108.231-.563 0-1.02-.178-1.369-.533-.349-.355-.523-.813-.523-1.374 0-.648.186-1.158.56-1.53.374-.376.875-.563 1.5-.563.433 0 .746.06.94.179v.998a1.26 1.26 0 0 0-.792-.276c-.325 0-.583.1-.774.298-.19.196-.283.468-.283.816 0 .338.09.603.272.797.182.191.431.287.749.287.282 0 .558-.092.828-.276v.946zM4 7L3 8v6l1 1h7l1-1V8l-1-1H4zm0 1h7v6H4V8z" }) }));
|
|
3
|
+
export const ReplaceAllIcon = (props) => (_jsx("svg", { viewBox: "0 0 16 16", xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", width: 14, height: 14, ...props, children: _jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M11.6 2.677c.147-.31.356-.465.626-.465.248 0 .44.118.573.353.134.236.201.557.201.966 0 .443-.078.798-.235 1.067-.156.268-.365.402-.627.402-.237 0-.416-.125-.537-.374h-.008v.31H11V1h.593v1.677h.008zm-.016 1.1a.78.78 0 0 0 .107.426c.071.113.163.169.274.169.136 0 .24-.072.314-.216.075-.145.113-.35.113-.615 0-.22-.035-.39-.104-.514-.067-.124-.164-.187-.29-.187-.12 0-.219.062-.297.185a.886.886 0 0 0-.117.48v.272zM4.12 7.695L2 5.568l.662-.662 1.006 1v-1.51A1.39 1.39 0 0 1 5.055 3H7.4v.905H5.055a.49.49 0 0 0-.468.493l.007 1.5.949-.944.656.656-2.08 2.085zM9.356 4.93H10V3.22C10 2.408 9.685 2 9.056 2c-.135 0-.285.024-.45.073a1.444 1.444 0 0 0-.388.167v.665c.237-.203.487-.304.75-.304.261 0 .392.156.392.469l-.6.103c-.506.086-.76.406-.76.961 0 .263.061.473.183.631A.61.61 0 0 0 8.69 5c.29 0 .509-.16.657-.48h.009v.41zm.004-1.355v.193a.75.75 0 0 1-.12.436.368.368 0 0 1-.313.17.276.276 0 0 1-.22-.095.38.38 0 0 1-.08-.248c0-.222.11-.351.332-.389l.4-.067zM7 12.93h-.644v-.41h-.009c-.148.32-.367.48-.657.48a.61.61 0 0 1-.507-.235c-.122-.158-.183-.368-.183-.63 0-.556.254-.876.76-.962l.6-.103c0-.313-.13-.47-.392-.47-.263 0-.513.102-.75.305v-.665c.095-.063.224-.119.388-.167.165-.049.315-.073.45-.073.63 0 .944.407.944 1.22v1.71zm-.64-1.162v-.193l-.4.068c-.222.037-.333.166-.333.388 0 .1.027.183.08.248a.276.276 0 0 0 .22.095.368.368 0 0 0 .312-.17c.08-.116.12-.26.12-.436zM9.262 13c.321 0 .568-.058.738-.173v-.71a.9.9 0 0 1-.552.207.619.619 0 0 1-.5-.215c-.12-.145-.181-.345-.181-.598 0-.26.063-.464.189-.612a.644.644 0 0 1 .516-.223c.194 0 .37.069.528.207v-.749c-.129-.09-.338-.134-.626-.134-.417 0-.751.14-1.001.422-.249.28-.373.662-.373 1.148 0 .42.116.764.349 1.03.232.267.537.4.913.4zM2 9l1-1h9l1 1v5l-1 1H3l-1-1V9zm1 0v5h9V9H3zm3-2l1-1h7l1 1v5l-1 1V7H6z" }) }));
|
|
4
|
+
//# sourceMappingURL=ReplaceIcons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReplaceIcons.js","sourceRoot":"../../../../../../src","sources":["markup/codemirror/search-plugin/view/ReplaceIcons.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,MAAM,WAAW,GAA4C,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3E,cACI,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,EAClC,IAAI,EAAC,cAAc,EACnB,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,KACN,KAAK,YAET,eACI,QAAQ,EAAC,SAAS,EAClB,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,y5BAAy5B,GAC75B,GACA,CACT,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAA4C,CAAC,KAAK,EAAE,EAAE,CAAC,CAC9E,cACI,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,EAClC,IAAI,EAAC,cAAc,EACnB,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,KACN,KAAK,YAET,eACI,QAAQ,EAAC,SAAS,EAClB,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,2tDAA2tD,GAC/tD,GACA,CACT,CAAC","sourcesContent":["import type React from 'react';\n\nexport const ReplaceIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n width={14}\n height={14}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.221 3.739l2.261 2.269L7.7 3.784l-.7-.7-1.012 1.007-.008-1.6a.523.523 0 0 1 .5-.526H8V1H6.48A1.482 1.482 0 0 0 5 2.489V4.1L3.927 3.033l-.706.706zm6.67 1.794h.01c.183.311.451.467.806.467.393 0 .706-.168.94-.503.236-.335.353-.78.353-1.333 0-.511-.1-.913-.301-1.207-.201-.295-.488-.442-.86-.442-.405 0-.718.194-.938.581h-.01V1H9v4.919h.89v-.386zm-.015-1.061v-.34c0-.248.058-.448.175-.601a.54.54 0 0 1 .445-.23.49.49 0 0 1 .436.233c.104.154.155.368.155.643 0 .33-.056.587-.169.768a.524.524 0 0 1-.47.27.495.495 0 0 1-.411-.211.853.853 0 0 1-.16-.532zM9 12.769c-.256.154-.625.231-1.108.231-.563 0-1.02-.178-1.369-.533-.349-.355-.523-.813-.523-1.374 0-.648.186-1.158.56-1.53.374-.376.875-.563 1.5-.563.433 0 .746.06.94.179v.998a1.26 1.26 0 0 0-.792-.276c-.325 0-.583.1-.774.298-.19.196-.283.468-.283.816 0 .338.09.603.272.797.182.191.431.287.749.287.282 0 .558-.092.828-.276v.946zM4 7L3 8v6l1 1h7l1-1V8l-1-1H4zm0 1h7v6H4V8z\"\n />\n </svg>\n);\n\nexport const ReplaceAllIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n width={14}\n height={14}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M11.6 2.677c.147-.31.356-.465.626-.465.248 0 .44.118.573.353.134.236.201.557.201.966 0 .443-.078.798-.235 1.067-.156.268-.365.402-.627.402-.237 0-.416-.125-.537-.374h-.008v.31H11V1h.593v1.677h.008zm-.016 1.1a.78.78 0 0 0 .107.426c.071.113.163.169.274.169.136 0 .24-.072.314-.216.075-.145.113-.35.113-.615 0-.22-.035-.39-.104-.514-.067-.124-.164-.187-.29-.187-.12 0-.219.062-.297.185a.886.886 0 0 0-.117.48v.272zM4.12 7.695L2 5.568l.662-.662 1.006 1v-1.51A1.39 1.39 0 0 1 5.055 3H7.4v.905H5.055a.49.49 0 0 0-.468.493l.007 1.5.949-.944.656.656-2.08 2.085zM9.356 4.93H10V3.22C10 2.408 9.685 2 9.056 2c-.135 0-.285.024-.45.073a1.444 1.444 0 0 0-.388.167v.665c.237-.203.487-.304.75-.304.261 0 .392.156.392.469l-.6.103c-.506.086-.76.406-.76.961 0 .263.061.473.183.631A.61.61 0 0 0 8.69 5c.29 0 .509-.16.657-.48h.009v.41zm.004-1.355v.193a.75.75 0 0 1-.12.436.368.368 0 0 1-.313.17.276.276 0 0 1-.22-.095.38.38 0 0 1-.08-.248c0-.222.11-.351.332-.389l.4-.067zM7 12.93h-.644v-.41h-.009c-.148.32-.367.48-.657.48a.61.61 0 0 1-.507-.235c-.122-.158-.183-.368-.183-.63 0-.556.254-.876.76-.962l.6-.103c0-.313-.13-.47-.392-.47-.263 0-.513.102-.75.305v-.665c.095-.063.224-.119.388-.167.165-.049.315-.073.45-.073.63 0 .944.407.944 1.22v1.71zm-.64-1.162v-.193l-.4.068c-.222.037-.333.166-.333.388 0 .1.027.183.08.248a.276.276 0 0 0 .22.095.368.368 0 0 0 .312-.17c.08-.116.12-.26.12-.436zM9.262 13c.321 0 .568-.058.738-.173v-.71a.9.9 0 0 1-.552.207.619.619 0 0 1-.5-.215c-.12-.145-.181-.345-.181-.598 0-.26.063-.464.189-.612a.644.644 0 0 1 .516-.223c.194 0 .37.069.528.207v-.749c-.129-.09-.338-.134-.626-.134-.417 0-.751.14-1.001.422-.249.28-.373.662-.373 1.148 0 .42.116.764.349 1.03.232.267.537.4.913.4zM2 9l1-1h9l1 1v5l-1 1H3l-1-1V9zm1 0v5h9V9H3zm3-2l1-1h7l1 1v5l-1 1V7H6z\"\n />\n </svg>\n);\n"]}
|
|
@@ -9,6 +9,8 @@ interface SearchCardProps {
|
|
|
9
9
|
onClose?: (query: string) => void;
|
|
10
10
|
onSearchPrev?: (query: string) => void;
|
|
11
11
|
onSearchNext?: (query: string) => void;
|
|
12
|
+
onReplaceNext?: (query: string, replacement: string) => void;
|
|
13
|
+
onReplaceAll?: (query: string, replacement: string) => void;
|
|
12
14
|
onConfigChange?: (config: SearchConfig) => void;
|
|
13
15
|
}
|
|
14
16
|
export declare const SearchCard: React.FC<SearchCardProps>;
|
|
@@ -5,14 +5,16 @@ import { Button, Card, Checkbox, Icon, Popup, TextInput, sp, } from '@gravity-ui
|
|
|
5
5
|
import { cn } from "../../../../classname.js";
|
|
6
6
|
import { i18n } from "../../../../i18n/search/index.js";
|
|
7
7
|
import { enterKeyHandler } from "../../../../utils/handlers.js";
|
|
8
|
+
import { ReplaceAllIcon, ReplaceIcon } from "./ReplaceIcons.js";
|
|
8
9
|
import "./SearchPopup.css";
|
|
9
10
|
const b = cn('search-card');
|
|
10
11
|
const noop = () => { };
|
|
11
12
|
const inverse = (val) => !val;
|
|
12
|
-
export const SearchCard = ({ initial, onChange = noop, onClose = noop, onSearchPrev = noop, onSearchNext = noop, onConfigChange = noop, }) => {
|
|
13
|
+
export const SearchCard = ({ initial, onChange = noop, onClose = noop, onSearchPrev = noop, onSearchNext = noop, onReplaceNext = noop, onReplaceAll = noop, onConfigChange = noop, }) => {
|
|
13
14
|
const [query, setQuery] = useState(initial.search);
|
|
14
15
|
const [isCaseSensitive, setIsCaseSensitive] = useState(initial.caseSensitive);
|
|
15
16
|
const [isWholeWord, setIsWholeWord] = useState(initial.wholeWord);
|
|
17
|
+
const [replacement, setReplacement] = useState('');
|
|
16
18
|
const textInputRef = useRef(null);
|
|
17
19
|
const setInputFocus = () => {
|
|
18
20
|
textInputRef.current?.focus();
|
|
@@ -34,6 +36,14 @@ export const SearchCard = ({ initial, onChange = noop, onClose = noop, onSearchP
|
|
|
34
36
|
onSearchNext(query);
|
|
35
37
|
setInputFocus();
|
|
36
38
|
};
|
|
39
|
+
const handleReplace = () => {
|
|
40
|
+
onReplaceNext(query, replacement);
|
|
41
|
+
setInputFocus();
|
|
42
|
+
};
|
|
43
|
+
const handleReplaceAll = () => {
|
|
44
|
+
onReplaceAll(query, replacement);
|
|
45
|
+
setInputFocus();
|
|
46
|
+
};
|
|
37
47
|
const handleIsCaseSensitive = () => {
|
|
38
48
|
onConfigChange({
|
|
39
49
|
caseSensitive: !isCaseSensitive,
|
|
@@ -51,7 +61,7 @@ export const SearchCard = ({ initial, onChange = noop, onClose = noop, onSearchP
|
|
|
51
61
|
setInputFocus();
|
|
52
62
|
};
|
|
53
63
|
const handleSearchKeyPress = enterKeyHandler(handleNext);
|
|
54
|
-
return (_jsxs(Card, { className: b(), children: [_jsxs("div", { className: b('header'), children: [_jsxs("span", { className: b('title'), children: [" ", i18n('title')] }), _jsx(Button, { onClick: handleClose, size: "s", view: "flat", children: _jsx(Icon, { data: Xmark, size: 14 }) })] }), _jsx(TextInput, { controlRef: textInputRef, className: sp({ mb: 2 }), size: "s", autoFocus: true, onKeyPress: handleSearchKeyPress, onUpdate: handleInputChange, value: query, endContent: _jsxs(_Fragment, { children: [_jsx(Button, { onClick: handlePrev, children: _jsx(Icon, { data: ChevronUp, size: 12 }) }), _jsx(Button, { onClick: handleNext, children: _jsx(Icon, { data: ChevronDown, size: 12 }) })] }) }), _jsx(Checkbox, { size: "m", onUpdate: handleIsCaseSensitive, checked: isCaseSensitive, className: sp({ mr: 4 }), children: i18n('label_case-sensitive') }), _jsx(Checkbox, { size: "m", onUpdate: handleIsWholeWord, checked: isWholeWord, children: i18n('label_whole-word') })] }));
|
|
64
|
+
return (_jsxs(Card, { className: b(), children: [_jsxs("div", { className: b('header'), children: [_jsxs("span", { className: b('title'), children: [" ", i18n('title')] }), _jsx(Button, { onClick: handleClose, size: "s", view: "flat", children: _jsx(Icon, { data: Xmark, size: 14 }) })] }), _jsx(TextInput, { controlRef: textInputRef, className: sp({ mb: 2 }), size: "s", autoFocus: true, onKeyPress: handleSearchKeyPress, onUpdate: handleInputChange, value: query, endContent: _jsxs(_Fragment, { children: [_jsx(Button, { onClick: handlePrev, pin: "round-brick", children: _jsx(Icon, { data: ChevronUp, size: 12 }) }), _jsx(Button, { onClick: handleNext, pin: "brick-round", children: _jsx(Icon, { data: ChevronDown, size: 12 }) })] }) }), _jsx(TextInput, { placeholder: i18n('replace_placeholder'), className: sp({ mb: 2 }), size: "s", onUpdate: setReplacement, value: replacement, endContent: _jsxs(_Fragment, { children: [_jsx(Button, { size: "s", onClick: handleReplace, pin: "round-brick", disabled: !query, title: i18n('action_replace'), children: _jsx(ReplaceIcon, { width: 12, height: 12 }) }), _jsx(Button, { size: "s", onClick: handleReplaceAll, pin: "brick-round", disabled: !query, title: i18n('action_replace_all'), children: _jsx(ReplaceAllIcon, { width: 12, height: 12 }) })] }) }), _jsx(Checkbox, { size: "m", onUpdate: handleIsCaseSensitive, checked: isCaseSensitive, className: sp({ mr: 4 }), children: i18n('label_case-sensitive') }), _jsx(Checkbox, { size: "m", onUpdate: handleIsWholeWord, checked: isWholeWord, children: i18n('label_whole-word') })] }));
|
|
55
65
|
};
|
|
56
66
|
export const SearchPopup = ({ open, anchor, ...props }) => {
|
|
57
67
|
return (_jsx(Popup, { open: open, anchorElement: anchor, placement: "bottom-end", onOpenChange: (_open, _event, reason) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchPopup.js","sourceRoot":"../../../../../../src","sources":["markup/codemirror/search-plugin/view/SearchPopup.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useRef, useState} from 'react';\n\nimport type {SearchQuery} from '@codemirror/search';\nimport {ChevronDown, ChevronUp, Xmark} from '@gravity-ui/icons';\nimport {\n Button,\n Card,\n Checkbox,\n Icon,\n Popup,\n TextInput,\n type TextInputProps,\n sp,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {i18n} from '../../../../i18n/search';\nimport {enterKeyHandler} from '../../../../utils/handlers';\n\nimport './SearchPopup.scss';\n\ntype SearchInitial = Pick<SearchQuery, 'search' | 'caseSensitive' | 'wholeWord'>;\ntype SearchConfig = Pick<SearchInitial, 'caseSensitive' | 'wholeWord'>;\n\ninterface SearchCardProps {\n initial: SearchInitial;\n onSearchKeyDown?: (query: string) => void;\n onChange?: (query: string) => void;\n onClose?: (query: string) => void;\n onSearchPrev?: (query: string) => void;\n onSearchNext?: (query: string) => void;\n onConfigChange?: (config: SearchConfig) => void;\n}\n\nconst b = cn('search-card');\n\nconst noop = () => {};\nconst inverse = (val: boolean) => !val;\n\nexport const SearchCard: React.FC<SearchCardProps> = ({\n initial,\n onChange = noop,\n onClose = noop,\n onSearchPrev = noop,\n onSearchNext = noop,\n onConfigChange = noop,\n}) => {\n const [query, setQuery] = useState<string>(initial.search);\n const [isCaseSensitive, setIsCaseSensitive] = useState<boolean>(initial.caseSensitive);\n const [isWholeWord, setIsWholeWord] = useState<boolean>(initial.wholeWord);\n const textInputRef = useRef<HTMLInputElement>(null);\n\n const setInputFocus = () => {\n textInputRef.current?.focus();\n };\n\n const handleInputChange = (value: string) => {\n setQuery(value);\n onChange(value);\n };\n\n const handleClose = () => {\n setQuery('');\n onClose(query);\n setInputFocus();\n };\n\n const handlePrev = () => {\n onSearchPrev(query);\n setInputFocus();\n };\n\n const handleNext = () => {\n onSearchNext(query);\n setInputFocus();\n };\n\n const handleIsCaseSensitive = () => {\n onConfigChange({\n caseSensitive: !isCaseSensitive,\n wholeWord: isWholeWord,\n });\n setIsCaseSensitive(inverse);\n setInputFocus();\n };\n\n const handleIsWholeWord = () => {\n onConfigChange({\n caseSensitive: isCaseSensitive,\n wholeWord: !isWholeWord,\n });\n setIsWholeWord(inverse);\n setInputFocus();\n };\n\n const handleSearchKeyPress: TextInputProps['onKeyPress'] = enterKeyHandler(handleNext);\n\n return (\n <Card className={b()}>\n <div className={b('header')}>\n <span className={b('title')}> {i18n('title')}</span>\n <Button onClick={handleClose} size=\"s\" view=\"flat\">\n <Icon data={Xmark} size={14} />\n </Button>\n </div>\n <TextInput\n controlRef={textInputRef}\n className={sp({mb: 2})}\n size=\"s\"\n autoFocus\n onKeyPress={handleSearchKeyPress}\n onUpdate={handleInputChange}\n value={query}\n endContent={\n <>\n <Button onClick={handlePrev}>\n <Icon data={ChevronUp} size={12} />\n </Button>\n <Button onClick={handleNext}>\n <Icon data={ChevronDown} size={12} />\n </Button>\n </>\n }\n />\n <Checkbox\n size=\"m\"\n onUpdate={handleIsCaseSensitive}\n checked={isCaseSensitive}\n className={sp({mr: 4})}\n >\n {i18n('label_case-sensitive')}\n </Checkbox>\n <Checkbox size=\"m\" onUpdate={handleIsWholeWord} checked={isWholeWord}>\n {i18n('label_whole-word')}\n </Checkbox>\n </Card>\n );\n};\n\nexport interface SearchPopupProps extends SearchCardProps {\n open: boolean;\n anchor: HTMLElement;\n onClose: () => void;\n}\n\nexport const SearchPopup: React.FC<SearchPopupProps> = ({open, anchor, ...props}) => {\n return (\n <Popup\n open={open}\n anchorElement={anchor}\n placement=\"bottom-end\"\n onOpenChange={(_open, _event, reason) => {\n if (reason === 'escape-key') {\n props.onClose();\n }\n }}\n >\n <SearchCard {...props} />\n </Popup>\n );\n};\n\nSearchPopup.displayName = 'SearchPopup';\n\ninterface SearchPopupWithRefProps extends Omit<SearchPopupProps, 'anchor'> {\n anchor: HTMLElement | null;\n}\n\nexport function renderSearchPopup({anchor, ...props}: SearchPopupWithRefProps) {\n return <>{anchor && <SearchPopup anchor={anchor} {...props} />}</>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SearchPopup.js","sourceRoot":"../../../../../../src","sources":["markup/codemirror/search-plugin/view/SearchPopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACH,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,EAET,EAAE,GACL,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,IAAI,EAAC,yCAAgC;AAC7C,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAAC,cAAc,EAAE,WAAW,EAAC,0BAAuB;AAE3D,2BAA4B;AAiB5B,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACtB,MAAM,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EAClD,OAAO,EACP,QAAQ,GAAG,IAAI,EACf,OAAO,GAAG,IAAI,EACd,YAAY,GAAG,IAAI,EACnB,YAAY,GAAG,IAAI,EACnB,aAAa,GAAG,IAAI,EACpB,YAAY,GAAG,IAAI,EACnB,cAAc,GAAG,IAAI,GACxB,EAAE,EAAE;IACD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAU,OAAO,CAAC,aAAa,CAAC,CAAC;IACvF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAU,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEpD,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,EAAE;QACxC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACrB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAClC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC1B,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE;QAC/B,cAAc,CAAC;YACX,aAAa,EAAE,CAAC,eAAe;YAC/B,SAAS,EAAE,WAAW;SACzB,CAAC,CAAC;QACH,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC3B,cAAc,CAAC;YACX,aAAa,EAAE,eAAe;YAC9B,SAAS,EAAE,CAAC,WAAW;SAC1B,CAAC,CAAC;QACH,cAAc,CAAC,OAAO,CAAC,CAAC;QACxB,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAiC,eAAe,CAAC,UAAU,CAAC,CAAC;IAEvF,OAAO,CACH,MAAC,IAAI,IAAC,SAAS,EAAE,CAAC,EAAE,aAChB,eAAK,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,aACvB,gBAAM,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAI,IAAI,CAAC,OAAO,CAAC,IAAQ,EACpD,KAAC,MAAM,IAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,MAAM,YAC9C,KAAC,IAAI,IAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAI,GAC1B,IACP,EACN,KAAC,SAAS,IACN,UAAU,EAAE,YAAY,EACxB,SAAS,EAAE,EAAE,CAAC,EAAC,EAAE,EAAE,CAAC,EAAC,CAAC,EACtB,IAAI,EAAC,GAAG,EACR,SAAS,QACT,UAAU,EAAE,oBAAoB,EAChC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,KAAK,EACZ,UAAU,EACN,8BACI,KAAC,MAAM,IAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAC,aAAa,YAC1C,KAAC,IAAI,IAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAI,GAC9B,EACT,KAAC,MAAM,IAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAC,aAAa,YAC1C,KAAC,IAAI,IAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,GAAI,GAChC,IACV,GAET,EACF,KAAC,SAAS,IACN,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,EACxC,SAAS,EAAE,EAAE,CAAC,EAAC,EAAE,EAAE,CAAC,EAAC,CAAC,EACtB,IAAI,EAAC,GAAG,EACR,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,WAAW,EAClB,UAAU,EACN,8BACI,KAAC,MAAM,IACH,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,aAAa,EACtB,GAAG,EAAC,aAAa,EACjB,QAAQ,EAAE,CAAC,KAAK,EAChB,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAE7B,KAAC,WAAW,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,GACjC,EACT,KAAC,MAAM,IACH,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAC,aAAa,EACjB,QAAQ,EAAE,CAAC,KAAK,EAChB,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,YAEjC,KAAC,cAAc,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,GACpC,IACV,GAET,EACF,KAAC,QAAQ,IACL,IAAI,EAAC,GAAG,EACR,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,EAAE,CAAC,EAAC,EAAE,EAAE,CAAC,EAAC,CAAC,YAErB,IAAI,CAAC,sBAAsB,CAAC,GACtB,EACX,KAAC,QAAQ,IAAC,IAAI,EAAC,GAAG,EAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,YAC/D,IAAI,CAAC,kBAAkB,CAAC,GAClB,IACR,CACV,CAAC;AACN,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,EAAC,EAAE,EAAE;IAChF,OAAO,CACH,KAAC,KAAK,IACF,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,SAAS,EAAC,YAAY,EACtB,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACpC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC1B,KAAK,CAAC,OAAO,EAAE,CAAC;YACpB,CAAC;QACL,CAAC,YAED,KAAC,UAAU,OAAK,KAAK,GAAI,GACrB,CACX,CAAC;AACN,CAAC,CAAC;AAEF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAMxC,MAAM,UAAU,iBAAiB,CAAC,EAAC,MAAM,EAAE,GAAG,KAAK,EAA0B;IACzE,OAAO,4BAAG,MAAM,IAAI,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,KAAM,KAAK,GAAI,GAAI,CAAC;AACvE,CAAC","sourcesContent":["import {useRef, useState} from 'react';\n\nimport type {SearchQuery} from '@codemirror/search';\nimport {ChevronDown, ChevronUp, Xmark} from '@gravity-ui/icons';\nimport {\n Button,\n Card,\n Checkbox,\n Icon,\n Popup,\n TextInput,\n type TextInputProps,\n sp,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {i18n} from '../../../../i18n/search';\nimport {enterKeyHandler} from '../../../../utils/handlers';\n\nimport {ReplaceAllIcon, ReplaceIcon} from './ReplaceIcons';\n\nimport './SearchPopup.scss';\n\ntype SearchInitial = Pick<SearchQuery, 'search' | 'caseSensitive' | 'wholeWord'>;\ntype SearchConfig = Pick<SearchInitial, 'caseSensitive' | 'wholeWord'>;\n\ninterface SearchCardProps {\n initial: SearchInitial;\n onSearchKeyDown?: (query: string) => void;\n onChange?: (query: string) => void;\n onClose?: (query: string) => void;\n onSearchPrev?: (query: string) => void;\n onSearchNext?: (query: string) => void;\n onReplaceNext?: (query: string, replacement: string) => void;\n onReplaceAll?: (query: string, replacement: string) => void;\n onConfigChange?: (config: SearchConfig) => void;\n}\n\nconst b = cn('search-card');\n\nconst noop = () => {};\nconst inverse = (val: boolean) => !val;\n\nexport const SearchCard: React.FC<SearchCardProps> = ({\n initial,\n onChange = noop,\n onClose = noop,\n onSearchPrev = noop,\n onSearchNext = noop,\n onReplaceNext = noop,\n onReplaceAll = noop,\n onConfigChange = noop,\n}) => {\n const [query, setQuery] = useState<string>(initial.search);\n const [isCaseSensitive, setIsCaseSensitive] = useState<boolean>(initial.caseSensitive);\n const [isWholeWord, setIsWholeWord] = useState<boolean>(initial.wholeWord);\n const [replacement, setReplacement] = useState<string>('');\n const textInputRef = useRef<HTMLInputElement>(null);\n\n const setInputFocus = () => {\n textInputRef.current?.focus();\n };\n\n const handleInputChange = (value: string) => {\n setQuery(value);\n onChange(value);\n };\n\n const handleClose = () => {\n setQuery('');\n onClose(query);\n setInputFocus();\n };\n\n const handlePrev = () => {\n onSearchPrev(query);\n setInputFocus();\n };\n\n const handleNext = () => {\n onSearchNext(query);\n setInputFocus();\n };\n\n const handleReplace = () => {\n onReplaceNext(query, replacement);\n setInputFocus();\n };\n\n const handleReplaceAll = () => {\n onReplaceAll(query, replacement);\n setInputFocus();\n };\n\n const handleIsCaseSensitive = () => {\n onConfigChange({\n caseSensitive: !isCaseSensitive,\n wholeWord: isWholeWord,\n });\n setIsCaseSensitive(inverse);\n setInputFocus();\n };\n\n const handleIsWholeWord = () => {\n onConfigChange({\n caseSensitive: isCaseSensitive,\n wholeWord: !isWholeWord,\n });\n setIsWholeWord(inverse);\n setInputFocus();\n };\n\n const handleSearchKeyPress: TextInputProps['onKeyPress'] = enterKeyHandler(handleNext);\n\n return (\n <Card className={b()}>\n <div className={b('header')}>\n <span className={b('title')}> {i18n('title')}</span>\n <Button onClick={handleClose} size=\"s\" view=\"flat\">\n <Icon data={Xmark} size={14} />\n </Button>\n </div>\n <TextInput\n controlRef={textInputRef}\n className={sp({mb: 2})}\n size=\"s\"\n autoFocus\n onKeyPress={handleSearchKeyPress}\n onUpdate={handleInputChange}\n value={query}\n endContent={\n <>\n <Button onClick={handlePrev} pin=\"round-brick\">\n <Icon data={ChevronUp} size={12} />\n </Button>\n <Button onClick={handleNext} pin=\"brick-round\">\n <Icon data={ChevronDown} size={12} />\n </Button>\n </>\n }\n />\n <TextInput\n placeholder={i18n('replace_placeholder')}\n className={sp({mb: 2})}\n size=\"s\"\n onUpdate={setReplacement}\n value={replacement}\n endContent={\n <>\n <Button\n size=\"s\"\n onClick={handleReplace}\n pin=\"round-brick\"\n disabled={!query}\n title={i18n('action_replace')}\n >\n <ReplaceIcon width={12} height={12} />\n </Button>\n <Button\n size=\"s\"\n onClick={handleReplaceAll}\n pin=\"brick-round\"\n disabled={!query}\n title={i18n('action_replace_all')}\n >\n <ReplaceAllIcon width={12} height={12} />\n </Button>\n </>\n }\n />\n <Checkbox\n size=\"m\"\n onUpdate={handleIsCaseSensitive}\n checked={isCaseSensitive}\n className={sp({mr: 4})}\n >\n {i18n('label_case-sensitive')}\n </Checkbox>\n <Checkbox size=\"m\" onUpdate={handleIsWholeWord} checked={isWholeWord}>\n {i18n('label_whole-word')}\n </Checkbox>\n </Card>\n );\n};\n\nexport interface SearchPopupProps extends SearchCardProps {\n open: boolean;\n anchor: HTMLElement;\n onClose: () => void;\n}\n\nexport const SearchPopup: React.FC<SearchPopupProps> = ({open, anchor, ...props}) => {\n return (\n <Popup\n open={open}\n anchorElement={anchor}\n placement=\"bottom-end\"\n onOpenChange={(_open, _event, reason) => {\n if (reason === 'escape-key') {\n props.onClose();\n }\n }}\n >\n <SearchCard {...props} />\n </Popup>\n );\n};\n\nSearchPopup.displayName = 'SearchPopup';\n\ninterface SearchPopupWithRefProps extends Omit<SearchPopupProps, 'anchor'> {\n anchor: HTMLElement | null;\n}\n\nexport function renderSearchPopup({anchor, ...props}: SearchPopupWithRefProps) {\n return <>{anchor && <SearchPopup anchor={anchor} {...props} />}</>;\n}\n"]}
|
|
@@ -2,8 +2,6 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { Fragment, useEffect, useState } from 'react';
|
|
3
3
|
import { ChevronDown } from '@gravity-ui/icons';
|
|
4
4
|
import { HelpMark, Hotkey, Icon, Menu, Popover, Popup } from '@gravity-ui/uikit';
|
|
5
|
-
import { LAYOUT } from "../common/layout.js";
|
|
6
|
-
import { getTargetZIndex } from "../utils/get-target-z-index.js";
|
|
7
5
|
import { cn } from "../classname.js";
|
|
8
6
|
import { i18n } from "../i18n/common/index.js";
|
|
9
7
|
import { isFunction } from "../lodash.js";
|
|
@@ -42,7 +40,7 @@ export function ToolbarListButton({ className, editor, focus, onClick, icon, tit
|
|
|
42
40
|
setPopupItem(undefined);
|
|
43
41
|
else
|
|
44
42
|
toggleOpen();
|
|
45
|
-
}, disableTooltip: disableTooltip || popupOpen, children: buttonContent }), _jsx(Popup, { anchorElement: anchorElement, open: popupOpen, onOpenChange: hide,
|
|
43
|
+
}, disableTooltip: disableTooltip || popupOpen, children: buttonContent }), _jsx(Popup, { anchorElement: anchorElement, open: popupOpen, onOpenChange: hide, children: _jsx(Menu, { size: "l", className: b('menu'), qa: qaMenu, "data-toolbar-menu-for": titleText, children: data
|
|
46
44
|
.map((data) => {
|
|
47
45
|
const { id, title, icon, hotkey, isActive, isEnable, exec, hint, hintWhenDisabled, preview, } = data;
|
|
48
46
|
const titleText = isFunction(title) ? title() : title;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarListButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarListButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EAAC,MAAM,EAAC,4BAA0B;AACzC,OAAO,EAAC,eAAe,EAAC,uCAAqC;AAE7D,OAAO,EAAC,EAAE,EAAC,wBAAqB;AAChC,OAAO,EAAC,IAAI,EAAC,gCAAuB;AACpC,OAAO,EAAC,UAAU,EAAC,qBAAkB;AACrC,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,gCAA6B;AAEtE,OAAO,EAAC,cAAc,EAAC,4BAAyB;AAChD,OAAO,EAAC,iBAAiB,EAAC,2BAAwB;AAQlD,iCAAkC;AAElC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,CAAC;AAUpC,MAAM,UAAU,iBAAiB,CAAI,EACjC,SAAS,EACT,MAAM,EACN,KAAK,EACL,OAAO,EACP,IAAI,EACJ,KAAK,EACL,SAAS,EACT,IAAI,EACJ,YAAY,EACZ,iBAAiB,EACjB,EAAE,EACF,MAAM,EACN,uBAAuB,GAAG,mCAAmC,EAC7D,aAAa,EACb,cAAc,EACd,cAAc,GACU;IACxB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5D,MAAM,CAAC,IAAI,EAAE,AAAD,EAAG,IAAI,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,EAA6B,CAAC;IAExE,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;IAE3C,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,eAAe,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC;QACX,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAE5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE9D,IAAI,iBAAiB,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;QAChD,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,KAAC,IAAI,IAAS,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,IAAzC,CAAC,CAA4C,CAAC,CAAC;IACjF,IAAI,SAAS,EAAE,CAAC;QACZ,aAAa,CAAC,IAAI,CAAC,KAAC,QAAQ,cAAU,EAAE,IAAN,CAAC,CAAiB,CAAC,CAAC;QACtD,aAAa,CAAC,IAAI,CAAC,KAAC,IAAI,IAAS,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,IAA9B,CAAC,CAAiC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAW,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAE9D,OAAO,CACH,8BACI,KAAC,iBAAiB,IACd,EAAE,EAAE,EAAE,EACN,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,CAAC,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,SAAS,EAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAC7C,OAAO,EAAE,GAAG,EAAE;oBACV,IAAI,SAAS;wBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;;wBAClC,UAAU,EAAE,CAAC;gBACtB,CAAC,EACD,cAAc,EAAE,cAAc,IAAI,SAAS,YAE1C,aAAa,GACE,EACpB,KAAC,KAAK,IACF,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,SAAS,EACf,YAAY,EAAE,IAAI,EAClB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,YAE9C,KAAC,IAAI,IAAC,IAAI,EAAC,GAAG,EAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,2BAAyB,SAAS,YAC5E,IAAI;yBACA,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;wBACV,MAAM,EACF,EAAE,EACF,KAAK,EACL,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,gBAAgB,EAChB,OAAO,GACV,GAAG,IAAI,CAAC;wBAET,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;wBACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBAElD,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;wBAEnC,MAAM,oBAAoB,GAAG,gBAAgB,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;wBACrE,MAAM,oBAAoB,GACtB,OAAO,gBAAgB,KAAK,QAAQ;4BAChC,CAAC,CAAC,gBAAgB;4BAClB,CAAC,CAAC,OAAO,gBAAgB,KAAK,UAAU;gCACtC,CAAC,CAAC,gBAAgB,EAAE;gCACpB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;wBAE5C,MAAM,WAAW,GAAG,GAAG,EAAE;4BACrB,IAAI,EAAE,CAAC;4BAEP,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gCACpB,YAAY,CAAC,IAAI,CAAC,CAAC;4BACvB,CAAC;iCAAM,CAAC;gCACJ,YAAY,CAAC,SAAS,CAAC,CAAC;gCACxB,KAAK,EAAE,CAAC;gCACR,IAAI,CAAC,MAAM,CAAC,CAAC;gCACb,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;4BAClB,CAAC;wBACL,CAAC,CAAC;wBAEF,OAAO,CACH,KAAC,OAAO,IACJ,SAAS,EAAE,CAAC,CAAC,yBAAyB,CAAC,EACvC,OAAO,EACH,cAAK,SAAS,EAAE,CAAC,CAAC,yBAAyB,CAAC,YACvC,oBAAoB,GACnB,EAEV,SAAS,EAAC,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,oBAAoB,EAC9B,EAAE,EAAE,uBAAuB,YAG1B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CACb,KAAC,cAAc,IAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,YACtD,KAAC,IAAI,CAAC,IAAI,IAEN,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,WAAW,EACpB,SAAS,EACL,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,GAAI,EAEpD,UAAU,EAAE;wCACR,GAAG,KAAK;wCACR,YAAY,EAAE,SAAS;qCAC1B,YAED,eAAK,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,aACpB,SAAS,EACT,CAAC,aAAa,IAAI,CACf,eAAK,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aACrB,MAAM,IAAI,KAAC,MAAM,IAAC,KAAK,EAAE,MAAM,GAAI,EACnC,QAAQ,IAAI,CACT,KAAC,QAAQ,IACL,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EACpB,YAAY,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC,YAE3B,QAAQ,GACF,CACd,IACC,CACT,IACC,IA5BD,EAAE,CA6BC,GACC,CACpB,IApCI,EAAE,CAqCD,CACb,CAAC;oBACN,CAAC,CAAC;yBACD,MAAM,CAAC,OAAO,CAAC,GACjB,GACH,EACP,SAAS;gBACN,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;oBAClB,GAAG,SAAS;oBACZ,MAAM;oBACN,KAAK;oBACL,OAAO;oBACP,aAAa;oBACb,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC;iBACtC,CAAC;gBACJ,CAAC,CAAC,IAAI,IACX,CACN,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAI,IAAwB;IAC5C,OAAO,OAAO,CAAE,IAAkC,CAAC,WAAW,CAAC,CAAC;AACpE,CAAC","sourcesContent":["import {Fragment, useEffect, useState} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {HelpMark, Hotkey, Icon, Menu, Popover, Popup} from '@gravity-ui/uikit';\n\nimport {LAYOUT} from 'src/common/layout';\nimport {getTargetZIndex} from 'src/utils/get-target-z-index';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\nimport {useBooleanState, useElementState} from '../react-utils/hooks';\n\nimport {PreviewTooltip} from './PreviewTooltip';\nimport {ToolbarButtonView} from './ToolbarButton';\nimport type {\n ToolbarBaseProps,\n ToolbarButtonPopupData,\n ToolbarItemData,\n ToolbarListButtonData,\n} from './types';\n\nimport './ToolbarListButton.scss';\n\nconst b = cn('toolbar-list-button');\n\nexport type {ToolbarListButtonData};\n\nexport type ToolbarListButtonProps<E> = ToolbarBaseProps<E> &\n ToolbarListButtonData<E> & {\n qaMenu?: string;\n qaActionDisabledPopover?: string;\n };\n\nexport function ToolbarListButton<E>({\n className,\n editor,\n focus,\n onClick,\n icon,\n title,\n withArrow,\n data,\n alwaysActive,\n replaceActiveIcon,\n qa,\n qaMenu,\n qaActionDisabledPopover = 'g-md-toolbar-action-disabled-hint',\n disableHotkey,\n disablePreview,\n disableTooltip,\n}: ToolbarListButtonProps<E>) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const [popupItem, setPopupItem] = useState<ToolbarButtonPopupData<E>>();\n\n const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n if (data.length === 0) return null;\n\n const activeItem = data.find((item) => item.isActive(editor) && !item.doNotActivateList);\n const someActive = alwaysActive ? false : Boolean(activeItem);\n\n if (replaceActiveIcon && someActive && activeItem) {\n icon = activeItem.icon;\n }\n\n const buttonContent = [<Icon key={1} data={icon.data} size={icon.size ?? 16} />];\n if (withArrow) {\n buttonContent.push(<Fragment key={2}>{''}</Fragment>);\n buttonContent.push(<Icon key={3} data={ChevronDown} size={16} />);\n }\n const titleText: string = isFunction(title) ? title() : title;\n\n return (\n <>\n <ToolbarButtonView\n qa={qa}\n ref={setAnchorElement}\n active={someActive}\n enabled={!everyDisabled}\n title={title}\n className={b({arrow: withArrow}, [className])}\n onClick={() => {\n if (popupItem) setPopupItem(undefined);\n else toggleOpen();\n }}\n disableTooltip={disableTooltip || popupOpen}\n >\n {buttonContent}\n </ToolbarButtonView>\n <Popup\n anchorElement={anchorElement}\n open={popupOpen}\n onOpenChange={hide}\n zIndex={getTargetZIndex(LAYOUT.STICKY_TOOLBAR)}\n >\n <Menu size=\"l\" className={b('menu')} qa={qaMenu} data-toolbar-menu-for={titleText}>\n {data\n .map((data) => {\n const {\n id,\n title,\n icon,\n hotkey,\n isActive,\n isEnable,\n exec,\n hint,\n hintWhenDisabled,\n preview,\n } = data;\n\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n const disabled = !isEnable(editor);\n\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n const handleClick = () => {\n hide();\n\n if (isPopupItem(data)) {\n setPopupItem(data);\n } else {\n setPopupItem(undefined);\n focus();\n exec(editor);\n onClick?.(id);\n }\n };\n\n return (\n <Popover\n className={b('action-disabled-popover')}\n content={\n <div className={b('action-disabled-tooltip')}>\n {hintWhenDisabledText}\n </div>\n }\n placement=\"left\"\n modal={false}\n disabled={hideHintWhenDisabled}\n qa={qaActionDisabledPopover}\n key={id}\n >\n {(props, ref) => (\n <PreviewTooltip preview={preview} disabled={disablePreview}>\n <Menu.Item\n key={id}\n ref={ref}\n active={isActive(editor)}\n disabled={!isEnable(editor)}\n onClick={handleClick}\n iconStart={\n <Icon data={icon.data} size={icon.size ?? 16} />\n }\n extraProps={{\n ...props,\n 'aria-label': titleText,\n }}\n >\n <div className={b('item')}>\n {titleText}\n {!disableHotkey && (\n <div className={b('extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n className={b('hint')}\n popoverProps={{modal: false}}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n )}\n </div>\n </Menu.Item>\n </PreviewTooltip>\n )}\n </Popover>\n );\n })\n .filter(Boolean)}\n </Menu>\n </Popup>\n {popupItem\n ? popupItem.renderPopup({\n ...popupItem,\n editor,\n focus,\n onClick,\n anchorElement,\n hide: () => setPopupItem(undefined),\n })\n : null}\n </>\n );\n}\n\nfunction isPopupItem<E>(item: ToolbarItemData<E>): item is ToolbarButtonPopupData<E> {\n return Boolean((item as ToolbarButtonPopupData<E>).renderPopup);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ToolbarListButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarListButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, useEffect, useState} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {HelpMark, Hotkey, Icon, Menu, Popover, Popup} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\nimport {useBooleanState, useElementState} from '../react-utils/hooks';\n\nimport {PreviewTooltip} from './PreviewTooltip';\nimport {ToolbarButtonView} from './ToolbarButton';\nimport type {\n ToolbarBaseProps,\n ToolbarButtonPopupData,\n ToolbarItemData,\n ToolbarListButtonData,\n} from './types';\n\nimport './ToolbarListButton.scss';\n\nconst b = cn('toolbar-list-button');\n\nexport type {ToolbarListButtonData};\n\nexport type ToolbarListButtonProps<E> = ToolbarBaseProps<E> &\n ToolbarListButtonData<E> & {\n qaMenu?: string;\n qaActionDisabledPopover?: string;\n };\n\nexport function ToolbarListButton<E>({\n className,\n editor,\n focus,\n onClick,\n icon,\n title,\n withArrow,\n data,\n alwaysActive,\n replaceActiveIcon,\n qa,\n qaMenu,\n qaActionDisabledPopover = 'g-md-toolbar-action-disabled-hint',\n disableHotkey,\n disablePreview,\n disableTooltip,\n}: ToolbarListButtonProps<E>) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const [popupItem, setPopupItem] = useState<ToolbarButtonPopupData<E>>();\n\n const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n if (data.length === 0) return null;\n\n const activeItem = data.find((item) => item.isActive(editor) && !item.doNotActivateList);\n const someActive = alwaysActive ? false : Boolean(activeItem);\n\n if (replaceActiveIcon && someActive && activeItem) {\n icon = activeItem.icon;\n }\n\n const buttonContent = [<Icon key={1} data={icon.data} size={icon.size ?? 16} />];\n if (withArrow) {\n buttonContent.push(<Fragment key={2}>{''}</Fragment>);\n buttonContent.push(<Icon key={3} data={ChevronDown} size={16} />);\n }\n const titleText: string = isFunction(title) ? title() : title;\n\n return (\n <>\n <ToolbarButtonView\n qa={qa}\n ref={setAnchorElement}\n active={someActive}\n enabled={!everyDisabled}\n title={title}\n className={b({arrow: withArrow}, [className])}\n onClick={() => {\n if (popupItem) setPopupItem(undefined);\n else toggleOpen();\n }}\n disableTooltip={disableTooltip || popupOpen}\n >\n {buttonContent}\n </ToolbarButtonView>\n <Popup anchorElement={anchorElement} open={popupOpen} onOpenChange={hide}>\n <Menu size=\"l\" className={b('menu')} qa={qaMenu} data-toolbar-menu-for={titleText}>\n {data\n .map((data) => {\n const {\n id,\n title,\n icon,\n hotkey,\n isActive,\n isEnable,\n exec,\n hint,\n hintWhenDisabled,\n preview,\n } = data;\n\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n const disabled = !isEnable(editor);\n\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n const handleClick = () => {\n hide();\n\n if (isPopupItem(data)) {\n setPopupItem(data);\n } else {\n setPopupItem(undefined);\n focus();\n exec(editor);\n onClick?.(id);\n }\n };\n\n return (\n <Popover\n className={b('action-disabled-popover')}\n content={\n <div className={b('action-disabled-tooltip')}>\n {hintWhenDisabledText}\n </div>\n }\n placement=\"left\"\n modal={false}\n disabled={hideHintWhenDisabled}\n qa={qaActionDisabledPopover}\n key={id}\n >\n {(props, ref) => (\n <PreviewTooltip preview={preview} disabled={disablePreview}>\n <Menu.Item\n key={id}\n ref={ref}\n active={isActive(editor)}\n disabled={!isEnable(editor)}\n onClick={handleClick}\n iconStart={\n <Icon data={icon.data} size={icon.size ?? 16} />\n }\n extraProps={{\n ...props,\n 'aria-label': titleText,\n }}\n >\n <div className={b('item')}>\n {titleText}\n {!disableHotkey && (\n <div className={b('extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n className={b('hint')}\n popoverProps={{modal: false}}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n )}\n </div>\n </Menu.Item>\n </PreviewTooltip>\n )}\n </Popover>\n );\n })\n .filter(Boolean)}\n </Menu>\n </Popup>\n {popupItem\n ? popupItem.renderPopup({\n ...popupItem,\n editor,\n focus,\n onClick,\n anchorElement,\n hide: () => setPopupItem(undefined),\n })\n : null}\n </>\n );\n}\n\nfunction isPopupItem<E>(item: ToolbarItemData<E>): item is ToolbarButtonPopupData<E> {\n return Boolean((item as ToolbarButtonPopupData<E>).renderPopup);\n}\n"]}
|
package/build/esm/version.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** During build process, the current version will be injected here */
|
|
2
|
-
export const VERSION = typeof '15.
|
|
2
|
+
export const VERSION = typeof '15.23.0' !== 'undefined' ? '15.23.0' : 'unknown';
|
|
3
3
|
//# sourceMappingURL=version.js.map
|