|
|
@@ -0,0 +1,160 @@
|
|
|
+import {EditType, Runtime} from './edit'
|
|
|
+import {UnwrapRef} from 'vue'
|
|
|
+
|
|
|
+type AppContext =
|
|
|
+ | any
|
|
|
+ | (() => {
|
|
|
+ [key: string]: any
|
|
|
+})
|
|
|
+
|
|
|
+interface Options {
|
|
|
+ appContext?: AppContext
|
|
|
+ event?: {
|
|
|
+ [key: string]: (...val: any[]) => void
|
|
|
+ }
|
|
|
+ tabletMode: boolean
|
|
|
+}
|
|
|
+
|
|
|
+export interface UseEmrInitReturn {
|
|
|
+ editor?: EditType
|
|
|
+ runtime?: Runtime
|
|
|
+ iframe?: HTMLIFrameElement
|
|
|
+ delElementByName?: (name: string) => void
|
|
|
+ loadDocument?: (loadParams: LoadParams) => Promise<any>
|
|
|
+ loadAndSetDocument?: (loadParams: LoadParams) => Promise<any>
|
|
|
+}
|
|
|
+
|
|
|
+export interface LoadParams {
|
|
|
+ //文档id
|
|
|
+ documentId?: string
|
|
|
+ // 文档类型
|
|
|
+ categoryCode?: string
|
|
|
+ // 患者id
|
|
|
+ patientId?: string
|
|
|
+ //病历类型id
|
|
|
+ categoryId?: string
|
|
|
+ // 文档版本号
|
|
|
+ version?: string
|
|
|
+}
|
|
|
+
|
|
|
+function delElementByName(this: any, name: string, editor: EditType) {
|
|
|
+ editor.execute('execFn', {
|
|
|
+ value: {
|
|
|
+ fn: function () {
|
|
|
+ const EMR = editor.getScriptRuntime().EMR
|
|
|
+ const emrDoc = EMR.getDocument()
|
|
|
+ const components = emrDoc.getComponentsByCode(name)
|
|
|
+ components.forEach((component) => {
|
|
|
+ const view = component.target
|
|
|
+ const viewDom = view.el
|
|
|
+ const viewParagraphDom = viewDom.parentElement
|
|
|
+ viewDom.remove()
|
|
|
+ if (viewParagraphDom.textContent === '') {
|
|
|
+ viewParagraphDom.remove()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ persist: true,
|
|
|
+ scope: this,
|
|
|
+ params: name
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+export function useEmrInit(
|
|
|
+ div: UnwrapRef<HTMLElement | null>,
|
|
|
+ options?: Options
|
|
|
+): Promise<UseEmrInitReturn> {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ // @ts-ignore
|
|
|
+ if (div['emr']) {
|
|
|
+ throw new Error('该div已挂载请选择其他div')
|
|
|
+ }
|
|
|
+ const iframe: HTMLIFrameElement = document.createElement('iframe')
|
|
|
+ let editor: EditType, runtime: Runtime
|
|
|
+
|
|
|
+ iframe.style.width = '100%'
|
|
|
+ iframe.style.height = '100%'
|
|
|
+
|
|
|
+ let additionalParameters: string = ''
|
|
|
+ if (options && options.tabletMode) {
|
|
|
+ additionalParameters += '?layout=mobile-zoom'
|
|
|
+ }
|
|
|
+
|
|
|
+ iframe.src = '/emr/runtime/#/editor' + additionalParameters
|
|
|
+ iframe.style.border = '0'
|
|
|
+
|
|
|
+ function loadDocument(loadParams: LoadParams): Promise<any> {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ runtime.loadDocument(
|
|
|
+ (res) => {
|
|
|
+ resolve(res)
|
|
|
+ },
|
|
|
+ (err) => {
|
|
|
+ reject(err)
|
|
|
+ },
|
|
|
+ loadParams
|
|
|
+ )
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ function backToTop() {
|
|
|
+ iframe?.contentWindow?.document?.getElementById('editorEl')?.scroll({top: 0})
|
|
|
+ }
|
|
|
+
|
|
|
+ function loadAndSetDocument(loadParams: LoadParams): Promise<void> {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ loadDocument(loadParams)
|
|
|
+ .then((res) => {
|
|
|
+ backToTop()
|
|
|
+ editor.setDocument(res, true)
|
|
|
+ resolve(res)
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ reject(err)
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // @ts-ignore
|
|
|
+ div['emr'] = {
|
|
|
+ setEditor: (e: EditType, r: any): void => {
|
|
|
+ editor = e
|
|
|
+ runtime = r
|
|
|
+
|
|
|
+ // @ts-ignore
|
|
|
+ div['myEmr'] = {
|
|
|
+ editor: e,
|
|
|
+ runtime: r
|
|
|
+ }
|
|
|
+
|
|
|
+ if (options && options.event) {
|
|
|
+ for (const key in options.event) {
|
|
|
+ editor.on(key, options.event[key])
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ resolve({
|
|
|
+ editor,
|
|
|
+ runtime,
|
|
|
+ iframe,
|
|
|
+ delElementByName: (name: string) => delElementByName(name, editor),
|
|
|
+ loadDocument,
|
|
|
+ loadAndSetDocument
|
|
|
+ })
|
|
|
+ },
|
|
|
+ getAppContext: (): any => {
|
|
|
+ if (options && options.appContext) {
|
|
|
+ if (typeof options.appContext === 'function') {
|
|
|
+ return options.appContext()
|
|
|
+ }
|
|
|
+ return options.appContext
|
|
|
+ }
|
|
|
+ return {}
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // @ts-ignore
|
|
|
+ div.appendChild(iframe)
|
|
|
+ })
|
|
|
+}
|