export type ControlType = 'text' | 'dropdown' | 'checkbox' | 'date' | 'multiline';
|
|
export interface DropdownOption {
|
display: string;
|
value: string;
|
}
|
|
export interface RawTypeConfig {
|
controlType: string;
|
placeholder?: string;
|
defaultValue?: string;
|
defaultChecked?: boolean;
|
options?: DropdownOption[];
|
defaultOptionValue?: string;
|
}
|
|
export type TypeConfigValidationField = 'control-type' | 'text-default' | 'dropdown-options' | 'dropdown-default' | 'date-default';
|
|
export type ValidationResult<T, F extends string = string> = { ok: true; value: T } | { field: F; message: string; ok: false };
|
|
export interface ValidatedDropdownConfig {
|
controlType: 'dropdown';
|
options: DropdownOption[];
|
placeholder: string;
|
selectedIndex: number;
|
}
|
|
export interface ValidatedStandardConfig {
|
controlType: Exclude<ControlType, 'dropdown'>;
|
dateFormat?: string;
|
defaultChecked: boolean;
|
defaultValue: string;
|
placeholder: string;
|
}
|
|
export type ValidatedTypeConfig = ValidatedDropdownConfig | ValidatedStandardConfig;
|
|
export interface FieldDefinitionInput {
|
alias: string;
|
fieldCode: string;
|
typeConfig: RawTypeConfig | null | undefined;
|
}
|
|
export type FieldDefinitionValidationField = 'field-code' | 'field-alias' | TypeConfigValidationField;
|
|
export interface FieldColor {
|
B: number;
|
G: number;
|
R: number;
|
}
|
|
interface FieldDefinitionBase {
|
alias: string;
|
color: FieldColor;
|
fieldCode: string;
|
tag: string;
|
}
|
|
export type FieldDefinition = FieldDefinitionBase & (ValidatedDropdownConfig | ValidatedStandardConfig);
|
|
export type TemplateFieldScope = 'GLOBAL' | 'TEMPLATE';
|
export type TemplateFieldVersionStatus = 'CANCELLED' | 'DRAFT' | 'PRE_RELEASE' | 'PUBLISHED';
|
export type TemplateFieldDataType = 'CHECKBOX' | 'DATE' | 'DATETIME' | 'DECIMAL' | 'SELECT' | 'TEXT' | 'TEXTAREA';
|
export type TemplateFieldReadSource = 'LIMS_TASK' | 'NONE' | 'SYSTEM';
|
|
export interface TemplateFieldReadBinding {
|
property: null | string;
|
source: TemplateFieldReadSource;
|
}
|
|
export interface TemplateFieldWriteBinding {
|
target: null | string;
|
}
|
|
export interface TemplateFieldBindingConfig {
|
read: null | TemplateFieldReadBinding;
|
write: null | TemplateFieldWriteBinding;
|
}
|
|
export interface TemplateFieldVersion {
|
banbenHao: null | number;
|
binding: null | TemplateFieldBindingConfig;
|
bizStatus: TemplateFieldVersionStatus;
|
chuangjianShijian: null | string;
|
danwei: null | string;
|
gengxinShijian: null | string;
|
id: string;
|
kongjianPeizhi: null | Record<string, unknown>;
|
piciMoshi: null | string;
|
recommendedCheckboxGroupCode?: null | string;
|
recommendedCheckboxMaxSelected?: null | number;
|
recommendedCheckboxMinSelected?: null | number;
|
shifouBitian: null | number;
|
shujuLeixing: TemplateFieldDataType;
|
ziduanDingyiId: string;
|
ziduanMingcheng: string;
|
zuofeiYuanyin: null | string;
|
}
|
|
export interface TemplateFieldIdentity {
|
beizhu: null | string;
|
bizEnabled: string;
|
dangqianZiduanBanbenId: null | string;
|
id: string;
|
mubanBianhao: null | string;
|
versions: TemplateFieldVersion[];
|
ziduanBianma: string;
|
zuoyongFanwei: TemplateFieldScope;
|
}
|
|
export interface TemplateFieldOption {
|
alias: string;
|
batchMode?: string;
|
controlConfig: null | Record<string, unknown>;
|
fieldCode: string;
|
fieldId: string;
|
fieldVersionId: string;
|
isCurrent: boolean;
|
label: string;
|
required: boolean;
|
recommendedCheckboxGroupCode?: null | string;
|
recommendedCheckboxMaxSelected?: null | number;
|
recommendedCheckboxMinSelected?: null | number;
|
scope: TemplateFieldScope;
|
source: TemplateFieldReadSource;
|
type: TemplateFieldDataType;
|
versionStatus: TemplateFieldVersionStatus;
|
writeTarget?: string;
|
}
|
|
export interface TemplateBinding {
|
checkboxGroupCode?: null | string;
|
controlAlias: null | string;
|
controlConfig: null | Record<string, unknown>;
|
controlRole: string;
|
controlTag: string;
|
controlType: string;
|
fieldCode: string;
|
fieldId: string;
|
fieldVersionId: string;
|
id: string;
|
primaryBindingId: null | string;
|
repeatGroupCode?: null | string;
|
repeatPrototypeRowId?: null | string;
|
readOnly?: boolean;
|
status: string;
|
stepId?: null | string;
|
templateId: string;
|
valueSource?: string;
|
version: number;
|
}
|
|
export interface TemplateControlSnapshot {
|
bindingId: string;
|
controlAlias?: null | string;
|
controlConfig?: null | Record<string, unknown>;
|
controlRole?: null | string;
|
controlTag: string;
|
controlType?: null | string;
|
fieldVersionId?: null | string;
|
primaryBindingId?: null | string;
|
repeatGroupCode?: null | string;
|
repeatPrototypeRowId?: null | string;
|
stepId?: null | string;
|
}
|
|
export interface TemplateDiagnostic {
|
bindingId: null | string;
|
code: string;
|
controlTag: null | string;
|
message: string;
|
severity: string;
|
}
|
|
export interface TemplateAnnotationContext {
|
bindings: TemplateBinding[];
|
checkboxGroups?: TemplateCheckboxGroup[];
|
copiedPendingBindingIds?: string[];
|
fields: TemplateFieldIdentity[];
|
repeatGroups?: TemplateRepeatGroup[];
|
stepConfiguration: TemplateStepConfiguration;
|
templateCode: string;
|
templateId: string;
|
upgradeOperationCode?: string;
|
}
|
|
export interface TemplateCheckboxGroup {
|
groupCode: string;
|
maxSelected: null | number;
|
minSelected: number;
|
version: number;
|
}
|
|
export type TemplateCheckboxGroupDraft = Pick<TemplateCheckboxGroup, 'groupCode' | 'maxSelected' | 'minSelected'>;
|
|
export interface TemplateRepeatGroup {
|
groupCode: string;
|
maxRows: number;
|
minRows: number;
|
stepId?: null | string;
|
}
|
|
export interface TemplateStep {
|
id: string;
|
name: string;
|
order: number;
|
}
|
|
export interface TemplateStepConfiguration {
|
singleStep: boolean;
|
steps: TemplateStep[];
|
}
|
|
export interface TemplatePrivateFieldDraft {
|
checkboxGroupCode?: string;
|
checkboxGroupMaxSelected?: null | number;
|
checkboxGroupMinSelected?: number;
|
kongjianPeizhi: Record<string, unknown>;
|
shujuLeixing: TemplateFieldDataType;
|
ziduanMingcheng: string;
|
}
|
|
export interface TemplateChangeCheck {
|
controls: TemplateControlSnapshot[];
|
dependencies: TemplateDiagnostic[];
|
expectedVersions: Record<string, number>;
|
operationCode: string;
|
}
|
|
export interface TemplateRepairContext extends TemplateChangeCheck {
|
binding: TemplateBinding;
|
}
|
|
export interface TemplateOperationForm {
|
operationCode: string;
|
}
|
|
export interface TemplateCancelForm extends TemplateOperationForm {
|
reason: string;
|
}
|
|
export interface TemplateReserveBindingForm extends TemplateOperationForm {
|
checkboxGroupCode?: string;
|
checkboxGroupMaxSelected?: null | number;
|
checkboxGroupMinSelected?: number;
|
fieldId: string;
|
fieldVersionId: string;
|
maxRows?: number;
|
minRows?: number;
|
repeatGroupCode?: string;
|
repeatPrototypeRowId?: string;
|
repeatRequest: boolean;
|
stepId: string;
|
}
|
|
export interface TemplateChangeCheckboxGroupForm extends TemplateOperationForm {
|
checkboxGroupCode: null | string;
|
checkboxGroupMaxSelected?: null | number;
|
checkboxGroupMinSelected?: number;
|
expectedVersion: number;
|
}
|
|
export interface TemplateChangeCheckboxGroupRuleForm extends TemplateOperationForm {
|
expectedVersion: number;
|
maxSelected: null | number;
|
minSelected: number;
|
}
|
|
export interface CrossTemplateScalarCandidate {
|
sourceFieldCode: string;
|
sourceFieldId: string;
|
sourceFieldName: string;
|
sourceFieldType: TemplateFieldDataType;
|
sourceFieldVersionId: string;
|
sourceTemplateCode: string;
|
sourceTemplateId: string;
|
}
|
|
export interface CrossTemplateSourceTemplate {
|
sourceTemplateCode: string;
|
sourceTemplateId: string;
|
}
|
|
export interface TemplateReserveCrossTemplateScalarBindingForm extends TemplateOperationForm {
|
repeatRequest: false;
|
sourceFieldId: string;
|
sourceFieldVersionId: string;
|
sourceTemplateCode: string;
|
sourceTemplateId: string;
|
stepId: string;
|
}
|
|
export interface TemplatePrivateFieldForm extends TemplateOperationForm {
|
beizhu?: null | string;
|
binding?: null | TemplateFieldBindingConfig;
|
checkboxGroupCode?: string;
|
checkboxGroupMaxSelected?: null | number;
|
checkboxGroupMinSelected?: number;
|
danwei?: null | string;
|
kongjianPeizhi?: null | Record<string, unknown>;
|
piciMoshi?: null | string;
|
shifouBitian?: null | number;
|
shujuLeixing: TemplateFieldDataType;
|
stepId: string;
|
ziduanMingcheng: string;
|
}
|
|
export interface TemplateUpgradeCheckForm {
|
targetFieldVersionId: string;
|
}
|
|
export interface TemplateChangeConfirmForm extends TemplateOperationForm {
|
controls: TemplateControlSnapshot[];
|
expectedVersions: Record<string, number>;
|
observedControlTags: string[];
|
}
|
|
export interface TemplateUpgradeConfirmForm extends TemplateChangeConfirmForm {
|
targetFieldVersionId: string;
|
}
|
|
export interface TemplateVersionCopyConfirmForm {
|
controls: TemplateControlSnapshot[];
|
expectedVersions: Record<string, number>;
|
upgradeOperationCode: string;
|
}
|
|
export function toTemplateFieldOptions(fields: TemplateFieldIdentity[]): TemplateFieldOption[] {
|
return fields.flatMap((field) =>
|
field.versions.map((version) => ({
|
fieldId: field.id,
|
fieldCode: field.ziduanBianma,
|
fieldVersionId: version.id,
|
scope: field.zuoyongFanwei,
|
label: version.ziduanMingcheng,
|
alias: version.ziduanMingcheng,
|
batchMode: version.piciMoshi ?? '',
|
controlConfig: version.kongjianPeizhi,
|
required: version.shifouBitian === 1,
|
recommendedCheckboxGroupCode: version.recommendedCheckboxGroupCode,
|
recommendedCheckboxMaxSelected: version.recommendedCheckboxMaxSelected,
|
recommendedCheckboxMinSelected: version.recommendedCheckboxMinSelected,
|
type: version.shujuLeixing,
|
source: version.binding?.read?.source ?? 'NONE',
|
versionStatus: version.bizStatus,
|
writeTarget: version.binding?.write?.target ?? '',
|
isCurrent: version.id === field.dangqianZiduanBanbenId,
|
})),
|
);
|
}
|