dishui 0.0.62 → 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.
- package/dist/components/Badge/index.js +12 -9
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js +43 -40
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Card/index.d.ts +11 -0
- package/dist/components/Card/index.js +62 -37
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js +32 -30
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/EmptyState/index.d.ts +4 -1
- package/dist/components/EmptyState/index.js +3 -3
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/FileUploader/DropZone.js.map +1 -1
- package/dist/components/FileUploader/FileItem.js.map +1 -1
- package/dist/components/FileUploader/FileUploader.js.map +1 -1
- package/dist/components/FileUploader/UploadQueue.js.map +1 -1
- package/dist/components/Input/index.js +30 -30
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js +41 -40
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/List/index.js +47 -32
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js +61 -57
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js +49 -49
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Modal/index.d.ts +7 -3
- package/dist/components/Modal/index.js +77 -65
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/Page/index.d.ts +58 -0
- package/dist/components/Page/index.js +74 -0
- package/dist/components/Page/index.js.map +1 -0
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/Select/index.js +0 -3
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/StatCard/index.d.ts +3 -1
- package/dist/components/StatCard/index.js +39 -11
- package/dist/components/StatCard/index.js.map +1 -1
- package/dist/components/Table/index.js +103 -85
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.d.ts +19 -5
- package/dist/components/Tabs/index.js +32 -13
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
- package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js +141 -134
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +81 -78
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js +59 -59
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js +49 -48
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/Filters.js +42 -42
- package/dist/components/pro/DataTable/Filters.js.map +1 -1
- package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
- package/dist/components/pro/DataTable/PivotView.js +35 -32
- package/dist/components/pro/DataTable/PivotView.js.map +1 -1
- package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
- package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
- package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
- package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
- package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.js +37 -37
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/FileExplorer/Breadcrumb.js +53 -53
- package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
- package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileIcon.js +22 -22
- package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
- package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
- package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
- package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
- package/dist/components/pro/Flow/Flow.js +496 -494
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js +916 -917
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js +59 -59
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLayoutActions.js +9 -11
- package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js +9 -9
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js +5 -5
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/DataNodeView.js +113 -93
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js +118 -118
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js +1 -3
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
- package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
- package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js +79 -79
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js +57 -57
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js +26 -22
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js +18 -16
- package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
- package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js +109 -104
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/hooks/useTableColumns.js +7 -8
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +227 -221
- package/dist/layouts/MainLayout.js +22 -22
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js.map +1 -1
- package/dist/layouts/Sidebar.js +94 -73
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/layouts/headbar/Headbar.js.map +1 -1
- package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js +11 -11
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/utils/i18n.js +10 -10
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/routerBuilder.js +17 -15
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/themes.js.map +1 -1
- 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=\"类别,数值 A,30 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=\"类别,数值 A,30 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":";;;;;;;;AA2BA,IAAM,KAA2E;AAAA,EAC/E;AAAA,IAAE,OAAO;AAAA,IAAU,OAAO;AAAA,EAAK;AAAA,EAC/B;AAAA,IAAE,OAAO;AAAA,IAAU,OAAO;AAAA,EAAK;AAAA,EAC/B;AAAA,IAAE,OAAO;AAAA,IAAQ,OAAO;AAAA,EAAK;AAAA,EAC7B;AAAA,IAAE,OAAO;AAAA,IAAW,OAAO;AAAA,EAAK;AAClC,GAEM,KAAyE;AAAA,EAC7E;AAAA,IAAE,OAAO;AAAA,IAAO,OAAO;AAAA,EAAM;AAAA,EAC7B;AAAA,IAAE,OAAO;AAAA,IAAiB,OAAO;AAAA,EAAQ;AAAA,EACzC;AAAA,IAAE,OAAO;AAAA,IAAQ,OAAO;AAAA,EAAM;AAAA,EAC9B;AAAA,IAAE,OAAO;AAAA,IAAQ,OAAO;AAAA,EAAM;AAAA,EAC9B;AAAA,IAAE,OAAO;AAAA,IAAW,OAAO;AAAA,EAAM;AAAA,EACjC;AAAA,IAAE,OAAO;AAAA,IAAO,OAAO;AAAA,EAAK;AAC9B,GAEM,KAAwF;AAAA,EAC5F;AAAA,IAAE,OAAO;AAAA,IAAO,OAAO;AAAA,EAAK;AAAA,EAC5B;AAAA,IAAE,OAAO;AAAA,IAAU,OAAO;AAAA,EAAK;AAAA,EAC/B;AAAA,IAAE,OAAO;AAAA,IAAQ,OAAO;AAAA,EAAK;AAAA,EAC7B;AAAA,IAAE,OAAO;AAAA,IAAS,OAAO;AAAA,EAAK;AAChC,GAEM,KAA+B;AAAA,EAAE,SAAS,CAAC;AAAA,EAAG,MAAM,CAAC;AAAA,EAAG,MAAM;AAAQ;AAM5E,SAAgB,GAAqB,EACnC,MAAA,GACA,cAAA,EAAA,GAIC;AACD,QAAM,IAAS,EAAK,KAAK,cAAc,IACjC,IAAe,EAAyB,IAAI,GAE5C,IAAA,CAAU,MAAmC;AACjD,IAAA,EAAa,EAAK,IAAI,cAAc;AAAA,MAAE,GAAG;AAAA,MAAQ,GAAG;AAAA,IAAM,CAAC;AAAA,EAC7D,GAQM,IAAU,EAAA,MAAc,EAAM,EAAO,SAAS,EAAO,IAAI,GAAG,CAAC,EAAO,SAAS,EAAO,IAAI,CAAC,GACzF,CAAC,GAAU,CAAA,IAAe,EAAS,CAAO,GAC1C,IAAgB,EAAO,CAAO;AACpC,EAAA,EAAA,MAAgB;AACd,IAAI,MAAY,EAAc,YAC5B,EAAc,UAAU,GACxB,EAAY,CAAO;AAAA,EAEvB,GAAG,CAAC,CAAO,CAAC;AAEZ,QAAM,IAAA,CAAa,MAAiB;AAClC,IAAI,MAAS,EAAc,YAC3B,EAAc,UAAU,GACxB,EAAa,EAAK,IAAI,cAAc,EAAa,GAAQ,CAAI,CAAC;AAAA,EAChE,GAGM,IAAa,OAAO,MAAe;AACvC,QAAI;AACF,YAAM,IAAS,MAAM,EAAc,CAAI;AACvC,UAAI,EAAO,QAAQ,WAAW,GAAG;AAC/B,eAAO,MAAM,gBAAgB;AAC7B;AAAA,MACF;AACA,MAAA,EAAa,EAAK,IAAI,cAAc,EAAsB,GAAQ,EAAK,IAAI,CAAC;AAAA,IAC9E,SAAS,GAAQ;AACf,aAAO,MAAM,QAAQ,GAAG,WAAW,CAAA,EAAG;AAAA,IACxC;AAAA,EACF,GAGM,IAAA,CAAa,GAAe,MAAmC;AACnE,UAAM,IAAU,EAAO,QAAQ,IAAA,CAAK,GAAG,MAAO,MAAM,IAAQ;AAAA,MAAE,GAAG;AAAA,MAAG,GAAG;AAAA,IAAM,IAAI,CAAE;AACnF,IAAA,EAAO,EAAE,SAAA,EAAQ,CAAC;AAAA,EACpB,GAEM,IAAA,MAAkB;AACtB,UAAM,IAAO,IAAI,IAAI,EAAO,QAAQ,IAAA,CAAK,MAAM,EAAE,GAAG,CAAC;AACrD,QAAI,IAAM,OACN,IAAI;AACR,WAAO,EAAK,IAAI,CAAG,IAAG,CAAA,IAAM,OAAO,GAAA;AACnC,UAAM,IAA4B,CAAC,GAAG,EAAO,SAAS;AAAA,MAAE,KAAA;AAAA,MAAK,OAAO;AAAA,MAAK,MAAM;AAAA,IAAS,CAAC,GAEnF,IAAO,EAAO,KAAK,IAAA,CAAK,OAAO;AAAA,MAAE,GAAG;AAAA,MAAI,CAAA,CAAA,GAAM;AAAA,IAAG,EAAE;AACzD,IAAA,EAAO;AAAA,MAAE,SAAA;AAAA,MAAS,MAAA;AAAA,IAAK,CAAC;AAAA,EAC1B,GAEM,IAAA,CAAgB,MAAkB;AACtC,UAAM,IAAM,EAAO,QAAQ,CAAA,GACrB,IAAU,EAAO,QAAQ,OAAA,CAAQ,GAAG,MAAM,MAAM,CAAK,GACrD,IAAO,EAAO,KAAK,IAAA,CAAK,MAAM;AAClC,YAAM,EAAA,CAAG,EAAI,GAAA,GAAM,GAAO,GAAG,EAAA,IAAS;AACtC,aAAO;AAAA,IACT,CAAC,GAEK,IAAQ,EAAO,QACjB;AAAA,MACE,GAAG,EAAO;AAAA,MACV,QAAQ,EAAO,MAAM,WAAW,EAAI,MAAM,EAAQ,KAAA,CAAM,MAAM,EAAE,SAAS,QAAQ,GAAG,OAAO,EAAQ,CAAA,GAAI,MAAM,EAAO,MAAM;AAAA,MAC1H,UAAU,EAAO,MAAM,WAAW,CAAC,GAAG,OAAA,CAAQ,MAAM,MAAM,EAAI,GAAG;AAAA,IACnE,IACA,EAAO,OACL,IAAQ,EAAO,QACjB;AAAA,MACE,GAAG,EAAO;AAAA,MACV,WAAW,EAAO,MAAM,UAAU,OAAA,CAAQ,MAAM,MAAM,EAAI,GAAG;AAAA,MAC7D,WAAW,EAAO,MAAM,UAAU,OAAA,CAAQ,MAAM,MAAM,EAAI,GAAG;AAAA,MAC7D,QAAQ,EAAO,MAAM,OAAO,OAAA,CAAQ,MAAM,EAAE,UAAU,EAAI,GAAG;AAAA,IAC/D,IACA,EAAO;AACX,IAAA,EAAO;AAAA,MAAE,SAAA;AAAA,MAAS,MAAA;AAAA,MAAM,OAAA;AAAA,MAAO,OAAA;AAAA,IAAM,CAAC;AAAA,EACxC,GAGM,IAAA,MAAiB;AACrB,UAAM,IAAO,OAAO,OAAO,oBAAoB;AAC/C,QAAI,CAAC,EAAM;AACX,UAAM,IAAS,EAAc,EAAS,CAAI,CAAC;AAC3C,QAAI,EAAO,QAAQ,WAAW,GAAG;AAC/B,aAAO,MAAM,UAAU;AACvB;AAAA,IACF;AACA,IAAA,EAAa,EAAK,IAAI,cAAc,EAAsB,CAAM,CAAC;AAAA,EACnE,GAEM,IAAO,EAAc,EAAO,OAAO,GACnC,IAAQ,EAAO,SAAS,EAAE,MAAM,MAA2B,GAC3D,IAAA,CAAY,MAAiC,EAAO,EAAE,OAAO;AAAA,IAAE,GAAG;AAAA,IAAO,GAAG;AAAA,EAAM,EAAE,CAAC,GAErF,IAAA,CAAkB,GAAe,MAAkB;AACvD,IAAA,EAAS,EAAE,cAAc;AAAA,MAAE,GAAI,EAAM,gBAAgB,CAAC;AAAA,MAAK,CAAA,CAAA,GAAQ;AAAA,IAAM,EAAE,CAAC;AAAA,EAC9E,GACM,IAAA,CAAoB,MAAkB;AAC1C,UAAM,IAAO,EAAE,GAAI,EAAM,gBAAgB,CAAC,EAAG;AAC7C,WAAO,EAAK,CAAA,GACZ,EAAS,EAAE,cAAc,OAAO,KAAK,CAAI,EAAE,SAAS,IAAO,OAAU,CAAC;AAAA,EACxE,GAEM,IAAU,EAAM,SAAS,SAAS,EAAM,UAAU,GAClD,IAAA,CAAmB,GAAW,MAAkB;AACpD,UAAM,IAAO,EAAmB,IAAA,CAAK,GAAG,MAAO,MAAM,IAAI,IAAS,EAAM,UAAU,CAAA,KAAM,CAAG;AAC3F,IAAA,EAAS,EAAE,SAAS,EAAK,CAAC;AAAA,EAC5B,GAEM,IAAQ,EAAO,SAAS;AAAA,IAAE,SAAS;AAAA,IAAO,WAAW,CAAC;AAAA,IAAG,WAAW,CAAC;AAAA,IAAG,QAAQ,CAAC;AAAA,EAAE,GACnF,IAAA,CAAY,MAAiC,EAAO,EAAE,OAAO;AAAA,IAAE,GAAG;AAAA,IAAO,GAAG;AAAA,EAAM,EAAE,CAAC;AAE3F,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAf,UAAA;AAAA,MACE,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAA+B,UAAA;AAAA,MAAS,CAAA;AAAA,MAGvD,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA;AAAA,UACE,gBAAA,EAAC,SAAD;AAAA,YACE,KAAK;AAAA,YACL,MAAK;AAAA,YACL,QAAO;AAAA,YACP,QAAA;AAAA,YACA,UAAA,CAAW,MAAM;AACf,oBAAM,IAAO,EAAE,OAAO,QAAQ,CAAA;AAC9B,gBAAE,OAAO,QAAQ,IACb,KAAM,EAAgB,CAAI;AAAA,YAChC;AAAA,UACD,CAAA;AAAA,UACD,gBAAA,EAAC,GAAD;AAAA,YAAQ,MAAK;AAAA,YAAK,SAAQ;AAAA,YAAU,SAAA,MAAe,EAAa,SAAS,MAAM;AAAA,YAAG,UAAA;AAAA,UAE1E,CAAA;AAAA,UACR,gBAAA,EAAC,GAAD;AAAA,YAAQ,MAAK;AAAA,YAAK,SAAQ;AAAA,YAAQ,SAAS;AAAA,YAAU,UAAA;AAAA,UAE7C,CAAA;AAAA,QACL;AAAA;MACJ,EAAO,cACN,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA,CAAqC,OAAI,EAAO,UAAgB;AAAA;MAIlE,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,UAAO,MAAK;AAAA,UAAK,WAAU;AAAA,UAAuB,UAAA;AAAA,QAAS,CAAA,GAC3D,gBAAA,EAAC,GAAD;AAAA,UACE,SAAS,CACP;AAAA,YAAE,OAAO;AAAA,YAAS,OAAO;AAAA,UAAU,GACnC;AAAA,YAAE,OAAO;AAAA,YAAS,OAAO;AAAA,UAAK,CAChC;AAAA,UACA,OAAO,EAAO;AAAA,UACd,UAAA,CAAW,MAAM,EAAO,EAAE,MAAM,EAAkB,CAAC;AAAA,QACpD,CAAA,CACE;AAAA;MAGL,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA;AAAA,UAAyC;AAAA,UAAK,EAAO,QAAQ;AAAA,UAAO;AAAA,QAAM;AAAA;MACzE,EAAO,QAAQ,IAAA,CAAK,GAAK,MACxB,gBAAA,EAAC,OAAD;AAAA,QAAa,WAAU;AAAA,QAAvB,UAAA;AAAA,UACE,gBAAA,EAAC,GAAD;AAAA,YACE,MAAK;AAAA,YACL,OAAO,EAAI,SAAS,EAAI;AAAA,YACxB,aAAY;AAAA,YACZ,UAAA,CAAW,MAAM,EAAU,GAAG,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA,YACvD,WAAU;AAAA,UACX,CAAA;AAAA,UACD,gBAAA,EAAC,GAAD;AAAA,YACE,SAAS;AAAA,YACT,OAAO,EAAI;AAAA,YACX,UAAA,CAAW,MAAM,EAAU,GAAG,EAAE,MAAM,EAAwB,CAAC;AAAA,UAChE,CAAA;AAAA,UACD,gBAAA,EAAC,GAAD;AAAA,YAAQ,MAAK;AAAA,YAAK,SAAQ;AAAA,YAAQ,SAAA,MAAe,EAAa,CAAC;AAAA,YAAG,UAAA;AAAA,UAE1D,CAAA;AAAA,QACL;AAAA,MAhBK,GAAA,CAgBL,CACN;AAAA,MACD,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QACb,UAAA,gBAAA,EAAC,GAAD;AAAA,UAAQ,MAAK;AAAA,UAAK,SAAQ;AAAA,UAAQ,SAAS;AAAA,UAAW,UAAA;AAAA,QAAa,CAAA;AAAA,MAChE,CAAA;AAAA,MAGL,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA;AAAA,UAAyC;AAAA,UAAU,EAAO,KAAK;AAAA,UAAO;AAAA,QAAQ;AAAA;MAC9E,gBAAA,EAAC,GAAD;AAAA,QACE,OAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,aAAY;AAAA;AAAA;AAAA,MACb,CAAA;AAAA,MACD,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAsB,UAAA;AAAA,MAEhC,CAAA;AAAA,MAGJ,EAAO,SAAS,WACf,gBAAA,EAAA,GAAA,EAAA,UAAA;AAAA,QACE,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UAA0B,UAAA;AAAA,QAAS,CAAA;AAAA,QAClD,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,YAAO,MAAK;AAAA,YAAK,WAAU;AAAA,YAAuB,UAAA;AAAA,UAAS,CAAA,GAC3D,gBAAA,EAAC,GAAD;AAAA,YACE,SAAS;AAAA,YACT,OAAO,EAAM;AAAA,YACb,UAAA,CAAW,MAAM,EAAS,EAAE,MAAM,EAAuB,CAAC;AAAA,UAC3D,CAAA,CACE;AAAA;QACL,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,YAAO,MAAK;AAAA,YAAK,WAAU;AAAA,YACxB,UAAA,EAAM,SAAS,YAAY,SAAS;AAAA,UAChC,CAAA,GACP,gBAAA,EAAC,GAAD;AAAA,YACE,SAAS,EAAO,QAAQ,IAAA,CAAK,OAAO;AAAA,cAAE,OAAO,EAAE;AAAA,cAAK,OAAO,EAAE,SAAS,EAAE;AAAA,YAAI,EAAE;AAAA,YAC9E,OAAO,EAAM,UAAU;AAAA,YACvB,UAAA,CAAW,MAAM,EAAS,EAAE,QAAQ,OAAO,KAAM,WAAW,IAAI,OAAO,CAAC,EAAE,CAAC;AAAA,UAC5E,CAAA,CACE;AAAA;QACL,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UACZ,UAAA,EAAM,SAAS,aAAa,EAAM,SAAS,QAAQ,SAAS;AAAA,QAC1D,CAAA;AAAA,QACJ,EAAK,WAAW,KACf,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UAAsB,UAAA;AAAA,QAAyB,CAAA;AAAA,QAE/D,EAAK,IAAA,CAAK,MAAM;AACf,gBAAM,KAAY,EAAM,WAAW,CAAC,GAAG,SAAS,CAAC,GAC3C,IAAS,EAAM,SAAS,aAAa,EAAM,SAAS;AAC1D,iBACE,gBAAA,EAAC,SAAD;AAAA,YAAe,WAAU;AAAA,YAAzB,UAAA,CACE,gBAAA,EAAC,SAAD;AAAA,cACE,MAAM,IAAS,UAAU;AAAA,cACzB,WAAW,IAAS,iCAAiC;AAAA,cACrD,SAAS;AAAA,cACT,UAAA,CAAW,MAAM;AACf,oBAAI,GAAQ;AACV,kBAAA,EAAS,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;AACzB;AAAA,gBACF;AACA,sBAAM,IAAU,IAAI,IAAI,EAAM,WAAW,CAAC,CAAC;AAC3C,gBAAI,EAAE,OAAO,UAAS,EAAQ,IAAI,CAAC,IAC9B,EAAQ,OAAO,CAAC,GACrB,EAAS,EAAE,SAAS,MAAM,KAAK,CAAO,EAAE,CAAC;AAAA,cAC3C;AAAA,YACD,CAAA,GACD,gBAAA,EAAC,QAAD,EAAA,UAAO,EAAS,EAAO,SAAS,CAAC,EAAQ,CAAA,CACpC;AAAA,UAjBK,GAAA,CAiBL;AAAA,QAEX,CAAC;AAAA,SAGC,EAAM,WAAW,CAAC,GAAG,SAAS,KAAK,EAAM,SAAS,SAClD,gBAAA,EAAA,GAAA,EAAA,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UAA6B,UAAA;AAAA,QAAS,CAAA,IACnD,EAAM,WAAW,CAAC,GAAG,IAAA,CAAK,GAAG,MAAM;AACnC,gBAAM,IAAQ,EAAM,eAAe,CAAA,KAAM,EAAmB,IAAI,EAAmB,MAAA,GAC7E,IAAa,CAAC,CAAC,EAAM,eAAe,CAAA;AAC1C,iBACE,gBAAA,EAAC,OAAD;AAAA,YAAa,WAAU;AAAA,YAAvB,UAAA;AAAA,cACE,gBAAA,EAAC,SAAD;AAAA,gBACE,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAA,CAAW,MAAM,EAAe,GAAG,EAAE,OAAO,KAAK;AAAA,cAClD,CAAA;AAAA,cACD,gBAAA,EAAC,QAAD;AAAA,gBAAM,WAAU;AAAA,gBAAyB,UAAA,EAAS,EAAO,SAAS,CAAC;AAAA,cAAQ,CAAA;AAAA,cAC1E,KACC,gBAAA,EAAC,GAAD;AAAA,gBAAQ,MAAK;AAAA,gBAAK,SAAQ;AAAA,gBAAQ,SAAA,MAAe,EAAiB,CAAC;AAAA,gBAAG,UAAA;AAAA,cAE9D,CAAA;AAAA,YAEP;AAAA,UAZK,GAAA,CAYL;AAAA,QAET,CAAC,CACD,EAAA,CAAA;AAAA,QAEH,EAAM,SAAS,SACd,gBAAA,EAAA,GAAA,EAAA,UAAA;AAAA,UACE,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAA6B,UAAA;AAAA,UAAS,CAAA;AAAA,UACrD,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YACZ,UAAA,EAAmB,IAAA,CAAK,GAAG,MAC1B,gBAAA,EAAC,SAAD;AAAA,cAEE,MAAK;AAAA,cACL,OAAO,EAAQ,IAAI,EAAQ,MAAA;AAAA,cAC3B,UAAA,CAAW,MAAM,EAAgB,GAAG,EAAE,OAAO,KAAK;AAAA,YACnD,GAJM,CAIN,CACF;AAAA,UACE,CAAA;AAAA,UACJ,EAAM,WACL,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YACb,UAAA,gBAAA,EAAC,GAAD;AAAA,cAAQ,MAAK;AAAA,cAAK,SAAQ;AAAA,cAAQ,SAAA,MAAe,EAAS,EAAE,SAAS,OAAU,CAAC;AAAA,cAAG,UAAA;AAAA,YAE3E,CAAA;AAAA,UACL,CAAA;AAAA,QAEP,EAAA,CAAA;AAAA,MAEJ,EAAA,CAAA;AAAA,MAIH,EAAO,SAAS,WACf,gBAAA,EAAA,GAAA,EAAA,UAAA;AAAA,QACE,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UAA0B,UAAA;AAAA,QAAc,CAAA;AAAA,QACvD,gBAAA,EAAC,SAAD;AAAA,UAAO,WAAU;AAAA,UAAjB,UAAA,CACE,gBAAA,EAAC,SAAD;AAAA,YACE,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,EAAM;AAAA,YACf,UAAA,CAAW,MAAM,EAAS,EAAE,SAAS,EAAE,OAAO,QAAQ,CAAC;AAAA,UACxD,CAAA,GACD,gBAAA,EAAC,QAAD,EAAA,UAAM,SAAY,CAAA,CACb;AAAA;QACN,EAAM,WACL,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,YAAO,MAAK;AAAA,YAAK,WAAU;AAAA,YAAuB,UAAA;AAAA,UAAW,CAAA,GAC7D,gBAAA,EAAC,GAAD;AAAA,YACE,SAAS;AAAA,YACT,OAAO,EAAM,kBAAkB;AAAA,YAC/B,UAAA,CAAW,MAAM,EAAS,EAAE,gBAAgB,EAAiC,CAAC;AAAA,UAC/E,CAAA,CACE;AAAA;QAEP,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UAAsB,UAAA;AAAA,QAEhC,CAAA;AAAA,MACL,EAAA,CAAA;AAAA,IAED;AAAA;AAET"}
|
|
@@ -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,
|
|
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":";;;;;AA+BA,IAAM,IAAsG;AAAA,EAC1G,MAAM,CACJ;AAAA,IAAE,QAAQ;AAAA,IAAS,OAAO;AAAA,IAAK,OAAO;AAAA,EAAO,GAC7C;AAAA,IAAE,QAAQ;AAAA,IAAS,OAAO;AAAA,IAAK,OAAO;AAAA,EAAQ,CAChD;AAAA,EACA,OAAO,CACL;AAAA,IAAE,QAAQ;AAAA,IAAQ,OAAO;AAAA,IAAK,OAAO;AAAA,EAAQ,GAC7C;AAAA,IAAE,QAAQ;AAAA,IAAS,OAAO;AAAA,IAAK,OAAO;AAAA,EAAO,CAC/C;AAAA,EACA,OAAO,CACL;AAAA,IAAE,QAAQ;AAAA,IAAQ,OAAO;AAAA,IAAK,OAAO;AAAA,EAAQ,GAC7C;AAAA,IAAE,QAAQ;AAAA,IAAS,OAAO;AAAA,IAAK,OAAO;AAAA,EAAQ,CAChD;AACF;AAEA,SAAwB,EAAe,EACrC,MAAA,GACA,YAAA,GACA,WAAA,GACA,YAAA,GACA,cAAA,GACA,OAAA,GACA,MAAA,GACA,QAAA,GACA,kBAAA,GACA,SAAA,EAAA,GACsB;AACtB,QAAM,CAAC,GAAW,CAAA,IAAgB,EAAS,KAAc,EAAK,CAAA,GAAI,EAAE,GAC9D,IAAa,MAAS,SACtB,IAAY,EAAK,KAAA,CAAK,MAAK,EAAE,OAAO,CAAS,GAAG,MAAM,EAAK,CAAA,GAAI,IAC/D,EAAE,YAAA,GAAY,aAAA,EAAA,IAAgB,EAClC,IACI;AAAA,IACE,YAAA,CAAa,MAAS;AAAE,MAAI,KAAW,IAAS,GAAW,CAAI;AAAA,IAAG;AAAA,IAClE,kBAAA;AAAA,EACF,IACA,MACN,GACM,EAAE,YAAA,GAAY,mBAAA,EAAA,IAAsB,EAAkB,GAAY,CAAY;AAEpF,EAAA,EAAA,MAAgB;AACd,IAAI,EAAK,SAAS,KAAK,CAAC,EAAK,KAAA,CAAK,MAAK,EAAE,OAAO,CAAS,KACvD,EAAa,EAAK,CAAA,EAAG,EAAE;AAAA,EAE3B,GAAG,CAAC,GAAM,CAAS,CAAC;AAEpB,QAAM,IAAa,EAAA,CAAa,MAA0B;AACxD,IAAI,KAAW,IAAS,GAAW,CAAM;AAAA,EAC3C,GAAG,CAAC,GAAW,CAAM,CAAC;AAEtB,MAAI,EAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,IAAU,EAAK,KAAA,CAAK,MAAK,EAAE,OAAO,CAAS,KAAK,EAAK,CAAA,GACrD,IAAe,EAAK,SAAS,GAC7B,IAAU,EAAa,KAAQ,MAAA;AAErC,SACE,gBAAA,EAAC,OAAD;AAAA,IACE,WAAW,GAAG,KAAa,cAAA,GAAiB,IAAa,0BAA0B,qBAAA;AAAA,IACnF,mBAAA;AAAA,IACA,OAAO;AAAA,MAAE,GAAG;AAAA,MAAO,GAAI,IAAa,IAAa;AAAA,MAAY,OAAO;AAAA,IAAW;AAAA,
|
|
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,16 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { useFlowContext as
|
|
3
|
-
import { useFlowUI as
|
|
4
|
-
import
|
|
5
|
-
import { variantEdgeStyle as
|
|
6
|
-
import { archifyStylePatch as
|
|
7
|
-
import { downloadDataURL as
|
|
8
|
-
import { useLayoutActions as
|
|
9
|
-
import { IconAI as
|
|
10
|
-
import { useCallback as C, useRef as
|
|
1
|
+
import ko from "../../../Button/index.js";
|
|
2
|
+
import { useFlowContext as wo } from "../context/FlowContext.js";
|
|
3
|
+
import { useFlowUI as Y } from "../context/FlowUIContext.js";
|
|
4
|
+
import Co from "./ProjectTitle.js";
|
|
5
|
+
import { variantEdgeStyle as vo } from "../archify/palette.js";
|
|
6
|
+
import { archifyStylePatch as Io, inferComponentType as bo } from "../archify/presets.js";
|
|
7
|
+
import { downloadDataURL as q, safeFileBaseName as H, useFlowImportExport as yo } from "../hooks/useFlowImportExport.js";
|
|
8
|
+
import { useLayoutActions as No } from "../hooks/useLayoutActions.js";
|
|
9
|
+
import { IconAI as go, IconAlign as d, IconAnchorVisible as Ao, IconArchify as So, IconAutoFocus as Oo, IconBack as xo, IconExportJson as Fo, IconExportMarkdown as zo, IconExportPdf as Ro, IconExportPng as Mo, IconFitView as jo, IconGeoGroup as Jo, IconGrid as Lo, IconGroup as Go, IconImport as Po, IconInspector as Zo, IconJson as Uo, IconLayer as y, IconMagnet as Eo, IconMiniMap as To, IconOutline as Bo, IconPresent as Vo, IconPublish as $o, IconRedo as Wo, IconShapes as Do, IconUndo as qo, IconUngroup as Ho, IconZoomIn as Yo, IconZoomOut as _o } from "./toolbarIcons.js";
|
|
10
|
+
import { useCallback as C, useRef as Ko } from "react";
|
|
11
11
|
import { Fragment as N, jsx as o, jsxs as n } from "react/jsx-runtime";
|
|
12
|
-
function
|
|
13
|
-
const { viewport: r, setViewport: s, autoFocus: a, setAutoFocus: f } =
|
|
12
|
+
function ht() {
|
|
13
|
+
const { viewport: r, setViewport: s, autoFocus: a, setAutoFocus: f } = Y(), k = Math.round(r.zoom * 100);
|
|
14
14
|
return /* @__PURE__ */ n("div", {
|
|
15
15
|
className: "flow-zoom-controls",
|
|
16
16
|
children: [
|
|
@@ -22,7 +22,7 @@ function dt() {
|
|
|
22
22
|
zoom: Math.max(0.1, r.zoom / 1.2)
|
|
23
23
|
});
|
|
24
24
|
},
|
|
25
|
-
children: /* @__PURE__ */ o(
|
|
25
|
+
children: /* @__PURE__ */ o(_o, {})
|
|
26
26
|
}),
|
|
27
27
|
/* @__PURE__ */ n("span", {
|
|
28
28
|
className: "flow-zoom-info",
|
|
@@ -36,7 +36,7 @@ function dt() {
|
|
|
36
36
|
zoom: Math.min(4, r.zoom * 1.2)
|
|
37
37
|
});
|
|
38
38
|
},
|
|
39
|
-
children: /* @__PURE__ */ o(
|
|
39
|
+
children: /* @__PURE__ */ o(Yo, {})
|
|
40
40
|
}),
|
|
41
41
|
/* @__PURE__ */ o(t, {
|
|
42
42
|
tip: "适应视图",
|
|
@@ -47,13 +47,13 @@ function dt() {
|
|
|
47
47
|
zoom: 1
|
|
48
48
|
});
|
|
49
49
|
},
|
|
50
|
-
children: /* @__PURE__ */ o(
|
|
50
|
+
children: /* @__PURE__ */ o(jo, {})
|
|
51
51
|
}),
|
|
52
52
|
/* @__PURE__ */ o(t, {
|
|
53
53
|
tip: a ? "关闭 Auto Focus" : "开启 Auto Focus",
|
|
54
54
|
active: a,
|
|
55
55
|
onClick: () => f(!a),
|
|
56
|
-
children: /* @__PURE__ */ o(
|
|
56
|
+
children: /* @__PURE__ */ o(Oo, {})
|
|
57
57
|
})
|
|
58
58
|
]
|
|
59
59
|
});
|
|
@@ -62,7 +62,7 @@ function t({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children:
|
|
|
62
62
|
const h = s ? `${r} (${s})` : r;
|
|
63
63
|
return /* @__PURE__ */ n("span", {
|
|
64
64
|
className: "flow-tip",
|
|
65
|
-
children: [/* @__PURE__ */ o(
|
|
65
|
+
children: [/* @__PURE__ */ o(ko, {
|
|
66
66
|
size: "xs",
|
|
67
67
|
variant: f ? "primary" : "ghost",
|
|
68
68
|
onClick: a,
|
|
@@ -80,32 +80,32 @@ function t({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children:
|
|
|
80
80
|
})]
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
|
-
function
|
|
84
|
-
const { showGrid:
|
|
85
|
-
const e =
|
|
86
|
-
|
|
87
|
-
}, [
|
|
88
|
-
const e =
|
|
89
|
-
|
|
90
|
-
}, [
|
|
91
|
-
|
|
83
|
+
function pt({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup: m, onGeoGroup: h, onUngroup: v, onExportPNG: x, onExportPDF: F, onPublish: z, compact: R }) {
|
|
84
|
+
const { showGrid: M, setShowGrid: _, showPalette: j, setShowPalette: K, showInspector: J, setShowInspector: Q, showOutline: L, setShowOutline: X, showJson: G, setShowJson: oo, showAI: P, setShowAI: to, showMiniMap: Z, setShowMiniMap: eo, showAnchors: I, setShowAnchors: io, presentation: U, setPresentation: no, placementSnap: g, setPlacementSnap: lo } = Y(), { doc: w, selection: p, currentCanvas: co, setDoc: E, currentCanvasId: A } = wo(), { exportJSON: T, importJSON: B, exportMarkdown: V } = yo(), { align: u, distribute: $, changeZIndex: b } = No(), W = Ko(null), S = p.nodeIds.size + p.lineIds.size, ro = p.nodeIds.size > 0 && co.nodes.some((e) => p.nodeIds.has(e.id) && (e.type === "flowGroup" || e.type === "geometryGroup" || e.data.isGroup)), O = Object.values(w.canvases).some((e) => e.nodes.some((l) => l.type === "animAnchor")), so = C(() => {
|
|
85
|
+
const e = T(), l = new Blob([e], { type: "application/json" }), c = URL.createObjectURL(l);
|
|
86
|
+
q(c, `${H(w.title)}.json`), URL.revokeObjectURL(c);
|
|
87
|
+
}, [T, w.title]), ao = C(() => {
|
|
88
|
+
const e = V(), l = new Blob([e], { type: "text/markdown" }), c = URL.createObjectURL(l);
|
|
89
|
+
q(c, `${H(w.title)}.md`), URL.revokeObjectURL(c);
|
|
90
|
+
}, [V, w.title]), ho = C(() => {
|
|
91
|
+
W.current?.click();
|
|
92
92
|
}, []), po = C(() => {
|
|
93
|
-
|
|
93
|
+
E((e) => {
|
|
94
94
|
const l = e.canvases[A];
|
|
95
95
|
if (!l) return e;
|
|
96
96
|
const c = l.nodes.map((i) => i.type === "animAnchor" || i.type === "shapeSvg" || i.data.isGroup || i.type === "flowGroup" || i.type === "geometryGroup" ? i : {
|
|
97
97
|
...i,
|
|
98
98
|
data: {
|
|
99
99
|
...i.data,
|
|
100
|
-
...
|
|
100
|
+
...Io(bo(i.data))
|
|
101
101
|
}
|
|
102
102
|
}), uo = l.edges.map((i) => {
|
|
103
|
-
const
|
|
103
|
+
const fo = i.data.strokeColor && i.data.strokeColor !== "#64748b", D = vo(fo ? "emphasis" : "default");
|
|
104
104
|
return {
|
|
105
105
|
...i,
|
|
106
106
|
data: {
|
|
107
107
|
...i.data,
|
|
108
|
-
strokeColor: i.data.strokeColor && i.data.strokeColor.startsWith("theme:") ?
|
|
108
|
+
strokeColor: i.data.strokeColor && i.data.strokeColor.startsWith("theme:") ? D.color : i.data.strokeColor ?? D.color
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
111
|
});
|
|
@@ -121,31 +121,31 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
123
|
});
|
|
124
|
-
}, [
|
|
124
|
+
}, [E, A]), mo = C((e) => {
|
|
125
125
|
const l = e.target.files?.[0];
|
|
126
126
|
if (!l) return;
|
|
127
127
|
const c = new FileReader();
|
|
128
128
|
c.onload = () => {
|
|
129
|
-
typeof c.result == "string" &&
|
|
129
|
+
typeof c.result == "string" && B(c.result);
|
|
130
130
|
}, c.readAsText(l), e.target.value = "";
|
|
131
|
-
}, [
|
|
131
|
+
}, [B]);
|
|
132
132
|
return /* @__PURE__ */ n("div", {
|
|
133
|
-
className: `flow-toolbar${
|
|
133
|
+
className: `flow-toolbar${R ? " flow-toolbar--compact" : ""}`,
|
|
134
134
|
children: [
|
|
135
135
|
/* @__PURE__ */ o("input", {
|
|
136
|
-
ref:
|
|
136
|
+
ref: W,
|
|
137
137
|
type: "file",
|
|
138
138
|
accept: ".json",
|
|
139
139
|
style: { display: "none" },
|
|
140
140
|
onChange: mo
|
|
141
141
|
}),
|
|
142
|
-
/* @__PURE__ */ o(
|
|
142
|
+
!R && /* @__PURE__ */ o(Co, {}),
|
|
143
143
|
r && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", {
|
|
144
144
|
className: "flow-toolbar-group",
|
|
145
145
|
children: /* @__PURE__ */ o(t, {
|
|
146
146
|
tip: "返回列表",
|
|
147
147
|
onClick: r,
|
|
148
|
-
children: /* @__PURE__ */ o(
|
|
148
|
+
children: /* @__PURE__ */ o(xo, {})
|
|
149
149
|
})
|
|
150
150
|
}), /* @__PURE__ */ o("div", { className: "flow-toolbar-divider" })] }),
|
|
151
151
|
(s || a) && /* @__PURE__ */ n("div", {
|
|
@@ -155,13 +155,13 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
155
155
|
shortcut: "Ctrl+Z",
|
|
156
156
|
onClick: s,
|
|
157
157
|
disabled: !f,
|
|
158
|
-
children: /* @__PURE__ */ o(
|
|
158
|
+
children: /* @__PURE__ */ o(qo, {})
|
|
159
159
|
}), a && /* @__PURE__ */ o(t, {
|
|
160
160
|
tip: "重做",
|
|
161
161
|
shortcut: "Ctrl+Shift+Z",
|
|
162
162
|
onClick: a,
|
|
163
163
|
disabled: !k,
|
|
164
|
-
children: /* @__PURE__ */ o(
|
|
164
|
+
children: /* @__PURE__ */ o(Wo, {})
|
|
165
165
|
})]
|
|
166
166
|
}),
|
|
167
167
|
p.nodeIds.size >= 2 && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", { className: "flow-toolbar-divider" }), /* @__PURE__ */ n("div", {
|
|
@@ -199,13 +199,13 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
199
199
|
}),
|
|
200
200
|
/* @__PURE__ */ o(t, {
|
|
201
201
|
tip: "水平平分",
|
|
202
|
-
onClick: () =>
|
|
202
|
+
onClick: () => $("horizontal"),
|
|
203
203
|
disabled: p.nodeIds.size < 3,
|
|
204
204
|
children: /* @__PURE__ */ o(d, { kind: "distribute-h" })
|
|
205
205
|
}),
|
|
206
206
|
/* @__PURE__ */ o(t, {
|
|
207
207
|
tip: "垂直平分",
|
|
208
|
-
onClick: () =>
|
|
208
|
+
onClick: () => $("vertical"),
|
|
209
209
|
disabled: p.nodeIds.size < 3,
|
|
210
210
|
children: /* @__PURE__ */ o(d, { kind: "distribute-v" })
|
|
211
211
|
})
|
|
@@ -244,21 +244,21 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
244
244
|
shortcut: "⌘G",
|
|
245
245
|
onClick: m,
|
|
246
246
|
disabled: S < 2,
|
|
247
|
-
children: /* @__PURE__ */ o(
|
|
247
|
+
children: /* @__PURE__ */ o(Go, {})
|
|
248
248
|
}),
|
|
249
249
|
h && /* @__PURE__ */ o(t, {
|
|
250
250
|
tip: "几何分组",
|
|
251
251
|
shortcut: "⌘⌥G",
|
|
252
252
|
onClick: h,
|
|
253
253
|
disabled: S < 2,
|
|
254
|
-
children: /* @__PURE__ */ o(
|
|
254
|
+
children: /* @__PURE__ */ o(Jo, {})
|
|
255
255
|
}),
|
|
256
256
|
v && /* @__PURE__ */ o(t, {
|
|
257
257
|
tip: "取消成组",
|
|
258
258
|
shortcut: "⌘⇧G",
|
|
259
259
|
onClick: v,
|
|
260
260
|
disabled: !ro,
|
|
261
|
-
children: /* @__PURE__ */ o(
|
|
261
|
+
children: /* @__PURE__ */ o(Ho, {})
|
|
262
262
|
})
|
|
263
263
|
]
|
|
264
264
|
})] }),
|
|
@@ -268,21 +268,21 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
268
268
|
children: [
|
|
269
269
|
/* @__PURE__ */ o(t, {
|
|
270
270
|
tip: "网格",
|
|
271
|
-
active:
|
|
272
|
-
onClick: () => _(!
|
|
273
|
-
children: /* @__PURE__ */ o(
|
|
271
|
+
active: M,
|
|
272
|
+
onClick: () => _(!M),
|
|
273
|
+
children: /* @__PURE__ */ o(Lo, {})
|
|
274
274
|
}),
|
|
275
275
|
/* @__PURE__ */ o(t, {
|
|
276
276
|
tip: g ? "放置吸附网格:开(盖章自动贴近网格)" : "放置吸附网格:关(自由放置)",
|
|
277
277
|
active: g,
|
|
278
278
|
onClick: () => lo(!g),
|
|
279
|
-
children: /* @__PURE__ */ o(
|
|
279
|
+
children: /* @__PURE__ */ o(Eo, {})
|
|
280
280
|
}),
|
|
281
281
|
/* @__PURE__ */ o(t, {
|
|
282
282
|
tip: "缩略图",
|
|
283
|
-
active:
|
|
284
|
-
onClick: () => eo(!
|
|
285
|
-
children: /* @__PURE__ */ o(
|
|
283
|
+
active: Z,
|
|
284
|
+
onClick: () => eo(!Z),
|
|
285
|
+
children: /* @__PURE__ */ o(To, {})
|
|
286
286
|
}),
|
|
287
287
|
/* @__PURE__ */ o(t, {
|
|
288
288
|
tip: I ? "隐藏所有 Anchor 对象" : "显示所有 Anchor 对象",
|
|
@@ -291,21 +291,21 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
291
291
|
onClick: () => {
|
|
292
292
|
O && io(!I);
|
|
293
293
|
},
|
|
294
|
-
children: /* @__PURE__ */ o(
|
|
294
|
+
children: /* @__PURE__ */ o(Ao, { visible: I })
|
|
295
295
|
}),
|
|
296
296
|
/* @__PURE__ */ o(t, {
|
|
297
297
|
tip: "动画预览",
|
|
298
|
-
active:
|
|
299
|
-
onClick: () => no(
|
|
298
|
+
active: U !== null,
|
|
299
|
+
onClick: () => no(U ? null : {
|
|
300
300
|
current: 0,
|
|
301
301
|
showAnchor: !1
|
|
302
302
|
}),
|
|
303
|
-
children: /* @__PURE__ */ o(
|
|
303
|
+
children: /* @__PURE__ */ o(Vo, {})
|
|
304
304
|
}),
|
|
305
305
|
/* @__PURE__ */ o(t, {
|
|
306
306
|
tip: "应用 Archify 风格(当前画布)",
|
|
307
307
|
onClick: po,
|
|
308
|
-
children: /* @__PURE__ */ o(
|
|
308
|
+
children: /* @__PURE__ */ o(So, {})
|
|
309
309
|
})
|
|
310
310
|
]
|
|
311
311
|
}),
|
|
@@ -315,33 +315,33 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
315
315
|
children: [
|
|
316
316
|
/* @__PURE__ */ o(t, {
|
|
317
317
|
tip: "形状面板",
|
|
318
|
-
active:
|
|
319
|
-
onClick: () => K(!
|
|
320
|
-
children: /* @__PURE__ */ o(
|
|
318
|
+
active: j,
|
|
319
|
+
onClick: () => K(!j),
|
|
320
|
+
children: /* @__PURE__ */ o(Do, {})
|
|
321
321
|
}),
|
|
322
322
|
/* @__PURE__ */ o(t, {
|
|
323
323
|
tip: "属性面板",
|
|
324
|
-
active:
|
|
325
|
-
onClick: () => Q(!
|
|
326
|
-
children: /* @__PURE__ */ o(
|
|
324
|
+
active: J,
|
|
325
|
+
onClick: () => Q(!J),
|
|
326
|
+
children: /* @__PURE__ */ o(Zo, {})
|
|
327
327
|
}),
|
|
328
328
|
/* @__PURE__ */ o(t, {
|
|
329
329
|
tip: "大纲",
|
|
330
|
-
active:
|
|
331
|
-
onClick: () => X(!
|
|
332
|
-
children: /* @__PURE__ */ o(
|
|
330
|
+
active: L,
|
|
331
|
+
onClick: () => X(!L),
|
|
332
|
+
children: /* @__PURE__ */ o(Bo, {})
|
|
333
333
|
}),
|
|
334
334
|
/* @__PURE__ */ o(t, {
|
|
335
335
|
tip: "JSON",
|
|
336
|
-
active:
|
|
337
|
-
onClick: () => oo(!
|
|
338
|
-
children: /* @__PURE__ */ o(
|
|
336
|
+
active: G,
|
|
337
|
+
onClick: () => oo(!G),
|
|
338
|
+
children: /* @__PURE__ */ o(Uo, {})
|
|
339
339
|
}),
|
|
340
340
|
/* @__PURE__ */ o(t, {
|
|
341
341
|
tip: "AI 助手",
|
|
342
|
-
active:
|
|
343
|
-
onClick: () => to(!
|
|
344
|
-
children: /* @__PURE__ */ o(
|
|
342
|
+
active: P,
|
|
343
|
+
onClick: () => to(!P),
|
|
344
|
+
children: /* @__PURE__ */ o(go, {})
|
|
345
345
|
})
|
|
346
346
|
]
|
|
347
347
|
}),
|
|
@@ -352,36 +352,36 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
352
352
|
/* @__PURE__ */ o(t, {
|
|
353
353
|
tip: "导入 JSON",
|
|
354
354
|
onClick: ho,
|
|
355
|
-
children: /* @__PURE__ */ o(
|
|
355
|
+
children: /* @__PURE__ */ o(Po, {})
|
|
356
356
|
}),
|
|
357
357
|
/* @__PURE__ */ o(t, {
|
|
358
358
|
tip: "导出 JSON",
|
|
359
359
|
onClick: so,
|
|
360
|
-
children: /* @__PURE__ */ o(
|
|
360
|
+
children: /* @__PURE__ */ o(Fo, {})
|
|
361
361
|
}),
|
|
362
362
|
/* @__PURE__ */ o(t, {
|
|
363
363
|
tip: "导出 Markdown",
|
|
364
364
|
onClick: ao,
|
|
365
|
-
children: /* @__PURE__ */ o(
|
|
365
|
+
children: /* @__PURE__ */ o(zo, {})
|
|
366
366
|
}),
|
|
367
367
|
x && /* @__PURE__ */ o(t, {
|
|
368
368
|
tip: "导出 PNG",
|
|
369
369
|
onClick: () => {
|
|
370
370
|
x();
|
|
371
371
|
},
|
|
372
|
-
children: /* @__PURE__ */ o(
|
|
372
|
+
children: /* @__PURE__ */ o(Mo, {})
|
|
373
373
|
}),
|
|
374
374
|
F && O && /* @__PURE__ */ o(t, {
|
|
375
375
|
tip: "导出 PDF(按锦点顺序)",
|
|
376
376
|
onClick: () => {
|
|
377
377
|
F();
|
|
378
378
|
},
|
|
379
|
-
children: /* @__PURE__ */ o(
|
|
379
|
+
children: /* @__PURE__ */ o(Ro, {})
|
|
380
380
|
}),
|
|
381
381
|
z && /* @__PURE__ */ o(t, {
|
|
382
382
|
tip: "发布与共享",
|
|
383
383
|
onClick: z,
|
|
384
|
-
children: /* @__PURE__ */ o(
|
|
384
|
+
children: /* @__PURE__ */ o($o, {})
|
|
385
385
|
})
|
|
386
386
|
]
|
|
387
387
|
})
|
|
@@ -389,8 +389,8 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
389
389
|
});
|
|
390
390
|
}
|
|
391
391
|
export {
|
|
392
|
-
|
|
393
|
-
|
|
392
|
+
ht as FlowZoomControls,
|
|
393
|
+
pt as default
|
|
394
394
|
};
|
|
395
395
|
|
|
396
396
|
//# sourceMappingURL=FlowToolbar.js.map
|