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.

300 lines
6.6 KiB

<script>
import {deepCopy} from "@/utils";
import formBuilder from "@/utils/formBuilder";
import {PopupManager} from "element-ui/lib/utils/popup";
import request from '@/utils/request'
import moment from "moment/moment";
export default {
props: {
isFirstNode: {
type: Boolean,
default: true,
},
readable: {
type: Array,
default: () => [],
required: true,
},
writeable: {
type: Array,
default: () => [],
required: true,
},
originalForm: {
type: Object,
default: () => ({}),
required: true,
},
subForm: {
type: Map,
default: () => new Map(),
},
device: {
type: String,
default: "desktop",
required: true,
},
fields: {
type: Array,
default: () => [],
required: true,
},
scriptContent: String,
rules: {
type: Object,
default: () => ({}),
},
subRules: {
type: Object,
default: () => ({}),
},
logs: {
type: Array,
default: () => []
}
},
data() {
return {
// 脚本注入控制的modal弹窗
zIndex: PopupManager.nextZIndex(),
isShowModal: false,
modalRender: () => {},
action: process.env.VUE_APP_BASE_API,
form: {},
datetimeFormat: 'yyyy-MM-dd HH:mm',
copyShortcuts: [
{
text: "一年前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "years").toDate()
);
},
},
{
text: "一月前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "months").toDate()
);
},
},
{
text: "一周前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "weeks").toDate()
);
},
},
{
text: "今天",
onClick(picker) {
picker.$emit("pick", new Date());
},
},
{
text: "一周后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "weeks").toDate());
},
},
{
text: "一月后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "months").toDate());
},
},
{
text: "一年后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "years").toDate());
},
},
],
shortcuts: [
{
text: "一年前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "years").toDate()
);
},
},
{
text: "一月前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "months").toDate()
);
},
},
{
text: "一周前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "weeks").toDate()
);
},
},
{
text: "今天",
onClick(picker) {
picker.$emit("pick", new Date());
},
},
{
text: "一周后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "weeks").toDate());
},
},
{
text: "一月后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "months").toDate());
},
},
{
text: "一年后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "years").toDate());
},
},
],
flows: [],
flowSelectLoading: false,
nowSelectId: ''
};
},
methods: {
request,
async validate() {
const $elForm = this.$refs['elForm']
if ($elForm) {
await this.$refs['elForm'].validate()
}
let subFormName = this.fields.filter(i => i.type === 'relation').map(i => i.name)
for (let i = 0;i < subFormName.length;i++) {
let $subForm = this.$refs[`subForm-${subFormName[i]}`]
if ($subForm) {
const errMap = await this.$refs[`subForm-${subFormName[i]}`].validate()
if (errMap) {
throw new Error(errMap)
}
}
}
},
},
computed: {},
watch: {
info(newVal) {
let keys = newVal.map((i) => i.name);
keys.forEach((key) => {
this.form[key] = "";
});
},
originalForm(newVal) {
this.form = deepCopy(newVal);
},
scriptContent(newVal) {
if (newVal) {
try {
new Function(newVal).bind(this)();
} catch (err) {
console.error(err);
}
}
},
isShowModal(newVal) {
if (newVal) {
this.zIndex = PopupManager.nextZIndex();
}
},
},
render(h) {
const authFields = this.fields.map((field) => ({
...field,
_readable:
this.readable.indexOf(field.id) !== -1 || field.type === "label",
_writeable: this.writeable.indexOf(field.id) !== -1,
}));
authFields.unshift({
name: "flow_title",
label: "工作名称",
type: "text",
gs_x: 0,
gs_y: 0,
gs_width: 12,
gs_height: 1,
label_show: 1,
_readable: !this.isFirstNode,
_writeable: this.isFirstNode,
});
return h("div", [
h(
"el-form",
{
ref: "elForm",
class: "form",
props: {
model: this.form,
"label-position": "right",
"label-width": "120px",
rules: this.rules,
"inline-message": true,
},
},
authFields.map((field) => formBuilder.bind(this)(this.device, field, h))
),
// 用于编写脚本中弹窗
h(
"vxe-modal",
{
props: {
zIndex: this.zIndex,
value: this.isShowModal,
height: 640,
width: 860,
"esc-closable": true,
},
on: {
input: (e) => {
this.isShowModal = e;
},
},
},
[this.modalRender.bind(this)(h)]
),
]);
},
created() {},
};
</script>
<style scoped lang="scss">
.form {
display: grid;
grid-template-columns: repeat(12, 1fr);
}
::v-deep .el-form-item {
border: 1px solid #dee2e6;
padding: 8px 12px;
margin: -1px 0 0 -1px;
}
::v-deep .el-form-item__content {
}
::v-deep .el-radio, .el-radio__input {
line-height: 1.5;
}
</style>