Commit 3fc1cde9 authored by linpeiqin's avatar linpeiqin

整体结构优化

parent 80200a17
## 橙单代码生成器
### 构建命令
``` bash
# install dependencies
......@@ -13,26 +12,3 @@ npm run build
# run all tests
npm test
```
### 第三方接入
#### 在线表单接入地址
- 数据库链接:http://localhost:8085/#/thirdParty/thirdOnlineDblink
- 字典管理:http://localhost:8085/#/thirdParty/thirdFormOnlineDict
- 表单管理:http://localhost:8085/#/thirdParty/thirdOnlinePage
- 在线表单:http://localhost:8085/#/thirdParty/thirdOnlineForm?formId=XXXXX
只允许接入主表查询页面,接入地址可以在查询表单配置页面表单属性面板中复制。
- 工单列表:http://localhost:8085/#/thirdParty/thirdOnlineForm?formId=XXXXX&entryId=XXXXX
接入工单列表页面的时候,需要在url内拼上使用这个表单的流程定义的id
#### 打印模块接入地址
- 打印管理:http://localhost:8085/#/thirdParty/thirdPrint
- 数据库链接:http://localhost:8085/#/thirdParty/thirdReportDblink
- 数据集:http://localhost:8085/#/thirdParty/thirdReportDataset
- 报表字典:http://localhost:8085/#/thirdParty/thirdReportDict
- 报表页面配置:http://localhost:8085/#/thirdParty/thirdReportPage
- 报表页面渲染:http://localhost:8085/#/thirdParty/thirdReport?pageId=XXXXX
#### 工作流
- 流程分类:http://localhost:8085/#/thirdParty/thirdFormFlowCategory
- 流程设计:http://localhost:8085/#/thirdParty/thirdFormFlowEntry
- 流程实例:http://localhost:8085/#/thirdParty/thirdFormAllInstance
- 待办任务:http://localhost:8085/#/thirdParty/thirdFormMyTask
- 历史任务:http://localhost:8085/#/thirdParty/thirdFormMyHistoryTask
- 已办任务:http://localhost:8085/#/thirdParty/thirdFormMyApprovedTask
\ No newline at end of file
/**
* 弹窗样式,封装的layer的弹窗
**/
body .layer-dialog .layui-layer-title{
border-radius: 4px 4px 0px 0px;
border:1px solid #01000000;
}
body .layer-dialog .layui-layer-setwin {color: #ffffff}
body .layer-dialog {
border-radius: 4px;
border:1px solid #01000000;
}
body .layer-dialog .layui-layer-content {
padding: 25px;
}
body .layer-dialog.layui-layer-iframe .layui-layer-content {
padding: 0px!important;
}
/**
* 全屏弹窗样式
*/
body .fullscreen-dialog {
border-radius: 0px;
border: none;
background-color: #F8F8F8;
}
body .fullscreen-dialog .layui-layer-title {
display: none;
}
body .fullscreen-dialog .layui-layer-setwin {
display: none;
}
body .fullscreen-dialog .layui-layer-content {
padding: 0px;
height: 100vh!important;
}
\ No newline at end of file
import { getToken } from '@/utils/auth'
import $ from 'jquery'
import './index.css'
window.jQuery = $
const layer = require('layui-layer')
export default {
data() {
return {
dialogMap: new Map()
}
},
methods: {
// 发送消息
postMessage(sender, type, data) {
if (sender != null && type != null) {
sender.postMessage({
type,
data
}, '*')
}
},
// 打开弹窗
handlerOpenDialog(data, event) {
const this_ = this
let area = [data.width || '40vw', data.height || '70vh']
if (data.dlgFullScreen) {
area = ['100vw', '100vh']
}
const layerOptions = {
title: data.title,
type: 2,
skin: data.dlgFullScreen ? 'fullscreen-dialog' : 'layer-dialog',
resize: false,
area: area,
offset: data.dlgFullScreen ? undefined : (data.top || '50px'),
zIndex: data.zIndex || 1000,
index: 0,
content: data.url,
success: function(res, index) {
this_.dialogMap.set(index, {
source: event.source
})
var iframe = $(res).find('iframe')
if (data.dlgFullScreen) iframe[0].style.height = '100vh'
this_.postMessage(iframe[0].contentWindow, 'dialogIndex', index)
}
}
const index = layer.open(layerOptions)
this.dialogMap.set(data.dialogKey, {
source: event.source,
index: index
})
},
// 关闭弹窗
handlerCloseDialog(data) {
if (data != null) {
const dialog = this.dialogMap.get(data.dialogKey)
if (dialog && dialog.source) {
this.postMessage(dialog.source, 'refreshData', data)
}
layer.close(dialog.index)
this.dialogMap.delete(data.dialogKey)
}
},
// 刷新token
handlerRefreshToken(data, event) {
this.postMessage(event.source, 'setToken', {
token: getToken()
})
},
// 通知消息,例如成功、错误通知等
handlerUIMessage(data, event) {
this.$message[data.type](data.text)
},
handlerMessage(type, data, event) {
switch (type) {
// 打开弹窗
case 'openDialog':
this.handlerOpenDialog(data, event)
break
// 关闭弹窗
case 'closeDialog':
this.handlerCloseDialog(data, event)
break
// 刷新token
case 'refreshToken':
this.handlerRefreshToken(data, event)
break
// 通知消息,例如成功、错误通知等
case 'message':
this.handlerUIMessage(data, event)
}
},
eventListener(e) {
if (e.data == null) return
this.handlerMessage(e.data.type, e.data.data, e)
}
},
created() {
window.addEventListener('message', this.eventListener, false)
},
destoryed() {
window.removeEventListener('message', this.eventListener)
}
}
{
"name": "orange-project",
"name": "lmp-project",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
......
{
"name": "orange-project",
"name": "lmp-project",
"version": "1.0.0",
"private": true,
"scripts": {
......
......@@ -6,10 +6,10 @@
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<!-- ace -->
<script src="lib/ace/ace.js"></script>
<title>灵境大模型平台</title>
</head>
<body class="orange-project">
<body class="lmp-project">
<noscript>
<strong>We're sorry but 灵境大模型平台 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
......
export default class FlowCategoryController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowCategory/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowCategory/view', 'get', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowCategory/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowCategory/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowCategory/delete', 'post', params, axiosOption, httpOption);
}
}
import * as staticDict from '@/staticDict';
export default class FlowDictionaryController {
static dictFlowCategory (sender, params, axiosOption, httpOption) {
return new Promise((resolve, reject) => {
sender.doUrl('/admin/flow/flowCategory/listDict', 'get', params, axiosOption, httpOption).then(res => {
let dictData = new staticDict.DictionaryBase();
dictData.setList(res.data);
resolve(dictData);
}).catch(err => {
reject(err);
});
});
}
}
export default class FlowEntryController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/view', 'get', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/delete', 'post', params, axiosOption, httpOption);
}
static publish (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/publish', 'post', params, axiosOption, httpOption);
}
static listFlowEntryPublish (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/listFlowEntryPublish', 'get', params, axiosOption, httpOption);
}
static updateMainVersion (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/updateMainVersion', 'post', params, axiosOption, httpOption);
}
static suspendFlowEntryPublish (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/suspendFlowEntryPublish', 'post', params, axiosOption, httpOption);
}
static activateFlowEntryPublish (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/activateFlowEntryPublish', 'post', params, axiosOption, httpOption);
}
static viewDict (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/viewDict', 'get', params, axiosOption, httpOption);
}
static listDict (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntry/listDict', 'get', params, axiosOption, httpOption);
}
}
export default class FlowEntryVariableController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntryVariable/list', 'post', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntryVariable/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntryVariable/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntryVariable/delete', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowEntryVariable/view', 'get', params, axiosOption, httpOption);
}
}
export default class FlowOperationController {
// 保存草稿
static startAndSaveDraft (sender, params, axiosOption, httpOption) {
let url = '/admin/flow/flowOnlineOperation/startAndSaveDraft';
if (axiosOption && axiosOption.processDefinitionKey) {
url += '/' + axiosOption.processDefinitionKey;
}
return sender.doUrl(url, 'post', params, axiosOption, httpOption);
}
// 获取在线表单工作流草稿数据
static viewOnlineDraftData (sender, params, axiosOption, httpOption) {
let url = '/admin/flow/flowOnlineOperation/viewDraftData';
return sender.doUrl(url, 'get', params, axiosOption, httpOption);
}
// 启动流程实例并且提交表单信息
static startAndTakeUserTask (sender, params, axiosOption, httpOption) {
let url = '/admin/flow/flowOnlineOperation/startAndTakeUserTask';
if (axiosOption && axiosOption.processDefinitionKey) {
url += '/' + axiosOption.processDefinitionKey;
} else {
// 从流程设计里启动
url = '/admin/flow/flowOnlineOperation/startPreview';
}
return sender.doUrl(url, 'post', params, axiosOption, httpOption);
}
// 获得流程以及工单信息
static listWorkOrder (sender, params, axiosOption, httpOption) {
let url = '/admin/flow/flowOnlineOperation/listWorkOrder';
if (axiosOption && axiosOption.processDefinitionKey) {
url += '/' + axiosOption.processDefinitionKey;
}
return sender.doUrl(url, 'post', params, axiosOption, httpOption);
}
// 提交用户任务数据
static submitUserTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOnlineOperation/submitUserTask', 'post', params, axiosOption, httpOption);
}
// 获取历史流程数据
static viewHistoricProcessInstance (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOnlineOperation/viewHistoricProcessInstance', 'get', params, axiosOption, httpOption);
}
// 获取用户任务数据
static viewUserTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOnlineOperation/viewUserTask', 'get', params, axiosOption, httpOption);
}
// 获取在线表单工作流以及工作流下表单列表
static listFlowEntryForm (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOnlineOperation/listFlowEntryForm', 'get', params, axiosOption, httpOption);
}
// 获得草稿信息
static viewDraftData (sender, params, axiosOption, httpOption) {
let url = '/admin/flow/flowOperation/viewDraftData';
return sender.doUrl(url, 'get', params, axiosOption, httpOption);
}
// 撤销工单
static cancelWorkOrder (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/cancelWorkOrder', 'post', params, axiosOption, httpOption);
}
// 多实例加签
static submitConsign (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/submitConsign', 'post', params, axiosOption, httpOption);
}
// 已办任务列表
static listHistoricTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/listHistoricTask', 'post', params, axiosOption, httpOption);
}
// 获取已办任务信息
static viewHistoricTaskInfo (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/viewHistoricTaskInfo', 'get', params, axiosOption, httpOption);
}
// 仅启动流程实例
static startOnly (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/startOnly', 'post', params, axiosOption, httpOption);
}
// 获得流程定义初始化用户任务信息
static viewInitialTaskInfo (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/viewInitialTaskInfo', 'get', params, axiosOption, httpOption);
}
// 获取待办任务信息
static viewRuntimeTaskInfo (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/viewRuntimeTaskInfo', 'get', params, axiosOption, httpOption);
}
// 获取流程实例审批历史
static listFlowTaskComment (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/listFlowTaskComment', 'get', params, axiosOption, httpOption);
}
// 获取历史任务信息
static viewInitialHistoricTaskInfo (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/viewInitialHistoricTaskInfo', 'get', params, axiosOption, httpOption);
}
// 获取所有待办任务
static listRuntimeTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/listRuntimeTask', 'post', params, axiosOption, httpOption);
}
// 获得流程实例审批路径
static viewHighlightFlowData (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/viewHighlightFlowData', 'get', params, axiosOption, httpOption);
}
// 获得流程实例的配置XML
static viewProcessBpmn (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/viewProcessBpmn', 'get', params, axiosOption, httpOption);
}
// 获得所有历史流程实例
static listAllHistoricProcessInstance (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/listAllHistoricProcessInstance', 'post', params, axiosOption, httpOption);
}
// 获得当前用户历史流程实例
static listHistoricProcessInstance (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/listHistoricProcessInstance', 'post', params, axiosOption, httpOption);
}
// 终止流程
static stopProcessInstance (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/stopProcessInstance', 'post', params, axiosOption, httpOption);
}
// 删除流程实例
static deleteProcessInstance (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/deleteProcessInstance', 'post', params, axiosOption, httpOption);
}
// 催办
static remindRuntimeTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/remindRuntimeTask', 'post', params, axiosOption, httpOption);
}
// 催办消息列表
static listRemindingTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowMessage/listRemindingTask', 'post', params, axiosOption, httpOption);
}
// 驳回
static rejectRuntimeTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/rejectRuntimeTask', 'post', params, axiosOption, httpOption);
}
// 驳回到起点
static rejectToStartUserTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/rejectToStartUserTask', 'post', params, axiosOption, httpOption);
}
// 撤销
static revokeHistoricTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/revokeHistoricTask', 'post', params, axiosOption, httpOption);
}
// 抄送消息列表
static listCopyMessage (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowMessage/listCopyMessage', 'post', params, axiosOption, httpOption);
}
// 消息个数
static getMessageCount (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowMessage/getMessageCount', 'get', params, axiosOption, httpOption);
}
// 在线表单流程抄送消息数据
static viewOnlineCopyBusinessData (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOnlineOperation/viewCopyBusinessData', 'get', params, axiosOption, httpOption);
}
// 静态表单流程抄送消息数据
static viewCopyBusinessData (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/viewCopyBusinessData', 'get', params, axiosOption, httpOption);
}
// 获取指定任务处理人列表
static viewTaskUserInfo (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/viewTaskUserInfo', 'get', params, axiosOption, httpOption);
}
// 获取驳回历史任务列表
static listRejectCandidateUserTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/listRejectCandidateUserTask', 'get', params, axiosOption, httpOption);
}
// 获取多实例任务中会签人员列表
static listMultiSignAssignees (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/listMultiSignAssignees', 'get', params, axiosOption, httpOption);
}
// 流程干预
static interveneRuntimeTask (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/interveneRuntimeTask', 'post', params, axiosOption, httpOption);
}
// 自由跳
static freeJump (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOperation/freeJumpTo', 'post', params, axiosOption, httpOption);
}
// 数据补偿
static fixBusinessData (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/flow/flowOnlineOperation/fixBusinessData', 'post', params, axiosOption, httpOption);
}
}
export default class OnlineColumnController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/online/onlineColumn/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/update', 'post', params, axiosOption, httpOption);
}
static refreshColumn (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/refresh', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/delete', 'post', params, axiosOption, httpOption);
}
static listOnlineColumnRule (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/listOnlineColumnRule', 'post', params, axiosOption, httpOption);
}
static listNotInOnlineColumnRule (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/listNotInOnlineColumnRule', 'post', params, axiosOption, httpOption);
}
static addOnlineColumnRule (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/addOnlineColumnRule', 'post', params, axiosOption, httpOption);
}
static deleteOnlineColumnRule (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/deleteOnlineColumnRule', 'post', params, axiosOption, httpOption);
}
static updateOnlineColumnRule (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/updateOnlineColumnRule', 'post', params, axiosOption, httpOption);
}
static viewOnlineColumnRule (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineColumn/viewOnlineColumnRule', 'get', params, axiosOption, httpOption);
}
}
export default class OnlineDatasourceController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasource/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasource/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/online/onlineDatasource/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasource/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasource/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasource/delete', 'post', params, axiosOption, httpOption);
}
}
export default class OnlineDatasourceRelationController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasourceRelation/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasourceRelation/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/online/onlineDatasourceRelation/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasourceRelation/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasourceRelation/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDatasourceRelation/delete', 'post', params, axiosOption, httpOption);
}
}
export default class OnlineDblinkController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDblink/list', 'post', params, axiosOption, httpOption);
}
static listDblinkTables (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDblink/listDblinkTables', 'get', params, axiosOption, httpOption);
}
static listDblinkTableColumns (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDblink/listDblinkTableColumns', 'get', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDblink/view', 'get', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDblink/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDblink/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDblink/delete', 'post', params, axiosOption, httpOption);
}
static testConnection (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDblink/testConnection', 'get', params, axiosOption, httpOption);
}
}
export default class OnlineDictController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDict/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDict/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/online/onlineDict/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDict/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDict/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDict/delete', 'post', params, axiosOption, httpOption);
}
static listAllGlobalDict (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineDict/listAllGlobalDict', 'post', params, axiosOption, httpOption);
}
}
export default class OnlineFormController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineForm/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineForm/view', 'get', params, axiosOption, httpOption);
}
static render (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineForm/render', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/online/onlineForm/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineForm/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineForm/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineForm/delete', 'post', params, axiosOption, httpOption);
}
static clone (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineForm/clone', 'post', params, axiosOption, httpOption);
}
}
export default class OnlineOperation {
static listDict (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/listDict', 'post', params, axiosOption, httpOption);
}
static listByDatasourceId (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/listByDatasourceId', 'post', params, axiosOption, httpOption);
}
static listByOneToManyRelationId (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/listByOneToManyRelationId', 'post', params, axiosOption, httpOption);
}
static addDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/addDatasource', 'post', params, axiosOption, httpOption);
}
static addOneToManyRelation (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/addOneToManyRelation', 'post', params, axiosOption, httpOption);
}
static updateDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/updateDatasource', 'post', params, axiosOption, httpOption);
}
static updateOneToManyRelation (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/updateOneToManyRelation', 'post', params, axiosOption, httpOption);
}
static viewByDatasourceId (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/viewByDatasourceId', 'get', params, axiosOption, httpOption);
}
static viewByOneToManyRelationId (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/viewByOneToManyRelationId', 'get', params, axiosOption, httpOption);
}
static deleteDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/deleteDatasource', 'post', params, axiosOption, httpOption);
}
static deleteOneToManyRelation (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/deleteOneToManyRelation', 'post', params, axiosOption, httpOption);
}
static getColumnRuleCode (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineOperation/getColumnRuleCode', 'get', params, axiosOption, httpOption);
}
static getPrintTemplate (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/report/reportPrint/listAll', 'post', params, axiosOption, httpOption);
}
}
export default class OnlinePageController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/list', 'post', params, axiosOption, httpOption);
}
static listAllPageAndForm (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/listAllPageAndForm', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/online/onlinePage/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/update', 'post', params, axiosOption, httpOption);
}
static updatePublished (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/updatePublished', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/delete', 'post', params, axiosOption, httpOption);
}
static updateStatus (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/updateStatus', 'post', params, axiosOption, httpOption);
}
static listOnlinePageDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/listOnlinePageDatasource', 'post', params, axiosOption, httpOption);
}
static listNotInOnlinePageDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/listNotInOnlinePageDatasource', 'post', params, axiosOption, httpOption);
}
static addOnlinePageDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/addOnlinePageDatasource', 'post', params, axiosOption, httpOption);
}
static deleteOnlinePageDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/deleteOnlinePageDatasource', 'post', params, axiosOption, httpOption);
}
static updateOnlinePageDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/updateOnlinePageDatasource', 'post', params, axiosOption, httpOption);
}
static viewOnlinePageDatasource (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlinePage/viewOnlinePageDatasource', 'get', params, axiosOption, httpOption);
}
}
export default class OnlineRuleController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineRule/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineRule/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/online/onlineRule/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineRule/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineRule/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineRule/delete', 'post', params, axiosOption, httpOption);
}
}
export default class OnlineVirtualColumnController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineVirtualColumn/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineVirtualColumn/view', 'get', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineVirtualColumn/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineVirtualColumn/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/online/onlineVirtualColumn/delete', 'post', params, axiosOption, httpOption);
}
}
import FlowDictionaryController from './FlowController/FlowDictionaryController.js';
import FlowCategoryController from './FlowController/FlowCategoryController.js';
import FlowEntryController from './FlowController/FlowEntryController.js';
import FlowEntryVariableController from './FlowController/FlowEntryVariableController.js';
import FlowOperationController from './FlowController/FlowOperationController.js';
export {
FlowDictionaryController,
FlowCategoryController,
FlowEntryController,
FlowEntryVariableController,
FlowOperationController
}
import OnlineDblinkController from './OnlineFormController/OnlineDblinkController.js';
import OnlineDictController from './OnlineFormController/OnlineDictController.js';
import OnlineColumnController from './OnlineFormController/OnlineColumnController.js';
import OnlinePageController from './OnlineFormController/OnlinePageController.js';
import OnlineFormController from './OnlineFormController/OnlineFormController.js';
import OnlineDatasourceController from './OnlineFormController/OnlineDatasourceController.js';
import OnlineDatasourceRelationController from './OnlineFormController/OnlineDatasourceRelationController.js';
import OnlineRuleController from './OnlineFormController/OnlineRuleController.js';
import OnlineVirtualColumnController from './OnlineFormController/OnlineVirtualColumnController.js';
import OnlineOperation from './OnlineFormController/OnlineOperation.js';
export {
OnlineDblinkController,
OnlineDictController,
OnlineColumnController,
OnlinePageController,
OnlineFormController,
OnlineDatasourceController,
OnlineDatasourceRelationController,
OnlineRuleController,
OnlineVirtualColumnController,
OnlineOperation
}
......@@ -120,7 +120,7 @@ body .fullscreen-dialog .layui-layer-content {
.el-button--text,.el-button--text:hover,.el-cascader-node.in-active-path, .el-cascader-node.is-selectable.in-checked-path, .el-cascader-node.is-active{
color: $--color-primary;
}
.orange-project {
.lmp-project {
.el-button--primary {
background-color: $--color-primary;
border-color:$--color-primary ;
......@@ -239,7 +239,7 @@ body .fullscreen-dialog .layui-layer-content {
top: 0;
z-index: 10;
}
.filter-box {
position: relative;
background-color: white;
......@@ -250,7 +250,7 @@ body .fullscreen-dialog .layui-layer-content {
.advance-filter-box {
padding-bottom: 25px;
}
.filter-item {
width: $filter-item-width;
}
......@@ -258,7 +258,7 @@ body .fullscreen-dialog .layui-layer-content {
.cascader-item {
width: 160px!important;
}
.is-range, .is-search {
width: $filter-item-range-width;
}
......@@ -310,19 +310,19 @@ body .fullscreen-dialog .layui-layer-content {
.el-select {
width: 100%;
}
.el-input {
width: 100%;
}
.el-cascader {
width: 100%;
}
.el-date-editor {
width: 100%;
}
.el-input-number {
width: 100%;
}
......@@ -373,7 +373,7 @@ body .fullscreen-dialog .layui-layer-content {
.el-menu:not(.el-menu--horizontal) .el-menu-item.is-active {
color: $--color-menu-item-active-text-color!important;
}
.el-menu:not(.el-menu--horizontal) .el-submenu__title i {
color: $--color-menu-item-active-text-color;
}
......@@ -402,7 +402,7 @@ body .fullscreen-dialog .layui-layer-content {
background-color: $--color-submenu-background;
}
}
/**
* 多tab页表单,tab样式
**/
......@@ -454,7 +454,7 @@ body .fullscreen-dialog .layui-layer-content {
.table-btn.success:disabled {
color: #DCDFE6;
}
/**
* 图片上传以及显示样式
**/
......@@ -470,11 +470,11 @@ body .fullscreen-dialog .layui-layer-content {
line-height: $image-item-width;
}
}
.upload-image-multi {
display: inline;
}
.upload-image-item .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
......@@ -485,13 +485,13 @@ body .fullscreen-dialog .layui-layer-content {
.upload-image-item .el-upload:hover {
border-color: #409eff;
}
.upload-image-show {
width: $image-item-width;
height: $image-item-width;
display: inline;
}
.table-cell-image {
width: $image-item-width;
height: $image-item-width;
......@@ -501,23 +501,23 @@ body .fullscreen-dialog .layui-layer-content {
color: #606266;
margin: 0px 5px;
}
.upload-image-list .el-upload-list__item {
width: $image-item-width;
height: $image-item-width;
line-height: $image-item-width;
}
.upload-image-item .el-upload-list--picture-card .el-upload-list__item {
width: $image-item-width;
height: $image-item-width;
}
.upload-image-item .el-upload.el-upload--text {
width: $image-item-width;
height: $image-item-width;
}
.upload-image-item .el-upload--picture-card {
width: $image-item-width;
height: $image-item-width;
......@@ -539,7 +539,7 @@ body .fullscreen-dialog .layui-layer-content {
display: flex;
align-items: center;
height: $header-height;
background-color: white;
background-color: white;
position: relative;
}
......@@ -624,7 +624,7 @@ body .fullscreen-dialog .layui-layer-content {
cursor: pointer;
text-decoration: underline;
}
.single-select-tree {
min-width: 200px!important;
}
......@@ -649,7 +649,7 @@ body .fullscreen-dialog .layui-layer-content {
}
.el-card__header {
padding: 0px 16px;
padding: 0px 16px;
}
.el-card__body {
padding: 16px;
......@@ -865,7 +865,7 @@ body .fullscreen-dialog .layui-layer-content {
}
.module-node-item:hover{
.module-node-menu{
opacity: 1 !important;
opacity: 1 !important;
}
}
.module-node-menu{
......@@ -900,7 +900,7 @@ body .fullscreen-dialog .layui-layer-content {
position: absolute;
left: 16px;
right: 16px;
bottom: -1px;
bottom: -1px;
height: 1px;
background-color: #e8e8e8;
}
......@@ -1080,4 +1080,4 @@ body .fullscreen-dialog .layui-layer-content {
max-height: 500px;
word-break:break-all;
overflow: auto;
}
\ No newline at end of file
}
......@@ -53,7 +53,6 @@
import { findItemFromList } from '@/utils';
import { TableWidget } from '@/utils/widget.js';
import { SysCommonBizController } from '@/api';
import thirdPartyMixin from '@/views/thirdParty/thirdPartyMixin.js';
export default {
name: 'deptSelectDlg',
......@@ -75,7 +74,6 @@ export default {
default: false
}
},
mixins: [thirdPartyMixin],
data () {
return {
formFilter: {
......
......@@ -26,7 +26,6 @@
import { getUUID } from '@/utils';
import { SysCommonBizController } from '@/api';
import DeptSelectDlg from './deptSelectDlg.vue';
import refreshDataMixins from '@/views/thirdParty/refreshDataMixins.js';
export default {
name: 'deptSelect',
......@@ -66,7 +65,6 @@ export default {
type: String
}
},
mixins: [refreshDataMixins],
data () {
return {
widgetId: getUUID(),
......
......@@ -4,7 +4,6 @@ import router from '@/router';
import store from '@/store';
import { getAppId } from '@/utils';
import { showDialog } from '@/views/thirdParty/thirdPartyMixin.js'
window.jQuery = $;
const layer = require('layui-layer');
......@@ -39,7 +38,6 @@ class Dialog {
if (getAppId() != null && getAppId() !== '') {
// 调用第三方弹窗方法
if (thirdPartyOptions && window.parent) {
showDialog(title, params, thirdPartyOptions);
} else {
console.error('错误的第三方调用!');
}
......
......@@ -26,7 +26,6 @@
import { getUUID } from '@/utils';
import { SysCommonBizController } from '@/api';
import UserSelectDlg from './userSelectDlg.vue';
import refreshDataMixins from '@/views/thirdParty/refreshDataMixins.js';
export default {
name: 'userSelect',
......@@ -66,7 +65,6 @@ export default {
type: String
}
},
mixins: [refreshDataMixins],
data () {
return {
widgetId: getUUID(),
......
......@@ -66,7 +66,6 @@
import { findItemFromList } from '@/utils';
import { TableWidget } from '@/utils/widget.js';
import { SysCommonBizController } from '@/api';
import thirdPartyMixin from '@/views/thirdParty/thirdPartyMixin.js';
export default {
name: 'userSelectDlg',
......@@ -88,7 +87,6 @@ export default {
default: false
}
},
mixins: [thirdPartyMixin],
data () {
return {
formFilter: {
......
module.exports = {
baseUrl: 'http://192.168.0.36:8082/',
baseUrl: 'http://192.168.0.34:8082/',
wsUrl: 'ws://192.168.0.36:7860/',
projectName: '灵境大模型平台'
}
......@@ -22,9 +22,9 @@ const globalMixin = {
windowResize () {
this.windowWidth = window.innerWidth;
if (this.windowWidth <= 1900) {
document.body.className = 'orange-project container-small'
document.body.className = 'lmp-project container-small'
} else {
document.body.className = 'orange-project container-medium'
document.body.className = 'lmp-project container-medium'
}
},
/**
......
import { getToken } from '@/utils';
import $ from 'jquery';
window.jQuery = $;
const layer = require('layui-layer');
export default {
data () {
return {
dialogMap: new Map()
}
},
methods: {
postMessage (sender, type, data) {
if (sender != null && type != null) {
sender.postMessage({
type,
data
}, '*');
}
},
handlerOpenDialog (data, event) {
let this_ = this;
let area = [data.width || '40vw', data.height || '70vh'];
if (data.dlgFullScreen) {
area = ['100vw', '100vh'];
}
let layerOptions = {
title: data.title,
type: 2,
skin: data.dlgFullScreen ? 'fullscreen-dialog' : 'layer-dialog',
resize: false,
area: area,
offset: data.dlgFullScreen ? undefined : (data.top || '50px'),
zIndex: data.zIndex || 1000,
index: 0,
content: data.url,
success: function (res, index) {
this_.dialogMap.set(index, {
source: event.source
});
var iframe = $(res).find('iframe');
if (data.dlgFullScreen) iframe[0].style.height = '100vh';
this_.postMessage(iframe[0].contentWindow, 'dialogIndex', index);
}
};
layer.open(layerOptions);
},
handlerCloseDialog (data) {
if (data != null) {
layer.close(data.index);
let dialog = this.dialogMap.get(data.index);
if (dialog && dialog.source) {
this.postMessage(dialog.source, 'refreshData', data);
}
this.dialogMap.delete(data);
}
},
handlerRefreshToken (data, event) {
this.postMessage(event.source, 'setToken', {
token: getToken()
});
},
handlerUIMessage (data, event) {
this.$message[data.type](data.text);
},
handlerMessage (type, data, event) {
switch (type) {
case 'openDialog':
this.handlerOpenDialog(data, event);
break;
case 'closeDialog':
this.handlerCloseDialog(data, event);
break;
case 'refreshToken':
this.handlerRefreshToken(data, event);
break;
case 'message':
this.handlerUIMessage(data, event);
}
},
eventListener (e) {
if (e.data == null) return;
this.handlerMessage(e.data.type, e.data.data, e);
}
},
created () {
window.addEventListener('message', this.eventListener, false);
},
destoryed () {
window.removeEventListener('message', this.eventListener);
}
}
......@@ -9,7 +9,6 @@ import '@/core/mixins/global.js';
import App from './App';
import router from './router';
import store from './store';
import '@/staticDict/onlineStaticDict.js';
import '@/staticDict/gptStaticDict.js';
import {SocketService} from '@/utils/websocket.js';
......@@ -28,20 +27,11 @@ import VXETable from 'vxe-table';
import resize from '@/core/directive/resize.js';
import 'vxe-table/lib/style.css';
import '@/assets/online-icon/iconfont.css';
import nodeWrap from '@/views/workflow/components/ProcessDingflowDesigner/nodeWrap';
import OnlineCustomBlock from '@/online/components/OnlineCustomBlock.vue';
import OnlineBaseCard from '@/online/components/OnlineBaseCard.vue';
import OnlineCustomTabs from '@/online/components/OnlineCustomTabs.vue';
import OnlineCustomTableContainer from '@/online/components/OnlineTableContainer/index.vue';
import VueClipboard from 'vue-clipboard2'
Vue.prototype.$SocketService = SocketService
Vue.use(VueClipboard)
Vue.component('OnlineCustomBlock', OnlineCustomBlock);
Vue.component('OnlineBaseCard', OnlineBaseCard);
Vue.component('OnlineCustomTabs', OnlineCustomTabs);
Vue.component('OnlineCustomTableContainer', OnlineCustomTableContainer);
Vue.component('nodeWrap', nodeWrap);
Vue.directive('resize', resize)
Vue.use(VXETable);
window.JSON = new JSONbig({storeAsString: true});
......
<template>
<div class="active-widget-menu">
<i v-if="clone != null && typeof clone === 'function'" class="el-icon-copy-document" @click.stop="onCopy" />
<i class="el-icon-delete" style="margin-left: 3px;" @click.stop="onDelete" />
</div>
</template>
<script>
export default {
name: 'activeWidgetMenu',
props: {
widget: {
type: Object,
required: true
},
clone: {
type: Function
}
},
methods: {
cloneWidget (widget) {
if (this.clone && typeof this.clone === 'function') {
return this.clone(widget);
}
return null;
},
onCopy () {
this.$emit('copy', this.cloneWidget(this.widget));
},
onDelete () {
this.$emit('delete');
}
}
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/element-variables.scss';
.active-widget-menu {
position: absolute;
padding: 0px 5px;
height: 20px;
line-height: 20px;
color: white;
border-radius: 2px 0px 0px 0px;
background: $--color-primary;
bottom: -1px;
right: -1px;
z-index: 1000;
i {
font-size: 12px;
cursor: pointer;
}
}
</style>
<template>
<div class="form-single-fragment third-party-dlg" style="position: relative;">
<el-form ref="form" class="full-width-input form-box"
:model="formData" :rules="rules"
style="width: 100%;" label-width="80px"
:size="defaultFormItemSize"
label-position="left"
@submit.native.prevent
>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="脚本类型" prop="eventType">
<el-select v-model="formData.eventType"
:clearable="true" placeholder="脚本类型" style="width: 200px;"
@change="onEventTypeChange"
>
<el-option v-for="item in dialogParams.eventList" :key="item.id"
:label="item.name" :value="item.id" :disabled="item.disabled"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="16">
<el-form-item>
<el-row class="no-scroll flex-box" type="flex" justify="end">
<el-button type="primary" :size="defaultFormItemSize"
@click="onSubmit()">
保存
</el-button>
</el-row>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11" style="height: 640px; margin-right: 15px;">
<el-row>
<ScriptEditor :value="formScriptString" title="表单数据"
:options="{readOnly: true}"
style="height: 640px; width: 100%; border: 1px solid #DCDCDC;"
/>
</el-row>
</el-col>
<el-col :span="13" style="height: 640px;">
<el-row>
<ScriptEditor v-model="formData.scriptString"
style="height: 640px; width: 100%; border: 1px solid #DCDCDC;"
:title="currentEvent ? currentEvent.functionName : '事件脚本'"
/>
</el-row>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
import { findItemFromList } from '@/utils';
import OnlineFormEventList from '@/online/event/index.js';
import onlineFormDataTemplate from './onlineFormDataTemplate.js';
import ScriptEditor from '@/components/ScriptEditor/index.vue';
import ejs from 'ejs';
import thirdPartyMixin from '@/views/thirdParty/thirdPartyMixin.js';
export default {
name: 'editCustomEvent',
props: {
rowData: {
type: Object
},
eventList: {
type: Array
},
formConfig: {
type: Object
}
},
components: {
ScriptEditor
},
mixins: [thirdPartyMixin],
data () {
return {
formData: {
eventType: undefined,
scriptString: undefined
},
formScriptString: undefined,
rules: {
eventType: { required: true, message: '请选择脚本类型', trigger: 'blur' }
}
}
},
methods: {
onEventTypeChange (val) {
this.formData.scriptString = this.currentEvent ? this.currentEvent.comment.trim() : '';
},
onCancel (isSuccess = false) {
let formData = {
...this.formData,
showName: this.OnlineFormEventType.getValue(this.formData.eventType)
}
if (this.observer != null) {
this.observer.cancel(isSuccess, formData);
} else {
this.onCloseThirdDialog(isSuccess, this.thirdParams.path, this.dialogParams.rowData, formData);
}
},
onSubmit () {
this.$refs.form.validate(valid => {
if (!valid) return;
this.onCancel(true);
});
}
},
computed: {
dialogParams () {
return {
rowData: this.rowData || this.thirdParams.rowData,
eventList: this.eventList || this.thirdParams.eventList,
formConfig: this.formConfig || this.thirdParams.formConfig
}
},
currentEvent () {
return findItemFromList(OnlineFormEventList, this.formData.eventType, 'id');
}
},
mounted () {
let form = {
tableList: [],
customFieldList: this.dialogParams.formConfig.form.customFieldList
};
if (this.dialogParams.formConfig.getMasterTable) {
if (this.dialogParams.formConfig.getMasterTable.relationType == null) {
if (this.dialogParams.formConfig.form.formType === this.SysOnlineFormType.QUERY) {
// 主表查询页面
form.tableList = this.dialogParams.formConfig.getAllTableList.map(table => {
return table.relationType !== this.SysOnlineRelationType.ONE_TO_MANY ? {
showName: `${table.tag.datasourceName || table.tag.relationName} (${this.SysOnlineRelationType.getValue(table.relationType) || '主表'})`,
variableName: table.tag.variableName,
columnList: table.columnList.filter(column => column.filterType !== 0),
isObject: true
} : undefined;
}).filter(item => item != null);
} else {
// 主表编辑页面
form.tableList = this.dialogParams.formConfig.getAllTableList.map(table => {
return {
showName: `${table.tag.datasourceName || table.tag.relationName} (${this.SysOnlineRelationType.getValue(table.relationType) || '主表'})`,
variableName: table.tag.variableName,
columnList: table.columnList,
isObject: table.relationType !== this.SysOnlineRelationType.ONE_TO_MANY
}
}).filter(item => item != null);
}
} else {
let table = this.formConfig.getMasterTable;
form.tableList = [
{
showName: `${table.tag.datasourceName || table.tag.relationName} (${this.SysOnlineRelationType.getValue(table.relationType) || '主表'})`,
variableName: table.tag.variableName,
columnList: this.formConfig.form.formType === this.SysOnlineFormType.QUERY ? table.columnList.filter(column => column.filterType !== 0) : table.columnList,
isObject: true
}
];
}
}
this.formScriptString = ejs.render(onlineFormDataTemplate.queryFrom.trim(), {
form: form
});
if (this.dialogParams.rowData) {
this.formData = {
...this.dialogParams.rowData
}
}
}
}
</script>
<style>
</style>
<template>
<el-row>
<el-form :label-position="labelPosition" :label-width="labelWidth" size="small" @submit.native.prevent>
<MultiItemList v-if="labelPosition === 'top'"
:label="label"
:data="value"
addText="添加脚本"
@add="onEditEvent()"
@edit="onEditEvent"
@delete="onRemoveEvent"
:prop="{
label: 'showName',
value: 'eventType'
}"
/>
<el-form-item v-else :label="label">
<MultiItemBox :data="value"
addText="添加脚本"
@add="onEditEvent()"
@edit="onEditEvent"
@delete="onRemoveEvent"
:prop="{
label: 'showName',
value: 'eventType'
}"
/>
</el-form-item>
</el-form>
</el-row>
</template>
<script>
import refreshDataMixins from '@/views/thirdParty/refreshDataMixins.js';
import MultiItemBox from '@/components/MultiItemBox/index.vue';
import MultiItemList from '@/components/MultiItemList/index.vue';
import EditCustomEvent from './editCustomEvent.vue';
export default {
name: 'customEventSetting',
props: {
value: {
type: Array
},
label: {
type: String,
default: '表单脚本'
},
labelPosition: {
type: String,
default: 'top'
},
labelWidth: {
type: String,
default: '110px'
},
allowEventList: {
type: Array,
default: () => []
},
formConfig: {
type: Object,
required: true
}
},
mixins: [refreshDataMixins],
components: {
MultiItemBox,
MultiItemList
},
methods: {
refreshData (data) {
if (data.path === 'thirdEditCustomEvent' && data.isSuccess) {
this.handlerEditOperate(data.rowData, data.data);
}
},
handlerEditOperate (row, res) {
let temp = [];
if (row == null) {
temp = [
...this.value,
res
];
} else {
temp = (this.value || []).map(item => {
return row.eventType === item.eventType ? res : item;
});
}
this.$emit('input', temp);
},
onEditEvent (row) {
this.$dialog.show(row ? '编辑脚本' : '添加脚本', EditCustomEvent, {
area: ['1200px', '792px']
}, {
rowData: row,
eventList: this.eventList,
formConfig: this.formConfig,
path: 'thirdEditCustomEvent'
}, {
width: '1200px',
height: '800px',
pathName: '/thirdParty/thirdEditCustomEvent'
}).then(res => {
this.handlerEditOperate(row, res);
}).catch(e => {
console.log(e);
});
},
onRemoveEvent (row) {
this.$confirm('是否移除此脚本?').then(res => {
this.$emit('input', (this.value || []).filter(item => {
return item.eventType !== row.eventType;
}));
});
}
},
computed: {
eventList () {
let usedList = (this.value || []).map(eventItem => eventItem.eventType);
return this.allowEventList.map(item => {
return {
id: item,
name: this.OnlineFormEventType.getValue(item),
disabled: usedList.indexOf(item) !== -1
}
});
}
}
}
</script>
<style>
</style>
/*
const queryFrom = `
export default {
props: {
},
data () {
return {
// 过滤组件字段
formData: {
<%_ if (Array.isArray(form.widgetList)) { -%>
<%_ form.widgetList.forEach(widget => { -%>
<%_ if (widget.bindData.dataType === 0) { -%>
// <%= widget.showName %>
<%= widget.variableName %>: undefined,
<%_ } -%>
<%_ }); -%>
<%_ } -%>
// 自定义字段
customField: {
<%_ if (Array.isArray(form.customFieldList)) { -%>
<%_ form.customFieldList.forEach(field => { -%>
<%= field.fieldName %>: undefined,
<%_ }); -%>
<%_ } -%>
}
}
};
}
};
`;
*/
const queryFrom = `
export default {
props: {
},
data () {
return {
formData: {
<%_ if (Array.isArray(form.tableList)) { -%>
<%_ form.tableList.forEach(table => { -%>
// <%= table.showName %>
<%_ if (table.isObject) { -%>
<%= table.variableName %>: {
<%_ table.columnList.forEach(column => { -%>
// <%= column.columnComment %>
<%= column.columnName %>: undefined,
<%_ }) -%>
},
<%_ } else { -%>
<%_ table.columnList.forEach(column => { -%>
// <%= column.columnName %>: <%= column.columnComment %>
<%_ }) -%>
<%= table.variableName %>: [],
<%_ } -%>
<%_ }) -%>
<%_ } -%>
// 自定义字段
customField: {
<%_ if (Array.isArray(form.customFieldList)) { -%>
<%_ form.customFieldList.forEach(field => { -%>
<%= field.fieldName %>: undefined,
<%_ }); -%>
<%_ } -%>
}
}
};
}
};
`;
export default {
queryFrom
};
<template>
<el-card class="online-base-card form-card base-card" :shadow="widget.props.shadow"
:body-style="{ padding: ((widget.props.padding == null ? 15 : widget.props.padding) + 'px') }"
:style="{'margin-bottom': ((widget.props.paddingBottom || (widget.props.basicInfo || {}).paddingBottom || 0) + 'px')}"
>
<div slot="header" class="base-card-header table-draggable">
<span>{{widget.showName}}</span>
<div class="base-card-operation">
</div>
</div>
<el-row>
<el-col :span="24">
<el-row :gutter="form().gutter">
<Draggable
draggable=".custom-widget-item"
:list="widget.childWidgetList"
group="componentsGroup"
:style="getDrableBoxStyle"
style="overflow: hidden; width: 100%; position: relative;"
:disabled="!isEdit"
:move="onDragMove"
>
<template v-if="Array.isArray(widget.childWidgetList) && widget.childWidgetList.length > 0">
<el-col class="custom-widget-item" :class="{active: isEdit && form().isActive(subWidget)}"
v-for="subWidget in widget.childWidgetList" :key="subWidget.variableName"
:span="subWidget.props.span"
>
<div class="widget-item" :class="{active: isEdit && form().isActive(subWidget)}"
v-if="form().getWidgetVisible(subWidget)"
>
<div v-if="subWidget.widgetType === SysCustomWidgetType.Table"
:style="getTableStyle(subWidget)" style="margin-bottom: 18px;"
>
<OnlineCardTable :widget="subWidget"
:value="form().getTableData(subWidget)"
@input="(dataList) => form().setTableData(subWidget, dataList)"
@click.native.stop="onWidgetClick(subWidget)"
/>
</div>
<div v-else-if="subWidget.widgetType === SysCustomWidgetType.Block"
:style="getBlockStyle(subWidget)"
@click.stop="onWidgetClick(subWidget)"
>
<OnlineCustomBlock v-model="subWidget.childWidgetList"
:isEdit="isEdit"
@widgetClick="onWidgetClick"
/>
</div>
<div v-else-if="subWidget.widgetType === SysCustomWidgetType.Card"
@click.stop="onWidgetClick(subWidget)"
>
<OnlineBaseCard
:widget="subWidget"
:isEdit="isEdit"
@widgetClick="onWidgetClick"
/>
</div>
<div v-else-if="subWidget.widgetType === SysCustomWidgetType.Tabs"
@click.stop="onWidgetClick(subWidget)"
>
<OnlineCustomTabs
:widget="subWidget"
:isEdit="isEdit"
@widgetClick="onWidgetClick"
/>
</div>
<div v-else-if="subWidget.widgetType === SysCustomWidgetType.Text"
@click.stop="onWidgetClick(subWidget)"
>
<OnlineCustomWidget
:ref="subWidget.variableName"
:widget="subWidget"
:isEdit="isEdit"
:value="getWidgetValue(subWidget) || subWidget.props.text"
:style="{'margin-bottom': (subWidget.props.paddingBottom || 0) + 'px'}"
@widgetClick="onWidgetClick"
/>
</div>
<div v-else-if="subWidget.widgetType === SysCustomWidgetType.Image"
@click.stop="onWidgetClick(subWidget)"
>
<OnlineCustomWidget
:ref="subWidget.variableName"
:widget="subWidget"
:isEdit="isEdit"
:value="getWidgetValue(subWidget)"
:src="subWidget.props.src"
:style="{'margin-bottom': (subWidget.props.paddingBottom || 0) + 'px'}"
@widgetClick="onWidgetClick"
/>
</div>
<el-form-item v-else :label="subWidget.showName"
:prop="subWidget.propString"
@click.native.stop="onWidgetClick(subWidget)"
>
<OnlineCustomWidget :widget="subWidget"
:value="getWidgetValue(subWidget)"
@input="(val) => onValueChange(subWidget, val)"
@change="(val, dictData) => onWidgetValueChange(subWidget, val, dictData)"
/>
</el-form-item>
<ActiveWidgetMenu v-if="isEdit && form().isActive(subWidget)"
:widget="subWidget"
:clone="form().cloneWidget"
@copy="onCopyWidget"
@delete="onDeleteWidget(subWidget)"
/>
</div>
</el-col>
</template>
<div v-else-if="isEdit" class="info">
<div style="height: 100px; width: 100px;">
<i class="el-icon-upload" />
</div>
<span>请拖入组件进行编辑</span>
</div>
</Draggable>
</el-row>
</el-col>
</el-row>
</el-card>
</template>
<script>
import Draggable from 'vuedraggable';
import OnlineCustomWidget from './OnlineCustomWidget.vue';
import OnlineCardTable from './OnlineCardTable.vue';
import ActiveWidgetMenu from './ActiveWidgetMenu.vue';
export default {
name: 'block',
props: {
widget: {
type: Object,
required: true
},
// 是否表单编辑模式
isEdit: {
type: Boolean,
default: false
},
// 是否显示边框
showBorder: {
type: Boolean,
default: true
},
height: {
type: String
}
},
components: {
Draggable,
OnlineCustomWidget,
OnlineCardTable,
ActiveWidgetMenu
},
inject: ['form'],
data () {
return {
}
},
methods: {
onDragMove (e) {
// 容器组件不能改变位置
let widgetType = e.relatedContext.element ? e.relatedContext.element.widgetType : undefined;
return widgetType !== this.SysCustomWidgetType.Block && widgetType !== this.SysCustomWidgetType.Card;
},
onCopyWidget (widget) {
this.widget.childWidgetList.push(widget);
},
onDeleteWidget (widget) {
this.$confirm('是否删除此组件?').then(res => {
this.widget.childWidgetList = this.widget.childWidgetList.filter(item => item !== widget);
this.onWidgetClick(null);
}).catch(e => {});
},
getWidgetValue (widget) {
return this.form().getWidgetValue(widget);
},
onValueChange (widget, value) {
return this.form().onValueChange(widget, value);
},
onWidgetValueChange (widget, value, dictData) {
return this.form().onWidgetValueChange(widget, value, dictData);
},
getBlockStyle (widget) {
return {
'margin-bottom': (widget.props.paddingBottom || 0) + 'px',
'padding': (this.isEdit) ? '5px' : undefined,
'border': (this.isEdit) ? '1px solid #e8eaec' : undefined
}
},
getTableStyle (widget) {
if (widget.widgetType !== this.SysCustomWidgetType.Table) return;
return {
}
},
onWidgetClick (widget) {
this.$emit('widgetClick', widget);
}
},
computed: {
getDrableBoxStyle () {
let tempHeight = this.height;
if (this.height == null || this.height === '') {
tempHeight = (this.isEdit && this.widget.childWidgetList.length <= 0) ? '150px' : '0px';
}
return {
'min-height': tempHeight
}
}
}
}
</script>
<style scoped>
.info {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: absolute;
width: 100%;
height: 100%;
text-align: center;
vertical-align: middle;
color: #999999;
}
.info div {
width: 80px;
height: 80px;
border: 1px dashed #D9DBDD;
line-height: 100px;
text-align: center;
border-radius: 6px;
font-size: 60px;
}
.info span {
margin-top: 10px;
font-size: 16px;
}
</style>
<template>
<el-card class="online-card-table base-card" shadow="never"
:body-style="{ padding: '0px' }"
>
<!--
<div slot="header" class="base-card-header">
<span class="header-title" style="font-weight: 700; color: #606266;">{{widget.showName}}</span>
<div class="base-card-operation" v-show="!form().readOnly">
<el-button v-if="operationVisible(SysCustomWidgetOperationType.BATCH_DELETE)" size="mini"
:type="getOperation(SysCustomWidgetOperationType.BATCH_DELETE).btnType"
:plain="getOperation(SysCustomWidgetOperationType.BATCH_DELETE).plain"
:disabled="operationDisabled(SysCustomWidgetOperationType.BATCH_DELETE)"
@click="onOperationClick(getOperation(SysCustomWidgetOperationType.BATCH_DELETE))"
>
{{getOperation(SysCustomWidgetOperationType.BATCH_DELETE).name || '批量删除'}}
</el-button>
<el-button v-if="operationVisible(SysCustomWidgetOperationType.ADD)" size="mini"
:type="getOperation(SysCustomWidgetOperationType.ADD).btnType"
:plain="getOperation(SysCustomWidgetOperationType.ADD).plain"
:disabled="operationDisabled(SysCustomWidgetOperationType.ADD)"
@click="onOperationClick(getOperation(SysCustomWidgetOperationType.ADD))"
>
{{getOperation(SysCustomWidgetOperationType.ADD).name || '新建'}}
</el-button>
</div>
</div>
-->
<el-row>
<el-col :span="24" :style="{height: (this.widget.props.height != null) ? ((this.widget.props.height - 53) + 'px') : undefined}">
<OnlineCustomTable :dataList="tableWidget.dataList"
:widget="widget"
:height="this.widget.props.height ? (this.widget.props.height - 53) : 200"
border="default"
:multiSelect="batchDelete"
:operationList="widget.operationList"
:getTableIndex="tableWidget.getTableIndex"
:sortChange="tableWidget.onSortChange"
:onSelectChange="onSelectRowChange"
@operationClick="onOperationClick"
/>
</el-col>
</el-row>
</el-card>
</template>
<script>
import { findItemFromList } from '@/utils';
import { TableWidget } from '@/utils/widget.js';
import OnlineCustomTable from './OnlineCustomTable.vue';
export default {
name: 'onlineCardTable',
props: {
value: {
type: Array,
default: () => []
},
widget: {
type: Object
}
},
inject: ['form'],
components: {
OnlineCustomTable
},
data () {
return {
selectRows: [],
batchDelete: false,
tableWidget: new TableWidget(this.loadTableData, this.loadTableDataVerify, false, false)
}
},
methods: {
loadTableData () {
return Promise.resolve({
dataList: this.value,
totalCount: this.value.length
});
},
loadTableDataVerify () {
return true;
},
onTableDataListChange (dataList) {
if (!this.form().isEdit && typeof this.widget.eventInfo[this.OnlineFormEventType.AFTER_LOAD_TABLE_DATA] === 'function') {
dataList = this.widget.eventInfo[this.OnlineFormEventType.AFTER_LOAD_TABLE_DATA](dataList);
}
this.$emit('input', dataList);
},
hasOperator (type) {
let temp = this.getOperation(type);
return temp && temp.enabled;
},
getOperation (type) {
return findItemFromList(this.widget.operationList, type, 'type');
},
operationVisible (type) {
let operation = this.getOperation(type);
return !this.form().readOnly && this.hasOperator(type) && this.form().checkOperationVisible(operation);
},
operationDisabled (type) {
let operation = this.getOperation(type);
return this.form().checkOperationDisabled(operation) || !this.form().checkOperationPermCode(operation);
},
onSelectRowChange (rows) {
this.selectRows = rows;
},
handlerEditOperate (row, res) {
if (this.widget.relation != null) {
if (row == null) {
// 新增记录
row = res[this.widget.relation.variableName];
this.onTableDataListChange([
...this.tableWidget.dataList,
{
...row,
__cascade_add_id__: new Date().getTime()
}
]);
} else {
// 更新记录
row = res[this.widget.relation.variableName];
this.onTableDataListChange(this.tableWidget.dataList.map(item => {
if (row.__cascade_add_id__ != null) {
return row.__cascade_add_id__ === item.__cascade_add_id__ ? row : item;
} else {
return row[this.widget.primaryColumnName] === item[this.widget.primaryColumnName] ? row : item;
}
}));
}
}
},
onOperationClick (operation, row) {
if (operation.type === this.SysCustomWidgetOperationType.BATCH_DELETE) {
this.onBatchDelete(operation);
} else if (operation.type === this.SysCustomWidgetOperationType.DELETE) {
this.onDeleteRow(row);
} else {
this.form().handlerOperation(operation, {
isEdit: this.form().isEdit,
saveData: false,
widget: this.widget,
rowData: row,
callback: (res) => {
this.handlerEditOperate(row, res);
}
});
}
},
onBatchDelete (operation) {
if (this.selectRows.length <= 0) {
this.$message.error('请选择要批量删除的数据!');
return;
}
this.$confirm('是否删除选中数据?').then(res => {
this.onTableDataListChange(this.tableWidget.dataList.filter(row => {
// 通过主键查找
let temp = findItemFromList(this.selectRows, row[this.widget.primaryColumnName], this.widget.primaryColumnName);
// 通过新增临时主键查找
if (temp == null && row.__cascade_add_id__ != null) {
temp = findItemFromList(this.selectRows, row.__cascade_add_id__, '__cascade_add_id__');
}
return temp == null;
}));
});
},
onDeleteRow (data) {
this.$confirm('是否删除当前数据?').then(res => {
this.onTableDataListChange(this.tableWidget.dataList.filter(row => {
if (data.__cascade_add_id__ != null) {
return data.__cascade_add_id__ !== row.__cascade_add_id__;
} else {
return data[this.widget.primaryColumnName] !== row[this.widget.primaryColumnName];
}
}));
}).catch(e => {});
},
refresh () {
this.tableWidget.refreshTable(true, 1);
},
refreshData (data) {
if (data.path === ('thirdOnlineEditForm/' + this.widget.variableName)) {
this.handlerEditOperate(data.rowData, data.data);
}
}
},
mounted () {
this.widget.widgetImpl = this;
window.addEventListener('message', (event) => {
if (event.data.type === 'refreshData') {
this.refreshData(event.data.data);
}
}, false);
},
watch: {
value: {
handler () {
this.refresh();
},
immediate: true
}
}
}
</script>
<style scoped>
.base-card >>> .el-card__header {
padding: 0px 10px!important;
}
.online-card-table >>> .vxe-table--border-line {
border: none!important;
}
</style>
This diff is collapsed.
This diff is collapsed.
<template>
<div ref="formWrapper" class="form-wrapper">
<el-row>
<OnlineOneToOneForm
ref="onlineForm"
:height="tableHeight"
:formConfig="dialogParams.formConfig"
:selectedColumn="dialogParams.relativeTable.relativeColumn"
:selectedValue="dialogParams.value"
@radioSelectChanged="onRadioChange"
@submit="onSubmit"
>
</OnlineOneToOneForm>
</el-row>
</div>
</template>
<script>
import thirdPartyMixin from '@/views/thirdParty/thirdPartyMixin.js';
export default {
name: 'onlineCustomDataSelectDlg',
props: {
value: {
type: String
},
relativeTable: {
type: Object
},
formConfig: {
type: Object
}
},
mixins: [thirdPartyMixin],
components: {
// 按需引用,解决组件循环引用的问题
OnlineOneToOneForm: () => import('@/views/online/OnlinePageRender/OnlineOneToOneForm/index.vue')
},
data () {
return {
dialogSelectItems: {},
tableHeight: ''
}
},
computed: {
dialogParams () {
return {
value: this.value || this.thirdParams.value,
formConfig: this.formConfig || this.thirdParams.formConfig,
relativeTable: this.relativeTable || this.thirdParams.relativeTable || {}
}
}
},
methods: {
onCancel (isSuccess = false) {
if (this.observer != null) {
this.observer.cancel(isSuccess, this.dialogSelectItems);
} else {
this.onCloseThirdDialog(isSuccess, this.thirdParams.path, this.dialogParams.value, this.dialogSelectItems);
}
},
onSubmit () {
this.onCancel(true);
},
onRadioChange (data) {
this.dialogSelectItems = data;
}
},
mounted () {
this.$nextTick(() => {
this.tableHeight = (this.$refs.formWrapper.offsetHeight) + 'px';
})
}
}
</script>
<style lang="scss" scoped>
.form-wrapper{
position:relative;
height:100%
}
.form-footer{
width:100%;
text-align:right;
position:absolute;
bottom:0px;
.btn-confirm{
height: 28px;
display:inline-block
}
}
</style>
<template>
<div class="data-select">
<el-select :value="selectedValue"
style="width: 100%;"
:multiple="multiple"
:disabled="disabled || (relativeTable || {}).relativeFormId == null"
:size="size"
:clearable="clearable"
:placeholder="placeholder"
:popper-append-to-body="false"
popper-class="data-select-popper"
@visible-change="onVisibleChange"
@clear="onClear"
>
<el-option :label="selectedItem.label" :value="selectedItem.value" />
</el-select>
</div>
</template>
<script>
import { getUUID } from '@/utils';
import DataSelectDlg from './dataSelectDlg.vue';
import refreshDataMixins from '@/views/thirdParty/refreshDataMixins.js';
export default {
name: 'onlineCustomDataSelect',
props: {
value: {
type: [String, Number, Array]
},
disabled: {
type: Boolean,
default: false
},
size: {
type: String
},
clearable: {
type: Boolean,
default: false
},
collapseTags: {
type: Boolean,
default: true
},
placeholder: {
type: String
},
relativeTable: {
type: Object
},
multiple: {
type: Boolean,
default: false
}
},
mixins: [refreshDataMixins],
inject: ['form'],
data () {
return {
widgetId: getUUID(),
selectedItem: {label: '', value: ''},
selectedValue: ''
}
},
methods: {
refreshData (data) {
if (data.path === 'thirdSelectData/' + this.widgetId && data.isSuccess) {
this.handlerEditOperate(data.data);
}
},
handlerEditOperate (selectValue) {
this.selectedItem = {
label: selectValue[this.relativeTable.displayField],
value: selectValue[this.relativeTable.relativeColumn]
}
this.selectedValue = selectValue[this.relativeTable.relativeColumn];
this.emitChange(selectValue);
},
loadOnlineFormConfig (formId) {
return new Promise((resolve, reject) => {
this.form().loadOnlineFormConfig(formId).then(formConfig => {
resolve(formConfig);
}).catch(e => {
console.log(e);
reject(e);
});
});
},
onVisibleChange (visible) {
if (visible) {
this.loadOnlineFormConfig(this.relativeTable.relativeFormId).then(formConfig => {
this.$dialog.show('关联数据选择', DataSelectDlg, {
area: ['900px', '650px'],
offset: '100px',
skin: 'one_to_one_query'
}, {
value: this.selectedValue,
relativeTable: this.relativeTable,
formConfig: formConfig,
path: 'thirdSelectData/' + this.widgetId
}, {
width: '900px',
height: '650px',
pathName: '/thirdParty/thirdSelectData'
}).then(res => {
this.handlerEditOperate(res);
});
}).catch(e => {
console.log(e);
this.$message.error('获取弹窗信息失败!');
});
}
},
onClear () {
this.selectedItem = {label: '', value: ''};
this.selectedValue = '';
this.emitChange(null);
},
emitChange (selectRow) {
this.$emit('input', this.selectedValue);
this.$emit('change', this.selectedValue, selectRow);
},
loadTableData () {
return new Promise((resolve, reject) => {
let params = {};
let httpCall = null;
params.datasourceId = this.relativeTable.datasourceId;
params.filterDtoList = [];
params.filterDtoList.push({
columnName: this.relativeTable.relativeColumn,
columnValue: this.selectedValue,
filterType: 1,
tableName: this.relativeTable.relativeTableName
});
params.relationId = this.relativeTable.relationId;
httpCall = this.doUrl(`/admin/online/onlineOperation/listByOneToManyRelationId/${this.relativeTable.variableName}`, 'post', params);
httpCall.then(res => {
if (res.data.dataList.length > 0) {
this.selectedItem = {label: res.data.dataList[0][this.relativeTable.displayField], value: this.selectedValue};
}
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
}
},
mounted () {
this.selectedValue = this.value;
if (this.selectedValue) this.loadTableData();
},
watch: {
value: {
handler () {
this.selectedValue = this.value;
if (this.selectedValue) this.loadTableData();
},
immediate: true
}
}
}
</script>
<style scoped>
.data-select >>> .data-select-popper {
display: none;
}
.data-select >>> .el-dialog__header {
height: 42px;
line-height: 42px;
padding: 0px 20px;
background-color: #F8F8F8;
}
.data-select >>> .el-dialog__title {
color: #333;
font-size: 14px;
}
.data-select >>> .el-dialog__headerbtn {
top: 12px;
}
.data-select >>> .el-dialog__body {
padding: 25px;
}
</style>
<template>
<el-row type="flex" :justify="align">
<img :src="imageUrl" :style="getStyle" />
</el-row>
</template>
<script>
import { uploadMixin } from '@/core/mixins';
export default {
name: 'onlineCustomImage',
props: {
value: {
type: String
},
src: {
type: String
},
fit: {
type: String
},
align: {
type: String,
default: 'left'
},
width: {
type: String
},
height: {
type: String
},
radius: {
type: Number,
default: 5
},
round: {
type: Boolean,
default: false
},
widget: {
type: Object
}
},
mixins: [uploadMixin],
inject: ['form'],
data () {
return {
fileList: []
}
},
computed: {
getStyle () {
let temp = this.round ? '50%' : (this.radius + 'px');
return {
width: this.width != null ? this.width : '200px',
height: this.height != null ? this.height : '200px',
'object-fit': this.fit,
'border-radius': temp
}
},
buildFlowParam () {
let flowParam = {};
let flowData = this.form().flowData;
if (flowData) {
if (flowData.processDefinitionKey) flowParam.processDefinitionKey = flowData.processDefinitionKey;
if (flowData.processInstanceId) flowParam.processInstanceId = flowData.processInstanceId;
if (flowData.taskId) flowParam.taskId = flowData.taskId;
}
return flowParam;
},
imageUrl () {
if (Array.isArray(this.fileList) && this.fileList.length > 0) {
return this.fileList[0].url;
} else {
return this.src;
}
},
getDownloadUrl () {
if (this.widget.relation) {
return '/admin/online/onlineOperation/downloadOneToManyRelation/' + (this.widget.datasource || {}).variableName;
} else {
return '/admin/online/onlineOperation/downloadDatasource/' + (this.widget.datasource || {}).variableName;
}
}
},
watch: {
value: {
handler (newValue) {
setTimeout(() => {
this.fileList = [];
if (newValue != null) {
let downloadParams = {
...this.buildFlowParam,
datasourceId: (this.widget.datasource || {}).datasourceId,
fieldName: this.widget.column.columnName,
asImage: true,
dataId: this.form().getPrimaryData(this.widget) || ''
}
if (this.widget.relation) downloadParams.relationId = this.widget.relation.relationId;
let temp = JSON.parse(newValue);
temp = Array.isArray(temp) ? temp.map(item => {
return {
...item,
downloadUri: this.getDownloadUrl
}
}) : [];
this.fileList = this.parseUploadData(JSON.stringify(temp), downloadParams);
}
}, 30);
},
immediate: true
}
}
}
</script>
<style>
</style>
<template>
<div class="custom-label">
<span v-if="isText">
{{showText}}
</span>
<div v-if="isHtml" v-html="showText" />
</div>
</template>
<script>
export default {
name: 'onlineCustomLabel',
props: {
value: {
type: [Number, String, Boolean, Array]
},
widget: {
type: Object,
required: true
}
},
inject: ['form'],
methods: {
},
computed: {
isText () {
return [
this.SysCustomWidgetType.Label,
this.SysCustomWidgetType.Input,
this.SysCustomWidgetType.NumberInput,
this.SysCustomWidgetType.NumberRange,
this.SysCustomWidgetType.Slider,
this.SysCustomWidgetType.Radio,
this.SysCustomWidgetType.CheckBox,
this.SysCustomWidgetType.Switch,
this.SysCustomWidgetType.Select,
this.SysCustomWidgetType.Cascader,
this.SysCustomWidgetType.Date,
this.SysCustomWidgetType.DateRange,
this.SysCustomWidgetType.UserSelect,
this.SysCustomWidgetType.DeptSelect,
this.SysCustomWidgetType.DataSelect
].indexOf(this.widget.widgetType) !== -1;
},
isHtml () {
return this.widget.widgetType === this.SysCustomWidgetType.RichEditor && this.widget.column && this.widget.column.fieldKind === this.SysOnlineFieldKind.RICH_TEXT;
},
showText () {
switch (this.widget.widgetType) {
case this.SysCustomWidgetType.Label:
case this.SysCustomWidgetType.Input:
case this.SysCustomWidgetType.NumberInput:
case this.SysCustomWidgetType.Slider:
case this.SysCustomWidgetType.Date:
case this.SysCustomWidgetType.RichEditor:
case this.SysCustomWidgetType.Radio:
case this.SysCustomWidgetType.CheckBox:
case this.SysCustomWidgetType.Select:
case this.SysCustomWidgetType.Cascader:
case this.SysCustomWidgetType.UserSelect:
case this.SysCustomWidgetType.DeptSelect:
case this.SysCustomWidgetType.DataSelect:
return this.value == null ? (this.form().isEdit ? 'XXXXXXXXXX' : undefined) : (Array.isArray(this.value) ? this.value.join(',') : this.value);
case this.SysCustomWidgetType.NumberRange:
case this.SysCustomWidgetType.DateRange:
return (Array.isArray(this.value) && this.value.length > 1) ? (this.value[0] + ' 至 ' + this.value[1]) : ((this.form().isEdit ? 'XXXXX 至 XXXXX' : undefined));
case this.SysCustomWidgetType.Switch:
return this.value ? '是' : '否';
default: return '';
}
}
},
mounted () {
this.widget.widgetImpl = this;
}
}
</script>
<style>
</style>
This diff is collapsed.
<template>
<div class="table-draggable" :style="{'margin-bottom': ((widget.props.paddingBottom || (widget.props.basicInfo || {}).paddingBottom || 0) + 'px')}">
<el-tabs v-if="(widget.childWidgetList || []).length > 0" v-model="activePanel"
:type="widget.props.type"
>
<el-tab-pane v-for="subWidget in widget.childWidgetList" :key="subWidget.variableName"
:label="subWidget.showName" :name="subWidget.variableName" :lazy="true"
>
<OnlineCustomBlock v-model="subWidget.childWidgetList"
:isEdit="isEdit"
@widgetClick="onWidgetClick"
/>
</el-tab-pane>
</el-tabs>
<div v-if="isEdit && (widget.childWidgetList || []).length <= 0" class="info" style="border: 1px solid #e8eaec;">
<div style="height: 100px; width: 100px;">
<i class="el-icon-upload" />
</div>
<span>请添加标签页</span>
</div>
</div>
</template>
<script>
export default {
name: 'tabs',
props: {
widget: {
type: Object,
required: true
},
// 是否表单编辑模式
isEdit: {
type: Boolean,
default: false
}
},
data () {
return {
activePanel: undefined
}
},
inject: ['form'],
methods: {
onCopyWidget (widget) {
this.widget.childWidgetList.push(widget);
},
onDeleteWidget (widget) {
this.$confirm('是否删除此组件?').then(res => {
this.widget.childWidgetList = this.widget.childWidgetList.filter(item => item !== widget);
this.onWidgetClick(null);
}).catch(e => {});
},
onWidgetClick (widget) {
this.$emit('widgetClick', widget);
}
},
watch: {
'widget.childWidgetList': {
handler () {
if (Array.isArray(this.widget.childWidgetList) && this.widget.childWidgetList.length > 0) {
this.activePanel = this.widget.childWidgetList[0].variableName;
}
},
immediate: true
}
}
};
</script>
<style scoped>
.info {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
padding: 20px;
text-align: center;
vertical-align: middle;
color: #999999;
}
.info div {
width: 80px;
height: 80px;
border: 1px dashed #D9DBDD;
line-height: 100px;
text-align: center;
border-radius: 6px;
font-size: 60px;
}
.info span {
margin-top: 10px;
font-size: 16px;
}
</style>
<template>
<div class="online-custom-text" :style="{background: bgColor, height: height ? (height + 'px') : undefined, 'justify-content': valign, padding: padding + 'px'}">
<div :style="getStyle">
{{value}}
</div>
</div>
</template>
<script>
export default {
name: 'onlineCustomText',
props: {
value: {
type: [Number, String, Date],
default: ''
},
align: {
type: String,
default: 'left'
},
valign: {
type: String,
default: 'center'
},
bgColor: {
type: String
},
height: {
type: Number,
default: 25
},
textIndent: {
type: Number,
default: 0
},
fontSize: {
type: Number,
default: 14
},
padding: {
type: Number,
default: 2
},
fontColor: {
type: String,
default: '#383838'
},
fontBold: {
type: Boolean,
default: false
},
fontItalic: {
type: Boolean,
default: false
}
},
computed: {
getStyle () {
return {
'width': '100%',
'text-indent': this.textIndent + 'em',
'text-align': this.align,
'max-height': this.height ? (this.height + 'px') : undefined,
'line-height': 1.5,
'font-size': this.fontSize + 'px',
'color': this.fontColor,
'font-weight': this.fontBold ? 600 : 400,
'font-style': this.fontItalic ? 'italic' : undefined,
'overflow': 'hidden',
'word-break': 'break-word'
}
}
}
}
</script>
<style scoped>
.online-custom-text {
display: flex;
flex-direction: column;
padding: 2px;
}
</style>
<template>
<el-tree class="online-custom-tree" ref="tree"
:data="treeDataList"
node-key="id"
:show-checkbox="multiple"
:highlight-current="true"
:default-expand-all="true"
:auto-expand-parent="true"
:expand-on-click-node="false"
@check-change="onSelectChange"
@node-click="onNodeClick"
>
<el-row class="node-item" type="flex" justify="space-between" align="middle" slot-scope="{ data }">
<div class="text">{{data.name}}</div>
</el-row>
</el-tree>
</template>
<script>
import { treeDataTranslate, findItemFromList } from '@/utils';
export default {
name: 'OnlineCustomTree',
props: {
value: {
type: [String, Number, Array]
},
widget: {
type: Object,
required: true
},
multiple: {
type: Boolean,
default: false
},
dataList: {
type: Array,
default: () => []
},
filter: {
type: Object
}
},
inject: ['form'],
data () {
return {}
},
methods: {
onNodeClick () {
if (!this.multiple) this.onSelectChange();
},
onValueChange () {
let temp = this.value;
if (this.$refs.tree) {
if (this.multiple) {
temp = this.$refs.tree.getCheckedKeys();
} else {
temp = this.$refs.tree.getCurrentKey();
}
}
this.$emit('input', temp);
let dictData = this.multiple ? null : findItemFromList(this.dataList, temp, 'id');
this.$emit('change', temp, dictData);
},
onSelectChange () {
this.onValueChange();
},
setTreeSelectNode () {
if (this.$refs.tree) {
if (this.multiple) {
this.$refs.tree.setCheckedKeys(this.value || []);
} else {
this.$refs.tree.setCurrentKey(this.value);
}
}
}
},
computed: {
// 左树右表布局,左侧过滤条件
leftFilterObject () {
return this.form().filter;
},
treeDataList () {
let tempList = (this.dataList || []).filter(item => {
item.children = null;
return this.leftFilterObject == null || this.leftFilterObject.name == null || item.name.indexOf(this.leftFilterObject.name) !== -1;
});
let temp = treeDataTranslate(tempList, 'id', 'parentId');
if (this.multiple) {
return temp;
} else {
return [
{
id: '',
name: '全部'
},
...temp
]
}
}
},
watch: {
value: {
handler () {
this.setTreeSelectNode();
},
immediate: true
},
dataList: {
handler () {
setTimeout(() => {
this.setTreeSelectNode();
}, 50);
},
immediate: true
}
},
mounted () {
this.widget.widgetImpl = this;
}
}
</script>
<style scoped>
.online-custom-tree >>> .el-tree-node__content {
height: 100%;
}
.online-custom-tree >>> .el-tree-node__expand-icon {
font-size: 16px;
color: #666666;
}
.online-custom-tree >>> .el-tree-node__expand-icon.is-leaf {
color: transparent;
cursor: default;
}
.node-item {
padding: 12px 0px;
margin-right: 15px;
flex-grow: 1;
min-width: 100px;
}
.node-item .text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>
<style lang="scss">
@import '@/assets/style/element-variables.scss';
.online-custom-tree .is-current > .el-tree-node__content {
background: $--color-primary-light-9!important;
color: $--color-primary;
}
</style>
<template>
<div class="online-custom-upload">
<el-upload v-if="!readOnly"
:class="{
'upload-image-item': isImage,
'upload-image-multi': maxFileCount !== 1
}"
:name="widget.props.fileFieldName"
:headers="getUploadHeaders"
:action="getActionUrl"
:data="getUploadData"
:on-success="onUploadSuccess"
:on-remove="onRemoveFile"
:on-error="onUploadError"
:on-exceed="onUploadLimit"
:limit="maxFileCount"
:show-file-list="maxFileCount !== 1 || !isImage"
:list-type="getUploadListType"
:file-list="getUploadFileList"
:disabled="getDisabledStatus()"
>
<!-- 上传图片 -->
<template v-if="isImage && maxFileCount === 1">
<div v-if="getUploadFileList && getUploadFileList[0] != null" style="position: relative">
<img class="upload-image-show" :src="getUploadFileList[0].url" />
<div class="upload-img-del el-icon-close" @click.stop="onRemoveFile(null, null)" />
</div>
<i v-else class="el-icon-plus upload-image-item"></i>
</template>
<!-- 上传文件 -->
<template v-else-if="!isImage">
<el-button :size="defaultFormItemSize" type="primary">点击上传</el-button>
</template>
</el-upload>
<template v-else>
<template v-if="isImage">
<el-image v-for="item in uploadWidgetImpl.fileList"
:preview-src-list="(uploadWidgetImpl.fileList || []).map(imgItem => imgItem.url)"
class="table-cell-image" :key="item.url" :src="item.url" fit="fill">
</el-image>
</template>
<a v-else v-for="item in uploadWidgetImpl.fileList" :key="item.url" href="javascript:void(0);" @click="downloadFile(item.url, item.name)">
{{item.name}}
</a>
</template>
</div>
</template>
<script>
import { UploadWidget } from '@/utils/widget.js';
import { uploadMixin } from '@/core/mixins';
export default {
name: 'onlineCustomUpload',
props: {
value: {
type: String
},
widget: {
type: Object,
required: true
},
readOnly: {
type: Boolean,
default: false
}
},
mixins: [uploadMixin],
inject: ['form'],
data () {
return {
isImage: false,
uploadWidgetImpl: new UploadWidget(this.widget.column ? this.maxFileCount : 0)
}
},
methods: {
getDisabledStatus () {
if (this.form().isEdit) return true;
if (this.widget.eventInfo && this.widget.eventInfo[this.OnlineFormEventType.DISABLE]) {
return this.widget.eventInfo[this.OnlineFormEventType.DISABLE]();
} else {
return this.widget.props.disabled;
}
},
onValueChange () {
this.$emit('input', this.fileListToJson(this.uploadWidgetImpl.fileList), this.widgetConfig);
},
onUploadSuccess (response, file, fileList) {
if (response.success) {
file.filename = response.data.filename;
file.url = URL.createObjectURL(file.raw);
this.uploadWidgetImpl.onFileChange(file, fileList);
this.onValueChange();
} else {
this.$message.error(response.message);
}
},
onRemoveFile (file, fileList) {
this.uploadWidgetImpl.onFileChange(file, fileList);
this.onValueChange();
},
onUploadError (e, file, fileList) {
this.$message.error('文件上传失败');
},
onUploadLimit (files, fileList) {
if (this.maxFileCount != null && this.maxFileCount > 0) {
this.$message.error('已经超出最大上传个数限制');
}
}
},
computed: {
/*
isImage () {
return this.widget && this.widget.column && this.widget.column.fieldKind === this.SysOnlineFieldKind.UPLOAD_IMAGE;
},
*/
maxFileCount () {
return this.widget.column ? this.widget.column.maxFileCount : 0;
},
buildFlowParam () {
let flowParam = {};
let flowData = this.form().flowData;
if (flowData) {
if (flowData.processDefinitionKey) flowParam.processDefinitionKey = flowData.processDefinitionKey;
if (flowData.processInstanceId) flowParam.processInstanceId = flowData.processInstanceId;
if (flowData.taskId) flowParam.taskId = flowData.taskId;
}
return flowParam;
},
getActionUrl () {
if (this.widget.props.actionUrl == null || this.widget.props.actionUrl === '') {
if (this.widget.relation) {
return this.getUploadActionUrl('/admin/online/onlineOperation/uploadOneToManyRelation/' + (this.widget.datasource || {}).variableName);
} else {
return this.getUploadActionUrl('/admin/online/onlineOperation/uploadDatasource/' + (this.widget.datasource || {}).variableName);
}
} else {
return this.getUploadActionUrl(this.widget.props.actionUrl);
}
},
getDownloadUrl () {
if (this.widget.props.downloadUrl == null || this.widget.props.downloadUrl === '') {
if (this.widget.relation) {
return '/admin/online/onlineOperation/downloadOneToManyRelation/' + (this.widget.datasource || {}).variableName;
} else {
return '/admin/online/onlineOperation/downloadDatasource/' + (this.widget.datasource || {}).variableName;
}
} else {
return this.widget.props.downloadUrl;
}
},
getUploadData () {
let temp = {
...this.buildFlowParam,
datasourceId: (this.widget.datasource || {}).datasourceId,
asImage: this.isImage,
fieldName: (this.widget.column || {}).columnName
}
if ((this.widget.relation || {}).relationId) temp.relationId = (this.widget.relation || {}).relationId;
return temp;
},
getUploadListType () {
if (this.maxFileCount !== 1 && this.isImage) {
return 'picture-card';
}
return 'text';
},
getUploadFileList () {
return this.uploadWidgetImpl ? this.uploadWidgetImpl.fileList : [];
}
},
mounted () {
this.widget.widgetImpl = this;
},
watch: {
value: {
handler (newValue) {
setTimeout(() => {
this.uploadWidgetImpl.fileList = [];
if (newValue != null) {
let downloadParams = {
...this.buildFlowParam,
datasourceId: (this.widget.datasource || {}).datasourceId,
fieldName: this.widget.column.columnName,
asImage: this.isImage,
dataId: this.form().getPrimaryData(this.widget) || ''
}
if (this.widget.relation) downloadParams.relationId = this.widget.relation.relationId;
let temp = JSON.parse(newValue);
temp = Array.isArray(temp) ? temp.map(item => {
return {
...item,
downloadUri: this.getDownloadUrl
}
}) : [];
this.uploadWidgetImpl.fileList = this.parseUploadData(JSON.stringify(temp), downloadParams);
}
}, 30);
},
immediate: true
},
maxFileCount: {
handler () {
if (this.uploadWidgetImpl) this.uploadWidgetImpl.maxCount = this.maxFileCount;
},
immediate: true
},
'widget.column': {
handler () {
let column = this.widget.bindData.column || this.widget.column;
this.isImage = column ? (column.fieldKind === this.SysOnlineFieldKind.UPLOAD_IMAGE) : false;
},
immediate: true
},
'widget.bindData.columnId': {
handler () {
let column = this.widget.bindData.column || this.widget.column;
this.isImage = column ? (column.fieldKind === this.SysOnlineFieldKind.UPLOAD_IMAGE) : false;
},
immediate: true
}
}
}
</script>
<style>
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<el-form class="custom-widget-attribute" label-position="top" label-width="115px" size="small" @submit.native.prevent>
<EditWidgetAttribute v-for="attributeItem in attributeList" :key="attributeItem.attributeKey"
v-model="value[attributeItem.attributeKey]" :attributeItem="attributeItem"
/>
</el-form>
</template>
<script>
import AttributeMixins from '../mixins.js';
import EditWidgetAttribute from './editWidgetAttribute.vue';
export default {
mixins: [AttributeMixins],
components: {
EditWidgetAttribute
}
}
</script>
<style>
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment