@qingflow-tech/qingflow-cli 1.1.50-beta.5 → 1.1.51
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 +4 -4
- package/npm/lib/runtime.mjs +13 -29
- package/package.json +1 -1
- package/pyproject.toml +2 -8
- package/skills/qingflow-cli/SKILL.md +322 -93
- package/skills/qingflow-cli/manifest.yaml +1 -1
- package/skills/qingflow-cli/reference/00-INDEX.md +4 -4
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_ADMIN_CHEATSHEET.md +1 -1
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_BUILDER_VIEWS_WORKFLOW.md +9 -3
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_DATA_RETRIEVAL_WORKFLOW.md +137 -3
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_EXPLORATION_REPORT.md +4 -6
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_FIELD_DATA_TYPES.md +14 -14
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_MEMBER_CHEATSHEET.md +19 -20
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_ONE_SHOT_CHEATSHEET.md +14 -18
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_RECORD_CREATE_WORKFLOW.md +12 -7
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_RECORD_UPDATE_WORKFLOW.md +1 -2
- package/skills/qingflow-cli/reference/builder/20-build-complete-system.md +2 -3
- package/skills/qingflow-cli/reference/builder/30-schema-fields.md +5 -9
- package/skills/qingflow-cli/reference/builder/50-views.md +191 -192
- package/skills/qingflow-cli/reference/builder/80-buttons-associated-resources.md +0 -2
- package/skills/qingflow-cli/reference/builder/README.md +1 -1
- package/skills/qingflow-cli/reference/builder/reference/app-delivery-sop.md +6 -6
- package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_ADMIN_CHEATSHEET.md +1 -1
- package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_DATA_RETRIEVAL_WORKFLOW.md +95 -76
- package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_EXPLORATION_REPORT.md +4 -6
- package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_FIELD_DATA_TYPES.md +13 -13
- package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_MEMBER_CHEATSHEET.md +19 -20
- package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_ONE_SHOT_CHEATSHEET.md +14 -18
- package/skills/qingflow-cli/reference/examples/README.md +1 -1
- package/skills/qingflow-cli/reference/examples/views/views_batch_full.example.json +159 -0
- package/skills/qingflow-cli/reference/examples/views/views_upsert_table_minimal.example.json +36 -30
- package/skills/qingflow-cli/reference/record/QINGFLOW_CLI_RECORD_UPDATE_WORKFLOW.md +1 -2
- package/skills/qingflow-cli/reference/record/analysis/README.md +113 -21
- package/skills/qingflow-cli/reference/record/analysis/analysis-gotchas.md +10 -10
- package/skills/qingflow-cli/reference/record/analysis/analysis-patterns.md +9 -9
- package/skills/qingflow-cli/reference/record/analysis/business-context.md +1 -1
- package/skills/qingflow-cli/reference/record/analysis/confidence-reporting.md +10 -10
- package/skills/qingflow-cli/reference/record/analysis/data-access-playbook.md +80 -52
- package/skills/qingflow-cli/reference/record/analysis/pandas-recipes.md +2 -2
- package/skills/qingflow-cli/reference/views_upsert_table_minimal.example.json +42 -0
- package/skills/qingflow-common/SKILL.md +4 -7
- package/src/qingflow_mcp/__init__.py +1 -1
- package/src/qingflow_mcp/app_form_compat.py +0 -3
- package/src/qingflow_mcp/app_form_validator.py +17 -69
- package/src/qingflow_mcp/builder_facade/app_form.py +100 -497
- package/src/qingflow_mcp/builder_facade/models.py +17 -227
- package/src/qingflow_mcp/builder_facade/schemas/app_form/manifest.json +0 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +30 -64
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +18 -11
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +15 -46
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +27 -61
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/formula.json +0 -43
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +12 -7
- package/src/qingflow_mcp/builder_facade/service.py +539 -1671
- package/src/qingflow_mcp/builder_facade/workflow_spec.py +1 -1
- package/src/qingflow_mcp/cli/commands/__init__.py +1 -2
- package/src/qingflow_mcp/cli/commands/builder.py +55 -76
- package/src/qingflow_mcp/cli/commands/record.py +1 -1
- package/src/qingflow_mcp/cli/context.py +0 -3
- package/src/qingflow_mcp/cli/formatters.py +1 -97
- package/src/qingflow_mcp/config.py +1 -0
- package/src/qingflow_mcp/public_surface.py +0 -8
- package/src/qingflow_mcp/response_trim.py +2 -11
- package/src/qingflow_mcp/server.py +0 -2
- package/src/qingflow_mcp/server_app_builder.py +10 -34
- package/src/qingflow_mcp/server_app_user.py +0 -4
- package/src/qingflow_mcp/solution/compiler/view_compiler.py +1 -2
- package/src/qingflow_mcp/solution/executor.py +8 -96
- package/src/qingflow_mcp/solution/spec_models.py +0 -1
- package/src/qingflow_mcp/tools/ai_builder_tools.py +398 -218
- package/src/qingflow_mcp/tools/base.py +42 -10
- package/src/qingflow_mcp/tools/record_tools.py +46 -11
- package/src/qingflow_mcp/tools/solution_tools.py +0 -2
- package/src/qingflow_mcp/tools/view_tools.py +6 -0
- package/skills/qingflow-cli/reference/data/README.md +0 -32
- package/skills/qingflow-cli/reference/examples/views/views_apply_v1alpha1.example.json +0 -14
- package/skills/qingflow-cli/reference/record/QINGFLOW_CLI_RECORD_SPECIALIZED_WORKFLOW.md +0 -50
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/rich_text.json +0 -146
- package/src/qingflow_mcp/builder_facade/schemas/views/manifest.json +0 -42
- package/src/qingflow_mcp/builder_facade/schemas/views/v1alpha1/complete.json +0 -1245
- package/src/qingflow_mcp/builder_facade/schemas/views/v1alpha1/details/button-config.json +0 -53
- package/src/qingflow_mcp/builder_facade/schemas/views/v1alpha1/details/data-permission.json +0 -60
- package/src/qingflow_mcp/builder_facade/schemas/views/v1alpha1/details/display.json +0 -73
- package/src/qingflow_mcp/builder_facade/schemas/views/v1alpha1/details/operation-permission.json +0 -48
- package/src/qingflow_mcp/builder_facade/schemas/views/v1alpha1/details/query-condition.json +0 -47
- package/src/qingflow_mcp/builder_facade/schemas/views/v1alpha1/summary.json +0 -319
- package/src/qingflow_mcp/builder_facade/views_extract.py +0 -592
- package/src/qingflow_mcp/builder_facade/views_schema.py +0 -400
- package/src/qingflow_mcp/cli/commands/data.py +0 -134
- package/src/qingflow_mcp/tools/csv_export.py +0 -168
- package/src/qingflow_mcp/tools/data_tools.py +0 -284
- package/src/qingflow_mcp/tools/view_writer.py +0 -44
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import re
|
|
4
4
|
from enum import Enum
|
|
5
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
from pydantic import AliasChoices, Field, model_validator
|
|
8
8
|
|
|
@@ -134,8 +134,6 @@ class PublicViewType(str, Enum):
|
|
|
134
134
|
card = "card"
|
|
135
135
|
board = "board"
|
|
136
136
|
gantt = "gantt"
|
|
137
|
-
hierarchy = "hierarchy"
|
|
138
|
-
calendar = "calendar"
|
|
139
137
|
|
|
140
138
|
|
|
141
139
|
class PublicButtonTriggerAction(str, Enum):
|
|
@@ -392,38 +390,9 @@ class FlowConditionRulePatch(StrictModel):
|
|
|
392
390
|
return self
|
|
393
391
|
|
|
394
392
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
def _coerce_que_id(value: Any) -> Any:
|
|
398
|
-
"""字段引用归一:queId(后端字段唯一键)。接受 int / "123" / "field_123"(field_id 形态) → int;
|
|
399
|
-
其余形态原样返回交给 pydantic 报错(契约诚实:不支持显示名引用)。"""
|
|
400
|
-
if isinstance(value, bool) or isinstance(value, int):
|
|
401
|
-
return value
|
|
402
|
-
if isinstance(value, str):
|
|
403
|
-
stripped = value.strip()
|
|
404
|
-
if stripped.isdigit():
|
|
405
|
-
return int(stripped)
|
|
406
|
-
if stripped.startswith("field_") and stripped[6:].isdigit():
|
|
407
|
-
return int(stripped[6:])
|
|
408
|
-
return value
|
|
409
|
-
|
|
410
393
|
class ViewFilterRulePatch(StrictModel):
|
|
411
|
-
|
|
394
|
+
field_name: str = Field(validation_alias=AliasChoices("field_name", "fieldName", "field", "name"))
|
|
412
395
|
operator: ViewFilterOperator = Field(default=ViewFilterOperator.eq, validation_alias=AliasChoices("operator", "op"))
|
|
413
|
-
|
|
414
|
-
@model_validator(mode="before")
|
|
415
|
-
@classmethod
|
|
416
|
-
def normalize_que_id(cls, value: Any) -> Any:
|
|
417
|
-
if isinstance(value, dict):
|
|
418
|
-
for alias in ("queId", "field_id", "fieldId"):
|
|
419
|
-
if alias in value and "que_id" not in value:
|
|
420
|
-
value = {**{k: v for k, v in value.items() if k != alias}, "que_id": value[alias]}
|
|
421
|
-
break
|
|
422
|
-
for alias in ("queId", "field_id", "fieldId"):
|
|
423
|
-
value.pop(alias, None) if alias != "que_id" else None
|
|
424
|
-
if isinstance(value, dict) and "que_id" in value:
|
|
425
|
-
return {**value, "que_id": _coerce_que_id(value["que_id"])}
|
|
426
|
-
return value
|
|
427
396
|
values: list[Any] = Field(default_factory=list)
|
|
428
397
|
|
|
429
398
|
@model_validator(mode="before")
|
|
@@ -436,18 +405,11 @@ class ViewFilterRulePatch(StrictModel):
|
|
|
436
405
|
if self.operator in {ViewFilterOperator.is_empty, ViewFilterOperator.not_empty}:
|
|
437
406
|
self.values = []
|
|
438
407
|
return self
|
|
439
|
-
if not self.values
|
|
440
|
-
# in+空值合法:选项/成员类字段"ANY 判型未选任何值"的存量形态
|
|
441
|
-
# (后端 judgeType=EQUAL_ANY+空值,实测回写稳定保留)
|
|
408
|
+
if not self.values:
|
|
442
409
|
raise ValueError("view filter rule requires values")
|
|
443
410
|
return self
|
|
444
411
|
|
|
445
412
|
|
|
446
|
-
# 视图筛选双形态(与 visible_when/root_filter 的嵌组形态对齐):
|
|
447
|
-
# 扁平 [rule, ...] = 单组 AND(向后兼容);嵌套 [[rule,...],[rule,...]] = 组间 OR、组内 AND
|
|
448
|
-
ViewFilterGroupPatch = Union[ViewFilterRulePatch, list[ViewFilterRulePatch]]
|
|
449
|
-
|
|
450
|
-
|
|
451
413
|
class FieldSelector(StrictModel):
|
|
452
414
|
field_id: str | None = None
|
|
453
415
|
que_id: int | None = None
|
|
@@ -582,14 +544,16 @@ class VisibilityPatch(StrictModel):
|
|
|
582
544
|
|
|
583
545
|
@model_validator(mode="after")
|
|
584
546
|
def validate_shape(self) -> "VisibilityPatch":
|
|
585
|
-
|
|
586
|
-
|
|
547
|
+
if self.mode == PublicVisibilityMode.specific and not self.selectors.has_any_selector():
|
|
548
|
+
raise ValueError("specific visibility requires selectors")
|
|
587
549
|
if self.mode != PublicVisibilityMode.specific and self.selectors.has_any_selector():
|
|
588
550
|
raise ValueError("selectors are only allowed when mode=specific")
|
|
589
551
|
if self.mode == PublicVisibilityMode.everyone and self.external_mode != PublicExternalVisibilityMode.workspace:
|
|
590
552
|
raise ValueError("mode=everyone requires external_mode=workspace")
|
|
591
553
|
if self.mode == PublicVisibilityMode.everyone and self.external_selectors.has_any_selector():
|
|
592
554
|
raise ValueError("external_selectors are not allowed when mode=everyone")
|
|
555
|
+
if self.external_mode == PublicExternalVisibilityMode.specific and not self.external_selectors.has_any_selector():
|
|
556
|
+
raise ValueError("external_mode=specific requires external_selectors")
|
|
593
557
|
if self.external_mode != PublicExternalVisibilityMode.specific and self.external_selectors.has_any_selector():
|
|
594
558
|
raise ValueError("external_selectors are only allowed when external_mode=specific")
|
|
595
559
|
return self
|
|
@@ -1173,149 +1137,6 @@ class ViewQueryConditionsPatch(StrictModel):
|
|
|
1173
1137
|
rows: list[list[str | int]] = Field(default_factory=list, validation_alias=AliasChoices("rows", "fields", "queryCondition"))
|
|
1174
1138
|
|
|
1175
1139
|
|
|
1176
|
-
class ViewDataPermissionPatch(StrictModel):
|
|
1177
|
-
"""数据权限形状(公开语义)→ dataPermissionType + dataScope。"""
|
|
1178
|
-
|
|
1179
|
-
type: str = Field(default="custom", validation_alias=AliasChoices("type", "permission_type", "permissionType"))
|
|
1180
|
-
scope: str = Field(default="all", validation_alias=AliasChoices("scope", "data_scope", "dataScope"))
|
|
1181
|
-
|
|
1182
|
-
@model_validator(mode="after")
|
|
1183
|
-
def validate_shape(self) -> "ViewDataPermissionPatch":
|
|
1184
|
-
if self.type not in {"config", "custom"}:
|
|
1185
|
-
raise ValueError("data_permission.type must be config or custom")
|
|
1186
|
-
if self.scope not in {"all", "oneself", "dept", "subordinate", "custom"}:
|
|
1187
|
-
raise ValueError("data_permission.scope must be one of all/oneself/dept/subordinate/custom")
|
|
1188
|
-
return self
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
class ViewSortRulePatch(StrictModel):
|
|
1192
|
-
"""排序规则(公开语义)→ viewgraphSorts + sortType=customSort。"""
|
|
1193
|
-
|
|
1194
|
-
que_id: int = Field(validation_alias=AliasChoices("que_id", "queId", "field_id", "fieldId"))
|
|
1195
|
-
ascending: bool = Field(default=True, validation_alias=AliasChoices("ascending", "asc", "beingSortAscend"))
|
|
1196
|
-
|
|
1197
|
-
@model_validator(mode="before")
|
|
1198
|
-
@classmethod
|
|
1199
|
-
def normalize_que_id(cls, value: Any) -> Any:
|
|
1200
|
-
if isinstance(value, dict):
|
|
1201
|
-
for alias in ("queId", "field_id", "fieldId"):
|
|
1202
|
-
if alias in value and "que_id" not in value:
|
|
1203
|
-
value = {**{k: v for k, v in value.items() if k != alias}, "que_id": value[alias]}
|
|
1204
|
-
break
|
|
1205
|
-
for alias in ("queId", "field_id", "fieldId"):
|
|
1206
|
-
value.pop(alias, None) if alias != "que_id" else None
|
|
1207
|
-
if isinstance(value, dict) and "que_id" in value:
|
|
1208
|
-
return {**value, "que_id": _coerce_que_id(value["que_id"])}
|
|
1209
|
-
return value
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
class ViewCardConfigPatch(StrictModel):
|
|
1213
|
-
"""卡片视图特有配置 → titleQue/frontCoverQueId/clippingMode/... 。"""
|
|
1214
|
-
|
|
1215
|
-
title_que_id: int | None = Field(default=None, validation_alias=AliasChoices("title_que_id", "titleQueId"))
|
|
1216
|
-
cover_que_id: int | None = Field(default=None, validation_alias=AliasChoices("cover_que_id", "coverQueId", "front_cover_que_id", "frontCoverQueId"))
|
|
1217
|
-
clipping_mode: str | None = Field(default=None, validation_alias=AliasChoices("clipping_mode", "clippingMode"))
|
|
1218
|
-
image_adaption: bool | None = Field(default=None, validation_alias=AliasChoices("image_adaption", "imageAdaption", "beingImageAdaption"))
|
|
1219
|
-
show_field_title: bool | None = Field(default=None, validation_alias=AliasChoices("show_field_title", "showFieldTitle", "beingShowQueTitle"))
|
|
1220
|
-
show_title: bool | None = Field(default=None, validation_alias=AliasChoices("show_title", "showTitle", "beingShowTitleQue"))
|
|
1221
|
-
show_cover: bool | None = Field(default=None, validation_alias=AliasChoices("show_cover", "showCover", "beingShowCover"))
|
|
1222
|
-
group_que_id: int | None = Field(default=None, validation_alias=AliasChoices("group_que_id", "groupQueId"))
|
|
1223
|
-
group_color: bool | None = Field(default=None, validation_alias=AliasChoices("group_color", "groupColor", "beingGroupColor"))
|
|
1224
|
-
|
|
1225
|
-
@model_validator(mode="after")
|
|
1226
|
-
def validate_shape(self) -> "ViewCardConfigPatch":
|
|
1227
|
-
if self.clipping_mode is not None and self.clipping_mode not in {"default", "fill"}:
|
|
1228
|
-
raise ValueError("card.clipping_mode must be default or fill")
|
|
1229
|
-
return self
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
class ViewGanttGroupPatch(StrictModel):
|
|
1233
|
-
que_id: int = Field(validation_alias=AliasChoices("que_id", "queId"))
|
|
1234
|
-
ordinal: int | None = Field(default=None)
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
class ViewGanttDependencyPatch(StrictModel):
|
|
1238
|
-
predecessor_que_id: int = Field(validation_alias=AliasChoices("predecessor_que_id", "predecessorQueId"))
|
|
1239
|
-
dependency_que_id: int = Field(validation_alias=AliasChoices("dependency_que_id", "dependencyQueId"))
|
|
1240
|
-
start_start_option_id: int | None = Field(default=None, validation_alias=AliasChoices("start_start_option_id", "startStartOptionId"))
|
|
1241
|
-
start_end_option_id: int | None = Field(default=None, validation_alias=AliasChoices("start_end_option_id", "startEndOptionId"))
|
|
1242
|
-
end_start_option_id: int | None = Field(default=None, validation_alias=AliasChoices("end_start_option_id", "endStartOptionId"))
|
|
1243
|
-
end_end_option_id: int | None = Field(default=None, validation_alias=AliasChoices("end_end_option_id", "endEndOptionId"))
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
class ViewGanttConfigPatch(StrictModel):
|
|
1247
|
-
"""甘特视图特有配置 → viewgraphGanttConfigVO。"""
|
|
1248
|
-
|
|
1249
|
-
title_que_id: int | None = Field(default=None, validation_alias=AliasChoices("title_que_id", "titleQueId"))
|
|
1250
|
-
start_que_id: int | None = Field(default=None, validation_alias=AliasChoices("start_que_id", "startQueId"))
|
|
1251
|
-
end_que_id: int | None = Field(default=None, validation_alias=AliasChoices("end_que_id", "endQueId"))
|
|
1252
|
-
default_time_dimension: str | None = Field(default=None, validation_alias=AliasChoices("default_time_dimension", "defaultTimeDimension"))
|
|
1253
|
-
auto_calibration: bool | None = Field(default=None, validation_alias=AliasChoices("auto_calibration", "autoCalibration", "beingAutoCalibration"))
|
|
1254
|
-
groups: list[ViewGanttGroupPatch] = Field(default_factory=list)
|
|
1255
|
-
dependencies: list[ViewGanttDependencyPatch] = Field(default_factory=list, validation_alias=AliasChoices("dependencies", "dependency"))
|
|
1256
|
-
|
|
1257
|
-
@model_validator(mode="after")
|
|
1258
|
-
def validate_shape(self) -> "ViewGanttConfigPatch":
|
|
1259
|
-
if self.default_time_dimension is not None and self.default_time_dimension not in {"day", "week", "month", "year"}:
|
|
1260
|
-
raise ValueError("gantt.default_time_dimension must be day, week, month, or year")
|
|
1261
|
-
if len(self.dependencies) > 1:
|
|
1262
|
-
raise ValueError("gantt.dependencies supports at most one dependency relation in v1alpha1")
|
|
1263
|
-
return self
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
class ViewHierarchyConfigPatch(StrictModel):
|
|
1267
|
-
"""层级视图特有配置 → viewgraphHierarchyConfigVO。"""
|
|
1268
|
-
|
|
1269
|
-
title_que_id: int = Field(validation_alias=AliasChoices("title_que_id", "titleQueId"))
|
|
1270
|
-
children_que_id: int = Field(validation_alias=AliasChoices("children_que_id", "childrenQueId"))
|
|
1271
|
-
root_filter: list[list[ViewFilterRulePatch]] = Field(
|
|
1272
|
-
default_factory=list,
|
|
1273
|
-
validation_alias=AliasChoices("root_filter", "rootFilter", "root_node_filter", "rootNodeFilter"),
|
|
1274
|
-
)
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
class ViewCalendarConfigPatch(StrictModel):
|
|
1278
|
-
"""日历视图特有配置 → viewgraphCalendarConfigVO。"""
|
|
1279
|
-
|
|
1280
|
-
title_que_id: int = Field(validation_alias=AliasChoices("title_que_id", "titleQueId"))
|
|
1281
|
-
date_que_id: int = Field(validation_alias=AliasChoices("date_que_id", "dateQueId"))
|
|
1282
|
-
color_que_id: int | None = Field(default=None, validation_alias=AliasChoices("color_que_id", "colorQueId"))
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
class ViewDisplayConfigPatch(StrictModel):
|
|
1286
|
-
"""展示杂项 → defaultRowHigh/beingPinNavigate/remark。"""
|
|
1287
|
-
|
|
1288
|
-
row_height: str | None = Field(default=None, validation_alias=AliasChoices("row_height", "rowHeight", "defaultRowHigh"))
|
|
1289
|
-
pin_navigate: bool | None = Field(default=None, validation_alias=AliasChoices("pin_navigate", "pinNavigate", "beingPinNavigate"))
|
|
1290
|
-
remark: str | None = Field(default=None)
|
|
1291
|
-
|
|
1292
|
-
@model_validator(mode="after")
|
|
1293
|
-
def validate_shape(self) -> "ViewDisplayConfigPatch":
|
|
1294
|
-
# 后端 defaultRowHigh 实际值域:compact/moderate/highest(high 为历史别名)
|
|
1295
|
-
if self.row_height is not None and self.row_height not in {"compact", "moderate", "highest", "high"}:
|
|
1296
|
-
raise ValueError("display.row_height must be compact, moderate, highest, or high")
|
|
1297
|
-
return self
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
class ViewRecordConfigPatch(StrictModel):
|
|
1301
|
-
"""记录可见性开关 → beingAuditRecordVisible 等。"""
|
|
1302
|
-
|
|
1303
|
-
audit_visible: bool | None = Field(default=None, validation_alias=AliasChoices("audit_visible", "auditVisible", "beingAuditRecordVisible"))
|
|
1304
|
-
data_log_visible: bool | None = Field(default=None, validation_alias=AliasChoices("data_log_visible", "dataLogVisible", "beingDataLogVisible"))
|
|
1305
|
-
qrobot_record_visible: bool | None = Field(default=None, validation_alias=AliasChoices("qrobot_record_visible", "qrobotRecordVisible", "beingQrobotRecordVisible"))
|
|
1306
|
-
workflow_future_visible: bool | None = Field(default=None, validation_alias=AliasChoices("workflow_future_visible", "workflowFutureVisible", "beingWorkflowNodeFutureListVisible"))
|
|
1307
|
-
comment: bool | None = Field(default=None, validation_alias=AliasChoices("comment", "beingCommentStatus"))
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
class ViewShareConfigPatch(StrictModel):
|
|
1311
|
-
"""分享与安全 → beingNeedPass/viewgraphPass/beingForceLogin/beingPrintStatus。"""
|
|
1312
|
-
|
|
1313
|
-
need_pass: bool | None = Field(default=None, validation_alias=AliasChoices("need_pass", "needPass", "beingNeedPass"))
|
|
1314
|
-
password: str | None = Field(default=None, validation_alias=AliasChoices("password", "pass", "viewgraphPass"))
|
|
1315
|
-
force_login: bool | None = Field(default=None, validation_alias=AliasChoices("force_login", "forceLogin", "beingForceLogin"))
|
|
1316
|
-
print_enabled: bool | None = Field(default=None, validation_alias=AliasChoices("print_enabled", "printEnabled", "beingPrintStatus"))
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
1140
|
class ViewAssociatedResourcesPatch(StrictModel):
|
|
1320
1141
|
visible: bool = Field(default=True, validation_alias=AliasChoices("visible", "enabled", "asosChartVisible"))
|
|
1321
1142
|
limit_type: str | None = Field(default=None, validation_alias=AliasChoices("limit_type", "limitType"))
|
|
@@ -1418,30 +1239,17 @@ class ViewActionButtonPatch(StrictModel):
|
|
|
1418
1239
|
class ViewUpsertPatch(StrictModel):
|
|
1419
1240
|
name: str
|
|
1420
1241
|
view_key: str | None = Field(default=None, validation_alias=AliasChoices("view_key", "viewKey"))
|
|
1421
|
-
pinned: bool | None = Field(default=None, validation_alias=AliasChoices("pinned", "fixed", "is_pinned", "isPinned"))
|
|
1422
1242
|
type: PublicViewType
|
|
1423
|
-
columns: list[
|
|
1424
|
-
|
|
1425
|
-
filters: list[
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1243
|
+
columns: list[str] = Field(default_factory=list)
|
|
1244
|
+
group_by: str | None = None
|
|
1245
|
+
filters: list[ViewFilterRulePatch] = Field(default_factory=list)
|
|
1246
|
+
start_field: str | None = Field(default=None, validation_alias=AliasChoices("start_field", "startField"))
|
|
1247
|
+
end_field: str | None = Field(default=None, validation_alias=AliasChoices("end_field", "endField"))
|
|
1248
|
+
title_field: str | None = Field(default=None, validation_alias=AliasChoices("title_field", "titleField"))
|
|
1429
1249
|
buttons: list["ViewButtonBindingPatch"] | None = None
|
|
1430
1250
|
action_buttons: list[ViewActionButtonPatch] | None = Field(default=None, validation_alias=AliasChoices("action_buttons", "actionButtons"))
|
|
1431
1251
|
action_buttons_mode: str = Field(default="merge", validation_alias=AliasChoices("action_buttons_mode", "actionButtonsMode", "button_mode", "buttonMode"))
|
|
1432
1252
|
visibility: VisibilityPatch | None = None
|
|
1433
|
-
data_permission: ViewDataPermissionPatch | None = Field(
|
|
1434
|
-
default=None,
|
|
1435
|
-
validation_alias=AliasChoices("data_permission", "dataPermission"),
|
|
1436
|
-
)
|
|
1437
|
-
sort: list[ViewSortRulePatch] | None = Field(default=None, validation_alias=AliasChoices("sort", "sort_rules", "sortRules"))
|
|
1438
|
-
card: ViewCardConfigPatch | None = Field(default=None)
|
|
1439
|
-
gantt: ViewGanttConfigPatch | None = Field(default=None)
|
|
1440
|
-
hierarchy: ViewHierarchyConfigPatch | None = Field(default=None)
|
|
1441
|
-
calendar: ViewCalendarConfigPatch | None = Field(default=None)
|
|
1442
|
-
display: ViewDisplayConfigPatch | None = Field(default=None)
|
|
1443
|
-
record: ViewRecordConfigPatch | None = Field(default=None)
|
|
1444
|
-
share: ViewShareConfigPatch | None = Field(default=None)
|
|
1445
1253
|
query_conditions: ViewQueryConditionsPatch | None = Field(default=None, validation_alias=AliasChoices("query_conditions", "queryConditions", "query_condition", "queryCondition"))
|
|
1446
1254
|
associated_resources: ViewAssociatedResourcesPatch | None = Field(
|
|
1447
1255
|
default=None,
|
|
@@ -1507,34 +1315,16 @@ class ViewUpsertPatch(StrictModel):
|
|
|
1507
1315
|
payload["type"] = "board"
|
|
1508
1316
|
elif normalized == "ganttview":
|
|
1509
1317
|
payload["type"] = "gantt"
|
|
1510
|
-
elif normalized == "hierarchyview":
|
|
1511
|
-
payload["type"] = "hierarchy"
|
|
1512
|
-
elif normalized == "calendarview":
|
|
1513
|
-
payload["type"] = "calendar"
|
|
1514
1318
|
return payload
|
|
1515
1319
|
|
|
1516
1320
|
@model_validator(mode="after")
|
|
1517
1321
|
def validate_shape(self) -> "ViewUpsertPatch":
|
|
1518
1322
|
if self.type in {PublicViewType.table, PublicViewType.card} and not self.columns:
|
|
1519
1323
|
raise ValueError("table/card views require columns")
|
|
1520
|
-
if self.type == PublicViewType.board and not self.
|
|
1521
|
-
raise ValueError("board view requires
|
|
1522
|
-
if self.type == PublicViewType.gantt and not (self.
|
|
1523
|
-
raise ValueError("gantt view requires
|
|
1524
|
-
if self.type == PublicViewType.hierarchy:
|
|
1525
|
-
if self.hierarchy is None or not (self.hierarchy.title_que_id and self.hierarchy.children_que_id):
|
|
1526
|
-
raise ValueError("hierarchy view requires hierarchy.title_que_id and children_que_id")
|
|
1527
|
-
elif self.hierarchy is not None:
|
|
1528
|
-
raise ValueError("hierarchy config is only allowed on hierarchy views")
|
|
1529
|
-
if self.type == PublicViewType.calendar:
|
|
1530
|
-
if self.calendar is None:
|
|
1531
|
-
raise ValueError("calendar view requires calendar.title_que_id and date_que_id")
|
|
1532
|
-
elif self.calendar is not None:
|
|
1533
|
-
raise ValueError("calendar config is only allowed on calendar views")
|
|
1534
|
-
if self.type != PublicViewType.card and self.card is not None:
|
|
1535
|
-
raise ValueError("card config is only allowed on card views")
|
|
1536
|
-
if self.type != PublicViewType.gantt and self.gantt is not None:
|
|
1537
|
-
raise ValueError("gantt config is only allowed on gantt views")
|
|
1324
|
+
if self.type == PublicViewType.board and not self.group_by:
|
|
1325
|
+
raise ValueError("board view requires group_by")
|
|
1326
|
+
if self.type == PublicViewType.gantt and not (self.start_field and self.end_field):
|
|
1327
|
+
raise ValueError("gantt view requires start_field and end_field")
|
|
1538
1328
|
normalized_mode = str(self.action_buttons_mode or "merge").strip().lower()
|
|
1539
1329
|
if normalized_mode not in {"merge", "replace"}:
|
|
1540
1330
|
raise ValueError("action_buttons_mode must be merge or replace")
|
|
@@ -239,7 +239,7 @@
|
|
|
239
239
|
]
|
|
240
240
|
},
|
|
241
241
|
"fileSize": {
|
|
242
|
-
"minimum":
|
|
242
|
+
"minimum": 1,
|
|
243
243
|
"type": [
|
|
244
244
|
"integer",
|
|
245
245
|
"null"
|
|
@@ -259,7 +259,7 @@
|
|
|
259
259
|
]
|
|
260
260
|
},
|
|
261
261
|
"maxFileLimit": {
|
|
262
|
-
"minimum":
|
|
262
|
+
"minimum": 1,
|
|
263
263
|
"type": [
|
|
264
264
|
"integer",
|
|
265
265
|
"null"
|
|
@@ -518,7 +518,7 @@
|
|
|
518
518
|
},
|
|
519
519
|
"DataRelationCondition": {
|
|
520
520
|
"additionalProperties": false,
|
|
521
|
-
"description": "一条数据关联过滤条件;sourceField 必须属于数据来源,operator 必须适用于该字段类型。固定值请使用 literal operand,不要直接声明后端 matchRules。
|
|
521
|
+
"description": "一条数据关联过滤条件;sourceField 必须属于数据来源,operator 必须适用于该字段类型。固定值请使用 literal operand,不要直接声明后端 matchRules。",
|
|
522
522
|
"properties": {
|
|
523
523
|
"operand": {
|
|
524
524
|
"$ref": "#/$defs/DataRelationOperand",
|
|
@@ -554,10 +554,11 @@
|
|
|
554
554
|
},
|
|
555
555
|
"sourceField": {
|
|
556
556
|
"$ref": "#/$defs/FieldSelector",
|
|
557
|
-
"description": "
|
|
557
|
+
"description": "被过滤的数据源字段。"
|
|
558
558
|
}
|
|
559
559
|
},
|
|
560
560
|
"required": [
|
|
561
|
+
"sourceField",
|
|
561
562
|
"operator",
|
|
562
563
|
"operand"
|
|
563
564
|
],
|
|
@@ -565,7 +566,7 @@
|
|
|
565
566
|
},
|
|
566
567
|
"DataRelationConfig": {
|
|
567
568
|
"additionalProperties": false,
|
|
568
|
-
"description": "数据关联字段配置;从应用、Q-Linker 或代码块输出中读取数据。
|
|
569
|
+
"description": "数据关联字段配置;从应用、Q-Linker 或代码块输出中读取数据。",
|
|
569
570
|
"properties": {
|
|
570
571
|
"aggregation": {
|
|
571
572
|
"description": "可选聚合方式;null 表示不聚合。",
|
|
@@ -600,10 +601,12 @@
|
|
|
600
601
|
},
|
|
601
602
|
"source": {
|
|
602
603
|
"$ref": "#/$defs/DataRelationSource",
|
|
603
|
-
"description": "数据来源;按 kind
|
|
604
|
+
"description": "数据来源;按 kind 选择一种来源结构。"
|
|
604
605
|
}
|
|
605
606
|
},
|
|
606
|
-
"required": [
|
|
607
|
+
"required": [
|
|
608
|
+
"source"
|
|
609
|
+
],
|
|
607
610
|
"type": "object"
|
|
608
611
|
},
|
|
609
612
|
"DataRelationCustomButton": {
|
|
@@ -1275,7 +1278,7 @@
|
|
|
1275
1278
|
"description": "普通字段的默认值;后端 queDefaultValue 为字符串,因此数字等字面量也必须以字符串传入。defaultType 为 1 时表示静态文本,为 3 时表示公式文本,为 2 时不携带字面量默认值。表格、地址、附件、引用等结构化默认值必须放在具体字段 config.defaultValues。显式 null 表示清除默认值。"
|
|
1276
1279
|
},
|
|
1277
1280
|
"name": {
|
|
1278
|
-
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId
|
|
1281
|
+
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId 时省略;同一父级内唯一。",
|
|
1279
1282
|
"minLength": 1,
|
|
1280
1283
|
"type": "string"
|
|
1281
1284
|
},
|
|
@@ -1296,9 +1299,13 @@
|
|
|
1296
1299
|
"type": "string"
|
|
1297
1300
|
},
|
|
1298
1301
|
"width": {
|
|
1299
|
-
"description": "
|
|
1300
|
-
"
|
|
1301
|
-
|
|
1302
|
+
"description": "字段在所在行的宽度百分比;只能选择 25、50、75 或 100。",
|
|
1303
|
+
"enum": [
|
|
1304
|
+
25,
|
|
1305
|
+
50,
|
|
1306
|
+
75,
|
|
1307
|
+
100
|
|
1308
|
+
],
|
|
1302
1309
|
"type": "integer"
|
|
1303
1310
|
}
|
|
1304
1311
|
},
|
|
@@ -1337,10 +1344,10 @@
|
|
|
1337
1344
|
]
|
|
1338
1345
|
}
|
|
1339
1346
|
],
|
|
1340
|
-
"description": "字段选择器;用于定位应用的数据标题、数据封面、自定义编号取值来源或其他配置引用的字段。至少提供 queId 或 name
|
|
1347
|
+
"description": "字段选择器;用于定位应用的数据标题、数据封面、自定义编号取值来源或其他配置引用的字段。至少提供 queId 或 name,两者同时提供时必须指向同一字段。",
|
|
1341
1348
|
"properties": {
|
|
1342
1349
|
"name": {
|
|
1343
|
-
"description": "
|
|
1350
|
+
"description": "字段名称;仅在当前作用域内唯一时可用于解析。",
|
|
1344
1351
|
"minLength": 1,
|
|
1345
1352
|
"type": "string"
|
|
1346
1353
|
},
|
|
@@ -1968,7 +1975,7 @@
|
|
|
1968
1975
|
},
|
|
1969
1976
|
"RelationConfig": {
|
|
1970
1977
|
"additionalProperties": false,
|
|
1971
|
-
"description": "
|
|
1978
|
+
"description": "引用字段配置;引用其他应用中的数据。",
|
|
1972
1979
|
"properties": {
|
|
1973
1980
|
"beingDefaultFormulaAutoFillEnabled": {
|
|
1974
1981
|
"description": "是否启用引用字段的默认值公式自动填充。",
|
|
@@ -2006,32 +2013,7 @@
|
|
|
2006
2013
|
},
|
|
2007
2014
|
"displayField": {
|
|
2008
2015
|
"$ref": "#/$defs/FieldSelector",
|
|
2009
|
-
"description": "
|
|
2010
|
-
},
|
|
2011
|
-
"displayFields": {
|
|
2012
|
-
"description": "有序展示字段全量列表(含隐藏字段),按 ordinal 保序回写为后端 referQuestions。可为空列表:空 = 双向绑定未配展示字段的合法存量形态(后端写链路对空 referQuestions 跳过插入、读面容忍空),round-trip 空↔空稳定;与已废弃 displayField/visibleFields 不可混用,条目 queId 不可重复。",
|
|
2013
|
-
"items": {
|
|
2014
|
-
"additionalProperties": false,
|
|
2015
|
-
"properties": {
|
|
2016
|
-
"auth": {
|
|
2017
|
-
"default": "visible",
|
|
2018
|
-
"description": "展示字段权限;editable=可编辑(1), hidden=隐藏(2), visible=仅可见(3);缺失按 visible。",
|
|
2019
|
-
"enum": [
|
|
2020
|
-
"editable",
|
|
2021
|
-
"hidden",
|
|
2022
|
-
"visible"
|
|
2023
|
-
]
|
|
2024
|
-
},
|
|
2025
|
-
"field": {
|
|
2026
|
-
"$ref": "#/$defs/FieldSelector"
|
|
2027
|
-
}
|
|
2028
|
-
},
|
|
2029
|
-
"required": [
|
|
2030
|
-
"field"
|
|
2031
|
-
],
|
|
2032
|
-
"type": "object"
|
|
2033
|
-
},
|
|
2034
|
-
"type": "array"
|
|
2016
|
+
"description": "引用值的主展示字段。"
|
|
2035
2017
|
},
|
|
2036
2018
|
"relationMode": {
|
|
2037
2019
|
"default": "single",
|
|
@@ -2046,19 +2028,8 @@
|
|
|
2046
2028
|
"minLength": 1,
|
|
2047
2029
|
"type": "string"
|
|
2048
2030
|
},
|
|
2049
|
-
"twoWayBoundField": {
|
|
2050
|
-
"description": "双向引用绑定的目标字段(后端 referQueId);null/省略 = 单向引用。get 读面在 referQueId 非空时必产出。",
|
|
2051
|
-
"oneOf": [
|
|
2052
|
-
{
|
|
2053
|
-
"type": "null"
|
|
2054
|
-
},
|
|
2055
|
-
{
|
|
2056
|
-
"$ref": "#/$defs/FieldSelector"
|
|
2057
|
-
}
|
|
2058
|
-
]
|
|
2059
|
-
},
|
|
2060
2031
|
"visibleFields": {
|
|
2061
|
-
"description": "
|
|
2032
|
+
"description": "引用选择界面额外展示的字段。",
|
|
2062
2033
|
"items": {
|
|
2063
2034
|
"$ref": "#/$defs/FieldSelector"
|
|
2064
2035
|
},
|
|
@@ -2067,7 +2038,8 @@
|
|
|
2067
2038
|
}
|
|
2068
2039
|
},
|
|
2069
2040
|
"required": [
|
|
2070
|
-
"targetAppKey"
|
|
2041
|
+
"targetAppKey",
|
|
2042
|
+
"displayField"
|
|
2071
2043
|
],
|
|
2072
2044
|
"type": "object"
|
|
2073
2045
|
},
|
|
@@ -2128,10 +2100,11 @@
|
|
|
2128
2100
|
"description": "段落判别值。"
|
|
2129
2101
|
},
|
|
2130
2102
|
"rows": {
|
|
2131
|
-
"description": "
|
|
2103
|
+
"description": "段落内的非空有序字段行。",
|
|
2132
2104
|
"items": {
|
|
2133
2105
|
"$ref": "#/$defs/FieldRow"
|
|
2134
2106
|
},
|
|
2107
|
+
"minItems": 1,
|
|
2135
2108
|
"type": "array"
|
|
2136
2109
|
},
|
|
2137
2110
|
"sectionId": {
|
|
@@ -2412,10 +2385,7 @@
|
|
|
2412
2385
|
"$ref": "#/$defs/NumberConfig"
|
|
2413
2386
|
},
|
|
2414
2387
|
"questionType": {
|
|
2415
|
-
"
|
|
2416
|
-
"number",
|
|
2417
|
-
"amount"
|
|
2418
|
-
]
|
|
2388
|
+
"const": "number"
|
|
2419
2389
|
}
|
|
2420
2390
|
},
|
|
2421
2391
|
"required": [
|
|
@@ -2428,10 +2398,7 @@
|
|
|
2428
2398
|
"$ref": "#/$defs/EmptyConfig"
|
|
2429
2399
|
},
|
|
2430
2400
|
"questionType": {
|
|
2431
|
-
"
|
|
2432
|
-
"date",
|
|
2433
|
-
"datetime"
|
|
2434
|
-
]
|
|
2401
|
+
"const": "date"
|
|
2435
2402
|
}
|
|
2436
2403
|
},
|
|
2437
2404
|
"required": [
|
|
@@ -2735,8 +2702,7 @@
|
|
|
2735
2702
|
"questionType": {
|
|
2736
2703
|
"enum": [
|
|
2737
2704
|
"date",
|
|
2738
|
-
"datetime"
|
|
2739
|
-
"rich_text"
|
|
2705
|
+
"datetime"
|
|
2740
2706
|
]
|
|
2741
2707
|
}
|
|
2742
2708
|
},
|
|
@@ -301,7 +301,7 @@
|
|
|
301
301
|
"description": "普通字段的默认值;后端 queDefaultValue 为字符串,因此数字等字面量也必须以字符串传入。defaultType 为 1 时表示静态文本,为 3 时表示公式文本,为 2 时不携带字面量默认值。表格、地址、附件、引用等结构化默认值必须放在具体字段 config.defaultValues。显式 null 表示清除默认值。"
|
|
302
302
|
},
|
|
303
303
|
"name": {
|
|
304
|
-
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId
|
|
304
|
+
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId 时省略;同一父级内唯一。",
|
|
305
305
|
"minLength": 1,
|
|
306
306
|
"type": "string"
|
|
307
307
|
},
|
|
@@ -322,9 +322,13 @@
|
|
|
322
322
|
"type": "string"
|
|
323
323
|
},
|
|
324
324
|
"width": {
|
|
325
|
-
"description": "
|
|
326
|
-
"
|
|
327
|
-
|
|
325
|
+
"description": "字段在所在行的宽度百分比;只能选择 25、50、75 或 100。",
|
|
326
|
+
"enum": [
|
|
327
|
+
25,
|
|
328
|
+
50,
|
|
329
|
+
75,
|
|
330
|
+
100
|
|
331
|
+
],
|
|
328
332
|
"type": "integer"
|
|
329
333
|
}
|
|
330
334
|
},
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"description": "普通字段的默认值;后端 queDefaultValue 为字符串,因此数字等字面量也必须以字符串传入。defaultType 为 1 时表示静态文本,为 3 时表示公式文本,为 2 时不携带字面量默认值。表格、地址、附件、引用等结构化默认值必须放在具体字段 config.defaultValues。显式 null 表示清除默认值。"
|
|
79
79
|
},
|
|
80
80
|
"name": {
|
|
81
|
-
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId
|
|
81
|
+
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId 时省略;同一父级内唯一。",
|
|
82
82
|
"minLength": 1,
|
|
83
83
|
"type": "string"
|
|
84
84
|
},
|
|
@@ -99,9 +99,13 @@
|
|
|
99
99
|
"type": "string"
|
|
100
100
|
},
|
|
101
101
|
"width": {
|
|
102
|
-
"description": "
|
|
103
|
-
"
|
|
104
|
-
|
|
102
|
+
"description": "字段在所在行的宽度百分比;只能选择 25、50、75 或 100。",
|
|
103
|
+
"enum": [
|
|
104
|
+
25,
|
|
105
|
+
50,
|
|
106
|
+
75,
|
|
107
|
+
100
|
|
108
|
+
],
|
|
105
109
|
"type": "integer"
|
|
106
110
|
}
|
|
107
111
|
},
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
]
|
|
95
95
|
},
|
|
96
96
|
"fileSize": {
|
|
97
|
-
"minimum":
|
|
97
|
+
"minimum": 1,
|
|
98
98
|
"type": [
|
|
99
99
|
"integer",
|
|
100
100
|
"null"
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
]
|
|
115
115
|
},
|
|
116
116
|
"maxFileLimit": {
|
|
117
|
-
"minimum":
|
|
117
|
+
"minimum": 1,
|
|
118
118
|
"type": [
|
|
119
119
|
"integer",
|
|
120
120
|
"null"
|
|
@@ -334,7 +334,7 @@
|
|
|
334
334
|
"description": "普通字段的默认值;后端 queDefaultValue 为字符串,因此数字等字面量也必须以字符串传入。defaultType 为 1 时表示静态文本,为 3 时表示公式文本,为 2 时不携带字面量默认值。表格、地址、附件、引用等结构化默认值必须放在具体字段 config.defaultValues。显式 null 表示清除默认值。"
|
|
335
335
|
},
|
|
336
336
|
"name": {
|
|
337
|
-
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId
|
|
337
|
+
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId 时省略;同一父级内唯一。",
|
|
338
338
|
"minLength": 1,
|
|
339
339
|
"type": "string"
|
|
340
340
|
},
|
|
@@ -355,9 +355,13 @@
|
|
|
355
355
|
"type": "string"
|
|
356
356
|
},
|
|
357
357
|
"width": {
|
|
358
|
-
"description": "
|
|
359
|
-
"
|
|
360
|
-
|
|
358
|
+
"description": "字段在所在行的宽度百分比;只能选择 25、50、75 或 100。",
|
|
359
|
+
"enum": [
|
|
360
|
+
25,
|
|
361
|
+
50,
|
|
362
|
+
75,
|
|
363
|
+
100
|
|
364
|
+
],
|
|
361
365
|
"type": "integer"
|
|
362
366
|
}
|
|
363
367
|
},
|