diff --git a/clinical-web/src/components/signing/NewSigningTaskDialog.vue b/clinical-web/src/components/signing/NewSigningTaskDialog.vue index ff9f473..de33842 100644 --- a/clinical-web/src/components/signing/NewSigningTaskDialog.vue +++ b/clinical-web/src/components/signing/NewSigningTaskDialog.vue @@ -161,6 +161,10 @@ watch( resetForm() await loadTemplates() await nextTick() + // 自动聚焦只是让人可以直接开始打字;**下拉不跟着弹**。 + // 展开入口挂在 @click / @input 上,不挂 @focus —— 原型是 onfocus 即展开 + // (openM 里还会 ntPid.focus()),这里按使用要求有意偏离: + // 打开弹窗就盖住 B/C/D 三区,什么还没做就得先把它关掉。 patientInput.value?.focus() }, ) @@ -197,7 +201,7 @@ watch( v-model="patientId" placeholder="如:P202610001 或 患者姓名" aria-label="患者 ID" - @focus="openSuggestions" + @click="openSuggestions" @input="handlePatientInput" @blur="handlePatientBlur" @keydown.enter.prevent="locatePatient" @@ -908,9 +912,24 @@ watch( align-items: stretch; } +/** + * C 区(选择文档)高度**固定为最大值**,不随树内容伸缩。 + * + * 树原来是 `max-height: 340px` 的自适应:科室下只有一个分类、或右栏只命中一份文档时, + * 整块会缩到一百多像素;展开内容多了再长回去 —— 于是整个弹窗一会儿高一会儿低, + * 点一下分类就跳一次。这里把树的可用高度钉死在「满高」340px。 + * + * 固定的是 **section-body 的内容区**(356 = 树 340 + 上下内边距 16),不是整块 C 区: + * C 区表头里有一个搜索框,比其他分区的表头高一截,写死整块高度会把树压矮 + * (第一版写 `height: 388px` 就压成了 330,因为算漏了这个搜索框)。 + * + * 校验错误出现时是**挤掉树的高度**,而不是把 C 区顶高 —— 否则提交失败那一下弹窗仍然会跳。 + */ .document-section { + display: flex; min-width: 0; flex: 1; + flex-direction: column; } .method-section { @@ -924,10 +943,20 @@ watch( margin-bottom: 0; } +.document-section .section-body { + display: flex; + height: 356px; + flex: none; + flex-direction: column; + min-height: 0; +} + +/* D 区靠 .document-method-grid 的 align-items:stretch 与 C 区等高;内容少就留白 */ .method-section .section-body { display: flex; flex: 1; flex-direction: column; + min-height: 0; } .nt-search { @@ -941,24 +970,27 @@ watch( border-radius: 6px; } -/* 两栏:左 196px 科室→分类,右 1fr 文档标题 */ +/* 两栏:左 196px 科室→分类,右 1fr 文档标题。 + 树撑满 C 区剩余高度(不再自己定高),两栏各自滚动 —— 高度由 .document-section 钉住 */ .template-tree { display: grid; + flex: 1; + min-height: 0; grid-template-columns: 196px minmax(0, 1fr); border: 1px solid var(--line); border-radius: 8px; } .nt-tree-left { - max-height: 340px; + min-height: 0; padding: 2px 6px 2px 2px; overflow-y: auto; border-right: 1px solid var(--line); } .nt-tree-right { - max-height: 340px; + min-height: 0; padding: 6px 4px 6px 10px; overflow-y: auto; } @@ -1384,6 +1416,8 @@ watch( .template-tree { grid-template-columns: 1fr; + /* 单栏后两行要显式分高:左栏按内容(上限 200px),右栏吃掉剩余并自己滚动 */ + grid-template-rows: auto minmax(0, 1fr); } .nt-tree-left {