数通互联化工云平台
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.

1991 lines
63 KiB

1 year ago
<!--
@ 作者: 秦东
@ 时间: 2024-03-18 11:32:14
@ 备注: 自定义表单列表
-->
<script lang="ts" setup>
import { ElTable } from "element-plus";
import { Hide, View } from "@element-plus/icons-vue";
import {
attrButton,
tableButton,
tableButtonList,
tableLogButtonList,
tableAttrLogButtonList,
diaOrDrawer,
} from "@/api/DesignForm/tableButton";
import {
json2string,
objToStringify,
string2json,
stringToObj,
} from "@/utils/DesignForm/form";
import { analysisForm, setFlowFormKeyPower } from "@/api/workflowapi/index";
import {
gainFormTableField,
editCustomerFormList,
gainFormListCont,
gainListTableField,
} from "@/api/DesignForm/requestapi";
import { formTableField, formTabelStruct } from "@/api/DesignForm/type";
import tempOtherUnit from "@/components/DesignForm/pageList/types";
import { ElMessage } from "element-plus";
import Sortable from "sortablejs";
1 year ago
//引入子组件
import PageListHeadTools from "@/views/sysworkflow/lowcodepage/pageListHeadTools.vue";
import ControlSetup from "@/views/sysworkflow/lowcodepage/pageSetUpDialog/controlSetup.vue";
import FieldSetUp from "@/views/sysworkflow/lowcodepage/pageSetUpDialog/fieldSetUp.vue";
import SearchField from "@/views/sysworkflow/lowcodepage/pageSetUpDialog/searchField.vue";
import PreviewPage from "@/views/sysworkflow/lowcodepage/pageSetUpDialog/previewPage.vue";
import CodePage from "@/views/sysworkflow/lowcodepage/pageSetUpDialog/codePage.vue";
1 year ago
const props = defineProps({
formKey: {
type: String,
default: "",
},
formVersion: {
type: String,
default: "",
},
tabsActive: {
type: Number,
default: 1,
},
state: {
type: Object,
default() {
return {};
},
},
1 year ago
});
const emits = defineEmits<{
(e: "update:state", val: formStruct): void;
(e: "update:formKey", val: string): void;
(e: "update:formVersion", val: string): void;
(e: "judgeFlowIsEdit", val: boolean): void;
(e: "runNextWindows", val: number): void;
(e: "closeFormPage"): void;
}>();
const statePro = computed({
get() {
return props.state;
},
set(val: formStruct) {
emits("update:state", val);
},
1 year ago
});
const formTableActive = ref(1);
const pageLoading = ref(false);
1 year ago
//自定义列表结构
const state = reactive({
tableData: {
// tableProps: {}, //表格所有参数
columns: [],
config: {},
controlBtn: [],
operateBtn: [],
},
searchData: [],
loading: false,
attrObj: {},
config: {
pageSize: 10,
searchIsShow: true,
searchFormIsShow: true,
openPageMode: "drawer",
},
tagList: {},
formId: props.formKey.toString() || "",
formList: [], // 所有可选表单数据源
name: "",
treeData: {}, // 左侧树相关
previewVisible: false,
tabsName: "second",
formFieldList: [], // 表单数据源所有可选字段
formApi: {
type: "1",
addApiUrl: "",
editApiUrl: "",
delApiUrl: "",
lookApiUrl: "",
},
dict: {},
refreshTable: true,
view: {
list: {
status: true,
isClick: false,
form: {
sortWord: "",
sort: 1,
title: [],
},
1 year ago
},
card: {
status: false,
isClick: false,
form: {
sort: 1,
sortWord: "",
imgWork: "",
imgWidth: 50,
imgHeight: 50,
imgBorderRadius: 5,
imgPadding: 2,
titleWork: "",
describe: "",
ranks: 3,
title: [],
},
},
date: {
status: false,
isClick: false,
form: {
startTime: "",
endTime: "",
dayType: 1,
title: [],
},
},
time: {
status: false,
isClick: false,
form: {
sortWord: "",
sort: 1,
title: [],
},
},
gantt: {
status: false,
isClick: false,
form: {
startTime: "",
endTime: "",
dayType: 2,
sortWord: "",
sort: 1,
title: [],
},
},
map: {
status: false,
isClick: false,
form: {
mapWord: "",
sortWord: "",
sort: 1,
title: [],
},
},
},
});
1 year ago
const kaif = (id: number, callback?: (list: any) => void) => {
// const content = stringToObj(props.state.formData)
// console.log('获取当前数据下所有字段',statePro.value.formData)
filterFiled(statePro.value.formData);
callback && callback(statePro.value.formData.list);
1 year ago
// console.log('获取当前数据下所有字段--->',state.formFieldList)
};
1 year ago
const filterFiled = (obj: any) => {
obj?.list.forEach((item: FormList) => {
if (item.type === "grid" || item.type === "tabs") {
item.columns.forEach((col: FormList) => {
filterFiled(col);
});
} else if (["card", "div"].includes(item.type)) {
filterFiled(item);
} else if (!excludeType.includes(item.type) && item.name) {
state.formFieldList.push({
prop: item.name,
label: item.formItem?.label,
help: item.config.help || "",
});
}
});
};
1 year ago
const excludeType = [
"txt",
"title",
"table",
"component",
"upload",
"button",
"tinymce",
"inputSlot",
"flex",
];
1 year ago
const powerUnitAry = ref<any>({
nodeKey: "",
recUnitAry: {
masterUnitList: [],
sunUnitList: [],
unitAllKey: [],
unitAllState: [],
},
});
const formTableField = reactive<formTableField>({});
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-13 08:24:54
@ 功能: 解析表单
*/
const jieForm = () => {
// analysisForm({nodeKey:"begin",nodeJson:JSON.stringify(statePro.value.formData)})
// .then((data)=>{
// if(data.code == 0){
// powerUnitAry.value = data.data
// }
// })
if (props.formKey != "") {
gainFormTableField({ id: props.formKey.toString() }).then((data) => {
// console.log('解析表单--->',data)
formTableField.masterTable = data.data.masterTable;
formTableField.sunTable = data.data.sunTable;
});
}
};
1 year ago
const handleSelectionChange = (val: User[]) => {
// console.log('表单选中--->',val)
};
1 year ago
// watch(()=>statePro.value,()=>{
// jieForm()
// },
// {
// deep: true
// })
watch(
() => props.tabsActive,
(val: number) => {
if (val == 3) {
jieForm();
getListInfo();
}
}
);
onMounted(() => {
jieForm();
nextTick(() => {
columnDrop();
getListInfo();
gainFormTableKeyWord(props.formKey);
});
});
1 year ago
const allKeyWords = ref<any[]>([]);
const timeKeyWords = ref<any[]>([]);
const mapKeyWords = ref<any[]>([]);
const isMapTrue = ref(true);
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-07-06 10:44:54
@ 功能: 获取数据表字段数据
*/
const gainFormTableKeyWord = (val: string) => {
// console.log("获取数据表字段数据-----------》",val)
gainListTableField({ id: val.toString() }).then((data) => {
// console.log("获取数据表字段数据",data)
allKeyWords.value = data.data.allKeyWords;
timeKeyWords.value = data.data.timeKeyWords;
mapKeyWords.value = data.data.mapKeyWords;
isMapTrue.value = !data.data.isMap;
});
};
const setUpFieldInfo = ref<tableButton>();
const setUpFieldIsOpen = ref(false);
const tableAttrBut = ref<InstanceType<typeof ElTable>>();
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-25 11:51:46
@ 功能: 设置字段属性
*/
const setUpField = (val: any) => {
// console.log("设置字段属性-->",val)
setUpFieldInfo.value = val;
1 year ago
setUpFieldIsOpen.value = true;
// console.log("设置字段属性-1->",setUpFieldIsOpen)
};
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-27 09:17:15
@ 功能: 设置功能按钮
*/
const listButtonIsShow = ref(false);
1 year ago
const setUpFieldBut = () => {
// console.log("设置字段属性-->")
listButtonIsShow.value = true;
};
1 year ago
//功能按钮
const tableAttrButClick = (val: tableButton[]) => {
if (zhuDaunIsTrue.value == true) {
if (state.tableData.controlBtn.length > 0) {
state.tableData.controlBtn.splice(0, state.tableData.controlBtn.length);
state.tableData.controlBtn = val;
} else {
state.tableData.controlBtn = val;
}
}
};
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-25 14:58:22
@ 功能: 功能字段
*/
const tableFieldAttrButClick = (val: tableButton[]) => {
if (zhuDaunIsTrue.value == true) {
if (val.length > 0) {
//判断是否有选中的字段
if (state.tableData.columns.length > 0) {
//判断列表是否有数据
val.forEach((item: tableButton) => {
let isTrue = true;
state.tableData.columns.forEach((itemTab: tableButton) => {
if (item.id == itemTab.id) {
isTrue = false;
}
});
if (isTrue) {
state.tableData.columns.push(item);
}
});
} else {
//列表无数据,直接新增
val.forEach((item: tableButton) => {
state.tableData.columns.push(item);
});
}
//此处往下是处理列表中有为选中的字段
let delField = [];
tableAttrLogButtonList.forEach((item: tableButton) => {
let isTrue = true;
val.forEach((itemVal: tableButton) => {
if (item.id == itemVal.id) {
isTrue = false;
}
});
if (isTrue) {
delField.push(item.id);
}
});
if (delField.length > 0) {
state.tableData.columns.forEach((itemTab: tableButton, index: number) => {
delField.forEach((item: string) => {
if (item == itemTab.id) {
state.tableData.columns.splice(index, 1); //删除列表中已经存在的字段
}
});
});
}
} else {
//无选中的字段
if (state.tableData.columns.length > 0) {
tableAttrLogButtonList.forEach((item: tableButton) => {
state.tableData.columns.forEach((itemTab: tableButton, index: number) => {
if (item.id == itemTab.id) {
state.tableData.columns.splice(index, 1); //删除列表中已经存在的字段
}
});
});
}
}
if (state.tableData.columns.length > 0) {
let isOpent = true;
state.tableData.columns.forEach((itemTab: tableButton) => {
if (itemTab.fieldClass == "__control") {
isOpent = false;
}
});
if (isOpent) {
state.tableData.operateBtn = [];
}
} else {
state.tableData.operateBtn = [];
}
}
};
1 year ago
const zhuDaunIsTrue = ref(false);
/**
@ 作者: 秦东
@ 时间: 2024-03-25 16:36:38
@ 功能: 列表字段处理
*/
const tableListFieldClick = (val: any[]) => {
// console.log("列表字段处理-->",val)
// zhuDaunIsTrue.value = true
if (zhuDaunIsTrue.value == true) {
if (val.length > 0) {
if (state.tableData.columns.length > 0) {
//判断列表是否有数据
val.forEach((item: tableButton) => {
let isTrue = true;
state.tableData.columns.forEach((itemTab: tableButton) => {
if (item.id == itemTab.id) {
// console.log("列表字段处理-111->",val)
isTrue = false;
}
});
if (isTrue) {
state.tableData.columns.push(item);
}
});
} else {
//列表无数据,直接新增
val.forEach((item: any) => {
state.tableData.columns.push(item);
});
}
//此处往下是处理列表中有为选中的字段
let delField = [];
formTableField.masterTable.forEach((item: tableButton) => {
let isTrue = true;
val.forEach((itemVal: tableButton) => {
if (item.id == itemVal.id) {
isTrue = false;
}
});
if (isTrue) {
delField.push(item.id);
}
});
if (delField.length > 0) {
state.tableData.columns.forEach((itemTab: tableButton, index: number) => {
delField.forEach((item: string) => {
if (item == itemTab.id) {
state.tableData.columns.splice(index, 1); //删除列表中已经存在的字段
}
});
});
}
} else {
if (state.tableData.columns.length > 0) {
formTableField.masterTable.forEach((item: tableButton) => {
state.tableData.columns.forEach((itemTab: tableButton, index: number) => {
if (item.id == itemTab.id) {
state.tableData.columns.splice(index, 1); //删除列表中已经存在的字段
}
});
});
}
}
}
console.log("state.tableData.columns", state.tableData.columns);
};
1 year ago
const container = ref();
1 year ago
//拖动字段排序
const columnDrop = () => {
const wrapperTr = container.value.querySelector(".el-table__header-wrapper tr");
// console.log("wrapperTr",wrapperTr)
Sortable.create(wrapperTr, {
animation: 180,
delay: 0,
onEnd: (evt: any) => {
// console.log("evt",evt.oldIndex,evt.newIndex)
const oldItem = state.tableData.columns[evt.oldIndex];
state.tableData.columns.splice(evt.oldIndex, 1);
state.tableData.columns.splice(evt.newIndex, 0, oldItem);
// 重染表格,否则点下面的设置对不上了
state.refreshTable = false;
nextTick(() => {
state.refreshTable = true;
nextTick(() => {
columnDrop(); // 拖完后拖不到了,再执行一下
});
});
},
});
};
1 year ago
const tableFieldList = ref<InstanceType<typeof ElTable>>();
const tableFieldAttrBut = ref<InstanceType<typeof ElTable>>();
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-27 08:27:22
@ 功能: 删除表头列表字段
*/
const delCol = (val: any) => {
let delInfo = [];
let delInfoBut = [];
if (state.tableData.columns.length > 0) {
state.tableData.columns.forEach((item: any, index: number) => {
if (item.id === val.id) {
state.tableData.columns.splice(index, 1);
if (item.attribute == "-") {
delInfoBut.push(item);
} else {
delInfo.push(item);
}
}
});
// tableFieldList.value!.toggleRowSelection(delInfo, true)
// console.log("delInfo",delInfo)
// tableFieldList.value!.clearSelection()
} else {
tableFieldList.value!.clearSelection();
tableFieldAttrBut.value!.clearSelection();
}
if (delInfo.length > 0) {
delInfo.forEach((item: any) => {
tableFieldList.value!.toggleRowSelection(item, false);
});
}
if (delInfoBut.length > 0) {
delInfoBut.forEach((item: any) => {
tableFieldAttrBut.value!.toggleRowSelection(item, false);
});
}
};
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-27 10:13:34
@ 功能: 更新列表记录操作按钮
*/
const updataLogBut = (val: attrButton[]) => {
// console.log("更新列表记录操作按钮",val)
let isWrete = true;
if (state.tableData.columns && state.tableData.columns.length > 0) {
state.tableData.columns.forEach((item: any) => {
if (item.fieldClass == "__control") {
state.tableData.operateBtn = val.value;
isWrete = false;
}
});
}
if (isWrete) {
state.tableData.operateBtn = [];
}
// console.log("更新列表记录操作按钮------1------->",state.tableData.operateBtn)
};
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-28 15:00:12
@ 功能: 处理查询条件
*/
const addOrDelSearchField = (val: attrButton, isTrue: boolean) => {
if (isTrue) {
if (state.searchData.length > 0) {
let isWrite = true;
state.searchData.forEach((item: attrButton, index: number) => {
if (item.id == val.id) {
isWrite = false;
}
});
if (isWrite) {
state.searchData.push(val);
}
} else {
state.searchData.push(val);
1 year ago
}
} else {
if (state.searchData.length > 0) {
state.searchData.forEach((item: attrButton, index: number) => {
if (item.id == val.id) {
state.searchData.splice(index, 1);
1 year ago
}
});
1 year ago
}
}
};
// 定义自定义表头
const readerColumn = (column: any) => {
// console.log(column)
let labelLong = column.label.length; // 表头label长度
if (column.label.length < 3) {
labelLong = 3;
}
let size = 15; // 根据需求定义一个字体的标尺
// column.minWidth = labelLong * size
//@ts-ignore
return labelLong * size;
};
const adaptiveWidth = (colName: any) => {
if (!colName) {
return;
}
colName += "";
const english = /\w+/;
let colWidth = 0;
for (const char of colName) {
if (english.test(char)) {
colWidth += 30;
} else {
colWidth += 30;
}
}
return colWidth;
};
const codeIsShow = ref(false); //生成代码
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-29 11:12:26
@ 功能: 列表头部按钮操作
*/
const listPageTools = (type: string) => {
// console.log("列表头部操作--》",type)
switch (type) {
case "del":
clearData();
break;
case "eye":
state.previewVisible = true;
break;
case "json":
drawer.title = "查看表格列表结构";
dialogOpen(state, { direction: "ltr", type: "json" });
break;
case "save":
saveFormListData();
case "close":
emits("closeFormPage");
break;
default:
}
};
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-29 14:42:39
@ 功能: 关闭预览
*/
const handlePreviewClose = () => {
state.previewVisible = false;
};
1 year ago
const drawer = reactive({
visible: false,
title: "",
direction: "ltr",
content: "",
codeType: "",
});
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-29 14:08:49
@ 功能: 数据格式处理
*/
const dialogOpen = (obj: any, params: any = {}) => {
drawer.visible = true;
Object.assign(drawer, { direction: "ltr" }, params);
let editData = objToStringify(obj, true);
switch (params.type) {
case "dict":
editData = json2string(obj, true);
break;
case "beforeRequest":
case "beforeDelete":
case "treeBeforeRequest":
if (!obj) {
editData = beforeRequest;
}
break;
case "afterResponse":
case "treeAfterResponse":
if (!obj) {
editData = afterResponse;
}
break;
}
drawer.content = editData;
};
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-29 11:02:51
@ 功能: 清空数据
*/
const clearData = () => {
tableFieldList.value!.clearSelection();
tableFieldAttrBut.value!.clearSelection();
tableAttrBut.value!.clearSelection();
state.searchData = [];
// state.tableData.controlBtn = []
// state.tableData.columns = []
state.tableData.operateBtn = [];
state.tableData.config = {};
if (formTableField.masterTable) {
formTableField.masterTable.forEach((item) => {
item.isSearch = false;
});
}
};
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-03-29 14:58:52
@ 功能: 添加自定义表单列表设定
*/
const saveFormListData = () => {
const { type, addApiUrl, editApiUrl, delApiUrl, lookApiUrl } = state.formApi;
if (
!props.formKey ||
props.formKey == "" ||
props.formKey == null ||
props.formKey == undefined
) {
return ElMessage.error("未知表单参数!请先保存前置表单后再操作!");
}
// console.log("添加自定义表单列表设定",state.formApi)
if (type != 1) {
if (addApiUrl == "" || editApiUrl == "" || delApiUrl == "" || lookApiUrl == "") {
return ElMessage.error("请补全列表第三方APIUrl!");
}
}
if (state.tableData.columns.length < 1) {
return ElMessage.error("未设置表单查询项!不可提交!");
}
let params: any = {
data: json2string(state),
id: props.formKey.toString(),
};
// console.log("添加自定义表单列表设定",params)
editCustomerFormList(params).then((data) => {
// console.log("添加自定义表单列表设定",data)
ElMessage.success(data.msg);
});
};
1 year ago
/**
@ 作者: 秦东
@ 时间: 2024-04-01 08:41:31
@ 功能: 获取列表内容
*/
const getListInfo = () => {
// console.log("获取列表内容1111",props.formKey)
gainFormListCont({ id: props.formKey.toString() }).then((data) => {
// console.log("获取列表内容",data)
if (
data.data.listjson != null &&
data.data.listjson != "" &&
data.data.listjson != "null"
) {
let stateData = string2json(data.data.listjson);
// console.log("获取列表内容---->",stateData)
state.tableData = stateData.tableData;
state.searchData = stateData.searchData;
state.loading = stateData.loading;
state.attrObj = stateData.attrObj;
state.config = stateData.config;
state.tagList = stateData.tagList;
state.formId = stateData.formId;
state.formList = stateData.formList;
state.name = stateData.name;
state.treeData = stateData.treeData;
state.previewVisible = stateData.previewVisible;
state.formFieldList = stateData.formFieldList;
state.formApi = stateData.formApi;
state.dict = stateData.dict;
state.refreshTable = stateData.refreshTable;
if (stateData.view && stateData.view != null && stateData.view != "") {
if (
stateData.view.card &&
stateData.view.card != null &&
stateData.view.card != ""
) {
state.view = stateData.view;
} else {
state.view = stateData.view;
state.view.card = {
status: false,
isClick: false,
form: {
sort: 1,
sortWord: "",
imgWork: "",
imgWidth: 50,
imgHeight: 50,
imgBorderRadius: 5,
imgPadding: 2,
titleWork: "",
describe: "",
ranks: 3,
title: [],
},
};
}
}
1 year ago
// console.log("获取列表内容--1-->",stateData.view)
// console.log("获取列表内容--2-->",state.view)
}
1 year ago
zhuDaunIsTrue.value = false;
if (
state.tableData &&
state.tableData.columns &&
state.tableData.columns.length > 0
) {
if (formTableField.masterTable && formTableField.masterTable.length > 0) {
state.tableData.columns.forEach((itemCol: any) => {
formTableField.masterTable.forEach((item: any) => {
if (itemCol.id == item.id) {
// console.log("========>",item)
item.isSearch = true;
tableFieldList.value!.toggleRowSelection(item, true);
}
});
});
}
1 year ago
if (tableAttrLogButtonList && tableAttrLogButtonList.length > 0) {
state.tableData.columns.forEach((itemCol: any) => {
tableAttrLogButtonList.forEach((item: any) => {
if (itemCol.id == item.id) {
tableFieldAttrBut.value!.toggleRowSelection(item, true);
}
});
});
}
1 year ago
// // let delInfo = []
// // let delInfoBut = []
// // state.tableData.columns.forEach((item: any) => {
// // if(item.fieldClass != "-"){
// // delInfo.push(item)
// // }else{
// // delInfoBut.push(item)
// // }
// // // tableFieldList.value!.toggleRowSelection(item, true)
// // // if
// // // tableFieldAttrBut.value!.toggleRowSelection(item, true)
// // })
// // if(delInfo.length > 0){
// // delInfo.forEach((item:any)=>{
// // tableFieldList.value!.toggleRowSelection(item, true)
// // })
// // }
// // if(delInfoBut.length > 0){
// // delInfoBut.forEach((item:any)=>{
// // tableFieldAttrBut.value!.toggleRowSelection(item, true)
// // })
// // }
}
1 year ago
if (
state.tableData &&
state.tableData.controlBtn &&
state.tableData.controlBtn.length > 0
) {
state.tableData.controlBtn.forEach((itemCol: any) => {
tableButtonList.forEach((item: any) => {
if (itemCol.id == item.id) {
tableAttrBut.value!.toggleRowSelection(item, true);
}
});
});
}
zhuDaunIsTrue.value = true;
});
};
const showCollapse = () => {};
// 弹窗确认
const dialogConfirm = (editVal: string) => {
// 生成脚本预览和导入json,都是将编辑器内容更新至state.formData
try {
if (typeof drawer.callback === "function") {
// callback
const newObj =
drawer.codeType === "json" ? string2json(editVal) : stringToObj(editVal);
drawer.callback(newObj);
} else {
switch (drawer.type) {
case "css":
// 表单属性-编辑表单样式
if (!state.value.formData.config) {
state.value.formData.config = {};
}
state.value.formData.config.style = editVal;
break;
case "dict":
state.value.formDict = string2json(editVal);
break;
case "beforeRequest":
case "beforeSubmit":
case "afterResponse":
case "afterSubmit":
case "closeSubmit":
case "change":
if (!state.value.formData.events) {
state.value.formData.events = {};
}
state.value.formData.events[drawer.type] = stringToObj(editVal);
break;
default:
state.value.formData = stringToObj(editVal);
}
}
dialogCancel();
} catch (res) {
// console.log(res.message)
//ElMessage.error(res.message)
}
};
1 year ago
</script>
<template>
<div class="design-containers design-table" v-loading="pageLoading">
<!-- <div class="components-list">
1 year ago
<el-divider content-position="left">表格列字段</el-divider>
<el-table
ref="multipleTableRef"
:data="powerUnitAry.recUnitAry.masterUnitList"
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="30" />
<el-table-column label="栏目">
<template #default="scope">{{ scope.row.name }}</template>
</el-table-column>
</el-table>
</div> -->
<div class="main-body">
<div class="header">
<div class="field"></div>
<PageListHeadTools @clearData="listPageTools" />
</div>
<div ref="container" class="table_box main_table">
<div class="search-box">
<SearchField
v-if="
state.searchData && state.searchData.length > 0 && state.config.searchIsShow
"
v-model:searchData="state.searchData"
/>
<div v-else class="tipBox">条件查询搜索区域</div>
</div>
<div class="operateButArea">
<div class="operatLeft">
<el-text
v-if="state.tableData.controlBtn.length === 0"
class="mx-1 tipBox"
type="info"
>操作按钮区域</el-text
>
<el-button
v-for="item in state.tableData.controlBtn"
v-bind="item"
:key="item.type"
>
{{ item.label }}
</el-button>
</div>
<div>
3 months ago
{{ state.view }}
<el-button-group class="ml-4">
<el-tooltip
v-if="state.config.searchFormIsShow"
class="box-item"
effect="dark"
content="折叠查询表单"
placement="top"
>
<el-button
size="small"
@click="state.config.searchIsShow = !state.config.searchIsShow"
class="fa fa-search"
/>
</el-tooltip>
<el-tooltip
v-if="state.view.list.status"
class="box-item"
effect="dark"
content="列表视图"
placement="top"
>
<el-button
size="small"
class="fa fa-table"
:color="state.view.list.isClick ? '#a0cfff' : ''"
@click="tabsView(state.view.list)"
/>
</el-tooltip>
<el-tooltip
v-if="state.view.date.status"
class="box-item"
effect="dark"
content="日历视图"
placement="top"
>
<el-button size="small" class="fa fa-calendar" />
</el-tooltip>
<el-tooltip
v-if="state.view.time.status"
class="box-item"
effect="dark"
content="时间轴"
placement="top"
>
<el-button size="small" class="fa fa-clock-o" />
</el-tooltip>
<el-tooltip
v-if="state.view.gantt.status"
class="box-item"
effect="dark"
content="甘特图"
placement="top"
>
<el-button size="small" class="fa fa-bar-chart" />
</el-tooltip>
<el-tooltip
v-if="state.view.map.status"
class="box-item"
effect="dark"
content="地图视图"
placement="top"
>
<el-button size="small" class="fa fa-map-signs" />
</el-tooltip>
</el-button-group>
</div>
</div>
<div class="operateButArea tipBox" v-if="!state.tableData.columns?.length">
表格列设置区域可从左上角 添加表格列字段 选择已有列或直接从上方工具栏
生成脚本预览 编辑
</div>
<el-table :data="[{}]" v-bind="state.tableData.tableProps || {}" ref="tableEl">
<template
v-for="item in state.tableData.columns"
:key="item.prop || item.label"
>
<el-table-column v-bind="item" :width="readerColumn(item)">
<template #header="scope">
<div class="field_close">
<el-text>{{ item.label }}</el-text>
<i
><el-icon @click="delCol(item)"><Close /></el-icon
></i>
</div>
<el-tooltip placement="top" v-if="item.help">
<template #content>
<span v-html="item.help"></span>
</template>
<i class="icon-help"></i>
</el-tooltip>
</template>
<template #default v-if="item.field !== 'index'">
<el-checkbox v-if="item.field === 'checkbox'" />
<span v-if="item.field === 'operate'">操作</span>
<span v-if="item.field !== 'checkbox' && item.field !== 'operate'"
>数据</span
>
</template>
</el-table-column>
</template>
</el-table>
<div class="table-tip">
操作提示<br />
*从数据列表配置中选择 所属表单<br />
*从左上角 添加表格字段 选择预设字段<br />
*可拖动表头字段移动调整表头字段排列顺序<br />
*可通过顶部工具栏 生成脚本预览 查看或编辑添加自定义字段<br />
</div>
</div>
</div>
<div class="sidebar-tools">
<el-tabs
ref="multipleTableRef"
v-model="formTableActive"
class="form_tabs"
@tab-click="handleClick"
>
<el-tab-pane label="字段设置" :name="1">
<el-divider content-position="left">功能字段</el-divider>
<el-table
ref="tableFieldAttrBut"
:data="tableAttrLogButtonList"
border
style="width: 100%"
@selection-change="tableFieldAttrButClick"
>
<el-table-column fixed type="selection" width="40" align="center" />
<el-table-column prop="label" label="字段" />
<el-table-column fixed="right" label="设置" width="55" align="center">
<template #default="scope">
<el-icon
v-if="scope.row.fieldClass == '__control'"
title="设置"
@click="setUpFieldBut(scope.row)"
><Setting
/></el-icon>
</template>
</el-table-column>
</el-table>
<el-divider content-position="left">列表字段</el-divider>
<el-table
ref="tableFieldList"
:data="formTableField.masterTable"
border
@selection-change="tableListFieldClick"
style="width: 100%"
>
<el-table-column fixed type="selection" width="40" align="center" />
<el-table-column prop="label" label="字段">
<template #default="scope">
{{ scope.row.label }}({{ scope.row.fieldClass }}[{{ scope.row.pattern }}])
</template>
</el-table-column>
<el-table-column fixed="right" label="查询" width="55" align="center">
<template #default="scope">
<el-switch
v-model="scope.row.isSearch"
:active-action-icon="View"
:inactive-action-icon="Hide"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
@change="addOrDelSearchField(scope.row, $event)"
/>
</template>
</el-table-column>
<!-- <el-table-column fixed="right" label="设置" width="55" align="center">
1 year ago
<template #default="scope">
<el-icon title="设置" @click="setUpField(scope.row)"><Setting /></el-icon>
</template>
</el-table-column> -->
</el-table>
<!-- <el-divider content-position="left">查询条件</el-divider> -->
</el-tab-pane>
<el-tab-pane label="列表设置" :name="2">
<el-divider content-position="left">开启视图</el-divider>
<div class="demo_collapse">
<el-collapse v-value="activeName" @change="handleChange">
<el-collapse-item
name="list"
:class="state.view.list.status ? 'isTrueItem' : ''"
:disabled="!state.view.list.status"
>
<template #title>
<div class="collapse-title">
<div>
<i class="fa fa-table"></i>
<el-text>列表视图</el-text>
</div>
<el-switch
v-if="1 == 0"
class="openOfClose"
v-model="state.view.list.status"
@click.stop="showCollapse"
/>
</div>
</template>
<div>
<el-form
label-position="top"
label-width="auto"
:model="state.view.list.form"
style="max-width: 600px"
>
<el-form-item label="标题字段">
<el-select
v-model="state.view.list.form.title"
multiple
placeholder="请选择标题字段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="排序字段">
<el-select
v-model="state.view.list.form.sortWord"
placeholder="请选择排序字段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="排序方式">
<el-radio-group v-model="state.view.list.form.sort">
<el-radio :label="1">降序</el-radio>
<el-radio :label="2">升序</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</div>
</el-collapse-item>
<el-collapse-item
title="Consistency"
name="card"
:class="state.view.card && state.view.card.status ? 'isTrueItem' : ''"
:disabled="!state.view.card.status"
>
<template #title>
<div class="collapse-title">
<div>
<i class="fa fa-id-card-o"></i>
<el-text>卡片视图</el-text>
</div>
<el-switch
class="openOfClose"
v-model="state.view.card.status"
:disabled="isCardTrue"
@click.stop="showCollapse"
/>
</div>
</template>
<div>
<el-form
label-position="top"
label-width="auto"
:model="state.view.card.form"
style="max-width: 600px"
>
<el-form-item label="标题字段">
<el-select
v-model="state.view.card.form.title"
multiple
placeholder="请选择标题字段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="图片字段">
<el-select
v-model="state.view.card.form.imgWork"
placeholder="请选择图片字段"
>
<el-option
v-for="item in cardKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="图片宽度与高度">
<el-input
v-model="state.view.card.form.imgWidth"
placeholder="请输入图片宽度"
>
<template #prepend>宽度</template>
<template #suffix>PX</template>
</el-input>
<el-input
v-model="state.view.card.form.imgHeight"
placeholder="请输入图片高度"
style="margin-top: 10px"
>
<template #prepend>高度</template>
<template #suffix>PX</template>
</el-input>
</el-form-item>
<el-form-item label="图片圆角">
<el-input
v-model="state.view.card.form.imgBorderRadius"
placeholder="请输入图片圆角"
style="margin-top: 10px"
>
<template #prepend>圆角</template>
<template #suffix>PX</template>
</el-input>
</el-form-item>
<el-form-item label="图片边框缩进">
<el-input
v-model="state.view.card.form.imgPadding"
placeholder="请输入图片边框缩进"
style="margin-top: 10px"
>
<template #prepend>缩进</template>
<template #suffix>PX</template>
</el-input>
</el-form-item>
<el-form-item label="卡片标题">
<el-select
v-model="state.view.card.form.titleWork"
placeholder="请选择时间轴段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="卡片标题描述">
<el-select
v-model="state.view.card.form.describe"
placeholder="请选择时间轴段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="每行几列">
<el-input
v-model="state.view.card.form.ranks"
placeholder="请输入每行几列"
style="margin-top: 10px"
>
<template #suffix></template>
</el-input>
</el-form-item>
<el-form-item label="排序字段">
<el-select
v-model="state.view.card.form.sortWord"
placeholder="请选择时间轴段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="排序方式">
<el-radio-group v-model="state.view.card.form.sort">
<el-radio :label="1">降序</el-radio>
<el-radio :label="2">升序</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</div>
</el-collapse-item>
<el-collapse-item
title="Consistency"
name="date"
:class="state.view.date.status ? 'isTrueItem' : ''"
:disabled="!state.view.date.status"
>
<template #title>
<div class="collapse-title">
<div>
<i class="fa fa-calendar"></i>
<el-text>日历视图</el-text>
</div>
<el-switch
class="openOfClose"
v-model="state.view.date.status"
@click.stop="showCollapse"
/>
</div>
</template>
<div>
<el-form
label-position="top"
label-width="auto"
:model="state.view.date.form"
style="max-width: 600px"
>
<el-form-item label="标题字段">
<el-select
v-model="state.view.date.form.title"
multiple
placeholder="请选择标题字段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<span slot="label">
时间跨度
<el-tooltip
class="box-item"
effect="dark"
content="假如一个任务今天开始,明天结束。日历列表中用区间日期展示这一条信息。"
placement="top"
>
<i class="fa fa-question-circle-o"></i>
</el-tooltip>
</span>
<el-select
v-model="state.view.date.form.startTime"
clearable
placeholder="请选择开始时间"
>
<template #prefix></template>
<el-option
v-for="item in timeKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select
v-model="state.view.date.form.endTime"
clearable
placeholder="请选择结束时间"
style="margin-top: 10px"
>
<template #prefix></template>
<el-option
v-for="item in timeKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="默认展示">
<el-select
v-model="state.view.date.form.dayType"
clearable
placeholder="请选择展示方式"
>
<el-option label="月" :value="1" />
<el-option label="周" :value="2" />
<el-option label="日" :value="3" />
</el-select>
</el-form-item>
</el-form>
</div>
</el-collapse-item>
<el-collapse-item
title="Consistency"
name="time"
:class="state.view.time.status ? 'isTrueItem' : ''"
:disabled="!state.view.time.status"
>
<template #title>
<div class="collapse-title">
<div>
<i class="fa fa-clock-o"></i>
<el-text>时间轴</el-text>
</div>
<el-switch
class="openOfClose"
v-model="state.view.time.status"
@click.stop="showCollapse"
/>
</div>
</template>
<div>
<el-form
label-position="top"
label-width="auto"
:model="state.view.time.form"
style="max-width: 600px"
>
<el-form-item label="标题字段">
<el-select
v-model="state.view.time.form.title"
multiple
placeholder="请选择标题字段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="时间轴字段">
<el-select
v-model="state.view.time.form.sortWord"
placeholder="请选择时间轴段"
>
<el-option
v-for="item in timeKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="排序方式">
<el-radio-group v-model="state.view.time.form.sort">
<el-radio :label="1">降序</el-radio>
<el-radio :label="2">升序</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</div>
</el-collapse-item>
<el-collapse-item
title="Consistency"
name="gantt"
:class="state.view.gantt.status ? 'isTrueItem' : ''"
:disabled="!state.view.gantt.status"
>
<template #title>
<div class="collapse-title">
<div>
<i class="fa fa-bar-chart fa-rotate-0"></i>
<el-text>甘特图</el-text>
</div>
<el-switch
class="openOfClose"
v-model="state.view.gantt.status"
@click.stop="showCollapse"
/>
</div>
</template>
<div>
<el-form
label-position="top"
label-width="auto"
:model="state.view.gantt.form"
style="max-width: 600px"
>
<el-form-item label="标题字段">
<el-select
v-model="state.view.gantt.form.title"
multiple
placeholder="请选择标题字段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="时间设置">
<el-select
v-model="state.view.gantt.form.startTime"
clearable
placeholder="请选择开始时间"
>
<template #prefix>开始时间</template>
<el-option
v-for="item in timeKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select
v-model="state.view.gantt.form.endTime"
clearable
placeholder="请选择结束时间"
style="margin-top: 10px"
>
<template #prefix>结束时间</template>
<el-option
v-for="item in timeKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="默认时间刻度">
<el-select
v-model="state.view.gantt.form.dayType"
clearable
placeholder="请选择展示方式"
>
<el-option label="时" :value="1" />
<el-option label="日" :value="2" />
<el-option label="周" :value="3" />
<el-option label="月" :value="4" />
<el-option label="季" :value="5" />
<el-option label="年" :value="6" />
</el-select>
</el-form-item>
<el-form-item label="排序字段">
<el-select
v-model="state.view.gantt.form.sortWord"
placeholder="请选择时间轴段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="排序方式">
<el-radio-group v-model="state.view.gantt.form.sort">
<el-radio :label="1">降序</el-radio>
<el-radio :label="2">升序</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</div>
</el-collapse-item>
<el-collapse-item
title="Consistency"
name="map"
:class="state.view.map.status ? 'isTrueItem' : ''"
:disabled="!state.view.map.status"
>
<template #title>
<div class="collapse-title">
<div>
<i class="fa fa-map-signs"></i>
<el-text>地图视图</el-text>
</div>
<el-switch
class="openOfClose"
v-model="state.view.map.status"
:disabled="isMapTrue"
@click.stop="showCollapse"
/>
</div>
</template>
<div>
<el-form
label-position="top"
label-width="auto"
:model="state.view.map.form"
style="max-width: 600px"
>
<el-form-item label="标题字段">
<el-select
v-model="state.view.map.form.title"
multiple
placeholder="请选择标题字段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="位置字段">
<el-select
v-model="state.view.map.form.mapWord"
placeholder="请选择位置字段"
>
<el-option
v-for="item in mapKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="排序字段">
<el-select
v-model="state.view.map.form.sortWord"
placeholder="请选择时间轴段"
>
<el-option
v-for="item in allKeyWords"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="排序方式">
<el-radio-group v-model="state.view.map.form.sort">
<el-radio :label="1">降序</el-radio>
<el-radio :label="2">升序</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</div>
</el-collapse-item>
</el-collapse>
</div>
<el-divider content-position="left">功能按钮</el-divider>
<el-table
ref="tableAttrBut"
:data="tableButtonList"
border
style="width: 100%"
@selection-change="tableAttrButClick"
>
<el-table-column fixed type="selection" width="40" align="center" />
<el-table-column prop="label" label="字段" />
</el-table>
<el-divider content-position="left">基本功能设置</el-divider>
<el-form
:model="state.config"
label-width="auto"
style="width: 96%; margin-left: 2%"
>
<el-form-item label="每页显示数据得数量">
<el-input-number
v-model="state.config.pageSize"
class="mx-4"
:min="1"
:max="10000"
controls-position="right"
/>
</el-form-item>
<el-form-item label="数据添加编辑打开方式">
<el-select
v-model="state.config.openPageMode"
clearable
placeholder="请选择"
>
<el-option
v-for="itemOpt in diaOrDrawer"
:key="itemOpt.value"
:label="itemOpt.label"
:value="itemOpt.value"
/>
</el-select>
</el-form-item>
<el-form-item label="可折叠查询表单">
<el-switch
v-model="state.config.searchFormIsShow"
:active-action-icon="View"
:inactive-action-icon="Hide"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
/>
</el-form-item>
</el-form>
<el-divider content-position="left">数据处理事件</el-divider>
<el-form
:model="state.formApi"
label-width="auto"
style="width: 96%; margin-left: 2%"
>
<el-form-item label="数据处理方式">
<el-switch
v-model="state.formApi.type"
active-text="默认"
inactive-text="第三方API"
active-value="1"
inactive-value="2"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #409eff"
/>
</el-form-item>
<el-form-item v-if="state.formApi.type != 1" label="填加APIUrl">
<el-input v-model="state.formApi.addApiUrl" placeholder="请输入接口地址">
<template #prefix>http://</template>
</el-input>
</el-form-item>
<el-form-item v-if="state.formApi.type != 1" label="编辑APIUrl">
<el-input v-model="state.formApi.editApiUrl" placeholder="请输入接口地址">
<template #prefix>http://</template>
</el-input>
</el-form-item>
<el-form-item v-if="state.formApi.type != 1" label="删除APIUrl">
<el-input v-model="state.formApi.delApiUrl" placeholder="请输入接口地址">
<template #prefix>http://</template>
</el-input>
</el-form-item>
<el-form-item v-if="state.formApi.type != 1" label="查看APIUrl">
<el-input v-model="state.formApi.lookApiUrl" placeholder="请输入接口地址">
<template #prefix>http://</template>
</el-input>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
<!-- {{props.formKey}}
1 year ago
<br>
{{props.formVersion}}
<br>
{{formTableField}} -->
</div>
<ace-drawer
v-model="drawer.visible"
:title="drawer.title"
:direction="drawer.direction"
:content="drawer.content"
:code-type="drawer.codeType"
@before-close="drawerBeforeClose"
@confirm="dialogConfirm"
/>
<FieldSetUp v-model:is-open="setUpFieldIsOpen" :setup-field-info="setUpFieldInfo" />
<ControlSetup
v-model:is-show="listButtonIsShow"
v-model:contbutary:="state.tableData.operateBtn"
@updata-log-but="updataLogBut"
/>
<CodePage v-model:is-show="codeIsShow" :list-data="state" />
<el-drawer
v-model="state.previewVisible"
title="列表预览"
direction="btt"
:before-close="handlePreviewClose"
size="90%"
>
<ak-page-list
:data="state.tableData"
:search-data="state.searchData"
:config="state.config"
:viewPage="stateList.view"
v-if="state.previewVisible"
/>
</el-drawer>
</div>
1 year ago
</template>
<style lang="scss" scoped>
.design-containers {
display: flex;
background-color: #ffffff;
margin: 0;
.components-list {
width: 200px;
padding: 0;
1 year ago
overflow-y: auto;
height: calc(100vh - 40px);
1 year ago
position: relative;
overflow-x: hidden;
border-right: 1px solid #e0e0e0;
}
}
.form_tabs > .el-tabs__content {
padding: 0;
1 year ago
}
.table_box {
background: #fff;
border: 1px dashed #999;
margin: 10px;
height: calc(100vh - 100px);
overflow-y: auto;
overflow-x: hidden;
position: relative;
.table-tip {
color: #999;
padding: 30px 0;
line-height: 22px;
}
.operateButArea {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 15px;
.operatLeft {
padding-bottom: 2px;
}
}
1 year ago
}
.main_table {
padding: 10px 20px;
1 year ago
}
.cell {
min-width: 120px;
1 year ago
}
.field_close {
i {
display: none;
cursor: pointer;
}
}
.field_close:hover {
i {
display: inline;
1 year ago
cursor: pointer;
}
1 year ago
}
.tipBox {
border: 1px dotted #ddd;
padding: 3px 5px;
border-radius: 5px;
color: #999;
text-align: center;
cursor: pointer;
}
.demo_collapse {
padding: 0 10px;
1 year ago
:deep .el-collapse {
border: 0px;
}
:deep .el-collapse-item__header {
padding-left: 5px;
border: 1px solid #eeeeee;
border-radius: 10px;
}
:deep .el-collapse-item {
border-radius: 10px 10px;
background-color: rgb(245, 247, 250) !important;
margin-bottom: 10px;
.el-collapse-item__wrap {
background-color: rgb(245, 247, 250) !important;
}
1 year ago
.collapse-title {
i {
padding: 0 5px 0 0;
}
}
.openOfClose {
margin: 9px 9px 0 0;
}
}
:deep .el-collapse-item:last-child {
margin-bottom: 0;
}
1 year ago
:deep .el-collapse-item__content {
padding-left: 10px;
padding-bottom: 0px;
padding-top: 10px;
}
1 year ago
:deep .collapse-title {
flex: 1 0 90%;
order: 1;
display: flex;
justify-content: space-between;
1 year ago
.el-collapse-item__header {
flex: 1 0 auto;
order: -1;
}
}
1 year ago
}
.isTrueItem {
:deep .el-collapse-item__header {
color: #79bbff;
background-color: #c6e2ff;
}
.el-text {
color: #337ecc;
}
1 year ago
}
</style>