x-print-designer 0.4.28 → 0.4.42
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/README.md +392 -0
- package/dist/{JsBarcode-DSibbGlC.js → JsBarcode-CECdI86m.js} +1 -1
- package/dist/{JsBarcode-DnTB2TYK.js → JsBarcode-DJOhOA0M.js} +1 -1
- package/dist/{browser-DG3U5_to.js → browser-BRqImYbl.js} +1 -1
- package/dist/{browser-CGxtUZAc.js → browser-Dzsc4Gy5.js} +1 -1
- package/dist/{dom-to-image-more.min-skzBroxH.js → dom-to-image-more.min-C_XiZUaT.js} +1 -1
- package/dist/{index-B-wpcX07.js → index-CQixnPpt.js} +7722 -4553
- package/dist/{index-tzwKDb5_.js → index-D4aOsQY_.js} +1 -1
- package/dist/{index.es-BVS6FbmC.js → index.es-Ch6y9Iyi.js} +1 -1
- package/dist/{jspdf.es.min-64TFryHQ.js → jspdf.es.min-BY5Xfz5v.js} +1 -1
- package/dist/{jszip.min-C-iB5bAt.js → jszip.min-CrajC7IR.js} +1 -1
- package/dist/print-designer.css +1 -1
- package/dist/print-designer.es.js +14 -2
- package/dist/print-designer.umd.js +39 -39
- package/dist/{vue-DvM51Rdu.js → vue-D8wYXHHD.js} +2730 -1004
- package/dist/vue.css +1 -1
- package/dist/vue.es.js +13 -1
- package/dist/web-component.d.ts +42 -5
- package/docs/designs/2026-08-12-floating-typography-toolbar-design.md +126 -0
- package/docs/designs/2026-08-12-mark3d-flight-player-design.md +148 -0
- package/docs/designs/2026-08-12-onboarding-element-operations-design.md +96 -0
- package/docs/designs/2026-08-12-table-column-picker-design.md +88 -0
- package/docs/designs/2026-08-12-table-data-wizard-design.md +98 -0
- package/docs/designs/2026-08-12-toolbar-context-aware-formatting-design.md +137 -0
- package/docs/designs/2026-08-12-toolbar-usage-fixes-design.md +118 -0
- package/docs/designs/2026-08-12-toolbar-verification-design.md +99 -0
- package/docs/designs/2026-08-12-unify-text-rich-text-design.md +114 -0
- package/docs/plans/2026-08-12-floating-typography-toolbar-workflow.md +87 -0
- package/docs/plans/2026-08-12-mark3d-flight-player-workflow.md +108 -0
- package/docs/plans/2026-08-12-onboarding-element-operations-workflow.md +74 -0
- package/docs/plans/2026-08-12-table-column-picker-workflow.md +121 -0
- package/docs/plans/2026-08-12-table-data-wizard-workflow.md +114 -0
- package/docs/plans/2026-08-12-toolbar-context-aware-formatting-workflow.md +132 -0
- package/docs/plans/2026-08-12-toolbar-usage-fixes-workflow.md +129 -0
- package/docs/plans/2026-08-12-toolbar-verification-workflow.md +172 -0
- package/docs/plans/2026-08-12-unify-text-rich-text-workflow.md +129 -0
- package/docs/reports/2026-08-12-element-overflow-bug-report.md +183 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -83,6 +83,80 @@ pnpm build:wc
|
|
|
83
83
|
|
|
84
84
|
**适用于:** Vue 3 项目以一等公民组件方式接入。`XPrintDesigner` 是 Web Component 的 Vue 适配层:props 声明式传参、事件自动透传、ref 暴露常用方法,**无需手动管理 `ready` 时序**。
|
|
85
85
|
|
|
86
|
+
#### 基础用法(简化版)
|
|
87
|
+
|
|
88
|
+
使用新增的工具函数,**从 700 行减少到 30 行**:
|
|
89
|
+
|
|
90
|
+
```vue
|
|
91
|
+
<template>
|
|
92
|
+
<XPrintDesigner
|
|
93
|
+
:config="config"
|
|
94
|
+
@checklist="onChecklist"
|
|
95
|
+
@printed="onPrinted"
|
|
96
|
+
/>
|
|
97
|
+
</template>
|
|
98
|
+
|
|
99
|
+
<script setup lang="ts">
|
|
100
|
+
import { ref } from 'vue'
|
|
101
|
+
import { XPrintDesigner, createRestfulAdapter, buildFieldDictionary } from 'x-print-designer'
|
|
102
|
+
import 'x-print-designer/style.css'
|
|
103
|
+
|
|
104
|
+
// ✅ 使用 CRUD 适配器工厂(从 80 行减少到 10 行)
|
|
105
|
+
const crudAdapter = createRestfulAdapter({
|
|
106
|
+
baseURL: '/backend',
|
|
107
|
+
endpoints: {
|
|
108
|
+
list: '/report/template/list',
|
|
109
|
+
get: '/report/template/detail/:id',
|
|
110
|
+
upsert: '/report/template/edit',
|
|
111
|
+
},
|
|
112
|
+
transform: {
|
|
113
|
+
request: (data) => ({
|
|
114
|
+
id: data.id,
|
|
115
|
+
name: data.name,
|
|
116
|
+
templateJson: JSON.stringify(data.data)
|
|
117
|
+
}),
|
|
118
|
+
response: (res) => res.records.map(r => ({
|
|
119
|
+
id: r.id,
|
|
120
|
+
name: r.name,
|
|
121
|
+
data: JSON.parse(r.templateJson)
|
|
122
|
+
}))
|
|
123
|
+
},
|
|
124
|
+
onSave: async (data) => {
|
|
125
|
+
await editTemplate(data)
|
|
126
|
+
ElMessage.success('保存成功')
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
// ✅ 使用字段字典工具函数(从 40 行减少到 3 行)
|
|
131
|
+
const fieldDictionary = ref({})
|
|
132
|
+
async function loadFieldDictionary() {
|
|
133
|
+
const modules = await getReportTemplateFields(['media', 'device', 'wayline'])
|
|
134
|
+
fieldDictionary.value = buildFieldDictionary(modules, { autoResolveConflicts: true })
|
|
135
|
+
}
|
|
136
|
+
loadFieldDictionary()
|
|
137
|
+
|
|
138
|
+
const config = ref({
|
|
139
|
+
mode: 'template',
|
|
140
|
+
testData: { id: 1, title: '报告标题', items: [{ name: '产品A', price: 100 }] },
|
|
141
|
+
crud: {
|
|
142
|
+
mode: 'remote',
|
|
143
|
+
endpoints: crudAdapter.endpoints,
|
|
144
|
+
config: { fetcher: crudAdapter.fetcher }
|
|
145
|
+
},
|
|
146
|
+
fieldDictionary: fieldDictionary.value
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
const onChecklist = (detail) => {
|
|
150
|
+
console.log('接入自检', detail.checks, '全部通过:', detail.allPassed)
|
|
151
|
+
}
|
|
152
|
+
const onPrinted = (detail) => {
|
|
153
|
+
console.log('打印完成', detail)
|
|
154
|
+
}
|
|
155
|
+
</script>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### 完整示例(不使用工具函数)
|
|
159
|
+
|
|
86
160
|
```vue
|
|
87
161
|
<template>
|
|
88
162
|
<XPrintDesigner
|
|
@@ -788,6 +862,324 @@ el.setCrudMode('remote') // 保存/删除/加载走远程 API;local 为默认
|
|
|
788
862
|
|
|
789
863
|
---
|
|
790
864
|
|
|
865
|
+
## 工具函数(v0.4.39+ 新增)
|
|
866
|
+
|
|
867
|
+
为了降低宿主接入门槛,插件提供了开箱即用的工具函数,**将常见配置从数百行简化到几行**。
|
|
868
|
+
|
|
869
|
+
### 1. CRUD 适配器工厂 `createRestfulAdapter`
|
|
870
|
+
|
|
871
|
+
**问题:** 宿主需要写 80+ 行 `fetcher` 逻辑来适配后端 API。
|
|
872
|
+
|
|
873
|
+
**解决:** 使用适配器工厂,**从 80 行减少到 10 行**。
|
|
874
|
+
|
|
875
|
+
```ts
|
|
876
|
+
import { createRestfulAdapter, adapterPresets } from 'x-print-designer'
|
|
877
|
+
|
|
878
|
+
// 方式一:使用预设(Spring Boot / Laravel / Express)
|
|
879
|
+
const adapter = createRestfulAdapter({
|
|
880
|
+
...adapterPresets.springBoot('/api'), // 自动配置端点路径
|
|
881
|
+
transform: {
|
|
882
|
+
request: (data) => ({
|
|
883
|
+
id: data.id,
|
|
884
|
+
name: data.name,
|
|
885
|
+
templateJson: JSON.stringify(data.data)
|
|
886
|
+
}),
|
|
887
|
+
response: (res) => res.records.map(r => ({
|
|
888
|
+
id: r.id,
|
|
889
|
+
name: r.name,
|
|
890
|
+
data: JSON.parse(r.templateJson)
|
|
891
|
+
}))
|
|
892
|
+
},
|
|
893
|
+
onSave: async (data) => {
|
|
894
|
+
await editTemplate(data)
|
|
895
|
+
ElMessage.success('保存成功')
|
|
896
|
+
}
|
|
897
|
+
})
|
|
898
|
+
|
|
899
|
+
// 方式二:自定义端点路径
|
|
900
|
+
const adapter = createRestfulAdapter({
|
|
901
|
+
baseURL: '/backend',
|
|
902
|
+
endpoints: {
|
|
903
|
+
list: '/report/template/list',
|
|
904
|
+
get: '/report/template/detail/:id', // 支持 :id 占位符
|
|
905
|
+
upsert: '/report/template/edit',
|
|
906
|
+
delete: '/report/template/delete/:id'
|
|
907
|
+
},
|
|
908
|
+
transform: { /* ... */ },
|
|
909
|
+
onSave: async (data) => { /* ... */ },
|
|
910
|
+
onError: (error, operation) => {
|
|
911
|
+
console.error(`Operation ${operation} failed:`, error)
|
|
912
|
+
}
|
|
913
|
+
})
|
|
914
|
+
|
|
915
|
+
// 应用到设计器
|
|
916
|
+
designerEl.setCrudEndpoints(adapter.endpoints, { fetcher: adapter.fetcher })
|
|
917
|
+
```
|
|
918
|
+
|
|
919
|
+
**API:**
|
|
920
|
+
|
|
921
|
+
```ts
|
|
922
|
+
interface RestfulAdapterConfig {
|
|
923
|
+
baseURL: string
|
|
924
|
+
endpoints: {
|
|
925
|
+
list: string
|
|
926
|
+
get: string // 支持 :id 占位符
|
|
927
|
+
upsert: string
|
|
928
|
+
delete?: string
|
|
929
|
+
}
|
|
930
|
+
transform?: {
|
|
931
|
+
request?: (data: any) => any // 请求数据转换(保存时)
|
|
932
|
+
response?: (data: any) => any // 响应数据转换(列表/详情)
|
|
933
|
+
}
|
|
934
|
+
onSave?: (data: any) => void | Promise<void>
|
|
935
|
+
onDelete?: (id: string) => void | Promise<void>
|
|
936
|
+
headers?: Record<string, string>
|
|
937
|
+
onError?: (error: Error, operation: 'list' | 'get' | 'upsert' | 'delete') => void
|
|
938
|
+
}
|
|
939
|
+
```
|
|
940
|
+
|
|
941
|
+
### 2. 字段字典工具 `buildFieldDictionary`
|
|
942
|
+
|
|
943
|
+
**问题:** 需要手动构建 40+ 行字典映射逻辑,处理字段冲突、模块前缀等。
|
|
944
|
+
|
|
945
|
+
**解决:** 使用工具函数,**从 40 行减少到 3 行**。
|
|
946
|
+
|
|
947
|
+
```ts
|
|
948
|
+
import { buildFieldDictionary } from 'x-print-designer'
|
|
949
|
+
|
|
950
|
+
// 获取字段列表
|
|
951
|
+
const modules = await getReportTemplateFields(['media', 'device', 'wayline', 'task', 'event'])
|
|
952
|
+
|
|
953
|
+
// 一行构建字典(自动处理字段名冲突)
|
|
954
|
+
const dictionary = buildFieldDictionary(modules, {
|
|
955
|
+
autoResolveConflicts: true, // 自动添加模块前缀解决冲突
|
|
956
|
+
prefixStrategy: 'auto', // 'auto' | 'always' | 'never'
|
|
957
|
+
prefixSeparator: '.', // 分隔符
|
|
958
|
+
filter: (field, module) => field.fieldType !== 'internal' // 可选过滤器
|
|
959
|
+
})
|
|
960
|
+
|
|
961
|
+
// 应用到设计器
|
|
962
|
+
designerEl.setFieldDictionary(dictionary)
|
|
963
|
+
```
|
|
964
|
+
|
|
965
|
+
**示例输入/输出:**
|
|
966
|
+
|
|
967
|
+
```ts
|
|
968
|
+
// 输入
|
|
969
|
+
const modules = [
|
|
970
|
+
{
|
|
971
|
+
moduleKey: 'device',
|
|
972
|
+
moduleName: '设备信息',
|
|
973
|
+
fields: [
|
|
974
|
+
{ fieldKey: 'id', labelCn: '设备ID', primaryKey: true },
|
|
975
|
+
{ fieldKey: 'name', labelCn: '设备名称' }
|
|
976
|
+
]
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
moduleKey: 'task',
|
|
980
|
+
moduleName: '任务信息',
|
|
981
|
+
fields: [
|
|
982
|
+
{ fieldKey: 'id', labelCn: '任务ID', primaryKey: true },
|
|
983
|
+
{ fieldKey: 'name', labelCn: '任务名称' }
|
|
984
|
+
]
|
|
985
|
+
}
|
|
986
|
+
]
|
|
987
|
+
|
|
988
|
+
// 输出(自动解决 id 和 name 字段冲突)
|
|
989
|
+
{
|
|
990
|
+
'device.id': { fieldKey: 'id', labelCn: '设备ID', moduleKey: 'device', ... },
|
|
991
|
+
'device.name': { fieldKey: 'name', labelCn: '设备名称', moduleKey: 'device', ... },
|
|
992
|
+
'task.id': { fieldKey: 'id', labelCn: '任务ID', moduleKey: 'task', ... },
|
|
993
|
+
'task.name': { fieldKey: 'name', labelCn: '任务名称', moduleKey: 'task', ... }
|
|
994
|
+
}
|
|
995
|
+
```
|
|
996
|
+
|
|
997
|
+
**辅助函数:**
|
|
998
|
+
|
|
999
|
+
```ts
|
|
1000
|
+
import { mergeFieldDictionaries, getFieldLabel } from 'x-print-designer'
|
|
1001
|
+
|
|
1002
|
+
// 合并多个字典
|
|
1003
|
+
const merged = mergeFieldDictionaries([dict1, dict2, dict3], 'last') // 'first' | 'last'
|
|
1004
|
+
|
|
1005
|
+
// 根据语言获取标签
|
|
1006
|
+
const label = getFieldLabel(dictionary['device.name'], 'zh') // '设备名称'
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
### 3. 自动样式注入
|
|
1010
|
+
|
|
1011
|
+
**问题:** 宿主需要手动列举并注入 287 行 Tailwind/UnoCSS 样式类。
|
|
1012
|
+
|
|
1013
|
+
**解决:** 插件自动检测并注入,**0 行代码**。
|
|
1014
|
+
|
|
1015
|
+
```vue
|
|
1016
|
+
<template>
|
|
1017
|
+
<!-- ✅ 无需任何样式注入代码,插件自动检测 Tailwind/UnoCSS/Element Plus 并注入 -->
|
|
1018
|
+
<print-designer />
|
|
1019
|
+
</template>
|
|
1020
|
+
```
|
|
1021
|
+
|
|
1022
|
+
**原理:** 插件在 `connectedCallback` 时自动扫描 `document.querySelectorAll('style')`,智能检测主流 CSS 框架并克隆到 Shadow DOM。
|
|
1023
|
+
|
|
1024
|
+
**可选:禁用自动注入**
|
|
1025
|
+
|
|
1026
|
+
```html
|
|
1027
|
+
<print-designer no-auto-style></print-designer>
|
|
1028
|
+
```
|
|
1029
|
+
|
|
1030
|
+
### 4. 配置预设 `presets`
|
|
1031
|
+
|
|
1032
|
+
**问题:** 每次都要从头配置模式、UI、主题等基础设置。
|
|
1033
|
+
|
|
1034
|
+
**解决:** 使用场景预设,**1 行配置搞定**。
|
|
1035
|
+
|
|
1036
|
+
```ts
|
|
1037
|
+
import { presets, mergePreset } from 'x-print-designer'
|
|
1038
|
+
|
|
1039
|
+
// 方式一:直接使用预设
|
|
1040
|
+
const config = {
|
|
1041
|
+
...presets.uavReport, // 无人机报告场景
|
|
1042
|
+
onSave: handleSave
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
// 方式二:合并预设和自定义配置
|
|
1046
|
+
const config = mergePreset(presets.expressLabel, {
|
|
1047
|
+
branding: { title: '我的快递单设计器' },
|
|
1048
|
+
autoSave: { enabled: false }
|
|
1049
|
+
})
|
|
1050
|
+
```
|
|
1051
|
+
|
|
1052
|
+
**可用预设:**
|
|
1053
|
+
|
|
1054
|
+
| 预设名 | 场景 | 特点 |
|
|
1055
|
+
|--------|------|------|
|
|
1056
|
+
| `presets.uavReport` | 无人机报告 | report 模式 + beginner UI + 30s 自动保存 |
|
|
1057
|
+
| `presets.expressLabel` | 物流快递单 | template 模式 + expert UI + 60s 自动保存 |
|
|
1058
|
+
| `presets.invoice` | 发票/票据 | template 模式 + expert UI + 60s 自动保存 |
|
|
1059
|
+
| `presets.label` | 标签/吊牌 | template 模式 + beginner UI + 60s 自动保存 |
|
|
1060
|
+
| `presets.certificate` | 证书/证明 | template 模式 + beginner UI + 不自动保存 |
|
|
1061
|
+
| `presets.contract` | 合同/协议 | template 模式 + expert UI + 30s 自动保存 |
|
|
1062
|
+
| `presets.generalReport` | 通用报告 | report 模式 + beginner UI + 30s 自动保存 |
|
|
1063
|
+
|
|
1064
|
+
### 5. Vue Composable `useDesigner`
|
|
1065
|
+
|
|
1066
|
+
**问题:** Vue 宿主仍需手动管理 ref、ready、初始化等。
|
|
1067
|
+
|
|
1068
|
+
**解决:** 使用 composable,**自动处理一切**。
|
|
1069
|
+
|
|
1070
|
+
```vue
|
|
1071
|
+
<template>
|
|
1072
|
+
<print-designer ref="designerRef" />
|
|
1073
|
+
</template>
|
|
1074
|
+
|
|
1075
|
+
<script setup lang="ts">
|
|
1076
|
+
import { useDesigner, createRestfulAdapter } from 'x-print-designer/vue'
|
|
1077
|
+
|
|
1078
|
+
const { designerRef, ready, setData, exportPdf } = useDesigner({
|
|
1079
|
+
mode: 'template',
|
|
1080
|
+
crudAdapter: createRestfulAdapter({
|
|
1081
|
+
baseURL: '/api',
|
|
1082
|
+
endpoints: { list: '/templates', get: '/templates/:id', upsert: '/templates' },
|
|
1083
|
+
onSave: async (data) => { await saveTemplate(data) }
|
|
1084
|
+
}),
|
|
1085
|
+
fieldModules: ['media', 'device'],
|
|
1086
|
+
fieldLoader: async (modules) => {
|
|
1087
|
+
return await getReportTemplateFields(modules)
|
|
1088
|
+
},
|
|
1089
|
+
onError: (error) => {
|
|
1090
|
+
ElMessage.error('设计器错误: ' + error.message)
|
|
1091
|
+
}
|
|
1092
|
+
})
|
|
1093
|
+
|
|
1094
|
+
// ✅ 使用非常简单
|
|
1095
|
+
const handleExport = async () => {
|
|
1096
|
+
await exportPdf('我的模板.pdf')
|
|
1097
|
+
}
|
|
1098
|
+
</script>
|
|
1099
|
+
```
|
|
1100
|
+
|
|
1101
|
+
**API:**
|
|
1102
|
+
|
|
1103
|
+
```ts
|
|
1104
|
+
interface UseDesignerOptions {
|
|
1105
|
+
mode?: 'template' | 'report'
|
|
1106
|
+
uiMode?: 'beginner' | 'expert'
|
|
1107
|
+
crudAdapter?: ReturnType<typeof createRestfulAdapter>
|
|
1108
|
+
fieldModules?: string[] // 自动加载字段字典
|
|
1109
|
+
fieldLoader?: (modules: string[]) => Promise<FieldDictionaryModule[]>
|
|
1110
|
+
onSave?: (data: any) => void | Promise<void>
|
|
1111
|
+
onError?: (error: any) => void
|
|
1112
|
+
autoInit?: boolean // 默认 true
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
interface UseDesignerReturn {
|
|
1116
|
+
designerRef: Ref<any>
|
|
1117
|
+
ready: Ref<boolean>
|
|
1118
|
+
setData: (data: any) => void
|
|
1119
|
+
setTestData: (data: any) => void
|
|
1120
|
+
setVariables: (data: any) => void
|
|
1121
|
+
exportPdf: (filename?: string) => Promise<void>
|
|
1122
|
+
exportImage: (filename?: string) => Promise<void>
|
|
1123
|
+
print: (request?: any) => Promise<void>
|
|
1124
|
+
getDesignerElement: () => any
|
|
1125
|
+
init: () => Promise<void>
|
|
1126
|
+
}
|
|
1127
|
+
```
|
|
1128
|
+
|
|
1129
|
+
### 6. 诊断工具 `diagnoseIntegration`
|
|
1130
|
+
|
|
1131
|
+
**问题:** 集成出问题时不知道哪里配置错了。
|
|
1132
|
+
|
|
1133
|
+
**解决:** 使用诊断工具,**自动检查 12 项配置**。
|
|
1134
|
+
|
|
1135
|
+
```ts
|
|
1136
|
+
import { diagnoseIntegration, exportDiagnosticReport } from 'x-print-designer/diagnostics'
|
|
1137
|
+
|
|
1138
|
+
// 运行诊断
|
|
1139
|
+
const diagnosis = diagnoseIntegration(designerEl)
|
|
1140
|
+
|
|
1141
|
+
if (!diagnosis.allPassed) {
|
|
1142
|
+
console.warn('集成检查未通过:', diagnosis.failedChecks)
|
|
1143
|
+
|
|
1144
|
+
// 导出诊断报告
|
|
1145
|
+
exportDiagnosticReport(diagnosis, 'my-diagnostic.md')
|
|
1146
|
+
}
|
|
1147
|
+
```
|
|
1148
|
+
|
|
1149
|
+
**检查项:**
|
|
1150
|
+
|
|
1151
|
+
| 检查项 | 级别 | 说明 |
|
|
1152
|
+
|--------|------|------|
|
|
1153
|
+
| Element Exists | 🔴 关键 | 元素是否存在 |
|
|
1154
|
+
| Ready State | 🔴 关键 | 是否已就绪 |
|
|
1155
|
+
| Shadow DOM | 🔴 关键 | Shadow DOM 是否初始化 |
|
|
1156
|
+
| Styles Injected | 🟡 警告 | 样式是否注入 |
|
|
1157
|
+
| CRUD Configured | 🟡 警告 | CRUD 是否配置 |
|
|
1158
|
+
| Save Handler | 🟡 警告 | 保存回调是否配置 |
|
|
1159
|
+
| Data API | ℹ️ 信息 | 数据 API 是否可用 |
|
|
1160
|
+
| Print API | ℹ️ 信息 | 打印 API 是否可用 |
|
|
1161
|
+
| Export API | ℹ️ 信息 | 导出 API 是否可用 |
|
|
1162
|
+
| Monaco Loader | ℹ️ 信息 | 代码编辑器是否可用 |
|
|
1163
|
+
| Field Dictionary | ℹ️ 信息 | 字段字典是否配置 |
|
|
1164
|
+
| Auto Style Injection | ℹ️ 信息 | 自动样式注入是否生效 |
|
|
1165
|
+
|
|
1166
|
+
**诊断结果示例:**
|
|
1167
|
+
|
|
1168
|
+
```
|
|
1169
|
+
✅ [PrintDesigner] 集成检查全部通过
|
|
1170
|
+
|
|
1171
|
+
或
|
|
1172
|
+
|
|
1173
|
+
❌ 关键问题: Ready State, Shadow DOM
|
|
1174
|
+
- Ready State: 设计器尚未就绪,请等待 ready 事件
|
|
1175
|
+
- Shadow DOM: Shadow DOM 未初始化
|
|
1176
|
+
|
|
1177
|
+
⚠️ 警告: Save Handler
|
|
1178
|
+
- Save Handler: 未配置 onSave 回调,保存功能将不可用
|
|
1179
|
+
```
|
|
1180
|
+
|
|
1181
|
+
---
|
|
1182
|
+
|
|
791
1183
|
## 传入数据格式
|
|
792
1184
|
|
|
793
1185
|
### 基本要求
|