| | |
| | | <div class="tfe-badge">{{ index + 1 }}</div> |
| | | <div class="tfe-head"> |
| | | <span class="tfe-level">{{ levelText(index) }}</span> |
| | | <el-radio-group v-model="item.signMode" size="small" @change="emitOut"> |
| | | <el-radio-group |
| | | v-if="!readonly" |
| | | v-model="item.signMode" |
| | | size="small" |
| | | @change="emitOut" |
| | | > |
| | | <el-radio-button value="countersign">会签</el-radio-button> |
| | | <el-radio-button value="or_sign">或签</el-radio-button> |
| | | </el-radio-group> |
| | | <el-tag v-else size="small" type="info" effect="plain"> |
| | | {{ signModeLabel(item.signMode) }} |
| | | </el-tag> |
| | | </div> |
| | | <p class="tfe-mode-tip">{{ signModeTip(item.signMode) }}</p> |
| | | <div class="tfe-select"> |
| | | <div v-if="!readonly" class="tfe-select"> |
| | | <el-select |
| | | v-model="item.approverIds" |
| | | multiple |
| | |
| | | /> |
| | | </el-select> |
| | | </div> |
| | | <div v-if="item.approvers?.length" class="tfe-chips"> |
| | | <div v-if="item.approvers?.length" class="tfe-chips" :class="{ 'tfe-chips--readonly': readonly }"> |
| | | <el-tag |
| | | v-for="a in item.approvers" |
| | | :key="String(a.approverId)" |
| | |
| | | {{ a.approverName || "—" }} |
| | | </el-tag> |
| | | </div> |
| | | <div class="tfe-actions"> |
| | | <div v-if="!readonly" class="tfe-actions"> |
| | | <el-button type="primary" circle size="small" :disabled="index === 0" title="前移" @click="moveLeft(index)"> |
| | | <el-icon><ArrowLeft /></el-icon> |
| | | </el-button> |
| | |
| | | <el-icon><Delete /></el-icon> |
| | | </el-button> |
| | | </div> |
| | | <p v-else-if="!item.approvers?.length" class="tfe-empty-approver">暂无审批人</p> |
| | | </div> |
| | | <div v-if="index < innerList.length - 1" class="tfe-conn"> |
| | | <div class="tfe-conn-line"></div> |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="tfe-add-wrap"> |
| | | <div v-if="!readonly" class="tfe-add-wrap"> |
| | | <div v-if="innerList.length" class="tfe-conn"> |
| | | <div class="tfe-conn-line"></div> |
| | | <el-icon class="tfe-conn-icon"><ArrowRight /></el-icon> |
| | |
| | | <div v-else class="tfe-empty"> |
| | | <el-icon :size="44" color="#c0c4cc"><User /></el-icon> |
| | | <p>暂无审批节点</p> |
| | | <el-button type="primary" @click="addNode">添加第一个节点</el-button> |
| | | <el-button v-if="!readonly" type="primary" @click="addNode">添加第一个节点</el-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | const props = defineProps({ |
| | | modelValue: { type: Array, default: () => [] }, |
| | | userOptions: { type: Array, default: () => [] }, |
| | | /** 选择模板后申请场景:仅展示,不可改审批人/节点 */ |
| | | readonly: { type: Boolean, default: false }, |
| | | }); |
| | | |
| | | const emit = defineEmits(["update:modelValue"]); |
| | |
| | | |
| | | function signModeTip(mode) { |
| | | return NODE_SIGN_MODE_OPTIONS.find((x) => x.value === mode)?.desc || ""; |
| | | } |
| | | |
| | | function signModeLabel(mode) { |
| | | return ( |
| | | NODE_SIGN_MODE_OPTIONS.find((x) => x.value === mode)?.label || |
| | | (mode === "or_sign" ? "或签" : "会签") |
| | | ); |
| | | } |
| | | |
| | | function levelText(i) { |
| | |
| | | } |
| | | |
| | | function addNode() { |
| | | if (props.readonly) return; |
| | | innerList.value.push({ |
| | | _uid: newUid(), |
| | | nodeOrder: innerList.value.length + 1, |
| | |
| | | } |
| | | |
| | | function remove(index) { |
| | | if (props.readonly) return; |
| | | innerList.value.splice(index, 1); |
| | | emitOut(); |
| | | } |
| | | |
| | | function moveLeft(index) { |
| | | if (props.readonly) return; |
| | | if (index < 1) return; |
| | | const t = innerList.value[index]; |
| | | innerList.value[index] = innerList.value[index - 1]; |
| | |
| | | } |
| | | |
| | | function moveRight(index) { |
| | | if (props.readonly) return; |
| | | if (index >= innerList.value.length - 1) return; |
| | | const t = innerList.value[index]; |
| | | innerList.value[index] = innerList.value[index + 1]; |
| | |
| | | margin-bottom: 8px; |
| | | min-height: 24px; |
| | | } |
| | | .tfe-chips--readonly { |
| | | margin-top: 4px; |
| | | margin-bottom: 0; |
| | | } |
| | | .tfe-empty-approver { |
| | | font-size: 12px; |
| | | color: var(--el-text-color-placeholder); |
| | | margin: 4px 0 0; |
| | | } |
| | | .tfe-actions { |
| | | display: flex; |
| | | justify-content: center; |