@easyv/biz-components 2.1.4 → 2.1.6
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/dist/lib/_virtual/index.es2.js +2 -2
- package/dist/lib/_virtual/index.es3.js +2 -2
- package/dist/lib/components/ai-components/mobile-voice-input/icon-button.es.js +1 -1
- package/dist/lib/components/ai-components/mobile-voice-input/mobile-voice-input.es.js +5 -5
- package/dist/lib/components/code-mirror-editor/code-mirror-editor.es.js +9 -9
- package/dist/lib/components/code-mirror-editor/code-mirror-editor.es.js.map +1 -1
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus-context-menu.es.js +84 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus-context-menu.es.js.map +1 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus-editable-cell.es.js +58 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus-editable-cell.es.js.map +1 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus-selection.hook.es.js +97 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus-selection.hook.es.js.map +1 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus.es.js +1063 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus.es.js.map +1 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid.module.less.es.js +7 -0
- package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid.module.less.es.js.map +1 -0
- package/dist/lib/components/easyv-reactgrid-plus/utils.es.js +93 -0
- package/dist/lib/components/easyv-reactgrid-plus/utils.es.js.map +1 -0
- package/dist/lib/easyv-biz-components/src/components/code-mirror-editor/code-mirror-editor.d.ts +2 -2
- package/dist/lib/easyv-biz-components/src/components/easyv-reactgrid-plus/easyv-react-grid-plus-context-menu.d.ts +14 -0
- package/dist/lib/easyv-biz-components/src/components/easyv-reactgrid-plus/easyv-react-grid-plus-editable-cell.d.ts +11 -0
- package/dist/lib/easyv-biz-components/src/components/easyv-reactgrid-plus/easyv-react-grid-plus-selection.hook.d.ts +16 -0
- package/dist/lib/easyv-biz-components/src/components/easyv-reactgrid-plus/easyv-react-grid-plus.d.ts +16 -0
- package/dist/lib/easyv-biz-components/src/components/easyv-reactgrid-plus/easyv-react-grid-plus.types.d.ts +18 -0
- package/dist/lib/easyv-biz-components/src/components/easyv-reactgrid-plus/index.d.ts +1 -0
- package/dist/lib/easyv-biz-components/src/components/easyv-reactgrid-plus/test/easyv-react-grid-plus.cy.d.ts +1 -0
- package/dist/lib/easyv-biz-components/src/components/easyv-reactgrid-plus/utils.d.ts +6 -0
- package/dist/lib/easyv-biz-components/src/components/index.d.ts +1 -0
- package/dist/lib/easyv-biz-components/src/utils/ai-agent-message-manager/constants.d.ts +3 -1
- package/dist/lib/easyv-biz-components/src/utils/ai-agent-message-manager/types.d.ts +1 -0
- package/dist/lib/easyv-biz-components/src/utils/ai-agent-message-manager/utils.d.ts +1 -0
- package/dist/lib/easyv-biz-components/src/utils/easy-fetch/easy-fetch.d.ts +13 -0
- package/dist/lib/easyv-biz-components/src/utils/easy-fetch/index.d.ts +1 -0
- package/dist/lib/easyv-biz-components/src/utils/easy-fetch/test/easy-fetch.cy.d.ts +1 -0
- package/dist/lib/easyv-biz-components/src/utils/easy-fetch/types.d.ts +6 -0
- package/dist/lib/easyv-biz-components/src/utils/easyv-gui-helper/component-dimension.d.ts +2 -0
- package/dist/lib/easyv-biz-components/src/utils/easyv-gui-helper/easyv-gui-helper.d.ts +3 -0
- package/dist/lib/easyv-biz-components/src/utils/easyv-gui-helper/types.d.ts +3 -0
- package/dist/lib/easyv-biz-components/src/utils/index.d.ts +2 -0
- package/dist/lib/easyv-biz-components/src/utils/twin/index.d.ts +1 -0
- package/dist/lib/easyv-biz-components/src/utils/twin/utils.d.ts +5 -0
- package/dist/lib/hooks/use-tencent-sentence-recognition/use-tencent-sentence-recognition.es.js +2 -2
- package/dist/lib/index.es.js +8 -1
- package/dist/lib/index.es.js.map +1 -1
- package/dist/lib/node_modules/.pnpm/@tanstack_react-table@8.21.3_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@tanstack/react-table/build/lib/index.es.js +103 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_react-table@8.21.3_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@tanstack/react-table/build/lib/index.es.js.map +1 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_react-virtual@3.13.23_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@tanstack/react-virtual/dist/esm/index.es.js +53 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_react-virtual@3.13.23_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@tanstack/react-virtual/dist/esm/index.es.js.map +1 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_table-core@8.21.3/node_modules/@tanstack/table-core/build/lib/index.es.js +2672 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_table-core@8.21.3/node_modules/@tanstack/table-core/build/lib/index.es.js.map +1 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_virtual-core@3.13.23/node_modules/@tanstack/virtual-core/dist/esm/index.es.js +871 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_virtual-core@3.13.23/node_modules/@tanstack/virtual-core/dist/esm/index.es.js.map +1 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_virtual-core@3.13.23/node_modules/@tanstack/virtual-core/dist/esm/utils.es.js +73 -0
- package/dist/lib/node_modules/.pnpm/@tanstack_virtual-core@3.13.23/node_modules/@tanstack/virtual-core/dist/esm/utils.es.js.map +1 -0
- package/dist/lib/node_modules/.pnpm/co-web-worker@1.0.1/node_modules/co-web-worker/index.es.js +1 -1
- package/dist/lib/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isString.es.js +11 -0
- package/dist/lib/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isString.es.js.map +1 -0
- package/dist/lib/node_modules/.pnpm/prop-types@15.8.1/node_modules/prop-types/index.es.js +1 -1
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{button-Dip6wfc7.es.es.js → button-VOE5PncW.es.es.js} +2 -2
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{button-Dip6wfc7.es.es.js.map → button-VOE5PncW.es.es.js.map} +1 -1
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{index-EAFzPBke.es.es.js → index-6AIVHTQ0.es.es.js} +11 -11
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{index-EAFzPBke.es.es.js.map → index-6AIVHTQ0.es.es.js.map} +1 -1
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{index-zvVd1BJp.es.es.js → index-DttpqRHH.es.es.js} +596 -605
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/index-DttpqRHH.es.es.js.map +1 -0
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{input-Dhdn9e9Z.es.es.js → input-CqQJPvav.es.es.js} +54 -54
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{input-Dhdn9e9Z.es.es.js.map → input-CqQJPvav.es.es.js.map} +1 -1
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{keycode-DOHuQiUY.es.es.js → keycode-cVKDBtW_.es.es.js} +4 -4
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/{keycode-DOHuQiUY.es.es.js.map → keycode-cVKDBtW_.es.es.js.map} +1 -1
- package/dist/lib/packages/easyv-arco/dist/lib/index.es.es.js.map +1 -1
- package/dist/lib/stats.html +1 -1
- package/dist/lib/style.pkg.css +1 -1
- package/dist/lib/utils/ai-agent-message-manager/ai-agent-message-manager.es.js +9 -1
- package/dist/lib/utils/ai-agent-message-manager/ai-agent-message-manager.es.js.map +1 -1
- package/dist/lib/utils/ai-agent-message-manager/constants.es.js +4 -2
- package/dist/lib/utils/ai-agent-message-manager/constants.es.js.map +1 -1
- package/dist/lib/utils/ai-agent-message-manager/types.es.js.map +1 -1
- package/dist/lib/utils/ai-agent-message-manager/utils.es.js +10 -0
- package/dist/lib/utils/ai-agent-message-manager/utils.es.js.map +1 -0
- package/dist/lib/utils/easy-fetch/easy-fetch.es.js +88 -0
- package/dist/lib/utils/easy-fetch/easy-fetch.es.js.map +1 -0
- package/dist/lib/utils/easyv-gui-helper/easyv-gui-helper.es.js +13 -4
- package/dist/lib/utils/easyv-gui-helper/easyv-gui-helper.es.js.map +1 -1
- package/dist/lib/utils/show-modal/show-modal.es.js +5 -5
- package/dist/lib/utils/twin/utils.es.js +30 -0
- package/dist/lib/utils/twin/utils.es.js.map +1 -0
- package/dist/tailwindcss.pkg.css +113 -0
- package/package.json +14 -8
- package/dist/lib/packages/easyv-arco/dist/lib/chunks/index-zvVd1BJp.es.es.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { j as jsxRuntimeExports } from "../../../node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.es.js";
|
|
2
2
|
import "../../../packages/easyv-arco/dist/lib/index.es.es.js";
|
|
3
3
|
import classNames from "../../../node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js";
|
|
4
|
-
import { A } from "../../../packages/easyv-arco/dist/lib/chunks/button-
|
|
4
|
+
import { A } from "../../../packages/easyv-arco/dist/lib/chunks/button-VOE5PncW.es.es.js";
|
|
5
5
|
const IconButton = (props) => {
|
|
6
6
|
const { className = "", icon, onClick } = props;
|
|
7
7
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
@@ -6,9 +6,9 @@ import useMemoizedFn from "../../../node_modules/.pnpm/ahooks@3.8.5_react@18.2.0
|
|
|
6
6
|
import classNames from "../../../node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js";
|
|
7
7
|
import { IconButton } from "./icon-button.es.js";
|
|
8
8
|
import { useTencentSentenceRecognition } from "../../../hooks/use-tencent-sentence-recognition/use-tencent-sentence-recognition.es.js";
|
|
9
|
-
import { M as
|
|
10
|
-
import { A as Jn } from "../../../packages/easyv-arco/dist/lib/chunks/input-
|
|
11
|
-
import { A } from "../../../packages/easyv-arco/dist/lib/chunks/button-
|
|
9
|
+
import { M as De } from "../../../packages/easyv-arco/dist/lib/chunks/index-DttpqRHH.es.es.js";
|
|
10
|
+
import { A as Jn } from "../../../packages/easyv-arco/dist/lib/chunks/input-CqQJPvav.es.es.js";
|
|
11
|
+
import { A } from "../../../packages/easyv-arco/dist/lib/chunks/button-VOE5PncW.es.es.js";
|
|
12
12
|
import { VoiceAnimation } from "../../voice-animation/voice-animation.es.js";
|
|
13
13
|
import { getIsPrivateDeployEnv } from "../../../utils/common/common.es.js";
|
|
14
14
|
const MobileVoiceInputCpn = (props, ref) => {
|
|
@@ -61,12 +61,12 @@ const MobileVoiceInputCpn = (props, ref) => {
|
|
|
61
61
|
if (recordTime < 500) {
|
|
62
62
|
setVoiceRecognizeRes("");
|
|
63
63
|
needRequestAsr = false;
|
|
64
|
-
|
|
64
|
+
De.error("录音时间过短");
|
|
65
65
|
}
|
|
66
66
|
if (recordTime > 59 * 1e3) {
|
|
67
67
|
setVoiceRecognizeRes("");
|
|
68
68
|
needRequestAsr = false;
|
|
69
|
-
|
|
69
|
+
De.error("录音时间最多支持一分钟");
|
|
70
70
|
}
|
|
71
71
|
stopVoiceRecord(needRequestAsr);
|
|
72
72
|
}
|
|
@@ -15,7 +15,7 @@ import { createCustomCompletionsSource, lintJavaScriptCode } from "./utils.es.js
|
|
|
15
15
|
const CodeMirrorEditor = (props) => {
|
|
16
16
|
const {
|
|
17
17
|
languageMode,
|
|
18
|
-
|
|
18
|
+
value,
|
|
19
19
|
onChange,
|
|
20
20
|
wrapperClassName,
|
|
21
21
|
wrapperStyle,
|
|
@@ -25,8 +25,8 @@ const CodeMirrorEditor = (props) => {
|
|
|
25
25
|
customCompletions,
|
|
26
26
|
...restCodeMirrorProps
|
|
27
27
|
} = props;
|
|
28
|
-
const handleOnChange = (
|
|
29
|
-
onChange == null ? void 0 : onChange(
|
|
28
|
+
const handleOnChange = (value2) => {
|
|
29
|
+
onChange == null ? void 0 : onChange(value2);
|
|
30
30
|
};
|
|
31
31
|
const createCustomCompletions = useCallback(
|
|
32
32
|
() => createCustomCompletionsSource(customCompletions),
|
|
@@ -34,16 +34,16 @@ const CodeMirrorEditor = (props) => {
|
|
|
34
34
|
);
|
|
35
35
|
const createJSLinter = useMemoizedFn(() => {
|
|
36
36
|
return (view) => {
|
|
37
|
-
const
|
|
38
|
-
return lintJavaScriptCode(
|
|
37
|
+
const code = view.state.doc.toString();
|
|
38
|
+
return lintJavaScriptCode(code, environment, view);
|
|
39
39
|
};
|
|
40
40
|
});
|
|
41
41
|
const createJSONLinter = () => {
|
|
42
42
|
const fn = (view) => {
|
|
43
43
|
const diagnostics = [];
|
|
44
|
-
const
|
|
44
|
+
const code = view.state.doc.toString();
|
|
45
45
|
try {
|
|
46
|
-
JSON.parse(
|
|
46
|
+
JSON.parse(code);
|
|
47
47
|
} catch (error) {
|
|
48
48
|
const match = error.message.match(/position (\d+)/);
|
|
49
49
|
if (match) {
|
|
@@ -103,12 +103,12 @@ const CodeMirrorEditor = (props) => {
|
|
|
103
103
|
ReactCodeMirror,
|
|
104
104
|
{
|
|
105
105
|
...restCodeMirrorProps,
|
|
106
|
-
value
|
|
106
|
+
value,
|
|
107
107
|
extensions: [
|
|
108
108
|
...Array.isArray(langExtension) ? langExtension : [langExtension],
|
|
109
109
|
...showLintGutter ? [lintGutter()] : [],
|
|
110
110
|
linter(codeLinter()),
|
|
111
|
-
...placeholderText && !
|
|
111
|
+
...placeholderText && !value ? [placeholder(placeholderText)] : [],
|
|
112
112
|
EditorView.lineWrapping
|
|
113
113
|
// 添加自动换行扩展
|
|
114
114
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-mirror-editor.es.js","sources":["../../../../src/components/code-mirror-editor/code-mirror-editor.tsx"],"sourcesContent":["import { ComponentProps, useCallback, useMemo } from \"react\";\nimport { javascript, javascriptLanguage } from \"@codemirror/lang-javascript\";\nimport { json } from \"@codemirror/lang-json\";\nimport { sql } from \"@codemirror/lang-sql\";\nimport { Diagnostic, linter, lintGutter, LintSource } from \"@codemirror/lint\";\nimport { EditorView, placeholder } from \"@codemirror/view\";\nimport { tags as t } from \"@lezer/highlight\";\nimport { abcdefInit } from \"@uiw/codemirror-theme-abcdef\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { useMemoizedFn } from \"ahooks\";\nimport classNames from \"classnames\";\nimport { CustomCompletionConfig } from \"./types\";\nimport { createCustomCompletionsSource, lintJavaScriptCode } from \"./utils\";\nimport \"./completion.css\";\n\nexport interface CodeMirrorEditorProps extends ComponentProps<typeof CodeMirror> {\n languageMode: \"javascript\" | \"json\" | \"sql\";\n
|
|
1
|
+
{"version":3,"file":"code-mirror-editor.es.js","sources":["../../../../src/components/code-mirror-editor/code-mirror-editor.tsx"],"sourcesContent":["import { ComponentProps, useCallback, useMemo } from \"react\";\nimport { javascript, javascriptLanguage } from \"@codemirror/lang-javascript\";\nimport { json } from \"@codemirror/lang-json\";\nimport { sql } from \"@codemirror/lang-sql\";\nimport { Diagnostic, linter, lintGutter, LintSource } from \"@codemirror/lint\";\nimport { EditorView, placeholder } from \"@codemirror/view\";\nimport { tags as t } from \"@lezer/highlight\";\nimport { abcdefInit } from \"@uiw/codemirror-theme-abcdef\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { useMemoizedFn } from \"ahooks\";\nimport classNames from \"classnames\";\nimport { CustomCompletionConfig } from \"./types\";\nimport { createCustomCompletionsSource, lintJavaScriptCode } from \"./utils\";\nimport \"./completion.css\";\n\nexport interface CodeMirrorEditorProps extends ComponentProps<typeof CodeMirror> {\n languageMode: \"javascript\" | \"json\" | \"sql\";\n value?: string;\n onChange?: (v: string) => void;\n wrapperClassName?: string;\n wrapperStyle?: React.CSSProperties;\n environment?: \"browser\" | \"node\"; // 运行环境选择\n placeholder?: string; // placeholder 文本\n /** 是否显示左侧错误图标,默认为 false */\n showLintGutter?: boolean;\n /** 自定义补全配置 */\n customCompletions?: CustomCompletionConfig;\n}\n\nexport const CodeMirrorEditor = (props: CodeMirrorEditorProps) => {\n const {\n languageMode,\n value,\n onChange,\n wrapperClassName,\n wrapperStyle,\n environment = \"browser\",\n placeholder: placeholderText,\n showLintGutter = false,\n customCompletions,\n ...restCodeMirrorProps\n } = props;\n\n const handleOnChange = (value: string) => {\n onChange?.(value);\n };\n\n // 创建自定义补全源,用于全局对象方法补全和自定义变量/函数补全\n const createCustomCompletions = useCallback(\n () => createCustomCompletionsSource(customCompletions),\n [customCompletions],\n );\n\n // 自定义JavaScript语法检查器\n const createJSLinter: () => LintSource = useMemoizedFn(() => {\n return (view: EditorView) => {\n const code = view.state.doc.toString() as string;\n return lintJavaScriptCode(code, environment, view);\n };\n });\n\n // 自定义JSON语法检查器\n const createJSONLinter: () => LintSource = () => {\n const fn: LintSource = (view: any) => {\n const diagnostics: Diagnostic[] = [];\n const code = view.state.doc.toString();\n\n try {\n JSON.parse(code);\n } catch (error: any) {\n const match = error.message.match(/position (\\d+)/);\n if (match) {\n const pos = parseInt(match[1]);\n const line = view.state.doc.lineAt(pos);\n const from = line.from;\n const to = line.to;\n\n diagnostics.push({\n from,\n to,\n severity: \"error\",\n message: `JSON解析错误: ${error.message.replace(\"JSON.parse: \", \"\")}`,\n });\n }\n }\n return diagnostics;\n };\n return fn;\n };\n\n // 为JavaScript语言添加自定义补全源\n const langExtension = useMemo(() => {\n if (languageMode === \"javascript\") {\n return [\n javascript(),\n javascriptLanguage.data.of({\n autocomplete: createCustomCompletions(),\n }),\n ];\n }\n if (languageMode === \"json\") {\n return json();\n }\n return sql();\n }, [languageMode, createCustomCompletions]);\n const codeLinter = () => {\n if (languageMode === \"javascript\") {\n return createJSLinter();\n }\n if (languageMode === \"json\") {\n return createJSONLinter();\n }\n return null;\n };\n\n return (\n <div\n className={classNames(\n \"biz-border-one biz-border-[#393b4a]\",\n 'rp-[[class~=\"cm-gutters-before\"]]:biz-border-r-[1px] rp-[[class~=\"cm-gutters-before\"]]:biz-border-[#393b4a]',\n 'rp-[[class~=\"cm-gutters-before\"]]:biz-border-solid rp-[[class~=\"cm-gutters-before\"]]:biz-border-0',\n // 防止聚焦时边框变成虚线\n 'rp-[[class~=\"cm-focused\"]]:!biz-outline-0',\n \"rp-[.cm-completionDetail]:!biz-text-[#ffffff66] rp-[.cm-completionDetail]:!biz-not-italic\",\n wrapperClassName,\n )}\n style={wrapperStyle}\n >\n <CodeMirror\n {...restCodeMirrorProps}\n value={value}\n extensions={[\n ...(Array.isArray(langExtension) ? langExtension : [langExtension]),\n ...(showLintGutter ? [lintGutter()] : []),\n linter(codeLinter()),\n ...(placeholderText && !value ? [placeholder(placeholderText)] : []),\n EditorView.lineWrapping, // 添加自动换行扩展\n ]}\n theme={abcdefInit({\n settings: {\n caret: \"#c6c6c6\",\n fontFamily: \"monospace\",\n gutterBackground: \"#111111\", // 行号列背景色\n gutterForeground: \"rgba(255, 255, 255, 0.8)\", // 行号文字颜色\n gutterBorder: \"#393b4a\", // 行号列边框颜色\n lineHighlight: \"rgba(255, 255, 255, 0.031)\", // 高亮行背景色\n },\n styles: [\n { tag: t.comment, color: \"#6272a4\" },\n { tag: t.string, color: \"#61afef\" }, // 字符串引号中的文字\n { tag: t.number, color: \"#e5c07b\" },\n ],\n })}\n onChange={handleOnChange}\n basicSetup={{\n lineNumbers: true,\n highlightActiveLineGutter: true,\n highlightActiveLine: true,\n bracketMatching: true,\n closeBrackets: true,\n foldGutter: true,\n tabSize: 2,\n indentOnInput: true,\n syntaxHighlighting: true,\n autocompletion: true,\n ...(typeof restCodeMirrorProps?.basicSetup === \"object\"\n ? restCodeMirrorProps.basicSetup\n : undefined),\n }}\n />\n </div>\n );\n};\n"],"names":["value","jsx","CodeMirror","t"],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { j as jsxRuntimeExports } from "../../node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.es.js";
|
|
2
|
+
import { getContextMenuItems } from "./utils.es.js";
|
|
3
|
+
const EasyvReactGridPlusContextMenu = ({
|
|
4
|
+
visible,
|
|
5
|
+
x,
|
|
6
|
+
y,
|
|
7
|
+
isRowHeaderMenu,
|
|
8
|
+
isColHeaderMenu,
|
|
9
|
+
insertRowCount,
|
|
10
|
+
insertColCount,
|
|
11
|
+
setInsertRowCount,
|
|
12
|
+
setInsertColCount,
|
|
13
|
+
runMenuAction
|
|
14
|
+
}) => {
|
|
15
|
+
if (!visible) return null;
|
|
16
|
+
const items = getContextMenuItems(isRowHeaderMenu, isColHeaderMenu).filter(
|
|
17
|
+
(item) => item.visible
|
|
18
|
+
);
|
|
19
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
20
|
+
"div",
|
|
21
|
+
{
|
|
22
|
+
onMouseDown: (event) => {
|
|
23
|
+
event.stopPropagation();
|
|
24
|
+
},
|
|
25
|
+
style: {
|
|
26
|
+
position: "fixed",
|
|
27
|
+
left: x,
|
|
28
|
+
top: y,
|
|
29
|
+
width: 220,
|
|
30
|
+
backgroundColor: "#232630",
|
|
31
|
+
border: "1px solid #2f3440",
|
|
32
|
+
boxShadow: "1px 2px 5px 2px #33333326",
|
|
33
|
+
borderRadius: 6,
|
|
34
|
+
padding: "6px 0",
|
|
35
|
+
fontSize: 12,
|
|
36
|
+
zIndex: 1e4
|
|
37
|
+
},
|
|
38
|
+
children: items.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
39
|
+
"div",
|
|
40
|
+
{
|
|
41
|
+
onClick: () => {
|
|
42
|
+
void runMenuAction(item.key);
|
|
43
|
+
},
|
|
44
|
+
className: "biz-px-3 biz-h-[36px] biz-flex biz-items-center biz-justify-between biz-cursor-pointer biz-text-[#b4b7c1] hover:biz-bg-[#3a89fe] hover:biz-text-white biz-transition-colors",
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: item.label }),
|
|
47
|
+
item.withInput && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
48
|
+
"div",
|
|
49
|
+
{
|
|
50
|
+
onClick: (event) => {
|
|
51
|
+
event.stopPropagation();
|
|
52
|
+
},
|
|
53
|
+
className: "biz-flex biz-items-center biz-gap-1",
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
56
|
+
"input",
|
|
57
|
+
{
|
|
58
|
+
value: item.withInput === "row" ? insertRowCount : insertColCount,
|
|
59
|
+
onChange: (event) => {
|
|
60
|
+
const value = Number(event.target.value || "1");
|
|
61
|
+
if (item.withInput === "row") {
|
|
62
|
+
setInsertRowCount(Number.isFinite(value) && value > 0 ? Math.floor(value) : 1);
|
|
63
|
+
} else {
|
|
64
|
+
setInsertColCount(Number.isFinite(value) && value > 0 ? Math.floor(value) : 1);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
className: "biz-w-10 biz-h-5 biz-text-center biz-bg-[#1b1e25] biz-border biz-border-[#3a3f4b] biz-text-[#b4b7c1]"
|
|
68
|
+
}
|
|
69
|
+
),
|
|
70
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: item.withInput === "row" ? "行" : "列" })
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
item.key
|
|
77
|
+
))
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
};
|
|
81
|
+
export {
|
|
82
|
+
EasyvReactGridPlusContextMenu
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=easyv-react-grid-plus-context-menu.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easyv-react-grid-plus-context-menu.es.js","sources":["../../../../src/components/easyv-reactgrid-plus/easyv-react-grid-plus-context-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { getContextMenuItems } from \"./utils\";\n\ninterface EasyvReactGridPlusContextMenuProps {\n visible: boolean;\n x: number;\n y: number;\n isRowHeaderMenu: boolean;\n isColHeaderMenu: boolean;\n insertRowCount: number;\n insertColCount: number;\n setInsertRowCount: (value: number) => void;\n setInsertColCount: (value: number) => void;\n runMenuAction: (action: string) => Promise<void>;\n}\n\nexport const EasyvReactGridPlusContextMenu = ({\n visible,\n x,\n y,\n isRowHeaderMenu,\n isColHeaderMenu,\n insertRowCount,\n insertColCount,\n setInsertRowCount,\n setInsertColCount,\n runMenuAction,\n}: EasyvReactGridPlusContextMenuProps) => {\n if (!visible) return null;\n\n const items = getContextMenuItems(isRowHeaderMenu, isColHeaderMenu).filter(\n (item) => item.visible,\n );\n\n return (\n <div\n onMouseDown={(event) => {\n event.stopPropagation();\n }}\n style={{\n position: \"fixed\",\n left: x,\n top: y,\n width: 220,\n backgroundColor: \"#232630\",\n border: \"1px solid #2f3440\",\n boxShadow: \"1px 2px 5px 2px #33333326\",\n borderRadius: 6,\n padding: \"6px 0\",\n fontSize: 12,\n zIndex: 10000,\n }}\n >\n {items.map((item) => (\n <div\n key={item.key}\n onClick={() => {\n void runMenuAction(item.key);\n }}\n className=\"biz-px-3 biz-h-[36px] biz-flex biz-items-center biz-justify-between biz-cursor-pointer biz-text-[#b4b7c1] hover:biz-bg-[#3a89fe] hover:biz-text-white biz-transition-colors\"\n >\n <span>{item.label}</span>\n {item.withInput && (\n <div\n onClick={(event) => {\n event.stopPropagation();\n }}\n className=\"biz-flex biz-items-center biz-gap-1\"\n >\n <input\n value={item.withInput === \"row\" ? insertRowCount : insertColCount}\n onChange={(event) => {\n const value = Number(event.target.value || \"1\");\n if (item.withInput === \"row\") {\n setInsertRowCount(Number.isFinite(value) && value > 0 ? Math.floor(value) : 1);\n } else {\n setInsertColCount(Number.isFinite(value) && value > 0 ? Math.floor(value) : 1);\n }\n }}\n className=\"biz-w-10 biz-h-5 biz-text-center biz-bg-[#1b1e25] biz-border biz-border-[#3a3f4b] biz-text-[#b4b7c1]\"\n />\n <span>{item.withInput === \"row\" ? \"行\" : \"列\"}</span>\n </div>\n )}\n </div>\n ))}\n </div>\n );\n};\n"],"names":["jsx","jsxs"],"mappings":";;AAgBO,MAAM,gCAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0C;AACpC,MAAA,CAAC,QAAgB,QAAA;AAErB,QAAM,QAAQ,oBAAoB,iBAAiB,eAAe,EAAE;AAAA,IAClE,CAAC,SAAS,KAAK;AAAA,EACjB;AAGE,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAa,CAAC,UAAU;AACtB,cAAM,gBAAgB;AAAA,MACxB;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,QACN,KAAK;AAAA,QACL,OAAO;AAAA,QACP,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAc;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,MAEC,UAAA,MAAM,IAAI,CAAC,SACVC,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,SAAS,MAAM;AACR,iBAAA,cAAc,KAAK,GAAG;AAAA,UAC7B;AAAA,UACA,WAAU;AAAA,UAEV,UAAA;AAAA,YAACD,kCAAAA,IAAA,QAAA,EAAM,eAAK,MAAM,CAAA;AAAA,YACjB,KAAK,aACJC,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,CAAC,UAAU;AAClB,wBAAM,gBAAgB;AAAA,gBACxB;AAAA,gBACA,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAD,kCAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAO,KAAK,cAAc,QAAQ,iBAAiB;AAAA,sBACnD,UAAU,CAAC,UAAU;AACnB,8BAAM,QAAQ,OAAO,MAAM,OAAO,SAAS,GAAG;AAC1C,4BAAA,KAAK,cAAc,OAAO;AACV,4CAAA,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,wBAAA,OACxE;AACa,4CAAA,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,wBAAA;AAAA,sBAEjF;AAAA,sBACA,WAAU;AAAA,oBAAA;AAAA,kBACZ;AAAA,wDACC,QAAM,EAAA,UAAA,KAAK,cAAc,QAAQ,MAAM,IAAI,CAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAC9C;AAAA,QAAA;AAAA,QA3BG,KAAK;AAAA,MA8Bb,CAAA;AAAA,IAAA;AAAA,EACH;AAEJ;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { j as jsxRuntimeExports } from "../../node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.es.js";
|
|
2
|
+
import React__default, { useState } from "react";
|
|
3
|
+
const EasyvReactGridPlusEditableCell = ({
|
|
4
|
+
value: initialValue,
|
|
5
|
+
row: rowIndex,
|
|
6
|
+
column: colIndex,
|
|
7
|
+
updateData,
|
|
8
|
+
isEditing,
|
|
9
|
+
onRequestEdit,
|
|
10
|
+
onFinishEdit
|
|
11
|
+
}) => {
|
|
12
|
+
const [value, setValue] = useState(initialValue);
|
|
13
|
+
const [isComposing, setIsComposing] = useState(false);
|
|
14
|
+
const onBlur = () => {
|
|
15
|
+
updateData(rowIndex, colIndex, value);
|
|
16
|
+
onFinishEdit();
|
|
17
|
+
};
|
|
18
|
+
const onKeyDown = (e) => {
|
|
19
|
+
const nativeEvent = e.nativeEvent;
|
|
20
|
+
if (isComposing || nativeEvent.isComposing || nativeEvent.keyCode === 229) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (e.key === "Enter") {
|
|
24
|
+
updateData(rowIndex, colIndex, value);
|
|
25
|
+
onFinishEdit();
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
React__default.useEffect(() => {
|
|
29
|
+
setValue(initialValue);
|
|
30
|
+
}, [initialValue]);
|
|
31
|
+
if (isEditing) {
|
|
32
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
33
|
+
"input",
|
|
34
|
+
{
|
|
35
|
+
className: "biz-w-full biz-h-full biz-bg-transparent biz-border-none biz-outline-none biz-text-center biz-text-white biz-px-1",
|
|
36
|
+
value,
|
|
37
|
+
onChange: (e) => setValue(e.target.value),
|
|
38
|
+
onCompositionStart: () => setIsComposing(true),
|
|
39
|
+
onCompositionEnd: () => setIsComposing(false),
|
|
40
|
+
onBlur,
|
|
41
|
+
onKeyDown,
|
|
42
|
+
autoFocus: true
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: "biz-w-full biz-h-full biz-relative biz-flex biz-items-center biz-justify-center",
|
|
50
|
+
onDoubleClick: onRequestEdit,
|
|
51
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "biz-w-full biz-px-1 biz-overflow-hidden biz-text-ellipsis biz-whitespace-nowrap", children: value })
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
EasyvReactGridPlusEditableCell
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=easyv-react-grid-plus-editable-cell.es.js.map
|
package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus-editable-cell.es.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easyv-react-grid-plus-editable-cell.es.js","sources":["../../../../src/components/easyv-reactgrid-plus/easyv-react-grid-plus-editable-cell.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\ninterface EasyvReactGridPlusEditableCellProps {\n value: any;\n row: number;\n column: number;\n updateData: (row: number, col: number, value: any) => void;\n isEditing: boolean;\n onRequestEdit: () => void;\n onFinishEdit: () => void;\n}\n\nexport const EasyvReactGridPlusEditableCell = ({\n value: initialValue,\n row: rowIndex,\n column: colIndex,\n updateData,\n isEditing,\n onRequestEdit,\n onFinishEdit,\n}: EasyvReactGridPlusEditableCellProps) => {\n const [value, setValue] = useState(initialValue);\n const [isComposing, setIsComposing] = useState(false);\n\n const onBlur = () => {\n updateData(rowIndex, colIndex, value);\n onFinishEdit();\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n const nativeEvent = e.nativeEvent as KeyboardEvent & {\n isComposing?: boolean;\n keyCode?: number;\n };\n if (isComposing || nativeEvent.isComposing || nativeEvent.keyCode === 229) {\n return;\n }\n if (e.key === \"Enter\") {\n updateData(rowIndex, colIndex, value);\n onFinishEdit();\n }\n };\n\n React.useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n if (isEditing) {\n return (\n <input\n className=\"biz-w-full biz-h-full biz-bg-transparent biz-border-none biz-outline-none biz-text-center biz-text-white biz-px-1\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onCompositionStart={() => setIsComposing(true)}\n onCompositionEnd={() => setIsComposing(false)}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n autoFocus\n />\n );\n }\n\n return (\n <div\n className=\"biz-w-full biz-h-full biz-relative biz-flex biz-items-center biz-justify-center\"\n onDoubleClick={onRequestEdit}\n >\n <div className=\"biz-w-full biz-px-1 biz-overflow-hidden biz-text-ellipsis biz-whitespace-nowrap\">\n {value}\n </div>\n </div>\n );\n};\n"],"names":["React","jsx"],"mappings":";;AAYO,MAAM,iCAAiC,CAAC;AAAA,EAC7C,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA2C;AACzC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,YAAY;AAC/C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,QAAM,SAAS,MAAM;AACR,eAAA,UAAU,UAAU,KAAK;AACvB,iBAAA;AAAA,EACf;AAEM,QAAA,YAAY,CAAC,MAA2B;AAC5C,UAAM,cAAc,EAAE;AAItB,QAAI,eAAe,YAAY,eAAe,YAAY,YAAY,KAAK;AACzE;AAAA,IAAA;AAEE,QAAA,EAAE,QAAQ,SAAS;AACV,iBAAA,UAAU,UAAU,KAAK;AACvB,mBAAA;AAAA,IAAA;AAAA,EAEjB;AAEAA,iBAAM,UAAU,MAAM;AACpB,aAAS,YAAY;AAAA,EAAA,GACpB,CAAC,YAAY,CAAC;AAEjB,MAAI,WAAW;AAEX,WAAAC,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV;AAAA,QACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC,oBAAoB,MAAM,eAAe,IAAI;AAAA,QAC7C,kBAAkB,MAAM,eAAe,KAAK;AAAA,QAC5C;AAAA,QACA;AAAA,QACA,WAAS;AAAA,MAAA;AAAA,IACX;AAAA,EAAA;AAKF,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAe;AAAA,MAEf,UAACA,kCAAA,IAAA,OAAA,EAAI,WAAU,mFACZ,UACH,MAAA,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { useRef, useCallback, useEffect } from "react";
|
|
2
|
+
const useGridSelectionAutoScroll = ({
|
|
3
|
+
parentRef,
|
|
4
|
+
isSelectingRange,
|
|
5
|
+
selectionStart,
|
|
6
|
+
selectRangeCells,
|
|
7
|
+
stopSelectingRange
|
|
8
|
+
}) => {
|
|
9
|
+
const selectionPointerRef = useRef(null);
|
|
10
|
+
const autoScrollFrameRef = useRef(null);
|
|
11
|
+
const setSelectionPointer = useCallback((x, y) => {
|
|
12
|
+
selectionPointerRef.current = { x, y };
|
|
13
|
+
}, []);
|
|
14
|
+
const updateSelectionByPointer = useCallback(
|
|
15
|
+
(clientX, clientY) => {
|
|
16
|
+
if (!isSelectingRange || !selectionStart || !parentRef.current) return;
|
|
17
|
+
const hitElement = document.elementFromPoint(clientX, clientY);
|
|
18
|
+
if (!hitElement) return;
|
|
19
|
+
const cellElement = hitElement.closest(
|
|
20
|
+
"[data-grid-row][data-grid-col]"
|
|
21
|
+
);
|
|
22
|
+
if (!cellElement) return;
|
|
23
|
+
const rowText = cellElement.getAttribute("data-grid-row");
|
|
24
|
+
const colText = cellElement.getAttribute("data-grid-col");
|
|
25
|
+
const row = Number(rowText);
|
|
26
|
+
const col = Number(colText);
|
|
27
|
+
if (Number.isNaN(row) || Number.isNaN(col)) return;
|
|
28
|
+
selectRangeCells(selectionStart.row, selectionStart.col, row, col);
|
|
29
|
+
},
|
|
30
|
+
[isSelectingRange, parentRef, selectRangeCells, selectionStart]
|
|
31
|
+
);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!isSelectingRange) return;
|
|
34
|
+
const onMouseUp = () => {
|
|
35
|
+
selectionPointerRef.current = null;
|
|
36
|
+
if (autoScrollFrameRef.current !== null) {
|
|
37
|
+
cancelAnimationFrame(autoScrollFrameRef.current);
|
|
38
|
+
autoScrollFrameRef.current = null;
|
|
39
|
+
}
|
|
40
|
+
stopSelectingRange();
|
|
41
|
+
};
|
|
42
|
+
window.addEventListener("mouseup", onMouseUp);
|
|
43
|
+
return () => {
|
|
44
|
+
window.removeEventListener("mouseup", onMouseUp);
|
|
45
|
+
};
|
|
46
|
+
}, [isSelectingRange, stopSelectingRange]);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!isSelectingRange) return;
|
|
49
|
+
const onMouseMove = (event) => {
|
|
50
|
+
setSelectionPointer(event.clientX, event.clientY);
|
|
51
|
+
};
|
|
52
|
+
window.addEventListener("mousemove", onMouseMove);
|
|
53
|
+
return () => {
|
|
54
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
55
|
+
};
|
|
56
|
+
}, [isSelectingRange, setSelectionPointer]);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (!isSelectingRange || !selectionStart) return;
|
|
59
|
+
const edgeDistance = 32;
|
|
60
|
+
const maxSpeed = 10;
|
|
61
|
+
const tick = () => {
|
|
62
|
+
if (!parentRef.current) {
|
|
63
|
+
autoScrollFrameRef.current = requestAnimationFrame(tick);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const pointer = selectionPointerRef.current;
|
|
67
|
+
if (pointer) {
|
|
68
|
+
const rect = parentRef.current.getBoundingClientRect();
|
|
69
|
+
const leftRatio = Math.max(0, (rect.left + edgeDistance - pointer.x) / edgeDistance);
|
|
70
|
+
const rightRatio = Math.max(0, (pointer.x - (rect.right - edgeDistance)) / edgeDistance);
|
|
71
|
+
const topRatio = Math.max(0, (rect.top + edgeDistance - pointer.y) / edgeDistance);
|
|
72
|
+
const bottomRatio = Math.max(0, (pointer.y - (rect.bottom - edgeDistance)) / edgeDistance);
|
|
73
|
+
const scrollX = rightRatio > 0 ? Math.min(maxSpeed, rightRatio * maxSpeed) : -Math.min(maxSpeed, leftRatio * maxSpeed);
|
|
74
|
+
const scrollY = bottomRatio > 0 ? Math.min(maxSpeed, bottomRatio * maxSpeed) : -Math.min(maxSpeed, topRatio * maxSpeed);
|
|
75
|
+
if (scrollX !== 0 || scrollY !== 0) {
|
|
76
|
+
parentRef.current.scrollBy(scrollX, scrollY);
|
|
77
|
+
}
|
|
78
|
+
updateSelectionByPointer(pointer.x, pointer.y);
|
|
79
|
+
}
|
|
80
|
+
autoScrollFrameRef.current = requestAnimationFrame(tick);
|
|
81
|
+
};
|
|
82
|
+
autoScrollFrameRef.current = requestAnimationFrame(tick);
|
|
83
|
+
return () => {
|
|
84
|
+
if (autoScrollFrameRef.current !== null) {
|
|
85
|
+
cancelAnimationFrame(autoScrollFrameRef.current);
|
|
86
|
+
autoScrollFrameRef.current = null;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}, [isSelectingRange, parentRef, selectionStart, updateSelectionByPointer]);
|
|
90
|
+
return {
|
|
91
|
+
setSelectionPointer
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
export {
|
|
95
|
+
useGridSelectionAutoScroll
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=easyv-react-grid-plus-selection.hook.es.js.map
|
package/dist/lib/components/easyv-reactgrid-plus/easyv-react-grid-plus-selection.hook.es.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easyv-react-grid-plus-selection.hook.es.js","sources":["../../../../src/components/easyv-reactgrid-plus/easyv-react-grid-plus-selection.hook.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\ninterface UseGridSelectionAutoScrollOptions {\n parentRef: RefObject<HTMLDivElement>;\n isSelectingRange: boolean;\n selectionStart: { row: number; col: number } | null;\n selectRangeCells: (startRow: number, startCol: number, endRow: number, endCol: number) => void;\n stopSelectingRange: () => void;\n}\n\nexport const useGridSelectionAutoScroll = ({\n parentRef,\n isSelectingRange,\n selectionStart,\n selectRangeCells,\n stopSelectingRange,\n}: UseGridSelectionAutoScrollOptions) => {\n const selectionPointerRef = useRef<{ x: number; y: number } | null>(null);\n const autoScrollFrameRef = useRef<number | null>(null);\n\n const setSelectionPointer = useCallback((x: number, y: number) => {\n selectionPointerRef.current = { x, y };\n }, []);\n\n const updateSelectionByPointer = useCallback(\n (clientX: number, clientY: number) => {\n if (!isSelectingRange || !selectionStart || !parentRef.current) return;\n const hitElement = document.elementFromPoint(clientX, clientY);\n if (!hitElement) return;\n const cellElement = hitElement.closest(\n \"[data-grid-row][data-grid-col]\",\n ) as HTMLElement | null;\n if (!cellElement) return;\n const rowText = cellElement.getAttribute(\"data-grid-row\");\n const colText = cellElement.getAttribute(\"data-grid-col\");\n const row = Number(rowText);\n const col = Number(colText);\n if (Number.isNaN(row) || Number.isNaN(col)) return;\n selectRangeCells(selectionStart.row, selectionStart.col, row, col);\n },\n [isSelectingRange, parentRef, selectRangeCells, selectionStart],\n );\n\n useEffect(() => {\n if (!isSelectingRange) return;\n const onMouseUp = () => {\n selectionPointerRef.current = null;\n if (autoScrollFrameRef.current !== null) {\n cancelAnimationFrame(autoScrollFrameRef.current);\n autoScrollFrameRef.current = null;\n }\n stopSelectingRange();\n };\n window.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n window.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, [isSelectingRange, stopSelectingRange]);\n\n useEffect(() => {\n if (!isSelectingRange) return;\n const onMouseMove = (event: MouseEvent) => {\n setSelectionPointer(event.clientX, event.clientY);\n };\n window.addEventListener(\"mousemove\", onMouseMove);\n return () => {\n window.removeEventListener(\"mousemove\", onMouseMove);\n };\n }, [isSelectingRange, setSelectionPointer]);\n\n useEffect(() => {\n if (!isSelectingRange || !selectionStart) return;\n const edgeDistance = 32;\n const maxSpeed = 10;\n const tick = () => {\n if (!parentRef.current) {\n autoScrollFrameRef.current = requestAnimationFrame(tick);\n return;\n }\n const pointer = selectionPointerRef.current;\n if (pointer) {\n const rect = parentRef.current.getBoundingClientRect();\n const leftRatio = Math.max(0, (rect.left + edgeDistance - pointer.x) / edgeDistance);\n const rightRatio = Math.max(0, (pointer.x - (rect.right - edgeDistance)) / edgeDistance);\n const topRatio = Math.max(0, (rect.top + edgeDistance - pointer.y) / edgeDistance);\n const bottomRatio = Math.max(0, (pointer.y - (rect.bottom - edgeDistance)) / edgeDistance);\n const scrollX =\n rightRatio > 0\n ? Math.min(maxSpeed, rightRatio * maxSpeed)\n : -Math.min(maxSpeed, leftRatio * maxSpeed);\n const scrollY =\n bottomRatio > 0\n ? Math.min(maxSpeed, bottomRatio * maxSpeed)\n : -Math.min(maxSpeed, topRatio * maxSpeed);\n if (scrollX !== 0 || scrollY !== 0) {\n parentRef.current.scrollBy(scrollX, scrollY);\n }\n updateSelectionByPointer(pointer.x, pointer.y);\n }\n autoScrollFrameRef.current = requestAnimationFrame(tick);\n };\n autoScrollFrameRef.current = requestAnimationFrame(tick);\n return () => {\n if (autoScrollFrameRef.current !== null) {\n cancelAnimationFrame(autoScrollFrameRef.current);\n autoScrollFrameRef.current = null;\n }\n };\n }, [isSelectingRange, parentRef, selectionStart, updateSelectionByPointer]);\n\n return {\n setSelectionPointer,\n };\n};\n"],"names":[],"mappings":"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"}
|