Commit cc74e239 authored by 何虹's avatar 何虹 💬

优化配置

parent 68de54d9
......@@ -601,9 +601,7 @@ const hsTableImport = {
]
},
config: {
'hsConfig': {
'default_type': 1
},
bindEntity: '',
'isAdaptive': true,
'showHandle': false,
disaledDblClick: false,
......@@ -663,9 +661,7 @@ const hsTableImportList = {
]
},
config: {
'hsConfig': {
'default_type': 1
},
bindEntity: '',
'isAdaptive': true,
'showHandle': false,
disaledDblClick: false,
......@@ -700,9 +696,7 @@ const hsTableImportList = {
const hsTableSimple = {
data: [],
config: {
'hsConfig': {
'default_type': 1
},
bindEntity: '',
'isAdaptive': true,
'showHandle': false,
disaledDblClick: false,
......@@ -759,9 +753,7 @@ const hsTableList = {
]
},
config: {
'hsConfig': {
'default_type': 1
},
bindEntity: '',
'isAdaptive': true,
'showHandle': false,
disaledDblClick: false,
......@@ -817,9 +809,6 @@ const hsTableList = {
const hsTableDtl = {
data: [],
config: {
'hsConfig': {
'default_type': 1
},
bindEntity: '',
'isAdaptive': true,
'showHandle': false,
......@@ -944,9 +933,6 @@ const hsTable = {
]
},
config: {
'hsConfig': {
'default_type': 1
},
'isAdaptive': true,
'showHandle': false,
disaledDblClick: false,
......@@ -1038,9 +1024,7 @@ const hsTableInDyncDialog = {
]
},
config: {
'hsConfig': {
'default_type': 1
},
bindEntity: '',
'isAdaptive': true,
'showHandle': false,
disaledDblClick: false,
......@@ -2376,9 +2360,7 @@ const hsTableIndexHdrDtlIndex = {
]
},
config: {
'hsConfig': {
'default_type': 1
},
bindEntity: '',
'isAdaptive': true,
'showHandle': false,
disaledDblClick: true,
......
......@@ -319,7 +319,7 @@ export default {
default() {
return {
config: {},
sourceData: []
data: []
}
}
},
......@@ -554,7 +554,7 @@ export default {
this.downSite(this.tableDataColums, index)
},
generateTheHeaderBefore() {
const editor2Data = this.allSourceData && this.allSourceData.sourceData
const editor2Data = this.allSourceData && this.allSourceData.data
if (
(Array.isArray(editor2Data) && !editor2Data.length) ||
(editor2Data.table && !editor2Data.table.length)
......
......@@ -130,7 +130,7 @@
<tbaleColumsSet
v-model="dialogVisibleTbaleColums"
:tableDataColums='tableDataColums'
:allSourceData='allSourceData'
:allSourceData='allSourceDataTbaleColumsSet'
:mockSourceData='mockSourceData'
:elInfo='elInfo'
:isEditColumns='isEditColumns'
......@@ -143,8 +143,8 @@
@submit='asyncFormPropSubmit'
:elInfo='elInfo'
:controlType='controlType'
v-bind="$attrs"
v-on="$listeners"
v-bind="$attrs"
v-on="$listeners"
/>
<hsTabsFormSet
v-model="dialogVisibleHsTabsForm"
......@@ -200,7 +200,7 @@ import hsTabsFormSet from '../../common/hsTabsFormSet'
import 'jsoneditor/dist/jsoneditor.min.css'
import jsoneditor from 'jsoneditor'
export default {
mixins:[elementUiMinins],
mixins: [elementUiMinins],
components: { lookPageLog, asyncFormPropSet, tbaleColumsSet, hsTabsFormSet },
name: 'hs-jsoneditor',
props: {
......@@ -230,11 +230,16 @@ export default {
return () => {}
}
},
allSourceData: {},
controlType: {},
isEditColumns: {}
},
computed: {
allSourceDataTbaleColumsSet() {
return {
config: this.config,
data: this.data
}
},
innervisible: {
get() {
return this.visible
......@@ -405,7 +410,7 @@ export default {
},
showViewLog(data) {
this.editor1.set(data.config)
this.editor2.set(data.sourceData)
this.editor2.set(data.data)
this.textareaSql = data.sql || ''
this.showView()
},
......@@ -454,7 +459,7 @@ export default {
this.controlInfo.isMock = !!is_mock
const jsonData = {
config: JSON.parse(json_config),
sourceData: JSON.parse(json_data),
data: JSON.parse(json_data),
sql: query_sql || ''
}
this.copyJsoneditorData = JSON.parse(JSON.stringify(jsonData))
......@@ -481,9 +486,7 @@ export default {
this.$emit('dialogClose')
},
handleControlInfo() {
const {
position
} = this.elInfo
const { position } = this.elInfo
this.controlInfo.controlName = position
},
dialogOpen() {
......@@ -500,13 +503,17 @@ export default {
const mockdata = this.getMockData(this.elInfo.el)
if (!mockdata) {
this.$message.error(this.elInfo.el + '----请配置模拟数据!')
this.setJson({ config: {}, sourceData: [] })
this.setJson({ config: {}, data: [] })
return
}
this.copyJsoneditorData = JSON.parse(JSON.stringify(mockdata))
if (this.allSourceData && this.allSourceData.loadExisData) {
if (this.loadExisData) {
// 加载请求回来的数据
this.setJson(this.allSourceData)
const loadExisDataConfig = {
config: this.config || {},
data: this.data || []
}
this.setJson(loadExisDataConfig)
} else {
this.setJson(mockdata)
}
......@@ -562,14 +569,14 @@ export default {
this.$message.success('设置成功')
})
},
setJson(data) {
const { config, sourceData } = JSON.parse(JSON.stringify(data))
setJson(dataConfig = {}) {
const { config, data } = JSON.parse(JSON.stringify(dataConfig))
if (!this.editor1) {
this.drow(this.ideditor1, config, 'editor1')
this.drow(this.ideditor2, sourceData, 'editor2')
this.drow(this.ideditor2, data, 'editor2')
} else {
this.editor1.set(config)
this.editor2.set(sourceData)
this.editor2.set(data)
}
},
showView() {
......@@ -578,10 +585,10 @@ export default {
},
showEchart() {
const config = this.editor1.get()
const sourceData = this.editor2.get()
const data = this.editor2.get()
this.commonData = {
config,
sourceData
data
}
},
drow(el, json = {}, flage) {
......
This diff is collapsed.
// dialog.js
import Vue from 'vue'
function makeDialog(option) {
var dom = document.createElement('div')
document.getElementsByTagName('body')[0].appendChild(dom)
const tpl = `
<el-dialog
:close-on-click-modal="false"
:custom-class="customClass"
:title="title"
:visible.sync="show"
:size="size"
:before-close="handleClose"
@close="close">
<dialogContent @close="closeDialog" @confirm="confirmDialog" v-model="dialogData"></dialogContent>
</el-dialog>`
var vue = new Vue({
el: dom,
data: function() {
return {
title: option.title,
size: option.size || 'small',
show: true,
dialogData: option.data
}
},
template: tpl,
computed: {
customClass() {
return `el-dialog--width-${option.size || 'auto'}`
}
},
methods: {
handleClose(done) {
if (option.beforeClose) {
option.beforeClose(done)
} else {
done()
}
},
close() {
if (option.close) {
option.close()
}
},
closeDialog() {
this.show = false
},
confirmDialog(result) {
this.show = false
option.confirm && option.confirm(result)
}
},
components: {
dialogContent: option.component
}
})
return vue
}
export default {
open(options) {
return makeDialog(options)
}
}
<template>
<el-dialog
title="导入"
:visible.sync="dialogVisible"
width="90%"
:before-close="handleClose"
:close-on-click-modal='false'
@open='open'
:append-to-body='true'
>
<iframe
name="zi"
:src='pageSrc'
style="width:100%;height:500px;padding-top:10px"
sandbox="allow-same-origin allow-scripts allow-forms allow-top-navigation allow-popups"
></iframe>
</el-dialog>
</template>
<script>
export default {
name: 'hsDialogIframe',
props: {
value: {
type: Boolean,
default: false
},
src: {
type: String,
default: ''
},
entityConfig: {},
currentImportItem: {},
entityManger: {}
},
watch: {
value(val) {
this.dialogVisible = val
},
dialogVisible(val) {
this.$emit('input', val)
}
},
data() {
return {
dialogVisiblePage: false,
pageSrc: '',
dialogVisible: false
}
},
beforeDestroy() {
window.removeEventListener('message', this.listenerMessageFun, false)
},
mounted() {
window.addEventListener(
'message',
this.listenerMessageFun,
false
)
},
methods: {
listenerMessageFun(event) {
const data_ = event.data
const { innerType, data, main, close } = data_
if (close) {
this.$emit('closeDialog')
} else {
if (innerType) {
switch (innerType) {
case 'dataImport':
case 'dataImportHdrDtl':
this.dataImport(data, this.entityConfig, main)
break
case 'selectPlugin':
this.selectPlugin(data)
break
}
}
}
},
// 参照弹出选择
selectPlugin(data) {
this.$emit('linkBtnUiBack', data)
},
// 单一列表的数据导入
async dataImport(data, config, main) {
if (!config) return
const type = this.entityManger.type // 实体类型
const restful_appcode = this.entityManger.config.restful_appcode
if (type === 'mainDtl') { // 详情的导入
this.dtlImport(data, config, main)
} else { // 列表上的导入
const ids = data.reduce((prve, curr) => {
prve.push(curr.id)
return prve
}, [])
const { table_name } = config
const { import_name, saveParms, _parms } = this.currentImportItem
const url_table_name = this.currentImportItem.table_name || table_name
let queryParms = saveParms || {}
if (_parms) {
queryParms = Object.assign({}, saveParms, _parms)
}
const data_ = {
ids: ids.join(),
data,
main,
type: 'import'
}
const parms_ = {
appCode: restful_appcode,
table_name: url_table_name,
import_name: import_name,
queryParms: queryParms
}
this.$API.importDataIframe(data_, parms_).then(res => {
this.$message.success('导入成功!')
this.$emit('importSuccess')
})
}
},
// 详情中的导入
async dtlImport(data, config, main) {
if (!config) return
const mainEntity = this.entityManger.mainEntity
const config_ = mainEntity.config
const restful_appcode = mainEntity.restful_appcode
const primaryKey = config_.primaryKey
const mainData = mainEntity.data
if (mainData) {
const iUpdateStatus = mainData.iUpdateStatus
if (iUpdateStatus === 1) {
await mainEntity.save(true)
}
const ids = data.reduce((prve, curr) => {
prve.push(curr.id)
return prve
}, [])
const { table_name } = config
const { import_name, saveParms, _parms } = this.currentImportItem
const url_table_name = this.currentImportItem.table_name || table_name
let queryParms = saveParms || {}
if (_parms) {
queryParms = Object.assign({}, saveParms, _parms)
}
const data_ = {
ids: ids.join(),
data,
main,
type: 'import'
}
queryParms.bill_id = mainData[primaryKey]
const parms_ = {
appCode: restful_appcode,
table_name: url_table_name,
import_name: import_name,
queryParms: queryParms
}
this.$API.importDataIframe(data_, parms_).then(res => {
this.$message.success('导入成功!')
this.handleClose()
this.$emit('importSuccess', {
bill_id: mainData[primaryKey]
})
})
}
},
open() {
this.pageSrc = this.src
},
handleClose() {
this.dialogVisible = false
}
}
}
</script>
<template>
<el-dialog
title="导入"
:visible.sync="dialogVisible"
width="40%"
:before-close="handleClose"
:close-on-click-modal='false'
@open='open'
:append-to-body='true'
>
<el-upload
class="upload-demo"
:drag='false'
ref='uploadEl'
action="https://jsonplaceholder.typicode.com/posts/"
:auto-upload="false"
:on-change="handleChange"
:accept='accept'
:multiple='false'
:on-remove="handleRemove"
>
<!-- <i class="el-icon-upload"></i> -->
<!-- <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> -->
<el-button size="small" type="primary">选择文件</el-button>
<div class="el-upload__tip" slot="tip">只能上传xlsx/xls文件</div>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button size='mini' @click="dialogVisible = false">取 消</el-button>
<el-button size='mini' type="primary" @click="submit">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
export default {
name: 'hsDialogUpload',
props: {
value: {
type: Boolean,
default: false
},
entityConfig: {},
currentImportItem: {}
},
watch: {
value(val) {
this.dialogVisible = val
},
dialogVisible(val) {
this.$emit('input', val)
}
},
data() {
return {
dialogVisible: false,
fileList: [],
accept: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}
},
methods: {
handleRemove(file, fileList) {
if (!fileList.length) {
this.fileList = []
}
},
handleChange(file, fileList) {
const uploadFiles = this.$refs.uploadEl.uploadFiles.pop()
this.$refs.uploadEl.uploadFiles = [uploadFiles]
const file_ = [file]
this.fileList = file_
},
open() {
const r = this.$refs.uploadEl
this.fileList = []
if (r) { // 清空上传列表
r.clearFiles()
}
},
handleClose() {
this.dialogVisible = false
},
submit() {
if (!this.fileList.length) {
this.$message.error('请选择文件')
return
}
this.$emit('submit', this.fileList)
}
}
}
</script>
<style scoped>
.upload-demo{
text-align: center
}
</style>
.innerDialogBox>>> .el-dialog__body{
padding: 0 20px;
}
.innerDialogBox>>> .el-table td, .el-table th {
padding: 5px 0;
}
import Vue from 'vue'
export const EventBus = new Vue()
<template>
<el-dialog
top='10px'
:visible.sync="dialogVisible"
width="80%"
title='字段设置'
:append-to-body='true'
class="innerDialogBox"
:close-on-click-modal='false'>
<div class="toopBox1">
<el-button-group >
<el-button @click="addPropViSayncTop()" size='mini' type="primary" icon="el-icon-plus"></el-button>
<el-button @click='deleteAll' size='mini' type="primary" icon="el-icon-delete"></el-button>
<el-button @click='upStupe' size='mini' type="primary" icon="el-icon-arrow-left">上移</el-button>
<el-button @click='downStupe' size='mini' type="primary">下移<i class="el-icon-arrow-right el-icon--right"></i></el-button>
</el-button-group>
</div>
<el-table
border
height='520px'
:data='tableData'
ref='multipleTableColumn'
>
<el-table-column type="selection" fixed="left"></el-table-column>
<el-table-column type="index" fixed="left"></el-table-column>
<el-table-column prop="label" label="标题" fixed="left">
<template slot-scope="scope">
<el-input clearable v-model="scope.row.label" size='mini'></el-input>
</template>
</el-table-column>
<!-- <el-table-column prop="type" label="类型">
<template slot-scope="scope">
<el-select v-model="scope.row.type" size='mini' clearable>
<el-option v-for="(option,index) in typeOptions"
:key="index"
:value='option.value'
:label='option.label'
>
</el-option>
</el-select>
</template>
</el-table-column> -->
<el-table-column label="操作" width='300' fixed="right">
<template slot-scope="scope">
<el-button size='mini' @click='addAsyncColumn(scope.$index)'>新增</el-button>
<el-button size='mini' @click="deletAsyncProp(scope.$index)">删除</el-button>
<el-button size='mini' @click="upGoAsync(scope.$index)">上移</el-button>
<el-button size='mini' @click="downGoAsync(scope.$index)">下移</el-button>
</template>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button size='medium' type="primary" @click="tableDataubmit">确 定</el-button>
<el-button size='mini' type="info" @click="dialogVisible = false">取 消</el-button>
</div>
<div v-if="privewComVi" class="asyncBox">
<hsDyncForm
:type='controlType'
:formColumns='formColumns_'
:formParms='formParms'
:config='asyncFormItemComponentTableConfig'
></hsDyncForm>
</div>
</el-dialog>
</template>
<script>
import _ from 'lodash'
import { v1 as uuidv1 } from 'uuid'
export default {
name: 'hsTabsFormSet',
props: {
allSourceData: {
},
value: Boolean,
controlType: {},
elInfo: {}
},
data() {
return {
dialogVisible: false,
typeOptions: [
{
value: 'hsDyncFormComponent',
label: '1编辑表单',
isRequireControlName: true
}
],
formColumns_: [],
formParms: {},
privewComVi: false,
asyncFormItemComponentTableConfig: {
isHideBorder: true
},
emptyRow: {
'type': 'hsDyncFormComponent',
'label': '标签1'
},
tableDataCopy: []
}
},
computed: {
tableData: function() {
const list = this.allSourceData.config.tabsList || []
return list
}
},
watch: {
value(val) {
this.dialogVisible = val
},
dialogVisible(val) {
this.$emit('input', val)
}
},
mounted() {
},
methods: {
initConfig(data = []) {
for (const index in data) {
const item = this.tableData[index]
if (!item.uuidv1) {
item.uuidv1 = uuidv1()
}
}
this.tableDataCopy = _.cloneDeep(data)
},
addPropViSayncTop() {
const list = [_.cloneDeep(this.emptyRow)]
this.tableData.push(..._.cloneDeep(list))
this.$nextTick(() => {
const multipleTableColumn = this.$refs.multipleTableColumn
multipleTableColumn.bodyWrapper.scrollTop = multipleTableColumn.bodyWrapper.scrollHeight
})
},
cleanAll() {
this.tableData.splice(0, this.tableData.length)
},
addEmptyOne() {
this.tableData.push(_.cloneDeep(this.emptyRow))
},
privewCom() {
this.privewComVi = true
const tableData = _.cloneDeep(this.tableData)
this.formColumns_ = tableData
},
addRow() {
this.tableData.push({})
},
deleteAll() {
const selectedProp = this.$refs.multipleTableColumn.selection.map(item => {
return item.prop
})
const list = this.tableData.filter(item => !selectedProp.includes(item.prop))
this.tableData.splice(0, this.tableData.length)
this.tableData.push(...list)
},
upStupe() {
const selected = this.$refs.multipleTableColumn.selection
const selectedIndexList = selected.map((item, index) => {
return item.prop
})
const indexList = []
selectedIndexList.forEach(prop => {
const index_ = this.tableData.findIndex(item => item.prop === prop)
indexList.push(index_)
})
indexList.sort((a, b) => {
return a - b
})
indexList.forEach((k, index) => {
if (index !== 0 && indexList.includes(0)) {
this.upSite(this.tableData, k - 1)
} else {
this.upSite(this.tableData, k)
}
})
},
downStupe() {
const selected = this.$refs.multipleTableColumn.selection
const selectedIndexList = selected.map((item, index) => {
return item.prop
})
const indexList = []
selectedIndexList.forEach(prop => {
const index_ = this.tableData.findIndex(item => item.prop === prop)
indexList.push(index_)
})
indexList.sort((a, b) => {
return b - a
})
indexList.forEach((k, index) => {
if (index !== 0 && indexList.includes(this.tableData.length - 1)) {
this.downSite(this.tableData, k + 1)
} else {
this.downSite(this.tableData, k)
}
})
},
addAsyncColumn(index) {
this.tableData.splice(index + 1, 0, _.cloneDeep(this.emptyRow))
},
deletAsyncProp(index) {
// 删除控件
this.tableData.splice(index, 1)
},
upGoAsync(index) {
this.upSite(this.tableData, index)
},
downGoAsync(index) {
this.downSite(this.tableData, index)
},
tableDataubmit() {
for (const item of this.tableData) {
if (!item.control_name) {
item.control_name = uuidv1()
}
}
this.$emit('submit', this.allSourceData)
},
addOldProp() {
const olist = this.tableDataCopy.filter(item => item.type.startsWith('hs'))
const newlist = this.tableData.filter(item => item.uuidv1 && item.type.startsWith('hs'))
newlist.forEach(item => {
const otarget = olist.find(oitem => item.uuidv1 === oitem.uuidv1)
if (otarget && otarget.prop !== item.prop) {
item.old_control_name = otarget.prop
} else if (otarget && otarget.prop === item.prop) {
delete item.old_control_name
}
})
},
downSite(fieldData, index) {
if (index !== fieldData.length - 1) {
fieldData[index] = fieldData.splice(index + 1, 1, fieldData[index])[0]
} else {
fieldData.unshift(fieldData.splice(index, 1)[0])
}
},
upSite(fieldData, index) {
if (index !== 0) {
fieldData[index] = fieldData.splice(index - 1, 1, fieldData[index])[0]
} else {
fieldData.push(fieldData.shift())
}
}
}
}
</script>
<style scoped src='./dialog_table_inner.css'>
</style>
<style scoped>
.toopBox{
display: flex;
justify-content: flex-end;
}
.asyncBox{
width: 100%;
overflow: scroll;
}
</style>
This diff is collapsed.
<template>
<div>
<el-table
:data="gridData"
max-height="350"
>
<el-table-column
property="app_code"
label="appCode"
width="150"
></el-table-column>
<el-table-column
property="page_name"
label="pageName"
width="200"
></el-table-column>
<el-table-column
property="control_name"
label="controlName"
></el-table-column>
<el-table-column
property="query_sql"
label="querySql"
:show-overflow-tooltip='true'
></el-table-column>
<el-table-column
property="version"
label="version"
></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
type="danger"
@click="revertVersion(scope.$index, scope.row)"
>回滚</el-button>
<el-button
type="success"
size="mini"
@click="showView(scope.$index, scope.row)"
>查看效果</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
name: 'lookPageLog',
props: {
elInfo: {
type: Object,
default() {
return {
dialogVisible: false
}
}
},
isrequest: {
type: Boolean,
default: false
}
},
data() {
return {
pageTitle: '',
dialogVisible: false,
gridData: []
}
},
watch: {
isrequest(value) {
this.dialogOpen()
}
},
mounted() {
this.dialogOpen()
},
methods: {
revertVersion(index, item) {
const parm = {
appCode: item.app_code,
pageName: item.page_name,
controlName: item.control_name,
version: item.version
}
this.$confirm('是否确定回滚到此版本!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.$emit('revertVersion', parm)
})
.catch(e => {
console.log(e)
this.$message({
type: 'info',
message: '已取消'
})
})
},
async dialogOpen() {
const params = {
appCode: '',
pageName: this.elInfo.page,
controlName: this.elInfo.position,
dbName: '',
dbCode: ''
}
const res = await this.$httpClient.WebChartConfigModule.webChartConfigQueryLog(params)
this.gridData = res.data || []
},
showView(index, item) {
const data = {
config: JSON.parse(item.json_config),
sourceData: JSON.parse(item.json_data),
sql: item.query_sql
}
this.$emit('showView', data)
}
}
}
</script>
<template>
<div>
<el-dialog
title="问号参数设置"
:visible="visible"
width="80%"
@open='open'
@close='close'
:append-to-body="true"
>
<el-table
:data="tableData"
style="width: 100%"
>
<el-table-column
prop="key"
label="变量名"
>
<template slot-scope="scope">
<el-input
size='mini'
v-model="scope.row.key"
></el-input>
</template>
</el-table-column>
<el-table-column
prop="type"
label="类型"
>
<template slot-scope="scope">
<el-select
v-model="scope.row.type"
size='mini'
clearable
>
<el-option
v-for="(option,index) in typeOptions"
:key="index"
:value='option.value'
:label='option.label'
>
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column
prop="default"
label="默认值"
>
<template slot-scope="scope">
<template v-if="scope.row.type=='select'">
<el-input
style="width:80px"
size='mini'
v-model="scope.row.default"
></el-input>
<el-button
size="mini"
@click="setRowOption(scope.row,scope.$index)"
>设置值</el-button>
</template>
<template v-else>
<el-input
size='mini'
v-model="scope.row.default"
></el-input>
</template>
</template>
</el-table-column>
<el-table-column
prop="remark"
label="备注"
>
<template slot-scope="scope">
<el-input
type="textarea"
:rows="1"
placeholder="请输入内容"
v-model="scope.row.remark"
>
</el-input>
</template>
</el-table-column>
<el-table-column
prop="handle"
label="操作"
>
<template slot-scope="scope">
<el-button
size='mini'
type="primary"
@click="add"
>新增</el-button>
<el-button
size='mini'
type="primary"
@click="deleteRow(scope.$index)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<div
slot="footer"
class="dialog-footer"
>
<el-button
size='mini'
type="primary"
@click="add"
>新增</el-button>
<el-button
size='mini'
type="primary"
@click="close"
>取 消</el-button>
<el-button
size='mini'
type="primary"
@click="submit"
>确定</el-button>
</div>
</el-dialog>
<el-dialog
title="设置下拉类型值"
:visible.sync="visibleSelect"
width="80%"
:append-to-body="true"
>
<el-table
:data="tableDataSelect"
style="width: 100%"
>
<el-table-column
prop="label"
label="label"
>
<template slot-scope="scope">
<el-input
size='mini'
v-model="scope.row.label"
></el-input>
</template>
</el-table-column>
<el-table-column
prop="value"
label="值"
>
<template slot-scope="scope">
<el-input
size='mini'
v-model="scope.row.value"
></el-input>
</template>
</el-table-column>
<el-table-column
prop="handle"
label="操作"
>
<template slot-scope="scope">
<el-button
size='mini'
type="primary"
@click="addSelect"
>新增</el-button>
<el-button
size='mini'
type="primary"
@click="deleteRowSelect(scope.$index)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<div
slot="footer"
class="dialog-footer"
>
<el-button
size='mini'
type="primary"
@click="addSelect"
>新增</el-button>
<el-button
size='mini'
type="primary"
@click="visibleSelect=false"
>取 消</el-button>
<el-button
size='mini'
type="primary"
@click="submitSelect"
>确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
visible: {
type: Boolean,
default: false
}
},
data() {
return {
tableData: [{}],
elInfo: {
el: 'pageParams',
position: 'pageParams'
},
typeOptions: [
{
value: 'input',
label: '1输入框'
},
{
value: 'select',
label: '2下拉框'
}
],
visibleSelect: false,
tableDataSelect: [],
outRowIndex: 0
}
},
methods: {
submitSelect() {
this.tableData[this.outRowIndex].optionList = this.tableDataSelect
this.visibleSelect = false
},
addSelect() {
this.tableDataSelect.push({})
},
deleteRowSelect(index) {
this.tableDataSelect.splice(index, 1)
},
setRowOption(row, index) {
this.outRowIndex = index
this.visibleSelect = true
const optionList = row.optionList
if (Array.isArray(optionList)) {
this.tableDataSelect = optionList
} else {
this.tableDataSelect = [{}]
}
},
deleteRow(index) {
this.tableData.splice(index, 1)
},
add() {
this.tableData.push({})
},
async open() {
const data = {
control_name: 'pageParams',
return_type: 1
}
const res = await this.$API.getPageInfo(data)
if (!res.length) return
const json_config = JSON.parse(res[0].json_config)
this.tableData = json_config
},
close() {
this.$store.dispatch('menuParm/changeMenuDialogVisible', false)
},
submit() {
const data = {
sControl: 'pageParams',
sConfig: this.tableData,
sData: [],
sQuerySql: '',
elInfo: this.elInfo,
is_mock: 0
}
this.$API.runSave(data).then(() => {
this.$message.success('设置成功')
})
}
}
}
</script>
// 主从列表配置
const config = {
'restful_appcode': '',
'isInitMenuParam': false, // 是否初始化menuParam
'initMenuParamOnce': true, // 是否只初始化一次menuParam
'entity': {
'index': {
'isInitNewDefault': false, // 初始化新增默认值
'initNewDefaultOnce': true, // 是否只调用一次
'width': '220px', // index 区域的宽度
'group': 'Tree', // 分组
'isHideButtonTools': false, // 是否隐藏按钮组
'defaultProps': { // 树节点配置
'label': ''// 树每一个节点 显示的中文字段
},
'isTree': true, // 是否是树
'table_name': '', // 表名
'primaryKey': 'id', // 主键id
'dyncQueryParms': {}, // 动态查询参数
'indexTitle': '', // 树标题
'check': {
} // 修改或者新增时 数据校验
},
'main': {
'refreshIndex': false, // 单行修改后 是否刷新左侧
'isInitNewDefault': false, // 初始化新增默认值
'queryDefault': {}, // 默认查询参数
'isHideQueryZone': false, // 是否隐藏搜索区域
'group': '', // 分组
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'detailPath': '', // 详情地址
'detailName': '', // 详情的标签名字
'detailDyncQueryParms': {}, // 跳转到详情时的问号参数
'dyncQueryParms': {// 动态查询参数
},
'dtlList': [// 多个从表以弹出框的形式显示 (位于表格的操作列中!)
{
'label': '字表1', // 按钮名称
'isHide': false, // 是否隐藏
'url': '/DyncUI/HdrDtl/PBOrg/im_arrive_dtl' // 详情页模版
},
{
'label': '字表2',
'isHide': false,
'url': '/DyncUI/HdrDtl/PBOrg/im_arrive_dtl1'
}
],
'importInfo': [// 导入、excel、数据导入
{
'label': '单表数据导入', // 按钮名称
'url': '/DyncUI/Import/{appCode}/{pageCode}', // 单表导入模版
'import_name': '', // 导入名
'parms': {}, // 作为导入页面的问号参数
'click': '$dataImportItem',
'saveParms': {}, // 保存时作为问好参数传给后端
'isHide': false// 是否隐藏
},
{
'label': '主从数据导入',
'url': '/DyncUI/ImportHdrDtl/{appCode}/{pageCode}', // 主从导入模版
'import_name': '',
'parms': {},
'click': '$dataImportItem',
'saveParms': {},
'isHide': false// 是否隐藏
},
{
'label': 'Excel导入', // excel 导入
'click': '$excelImportItem',
'saveParms': {},
'isHide': false// 是否隐藏
}
]
}
},
'new_default': {
'main': {
'columns': {
}
}
}
}
// 主从详情配置
const config = {
'restful_appcode': '', // appCode
'isInitMenuParam': false, // 是否初始化menuParam
'initMenuParamOnce': true, // 是否只初始化一次menuParam
'entity': {// 实体节点
'main': { // 主表实体节点
'isInitNewDefault': false, // 初始化新增默认值
'initNewDefaultOnce': true, // 是否只调用一次
'bill_type': '', // 单据类型
'enableBillFlow': true, // 是否有审核流
'saveExcludeFields': '', // 保存时排除字段
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'dyncQueryParms': {}, // 动态查询参数
'check': {} // 保存时 数据校验
},
'dtl': {
'isInitNewDefault': false, // 初始化新增默认值
'initNewDefaultOnce': true, // 是否只调用一次
'check': {}, // 保存时 数据校验
'showQueryComponent': false, // 是否隐藏查询区域
'addNewCount': 0, // 字段新增行数
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'dyncQueryParms': {}, // 动态查询参数
'importInfo': [ // 导入信息
{
'isMemoryImport': false, // 是否是内存导入
'excludeFields': '', // 排除字段集逗号串连; 这个字段只针对内存导入有用(isMemoryImport:true)
'label': '导入', // 标题名称
'url': '/DyncUI/Import/{appCode}/{pageCode}', // 导入页面的地址
'import_name': '', // 导入名称
'parms': {}, // 作为导入页面的问号参数
'saveParms': {}, // 保存时作为问好参数传给后端
'isHide': false// 是否隐藏
},
{
'label': '单表数据导入', // 按钮名称
'url': '/DyncUI/Import/{appCode}/{pageCode}', // 单表导入模版
'import_name': '', // 导入名
'parms': {}, // 作为导入页面的问号参数
'click': '$dataImportItem',
'saveParms': {}, // 保存时作为问好参数传给后端
'isHide': false// 是否隐藏
},
{
'label': '主从数据导入',
'url': '/DyncUI/ImportHdrDtl/{appCode}/{pageCode}', // 主从导入模版
'import_name': '',
'parms': {},
'click': '$dataImportItem',
'saveParms': {},
'isHide': false// 是否隐藏
},
{
'label': 'Excel导入', // excel 导入
'click': '$excelImportItem',
'saveParms': {},
'isHide': false// 是否隐藏
}
]
}
},
'new_default': {// 新增默认值
'main': {
'columns': {}
},
'dtl': {
'columns': {}
}
}
}
// 主从导入配置
config = {
'restful_appcode': '', // appcode
'entity': {// 实体集
'main': {
'isHideQueryZone': false, // 是否隐藏查询区域
'group': '', // 分组
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'dyncQueryParms': {// 查询参数
}
},
'dtl': {
'group': '', // 分组
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'dyncQueryParms': { // 查询参数
}
}
}
}
// 单表导入配置
const config = {
'restful_appcode': '',
'isInitMenuParam': false, // 是否初始化menuParam
'initMenuParamOnce': true, // 是否只初始化一次menuParam
'entity': {
'main': {
'queryDefault': {}, // 默认查询参数
'isHideQueryZone': false, // 是否隐藏查询区域
'group': '', // 分组
'table_name': '', // 表名
'primaryKey': 'id', // 主键id
'dyncQueryParms': { // 动态查询参数
}
}
}
}
// 单表配置
const config = {
'restful_appcode': '', // appcode
'isInitMenuParam': false, // 是否初始化menuParam
'initMenuParamOnce': true, // 是否只初始化一次menuParam
'entity': { // 实体节点
'index': {
'isInitNewDefault': false, // 初始化新增默认值
'initNewDefaultOnce': true, // 是否只调用一次
'width': '220px', // index区域的宽度
'group': 'Tree', // 分组
'isHideButtonTools': false, // 是否隐藏按钮组
'defaultProps': {
'label': '' // 树每一个节点 显示的中文字段
},
'isTree': true, // 是否是树
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'dyncQueryParms': {}, // 动态查询参数
'indexTitle': '', // 标题
'check': {} // 修改或者新增时 数据校验
},
'main': {
'refreshIndex': false, // 单行修改后 是否刷新左侧
'isInitNewDefault': false, // 初始化新增默认值
'initNewDefaultOnce': true, // 是否只调用一次
'check': {}, // 修改时数据校验
'enableBillFlow': true, // 是否开启审核流程
'queryDefault': {}, // 查询默认值
'isHideQueryZone': false, // 是否隐藏搜索区域
'group': '', // 分组
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'dyncQueryParms': { // 动态查询参数
},
'importInfo': [// 导入、excel、数据导入
{
label: '单表数据导入', // 按钮名称
url: '/DyncUI/Import/{appCode}/{pageCode}', // 单表导入模版
import_name: '', // 导入名
parms: {}, // 作为导入页面的问号参数
click: '$dataImportItem',
saveParms: {}// 保存时作为问好参数传给后端
},
{
label: '主从数据导入',
url: '/DyncUI/ImportHdrDtl/{appCode}/{pageCode}', // 主从导入模版
import_name: '',
parms: {},
click: '$dataImportItem',
saveParms: {}
},
{
'label': 'Excel导入', // excel 导入
'click': '$excelImportItem',
saveParms: {}
}
]
}
},
'new_default': {// 新增默认值
'main': {
'columns': {
}
},
'index': {
'columns': {
}
}
}
}
<template>
<el-dialog
@opened="dialogOpen"
title="系统布局配置"
:visible.sync="dialogVisible"
@closed="dialogClose" width="95%"
:append-to-body='true'
:close-on-click-modal='false'>
<div class="drawer-container">
<div>
<div class="drawer-item">
<span class="itemColor">系统主题颜色:</span>
<theme-picker @changeColor="themeChange" />
</div>
</div>
</div>
</el-dialog>
</template>
<script>
import ThemePicker from '../themePicker'
export default {
components: { ThemePicker },
props: {
value: Boolean
},
watch: {
value(val) {
this.dialogVisible = val
},
dialogVisible(val) {
this.$emit('input', val)
}
},
data() {
return {
dialogVisible: false
}
},
methods: {
themeChange(val) {
// this.$store.dispatch('setting/changeSetting', {
// key: 'theme',
// value: val
// })
const data = {
background: val
}
this.savePageConfig(data).then(() => {
sessionStorage['queryBiTheme'] = JSON.stringify(data)
})
},
// 保存queryBIView页面的配置信息
savePageConfig(data) {
const parms = {
sControl: 'systemSetting',
sConfig: {},
sData: data
}
return this.$API.runSave(parms)
},
dialogOpen() {
this.$store.commit('change_viewStatus', true)
},
dialogClose() {
this.$store.commit('change_viewStatus', false)
this.dialogVisible = false
}
}
}
</script>
<style scoped>
.drawer-container {
padding: 24px;
font-size: 14px;
line-height: 1.5;
word-wrap: break-word;
}
.drawer-title {
margin-bottom: 12px;
color: rgba(0, 0, 0, .85);
font-size: 14px;
line-height: 22px;
}
.drawer-item {
display: flex;
justify-content: start;
color: rgba(0, 0, 0, .65);
font-size: 14px;
padding: 12px 0;
}
.itemColor{
margin-right: 10px;
}
</style>
<template>
<el-dialog
top='5px'
:visible.sync="dialogVisible"
width="80%" title='列样式设置'
:append-to-body='true' :close-on-click-modal='false'>
<el-form :inline="true" :model="formInline" class="demo-form-inline" size='mini'>
<el-form-item label="字体颜色">
<el-select v-model="formInline.color" placeholder="颜色" clearable>
<el-option v-for="(item,index) in colorOptions" :key='index' :label="item.label" :value='item.value'></el-option>
</el-select>
</el-form-item>
<el-form-item label="字体大小">
<el-select v-model="formInline.fontSize" placeholder="字体大小" clearable>
<el-option v-for='(item,index) in fontSizeOptions' :key='index' :label="item.label" :value='item.value'>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="背景色">
<el-select v-model="formInline.background" placeholder="颜色" clearable>
<el-option v-for="(item,index) in colorOptions" :key='index' :label="item.label" :value='item.value'></el-option>
</el-select>
</el-form-item>
<el-form-item label="文本的修饰">
<el-select v-model="formInline['text-decoration']" placeholder="文本的修饰" clearable>
<el-option v-for="(item,index) in textDecorationOptions" :key='index' :label="item.label" :value='item.value'></el-option>
</el-select>
</el-form-item>
<el-form-item label="对齐方式">
<el-select v-model="formInline['text-align']" placeholder="对齐方式" clearable>
<el-option v-for="(item,index) in textAlignOptions" :key='index' :label="item.label" :value='item.value'></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button size='mini' type="primary" @click="onSubmitStyle">确定</el-button>
</div>
</el-dialog>
</template>
<script>
export default {
props: {
formInline: {
default() {
return {}
}
},
value: Boolean
},
watch: {
value(val) {
this.dialogVisible = val
},
dialogVisible(val) {
this.$emit('input', val)
}
},
data() {
return {
dialogVisible: false,
fontSizeOptions: [
{ value: '10px', label: '10px' },
{ value: '12px', label: '12px' },
{ value: '14px', label: '14px' },
{ value: '16px', label: '16px' },
{ value: '18px', label: '18px' },
{ value: '20px', label: '20px' },
{ value: '22px', label: '22px' },
{ value: '24px', label: '24px' }
],
colorOptions: [
{ value: '#000000', label: '黑色' },
{ value: '#C0C0C0', label: '银色' },
{ value: '#808080', label: '灰色' },
{ value: '#FFFFFF', label: '白色' },
{ value: '#FF0000', label: '红色' },
{ value: '#800080', label: '紫色' },
{ value: '#FF00FF', label: '紫红' },
{ value: '#008000', label: '绿色' },
{ value: '#00FFFF', label: '浅绿' },
{ value: '#00FF00', label: '亮绿' },
{ value: '#808000', label: '橄榄' },
{ value: '#000080', label: '深蓝' },
{ value: '#0000FF', label: '蓝色' },
{ value: '#008080', label: '青色' }
],
textDecorationOptions: [
{ value: 'line-through', label: '删除线' },
{ value: 'underline', label: '下划线' },
{ value: 'overline', label: '上划线' }
],
textAlignOptions: [
{ value: 'left', label: '左对齐' },
{ value: 'right', label: '右对齐' },
{ value: 'center', label: '中间' }
]
}
},
methods: {
onSubmitStyle() {
this.$emit('submit', this.formInline)
}
}
}
</script>
This diff is collapsed.
/* eslint-disable */
/* Blob.js
* A Blob implementation.
* 2014-05-27
*
* By Eli Grey, http://eligrey.com
* By Devin Samarin, https://github.com/eboyjr
* License: X11/MIT
* See LICENSE.md
*/
/*global self, unescape */
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
plusplus: true */
/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
(function (view) {
"use strict";
view.URL = view.URL || view.webkitURL;
if (view.Blob && view.URL) {
try {
new Blob;
return;
} catch (e) {}
}
// Internally we use a BlobBuilder implementation to base Blob off of
// in order to support older browsers that only have BlobBuilder
var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
var
get_class = function(object) {
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
}
, FakeBlobBuilder = function BlobBuilder() {
this.data = [];
}
, FakeBlob = function Blob(data, type, encoding) {
this.data = data;
this.size = data.length;
this.type = type;
this.encoding = encoding;
}
, FBB_proto = FakeBlobBuilder.prototype
, FB_proto = FakeBlob.prototype
, FileReaderSync = view.FileReaderSync
, FileException = function(type) {
this.code = this[this.name = type];
}
, file_ex_codes = (
"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
+ "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
).split(" ")
, file_ex_code = file_ex_codes.length
, real_URL = view.URL || view.webkitURL || view
, real_create_object_URL = real_URL.createObjectURL
, real_revoke_object_URL = real_URL.revokeObjectURL
, URL = real_URL
, btoa = view.btoa
, atob = view.atob
, ArrayBuffer = view.ArrayBuffer
, Uint8Array = view.Uint8Array
;
FakeBlob.fake = FB_proto.fake = true;
while (file_ex_code--) {
FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
}
if (!real_URL.createObjectURL) {
URL = view.URL = {};
}
URL.createObjectURL = function(blob) {
var
type = blob.type
, data_URI_header
;
if (type === null) {
type = "application/octet-stream";
}
if (blob instanceof FakeBlob) {
data_URI_header = "data:" + type;
if (blob.encoding === "base64") {
return data_URI_header + ";base64," + blob.data;
} else if (blob.encoding === "URI") {
return data_URI_header + "," + decodeURIComponent(blob.data);
} if (btoa) {
return data_URI_header + ";base64," + btoa(blob.data);
} else {
return data_URI_header + "," + encodeURIComponent(blob.data);
}
} else if (real_create_object_URL) {
return real_create_object_URL.call(real_URL, blob);
}
};
URL.revokeObjectURL = function(object_URL) {
if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
real_revoke_object_URL.call(real_URL, object_URL);
}
};
FBB_proto.append = function(data/*, endings*/) {
var bb = this.data;
// decode data to a binary string
if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
var
str = ""
, buf = new Uint8Array(data)
, i = 0
, buf_len = buf.length
;
for (; i < buf_len; i++) {
str += String.fromCharCode(buf[i]);
}
bb.push(str);
} else if (get_class(data) === "Blob" || get_class(data) === "File") {
if (FileReaderSync) {
var fr = new FileReaderSync;
bb.push(fr.readAsBinaryString(data));
} else {
// async FileReader won't work as BlobBuilder is sync
throw new FileException("NOT_READABLE_ERR");
}
} else if (data instanceof FakeBlob) {
if (data.encoding === "base64" && atob) {
bb.push(atob(data.data));
} else if (data.encoding === "URI") {
bb.push(decodeURIComponent(data.data));
} else if (data.encoding === "raw") {
bb.push(data.data);
}
} else {
if (typeof data !== "string") {
data += ""; // convert unsupported types to strings
}
// decode UTF-16 to binary string
bb.push(unescape(encodeURIComponent(data)));
}
};
FBB_proto.getBlob = function(type) {
if (!arguments.length) {
type = null;
}
return new FakeBlob(this.data.join(""), type, "raw");
};
FBB_proto.toString = function() {
return "[object BlobBuilder]";
};
FB_proto.slice = function(start, end, type) {
var args = arguments.length;
if (args < 3) {
type = null;
}
return new FakeBlob(
this.data.slice(start, args > 1 ? end : this.data.length)
, type
, this.encoding
);
};
FB_proto.toString = function() {
return "[object Blob]";
};
FB_proto.close = function() {
this.size = this.data.length = 0;
};
return FakeBlobBuilder;
}(view));
view.Blob = function Blob(blobParts, options) {
var type = options ? (options.type || "") : "";
var builder = new BlobBuilder();
if (blobParts) {
for (var i = 0, len = blobParts.length; i < len; i++) {
builder.append(blobParts[i]);
}
}
return builder.getBlob(type);
};
}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));
This diff is collapsed.
This diff is collapsed.
import { EleResize } from './ezresize'
import echarts from 'echarts'
export default function drawEcharts(id, option) { // id: chart所在块id, option: 配置项
const dom = document.getElementById(id)
const chart = echarts.init(dom)
chart.setOption(option)
const listener = _ => {
chart.resize()
}
EleResize.on(dom, listener)
return chart
}
This diff is collapsed.
import index from './src/index.vue'
index.install = function(Vue) {
Vue.component(index.name, index)
}
export default index
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.
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