dishui 0.0.84 → 0.0.89
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/components/Input/index.js +52 -62
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/LayoutSuite/index.d.ts +10 -0
- package/dist/components/LayoutSuite/index.js +27 -18
- package/dist/components/LayoutSuite/index.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js +1 -0
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js +46 -31
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js +44 -31
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js +49 -31
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/ProtectedRoute/index.d.ts +2 -1
- package/dist/components/ProtectedRoute/index.js +16 -6
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Select/index.d.ts +6 -0
- package/dist/components/Select/index.js +166 -136
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/Tabs/index.d.ts +12 -1
- package/dist/components/Tabs/index.js +42 -17
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js +7 -7
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js +200 -189
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/types.d.ts +3 -0
- package/dist/components/pro/DataTable/DataTable.d.ts +1 -1
- package/dist/components/pro/DataTable/DataTable.js +98 -240
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js +14 -16
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.d.ts +3 -9
- package/dist/components/pro/DataTable/components/TablePagination.js +29 -25
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.d.ts +2 -2
- package/dist/components/pro/DataTable/tanstack-table.js +29 -21
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.d.ts +2 -0
- package/dist/components/pro/DataTable/treeDataUtils.js +18 -19
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/types.d.ts +24 -0
- package/dist/components/pro/DataTable/useDataTableModel.d.ts +16 -0
- package/dist/components/pro/DataTable/useDataTableModel.js +148 -0
- package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -0
- package/dist/components/pro/FileExplorer/Breadcrumb.js +12 -12
- package/dist/components/pro/Flow/nodes/DataNodeView.js +87 -82
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js +69 -63
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.d.ts +14 -0
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js +76 -0
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -0
- package/dist/components/pro/Flow/nodes/demandRender.d.ts +11 -0
- package/dist/components/pro/Flow/nodes/demandRender.js +26 -0
- package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -0
- package/dist/components/pro/RichTextEditor/SlashMenu.js +68 -58
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/contexts/AppContext.d.ts +1 -0
- package/dist/contexts/AppContext.js +144 -145
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/contexts/authentication.d.ts +7 -0
- package/dist/contexts/authentication.js +22 -0
- package/dist/contexts/authentication.js.map +1 -0
- package/dist/dishui.css +1 -1
- package/dist/hooks/useControllableState.d.ts +6 -14
- package/dist/hooks/useControllableState.js +21 -15
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useTableColumns.d.ts +3 -3
- package/dist/hooks/useTableColumns.js +2 -2
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.d.ts +11 -4
- package/dist/hooks/useTableData.js +44 -26
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +97 -97
- package/dist/utils/i18n.js +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/routerBuilder.d.ts +7 -5
- package/dist/utils/routerBuilder.js +11 -15
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/safeStorage.d.ts +8 -0
- package/dist/utils/safeStorage.js +45 -0
- package/dist/utils/safeStorage.js.map +1 -0
- package/package.json +22 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeEditor.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/editors/CodeEditor.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport { EditorView, keymap, lineNumbers, highlightActiveLine, highlightActiveLineGutter, drawSelection } from '@codemirror/view';\nimport { EditorState, Extension, Compartment } from '@codemirror/state';\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport { syntaxHighlighting, defaultHighlightStyle, foldGutter, indentOnInput, bracketMatching } from '@codemirror/language';\nimport { completionKeymap, closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { lintKeymap } from '@codemirror/lint';\nimport { searchKeymap } from '@codemirror/search';\nimport { javascript } from '@codemirror/lang-javascript';\nimport { python } from '@codemirror/lang-python';\nimport { html } from '@codemirror/lang-html';\nimport { css } from '@codemirror/lang-css';\nimport { json } from '@codemirror/lang-json';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { jumpToDefinition, smartAutocompletion, bracketMatchingStyle, lineHighlightStyle, jumpTargetHighlight } from '../extensions';\nimport { createThemeExtension, createHighlightExtension } from '../themes';\nimport { collectVariables, generateOutline } from '../utils';\nimport { defaultContextMenu } from '../extensions/contextMenu';\n\n// 导出类型\nexport type {\n CodeEditorProps,\n CodeEditorHandle,\n LanguageType,\n EditorTheme,\n ContextMenuItem,\n VariableInfo,\n OutlineItem,\n AutocompletionConfig,\n JumpToDefinitionConfig,\n CodeSnippet,\n HistoryEntry,\n} from '../types';\n\nimport type { CodeEditorProps, CodeEditorHandle, AutocompletionConfig, JumpToDefinitionConfig, HistoryEntry } from '../types';\n\n// ============= 语言扩展映射 =============\n\nconst getLanguageExtension = (language: string): Extension => {\n const langMap: Record<string, () => Extension> = {\n javascript: () => javascript({ jsx: false }),\n jsx: () => javascript({ jsx: true }),\n typescript: () => javascript({ jsx: false, typescript: true }),\n tsx: () => javascript({ jsx: true, typescript: true }),\n python,\n html,\n css,\n json,\n markdown,\n };\n\n return langMap[language]?.() || javascript();\n};\n\n// ============= CodeEditor 组件 =============\n\nconst CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(({\n value = '',\n onChange,\n language = 'javascript',\n theme = 'light',\n readOnly = false,\n lineNumbers: showLineNumbers = true,\n highlightActiveLine: shouldHighlightActiveLine = true,\n autocompletion = true,\n jumpToDefinition: jumpToDefinitionConfig = true,\n contextMenu,\n onVariablesCollected,\n onOutlineGenerated,\n enableHistory = false,\n historyLimit = 50,\n historySaveInterval = 3, // 默认 3 * 10s = 30s\n onHistoryChange,\n className = '',\n height = '400px',\n minHeight,\n maxHeight,\n placeholder,\n extensions: customExtensions = [],\n}, ref) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const [contextMenuState, setContextMenuState] = useState<{\n visible: boolean;\n x: number;\n y: number;\n }>({ visible: false, x: 0, y: 0 });\n\n // 历史记录状态\n const [codeHistory, setCodeHistory] = useState<HistoryEntry[]>([]);\n const [currentHistoryIndex, setCurrentHistoryIndex] = useState<number>(-1);\n const lastSaveTime = useRef<number>(0);\n const isRestoringHistory = useRef<boolean>(false);\n const isExternalUpdate = useRef<boolean>(false); // 标记是否是外部更新\n const pendingContent = useRef<string>('');\n const hasChanges = useRef<boolean>(false);\n const lastSavedContent = useRef<string>(''); // 记录上次保存的内容\n\n // 配置隔间,用于动态更新\n const languageCompartment = useRef(new Compartment());\n const themeCompartment = useRef(new Compartment());\n const highlightCompartment = useRef(new Compartment());\n const readOnlyCompartment = useRef(new Compartment());\n\n // 使用 ref 存储 language,确保 updateListener 能访问到最新值\n const languageRef = useRef(language);\n\n // 更新 languageRef\n useEffect(() => {\n languageRef.current = language;\n }, [language]);\n\n // 跳转到指定行\n const jumpToLine = useCallback((line: number) => {\n if (viewRef.current) {\n try {\n const lineInfo = viewRef.current.state.doc.line(line);\n viewRef.current.dispatch({\n selection: { anchor: lineInfo.from, head: lineInfo.to },\n scrollIntoView: true,\n });\n viewRef.current.focus();\n } catch (error) {\n console.error('Failed to jump to line:', error);\n }\n }\n }, []);\n\n // 添加历史记录\n const addToHistory = useCallback((content: string, description?: string) => {\n // 如果是外部更新或正在恢复历史,不添加记录\n if (!enableHistory || isRestoringHistory.current || isExternalUpdate.current) {\n return;\n }\n\n const now = Date.now();\n const intervalMs = historySaveInterval * 10000; // 转换为毫秒\n const timeSinceLastSave = now - lastSaveTime.current;\n const timeCheckPassed = timeSinceLastSave >= intervalMs;\n\n // 按配置的间隔记录\n if (!timeCheckPassed) {\n // 时间未到,标记有变更,但不立即保存\n hasChanges.current = true;\n pendingContent.current = content;\n return;\n }\n\n // 时间检查已通过,现在检查内容是否真的发生变化\n if (content === lastSavedContent.current && !description) {\n // 内容没有变化,不保存\n hasChanges.current = false;\n return;\n }\n\n // 时间检查通过 + 内容有变化 → 保存!\n lastSaveTime.current = now;\n hasChanges.current = false;\n lastSavedContent.current = content; // 记录本次保存的内容\n\n setCodeHistory((prevHistory) => {\n // 如果当前不在最新位置,删除后面的历史\n const newHistory = currentHistoryIndex >= 0\n ? prevHistory.slice(0, currentHistoryIndex + 1)\n : prevHistory;\n\n const newEntry: HistoryEntry = {\n id: `${now}-${Math.random()}`,\n timestamp: new Date(now),\n content,\n description,\n };\n\n const updatedHistory = [...newHistory, newEntry];\n\n // 限制历史记录数量\n if (updatedHistory.length > historyLimit) {\n updatedHistory.shift();\n }\n\n const newIndex = updatedHistory.length - 1;\n setCurrentHistoryIndex(newIndex);\n\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange(updatedHistory, newIndex);\n }\n }, 0);\n\n return updatedHistory;\n });\n }, [enableHistory, historyLimit, historySaveInterval, currentHistoryIndex, onHistoryChange]);\n\n // 恢复历史记录\n const restoreHistory = useCallback((index: number) => {\n if (index < 0 || index >= codeHistory.length) return;\n\n isRestoringHistory.current = true;\n const entry = codeHistory[index];\n\n if (viewRef.current) {\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: entry.content,\n },\n });\n }\n\n // 清除当前版本之后的所有版本\n const newHistory = codeHistory.slice(0, index + 1);\n setCodeHistory(newHistory);\n\n // 回滚的版本成为最新版本\n const newIndex = newHistory.length - 1;\n setCurrentHistoryIndex(newIndex);\n\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange(newHistory, newIndex);\n }\n }, 0);\n\n // 触发 onChange\n if (onChange) {\n onChange(entry.content);\n }\n\n // 延迟重置标志,确保不会立即添加到历史\n setTimeout(() => {\n isRestoringHistory.current = false;\n }, 100);\n }, [codeHistory, onChange, onHistoryChange]);\n\n // 暴露历史记录相关方法\n useImperativeHandle(ref, () => ({\n jumpToLine,\n getView: () => viewRef.current,\n getValue: () => viewRef.current?.state.doc.toString() || '',\n setValue: (newValue: string) => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: newValue,\n },\n });\n }\n },\n focus: () => viewRef.current?.focus(),\n getHistory: () => codeHistory,\n restoreHistory,\n clearHistory: () => {\n setCodeHistory([]);\n setCurrentHistoryIndex(-1);\n // 重置所有历史记录相关的内部状态\n lastSaveTime.current = 0;\n hasChanges.current = false;\n pendingContent.current = '';\n lastSavedContent.current = '';\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange([], -1);\n }\n }, 0);\n },\n } as any), [jumpToLine, codeHistory, restoreHistory, onHistoryChange]);\n\n // 定时保存待处理的历史记录\n useEffect(() => {\n if (!enableHistory) return;\n\n const intervalMs = historySaveInterval * 10000; // 转换为毫秒\n\n const interval = setInterval(() => {\n if (hasChanges.current && pendingContent.current) {\n addToHistory(pendingContent.current);\n }\n }, intervalMs);\n\n return () => clearInterval(interval);\n }, [enableHistory, historySaveInterval, addToHistory]);\n\n // 初始化编辑器\n useEffect(() => {\n if (!editorRef.current) return;\n\n const updateListener = EditorView.updateListener.of((update) => {\n if (update.docChanged && onChange) {\n const newContent = update.state.doc.toString();\n onChange(newContent);\n\n // 添加到历史记录\n // 注意:只有在用户实际输入时才添加,外部更新不添加\n if (enableHistory && !isExternalUpdate.current) {\n addToHistory(newContent);\n }\n\n // 如果是外部更新触发的变更,重置标志\n if (isExternalUpdate.current) {\n isExternalUpdate.current = false;\n }\n }\n\n if (update.docChanged && onVariablesCollected) {\n const code = update.state.doc.toString();\n // 使用 languageRef.current 获取最新的 language 值\n const variables = collectVariables(code, languageRef.current);\n onVariablesCollected(variables);\n }\n\n if (update.docChanged && onOutlineGenerated) {\n const code = update.state.doc.toString();\n // 使用 languageRef.current 获取最新的 language 值\n const outline = generateOutline(code, languageRef.current);\n onOutlineGenerated(outline);\n }\n });\n\n const baseExtensions: Extension[] = [\n history(),\n drawSelection(),\n bracketMatching(),\n closeBrackets(),\n indentOnInput(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n languageCompartment.current.of(getLanguageExtension(language)),\n themeCompartment.current.of(createThemeExtension(theme)),\n highlightCompartment.current.of(createHighlightExtension(theme)),\n readOnlyCompartment.current.of(EditorState.readOnly.of(readOnly)),\n updateListener,\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n ...searchKeymap,\n ...historyKeymap,\n ...completionKeymap,\n ...lintKeymap,\n indentWithTab,\n ]),\n bracketMatchingStyle,\n lineHighlightStyle,\n jumpTargetHighlight,\n ];\n\n // 可选扩展\n if (showLineNumbers) {\n baseExtensions.push(lineNumbers(), foldGutter(), highlightActiveLineGutter());\n }\n\n if (shouldHighlightActiveLine) {\n baseExtensions.push(highlightActiveLine());\n }\n\n // 自动补全\n if (autocompletion) {\n const config: AutocompletionConfig = typeof autocompletion === 'object' ? autocompletion : {};\n baseExtensions.push(smartAutocompletion(language, config));\n }\n\n // 跳转到定义\n if (jumpToDefinitionConfig) {\n const config: JumpToDefinitionConfig = typeof jumpToDefinitionConfig === 'object'\n ? jumpToDefinitionConfig\n : {};\n baseExtensions.push(jumpToDefinition(jumpToLine, config));\n }\n\n // 占位符\n if (placeholder) {\n baseExtensions.push(\n EditorView.contentAttributes.of({ 'data-placeholder': placeholder })\n );\n }\n\n // 自定义扩展\n if (customExtensions.length > 0) {\n baseExtensions.push(...customExtensions);\n }\n\n const startState = EditorState.create({\n doc: value,\n extensions: baseExtensions,\n });\n\n const view = new EditorView({\n state: startState,\n parent: editorRef.current,\n });\n\n viewRef.current = view;\n\n // 延迟初始收集变量和大纲(避免在渲染期间更新父组件)\n setTimeout(() => {\n if (onVariablesCollected) {\n const variables = collectVariables(value, language);\n onVariablesCollected(variables);\n }\n\n if (onOutlineGenerated) {\n const outline = generateOutline(value, language);\n onOutlineGenerated(outline);\n }\n }, 0);\n\n // 添加初始内容到历史记录\n if (enableHistory && value) {\n addToHistory(value, 'Initial content');\n }\n\n return () => {\n view.destroy();\n };\n }, []); // 只在挂载时初始化\n\n // 更新值\n useEffect(() => {\n if (viewRef.current && value !== viewRef.current.state.doc.toString()) {\n isExternalUpdate.current = true; // 标记为外部更新\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: value,\n },\n });\n // 注意:标志会在 updateListener 中被立即重置,不需要 setTimeout\n }\n }, [value]);\n\n // 更新语言\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: languageCompartment.current.reconfigure(getLanguageExtension(language)),\n });\n\n const code = viewRef.current.state.doc.toString();\n\n // 延迟执行回调,避免在渲染期间更新父组件\n setTimeout(() => {\n if (onVariablesCollected) {\n const variables = collectVariables(code, language);\n onVariablesCollected(variables);\n }\n if (onOutlineGenerated) {\n const outline = generateOutline(code, language);\n onOutlineGenerated(outline);\n }\n }, 0);\n }\n }, [language, onVariablesCollected, onOutlineGenerated]);\n\n // 更新主题\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: [\n themeCompartment.current.reconfigure(createThemeExtension(theme)),\n highlightCompartment.current.reconfigure(createHighlightExtension(theme)),\n ],\n });\n }\n }, [theme]);\n\n // 更新只读状态\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: readOnlyCompartment.current.reconfigure(EditorState.readOnly.of(readOnly)),\n });\n }\n }, [readOnly]);\n\n // 处理右键菜单\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setContextMenuState({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n });\n }, []);\n\n const closeContextMenu = useCallback(() => {\n setContextMenuState({ visible: false, x: 0, y: 0 });\n }, []);\n\n const handleMenuItemClick = useCallback(\n (item: any) => {\n if (viewRef.current && !item.disabled) {\n item.action(viewRef.current);\n }\n closeContextMenu();\n },\n [closeContextMenu]\n );\n\n // 点击其他地方关闭菜单\n useEffect(() => {\n if (contextMenuState.visible) {\n const handleClick = () => closeContextMenu();\n document.addEventListener('click', handleClick);\n return () => document.removeEventListener('click', handleClick);\n }\n }, [contextMenuState.visible, closeContextMenu]);\n\n const editorStyles: React.CSSProperties = {\n height,\n minHeight,\n maxHeight,\n overflow: 'auto',\n };\n\n const menuItems = contextMenu || defaultContextMenu;\n\n return (\n <div className={`code-editor-wrapper ${className}`}>\n <div\n ref={editorRef}\n onContextMenu={handleContextMenu}\n style={editorStyles}\n className=\"code-editor\"\n />\n\n {/* 上下文菜单 */}\n {contextMenuState.visible && (\n <div\n className=\"context-menu\"\n style={{\n position: 'fixed',\n top: contextMenuState.y,\n left: contextMenuState.x,\n zIndex: 1000,\n }}\n >\n <ul className=\"menu bg-base-200 rounded-box shadow-lg\">\n {menuItems.map((item, index) => {\n if (item.separator) {\n return <li key={index} className=\"menu-separator\" />;\n }\n return (\n <li key={index}>\n <a\n onClick={() => handleMenuItemClick(item)}\n className={item.disabled ? 'disabled' : ''}\n >\n {item.label}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n\n <style>{`\n .code-editor-wrapper {\n position: relative;\n border: 1px solid var(--fallback-bc, oklch(var(--bc) / 0.2));\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .code-editor .cm-editor {\n height: 100%;\n }\n\n .code-editor .cm-scroller {\n overflow: auto;\n font-family: 'Fira Code', 'Consolas', 'Monaco', monospace;\n font-size: 14px;\n line-height: 1.5;\n }\n\n .code-editor .cm-content[data-placeholder]::before {\n content: attr(data-placeholder);\n color: var(--fallback-bc, oklch(var(--bc) / 0.4));\n position: absolute;\n pointer-events: none;\n }\n\n .context-menu {\n min-width: 150px;\n }\n\n .context-menu .menu-separator {\n height: 1px;\n background: var(--fallback-bc, oklch(var(--bc) / 0.2));\n margin: 0.25rem 0;\n }\n\n .context-menu .disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n `}</style>\n </div>\n );\n});\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport default CodeEditor;\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CodeEditor.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/editors/CodeEditor.tsx"],"sourcesContent":["import React, { useEffect, useLayoutEffect, useRef, useState, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport { EditorView, keymap, lineNumbers, highlightActiveLine, highlightActiveLineGutter, drawSelection } from '@codemirror/view';\nimport { EditorState, Extension, Compartment } from '@codemirror/state';\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport { syntaxHighlighting, defaultHighlightStyle, foldGutter, indentOnInput, bracketMatching } from '@codemirror/language';\nimport { completionKeymap, closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { lintKeymap } from '@codemirror/lint';\nimport { searchKeymap } from '@codemirror/search';\nimport { javascript } from '@codemirror/lang-javascript';\nimport { python } from '@codemirror/lang-python';\nimport { html } from '@codemirror/lang-html';\nimport { css } from '@codemirror/lang-css';\nimport { json } from '@codemirror/lang-json';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { jumpToDefinition, smartAutocompletion, bracketMatchingStyle, lineHighlightStyle, jumpTargetHighlight } from '../extensions';\nimport { createThemeExtension, createHighlightExtension } from '../themes';\nimport { collectVariables, generateOutline } from '../utils';\nimport { defaultContextMenu } from '../extensions/contextMenu';\n\n// 导出类型\nexport type {\n CodeEditorProps,\n CodeEditorHandle,\n LanguageType,\n EditorTheme,\n ContextMenuItem,\n VariableInfo,\n OutlineItem,\n AutocompletionConfig,\n JumpToDefinitionConfig,\n CodeSnippet,\n HistoryEntry,\n} from '../types';\n\nimport type { CodeEditorProps, CodeEditorHandle, AutocompletionConfig, JumpToDefinitionConfig, HistoryEntry } from '../types';\n\n// ============= 语言扩展映射 =============\n\nconst getLanguageExtension = (language: string): Extension => {\n const langMap: Record<string, () => Extension> = {\n javascript: () => javascript({ jsx: false }),\n jsx: () => javascript({ jsx: true }),\n typescript: () => javascript({ jsx: false, typescript: true }),\n tsx: () => javascript({ jsx: true, typescript: true }),\n python,\n html,\n css,\n json,\n markdown,\n };\n\n return langMap[language]?.() || javascript();\n};\n\n// ============= CodeEditor 组件 =============\n\nconst CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(({\n value = '',\n onChange,\n language = 'javascript',\n theme = 'light',\n readOnly = false,\n lineNumbers: showLineNumbers = true,\n highlightActiveLine: shouldHighlightActiveLine = true,\n autocompletion = true,\n jumpToDefinition: jumpToDefinitionConfig = true,\n contextMenu,\n onVariablesCollected,\n onOutlineGenerated,\n enableHistory = false,\n historyLimit = 50,\n historySaveInterval = 3, // 默认 3 * 10s = 30s\n onHistoryChange,\n className = '',\n height = '400px',\n minHeight,\n maxHeight,\n placeholder,\n extensions: customExtensions = [],\n}, ref) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const [contextMenuState, setContextMenuState] = useState<{\n visible: boolean;\n x: number;\n y: number;\n }>({ visible: false, x: 0, y: 0 });\n\n // 历史记录状态\n const [codeHistory, setCodeHistory] = useState<HistoryEntry[]>([]);\n const [currentHistoryIndex, setCurrentHistoryIndex] = useState<number>(-1);\n const lastSaveTime = useRef<number>(0);\n const isRestoringHistory = useRef<boolean>(false);\n const isExternalUpdate = useRef<boolean>(false); // 标记是否是外部更新\n const pendingContent = useRef<string>('');\n const hasChanges = useRef<boolean>(false);\n const lastSavedContent = useRef<string>(''); // 记录上次保存的内容\n\n // 配置隔间,用于动态更新\n const languageCompartment = useRef(new Compartment());\n const themeCompartment = useRef(new Compartment());\n const highlightCompartment = useRef(new Compartment());\n const readOnlyCompartment = useRef(new Compartment());\n\n const languageRef = useRef(language);\n const documentText = useRef(value);\n const analysisTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const analysisRevision = useRef(0);\n const callbacksRef = useRef({ onChange, onVariablesCollected, onOutlineGenerated });\n const hasVariableListener = Boolean(onVariablesCollected);\n const hasOutlineListener = Boolean(onOutlineGenerated);\n\n const cancelAnalysis = useCallback(() => {\n analysisRevision.current += 1;\n if (analysisTimer.current !== null) {\n clearTimeout(analysisTimer.current);\n analysisTimer.current = null;\n }\n }, []);\n\n const scheduleAnalysis = useCallback((code: string, delay = 150) => {\n cancelAnalysis();\n const view = viewRef.current;\n if (!view || (!callbacksRef.current.onVariablesCollected && !callbacksRef.current.onOutlineGenerated)) return;\n\n const revision = analysisRevision.current;\n const doc = view.state.doc;\n const analysisLanguage = languageRef.current;\n const isCurrent = () => revision === analysisRevision.current\n && viewRef.current === view && view.state.doc === doc\n && languageRef.current === analysisLanguage;\n\n analysisTimer.current = setTimeout(() => {\n analysisTimer.current = null;\n if (!isCurrent()) return;\n const variables = callbacksRef.current.onVariablesCollected\n ? collectVariables(code, analysisLanguage) : undefined;\n const outline = callbacksRef.current.onOutlineGenerated\n ? generateOutline(code, analysisLanguage) : undefined;\n\n // A callback may synchronously change the document/language or unmount us.\n if (variables && isCurrent()) callbacksRef.current.onVariablesCollected?.(variables);\n if (outline && isCurrent()) callbacksRef.current.onOutlineGenerated?.(outline);\n }, delay);\n }, [cancelAnalysis]);\n\n // 跳转到指定行\n const jumpToLine = useCallback((line: number) => {\n if (viewRef.current) {\n try {\n const lineInfo = viewRef.current.state.doc.line(line);\n viewRef.current.dispatch({\n selection: { anchor: lineInfo.from, head: lineInfo.to },\n scrollIntoView: true,\n });\n viewRef.current.focus();\n } catch (error) {\n console.error('Failed to jump to line:', error);\n }\n }\n }, []);\n\n // 添加历史记录\n const addToHistory = useCallback((content: string, description?: string) => {\n // 如果是外部更新或正在恢复历史,不添加记录\n if (!enableHistory || isRestoringHistory.current || isExternalUpdate.current) {\n return;\n }\n\n const now = Date.now();\n const intervalMs = historySaveInterval * 10000; // 转换为毫秒\n const timeSinceLastSave = now - lastSaveTime.current;\n const timeCheckPassed = timeSinceLastSave >= intervalMs;\n\n // 按配置的间隔记录\n if (!timeCheckPassed) {\n // 时间未到,标记有变更,但不立即保存\n hasChanges.current = true;\n pendingContent.current = content;\n return;\n }\n\n // 时间检查已通过,现在检查内容是否真的发生变化\n if (content === lastSavedContent.current && !description) {\n // 内容没有变化,不保存\n hasChanges.current = false;\n return;\n }\n\n // 时间检查通过 + 内容有变化 → 保存!\n lastSaveTime.current = now;\n hasChanges.current = false;\n lastSavedContent.current = content; // 记录本次保存的内容\n\n setCodeHistory((prevHistory) => {\n // 如果当前不在最新位置,删除后面的历史\n const newHistory = currentHistoryIndex >= 0\n ? prevHistory.slice(0, currentHistoryIndex + 1)\n : prevHistory;\n\n const newEntry: HistoryEntry = {\n id: `${now}-${Math.random()}`,\n timestamp: new Date(now),\n content,\n description,\n };\n\n const updatedHistory = [...newHistory, newEntry];\n\n // 限制历史记录数量\n if (updatedHistory.length > historyLimit) {\n updatedHistory.shift();\n }\n\n const newIndex = updatedHistory.length - 1;\n setCurrentHistoryIndex(newIndex);\n\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange(updatedHistory, newIndex);\n }\n }, 0);\n\n return updatedHistory;\n });\n }, [enableHistory, historyLimit, historySaveInterval, currentHistoryIndex, onHistoryChange]);\n\n const historyWriterRef = useRef(addToHistory);\n useLayoutEffect(() => {\n languageRef.current = language;\n callbacksRef.current = { onChange, onVariablesCollected, onOutlineGenerated };\n historyWriterRef.current = addToHistory;\n });\n\n // 恢复历史记录\n const restoreHistory = useCallback((index: number) => {\n if (index < 0 || index >= codeHistory.length) return;\n\n isRestoringHistory.current = true;\n const entry = codeHistory[index];\n\n if (viewRef.current) {\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: entry.content,\n },\n });\n }\n\n // 清除当前版本之后的所有版本\n const newHistory = codeHistory.slice(0, index + 1);\n setCodeHistory(newHistory);\n\n // 回滚的版本成为最新版本\n const newIndex = newHistory.length - 1;\n setCurrentHistoryIndex(newIndex);\n\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange(newHistory, newIndex);\n }\n }, 0);\n\n // 触发 onChange\n if (onChange) {\n onChange(entry.content);\n }\n\n // 延迟重置标志,确保不会立即添加到历史\n setTimeout(() => {\n isRestoringHistory.current = false;\n }, 100);\n }, [codeHistory, onChange, onHistoryChange]);\n\n // 暴露历史记录相关方法\n useImperativeHandle(ref, () => ({\n jumpToLine,\n getView: () => viewRef.current,\n getValue: () => viewRef.current?.state.doc.toString() || '',\n setValue: (newValue: string) => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: newValue,\n },\n });\n }\n },\n focus: () => viewRef.current?.focus(),\n getHistory: () => codeHistory,\n restoreHistory,\n clearHistory: () => {\n setCodeHistory([]);\n setCurrentHistoryIndex(-1);\n // 重置所有历史记录相关的内部状态\n lastSaveTime.current = 0;\n hasChanges.current = false;\n pendingContent.current = '';\n lastSavedContent.current = '';\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange([], -1);\n }\n }, 0);\n },\n } as any), [jumpToLine, codeHistory, restoreHistory, onHistoryChange]);\n\n // 定时保存待处理的历史记录\n useEffect(() => {\n if (!enableHistory) return;\n\n const intervalMs = historySaveInterval * 10000; // 转换为毫秒\n\n const interval = setInterval(() => {\n if (hasChanges.current && pendingContent.current) {\n addToHistory(pendingContent.current);\n }\n }, intervalMs);\n\n return () => clearInterval(interval);\n }, [enableHistory, historySaveInterval, addToHistory]);\n\n // 初始化编辑器\n useEffect(() => {\n if (!editorRef.current) return;\n\n const updateListener = EditorView.updateListener.of((update) => {\n if (!update.docChanged) return;\n const newContent = update.state.doc.toString();\n documentText.current = newContent;\n // Schedule before notifying consumers so reentrant updates always win.\n scheduleAnalysis(newContent);\n try {\n if (!isExternalUpdate.current) historyWriterRef.current(newContent);\n } finally {\n isExternalUpdate.current = false;\n }\n callbacksRef.current.onChange?.(newContent);\n });\n\n const baseExtensions: Extension[] = [\n history(),\n drawSelection(),\n bracketMatching(),\n closeBrackets(),\n indentOnInput(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n languageCompartment.current.of(getLanguageExtension(language)),\n themeCompartment.current.of(createThemeExtension(theme)),\n highlightCompartment.current.of(createHighlightExtension(theme)),\n readOnlyCompartment.current.of(EditorState.readOnly.of(readOnly)),\n updateListener,\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n ...searchKeymap,\n ...historyKeymap,\n ...completionKeymap,\n ...lintKeymap,\n indentWithTab,\n ]),\n bracketMatchingStyle,\n lineHighlightStyle,\n jumpTargetHighlight,\n ];\n\n // 可选扩展\n if (showLineNumbers) {\n baseExtensions.push(lineNumbers(), foldGutter(), highlightActiveLineGutter());\n }\n\n if (shouldHighlightActiveLine) {\n baseExtensions.push(highlightActiveLine());\n }\n\n // 自动补全\n if (autocompletion) {\n const config: AutocompletionConfig = typeof autocompletion === 'object' ? autocompletion : {};\n baseExtensions.push(smartAutocompletion(language, config));\n }\n\n // 跳转到定义\n if (jumpToDefinitionConfig) {\n const config: JumpToDefinitionConfig = typeof jumpToDefinitionConfig === 'object'\n ? jumpToDefinitionConfig\n : {};\n baseExtensions.push(jumpToDefinition(jumpToLine, config));\n }\n\n // 占位符\n if (placeholder) {\n baseExtensions.push(\n EditorView.contentAttributes.of({ 'data-placeholder': placeholder })\n );\n }\n\n // 自定义扩展\n if (customExtensions.length > 0) {\n baseExtensions.push(...customExtensions);\n }\n\n const startState = EditorState.create({\n doc: value,\n extensions: baseExtensions,\n });\n\n const view = new EditorView({\n state: startState,\n parent: editorRef.current,\n });\n\n viewRef.current = view;\n documentText.current = view.state.doc.toString();\n\n // 添加初始内容到历史记录\n if (enableHistory && value) {\n addToHistory(value, 'Initial content');\n }\n\n return () => {\n cancelAnalysis();\n viewRef.current = null;\n view.destroy();\n };\n }, []); // 只在挂载时初始化\n\n // 更新值\n useEffect(() => {\n if (viewRef.current && value !== documentText.current) {\n isExternalUpdate.current = true; // 标记为外部更新\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: value,\n },\n });\n // 注意:标志会在 updateListener 中被立即重置,不需要 setTimeout\n }\n }, [value]);\n\n // 更新语言\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: languageCompartment.current.reconfigure(getLanguageExtension(language)),\n });\n }\n }, [language]);\n\n // Callback identity changes only update refs: inline callbacks must not restart\n // pending input analysis or create a callback -> render -> analysis loop.\n useEffect(() => {\n scheduleAnalysis(documentText.current, 0);\n return cancelAnalysis;\n }, [language, hasVariableListener, hasOutlineListener, scheduleAnalysis, cancelAnalysis]);\n\n // 更新主题\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: [\n themeCompartment.current.reconfigure(createThemeExtension(theme)),\n highlightCompartment.current.reconfigure(createHighlightExtension(theme)),\n ],\n });\n }\n }, [theme]);\n\n // 更新只读状态\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: readOnlyCompartment.current.reconfigure(EditorState.readOnly.of(readOnly)),\n });\n }\n }, [readOnly]);\n\n // 处理右键菜单\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setContextMenuState({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n });\n }, []);\n\n const closeContextMenu = useCallback(() => {\n setContextMenuState({ visible: false, x: 0, y: 0 });\n }, []);\n\n const handleMenuItemClick = useCallback(\n (item: any) => {\n if (viewRef.current && !item.disabled) {\n item.action(viewRef.current);\n }\n closeContextMenu();\n },\n [closeContextMenu]\n );\n\n // 点击其他地方关闭菜单\n useEffect(() => {\n if (contextMenuState.visible) {\n const handleClick = () => closeContextMenu();\n document.addEventListener('click', handleClick);\n return () => document.removeEventListener('click', handleClick);\n }\n }, [contextMenuState.visible, closeContextMenu]);\n\n const editorStyles: React.CSSProperties = {\n height,\n minHeight,\n maxHeight,\n overflow: 'auto',\n };\n\n const menuItems = contextMenu || defaultContextMenu;\n\n return (\n <div className={`code-editor-wrapper ${className}`}>\n <div\n ref={editorRef}\n onContextMenu={handleContextMenu}\n style={editorStyles}\n className=\"code-editor\"\n />\n\n {/* 上下文菜单 */}\n {contextMenuState.visible && (\n <div\n className=\"context-menu\"\n style={{\n position: 'fixed',\n top: contextMenuState.y,\n left: contextMenuState.x,\n zIndex: 1000,\n }}\n >\n <ul className=\"menu bg-base-200 rounded-box shadow-lg\">\n {menuItems.map((item, index) => {\n if (item.separator) {\n return <li key={index} className=\"menu-separator\" />;\n }\n return (\n <li key={index}>\n <a\n onClick={() => handleMenuItemClick(item)}\n className={item.disabled ? 'disabled' : ''}\n >\n {item.label}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n\n <style>{`\n .code-editor-wrapper {\n position: relative;\n border: 1px solid var(--fallback-bc, oklch(var(--bc) / 0.2));\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .code-editor .cm-editor {\n height: 100%;\n }\n\n .code-editor .cm-scroller {\n overflow: auto;\n font-family: 'Fira Code', 'Consolas', 'Monaco', monospace;\n font-size: 14px;\n line-height: 1.5;\n }\n\n .code-editor .cm-content[data-placeholder]::before {\n content: attr(data-placeholder);\n color: var(--fallback-bc, oklch(var(--bc) / 0.4));\n position: absolute;\n pointer-events: none;\n }\n\n .context-menu {\n min-width: 150px;\n }\n\n .context-menu .menu-separator {\n height: 1px;\n background: var(--fallback-bc, oklch(var(--bc) / 0.2));\n margin: 0.25rem 0;\n }\n\n .context-menu .disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n `}</style>\n </div>\n );\n});\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport default CodeEditor;\n\n"],"mappings":"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"}
|
|
@@ -54,6 +54,7 @@ export interface CodeEditorHandle {
|
|
|
54
54
|
}
|
|
55
55
|
export interface CodeEditorProps {
|
|
56
56
|
value?: string;
|
|
57
|
+
/** 文档变化时同步通知(包括 setValue 和外部 value 更新),不受侧栏防抖影响。 */
|
|
57
58
|
onChange?: (value: string) => void;
|
|
58
59
|
language?: LanguageType;
|
|
59
60
|
theme?: EditorTheme;
|
|
@@ -63,7 +64,9 @@ export interface CodeEditorProps {
|
|
|
63
64
|
autocompletion?: boolean | AutocompletionConfig;
|
|
64
65
|
jumpToDefinition?: boolean | JumpToDefinitionConfig;
|
|
65
66
|
contextMenu?: ContextMenuItem[];
|
|
67
|
+
/** 输入停止 150ms 后分析最新文档;初始挂载、切语言、启用订阅时异步刷新。 */
|
|
66
68
|
onVariablesCollected?: (variables: VariableInfo[]) => void;
|
|
69
|
+
/** 与变量分析合并调度;使用最新回调,替换回调本身不触发重新分析。 */
|
|
67
70
|
onOutlineGenerated?: (outline: OutlineItem[]) => void;
|
|
68
71
|
enableHistory?: boolean;
|
|
69
72
|
historyLimit?: number;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { DataTableProps } from './types';
|
|
3
3
|
export * from './types';
|
|
4
|
-
declare function DataTable<T extends object>(
|
|
4
|
+
declare function DataTable<T extends object>(props: DataTableProps<T>): React.JSX.Element;
|
|
5
5
|
export default DataTable;
|
|
@@ -1,196 +1,62 @@
|
|
|
1
1
|
import e from "../../Table/index.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import { Fragment as oe, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
2
|
+
import { TableToolbar as t } from "./components/TableToolbar.js";
|
|
3
|
+
import { TableHeader as n } from "./components/TableHeader.js";
|
|
4
|
+
import { TableBody as r } from "./components/TableBody.js";
|
|
5
|
+
import { TablePagination as i } from "./components/TablePagination.js";
|
|
6
|
+
import { treeRowAnimationStyles as a } from "./treeDataUtils.js";
|
|
7
|
+
import { useDataTableModel as o } from "./useDataTableModel.js";
|
|
8
|
+
import { useColumnDragReorder as s } from "./useColumnDragReorder.js";
|
|
9
|
+
import c, { useCallback as l, useEffect as u, useState as d } from "react";
|
|
10
|
+
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
12
11
|
//#region src/components/pro/DataTable/DataTable.tsx
|
|
13
|
-
function h(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
function h(h) {
|
|
13
|
+
let { data: g, columns: _, className: v = "", enableSorting: y = !0, enablePagination: b = !0, enableColumnReordering: x = !0, enableExpanding: S = !1, indentSize: C = 16, toolbar: w = {
|
|
14
|
+
enabled: !1,
|
|
15
|
+
enableColumnSelector: !1,
|
|
16
|
+
enableFiltering: !1,
|
|
17
|
+
enableBulkActions: !1
|
|
18
|
+
}, customFilterPanel: T, onRowClick: ee, onRowDoubleClick: te, onRowMouseEnter: ne, onRowMouseLeave: re, onCellClick: E, onCellDoubleClick: D, onCellMouseEnter: O, onCellMouseLeave: k, onColumnMouseEnter: A, onColumnMouseLeave: j, extensions: M = [] } = h, { table: N, rowSelection: P, visibilityState: F, columnOrderState: I, setColumnOrderState: L, expandedRowsState: R, handleRowExpand: z, resolveRowId: B, handlePaginationChange: V } = o(h), [H, U] = d(null), { draggedColumnId: W, handleDragStart: G, handleDragOver: K, handleDrop: q } = s(I, L), J = {
|
|
19
|
+
table: N,
|
|
20
|
+
data: g,
|
|
21
|
+
rows: N.getRowModel().rows,
|
|
22
|
+
selectedRows: N.getSelectedRowModel().flatRows.map((e) => e.original),
|
|
23
|
+
getRowId: B
|
|
24
|
+
}, [Y, X] = d(null);
|
|
22
25
|
u(() => {
|
|
23
|
-
if (!
|
|
24
|
-
|
|
25
|
-
I.current = !0;
|
|
26
|
-
let e = g.map((e) => "accessorKey" in e ? e.accessorKey : e.id);
|
|
27
|
-
P(e);
|
|
28
|
-
} else I.current = !0;
|
|
29
|
-
}
|
|
30
|
-
}, [g]);
|
|
31
|
-
let Ze = (e, t) => {
|
|
32
|
-
let n = !F[e], r = {
|
|
33
|
-
...F,
|
|
34
|
-
[e]: n
|
|
35
|
-
};
|
|
36
|
-
n || te(t, e, y, b).forEach((e) => {
|
|
37
|
-
r[e] = !1;
|
|
38
|
-
}), Ke(r), me?.(t, n);
|
|
39
|
-
}, B = l((e, t = 0, n = "", r = !0, i = [], a = !1) => ne(e, F, y, b, t, n, r, i, a), [
|
|
40
|
-
F,
|
|
41
|
-
b,
|
|
42
|
-
y
|
|
43
|
-
]), V = d(() => v ? B(h) : h, [
|
|
44
|
-
h,
|
|
45
|
-
v,
|
|
46
|
-
B
|
|
47
|
-
]), H = d(() => v ? B(h, 0, "", !0, [], !0) : h, [
|
|
48
|
-
h,
|
|
49
|
-
v,
|
|
50
|
-
B
|
|
51
|
-
]), [U, W] = f(C), [G, K] = f(S);
|
|
52
|
-
u(() => {
|
|
53
|
-
C !== U && W(C);
|
|
54
|
-
}, [C]), u(() => {
|
|
55
|
-
S !== G && K(S);
|
|
56
|
-
}, [S]);
|
|
57
|
-
let Qe = d(() => {
|
|
58
|
-
if (!_) return V;
|
|
59
|
-
let e = U * G, t = e + G, n = H.slice(e, t);
|
|
60
|
-
if (v) {
|
|
61
|
-
let e = /* @__PURE__ */ new Map();
|
|
62
|
-
n.forEach((t) => e.set(t.__id, t)), n.forEach((t) => {
|
|
63
|
-
F[t.__id] && V.forEach((n) => {
|
|
64
|
-
n.__parentId?.startsWith(t.__id) && e.set(n.__id, n);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
let t = [];
|
|
68
|
-
return V.forEach((n) => {
|
|
69
|
-
e.has(n.__id) && t.push(n);
|
|
70
|
-
}), t;
|
|
71
|
-
}
|
|
72
|
-
return n;
|
|
73
|
-
}, [
|
|
74
|
-
V,
|
|
75
|
-
H,
|
|
76
|
-
U,
|
|
77
|
-
G,
|
|
78
|
-
_,
|
|
79
|
-
v,
|
|
80
|
-
F
|
|
81
|
-
]), $e = d(() => !v || !x ? g : g.map((e) => e.enableSorting === !1 ? e : {
|
|
82
|
-
...e,
|
|
83
|
-
sortFn: "treeSortAsc"
|
|
84
|
-
}), [
|
|
85
|
-
g,
|
|
86
|
-
v,
|
|
87
|
-
x
|
|
88
|
-
]), et = d(() => v && x ? ee() : void 0, [v, x]), tt = d(() => ({
|
|
89
|
-
data: Qe,
|
|
90
|
-
columns: $e,
|
|
91
|
-
pageCount: Math.ceil(H.length / G),
|
|
92
|
-
manualPagination: !0,
|
|
93
|
-
manualFiltering: pe,
|
|
94
|
-
state: {
|
|
95
|
-
sorting: O,
|
|
96
|
-
rowSelection: A,
|
|
97
|
-
columnFilters: j,
|
|
98
|
-
columnVisibility: M,
|
|
99
|
-
columnOrder: N.length > 0 ? N : void 0,
|
|
100
|
-
pagination: {
|
|
101
|
-
pageIndex: U,
|
|
102
|
-
pageSize: G
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
enableRowSelection: ue,
|
|
106
|
-
onRowSelectionChange: Ue,
|
|
107
|
-
onSortingChange: Xe,
|
|
108
|
-
onColumnFiltersChange: We,
|
|
109
|
-
onColumnVisibilityChange: Ge,
|
|
110
|
-
onPaginationChange: (e) => {
|
|
111
|
-
let t = typeof e == "function" ? e({
|
|
112
|
-
pageIndex: U,
|
|
113
|
-
pageSize: G
|
|
114
|
-
}) : e;
|
|
115
|
-
t.pageSize !== G && (K(t.pageSize), T?.(t.pageSize)), t.pageIndex !== U && (W(t.pageIndex), w?.(t.pageIndex));
|
|
116
|
-
},
|
|
117
|
-
sortFns: et,
|
|
118
|
-
initialState: { pagination: {
|
|
119
|
-
pageIndex: 0,
|
|
120
|
-
pageSize: G
|
|
121
|
-
} }
|
|
122
|
-
}), [
|
|
123
|
-
Qe,
|
|
124
|
-
$e,
|
|
125
|
-
O,
|
|
126
|
-
A,
|
|
127
|
-
j,
|
|
128
|
-
M,
|
|
129
|
-
N,
|
|
130
|
-
ue,
|
|
131
|
-
_,
|
|
132
|
-
et,
|
|
133
|
-
pe,
|
|
134
|
-
Xe,
|
|
135
|
-
G,
|
|
136
|
-
U,
|
|
137
|
-
w,
|
|
138
|
-
T,
|
|
139
|
-
H
|
|
140
|
-
]), q = t(tt), J = l((e, t) => {
|
|
141
|
-
if (b) return b(e, t);
|
|
142
|
-
let n = e;
|
|
143
|
-
return n && n.__id != null ? String(n.__id) : String(t);
|
|
144
|
-
}, [b]), Y = d(() => {
|
|
145
|
-
let e = q.getSelectedRowModel().rows.map((e) => e.original);
|
|
146
|
-
return {
|
|
147
|
-
table: q,
|
|
148
|
-
data: h,
|
|
149
|
-
rows: q.getRowModel().rows,
|
|
150
|
-
selectedRows: e,
|
|
151
|
-
getRowId: J
|
|
152
|
-
};
|
|
153
|
-
}, [
|
|
154
|
-
q,
|
|
155
|
-
h,
|
|
156
|
-
J,
|
|
157
|
-
A
|
|
158
|
-
]), [X, Z] = f(null);
|
|
159
|
-
u(() => {
|
|
160
|
-
if (!X) return;
|
|
161
|
-
let e = () => Z(null);
|
|
26
|
+
if (!Y) return;
|
|
27
|
+
let e = () => X(null);
|
|
162
28
|
return window.addEventListener("click", e), window.addEventListener("scroll", e, !0), () => {
|
|
163
29
|
window.removeEventListener("click", e), window.removeEventListener("scroll", e, !0);
|
|
164
30
|
};
|
|
165
|
-
}, [
|
|
166
|
-
let
|
|
167
|
-
if (
|
|
31
|
+
}, [Y]);
|
|
32
|
+
let ie = l((e, t, n, r) => {
|
|
33
|
+
if (M.length === 0) return;
|
|
168
34
|
let i = n?.id ?? "", a = {
|
|
169
35
|
value: n?.id == null ? void 0 : t[n.id],
|
|
170
36
|
row: t,
|
|
171
|
-
rowId:
|
|
37
|
+
rowId: B(t, r),
|
|
172
38
|
rowIndex: r,
|
|
173
39
|
columnId: i
|
|
174
|
-
}, o =
|
|
175
|
-
o.length && (e.preventDefault(),
|
|
40
|
+
}, o = M.flatMap((e) => e.contextMenu?.(a, J) ?? []);
|
|
41
|
+
o.length && (e.preventDefault(), X({
|
|
176
42
|
x: e.clientX,
|
|
177
43
|
y: e.clientY,
|
|
178
44
|
items: o,
|
|
179
45
|
ctx: a
|
|
180
46
|
}));
|
|
181
47
|
}, [
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
]),
|
|
48
|
+
M,
|
|
49
|
+
J,
|
|
50
|
+
B
|
|
51
|
+
]), Z = M.map((e) => e.toolbar ? {
|
|
186
52
|
name: e.name,
|
|
187
|
-
node: e.toolbar(
|
|
188
|
-
} : null).filter((e) => !!e && !!e.node), Q =
|
|
53
|
+
node: e.toolbar(J)
|
|
54
|
+
} : null).filter((e) => !!e && !!e.node), Q = M.map((e) => e.footer ? {
|
|
189
55
|
name: e.name,
|
|
190
|
-
node: e.footer(
|
|
56
|
+
node: e.footer(J)
|
|
191
57
|
} : null).filter((e) => !!e && !!e.node), $;
|
|
192
|
-
for (let e of
|
|
193
|
-
let t = e.renderContent?.(
|
|
58
|
+
for (let e of M) {
|
|
59
|
+
let t = e.renderContent?.(J);
|
|
194
60
|
if (t !== void 0) {
|
|
195
61
|
$ = t;
|
|
196
62
|
break;
|
|
@@ -198,82 +64,74 @@ function h({ data: h, columns: g, className: se = "", enableSorting: ce = !0, en
|
|
|
198
64
|
}
|
|
199
65
|
return u(() => {
|
|
200
66
|
let e = document.createElement("style");
|
|
201
|
-
return e.textContent =
|
|
67
|
+
return e.textContent = a, document.head.appendChild(e), () => {
|
|
202
68
|
document.head.removeChild(e);
|
|
203
69
|
};
|
|
204
70
|
}, []), /* @__PURE__ */ m("div", {
|
|
205
|
-
className: `w-full ${
|
|
71
|
+
className: `w-full ${v}`,
|
|
206
72
|
children: [
|
|
207
|
-
/* @__PURE__ */ p(
|
|
208
|
-
toolbar:
|
|
209
|
-
table:
|
|
210
|
-
columns:
|
|
211
|
-
columnOrderState:
|
|
212
|
-
visibilityState:
|
|
213
|
-
activeFilter:
|
|
214
|
-
setActiveFilter:
|
|
215
|
-
customFilterPanel:
|
|
216
|
-
draggedColumnId:
|
|
217
|
-
handleDragStart:
|
|
73
|
+
/* @__PURE__ */ p(t, {
|
|
74
|
+
toolbar: w,
|
|
75
|
+
table: N,
|
|
76
|
+
columns: _,
|
|
77
|
+
columnOrderState: I,
|
|
78
|
+
visibilityState: F,
|
|
79
|
+
activeFilter: H,
|
|
80
|
+
setActiveFilter: U,
|
|
81
|
+
customFilterPanel: T,
|
|
82
|
+
draggedColumnId: W,
|
|
83
|
+
handleDragStart: G,
|
|
218
84
|
toggleColumnVisibility: (e) => {
|
|
219
|
-
|
|
85
|
+
N.getColumn(e)?.toggleVisibility();
|
|
220
86
|
},
|
|
221
|
-
rowSelection:
|
|
222
|
-
data:
|
|
223
|
-
enableColumnReordering:
|
|
224
|
-
handleDrop:
|
|
87
|
+
rowSelection: P,
|
|
88
|
+
data: g,
|
|
89
|
+
enableColumnReordering: x,
|
|
90
|
+
handleDrop: q
|
|
225
91
|
}),
|
|
226
|
-
|
|
92
|
+
Z.length > 0 && /* @__PURE__ */ p("div", {
|
|
227
93
|
className: "flex flex-wrap items-start gap-3 mb-4",
|
|
228
|
-
children:
|
|
94
|
+
children: Z.map((e) => /* @__PURE__ */ p(c.Fragment, { children: e.node }, e.name))
|
|
229
95
|
}),
|
|
230
|
-
$ === void 0 ? /* @__PURE__ */ m(
|
|
96
|
+
$ === void 0 ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("div", {
|
|
231
97
|
className: "overflow-x-auto",
|
|
232
98
|
children: /* @__PURE__ */ m(e, {
|
|
233
99
|
className: "table-sm w-full",
|
|
234
|
-
children: [/* @__PURE__ */ p(
|
|
235
|
-
table:
|
|
236
|
-
visibilityState:
|
|
237
|
-
enableSorting:
|
|
238
|
-
enableColumnReordering:
|
|
239
|
-
draggedColumnId:
|
|
240
|
-
onColumnMouseEnter:
|
|
241
|
-
onColumnMouseLeave:
|
|
242
|
-
handleDragStart:
|
|
243
|
-
handleDragOver:
|
|
244
|
-
handleDrop:
|
|
245
|
-
}), /* @__PURE__ */ p(
|
|
246
|
-
table:
|
|
247
|
-
expandedRowsState:
|
|
248
|
-
onRowClick:
|
|
249
|
-
onRowDoubleClick:
|
|
250
|
-
onRowMouseEnter:
|
|
251
|
-
onRowMouseLeave:
|
|
252
|
-
onCellClick:
|
|
253
|
-
onCellDoubleClick:
|
|
254
|
-
onCellMouseEnter:
|
|
255
|
-
onCellMouseLeave:
|
|
256
|
-
enableExpanding:
|
|
257
|
-
indentSize:
|
|
258
|
-
handleRowExpand:
|
|
259
|
-
extensions:
|
|
260
|
-
extensionApi:
|
|
261
|
-
getRowId:
|
|
262
|
-
onCellContextMenu:
|
|
100
|
+
children: [/* @__PURE__ */ p(n, {
|
|
101
|
+
table: N,
|
|
102
|
+
visibilityState: F,
|
|
103
|
+
enableSorting: y,
|
|
104
|
+
enableColumnReordering: x,
|
|
105
|
+
draggedColumnId: W,
|
|
106
|
+
onColumnMouseEnter: A,
|
|
107
|
+
onColumnMouseLeave: j,
|
|
108
|
+
handleDragStart: G,
|
|
109
|
+
handleDragOver: K,
|
|
110
|
+
handleDrop: q
|
|
111
|
+
}), /* @__PURE__ */ p(r, {
|
|
112
|
+
table: N,
|
|
113
|
+
expandedRowsState: R,
|
|
114
|
+
onRowClick: ee,
|
|
115
|
+
onRowDoubleClick: te,
|
|
116
|
+
onRowMouseEnter: ne,
|
|
117
|
+
onRowMouseLeave: re,
|
|
118
|
+
onCellClick: E,
|
|
119
|
+
onCellDoubleClick: D,
|
|
120
|
+
onCellMouseEnter: O,
|
|
121
|
+
onCellMouseLeave: k,
|
|
122
|
+
enableExpanding: S,
|
|
123
|
+
indentSize: C,
|
|
124
|
+
handleRowExpand: z,
|
|
125
|
+
extensions: M,
|
|
126
|
+
extensionApi: J,
|
|
127
|
+
getRowId: B,
|
|
128
|
+
onCellContextMenu: ie
|
|
263
129
|
})]
|
|
264
130
|
})
|
|
265
|
-
}), /* @__PURE__ */ p(
|
|
266
|
-
enablePagination:
|
|
267
|
-
table:
|
|
268
|
-
|
|
269
|
-
internalPageSize: G,
|
|
270
|
-
handlePageChange: (e) => {
|
|
271
|
-
U !== e && (W(e), w?.(e));
|
|
272
|
-
},
|
|
273
|
-
setInternalPageSize: K,
|
|
274
|
-
setInternalPageIndex: W,
|
|
275
|
-
onPageSizeChange: T,
|
|
276
|
-
onPageChange: w
|
|
131
|
+
}), /* @__PURE__ */ p(i, {
|
|
132
|
+
enablePagination: b,
|
|
133
|
+
table: N,
|
|
134
|
+
onPaginationChange: V
|
|
277
135
|
})] }) : /* @__PURE__ */ p("div", {
|
|
278
136
|
className: "w-full",
|
|
279
137
|
children: $
|
|
@@ -282,19 +140,19 @@ function h({ data: h, columns: g, className: se = "", enableSorting: ce = !0, en
|
|
|
282
140
|
className: "flex flex-wrap items-center gap-3 mt-4",
|
|
283
141
|
children: Q.map((e) => /* @__PURE__ */ p(c.Fragment, { children: e.node }, e.name))
|
|
284
142
|
}),
|
|
285
|
-
|
|
143
|
+
Y && /* @__PURE__ */ p("ul", {
|
|
286
144
|
className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 z-1000 p-1",
|
|
287
145
|
style: {
|
|
288
146
|
position: "fixed",
|
|
289
|
-
top:
|
|
290
|
-
left:
|
|
147
|
+
top: Y.y,
|
|
148
|
+
left: Y.x,
|
|
291
149
|
minWidth: 160
|
|
292
150
|
},
|
|
293
|
-
children:
|
|
151
|
+
children: Y.items.map((e) => e.separator ? /* @__PURE__ */ p("li", { className: "my-1 border-t border-base-300" }, e.key) : /* @__PURE__ */ p("li", { children: /* @__PURE__ */ p("button", {
|
|
294
152
|
type: "button",
|
|
295
153
|
disabled: e.disabled,
|
|
296
154
|
onClick: () => {
|
|
297
|
-
e.onSelect?.(
|
|
155
|
+
e.onSelect?.(Y.ctx), X(null);
|
|
298
156
|
},
|
|
299
157
|
children: e.label
|
|
300
158
|
}) }, e.key))
|