<script setup lang="ts">
|
import { computed, reactive, ref } from "vue";
|
import { onLoad } from "@dcloudio/uni-app";
|
import { createProcessExpression, getProcessExpression, updateProcessExpression, type BpmProcessExpression } from "../../../api/bpm";
|
import { useAuth } from "../../../stores/auth";
|
import { toast } from "../admin-shared";
|
const { hasPermission, state }=useAuth(); const id=ref<number>(); const mode=ref("edit"); const saving=ref(false); const readonly=computed(()=>mode.value==="detail"); const canSave=computed(()=>!readonly.value&&(id.value?hasPermission("bpm:process-expression:update"):hasPermission("bpm:process-expression:create")));
|
const form=reactive<BpmProcessExpression>({name:"",status:0,expression:""});
|
onLoad(async q=>{ if(q?.id){id.value=Number(q.id);mode.value=String(q.mode||"edit");if(state.accessToken)Object.assign(form,await getProcessExpression(state.accessToken,id.value));}});
|
async function save(){ if(saving.value||!canSave.value)return; if(!state.accessToken)return; if(!form.name){toast("请填写表达式名称");return;} saving.value=true; try{ if(id.value)await updateProcessExpression(state.accessToken,form); else await createProcessExpression(state.accessToken,form); uni.showToast({title:"已保存",icon:"success"}); setTimeout(()=>uni.navigateBack(),500);}catch(e){toast(e instanceof Error?e.message:"保存失败");}finally{saving.value=false}}
|
</script>
|
<template><view class="page"><view class="card"><view class="field"><text>表达式名称 <text class="required">*</text></text><input v-model="form.name" :disabled="!canSave" placeholder="请输入表达式名称"/></view><view class="field"><text>状态</text><switch :checked="form.status!==1" :disabled="!canSave" @change="form.status=$event.detail.value?0:1"/></view><view class="field column"><text>表达式</text><textarea v-model="form.expression" :disabled="!canSave" placeholder="请输入表达式"/></view></view><button v-if="canSave" class="save" :loading="saving" @click="save">保存</button></view></template>
|
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:220rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}</style>
|