dishui 0.0.64 → 0.0.65

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.
Files changed (177) hide show
  1. package/dist/components/Badge/index.js +12 -9
  2. package/dist/components/Badge/index.js.map +1 -1
  3. package/dist/components/Button/index.js +43 -40
  4. package/dist/components/Button/index.js.map +1 -1
  5. package/dist/components/Card/index.d.ts +11 -0
  6. package/dist/components/Card/index.js +62 -37
  7. package/dist/components/Card/index.js.map +1 -1
  8. package/dist/components/Chart/Chart.js.map +1 -1
  9. package/dist/components/Checkbox/index.js +32 -30
  10. package/dist/components/Checkbox/index.js.map +1 -1
  11. package/dist/components/Demo/index.js.map +1 -1
  12. package/dist/components/EmptyState/index.d.ts +4 -1
  13. package/dist/components/EmptyState/index.js +3 -3
  14. package/dist/components/EmptyState/index.js.map +1 -1
  15. package/dist/components/FileUploader/DropZone.js.map +1 -1
  16. package/dist/components/FileUploader/FileItem.js.map +1 -1
  17. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  18. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  19. package/dist/components/Input/index.js +30 -30
  20. package/dist/components/Input/index.js.map +1 -1
  21. package/dist/components/Label/index.js +41 -40
  22. package/dist/components/Label/index.js.map +1 -1
  23. package/dist/components/List/index.js +47 -32
  24. package/dist/components/List/index.js.map +1 -1
  25. package/dist/components/Markdown/Markdown.js +61 -57
  26. package/dist/components/Markdown/Markdown.js.map +1 -1
  27. package/dist/components/Markdown/markdownComponents.js +49 -49
  28. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  29. package/dist/components/Modal/index.d.ts +7 -3
  30. package/dist/components/Modal/index.js +77 -65
  31. package/dist/components/Modal/index.js.map +1 -1
  32. package/dist/components/Page/index.d.ts +58 -0
  33. package/dist/components/Page/index.js +74 -0
  34. package/dist/components/Page/index.js.map +1 -0
  35. package/dist/components/PageHeader/index.js.map +1 -1
  36. package/dist/components/Select/index.js +0 -3
  37. package/dist/components/Select/index.js.map +1 -1
  38. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  39. package/dist/components/StatCard/index.d.ts +3 -1
  40. package/dist/components/StatCard/index.js +39 -11
  41. package/dist/components/StatCard/index.js.map +1 -1
  42. package/dist/components/Table/index.js +103 -85
  43. package/dist/components/Table/index.js.map +1 -1
  44. package/dist/components/Tabs/index.d.ts +19 -5
  45. package/dist/components/Tabs/index.js +32 -13
  46. package/dist/components/Tabs/index.js.map +1 -1
  47. package/dist/components/Tree/Tree.js.map +1 -1
  48. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  49. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  50. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +141 -134
  51. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  52. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +81 -78
  53. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  54. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  55. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  56. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  57. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  58. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  59. package/dist/components/pro/CodeEditor/themes.js +59 -59
  60. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  61. package/dist/components/pro/DataTable/DataTable.js +49 -48
  62. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  63. package/dist/components/pro/DataTable/Filters.js +42 -42
  64. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  65. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  66. package/dist/components/pro/DataTable/PivotView.js +35 -32
  67. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  68. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  69. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  70. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  71. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  72. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  73. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  74. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  75. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  76. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  77. package/dist/components/pro/DataTable/tanstack-table.js +37 -37
  78. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  79. package/dist/components/pro/FileExplorer/Breadcrumb.js +53 -53
  80. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  81. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  82. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  83. package/dist/components/pro/FileExplorer/FileIcon.js +22 -22
  84. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  85. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  86. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  87. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  88. package/dist/components/pro/Flow/Flow.js +496 -494
  89. package/dist/components/pro/Flow/Flow.js.map +1 -1
  90. package/dist/components/pro/Flow/FlowCanvas.js +916 -917
  91. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  92. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  93. package/dist/components/pro/Flow/edges/EdgeRenderer.js +59 -59
  94. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  95. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  96. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  97. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  98. package/dist/components/pro/Flow/hooks/useLayoutActions.js +9 -11
  99. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  100. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  101. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  102. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  103. package/dist/components/pro/Flow/lines/FreehandTool.js +9 -9
  104. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  105. package/dist/components/pro/Flow/lines/LineRenderer.js +5 -5
  106. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  107. package/dist/components/pro/Flow/nodes/DataNodeView.js +113 -93
  108. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  109. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  110. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  111. package/dist/components/pro/Flow/nodes/Model3DView.js +1 -1
  112. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  113. package/dist/components/pro/Flow/nodes/NodeRenderer.js +118 -118
  114. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  115. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  116. package/dist/components/pro/Flow/nodes/shapes.js +1 -3
  117. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  118. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  119. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  120. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  121. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  122. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  123. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  124. package/dist/components/pro/Flow/panels/FlowToolbar.js +97 -97
  125. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  126. package/dist/components/pro/Flow/panels/InspectorPanel.js +57 -57
  127. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  128. package/dist/components/pro/Flow/panels/OutlinePanel.js +26 -22
  129. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  130. package/dist/components/pro/Flow/panels/PresentationMode.js +18 -16
  131. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  132. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  133. package/dist/components/pro/Flow/panels/ShapePalette.js +109 -104
  134. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  135. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  136. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  137. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  138. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  139. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  140. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  141. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  142. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  143. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  144. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  145. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  146. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  147. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  148. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  149. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  150. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  151. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  152. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  153. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  154. package/dist/contexts/AppContext.js.map +1 -1
  155. package/dist/dishui.css +1 -1
  156. package/dist/hooks/useTableColumns.js +7 -8
  157. package/dist/hooks/useTableColumns.js.map +1 -1
  158. package/dist/index.d.ts +2 -0
  159. package/dist/index.js +227 -221
  160. package/dist/layouts/MainLayout.js +22 -22
  161. package/dist/layouts/MainLayout.js.map +1 -1
  162. package/dist/layouts/Navbar.js.map +1 -1
  163. package/dist/layouts/Sidebar.js +94 -73
  164. package/dist/layouts/Sidebar.js.map +1 -1
  165. package/dist/layouts/headbar/Headbar.js.map +1 -1
  166. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  167. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  168. package/dist/layouts/headbar/HeadbarThemeSwitcher.js +11 -11
  169. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  170. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  171. package/dist/utils/i18n.js +10 -10
  172. package/dist/utils/i18n.js.map +1 -1
  173. package/dist/utils/menu.js.map +1 -1
  174. package/dist/utils/routerBuilder.js +17 -15
  175. package/dist/utils/routerBuilder.js.map +1 -1
  176. package/dist/utils/themes.js.map +1 -1
  177. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"DataInspectorSection.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/DataInspectorSection.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\nimport { ExpandableTextarea } from './ExpandableTextarea';\nimport type {\n FlowNode,\n FlowDataConfig,\n FlowDataColumn,\n FlowDataColumnType,\n FlowDataChartType,\n FlowDataView,\n FlowDataPivotPanelPlacement,\n} from '../types';\nimport {\n parseDataFile,\n parseCsv,\n matrixToTable,\n makeDefaultDataConfig,\n applyCsvText,\n toCsv,\n numericFields,\n labelFor,\n DATA_CHART_PALETTE,\n} from '../nodes/dataUtils';\n\nconst COLUMN_TYPE_OPTIONS: Array<{ value: FlowDataColumnType; label: string }> = [\n { value: 'string', label: '文本' },\n { value: 'number', label: '数值' },\n { value: 'date', label: '日期' },\n { value: 'boolean', label: '布尔' },\n];\n\nconst CHART_TYPE_OPTIONS: Array<{ value: FlowDataChartType; label: string }> = [\n { value: 'bar', label: '柱状图' },\n { value: 'barHorizontal', label: '横向柱状图' },\n { value: 'line', label: '折线图' },\n { value: 'area', label: '面积图' },\n { value: 'scatter', label: '散点图' },\n { value: 'pie', label: '饼图' },\n];\n\nconst PIVOT_PLACEMENT_OPTIONS: Array<{ value: FlowDataPivotPanelPlacement; label: string }> = [\n { value: 'top', label: '上方' },\n { value: 'bottom', label: '下方' },\n { value: 'left', label: '左侧' },\n { value: 'right', label: '右侧' },\n];\n\nconst EMPTY_CONFIG: FlowDataConfig = { columns: [], rows: [], view: 'table' };\n\n/**\n * Inspector controls for a Data node: upload CSV/Excel, edit columns, edit rows\n * as CSV text (with fullscreen), and configure the table (pivot) or chart view.\n */\nexport function DataInspectorSection({\n node,\n onUpdateData,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n const config = node.data.dataConfig ?? EMPTY_CONFIG;\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const update = (patch: Partial<FlowDataConfig>) => {\n onUpdateData(node.id, 'dataConfig', { ...config, ...patch });\n };\n\n // ── CSV text editing (local draft, committed on blur) ────────────────────\n // The textarea edits a CSV serialization of columns+rows. We keep a local\n // draft so typing isn't interrupted by re-parsing; the parse (which re-infers\n // nothing for known columns and preserves chart/pivot field refs) runs once\n // on blur / fullscreen close. When the config changes externally (upload,\n // paste), the draft is re-synced.\n const csvText = useMemo(() => toCsv(config.columns, config.rows), [config.columns, config.rows]);\n const [csvDraft, setCsvDraft] = useState(csvText);\n const lastCommitted = useRef(csvText);\n useEffect(() => {\n if (csvText !== lastCommitted.current) {\n lastCommitted.current = csvText;\n setCsvDraft(csvText);\n }\n }, [csvText]);\n\n const commitCsv = (text: string) => {\n if (text === lastCommitted.current) return;\n lastCommitted.current = text;\n onUpdateData(node.id, 'dataConfig', applyCsvText(config, text));\n };\n\n // ── File upload ────────────────────────────────────────────────────────\n const handleFile = async (file: File) => {\n try {\n const parsed = await parseDataFile(file);\n if (parsed.columns.length === 0) {\n window.alert('未能从文件中解析出任何数据。');\n return;\n }\n onUpdateData(node.id, 'dataConfig', makeDefaultDataConfig(parsed, file.name));\n } catch (e: any) {\n window.alert(`解析失败:${e?.message ?? e}`);\n }\n };\n\n // ── Column editing ─────────────────────────────────────────────────────\n const setColumn = (index: number, patch: Partial<FlowDataColumn>) => {\n const columns = config.columns.map((c, i) => (i === index ? { ...c, ...patch } : c));\n update({ columns });\n };\n\n const addColumn = () => {\n const used = new Set(config.columns.map((c) => c.key));\n let key = 'col';\n let n = 1;\n while (used.has(key)) key = `col_${n++}`;\n const columns: FlowDataColumn[] = [...config.columns, { key, label: key, type: 'string' }];\n // pad existing rows with an empty value for the new column\n const rows = config.rows.map((r) => ({ ...r, [key]: '' }));\n update({ columns, rows });\n };\n\n const removeColumn = (index: number) => {\n const col = config.columns[index];\n const columns = config.columns.filter((_, i) => i !== index);\n const rows = config.rows.map((r) => {\n const { [col.key]: _drop, ...rest } = r;\n return rest;\n });\n // prune chart/pivot references to the removed column\n const chart = config.chart\n ? {\n ...config.chart,\n xField: config.chart.xField === col.key ? columns.find((c) => c.type !== 'number')?.key ?? columns[0]?.key : config.chart.xField,\n yFields: (config.chart.yFields ?? []).filter((f) => f !== col.key),\n }\n : config.chart;\n const pivot = config.pivot\n ? {\n ...config.pivot,\n rowFields: config.pivot.rowFields.filter((f) => f !== col.key),\n colFields: config.pivot.colFields.filter((f) => f !== col.key),\n values: config.pivot.values.filter((v) => v.field !== col.key),\n }\n : config.pivot;\n update({ columns, rows, chart, pivot });\n };\n\n // ── Paste CSV (replace whole table) ─────────────────────────────────────\n const pasteCsv = () => {\n const text = window.prompt('粘贴 CSV 文本(第一行为表头):');\n if (!text) return;\n const parsed = matrixToTable(parseCsv(text));\n if (parsed.columns.length === 0) {\n window.alert('未能解析出数据。');\n return;\n }\n onUpdateData(node.id, 'dataConfig', makeDefaultDataConfig(parsed));\n };\n\n const nums = numericFields(config.columns);\n const chart = config.chart ?? { type: 'bar' as FlowDataChartType };\n const setChart = (patch: Partial<typeof chart>) => update({ chart: { ...chart, ...patch } });\n\n const setSeriesColor = (field: string, color: string) => {\n setChart({ seriesColors: { ...(chart.seriesColors ?? {}), [field]: color } });\n };\n const resetSeriesColor = (field: string) => {\n const next = { ...(chart.seriesColors ?? {}) };\n delete next[field];\n setChart({ seriesColors: Object.keys(next).length ? next : undefined });\n };\n\n const palette = chart.palette?.length ? chart.palette : DATA_CHART_PALETTE;\n const setPaletteColor = (i: number, color: string) => {\n const next = DATA_CHART_PALETTE.map((c, j) => (j === i ? color : (chart.palette?.[j] ?? c)));\n setChart({ palette: next });\n };\n\n const pivot = config.pivot ?? { enabled: false, rowFields: [], colFields: [], values: [] };\n const setPivot = (patch: Partial<typeof pivot>) => update({ pivot: { ...pivot, ...patch } });\n\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Data</div>\n\n {/* Import controls */}\n <div className=\"flow-inspector-row\">\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv,.tsv,.txt,.xlsx,.xlsm,text/csv\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) void handleFile(file);\n }}\n />\n <Button size=\"xs\" variant=\"neutral\" onClick={() => fileInputRef.current?.click()}>\n 上传 CSV / Excel\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={pasteCsv}>\n 粘贴 CSV\n </Button>\n </div>\n {config.sourceName && (\n <div className=\"flow-inspector-help\">来源:{config.sourceName}</div>\n )}\n\n {/* View toggle */}\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">视图</Label>\n <Select\n options={[\n { value: 'table', label: '表格 / 透视' },\n { value: 'chart', label: '图表' },\n ]}\n value={config.view}\n onChange={(v) => update({ view: v as FlowDataView })}\n />\n </div>\n\n {/* Columns editor */}\n <div className=\"flow-inspector-subtitle\">列配置({config.columns.length})</div>\n {config.columns.map((col, i) => (\n <div key={i} className=\"flow-data-col-row\">\n <Input\n size=\"xs\"\n value={col.label ?? col.key}\n placeholder=\"列名\"\n onChange={(e) => setColumn(i, { label: e.target.value })}\n className=\"flex-1\"\n />\n <Select\n options={COLUMN_TYPE_OPTIONS}\n value={col.type}\n onChange={(v) => setColumn(i, { type: v as FlowDataColumnType })}\n />\n <Button size=\"xs\" variant=\"ghost\" onClick={() => removeColumn(i)}>\n ✕\n </Button>\n </div>\n ))}\n <div className=\"flow-inspector-row\">\n <Button size=\"xs\" variant=\"ghost\" onClick={addColumn}>+ 添加列</Button>\n </div>\n\n {/* Rows editor: CSV text with fullscreen */}\n <div className=\"flow-inspector-subtitle\">数据(CSV · {config.rows.length} 行)</div>\n <ExpandableTextarea\n label=\"CSV 数据(首行为表头)\"\n value={csvDraft}\n onChange={setCsvDraft}\n onBlur={commitCsv}\n rows={8}\n placeholder=\"类别,数值&#10;A,30&#10;B,45\"\n />\n <div className=\"flow-inspector-help\">\n 直接编辑 CSV 文本,失焦或关闭全屏后生效。已有列的类型会保留。\n </div>\n\n {/* Chart config */}\n {config.view === 'chart' && (\n <>\n <div className=\"flow-inspector-subtitle\">图表配置</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">类型</Label>\n <Select\n options={CHART_TYPE_OPTIONS}\n value={chart.type}\n onChange={(v) => setChart({ type: v as FlowDataChartType })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">\n {chart.type === 'scatter' ? 'X 字段' : '类别轴'}\n </Label>\n <Select\n options={config.columns.map((c) => ({ value: c.key, label: c.label ?? c.key }))}\n value={chart.xField ?? ''}\n onChange={(v) => setChart({ xField: typeof v === 'string' ? v : String(v) })}\n />\n </div>\n <div className=\"flow-inspector-subtitle-sm\">\n {chart.type === 'scatter' || chart.type === 'pie' ? '数值字段' : '数值字段(可多选,多系列)'}\n </div>\n {nums.length === 0 && (\n <div className=\"flow-inspector-help\">没有数值列,请先将某列类型设为「数值」。</div>\n )}\n {nums.map((f) => {\n const selected = (chart.yFields ?? []).includes(f);\n const single = chart.type === 'scatter' || chart.type === 'pie';\n return (\n <label key={f} className=\"flow-data-field-toggle\">\n <input\n type={single ? 'radio' : 'checkbox'}\n className={single ? 'radio radio-xs radio-primary' : 'checkbox checkbox-xs checkbox-primary'}\n checked={selected}\n onChange={(e) => {\n if (single) {\n setChart({ yFields: [f] });\n return;\n }\n const current = new Set(chart.yFields ?? []);\n if (e.target.checked) current.add(f);\n else current.delete(f);\n setChart({ yFields: Array.from(current) });\n }}\n />\n <span>{labelFor(config.columns, f)}</span>\n </label>\n );\n })}\n\n {/* Chart colors */}\n {(chart.yFields ?? []).length > 0 && chart.type !== 'pie' && (\n <>\n <div className=\"flow-inspector-subtitle-sm\">系列颜色</div>\n {(chart.yFields ?? []).map((f, i) => {\n const color = chart.seriesColors?.[f] ?? DATA_CHART_PALETTE[i % DATA_CHART_PALETTE.length];\n const overridden = !!chart.seriesColors?.[f];\n return (\n <div key={f} className=\"flow-data-color-row\">\n <input\n type=\"color\"\n value={color}\n onChange={(e) => setSeriesColor(f, e.target.value)}\n />\n <span className=\"flow-data-color-label\">{labelFor(config.columns, f)}</span>\n {overridden && (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => resetSeriesColor(f)}>\n 重置\n </Button>\n )}\n </div>\n );\n })}\n </>\n )}\n {chart.type === 'pie' && (\n <>\n <div className=\"flow-inspector-subtitle-sm\">饼图配色</div>\n <div className=\"flow-data-palette\">\n {DATA_CHART_PALETTE.map((_, i) => (\n <input\n key={i}\n type=\"color\"\n value={palette[i % palette.length]}\n onChange={(e) => setPaletteColor(i, e.target.value)}\n />\n ))}\n </div>\n {chart.palette && (\n <div className=\"flow-inspector-row\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setChart({ palette: undefined })}>\n 重置为默认配色\n </Button>\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* Pivot config */}\n {config.view === 'table' && (\n <>\n <div className=\"flow-inspector-subtitle\">透视(Pivot)</div>\n <label className=\"flow-data-field-toggle\">\n <input\n type=\"checkbox\"\n className=\"toggle toggle-xs toggle-primary\"\n checked={pivot.enabled}\n onChange={(e) => setPivot({ enabled: e.target.checked })}\n />\n <span>开启透视模式</span>\n </label>\n {pivot.enabled && (\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">面板位置</Label>\n <Select\n options={PIVOT_PLACEMENT_OPTIONS}\n value={pivot.panelPlacement ?? 'top'}\n onChange={(v) => setPivot({ panelPlacement: v as FlowDataPivotPanelPlacement })}\n />\n </div>\n )}\n <div className=\"flow-inspector-help\">\n 透视的行/列/度量可在画布节点内的透视面板上交互拖拽调整。\n </div>\n </>\n )}\n </div>\n );\n}\n\nexport default DataInspectorSection;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataInspectorSection.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/DataInspectorSection.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\nimport { ExpandableTextarea } from './ExpandableTextarea';\nimport type {\n FlowNode,\n FlowDataConfig,\n FlowDataColumn,\n FlowDataColumnType,\n FlowDataChartType,\n FlowDataView,\n FlowDataPivotPanelPlacement,\n} from '../types';\nimport {\n parseDataFile,\n parseCsv,\n matrixToTable,\n makeDefaultDataConfig,\n applyCsvText,\n toCsv,\n numericFields,\n labelFor,\n DATA_CHART_PALETTE,\n} from '../nodes/dataUtils';\n\nconst COLUMN_TYPE_OPTIONS: Array<{ value: FlowDataColumnType; label: string }> = [\n { value: 'string', label: '文本' },\n { value: 'number', label: '数值' },\n { value: 'date', label: '日期' },\n { value: 'boolean', label: '布尔' },\n];\n\nconst CHART_TYPE_OPTIONS: Array<{ value: FlowDataChartType; label: string }> = [\n { value: 'bar', label: '柱状图' },\n { value: 'barHorizontal', label: '横向柱状图' },\n { value: 'line', label: '折线图' },\n { value: 'area', label: '面积图' },\n { value: 'scatter', label: '散点图' },\n { value: 'pie', label: '饼图' },\n];\n\nconst PIVOT_PLACEMENT_OPTIONS: Array<{ value: FlowDataPivotPanelPlacement; label: string }> = [\n { value: 'top', label: '上方' },\n { value: 'bottom', label: '下方' },\n { value: 'left', label: '左侧' },\n { value: 'right', label: '右侧' },\n];\n\nconst EMPTY_CONFIG: FlowDataConfig = { columns: [], rows: [], view: 'table' };\n\n/**\n * Inspector controls for a Data node: upload CSV/Excel, edit columns, edit rows\n * as CSV text (with fullscreen), and configure the table (pivot) or chart view.\n */\nexport function DataInspectorSection({\n node,\n onUpdateData,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n const config = node.data.dataConfig ?? EMPTY_CONFIG;\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const update = (patch: Partial<FlowDataConfig>) => {\n onUpdateData(node.id, 'dataConfig', { ...config, ...patch });\n };\n\n // ── CSV text editing (local draft, committed on blur) ────────────────────\n // The textarea edits a CSV serialization of columns+rows. We keep a local\n // draft so typing isn't interrupted by re-parsing; the parse (which re-infers\n // nothing for known columns and preserves chart/pivot field refs) runs once\n // on blur / fullscreen close. When the config changes externally (upload,\n // paste), the draft is re-synced.\n const csvText = useMemo(() => toCsv(config.columns, config.rows), [config.columns, config.rows]);\n const [csvDraft, setCsvDraft] = useState(csvText);\n const lastCommitted = useRef(csvText);\n useEffect(() => {\n if (csvText !== lastCommitted.current) {\n lastCommitted.current = csvText;\n setCsvDraft(csvText);\n }\n }, [csvText]);\n\n const commitCsv = (text: string) => {\n if (text === lastCommitted.current) return;\n lastCommitted.current = text;\n onUpdateData(node.id, 'dataConfig', applyCsvText(config, text));\n };\n\n // ── File upload ────────────────────────────────────────────────────────\n const handleFile = async (file: File) => {\n try {\n const parsed = await parseDataFile(file);\n if (parsed.columns.length === 0) {\n window.alert('未能从文件中解析出任何数据。');\n return;\n }\n onUpdateData(node.id, 'dataConfig', makeDefaultDataConfig(parsed, file.name));\n } catch (e: any) {\n window.alert(`解析失败:${e?.message ?? e}`);\n }\n };\n\n // ── Column editing ─────────────────────────────────────────────────────\n const setColumn = (index: number, patch: Partial<FlowDataColumn>) => {\n const columns = config.columns.map((c, i) => (i === index ? { ...c, ...patch } : c));\n update({ columns });\n };\n\n const addColumn = () => {\n const used = new Set(config.columns.map((c) => c.key));\n let key = 'col';\n let n = 1;\n while (used.has(key)) key = `col_${n++}`;\n const columns: FlowDataColumn[] = [...config.columns, { key, label: key, type: 'string' }];\n // pad existing rows with an empty value for the new column\n const rows = config.rows.map((r) => ({ ...r, [key]: '' }));\n update({ columns, rows });\n };\n\n const removeColumn = (index: number) => {\n const col = config.columns[index];\n const columns = config.columns.filter((_, i) => i !== index);\n const rows = config.rows.map((r) => {\n const { [col.key]: _drop, ...rest } = r;\n return rest;\n });\n // prune chart/pivot references to the removed column\n const chart = config.chart\n ? {\n ...config.chart,\n xField: config.chart.xField === col.key ? columns.find((c) => c.type !== 'number')?.key ?? columns[0]?.key : config.chart.xField,\n yFields: (config.chart.yFields ?? []).filter((f) => f !== col.key),\n }\n : config.chart;\n const pivot = config.pivot\n ? {\n ...config.pivot,\n rowFields: config.pivot.rowFields.filter((f) => f !== col.key),\n colFields: config.pivot.colFields.filter((f) => f !== col.key),\n values: config.pivot.values.filter((v) => v.field !== col.key),\n }\n : config.pivot;\n update({ columns, rows, chart, pivot });\n };\n\n // ── Paste CSV (replace whole table) ─────────────────────────────────────\n const pasteCsv = () => {\n const text = window.prompt('粘贴 CSV 文本(第一行为表头):');\n if (!text) return;\n const parsed = matrixToTable(parseCsv(text));\n if (parsed.columns.length === 0) {\n window.alert('未能解析出数据。');\n return;\n }\n onUpdateData(node.id, 'dataConfig', makeDefaultDataConfig(parsed));\n };\n\n const nums = numericFields(config.columns);\n const chart = config.chart ?? { type: 'bar' as FlowDataChartType };\n const setChart = (patch: Partial<typeof chart>) => update({ chart: { ...chart, ...patch } });\n\n const setSeriesColor = (field: string, color: string) => {\n setChart({ seriesColors: { ...(chart.seriesColors ?? {}), [field]: color } });\n };\n const resetSeriesColor = (field: string) => {\n const next = { ...(chart.seriesColors ?? {}) };\n delete next[field];\n setChart({ seriesColors: Object.keys(next).length ? next : undefined });\n };\n\n const palette = chart.palette?.length ? chart.palette : DATA_CHART_PALETTE;\n const setPaletteColor = (i: number, color: string) => {\n const next = DATA_CHART_PALETTE.map((c, j) => (j === i ? color : (chart.palette?.[j] ?? c)));\n setChart({ palette: next });\n };\n\n const pivot = config.pivot ?? { enabled: false, rowFields: [], colFields: [], values: [] };\n const setPivot = (patch: Partial<typeof pivot>) => update({ pivot: { ...pivot, ...patch } });\n\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Data</div>\n\n {/* Import controls */}\n <div className=\"flow-inspector-row\">\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv,.tsv,.txt,.xlsx,.xlsm,text/csv\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) void handleFile(file);\n }}\n />\n <Button size=\"xs\" variant=\"neutral\" onClick={() => fileInputRef.current?.click()}>\n 上传 CSV / Excel\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={pasteCsv}>\n 粘贴 CSV\n </Button>\n </div>\n {config.sourceName && (\n <div className=\"flow-inspector-help\">来源:{config.sourceName}</div>\n )}\n\n {/* View toggle */}\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">视图</Label>\n <Select\n options={[\n { value: 'table', label: '表格 / 透视' },\n { value: 'chart', label: '图表' },\n ]}\n value={config.view}\n onChange={(v) => update({ view: v as FlowDataView })}\n />\n </div>\n\n {/* Columns editor */}\n <div className=\"flow-inspector-subtitle\">列配置({config.columns.length})</div>\n {config.columns.map((col, i) => (\n <div key={i} className=\"flow-data-col-row\">\n <Input\n size=\"xs\"\n value={col.label ?? col.key}\n placeholder=\"列名\"\n onChange={(e) => setColumn(i, { label: e.target.value })}\n className=\"flex-1\"\n />\n <Select\n options={COLUMN_TYPE_OPTIONS}\n value={col.type}\n onChange={(v) => setColumn(i, { type: v as FlowDataColumnType })}\n />\n <Button size=\"xs\" variant=\"ghost\" onClick={() => removeColumn(i)}>\n ✕\n </Button>\n </div>\n ))}\n <div className=\"flow-inspector-row\">\n <Button size=\"xs\" variant=\"ghost\" onClick={addColumn}>+ 添加列</Button>\n </div>\n\n {/* Rows editor: CSV text with fullscreen */}\n <div className=\"flow-inspector-subtitle\">数据(CSV · {config.rows.length} 行)</div>\n <ExpandableTextarea\n label=\"CSV 数据(首行为表头)\"\n value={csvDraft}\n onChange={setCsvDraft}\n onBlur={commitCsv}\n rows={8}\n placeholder=\"类别,数值&#10;A,30&#10;B,45\"\n />\n <div className=\"flow-inspector-help\">\n 直接编辑 CSV 文本,失焦或关闭全屏后生效。已有列的类型会保留。\n </div>\n\n {/* Chart config */}\n {config.view === 'chart' && (\n <>\n <div className=\"flow-inspector-subtitle\">图表配置</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">类型</Label>\n <Select\n options={CHART_TYPE_OPTIONS}\n value={chart.type}\n onChange={(v) => setChart({ type: v as FlowDataChartType })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">\n {chart.type === 'scatter' ? 'X 字段' : '类别轴'}\n </Label>\n <Select\n options={config.columns.map((c) => ({ value: c.key, label: c.label ?? c.key }))}\n value={chart.xField ?? ''}\n onChange={(v) => setChart({ xField: typeof v === 'string' ? v : String(v) })}\n />\n </div>\n <div className=\"flow-inspector-subtitle-sm\">\n {chart.type === 'scatter' || chart.type === 'pie' ? '数值字段' : '数值字段(可多选,多系列)'}\n </div>\n {nums.length === 0 && (\n <div className=\"flow-inspector-help\">没有数值列,请先将某列类型设为「数值」。</div>\n )}\n {nums.map((f) => {\n const selected = (chart.yFields ?? []).includes(f);\n const single = chart.type === 'scatter' || chart.type === 'pie';\n return (\n <label key={f} className=\"flow-data-field-toggle\">\n <input\n type={single ? 'radio' : 'checkbox'}\n className={single ? 'radio radio-xs radio-primary' : 'checkbox checkbox-xs checkbox-primary'}\n checked={selected}\n onChange={(e) => {\n if (single) {\n setChart({ yFields: [f] });\n return;\n }\n const current = new Set(chart.yFields ?? []);\n if (e.target.checked) current.add(f);\n else current.delete(f);\n setChart({ yFields: Array.from(current) });\n }}\n />\n <span>{labelFor(config.columns, f)}</span>\n </label>\n );\n })}\n\n {/* Chart colors */}\n {(chart.yFields ?? []).length > 0 && chart.type !== 'pie' && (\n <>\n <div className=\"flow-inspector-subtitle-sm\">系列颜色</div>\n {(chart.yFields ?? []).map((f, i) => {\n const color = chart.seriesColors?.[f] ?? DATA_CHART_PALETTE[i % DATA_CHART_PALETTE.length];\n const overridden = !!chart.seriesColors?.[f];\n return (\n <div key={f} className=\"flow-data-color-row\">\n <input\n type=\"color\"\n value={color}\n onChange={(e) => setSeriesColor(f, e.target.value)}\n />\n <span className=\"flow-data-color-label\">{labelFor(config.columns, f)}</span>\n {overridden && (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => resetSeriesColor(f)}>\n 重置\n </Button>\n )}\n </div>\n );\n })}\n </>\n )}\n {chart.type === 'pie' && (\n <>\n <div className=\"flow-inspector-subtitle-sm\">饼图配色</div>\n <div className=\"flow-data-palette\">\n {DATA_CHART_PALETTE.map((_, i) => (\n <input\n key={i}\n type=\"color\"\n value={palette[i % palette.length]}\n onChange={(e) => setPaletteColor(i, e.target.value)}\n />\n ))}\n </div>\n {chart.palette && (\n <div className=\"flow-inspector-row\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setChart({ palette: undefined })}>\n 重置为默认配色\n </Button>\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* Pivot config */}\n {config.view === 'table' && (\n <>\n <div className=\"flow-inspector-subtitle\">透视(Pivot)</div>\n <label className=\"flow-data-field-toggle\">\n <input\n type=\"checkbox\"\n className=\"toggle toggle-xs toggle-primary\"\n checked={pivot.enabled}\n onChange={(e) => setPivot({ enabled: e.target.checked })}\n />\n <span>开启透视模式</span>\n </label>\n {pivot.enabled && (\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">面板位置</Label>\n <Select\n options={PIVOT_PLACEMENT_OPTIONS}\n value={pivot.panelPlacement ?? 'top'}\n onChange={(v) => setPivot({ panelPlacement: v as FlowDataPivotPanelPlacement })}\n />\n </div>\n )}\n <div className=\"flow-inspector-help\">\n 透视的行/列/度量可在画布节点内的透视面板上交互拖拽调整。\n </div>\n </>\n )}\n </div>\n );\n}\n\nexport default DataInspectorSection;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpandableTextarea.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ExpandableTextarea.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\n\n/**\n * Textarea with a \"fullscreen\" expand button. The fullscreen overlay edits the\n * same value; `onBlur`/`onDone` let callers commit expensive parses only when\n * editing finishes instead of on every keystroke.\n */\nexport function ExpandableTextarea({\n label,\n value,\n onChange,\n onBlur,\n rows,\n placeholder,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n /** Called when the inline textarea loses focus or fullscreen is closed. */\n onBlur?: (value: string) => void;\n rows: number;\n placeholder?: string;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const closeFullscreen = () => {\n setExpanded(false);\n onBlur?.(value);\n };\n\n return (\n <>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <div className=\"flow-inspector-field-heading\">\n <Label size=\"xs\" className=\"flow-inspector-label\">{label}</Label>\n <Button size=\"xs\" variant=\"ghost\" square onClick={() => setExpanded(true)}>\n <span aria-label=\"全屏编辑\" title=\"全屏编辑\">↗</span>\n </Button>\n </div>\n <textarea\n className=\"flow-inspector-textarea\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n onBlur={() => onBlur?.(value)}\n rows={rows}\n spellCheck={false}\n />\n </div>\n {expanded && (\n <div className=\"flow-editor-fullscreen\" role=\"dialog\" aria-modal=\"true\" aria-label={`${label} 全屏编辑`}>\n <div className=\"flow-editor-fullscreen-header\">\n <strong>{label}</strong>\n <Button size=\"sm\" variant=\"ghost\" onClick={closeFullscreen}>完成</Button>\n </div>\n <textarea\n className=\"flow-inspector-textarea flow-editor-fullscreen-input\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n spellCheck={false}\n autoFocus\n />\n </div>\n )}\n </>\n );\n}\n\nexport default ExpandableTextarea;\n"],"mappings":";;;;AASA,SAAgB,EAAmB,EACjC,OAAA,GACA,OAAA,GACA,UAAA,GACA,QAAA,GACA,MAAA,GACA,aAAA,EAAA,GASC;AACD,QAAM,CAAC,GAAU,CAAA,IAAe,EAAS,EAAK,GAExC,IAAA,MAAwB;AAC5B,IAAA,EAAY,EAAK,GACjB,IAAS,CAAK;AAAA,EAChB;AAEA,SACE,gBAAA,EAAA,GAAA,EAAA,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,cAAf,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACE,gBAAA,EAAC,GAAD;AAAA,QAAO,MAAK;AAAA,QAAK,WAAU;AAAA,kBAAwB;AAAA,MAAa,CAAA,GAChE,gBAAA,EAAC,GAAD;AAAA,QAAQ,MAAK;AAAA,QAAK,SAAQ;AAAA,QAAQ,QAAA;AAAA,QAAO,SAAA,MAAe,EAAY,EAAI;AAAA,kBACtE,gBAAA,EAAC,QAAD;AAAA,UAAM,cAAW;AAAA,UAAO,OAAM;AAAA,oBAAO;AAAA,QAAO,CAAA;AAAA,MACtC,CAAA,CACL;AAAA,QACL,gBAAA,EAAC,YAAD;AAAA,MACE,WAAU;AAAA,MACH,OAAA;AAAA,MACM,aAAA;AAAA,MACb,UAAA,CAAW,MAAU,EAAS,EAAM,OAAO,KAAK;AAAA,MAChD,QAAA,MAAc,IAAS,CAAK;AAAA,MACtB,MAAA;AAAA,MACN,YAAY;AAAA,IACb,CAAA,CACE;AAAA,MACJ,KACC,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAyB,MAAK;AAAA,IAAS,cAAW;AAAA,IAAO,cAAY,GAAG,CAAA;AAAA,cAAvF,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACE,gBAAA,EAAC,UAAD,EAAA,UAAS,EAAc,CAAA,GACvB,gBAAA,EAAC,GAAD;AAAA,QAAQ,MAAK;AAAA,QAAK,SAAQ;AAAA,QAAQ,SAAS;AAAA,kBAAiB;AAAA,MAAU,CAAA,CACnE;AAAA,QACL,gBAAA,EAAC,YAAD;AAAA,MACE,WAAU;AAAA,MACH,OAAA;AAAA,MACM,aAAA;AAAA,MACb,UAAA,CAAW,MAAU,EAAS,EAAM,OAAO,KAAK;AAAA,MAChD,YAAY;AAAA,MACZ,WAAA;AAAA,IACD,CAAA,CACE;AAAA,IAEP,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"ExpandableTextarea.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ExpandableTextarea.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\n\n/**\n * Textarea with a \"fullscreen\" expand button. The fullscreen overlay edits the\n * same value; `onBlur`/`onDone` let callers commit expensive parses only when\n * editing finishes instead of on every keystroke.\n */\nexport function ExpandableTextarea({\n label,\n value,\n onChange,\n onBlur,\n rows,\n placeholder,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n /** Called when the inline textarea loses focus or fullscreen is closed. */\n onBlur?: (value: string) => void;\n rows: number;\n placeholder?: string;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const closeFullscreen = () => {\n setExpanded(false);\n onBlur?.(value);\n };\n\n return (\n <>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <div className=\"flow-inspector-field-heading\">\n <Label size=\"xs\" className=\"flow-inspector-label\">{label}</Label>\n <Button size=\"xs\" variant=\"ghost\" square onClick={() => setExpanded(true)}>\n <span aria-label=\"全屏编辑\" title=\"全屏编辑\">↗</span>\n </Button>\n </div>\n <textarea\n className=\"flow-inspector-textarea\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n onBlur={() => onBlur?.(value)}\n rows={rows}\n spellCheck={false}\n />\n </div>\n {expanded && (\n <div className=\"flow-editor-fullscreen\" role=\"dialog\" aria-modal=\"true\" aria-label={`${label} 全屏编辑`}>\n <div className=\"flow-editor-fullscreen-header\">\n <strong>{label}</strong>\n <Button size=\"sm\" variant=\"ghost\" onClick={closeFullscreen}>完成</Button>\n </div>\n <textarea\n className=\"flow-inspector-textarea flow-editor-fullscreen-input\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n spellCheck={false}\n autoFocus\n />\n </div>\n )}\n </>\n );\n}\n\nexport default ExpandableTextarea;\n"],"mappings":";;;;AASA,SAAgB,EAAmB,EACjC,OAAA,GACA,OAAA,GACA,UAAA,GACA,QAAA,GACA,MAAA,GACA,aAAA,EAAA,GASC;AACD,QAAM,CAAC,GAAU,CAAA,IAAe,EAAS,EAAK,GAExC,IAAA,MAAwB;AAC5B,IAAA,EAAY,EAAK,GACjB,IAAS,CAAK;AAAA,EAChB;AAEA,SACE,gBAAA,EAAA,GAAA,EAAA,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAf,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,QAAO,MAAK;AAAA,QAAK,WAAU;AAAA,QAAwB,UAAA;AAAA,MAAa,CAAA,GAChE,gBAAA,EAAC,GAAD;AAAA,QAAQ,MAAK;AAAA,QAAK,SAAQ;AAAA,QAAQ,QAAA;AAAA,QAAO,SAAA,MAAe,EAAY,EAAI;AAAA,QACtE,UAAA,gBAAA,EAAC,QAAD;AAAA,UAAM,cAAW;AAAA,UAAO,OAAM;AAAA,UAAO,UAAA;AAAA,QAAO,CAAA;AAAA,MACtC,CAAA,CACL;AAAA,IACL,CAAA,GAAA,gBAAA,EAAC,YAAD;AAAA,MACE,WAAU;AAAA,MACH,OAAA;AAAA,MACM,aAAA;AAAA,MACb,UAAA,CAAW,MAAU,EAAS,EAAM,OAAO,KAAK;AAAA,MAChD,QAAA,MAAc,IAAS,CAAK;AAAA,MACtB,MAAA;AAAA,MACN,YAAY;AAAA,IACb,CAAA,CACE;AAAA,EACJ,CAAA,GAAA,KACC,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAyB,MAAK;AAAA,IAAS,cAAW;AAAA,IAAO,cAAY,GAAG,CAAA;AAAA,IAAvF,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MAAf,UAAA,CACE,gBAAA,EAAC,UAAD,EAAA,UAAS,EAAc,CAAA,GACvB,gBAAA,EAAC,GAAD;AAAA,QAAQ,MAAK;AAAA,QAAK,SAAQ;AAAA,QAAQ,SAAS;AAAA,QAAiB,UAAA;AAAA,MAAU,CAAA,CACnE;AAAA,IACL,CAAA,GAAA,gBAAA,EAAC,YAAD;AAAA,MACE,WAAU;AAAA,MACH,OAAA;AAAA,MACM,aAAA;AAAA,MACb,UAAA,CAAW,MAAU,EAAS,EAAM,OAAO,KAAK;AAAA,MAChD,YAAY;AAAA,MACZ,WAAA;AAAA,IACD,CAAA,CACE;AAAA,EAEP,CAAA,CAAA,EAAA,CAAA;AAEN"}
@@ -1 +1 @@
1
- {"version":3,"file":"FlowPanelGroup.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/FlowPanelGroup.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport Select from '../../../Select';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel, type ResizeEdge } from '../hooks/useResizablePanel';\nimport type { FlowPanelDock } from '../context/FlowUIContext';\n\nexport interface PanelTab {\n id: string;\n label: string;\n icon?: React.ReactNode;\n content: React.ReactNode;\n}\n\ninterface FlowPanelGroupProps {\n tabs: PanelTab[];\n defaultTab?: string;\n className?: string;\n resizeEdge: ResizeEdge;\n defaultWidth: number;\n style?: React.CSSProperties;\n /** Which dock this group occupies ('float' = draggable overlay). */\n dock?: FlowPanelDock;\n /** Request moving the current tab to another dock (left/right/float). */\n onDock?: (tabId: string, dock: FlowPanelDock) => void;\n /** Floating panels report the dock edge they hover while dragging. */\n onDragHintChange?: (side: 'left' | 'right' | null) => void;\n /** Close (hide) the current panel; it can be reopened via the toolbar. */\n onClose?: (tabId: string) => void;\n}\n\n/** Header buttons offered per current dock, in display order. */\nconst DOCK_ACTIONS: Record<FlowPanelDock, Array<{ target: FlowPanelDock; glyph: string; title: string }>> = {\n left: [\n { target: 'float', glyph: '⬈', title: '浮动面板' },\n { target: 'right', glyph: '⇥', title: '停靠到右侧' },\n ],\n right: [\n { target: 'left', glyph: '⇤', title: '停靠到左侧' },\n { target: 'float', glyph: '⬈', title: '浮动面板' },\n ],\n float: [\n { target: 'left', glyph: '⇤', title: '停靠到左侧' },\n { target: 'right', glyph: '⇥', title: '停靠到右侧' },\n ],\n};\n\nexport default function FlowPanelGroup({\n tabs,\n defaultTab,\n className,\n resizeEdge,\n defaultWidth,\n style,\n dock,\n onDock,\n onDragHintChange,\n onClose,\n}: FlowPanelGroupProps) {\n const [activeTab, setActiveTab] = useState(defaultTab ?? tabs[0]?.id);\n const isFloating = dock === 'float';\n const currentId = tabs.find(t => t.id === activeTab)?.id ?? tabs[0]?.id;\n const { panelStyle, handleProps } = useDraggablePanel(\n isFloating\n ? {\n onDropDock: (side) => { if (currentId) onDock?.(currentId, side); },\n onDragHintChange,\n }\n : undefined,\n );\n const { panelWidth, resizeHandleProps } = useResizablePanel(resizeEdge, defaultWidth);\n\n useEffect(() => {\n if (tabs.length > 0 && !tabs.find(t => t.id === activeTab)) {\n setActiveTab(tabs[0].id);\n }\n }, [tabs, activeTab]);\n\n const handleDock = useCallback((target: FlowPanelDock) => {\n if (currentId) onDock?.(currentId, target);\n }, [currentId, onDock]);\n\n if (tabs.length === 0) return null;\n\n const current = tabs.find(t => t.id === activeTab) ?? tabs[0];\n const showSwitcher = tabs.length > 1;\n const actions = DOCK_ACTIONS[dock ?? 'left'];\n\n return (\n <div\n className={`${className ?? 'flow-palette'}${isFloating ? ' flow-panel--detached' : ' flow-panel--docked'}`}\n data-flow-panel\n style={{ ...style, ...(isFloating ? panelStyle : undefined), width: panelWidth }}\n >\n <div\n className={`flow-panel-resize-handle flow-panel-resize-handle--${resizeEdge}`}\n {...resizeHandleProps}\n />\n <div className=\"flow-panel-header\">\n {isFloating && (\n <span className=\"flow-panel-grip\" title=\"拖动移动面板\" {...handleProps}>⠿</span>\n )}\n {showSwitcher ? (\n <Select\n className=\"flow-panel-select\"\n options={tabs.map(t => ({\n value: t.id,\n label: typeof t.icon === 'string' && t.icon ? `${t.icon} ${t.label}` : t.label,\n }))}\n value={current.id}\n onChange={(v) => setActiveTab(String(v))}\n />\n ) : (\n <span className=\"flow-panel-header-label\">\n {current.icon && <span className=\"flow-panel-tab-icon\">{current.icon}</span>}\n {current.label}\n </span>\n )}\n <span className=\"flow-panel-header-actions\">\n {actions.map(a => (\n <button\n key={a.target}\n type=\"button\"\n className=\"flow-panel-dock-btn\"\n title={a.title}\n onClick={() => handleDock(a.target)}\n >{a.glyph}</button>\n ))}\n {onClose && (\n <button\n type=\"button\"\n className=\"flow-panel-dock-btn flow-panel-close-btn\"\n title=\"关闭面板(可从工具栏重新打开)\"\n onClick={() => { if (currentId) onClose(currentId); }}\n >✕</button>\n )}\n </span>\n </div>\n <div className=\"flow-palette-content\">\n {current.content}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FlowPanelGroup.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/FlowPanelGroup.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport Select from '../../../Select';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel, type ResizeEdge } from '../hooks/useResizablePanel';\nimport type { FlowPanelDock } from '../context/FlowUIContext';\n\nexport interface PanelTab {\n id: string;\n label: string;\n icon?: React.ReactNode;\n content: React.ReactNode;\n}\n\ninterface FlowPanelGroupProps {\n tabs: PanelTab[];\n defaultTab?: string;\n className?: string;\n resizeEdge: ResizeEdge;\n defaultWidth: number;\n style?: React.CSSProperties;\n /** Which dock this group occupies ('float' = draggable overlay). */\n dock?: FlowPanelDock;\n /** Request moving the current tab to another dock (left/right/float). */\n onDock?: (tabId: string, dock: FlowPanelDock) => void;\n /** Floating panels report the dock edge they hover while dragging. */\n onDragHintChange?: (side: 'left' | 'right' | null) => void;\n /** Close (hide) the current panel; it can be reopened via the toolbar. */\n onClose?: (tabId: string) => void;\n}\n\n/** Header buttons offered per current dock, in display order. */\nconst DOCK_ACTIONS: Record<FlowPanelDock, Array<{ target: FlowPanelDock; glyph: string; title: string }>> = {\n left: [\n { target: 'float', glyph: '⬈', title: '浮动面板' },\n { target: 'right', glyph: '⇥', title: '停靠到右侧' },\n ],\n right: [\n { target: 'left', glyph: '⇤', title: '停靠到左侧' },\n { target: 'float', glyph: '⬈', title: '浮动面板' },\n ],\n float: [\n { target: 'left', glyph: '⇤', title: '停靠到左侧' },\n { target: 'right', glyph: '⇥', title: '停靠到右侧' },\n ],\n};\n\nexport default function FlowPanelGroup({\n tabs,\n defaultTab,\n className,\n resizeEdge,\n defaultWidth,\n style,\n dock,\n onDock,\n onDragHintChange,\n onClose,\n}: FlowPanelGroupProps) {\n const [activeTab, setActiveTab] = useState(defaultTab ?? tabs[0]?.id);\n const isFloating = dock === 'float';\n const currentId = tabs.find(t => t.id === activeTab)?.id ?? tabs[0]?.id;\n const { panelStyle, handleProps } = useDraggablePanel(\n isFloating\n ? {\n onDropDock: (side) => { if (currentId) onDock?.(currentId, side); },\n onDragHintChange,\n }\n : undefined,\n );\n const { panelWidth, resizeHandleProps } = useResizablePanel(resizeEdge, defaultWidth);\n\n useEffect(() => {\n if (tabs.length > 0 && !tabs.find(t => t.id === activeTab)) {\n setActiveTab(tabs[0].id);\n }\n }, [tabs, activeTab]);\n\n const handleDock = useCallback((target: FlowPanelDock) => {\n if (currentId) onDock?.(currentId, target);\n }, [currentId, onDock]);\n\n if (tabs.length === 0) return null;\n\n const current = tabs.find(t => t.id === activeTab) ?? tabs[0];\n const showSwitcher = tabs.length > 1;\n const actions = DOCK_ACTIONS[dock ?? 'left'];\n\n return (\n <div\n className={`${className ?? 'flow-palette'}${isFloating ? ' flow-panel--detached' : ' flow-panel--docked'}`}\n data-flow-panel\n style={{ ...style, ...(isFloating ? panelStyle : undefined), width: panelWidth }}\n >\n <div\n className={`flow-panel-resize-handle flow-panel-resize-handle--${resizeEdge}`}\n {...resizeHandleProps}\n />\n <div className=\"flow-panel-header\">\n {isFloating && (\n <span className=\"flow-panel-grip\" title=\"拖动移动面板\" {...handleProps}>⠿</span>\n )}\n {showSwitcher ? (\n <Select\n className=\"flow-panel-select\"\n options={tabs.map(t => ({\n value: t.id,\n label: typeof t.icon === 'string' && t.icon ? `${t.icon} ${t.label}` : t.label,\n }))}\n value={current.id}\n onChange={(v) => setActiveTab(String(v))}\n />\n ) : (\n <span className=\"flow-panel-header-label\">\n {current.icon && <span className=\"flow-panel-tab-icon\">{current.icon}</span>}\n {current.label}\n </span>\n )}\n <span className=\"flow-panel-header-actions\">\n {actions.map(a => (\n <button\n key={a.target}\n type=\"button\"\n className=\"flow-panel-dock-btn\"\n title={a.title}\n onClick={() => handleDock(a.target)}\n >{a.glyph}</button>\n ))}\n {onClose && (\n <button\n type=\"button\"\n className=\"flow-panel-dock-btn flow-panel-close-btn\"\n title=\"关闭面板(可从工具栏重新打开)\"\n onClick={() => { if (currentId) onClose(currentId); }}\n >✕</button>\n )}\n </span>\n </div>\n <div className=\"flow-palette-content\">\n {current.content}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}