@hzg0304/clinical-template-editor
Version:
一个基于 React 和 TipTap 构建的临床模板编辑器组件,专为医疗行业设计
302 lines (294 loc) • 9.73 kB
TypeScript
import React from 'react';
/**
* @AI-Generated
* 临床文档模板变量配置
*/
interface TemplateVariable {
name: string;
placeholder: string;
}
declare global {
interface Window {
updateTemplateVariables?: (variables: TemplateVariable[]) => void;
onTemplateSaved?: (data: any) => void;
__EDITOR_MODE__?: string;
__ACTIVE_INPUT_ID?: string;
__ACTIVE_INPUT_ELEMENT?: HTMLInputElement | HTMLTextAreaElement;
__ACTIVE_INPUT_SELECTION?: {
start: number | null;
end: number | null;
text: string;
};
}
}
interface RecordData {
id?: string;
templateName: string;
content: string;
variableValues: Record<string, string>;
metaValues: Record<string, any>;
saveTime: string;
patientInfo?: {
name?: string;
admissionNumber?: string;
department?: string;
};
}
interface RecordInfo {
id: string;
templateName: string;
saveTime: string;
patientInfo?: {
name?: string;
admissionNumber?: string;
department?: string;
};
}
interface TemplateInfo {
id: string;
name: string;
type: string;
description: string;
variables: string[] | Array<{
name: string;
placeholder: string;
type?: string;
}>;
saveTime?: string;
timestamp?: string;
headerFooter?: any;
createTime?: string;
createdAt?: string;
updatedAt?: string;
}
interface ClinicalTemplateEditorRef {
getContent: (format?: 'html' | 'json' | 'markdown') => string;
setContent: (content: string, format?: 'html' | 'json' | 'markdown') => void;
getHtmlWithStyle: () => string;
appendHtml: (html: string, options?: {
pageBreak?: boolean;
}) => void;
getVariableValues: () => Record<string, string>;
setVariableValues: (values: Record<string, string>) => void;
getTemplateVariables: (templateName: string) => TemplateVariable[];
getFieldValueById: (id: string) => any;
getMode: () => 'readonly' | 'form' | 'design';
setMode: (mode: 'readonly' | 'form' | 'design') => void;
setReadOnly: (isReadOnly: boolean) => void;
getAllowCopyPaste: () => boolean;
setAllowCopyPaste: (allow: boolean) => void;
getTemplateList: () => TemplateInfo[];
selectTemplate: (templateName: string) => Promise<boolean>;
getCurrentTemplate: () => string;
switchTemplate: (templateName: string) => void;
createTemplate: (templateData: {
name: string;
type?: string;
description?: string;
variables?: string[];
content?: any;
}) => Promise<boolean>;
saveTemplate: (templateData: {
name: string;
type?: string;
description?: string;
variables?: string[];
content?: any;
}) => Promise<boolean>;
updateTemplate: (templateName: string, templateData: {
name?: string;
type?: string;
description?: string;
variables?: string[];
content?: any;
}) => Promise<boolean>;
deleteTemplate: (templateName: string) => Promise<boolean>;
getRecordData: () => RecordData;
setRecordData: (data: RecordData) => void;
saveRecord: () => void;
getSavedRecords: () => RecordInfo[];
loadRecord: (recordId: string) => Promise<boolean>;
deleteRecord: (recordId: string) => boolean;
getBindObject: (id?: string) => Record<string, any>;
setBindObject: (obj: any, id?: string) => void;
getMetaObject?: (id?: string) => Record<string, any>;
setMetaObject?: (data: Record<string, any>, id?: string) => void;
getSelectedText: () => string;
replaceSelectedText: (newText: string) => boolean;
exportAs: (format: 'html' | 'pdf' | 'word') => Promise<Blob>;
showPreview: () => void;
print: () => void;
printPreview: () => void;
printWithOptions: (options?: {
includeHeader?: boolean;
includeFooter?: boolean;
pageSize?: 'A4' | 'A3' | 'Letter';
orientation?: 'portrait' | 'landscape';
margins?: string;
}) => void;
control?: {
insertField: (type: string, id?: string | null, attributes?: Record<string, any>) => void;
insertRadioGroup: (id: string, data: Record<string, string>, newline?: boolean) => void;
insertCheckboxGroup: (id: string, data: Record<string, string>, newline?: boolean) => void;
insertSignature: (data?: string | null, id?: string, attributes?: Record<string, any>) => void;
insertImage: (id: string, src?: string, attributes?: Record<string, any>) => void;
};
calculate?: {
registerFunction: (name: string, fn: (...args: any[]) => any) => void;
runExpression: (expression: string, context?: Record<string, any>) => any;
};
menstruation?: {
getBindData: (id: string) => any;
setBindData: (data: any, id: string) => void;
updateFromText: (text: string, id?: string) => boolean;
updateFromLatex: (latex: string, id?: string) => boolean;
};
temperatureChart?: {
initializeChart: (config: {
id: string;
patientName: string;
patientAge?: string;
patientGender?: string;
inDate: string;
outDate: string;
diagnosis: string;
department: string;
bedNumber: string;
medicalNumber: string;
days: number;
bindVariable?: string;
}) => void;
getChartData: (id: string) => any;
setChartData: (data: any, id: string) => void;
updatePatientInfo: (info: {
name?: string;
age?: string;
gender?: string;
diagnosis?: string;
department?: string;
bedNumber?: string;
medicalNumber?: string;
}, id: string) => void;
};
execCommand: (command: string, params?: any) => any;
validate?: () => boolean;
setTableData?: (tableId: string, datalist: any[]) => void;
getRevision?: () => any[];
getFieldValue?: (field: HTMLElement) => any;
/**
* 通过文件导入并绑定数据到模板控件
* @param file 要导入的数据文件
*/
bindDataFromFile: (file: File) => Promise<void>;
bindDataFromJSON: (json: string) => void;
}
interface ClinicalTemplateEditorProps {
initialVariables?: Record<string, string>;
templates?: TemplateInfo[];
currentTemplateId?: string;
onTemplateChange?: (templateId: string) => void;
disableCopyPaste?: boolean;
[key: string]: any;
}
declare const ClinicalTemplateEditor: React.ForwardRefExoticComponent<Omit<ClinicalTemplateEditorProps, "ref"> & React.RefAttributes<ClinicalTemplateEditorRef>>;
declare function exportHtmlFromJson(json: any, fileName?: string, mockData?: Record<string, any>): void;
interface NewTemplateModalProps {
show: boolean;
newTemplateName: string;
setNewTemplateName: (v: string) => void;
newTemplateType: string;
setNewTemplateType: (v: string) => void;
newTemplateDesc: string;
setNewTemplateDesc: (v: string) => void;
newTemplateVars: string;
setNewTemplateVars: (v: string) => void;
importedVariables: Array<{
name: string;
placeholder: string;
type?: string;
description?: string;
}>;
setImportedVariables: (v: Array<{
name: string;
placeholder: string;
type?: string;
description?: string;
}>) => void;
onCancel: () => void;
onSave: () => void;
}
declare const NewTemplateModal: React.FC<NewTemplateModalProps>;
interface ChartConfig {
width: number;
height: number;
tempMin: number;
tempMax: number;
pulseMin: number;
pulseMax: number;
gridCols: number;
gridRows: number;
chartStartY: number;
chartHeight: number;
}
interface PatientData {
name: string;
age?: string;
gender?: string;
inDate: string;
outDate: string;
diag: string;
dept: string;
bed: string;
medicalNo: string;
dates: string[];
times: string[];
hospitalDays: (string | number)[];
temperature: (number | string | null)[][];
pulse: (number | null)[][];
heartRate: (number | null)[][];
breath: (number | null)[];
bloodPressure: (string | null)[];
intake: (string | null)[];
output: (string | null)[];
bowel: (string | null)[];
urine: (string | null)[];
height: (string | null)[];
weight: (string | null)[];
allergy: (string | null)[];
notes?: string;
tempType?: string;
coolingType?: string;
}
interface HospitalInfo {
name: string;
department?: string;
address?: string;
phone?: string;
logo?: string;
}
interface TemperatureChartConfig {
patientName: string;
patientAge?: string;
patientGender?: string;
inDate: string;
outDate: string;
diagnosis: string;
department: string;
bedNumber: string;
medicalNumber: string;
days: number;
}
/**
* 生成默认的体温单数据
* @param config 体温单配置参数
* @returns 完整的患者数据对象
*/
declare const generateDefaultTemperatureChartData: (config: TemperatureChartConfig) => PatientData;
/**
* 创建空的体温单数据结构
* @param config 体温单配置参数
* @returns 空的患者数据对象
*/
declare const createEmptyTemperatureChartData: (config: TemperatureChartConfig) => PatientData;
export { ClinicalTemplateEditor, NewTemplateModal, createEmptyTemperatureChartData, exportHtmlFromJson, generateDefaultTemperatureChartData };
export type { ChartConfig, ClinicalTemplateEditorRef, HospitalInfo, PatientData, TemperatureChartConfig };