华西海圻ELN前端工程
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

690 lines
19 KiB

  1. <template>
  2. <div class="step-container">
  3. <el-button v-if="isShowAddStep()" type="primary" @click="addStep" icon="el-icon-plus">添加步骤</el-button>
  4. <div class="step-list">
  5. <draggable v-model="steps" ghost-class="ghost" handle=".drag-handle" @end="onDragEnd" :animation="200">
  6. <div v-for="(step, index) in steps" :key="step.id" class="step-list-item">
  7. <div class="step-content">
  8. <i class="el-icon-rank drag-handle" v-if="templateFillType === 'preFill'" style="cursor: move; margin-right: 10px; margin-top: 6px;"></i>
  9. <span class="step-title">{{ index + 1 }}</span>
  10. <HandleFormItem type="select" placeholder="请选择" class="step-type-select" :item="stepSelectConfig"
  11. v-model="step.type" @change="onTypeChange(index)" />
  12. <!-- 根据步骤类型显示对应的表单 -->
  13. <component class="flex1" :sn="step.type" :is="getStepComponent(step.type)" :formData="step.formData"
  14. @update="onFormUpdate(index, $event)" :stepIndex = "index" :ref="'stepCompRef_' + index">
  15. </component>
  16. <div v-if="templateFillType === 'preFill'" class="step-header-item">
  17. <el-popconfirm
  18. @confirm="removeStep(index)"
  19. title="确定删除当前步骤吗?"
  20. >
  21. <el-button type="text" slot="reference" icon="el-icon-delete"
  22. class="delete-btn"></el-button>
  23. </el-popconfirm>
  24. </div>
  25. </div>
  26. </div>
  27. </draggable>
  28. </div>
  29. </div>
  30. </template>
  31. <script>
  32. import draggable from 'vuedraggable';
  33. import { duplicateResource,justUpdateFilledFormData } from '@/utils/index.js';
  34. import HandleFormItem from './HandleFormItem.vue';
  35. import Czdd from './StepComponents/ry/czdd.vue';//溶液-操作地点
  36. import Czhj from './StepComponents/ry/czhj.vue';//溶液-操作方法
  37. import Xzrq from './StepComponents/ry/xzrq.vue';//溶液-选择容器
  38. import Jrry from './StepComponents/ry/jrry.vue';//溶液-加入溶液
  39. import Tpjydd from './StepComponents/ry/tpjydd.vue';//溶液-天平校验(单点)
  40. import Tpjysd from './StepComponents/ry/tpjysd.vue';//溶液-天平校验(双点)
  41. import Qywz from './StepComponents/ry/qywz.vue';//溶液-取用物质
  42. import Clfcz from './StepComponents/ry/clfcz.vue';//溶液-称量(非传值)
  43. import Clcz from './StepComponents/ry/clcz.vue';//溶液-称量(传值)
  44. import Bdtj from './StepComponents/ry/bdtj.vue';//溶液-标定(体积)
  45. import Bdzl from './StepComponents/ry/bdzl.vue';//溶液-标定(质量)
  46. import Tjphcz from './StepComponents/ry/tjphcz.vue';//溶液-调节PH(传值)
  47. import Tjphfcz from './StepComponents/ry/tjphfcz.vue';//溶液-调节PH(非传值)
  48. import Lx from './StepComponents/ry/lx.vue';//溶液-离心
  49. import Hwhy from './StepComponents/ry/hwhy.vue';//溶液-恒温混匀
  50. import Zyhy from './StepComponents/ry/zyhy.vue';//溶液-振摇混匀
  51. import Wxhy from "./StepComponents/ry/wxhy.vue";//溶液-涡旋混匀
  52. import Ddhy from "./StepComponents/ry/ddhy.vue";//溶液-颠倒混匀
  53. import Ym from "./StepComponents/ry/ym.vue";//溶液-研磨
  54. import Jb from "./StepComponents/ry/jb.vue";//溶液-搅拌
  55. import Jrjb from "./StepComponents/ry/jrjb.vue";//溶液-加热搅拌
  56. import Cs from "./StepComponents/ry/cs.vue";//溶液-超声
  57. import Sy from "./StepComponents/ry/sy.vue";//溶液-水浴
  58. import Zy from "./StepComponents/ry/zy.vue";//溶液-正压
  59. import Dc from "./StepComponents/ry/dc.vue";//溶液-氮吹
  60. import Jd from "./StepComponents/ry/jd.vue";//溶液-解冻
  61. import Jz from "./StepComponents/ry/jz.vue";//溶液-静置
  62. import Glzd from "./StepComponents/ry/glzd.vue";//溶液-过滤(自动)
  63. import Glsd from "./StepComponents/ry/glsd.vue";//溶液-过滤(手动)
  64. import Fy from "./StepComponents/ry/fy.vue";//溶液-孵育
  65. import Qcyy from "./StepComponents/ry/qcyy.vue";//溶液-取出原药
  66. import Frdrq from "./StepComponents/ry/frdrq.vue";//溶液-复溶(多容器)
  67. import Fr from "./StepComponents/ry/fr.vue";//溶液-复溶
  68. import Hb from "./StepComponents/ry/hb.vue";//溶液-合并
  69. import Rs from "./StepComponents/ry/rs.vue";//溶液-染色
  70. import Js from "./StepComponents/ry/js.vue";//溶液-计数
  71. import Mj from "./StepComponents/ry/mj.vue";//溶液-灭菌
  72. import Fs from "./StepComponents/ry/fs.vue";//溶液-复苏
  73. import Fb from "./StepComponents/ry/fb.vue";//溶液-封板
  74. import Zlfz from "./StepComponents/ry/zlfz.vue";//溶液-质量分装
  75. //罗开凡新增
  76. import kbyq from "./StepComponents/ry/kbyq.vue";//溶液-空白仪器
  77. import kbsjgsp from "./StepComponents/ry/kbsjgsp.vue";//溶液-空白(试剂/供试品)
  78. import kb from "./StepComponents/ry/kb.vue";//溶液-空白
  79. import jr from "./StepComponents/ry/jr.vue";//溶液-加热
  80. //罗开凡新增
  81. //表配置
  82. import jrry_b from './StepComponents/b/jrry_b.vue';//表配置-加入溶液
  83. //表配置-离心:使用溶液-离心
  84. import cl from './StepComponents/b/cl.vue';//表配置-称量
  85. //表配置-超声:使用溶液-超声
  86. //表配置-恒温混匀:使用溶液-恒温混匀
  87. //表配置-振摇混匀:使用溶液-振摇混匀
  88. //表配置-涡旋混匀:使用溶液-涡旋混匀
  89. //表配置-颠倒混匀:使用溶液-颠倒混匀
  90. //表配置-搅拌:使用溶液-搅拌
  91. //表配置-加热搅拌:使用溶液-加热搅拌
  92. //表配置-水浴:使用溶液-水浴
  93. //表配置-正压:使用溶液-正压
  94. //表配置-氮吹:使用溶液-氮吹
  95. //表配置-过滤(自动):使用溶液-过滤(自动)
  96. //表配置-过滤(手动):使用溶液-过滤(手动)
  97. //表配置-静置:使用溶液-静置
  98. //表配置-解冻:使用溶液-解冻
  99. //表配置-孵育:使用溶液-孵育
  100. //表配置-复溶:使用溶液-复溶
  101. //生物样品分析
  102. //生物样品分析-解冻:使用溶液-解冻
  103. //生物样品分析-涡旋混匀:使用溶液-涡旋混匀
  104. //生物样品分析-选择容器:使用溶液-选择容器
  105. import jryp from './StepComponents/swypfx/jryp.vue';//生物样品分析-加入样品
  106. //生物样品分析-衍生反应:使用溶液-离心
  107. import hhspe from './StepComponents/swypfx/hhspe.vue';//生物样品分析-活化(SPE)
  108. //生物样品分析-平衡(SPE):使用溶液-活化(SPE)
  109. //生物样品分析-上样(SPE):使用溶液-活化(SPE)
  110. //生物样品分析-淋洗(SPE):使用溶液-活化(SPE)
  111. //生物样品分析-洗脱(SPE):使用溶液-活化(SPE)
  112. import zyfc from './StepComponents/swypfx/zyfc.vue';//生物样品分析-转移(分层)
  113. //生物样品分析-氮吹:使用溶液-氮吹
  114. //生物样品分析-正压:使用溶液-正压
  115. //生物样品分析-孵育:使用溶液-孵育
  116. //生物样品分析-复溶:使用溶液-复溶
  117. //色谱匀浆组织表
  118. import jszz from './StepComponents/spyjzzb/jszz.vue';//色谱匀浆组织表-剪碎组织
  119. //色谱匀浆组织表-称取组织:使用色谱匀浆组织表-剪碎组织
  120. //色谱匀浆组织表-匀浆液混合:使用色谱匀浆组织表-剪碎组织
  121. import { public_templateStepList } from '@/api/business/public/public';
  122. // const stepTypes = [
  123. // { label: '操作地点', value: 'czdd' },
  124. // { label: '操作方法', value: 'czhj' },
  125. // { label: '选择容器', value: 'xzrq' },
  126. // { label: '加入溶液', value: 'jrry' },
  127. // { label: '天平校验(单点)', value: 'tpjydd' },
  128. // { label: '天平校验(双点)', value: 'tpjysd' },
  129. // { label: '取用物质', value: 'qywz' },
  130. // { label: '称量(非传值)', value: 'clfcz' },
  131. // { label: '称量(传值)', value: 'clcz' },
  132. // { label: '标定(体积)', value: 'bdtj' },
  133. // { label: '标定(质量)', value: 'bdzl' },
  134. // { label: '调节PH(传值)', value: 'tjphcz' },
  135. // { label: '调节PH(非传值)', value: 'tjphfcz' },
  136. // { label: '离心', value: 'lx' },
  137. // { label: '恒温混匀', value: 'hwhy' },
  138. // { label: '振摇混匀', value: 'zyhy' },
  139. // { label: '涡旋混匀', value: 'wxhy' },
  140. // { label: '颠倒混匀', value: 'ddhy' },
  141. // { label: '研磨', value: 'ym' },
  142. // { label: '搅拌', value: 'jb' },
  143. // { label: '加热搅拌', value: 'jrjb' },
  144. // { label: '超声', value: 'cs' },
  145. // { label: '水浴', value: 'sy' },
  146. // { label: '正压', value: 'zy' },
  147. // { label: '氮吹', value: 'dc' },
  148. // { label: '解冻', value: 'jd' },
  149. // { label: '静置', value: 'jz' },
  150. // { label: '过滤(自动)', value: 'glzd' },
  151. // { label: '过滤(手动)', value: 'glsd' },
  152. // { label: '孵育', value: 'fy' },
  153. // { label: '取出原药', value: 'qcyy' },
  154. // { label: '复溶(多容器)', value: 'frdrq' },
  155. // { label: '复溶', value: 'fr' },
  156. // { label: '合并', value: 'hb' },
  157. // { label: '染色', value: 'rs' },
  158. // { label: '计数', value: 'js' },
  159. // { label: '灭菌', value: 'mj' },
  160. // { label: '复苏', value: 'fs' },
  161. // { label: '封板', value: 'fb' },
  162. // { label: '质量分装', value: 'zlfz' },
  163. // ];
  164. export default {
  165. inject: ['templateFillType','templateData'],
  166. name: 'Step',
  167. props: {
  168. formData: {
  169. type: Array,
  170. default: () => []
  171. }
  172. },
  173. data() {
  174. return {
  175. stepSelectConfig: {
  176. options: [],
  177. fillType: "preFill",
  178. placeholder: "请选择步骤类型"
  179. },
  180. steps: [],
  181. stepId: 1,
  182. componentMap: null
  183. }
  184. },
  185. components: {
  186. draggable,
  187. HandleFormItem,
  188. Czdd,
  189. Czhj,
  190. Xzrq,
  191. Jrry,
  192. Tpjydd,
  193. Tpjysd,
  194. Qywz,
  195. Clfcz,
  196. Clcz,
  197. Bdtj,
  198. Bdzl,
  199. Tjphcz,
  200. Tjphfcz,
  201. Lx,
  202. Hwhy,
  203. Zyhy,
  204. Wxhy,
  205. Ddhy,
  206. Ym,
  207. Jb,
  208. Jrjb,
  209. Cs,
  210. Sy,
  211. Zy,
  212. Dc,
  213. Jd,
  214. Jz,
  215. Glzd,
  216. Glsd,
  217. Fy,
  218. Qcyy,
  219. Frdrq,
  220. Fr,
  221. Hb,
  222. Rs,
  223. Js,
  224. Mj,
  225. Fs,
  226. Fb,
  227. Zlfz,
  228. //罗开凡新增
  229. kbyq,
  230. kbsjgsp,
  231. kb,
  232. jr,
  233. //罗开凡新增
  234. //表配置
  235. jrry_b,
  236. cl,
  237. //生物样品分析
  238. jryp,
  239. hhspe,
  240. zyfc,
  241. //色谱匀浆组织表
  242. jszz,
  243. },
  244. computed: {
  245. stepComponentMap() {
  246. if (!this.componentMap) {
  247. this.componentMap = {
  248. 'czdd': 'Czdd',
  249. 'czhj': 'Czhj',
  250. 'xzrq': 'Xzrq',
  251. 'jrry': 'Jrry',
  252. 'tpjydd': 'Tpjydd',
  253. 'tpjysd': 'Tpjysd',
  254. 'qywz': 'Qywz',
  255. 'clfcz': 'Clfcz',
  256. 'clcz': 'Clcz',
  257. 'bdtj': 'Bdtj',
  258. 'bdzl': 'Bdzl',
  259. 'tjphcz': 'Tjphcz',
  260. 'tjphfcz': 'Tjphfcz',
  261. 'lx': 'Lx',
  262. 'hwhy': 'Hwhy',
  263. 'zyhy': 'Zyhy',
  264. 'wxhy': 'Wxhy',
  265. 'ddhy': 'Ddhy',
  266. 'ym': 'Ym',
  267. 'jb': 'Jb',
  268. 'jrjb': 'Jrjb',
  269. 'sy': 'Sy',
  270. 'zy': 'Zy',
  271. 'cs': 'Cs',
  272. 'dc': 'Dc',
  273. 'jd': 'Jd',
  274. 'jz': 'Jz',
  275. 'glzd': 'Glzd',
  276. 'glsd': 'Glsd',
  277. 'fy': 'Fy',
  278. 'qcyy': 'Qcyy',
  279. 'frdrq': 'Frdrq',
  280. 'fr': 'Fr',
  281. 'hb': 'Hb',
  282. 'rs': 'Rs',
  283. 'js': 'Js',
  284. 'mj': 'Mj',
  285. 'fs': 'Fs',
  286. 'fb': 'Fb',
  287. 'zlfz': 'Zlfz',
  288. //罗开凡新增
  289. 'kbyq': 'kbyq',
  290. 'kbsjgsp': 'kbsjgsp',
  291. 'kb': 'kb',
  292. 'jr': 'jr',
  293. // 'fz': 'fz',
  294. //罗开凡新增
  295. //标配配置
  296. 'jrry_b': 'jrry_b',
  297. 'cl': 'cl',
  298. 'lx_b': 'Lx',
  299. 'cs_b': 'Cs',
  300. 'hwhy_b': 'Hwhy',
  301. 'zyhy_b': 'Zyhy',
  302. 'wxhy_b': 'Wxhy',
  303. 'ddhy_b': 'Ddhy',
  304. 'jb_b': 'Jb',
  305. 'jrjb_b': 'Jrjb',
  306. 'sy_b': 'Sy',
  307. 'zy_b': 'Zy',
  308. 'dc_b': 'Dc',
  309. 'glzd_b': 'Glzd',
  310. 'glsd_b': 'Glsd',
  311. 'jz_b': 'Jz',
  312. 'jd_b': 'Jd',
  313. 'fy_b': 'Fy',
  314. 'fr_b': 'Fr',
  315. //生物样品分析
  316. 'jd_swypfx': 'Jd',
  317. 'jryp': 'jryp',
  318. 'ysfy': 'Lx',
  319. 'hhspe': 'hhspe',
  320. 'phspe': 'hhspe',
  321. 'syspe': 'hhspe',
  322. 'lxspe': 'hhspe',
  323. 'xtspe': 'hhspe',
  324. 'zyfc': 'zyfc',
  325. //色谱匀浆组织表
  326. 'jszz':'jszz',
  327. 'cqzz':'jszz',
  328. 'yjyhh':'jszz',
  329. }
  330. }
  331. return this.componentMap
  332. }
  333. },
  334. created() {
  335. // // 初始化步骤数据
  336. // if (this.value && this.value.length > 0) {
  337. // this.steps = this.value.map((step) => ({
  338. // id: this.stepId++,
  339. // type: step.type || '',
  340. // formData: step.formData || {}
  341. // }))
  342. // } else {
  343. // // 默认添加一个步骤
  344. // this.addStep()
  345. // }
  346. this.getStepList()
  347. },
  348. watch: {
  349. // steps: {
  350. // handler(newVal) {
  351. // this.$emit('input', newVal);
  352. // },
  353. // deep: true
  354. // },
  355. formData: {
  356. handler(newVal) {
  357. if (!newVal || newVal.length === 0) return
  358. this.steps = newVal;
  359. },
  360. deep: true,
  361. immediate: true
  362. }
  363. },
  364. methods: {
  365. onDragEnd(evt) {
  366. justUpdateFilledFormData();
  367. },
  368. getStepList(){
  369. public_templateStepList({templateId:this.templateData.templateId}).then(response => {
  370. let options = []
  371. _.forEach(response.data,(item)=>{
  372. options.push({ label: item.name, value: item.sn })
  373. })
  374. this.stepSelectConfig.options = options
  375. });
  376. },
  377. isShowAddStep() {
  378. return this.templateFillType === 'preFill';
  379. },
  380. addStep() {
  381. try {
  382. this.steps.push({
  383. id: this.stepId++,
  384. type: '',
  385. formData: {}
  386. })
  387. this.$emit('step-added', this.steps.length)
  388. } catch (error) {
  389. console.error('添加步骤失败:', error)
  390. this.$message.error('添加步骤失败,请重试')
  391. }
  392. },
  393. removeStep(index) {
  394. if (this.steps.length > 1) {
  395. const removedStep = this.steps.splice(index, 1)[0]
  396. this.$emit('step-removed', { index, step: removedStep, remaining: this.steps.length })
  397. } else {
  398. this.$message.warning('至少需要保留一个步骤')
  399. }
  400. },
  401. onTypeChange(index) {
  402. // 切换步骤类型时重置表单数据,并确保数据更新
  403. const oldType = this.steps[index].type
  404. this.$set(this.steps[index], 'formData', {})
  405. // 可选:添加类型变化的回调
  406. this.$emit('step-type-changed', {
  407. index,
  408. newType: this.steps[index].type,
  409. oldType
  410. })
  411. },
  412. onFormUpdate(stepIndex, formData) {
  413. this.steps[stepIndex].formData = formData
  414. },
  415. getStepComponent(type) {
  416. // 使用计算属性中的映射,提高性能
  417. return this.stepComponentMap[type]
  418. },
  419. // 公共方法:获取所有步骤数据
  420. getFormData() {
  421. return new Promise(async (resolve, reject) => {
  422. // 检查是否有步骤数据
  423. if (this.steps.length === 0) {
  424. // this.$message.error(this.$t('template.common.addStepError'))
  425. reject({ errorType: "step" });
  426. return
  427. }
  428. try {
  429. const stepData = await Promise.all(
  430. this.steps.map(async (step, index) => {
  431. const stepComponentRef = this.$refs[`stepCompRef_${index}`];
  432. if (stepComponentRef && stepComponentRef.length > 0) {
  433. try {
  434. const stepFormData = await stepComponentRef[0].getFormData();
  435. return { type: step.type, formData: stepFormData }
  436. } catch (error) {
  437. // 如果某个步骤的getFormData方法失败,抛出错误
  438. throw error;
  439. }
  440. } else {
  441. // 如果没有找到组件引用,返回原始数据
  442. return { type: step.type, formData: step.formData }
  443. }
  444. })
  445. );
  446. resolve({ stepData });
  447. } catch (error) {
  448. reject(error);
  449. }
  450. })
  451. },
  452. getStepResource(){
  453. const sj = [];
  454. let yq = [];
  455. this.steps.map((step, index) => {
  456. const stepComponentRef = this.$refs[`stepCompRef_${index}`];
  457. if(stepComponentRef && stepComponentRef.length > 0){
  458. const {sjResource,yqResource} = this.$refs[`stepCompRef_${index}`][0]?.getSjResource();
  459. if(sjResource && sjResource.length > 0){
  460. sj.push(...sjResource);
  461. }
  462. if(yqResource && yqResource.length > 0){
  463. yq.push(...yqResource);
  464. }
  465. }
  466. })
  467. const resource = duplicateResource(sj, yq);
  468. return { sjResource: resource.sj, yqResource: resource.yq };
  469. },
  470. // 直接获取表单数据,不做校验
  471. getFilledFormData() {
  472. const stepData = this.steps.map((step, index) => {
  473. const stepComponentRef = this.$refs[`stepCompRef_${index}`];
  474. if(stepComponentRef && stepComponentRef.length > 0){
  475. const stepFormData = this.$refs[`stepCompRef_${index}`][0]?.getFilledFormData();
  476. return { type: step.type, formData: stepFormData }
  477. }else{
  478. return { type: step.type, formData: step.formData }
  479. }
  480. })
  481. return { stepData }
  482. },
  483. // 公共方法:设置步骤数据
  484. setStepData(data) {
  485. if (Array.isArray(data)) {
  486. this.steps = data.map(step => ({
  487. id: this.stepId++,
  488. type: step.type || '',
  489. formData: step.formData || {}
  490. }))
  491. }
  492. },
  493. // 公共方法:重置所有步骤
  494. resetSteps() {
  495. this.steps = [{
  496. id: this.stepId++,
  497. type: '',
  498. formData: {}
  499. }]
  500. this.$emit('steps-reset')
  501. },
  502. // 公共方法:获取指定步骤的数据
  503. getStepDataByIndex(index) {
  504. if (index >= 0 && index < this.steps.length) {
  505. return {
  506. type: this.steps[index].type,
  507. formData: this.steps[index].formData
  508. }
  509. }
  510. return null
  511. },
  512. // 公共方法:验证所有步骤
  513. async validateSteps() {
  514. const errors = []
  515. for (let index = 0; index < this.steps.length; index++) {
  516. const step = this.steps[index];
  517. if (!step.type) {
  518. errors.push(`步骤 ${index + 1}: 请选择步骤类型`)
  519. continue;
  520. }
  521. // 获取当前步骤的组件实例
  522. const stepComponentRef = this.$refs[`stepCompRef_${index}`];
  523. if (stepComponentRef && stepComponentRef.length > 0) {
  524. try {
  525. // 调用子组件的getFormData方法进行验证(不抛出错误,只验证)
  526. await stepComponentRef[0].validateAndMarkRed();
  527. } catch (error) {
  528. // validateAndMarkRed方法不应该抛出错误,但如果有的话捕获它
  529. console.error(`步骤 ${index + 1} 验证时出错:`, error);
  530. }
  531. }
  532. }
  533. return {
  534. isValid: errors.length === 0,
  535. errors
  536. }
  537. },
  538. // 公共方法:批量导入步骤数据
  539. importSteps(stepDataArray) {
  540. if (Array.isArray(stepDataArray)) {
  541. this.steps = stepDataArray.map((step, index) => ({
  542. id: this.stepId++,
  543. type: step.type || '',
  544. formData: step.formData || {}
  545. }))
  546. this.$emit('steps-imported', this.steps.length)
  547. }
  548. },
  549. // 公共方法:获取步骤统计信息
  550. getStepStatistics() {
  551. const stats = {
  552. total: this.steps.length,
  553. byType: {},
  554. filled: 0
  555. }
  556. this.steps.forEach(step => {
  557. // 统计各类型数量
  558. if (step.type) {
  559. stats.byType[step.type] = (stats.byType[step.type] || 0) + 1
  560. }
  561. // 统计已填写的步骤
  562. if (step.type && Object.keys(step.formData).length > 0) {
  563. stats.filled++
  564. }
  565. })
  566. return stats
  567. }
  568. },
  569. }
  570. </script>
  571. <style lang="scss" scoped>
  572. .step-container {
  573. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  574. margin-top: 24px;
  575. padding: 24px;
  576. border-radius: 5px 5px;
  577. .step-header {
  578. margin-bottom: 20px;
  579. padding: 15px;
  580. background: #f5f7fa;
  581. border-radius: 6px;
  582. }
  583. .flex1 {
  584. flex:1
  585. }
  586. .step-list {
  587. padding-top: 10px;
  588. .step-list-item {
  589. page-break-inside: avoid;
  590. padding-top: 10px;
  591. border-radius: 6px;
  592. overflow: hidden;
  593. transition: background-color 0.2s;
  594. &:hover {
  595. // background-color: #f5f7fa;
  596. }
  597. &.ghost {
  598. background-color: transparent !important;
  599. }
  600. .drag-handle {
  601. color: #909399;
  602. transition: color 0.2s;
  603. &:hover {
  604. color: #409eff;
  605. }
  606. }
  607. .step-title {
  608. margin-right: 10px;
  609. margin-top: 6px;
  610. }
  611. .step-type-select {
  612. width: 200px;
  613. margin-right: 10px;
  614. max-width: 200px;
  615. }
  616. .delete-btn {
  617. color: #f56c6c;
  618. &:hover {
  619. color: #f78989;
  620. }
  621. &:disabled {
  622. color: #c0c4cc;
  623. }
  624. }
  625. .step-content {
  626. display: flex;
  627. align-items: flex-start;
  628. }
  629. }
  630. }
  631. }
  632. </style>