@gravity-ui/markdown-editor 15.22.2 → 15.24.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 +2 -1
- package/build/cjs/bundle/ToolbarView.js.map +1 -1
- package/build/cjs/bundle/settings/index.d.ts +2 -1
- package/build/cjs/bundle/settings/index.js +6 -2
- package/build/cjs/bundle/settings/index.js.map +1 -1
- package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
- package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
- package/build/cjs/common/layout.d.ts +3 -0
- package/build/cjs/common/layout.js +7 -0
- package/build/cjs/common/layout.js.map +1 -0
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -2
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Table/commands.d.ts +2 -0
- package/build/cjs/extensions/markdown/Table/commands.js +73 -0
- package/build/cjs/extensions/markdown/Table/commands.js.map +1 -0
- package/build/cjs/extensions/markdown/Table/helpers.d.ts +7 -2
- package/build/cjs/extensions/markdown/Table/helpers.js +22 -9
- package/build/cjs/extensions/markdown/Table/helpers.js.map +1 -1
- package/build/cjs/extensions/markdown/Table/index.js +3 -0
- package/build/cjs/extensions/markdown/Table/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +35 -0
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +6 -0
- package/build/cjs/extensions/yfm/ImgSize/utils.js +25 -0
- package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js +6 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js +2 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +6 -6
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js +6 -6
- package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/const.d.ts +9 -1
- package/build/cjs/extensions/yfm/YfmCut/const.js +13 -6
- package/build/cjs/extensions/yfm/YfmCut/const.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/index.css +0 -3
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/plugins/active.js +6 -7
- package/build/cjs/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js +8 -9
- package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.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/react-utils/index.d.ts +1 -0
- package/build/cjs/react-utils/index.js +1 -0
- package/build/cjs/react-utils/index.js.map +1 -1
- package/build/cjs/react-utils/useSticky.js +13 -2
- package/build/cjs/react-utils/useSticky.js.map +1 -1
- package/build/cjs/react-utils/useTargetZIndex.d.ts +1 -0
- package/build/cjs/react-utils/useTargetZIndex.js +50 -0
- package/build/cjs/react-utils/useTargetZIndex.js.map +1 -0
- package/build/cjs/toolbar/ToolbarListButton.js +4 -1
- package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
- package/build/cjs/utils/get-target-z-index.d.ts +1 -0
- package/build/cjs/utils/get-target-z-index.js +17 -0
- package/build/cjs/utils/get-target-z-index.js.map +1 -0
- package/build/cjs/utils/inputrules.d.ts +1 -0
- package/build/cjs/utils/inputrules.js +8 -3
- package/build/cjs/utils/inputrules.js.map +1 -1
- package/build/cjs/utils/rulebuilders.js +2 -0
- package/build/cjs/utils/rulebuilders.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 +2 -1
- package/build/esm/bundle/ToolbarView.js.map +1 -1
- package/build/esm/bundle/settings/index.d.ts +2 -1
- package/build/esm/bundle/settings/index.js +6 -2
- package/build/esm/bundle/settings/index.js.map +1 -1
- package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
- package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
- package/build/esm/common/layout.d.ts +3 -0
- package/build/esm/common/layout.js +4 -0
- package/build/esm/common/layout.js.map +1 -0
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +1 -1
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
- package/build/esm/extensions/markdown/Table/commands.d.ts +2 -0
- package/build/esm/extensions/markdown/Table/commands.js +69 -0
- package/build/esm/extensions/markdown/Table/commands.js.map +1 -0
- package/build/esm/extensions/markdown/Table/helpers.d.ts +7 -2
- package/build/esm/extensions/markdown/Table/helpers.js +9 -3
- package/build/esm/extensions/markdown/Table/helpers.js.map +1 -1
- package/build/esm/extensions/markdown/Table/index.js +3 -0
- package/build/esm/extensions/markdown/Table/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +36 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/utils.d.ts +6 -0
- package/build/esm/extensions/yfm/ImgSize/utils.js +22 -0
- package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js +5 -0
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +7 -7
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js +5 -5
- package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/const.d.ts +9 -1
- package/build/esm/extensions/yfm/YfmCut/const.js +8 -1
- package/build/esm/extensions/yfm/YfmCut/const.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/index.css +0 -3
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/plugins/active.js +4 -5
- package/build/esm/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js +6 -7
- package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.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/react-utils/index.d.ts +1 -0
- package/build/esm/react-utils/index.js +1 -0
- package/build/esm/react-utils/index.js.map +1 -1
- package/build/esm/react-utils/useSticky.js +13 -2
- package/build/esm/react-utils/useSticky.js.map +1 -1
- package/build/esm/react-utils/useTargetZIndex.d.ts +1 -0
- package/build/esm/react-utils/useTargetZIndex.js +47 -0
- package/build/esm/react-utils/useTargetZIndex.js.map +1 -0
- package/build/esm/toolbar/ToolbarListButton.js +4 -1
- package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
- package/build/esm/utils/get-target-z-index.d.ts +1 -0
- package/build/esm/utils/get-target-z-index.js +14 -0
- package/build/esm/utils/get-target-z-index.js.map +1 -0
- package/build/esm/utils/inputrules.d.ts +1 -0
- package/build/esm/utils/inputrules.js +5 -1
- package/build/esm/utils/inputrules.js.map +1 -1
- package/build/esm/utils/rulebuilders.js +3 -1
- package/build/esm/utils/rulebuilders.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +7 -8
- package/package.json +2 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Plugin } from
|
|
1
|
+
import { Plugin } from "../../../../pm/state.js";
|
|
2
2
|
export declare const cutActivePlugin: () => Plugin<any>;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { Plugin } from
|
|
2
|
-
import { Decoration, DecorationSet } from
|
|
1
|
+
import { Plugin } from "../../../../pm/state.js";
|
|
2
|
+
import { Decoration, DecorationSet } from "../../../../pm/view.js";
|
|
3
3
|
import { isNodeSelection, isTextSelection } from "../../../../utils/selection.js";
|
|
4
|
-
import { cutType } from "../const.js";
|
|
5
|
-
const YFM_CUT_ACTIVE_CLASSNAME = 'yfm-cut-active';
|
|
4
|
+
import { YfmCutClassName, cutType } from "../const.js";
|
|
6
5
|
export const cutActivePlugin = () => {
|
|
7
6
|
return new Plugin({
|
|
8
7
|
props: {
|
|
@@ -12,7 +11,7 @@ export const cutActivePlugin = () => {
|
|
|
12
11
|
const yfmCutType = cutType(state.schema);
|
|
13
12
|
const createDeco = ({ pos, node }) => {
|
|
14
13
|
decos.push(Decoration.node(pos, pos + node.nodeSize, {
|
|
15
|
-
class:
|
|
14
|
+
class: YfmCutClassName.Active,
|
|
16
15
|
}));
|
|
17
16
|
};
|
|
18
17
|
if (isNodeSelection(sel)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/active.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,
|
|
1
|
+
{"version":3,"file":"active.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/active.ts"],"names":[],"mappings":"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","sourcesContent":["import type {NodeType, ResolvedPos} from '#pm/model';\nimport {Plugin} from '#pm/state';\nimport type {NodeWithPos} from '#pm/utils';\nimport {Decoration, DecorationSet} from '#pm/view';\nimport {isNodeSelection, isTextSelection} from 'src/utils/selection';\n\nimport {YfmCutClassName, cutType} from '../const';\n\nexport const cutActivePlugin = () => {\n return new Plugin({\n props: {\n decorations(state) {\n const decos: Decoration[] = [];\n const sel = state.selection;\n const yfmCutType = cutType(state.schema);\n\n const createDeco = ({pos, node}: NodeWithPos) => {\n decos.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: YfmCutClassName.Active,\n }),\n );\n };\n\n if (isNodeSelection(sel)) {\n if (sel.node.type === yfmCutType) createDeco({pos: sel.from, node: sel.node});\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n } else if (isTextSelection(sel)) {\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n if (!sel.$from.sameParent(sel.$to)) {\n findParentNodesOfType(yfmCutType, sel.$to).forEach(createDeco);\n state.doc.nodesBetween(sel.from, sel.to, (node, pos) => {\n if (node.type === yfmCutType) createDeco({pos, node});\n if (node.isTextblock) return false;\n return true;\n });\n }\n } else {\n // some other selection\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n }\n\n return decos.length ? DecorationSet.create(state.doc, decos) : DecorationSet.empty;\n },\n },\n });\n};\n\nfunction findParentNodesOfType(\n type: NodeType,\n $pos: ResolvedPos,\n): (NodeWithPos & {depth: number})[] {\n let {depth} = $pos;\n const nodes: (NodeWithPos & {depth: number})[] = [];\n\n while (depth >= 0) {\n const node = $pos.node(depth);\n if (node.type === type) nodes.push({depth, node, pos: $pos.before(depth)});\n depth--;\n }\n\n return nodes;\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Plugin } from
|
|
1
|
+
import { Plugin } from "../../../../pm/state.js";
|
|
2
2
|
export declare const cutAutoOpenPlugin: () => Plugin<any>;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Plugin, PluginKey } from
|
|
2
|
-
|
|
3
|
-
import { findDomRefAtPos } from 'prosemirror-utils';
|
|
1
|
+
import { Plugin, PluginKey } from "../../../../pm/state.js";
|
|
2
|
+
import { findDomRefAtPos } from "../../../../pm/utils.js";
|
|
4
3
|
import { throttle } from "../../../../lodash.js";
|
|
5
4
|
import { isTextSelection } from "../../../../utils/selection.js";
|
|
6
|
-
import { cutContentType, cutType } from "../const.js";
|
|
5
|
+
import { YfmCutClassName, cutContentType, cutType } from "../const.js";
|
|
7
6
|
const key = new PluginKey('yfm-cut-auto-open');
|
|
8
7
|
export const cutAutoOpenPlugin = () => {
|
|
9
8
|
return new Plugin({
|
|
@@ -38,7 +37,7 @@ function openParentYfmCuts($pos, domAtPos) {
|
|
|
38
37
|
if ($pos.node(depth).type === cutContentType(schema)) {
|
|
39
38
|
if ($pos.node(depth - 1).type === cutType(schema)) {
|
|
40
39
|
const { node: cutDomNode } = domAtPos($pos.start(depth - 1), 0);
|
|
41
|
-
cutDomNode.classList.add(
|
|
40
|
+
cutDomNode.classList.add(YfmCutClassName.Open);
|
|
42
41
|
depth--;
|
|
43
42
|
}
|
|
44
43
|
}
|
|
@@ -46,7 +45,7 @@ function openParentYfmCuts($pos, domAtPos) {
|
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
class CutAutoOpenOnDragOver {
|
|
49
|
-
static YFM_CUT_SELECTOR =
|
|
48
|
+
static YFM_CUT_SELECTOR = `.${YfmCutClassName.Cut}:not(.${YfmCutClassName.Open})`;
|
|
50
49
|
static OPEN_TIMEOUT = 500; //ms
|
|
51
50
|
static THROTTLE_WAIT = 50; //ms
|
|
52
51
|
_cutElem = null;
|
|
@@ -92,7 +91,7 @@ class CutAutoOpenOnDragOver {
|
|
|
92
91
|
}
|
|
93
92
|
_openCut() {
|
|
94
93
|
if (this._editorView.dragging) {
|
|
95
|
-
this._cutElem?.classList.add(
|
|
94
|
+
this._cutElem?.classList.add(YfmCutClassName.Open);
|
|
96
95
|
}
|
|
97
96
|
this._clear();
|
|
98
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-open.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/auto-open.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAE,SAAS,EAAkB,
|
|
1
|
+
{"version":3,"file":"auto-open.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/auto-open.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ResolvedPos} from '#pm/model';\nimport {Plugin, PluginKey, type PluginView} from '#pm/state';\nimport {findDomRefAtPos} from '#pm/utils';\nimport type {EditorView} from '#pm/view';\nimport {throttle} from 'src/lodash';\nimport {isTextSelection} from 'src/utils/selection';\n\nimport {YfmCutClassName, cutContentType, cutType} from '../const';\n\nconst key = new PluginKey('yfm-cut-auto-open');\n\nexport const cutAutoOpenPlugin = () => {\n return new Plugin({\n key,\n view(view) {\n update(view);\n const dragHandler = new CutAutoOpenOnDragOver(view);\n return {\n update: (view) => update(view),\n destroy: () => dragHandler.destroy(),\n };\n },\n });\n};\n\nfunction update(view: EditorView) {\n const sel = view.state.selection;\n const domAtPos = view.domAtPos.bind(view);\n if (isTextSelection(sel)) {\n if (sel.$cursor) {\n openParentYfmCuts(sel.$cursor, domAtPos);\n } else {\n openParentYfmCuts(sel.$head, domAtPos);\n openParentYfmCuts(sel.$anchor, domAtPos);\n }\n }\n}\n\nfunction openParentYfmCuts($pos: ResolvedPos, domAtPos: EditorView['domAtPos']): void {\n let {depth} = $pos;\n const {schema} = $pos.parent.type;\n while (depth > 0) {\n if ($pos.node(depth).type === cutContentType(schema)) {\n if ($pos.node(depth - 1).type === cutType(schema)) {\n const {node: cutDomNode} = domAtPos($pos.start(depth - 1), 0);\n (cutDomNode as Element).classList.add(YfmCutClassName.Open);\n depth--;\n }\n }\n depth--;\n }\n}\n\nclass CutAutoOpenOnDragOver implements PluginView {\n private static readonly YFM_CUT_SELECTOR =\n `.${YfmCutClassName.Cut}:not(.${YfmCutClassName.Open})` as const;\n private static readonly OPEN_TIMEOUT = 500; //ms\n private static readonly THROTTLE_WAIT = 50; //ms\n\n private _cutElem: HTMLElement | null = null;\n private _editorView: EditorView;\n private _timeout: ReturnType<typeof setTimeout> | null = null;\n private readonly _docListener;\n\n constructor(view: EditorView) {\n this._editorView = view;\n this._docListener = throttle(\n this._onDocEvent.bind(this),\n CutAutoOpenOnDragOver.THROTTLE_WAIT,\n );\n document.addEventListener('mousemove', this._docListener);\n document.addEventListener('dragover', this._docListener);\n }\n\n destroy(): void {\n this._clear();\n this._docListener.cancel();\n document.removeEventListener('mousemove', this._docListener);\n document.removeEventListener('dragover', this._docListener);\n }\n\n private _onDocEvent(event: MouseEvent) {\n const view = this._editorView;\n if (!view.dragging) return;\n const pos = view.posAtCoords({left: event.clientX, top: event.clientY});\n if (!pos) return;\n const elem = findDomRefAtPos(pos.pos, view.domAtPos.bind(view)) as HTMLElement;\n const cutElem = elem.closest(CutAutoOpenOnDragOver.YFM_CUT_SELECTOR);\n if (cutElem === this._cutElem) return;\n this._clear();\n if (cutElem) this._setCutElem(cutElem as HTMLElement);\n }\n\n private _clear() {\n if (this._timeout !== null) clearTimeout(this._timeout);\n this._timeout = null;\n this._cutElem = null;\n }\n\n private _setCutElem(elem: HTMLElement) {\n this._cutElem = elem;\n this._timeout = setTimeout(this._openCut.bind(this), CutAutoOpenOnDragOver.OPEN_TIMEOUT);\n }\n\n private _openCut() {\n if (this._editorView.dragging) {\n this._cutElem?.classList.add(YfmCutClassName.Open);\n }\n this._clear();\n }\n}\n"]}
|
|
@@ -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) => {
|