@veltra/sheet 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -19
- package/dist/index.js +2 -15
- package/dist/types/index.d.ts +1 -3
- package/package.json +2 -3
- package/src/index.ts +1 -27
- package/src/types/index.ts +0 -2
- package/dist/components/report/binding-badge.js +0 -118
- package/dist/components/report/designer/cell-coords.js +0 -46
- package/dist/components/report/designer/col-widths.js +0 -29
- package/dist/components/report/designer/conditional-rules/helpers.js +0 -139
- package/dist/components/report/designer/drill-dialog.js +0 -258
- package/dist/components/report/designer/drop-highlight-overlay.js +0 -76
- package/dist/components/report/designer/float-panel.js +0 -434
- package/dist/components/report/designer/role.js +0 -17
- package/dist/components/report/designer/rule-preview.js +0 -33
- package/dist/components/report/designer/rule-row.js +0 -253
- package/dist/components/report/designer/rules-dialog.js +0 -118
- package/dist/components/report/designer/topology-overlay.js +0 -122
- package/dist/components/report/designer/topology.js +0 -64
- package/dist/components/report/designer/use-grid-overlay.js +0 -75
- package/dist/components/report/designer-hub.js +0 -177
- package/dist/components/report/field-panel-helpers.js +0 -33
- package/dist/components/report/field-panel.js +0 -132
- package/dist/components/report/filter-bar.js +0 -74
- package/dist/components/report/hub-connection-form.js +0 -145
- package/dist/components/report/hub-dataset-editor.js +0 -409
- package/dist/components/report/preview-grid-size.js +0 -32
- package/dist/components/report/print.js +0 -39
- package/dist/components/report/report-designer.js +0 -428
- package/dist/components/report/report-viewer.js +0 -253
- package/dist/components/report/style.d.ts +0 -17
- package/dist/components/report/style.js +0 -18
- package/dist/components/report/style2.css +0 -965
- package/dist/components/report/use-report-designer.js +0 -387
- package/dist/components/report/use-report-viewer.js +0 -140
- package/dist/report/binding.d.ts +0 -83
- package/dist/report/binding.js +0 -334
- package/dist/report/connector.d.ts +0 -66
- package/dist/report/connector.js +0 -159
- package/dist/report/drill.d.ts +0 -48
- package/dist/report/drill.js +0 -78
- package/dist/report/export-xlsx.d.ts +0 -13
- package/dist/report/export-xlsx.js +0 -13
- package/dist/report/filter-bar.d.ts +0 -10
- package/dist/report/filter-bar.js +0 -31
- package/dist/report/index.d.ts +0 -14
- package/dist/report/params.d.ts +0 -13
- package/dist/report/params.js +0 -61
- package/dist/report/print.d.ts +0 -23
- package/dist/report/print.js +0 -197
- package/dist/report/render/aggregate.js +0 -193
- package/dist/report/render/builder.d.ts +0 -12
- package/dist/report/render/builder.js +0 -139
- package/dist/report/render/coordinate.d.ts +0 -25
- package/dist/report/render/coordinate.js +0 -733
- package/dist/report/render/index.d.ts +0 -14
- package/dist/report/render/index.js +0 -21
- package/dist/report/render/style-resolver.js +0 -50
- package/dist/report/render/template-index.d.ts +0 -24
- package/dist/report/render/template-index.js +0 -137
- package/dist/report/rules/evaluate.d.ts +0 -25
- package/dist/report/rules/evaluate.js +0 -82
- package/dist/report/rules/index.d.ts +0 -2
- package/dist/report/template.d.ts +0 -63
- package/dist/report/template.js +0 -83
- package/dist/report/types.d.ts +0 -103
- package/dist/types/report-designer.d.ts +0 -51
- package/dist/types/report-viewer.d.ts +0 -57
- package/src/components/report/__test__/binding-badge.test.ts +0 -92
- package/src/components/report/__test__/conditional-rules-helpers.test.ts +0 -88
- package/src/components/report/__test__/field-panel-helpers.test.ts +0 -65
- package/src/components/report/__test__/float-panel-position.test.ts +0 -45
- package/src/components/report/__test__/preview-grid-size.test.ts +0 -63
- package/src/components/report/__test__/report-designer.test.ts +0 -559
- package/src/components/report/__test__/report-drill.test.ts +0 -692
- package/src/components/report/__test__/report-viewer.test.ts +0 -400
- package/src/components/report/__test__/topology.test.ts +0 -143
- package/src/components/report/__test__/use-report-designer.test.ts +0 -804
- package/src/components/report/binding-badge.ts +0 -122
- package/src/components/report/designer/cell-coords.ts +0 -95
- package/src/components/report/designer/col-widths.ts +0 -56
- package/src/components/report/designer/conditional-rules/helpers.ts +0 -189
- package/src/components/report/designer/drill-dialog.vue +0 -245
- package/src/components/report/designer/drop-highlight-overlay.vue +0 -75
- package/src/components/report/designer/float-panel.vue +0 -444
- package/src/components/report/designer/role.ts +0 -32
- package/src/components/report/designer/rule-preview.vue +0 -40
- package/src/components/report/designer/rule-row.vue +0 -252
- package/src/components/report/designer/rules-dialog.vue +0 -110
- package/src/components/report/designer/topology-overlay.vue +0 -128
- package/src/components/report/designer/topology.ts +0 -124
- package/src/components/report/designer/use-grid-overlay.ts +0 -114
- package/src/components/report/designer-hub.vue +0 -198
- package/src/components/report/field-panel-helpers.ts +0 -44
- package/src/components/report/field-panel.vue +0 -136
- package/src/components/report/filter-bar.vue +0 -77
- package/src/components/report/hub-connection-form.vue +0 -124
- package/src/components/report/hub-dataset-editor.vue +0 -387
- package/src/components/report/index.ts +0 -2
- package/src/components/report/preview-grid-size.ts +0 -33
- package/src/components/report/print.ts +0 -44
- package/src/components/report/report-designer.vue +0 -454
- package/src/components/report/report-viewer.vue +0 -289
- package/src/components/report/style-designer.scss +0 -653
- package/src/components/report/style-hub.scss +0 -292
- package/src/components/report/style-viewer.scss +0 -144
- package/src/components/report/style.scss +0 -3
- package/src/components/report/style.ts +0 -20
- package/src/components/report/use-report-designer.ts +0 -603
- package/src/components/report/use-report-viewer.ts +0 -227
- package/src/report/__test__/binding.test.ts +0 -320
- package/src/report/__test__/connector.test.ts +0 -239
- package/src/report/__test__/drill.test.ts +0 -194
- package/src/report/__test__/export-xlsx.test.ts +0 -96
- package/src/report/__test__/filter-bar.test.ts +0 -58
- package/src/report/__test__/params.test.ts +0 -156
- package/src/report/__test__/print.test.ts +0 -170
- package/src/report/__test__/render.test.ts +0 -856
- package/src/report/__test__/rules.test.ts +0 -131
- package/src/report/__test__/template.test.ts +0 -366
- package/src/report/binding.ts +0 -474
- package/src/report/connector.ts +0 -206
- package/src/report/drill.ts +0 -112
- package/src/report/export-xlsx.ts +0 -15
- package/src/report/filter-bar.ts +0 -36
- package/src/report/index.ts +0 -16
- package/src/report/params.ts +0 -96
- package/src/report/print.ts +0 -234
- package/src/report/render/__test__/aggregate.test.ts +0 -16
- package/src/report/render/__test__/coordinate.test.ts +0 -405
- package/src/report/render/aggregate.ts +0 -289
- package/src/report/render/builder.ts +0 -211
- package/src/report/render/coordinate.ts +0 -1239
- package/src/report/render/index.ts +0 -30
- package/src/report/render/style-resolver.ts +0 -68
- package/src/report/render/template-index.ts +0 -200
- package/src/report/rules/evaluate.ts +0 -113
- package/src/report/rules/index.ts +0 -7
- package/src/report/template.ts +0 -145
- package/src/report/types.ts +0 -116
- package/src/types/report-designer.ts +0 -55
- package/src/types/report-viewer.ts +0 -54
package/dist/index.d.ts
CHANGED
|
@@ -1,23 +1,6 @@
|
|
|
1
|
-
import _sfc_main
|
|
2
|
-
import _sfc_main$1 from "./components/report/report-viewer.js";
|
|
3
|
-
import _sfc_main from "./components/report/report-designer.js";
|
|
1
|
+
import _sfc_main from "./components/sheet/sheet.js";
|
|
4
2
|
import { SheetContext, createSheetContext } from "./tools/context.js";
|
|
5
3
|
import { SheetTool, SheetToolGroup, SheetToolPopupType, defaultToolRegistry, registerTool, unregisterTool } from "./tools/registry.js";
|
|
6
4
|
import { SheetEmits, SheetExposed, SheetProps, _SheetExposed } from "./types/sheet.js";
|
|
7
|
-
import { ConditionalOperator, ConditionalRule, DatasetCatalogItem, DatasetField, DatasetRecords, ParamValues, QueryParamDef, QueryParamOption, QueryParamType, ReportAggregate, ReportBinding, ReportDrillConfig, ReportExpand, ReportPreset, ReportSort, ReportTemplateListItem } from "./report/types.js";
|
|
8
|
-
import { InferParentOptions, ListParentCandidateOptions, REPORT_META_NAMESPACE, applyReportPreset, createReportBinding, formatBindingPlaceholder, formatBindingPlaceholderParts, formatCellAddress, formatParentCandidateLabel, inferColParentCandidate, inferDropPreset, inferParentsForPreset, inferReportPreset, inferRowParentCandidate, isColGroupBinding, isExpansionBandCol, isExpansionBandRow, isHorizontalExpandBinding, isReductionAggregate, isRowGroupBinding, isVerticalExpandBinding, listColParentCandidates, listRowParentCandidates, parseCellAddress, prefersGroupParent, presetBindingPatch, presetStillApplies, setBindingCatalog } from "./report/binding.js";
|
|
9
|
-
import { ConditionalEvalContext, evaluateCondition, evaluateConditionalStyle, resolveRuleCompareValue, toComparableNumber } from "./report/rules/evaluate.js";
|
|
10
|
-
import { buildParamDefs, extractParamIds, resolveBoundDatasetParams } from "./report/params.js";
|
|
11
|
-
import { ReportColWidthEntry, exportFilledReportXlsx } from "./report/export-xlsx.js";
|
|
12
|
-
import { mapFilledColWidths } from "./report/render/builder.js";
|
|
13
|
-
import { renderReport, resolveFilledColWidths } from "./report/render/index.js";
|
|
14
|
-
import { ConnectionType, ConnectorError, CreateHttpConnectorOptions, DEFAULT_CONNECTION_PORTS, DataConnection, DataConnector, QueryResult, Result, createHttpConnector, resolvePortOnTypeChange } from "./report/connector.js";
|
|
15
|
-
import { IncompatibleTemplateVersionError, REPORT_TEMPLATE_VERSION, ReportDatasetDef, ReportTemplate, assertCompatibleTemplateVersion, createReportTemplate, fetchTemplateRecords, getBoundDatasetIds, getTemplateDatasets, resolveParamDefaults, resolveTemplateParams } from "./report/template.js";
|
|
16
|
-
import { parseDateRangeValue, patchParamValues, resolveNumberParamValue } from "./report/filter-bar.js";
|
|
17
|
-
import { DrillHit, DrillStack, DrillStackLayer, ResolveReportTemplate, buildDrillHitMap, createDrillStack, currentDrillLayer, popDrillLayer, pushDrillLayer, resolveDrillParams } from "./report/drill.js";
|
|
18
|
-
import { ReportPrintOptions, buildFilledReportPrintHtml } from "./report/print.js";
|
|
19
|
-
import "./report/index.js";
|
|
20
|
-
import { ReportViewerExposed, ReportViewerProps, _ReportViewerExposed } from "./types/report-viewer.js";
|
|
21
|
-
import { ReportDesignerEmits, ReportDesignerExposed, ReportDesignerProps, _ReportDesignerExposed } from "./types/report-designer.js";
|
|
22
5
|
import "./types/index.js";
|
|
23
|
-
export { type
|
|
6
|
+
export { type SheetContext, type SheetEmits, type SheetExposed, type SheetProps, type SheetTool, type SheetToolGroup, type SheetToolPopupType, _sfc_main as USheet, type _SheetExposed, createSheetContext, defaultToolRegistry, registerTool, unregisterTool };
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
1
|
import { defaultToolRegistry, registerTool, unregisterTool } from "./tools/registry.js";
|
|
2
2
|
import "./tools/builtin.js";
|
|
3
3
|
import { createSheetContext } from "./tools/context.js";
|
|
4
|
-
import _sfc_main
|
|
5
|
-
|
|
6
|
-
import { buildFilledReportPrintHtml } from "./report/print.js";
|
|
7
|
-
import { parseDateRangeValue, patchParamValues, resolveNumberParamValue } from "./report/filter-bar.js";
|
|
8
|
-
import { REPORT_META_NAMESPACE, applyReportPreset, createReportBinding, formatBindingPlaceholder, formatBindingPlaceholderParts, formatCellAddress, formatParentCandidateLabel, inferColParentCandidate, inferDropPreset, inferParentsForPreset, inferReportPreset, inferRowParentCandidate, isColGroupBinding, isExpansionBandCol, isExpansionBandRow, isHorizontalExpandBinding, isReductionAggregate, isRowGroupBinding, isVerticalExpandBinding, listColParentCandidates, listRowParentCandidates, parseCellAddress, prefersGroupParent, presetBindingPatch, presetStillApplies, setBindingCatalog } from "./report/binding.js";
|
|
9
|
-
import { buildDrillHitMap, createDrillStack, currentDrillLayer, popDrillLayer, pushDrillLayer, resolveDrillParams } from "./report/drill.js";
|
|
10
|
-
import { evaluateCondition, evaluateConditionalStyle, resolveRuleCompareValue, toComparableNumber } from "./report/rules/evaluate.js";
|
|
11
|
-
import { mapFilledColWidths } from "./report/render/builder.js";
|
|
12
|
-
import { renderReport, resolveFilledColWidths } from "./report/render/index.js";
|
|
13
|
-
import { buildParamDefs, extractParamIds, resolveBoundDatasetParams } from "./report/params.js";
|
|
14
|
-
import { IncompatibleTemplateVersionError, REPORT_TEMPLATE_VERSION, assertCompatibleTemplateVersion, createReportTemplate, fetchTemplateRecords, getBoundDatasetIds, getTemplateDatasets, resolveParamDefaults, resolveTemplateParams } from "./report/template.js";
|
|
15
|
-
import _sfc_main$1 from "./components/report/report-viewer.js";
|
|
16
|
-
import { DEFAULT_CONNECTION_PORTS, createHttpConnector, resolvePortOnTypeChange } from "./report/connector.js";
|
|
17
|
-
import _sfc_main from "./components/report/report-designer.js";
|
|
18
|
-
export { DEFAULT_CONNECTION_PORTS, IncompatibleTemplateVersionError, REPORT_META_NAMESPACE, REPORT_TEMPLATE_VERSION, _sfc_main as UReportDesigner, _sfc_main$1 as UReportViewer, _sfc_main$2 as USheet, applyReportPreset, assertCompatibleTemplateVersion, buildDrillHitMap, buildFilledReportPrintHtml, buildParamDefs, createDrillStack, createHttpConnector, createReportBinding, createReportTemplate, createSheetContext, currentDrillLayer, defaultToolRegistry, evaluateCondition, evaluateConditionalStyle, exportFilledReportXlsx, extractParamIds, fetchTemplateRecords, formatBindingPlaceholder, formatBindingPlaceholderParts, formatCellAddress, formatParentCandidateLabel, getBoundDatasetIds, getTemplateDatasets, inferColParentCandidate, inferDropPreset, inferParentsForPreset, inferReportPreset, inferRowParentCandidate, isColGroupBinding, isExpansionBandCol, isExpansionBandRow, isHorizontalExpandBinding, isReductionAggregate, isRowGroupBinding, isVerticalExpandBinding, listColParentCandidates, listRowParentCandidates, mapFilledColWidths, parseCellAddress, parseDateRangeValue, patchParamValues, popDrillLayer, prefersGroupParent, presetBindingPatch, presetStillApplies, pushDrillLayer, registerTool, renderReport, resolveBoundDatasetParams, resolveDrillParams, resolveFilledColWidths, resolveNumberParamValue, resolveParamDefaults, resolvePortOnTypeChange, resolveRuleCompareValue, resolveTemplateParams, setBindingCatalog, toComparableNumber, unregisterTool };
|
|
4
|
+
import _sfc_main from "./components/sheet/sheet.js";
|
|
5
|
+
export { _sfc_main as USheet, createSheetContext, defaultToolRegistry, registerTool, unregisterTool };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
1
|
import { SheetEmits, SheetExposed, SheetProps, _SheetExposed } from "./sheet.js";
|
|
2
|
-
|
|
3
|
-
import { ReportDesignerEmits, ReportDesignerExposed, ReportDesignerProps, _ReportDesignerExposed } from "./report-designer.js";
|
|
4
|
-
export { ReportDesignerEmits, ReportDesignerExposed, ReportDesignerProps, ReportViewerExposed, ReportViewerProps, SheetEmits, SheetExposed, SheetProps, _ReportDesignerExposed, _ReportViewerExposed, _SheetExposed };
|
|
2
|
+
export { SheetEmits, SheetExposed, SheetProps, _SheetExposed };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veltra/sheet",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"homepage": "https://github.com/cabinet-fe/ultra-ui#readme",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/cabinet-fe/ultra-ui/issues"
|
|
@@ -36,10 +36,9 @@
|
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"@cat-kit/core": ">=1.1.8",
|
|
38
38
|
"@cat-kit/fe": ">=1.1.8",
|
|
39
|
-
"@veltra/compositions": "^1.6.5",
|
|
40
39
|
"@veltra/desktop": "^1.6.5",
|
|
41
40
|
"@veltra/icons": "^1.5.0",
|
|
42
|
-
"@veltra/sheet-core": "^2.
|
|
41
|
+
"@veltra/sheet-core": "^2.5.0",
|
|
43
42
|
"@veltra/styles": "^1.6.5",
|
|
44
43
|
"@veltra/utils": "^1.6.5",
|
|
45
44
|
"vue": ">=3.5.41"
|
package/src/index.ts
CHANGED
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
// 内置工具注册(undo/redo/合并/取消合并):随包入口完成,
|
|
2
|
-
// 与 sheet-core command 的 default-registry 同构;深导入 sheet-core 子路径的
|
|
3
|
-
// 无头场景不涉及
|
|
4
1
|
import './tools/builtin'
|
|
5
2
|
|
|
6
|
-
// 数据模型 / 渲染内核在 @veltra/sheet-core(独立发包)。本包**不做** re-export:
|
|
7
|
-
// core API(Workbook / Sheet / 公式 / IO 等)一律 `from '@veltra/sheet-core'` 直导;
|
|
8
|
-
// SheetGrid 走 `@veltra/sheet-core/grid`;白名单外符号深导入其子路径。
|
|
9
|
-
// 本入口只导出 sheet 自有能力:组件、tools、组件类型。
|
|
10
|
-
|
|
11
3
|
export { createSheetContext, type SheetContext } from './tools/context'
|
|
12
4
|
|
|
13
5
|
export {
|
|
@@ -19,24 +11,6 @@ export {
|
|
|
19
11
|
type SheetToolGroup
|
|
20
12
|
} from './tools/registry'
|
|
21
13
|
|
|
22
|
-
export {
|
|
23
|
-
type SheetProps,
|
|
24
|
-
type SheetEmits,
|
|
25
|
-
type _SheetExposed,
|
|
26
|
-
type SheetExposed,
|
|
27
|
-
type ReportViewerProps,
|
|
28
|
-
type _ReportViewerExposed,
|
|
29
|
-
type ReportViewerExposed,
|
|
30
|
-
type ReportDesignerProps,
|
|
31
|
-
type ReportDesignerEmits,
|
|
32
|
-
type _ReportDesignerExposed,
|
|
33
|
-
type ReportDesignerExposed
|
|
34
|
-
} from './types'
|
|
14
|
+
export { type SheetProps, type SheetEmits, type _SheetExposed, type SheetExposed } from './types'
|
|
35
15
|
|
|
36
16
|
export { USheet } from './components/sheet'
|
|
37
|
-
|
|
38
|
-
export { UReportViewer, UReportDesigner } from './components/report'
|
|
39
|
-
|
|
40
|
-
// 报表纯 TS 内核:renderReport / binding / rules / params / DataConnector / Report Template /
|
|
41
|
-
// Filter Bar 值规范化(结构见 packages/sheet/AGENTS.md)
|
|
42
|
-
export * from './report'
|
package/src/types/index.ts
CHANGED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { formatBindingPlaceholderParts, inferReportPreset } from "../../report/binding.js";
|
|
2
|
-
import { CustomLayout } from "@veltra/sheet-core/grid";
|
|
3
|
-
//#region src/components/report/binding-badge.ts
|
|
4
|
-
const REPORT_PRESET_BADGE_COLORS = {
|
|
5
|
-
groupHeader: {
|
|
6
|
-
cell: "#eef4ff",
|
|
7
|
-
fg: "#2f54eb"
|
|
8
|
-
},
|
|
9
|
-
detail: {
|
|
10
|
-
cell: "#effaf3",
|
|
11
|
-
fg: "#1f9254"
|
|
12
|
-
},
|
|
13
|
-
subtotal: {
|
|
14
|
-
cell: "#fff7e6",
|
|
15
|
-
fg: "#d46b08"
|
|
16
|
-
},
|
|
17
|
-
grandTotal: {
|
|
18
|
-
cell: "#fff1f0",
|
|
19
|
-
fg: "#cf1322"
|
|
20
|
-
},
|
|
21
|
-
cross: {
|
|
22
|
-
cell: "#f8f5ff",
|
|
23
|
-
fg: "#5f3dc4"
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
const CUSTOM_PRESET_BADGE_COLOR = {
|
|
27
|
-
cell: "#f7f8fa",
|
|
28
|
-
fg: "#495057"
|
|
29
|
-
};
|
|
30
|
-
/** 徽章字段标签文字色(中性深灰,与强调色形成层次) */
|
|
31
|
-
const BADGE_LABEL_COLOR = "#343a40";
|
|
32
|
-
function resolveBadgeColor(binding) {
|
|
33
|
-
const preset = inferReportPreset(binding);
|
|
34
|
-
return preset ? REPORT_PRESET_BADGE_COLORS[preset] : CUSTOM_PRESET_BADGE_COLOR;
|
|
35
|
-
}
|
|
36
|
-
/** 绑定格角色底色(走 resolveCellStyle,保留 VTable 默认边框绘制) */
|
|
37
|
-
function createBindingBadgeStyleResolver(getBindingAt) {
|
|
38
|
-
return (addr, base) => {
|
|
39
|
-
const binding = getBindingAt(addr);
|
|
40
|
-
if (!binding) return base;
|
|
41
|
-
const { cell } = resolveBadgeColor(binding);
|
|
42
|
-
return {
|
|
43
|
-
...base,
|
|
44
|
-
fill: { color: cell }
|
|
45
|
-
};
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 单元格对齐 → 徽章容器 flex 布局映射(纯函数,便于单测):
|
|
50
|
-
* `horizontal` left / 缺省 → 主轴起点;`vertical` middle / 缺省 → 交叉轴居中。
|
|
51
|
-
*/
|
|
52
|
-
function badgeLayoutProps(align) {
|
|
53
|
-
return {
|
|
54
|
-
justifyContent: align?.horizontal === "center" ? "center" : align?.horizontal === "right" ? "flex-end" : "flex-start",
|
|
55
|
-
alignItems: align?.vertical === "top" ? "flex-start" : align?.vertical === "bottom" ? "flex-end" : "center"
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* 绑定格富渲染徽章(ADR-0004 `resolveCellRenderer` 首个消费者):
|
|
60
|
-
* 绑定单元格渲染为徽章布局(强调色聚合标签 + 中性色字段标签),
|
|
61
|
-
* 布局跟随单元格水平 / 垂直对齐(经 `resolveAlign` 读有效样式);
|
|
62
|
-
* 未绑定格返回 `undefined` 回落默认渲染。
|
|
63
|
-
*/
|
|
64
|
-
function createBindingBadgeRenderer(getBindingAt, resolveLabel, resolveAlign) {
|
|
65
|
-
return (addr) => {
|
|
66
|
-
const binding = getBindingAt(addr);
|
|
67
|
-
if (!binding) return void 0;
|
|
68
|
-
const { fg } = resolveBadgeColor(binding);
|
|
69
|
-
const { tag, label } = formatBindingPlaceholderParts(binding, resolveLabel);
|
|
70
|
-
const { justifyContent, alignItems } = badgeLayoutProps(resolveAlign?.(addr));
|
|
71
|
-
const rootContainer = new CustomLayout.Container({
|
|
72
|
-
display: "flex",
|
|
73
|
-
flexDirection: "row",
|
|
74
|
-
justifyContent,
|
|
75
|
-
alignItems
|
|
76
|
-
});
|
|
77
|
-
const tagEl = new CustomLayout.Tag({
|
|
78
|
-
text: tag,
|
|
79
|
-
textStyle: {
|
|
80
|
-
fontSize: 10,
|
|
81
|
-
fontWeight: 600,
|
|
82
|
-
fill: "#ffffff"
|
|
83
|
-
},
|
|
84
|
-
panel: {
|
|
85
|
-
visible: true,
|
|
86
|
-
fill: fg,
|
|
87
|
-
cornerRadius: 3
|
|
88
|
-
},
|
|
89
|
-
padding: [
|
|
90
|
-
1,
|
|
91
|
-
4,
|
|
92
|
-
1,
|
|
93
|
-
4
|
|
94
|
-
],
|
|
95
|
-
marginLeft: 6,
|
|
96
|
-
marginRight: 5
|
|
97
|
-
});
|
|
98
|
-
rootContainer.add(tagEl);
|
|
99
|
-
rootContainer.add(new CustomLayout.Text({
|
|
100
|
-
text: label,
|
|
101
|
-
fontSize: 11,
|
|
102
|
-
fontWeight: 500,
|
|
103
|
-
fill: BADGE_LABEL_COLOR
|
|
104
|
-
}));
|
|
105
|
-
if (binding.drill) rootContainer.add(new CustomLayout.Text({
|
|
106
|
-
text: " ↗",
|
|
107
|
-
fontSize: 11,
|
|
108
|
-
fontWeight: 700,
|
|
109
|
-
fill: fg
|
|
110
|
-
}));
|
|
111
|
-
return {
|
|
112
|
-
rootContainer,
|
|
113
|
-
renderDefault: false
|
|
114
|
-
};
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
//#endregion
|
|
118
|
-
export { REPORT_PRESET_BADGE_COLORS, badgeLayoutProps, createBindingBadgeRenderer, createBindingBadgeStyleResolver };
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
function resolveGridOverlayLayout(host) {
|
|
2
|
-
const gridEl = host.querySelector(".u-sheet__grid-instance");
|
|
3
|
-
if (!gridEl) return null;
|
|
4
|
-
const hostBox = host.getBoundingClientRect();
|
|
5
|
-
const gridBox = gridEl.getBoundingClientRect();
|
|
6
|
-
return {
|
|
7
|
-
gridEl,
|
|
8
|
-
layout: {
|
|
9
|
-
offsetX: gridBox.left - hostBox.left,
|
|
10
|
-
offsetY: gridBox.top - hostBox.top,
|
|
11
|
-
viewW: gridEl.clientWidth,
|
|
12
|
-
viewH: gridEl.clientHeight
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
/** 将屏幕坐标换算为网格落点地址(用于字段拖拽 bind) */
|
|
17
|
-
function resolveGridDropAddress(grid, gridEl, clientX, clientY) {
|
|
18
|
-
const rect = gridEl.getBoundingClientRect();
|
|
19
|
-
return grid.hitTestSheetAddr(clientX - rect.left, clientY - rect.top) ?? null;
|
|
20
|
-
}
|
|
21
|
-
function getCellOverlayRect(grid, cell, layout) {
|
|
22
|
-
const table = grid.getTable();
|
|
23
|
-
let cellRect;
|
|
24
|
-
try {
|
|
25
|
-
cellRect = table.getCellRelativeRect(cell.col + 1, cell.row + 1);
|
|
26
|
-
} catch {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
const left = layout.offsetX + cellRect.left;
|
|
30
|
-
const top = layout.offsetY + cellRect.top;
|
|
31
|
-
const right = layout.offsetX + cellRect.right;
|
|
32
|
-
const bottom = layout.offsetY + cellRect.bottom;
|
|
33
|
-
if (cellRect.bottom < 0 || cellRect.right < 0 || cellRect.top > layout.viewH || cellRect.left > layout.viewW) return null;
|
|
34
|
-
return {
|
|
35
|
-
left,
|
|
36
|
-
top,
|
|
37
|
-
right,
|
|
38
|
-
bottom,
|
|
39
|
-
width: right - left,
|
|
40
|
-
height: bottom - top,
|
|
41
|
-
centerX: (left + right) / 2,
|
|
42
|
-
centerY: (top + bottom) / 2
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
//#endregion
|
|
46
|
-
export { getCellOverlayRect, resolveGridDropAddress, resolveGridOverlayLayout };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
//#region src/components/report/designer/col-widths.ts
|
|
2
|
-
/** 行号列数(隐藏行头时为 0;与 GridCoords 探测一致) */
|
|
3
|
-
function seriesNumberColCount(table) {
|
|
4
|
-
const rowOffset = table.columnHeaderLevelCount;
|
|
5
|
-
let col = 0;
|
|
6
|
-
while (col < table.colCount && table.isSeriesNumber(col, rowOffset)) col++;
|
|
7
|
-
return col;
|
|
8
|
-
}
|
|
9
|
-
/** 将模型列宽写入 VTable(模型 → grid 同步辅助) */
|
|
10
|
-
function applyGridColWidths(grid, widths) {
|
|
11
|
-
if (!grid) return;
|
|
12
|
-
const table = grid.getTable();
|
|
13
|
-
const colOffset = seriesNumberColCount(table);
|
|
14
|
-
for (const [sheetCol, width] of widths) table.setColWidth(sheetCol + colOffset, width);
|
|
15
|
-
}
|
|
16
|
-
/** 把列宽条目写入 Sheet 模型(不进 undo,对称 setColWidth) */
|
|
17
|
-
function applySheetColWidths(sheet, widths) {
|
|
18
|
-
if (!sheet) return;
|
|
19
|
-
for (const [col, width] of widths) sheet.setColWidth(col, width);
|
|
20
|
-
}
|
|
21
|
-
/** 从当前网格读取指定模型列宽度;网格未就绪时返回 null */
|
|
22
|
-
function readGridColWidths(grid, cols) {
|
|
23
|
-
if (!grid) return null;
|
|
24
|
-
const table = grid.getTable();
|
|
25
|
-
const colOffset = seriesNumberColCount(table);
|
|
26
|
-
return cols.map((sheetCol) => [sheetCol, table.getColWidth(sheetCol + colOffset)]);
|
|
27
|
-
}
|
|
28
|
-
//#endregion
|
|
29
|
-
export { applyGridColWidths, applySheetColWidths, readGridColWidths };
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
//#region src/components/report/designer/conditional-rules/helpers.ts
|
|
2
|
-
const OPERATOR_LABELS = {
|
|
3
|
-
gt: "大于",
|
|
4
|
-
gte: "大于等于",
|
|
5
|
-
lt: "小于",
|
|
6
|
-
lte: "小于等于",
|
|
7
|
-
eq: "等于",
|
|
8
|
-
between: "介于",
|
|
9
|
-
contains: "包含"
|
|
10
|
-
};
|
|
11
|
-
const RULE_SCOPE_OPTIONS = [{
|
|
12
|
-
value: "cell",
|
|
13
|
-
label: "本格"
|
|
14
|
-
}, {
|
|
15
|
-
value: "row",
|
|
16
|
-
label: "整行"
|
|
17
|
-
}];
|
|
18
|
-
/** 求值字段下拉:缺省项表示本格绑定字段 */
|
|
19
|
-
function ruleEvalFieldOptions(bindingField, datasetFields) {
|
|
20
|
-
return [{
|
|
21
|
-
value: "",
|
|
22
|
-
label: "本格字段"
|
|
23
|
-
}, ...datasetFields.filter((field) => field.name !== bindingField).map((field) => ({
|
|
24
|
-
value: field.name,
|
|
25
|
-
label: field.label || field.name
|
|
26
|
-
}))];
|
|
27
|
-
}
|
|
28
|
-
/** 按规则所选求值字段解析字段类型(运算符映射用) */
|
|
29
|
-
function resolveEvalFieldType(rule, bindingField, datasetFields) {
|
|
30
|
-
const fieldName = rule.field ?? bindingField;
|
|
31
|
-
return datasetFields.find((field) => field.name === fieldName)?.type ?? "number";
|
|
32
|
-
}
|
|
33
|
-
const NUMERIC_OPERATORS = [
|
|
34
|
-
"gt",
|
|
35
|
-
"gte",
|
|
36
|
-
"lt",
|
|
37
|
-
"lte",
|
|
38
|
-
"eq",
|
|
39
|
-
"between"
|
|
40
|
-
];
|
|
41
|
-
const STRING_OPERATORS = ["eq", "contains"];
|
|
42
|
-
let draftIdSeq = 0;
|
|
43
|
-
function nextDraftId() {
|
|
44
|
-
draftIdSeq += 1;
|
|
45
|
-
return `rule-${draftIdSeq}`;
|
|
46
|
-
}
|
|
47
|
-
/** 按字段类型返回可用运算符 */
|
|
48
|
-
function operatorsForFieldType(fieldType) {
|
|
49
|
-
return (fieldType === "string" ? STRING_OPERATORS : NUMERIC_OPERATORS).map((value) => ({
|
|
50
|
-
value,
|
|
51
|
-
label: OPERATOR_LABELS[value]
|
|
52
|
-
}));
|
|
53
|
-
}
|
|
54
|
-
function isNumericFieldType(fieldType) {
|
|
55
|
-
return fieldType === "number" || fieldType === "date";
|
|
56
|
-
}
|
|
57
|
-
function defaultRuleValue(operator, fieldType) {
|
|
58
|
-
if (operator === "between") return isNumericFieldType(fieldType) ? [0, 100] : ["", ""];
|
|
59
|
-
if (operator === "contains" || operator === "eq" && fieldType === "string") return "";
|
|
60
|
-
return 0;
|
|
61
|
-
}
|
|
62
|
-
function defaultRuleStyle() {
|
|
63
|
-
return {
|
|
64
|
-
fill: { color: "#FEF3C7" },
|
|
65
|
-
font: { color: "#B45309" }
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
function createDraftItem(rule, fieldType = "number", _bindingField) {
|
|
69
|
-
if (rule) return {
|
|
70
|
-
id: nextDraftId(),
|
|
71
|
-
rule: cloneRule(rule)
|
|
72
|
-
};
|
|
73
|
-
const operator = operatorsForFieldType(fieldType)[0]?.value ?? "eq";
|
|
74
|
-
return {
|
|
75
|
-
id: nextDraftId(),
|
|
76
|
-
rule: {
|
|
77
|
-
operator,
|
|
78
|
-
value: defaultRuleValue(operator, fieldType),
|
|
79
|
-
style: defaultRuleStyle()
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
function initDraftFromRules(rules, fieldType, bindingField) {
|
|
84
|
-
if (rules.length === 0) return [];
|
|
85
|
-
return rules.map((rule) => createDraftItem(rule, fieldType, bindingField));
|
|
86
|
-
}
|
|
87
|
-
function cloneRule(rule) {
|
|
88
|
-
return {
|
|
89
|
-
operator: rule.operator,
|
|
90
|
-
value: cloneRuleValue(rule.value),
|
|
91
|
-
field: rule.field,
|
|
92
|
-
scope: rule.scope,
|
|
93
|
-
style: {
|
|
94
|
-
...rule.style,
|
|
95
|
-
fill: rule.style.fill ? { ...rule.style.fill } : void 0,
|
|
96
|
-
font: rule.style.font ? { ...rule.style.font } : void 0
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
function cloneRuleValue(value) {
|
|
101
|
-
if (Array.isArray(value)) return [...value];
|
|
102
|
-
return value;
|
|
103
|
-
}
|
|
104
|
-
function cloneRulesFromDraft(items) {
|
|
105
|
-
return items.map((item) => cloneRule(item.rule));
|
|
106
|
-
}
|
|
107
|
-
/** 运算符切换时重置比较值为合理缺省 */
|
|
108
|
-
function coerceValueForOperator(operator, fieldType, current) {
|
|
109
|
-
if (operator === "between") {
|
|
110
|
-
if (Array.isArray(current) && current.length === 2) return [...current];
|
|
111
|
-
return defaultRuleValue("between", fieldType);
|
|
112
|
-
}
|
|
113
|
-
if (operator === "contains") return typeof current === "string" ? current : "";
|
|
114
|
-
if (isNumericFieldType(fieldType)) {
|
|
115
|
-
const n = typeof current === "number" && Number.isFinite(current) ? current : Number(current);
|
|
116
|
-
return Number.isFinite(n) ? n : 0;
|
|
117
|
-
}
|
|
118
|
-
return typeof current === "string" ? current : "";
|
|
119
|
-
}
|
|
120
|
-
function toDisplayString(value) {
|
|
121
|
-
if (typeof value === "string") return value;
|
|
122
|
-
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") return String(value);
|
|
123
|
-
return "";
|
|
124
|
-
}
|
|
125
|
-
function readBetweenValue(value, index, fieldType) {
|
|
126
|
-
const raw = (Array.isArray(value) && value.length === 2 ? value : defaultRuleValue("between", fieldType))[index];
|
|
127
|
-
if (isNumericFieldType(fieldType)) {
|
|
128
|
-
const n = typeof raw === "number" ? raw : Number(raw);
|
|
129
|
-
return Number.isFinite(n) ? n : 0;
|
|
130
|
-
}
|
|
131
|
-
return typeof raw === "string" ? raw : toDisplayString(raw);
|
|
132
|
-
}
|
|
133
|
-
function writeBetweenValue(value, index, next, fieldType) {
|
|
134
|
-
const pair = [readBetweenValue(value, 0, fieldType), readBetweenValue(value, 1, fieldType)];
|
|
135
|
-
pair[index] = next;
|
|
136
|
-
return pair;
|
|
137
|
-
}
|
|
138
|
-
//#endregion
|
|
139
|
-
export { OPERATOR_LABELS, RULE_SCOPE_OPTIONS, cloneRule, cloneRulesFromDraft, coerceValueForOperator, createDraftItem, defaultRuleStyle, defaultRuleValue, initDraftFromRules, isNumericFieldType, operatorsForFieldType, readBetweenValue, resolveEvalFieldType, ruleEvalFieldOptions, writeBetweenValue };
|